blob: 2851922bd0c52b517d0035951ae9ea957a5da25f [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003
Christian Heimes5e696852008-04-09 08:37:03 +00004import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005import io
Charles-François Natali65708cf2014-07-25 18:44:30 +01006import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +00007import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +10009import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000016import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000017from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000018import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000019import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010020import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020021import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020022import random
Christian Heimesb6e43af2018-01-29 22:37:58 +010023import shutil
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020024import string
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020025import _thread as thread
26import threading
Antoine Pitroub1c54962010-10-14 15:05:38 +000027try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000028 import multiprocessing
29except ImportError:
30 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020031try:
32 import fcntl
33except ImportError:
34 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000035
Benjamin Petersonee8712c2008-05-20 21:35:26 +000036HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000037MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000038
caaveryeffc12f2017-09-06 18:18:10 -040039VSOCKPORT = 1234
40
Victor Stinner45df8202010-04-28 22:31:17 +000041try:
Victor Stinnere254e532014-07-26 14:36:55 +020042 import _socket
43except ImportError:
44 _socket = None
45
caaveryeffc12f2017-09-06 18:18:10 -040046def get_cid():
47 if fcntl is None:
48 return None
49 try:
50 with open("/dev/vsock", "rb") as f:
51 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
52 except OSError:
53 return None
54 else:
55 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000056
Charles-François Natali47413c12011-10-06 19:47:44 +020057def _have_socket_can():
58 """Check whether CAN sockets are supported on this host."""
59 try:
60 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020061 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020062 return False
63 else:
64 s.close()
65 return True
66
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040067def _have_socket_can_isotp():
68 """Check whether CAN ISOTP sockets are supported on this host."""
69 try:
70 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
71 except (AttributeError, OSError):
72 return False
73 else:
74 s.close()
75 return True
76
Charles-François Natali10b8cf42011-11-10 19:21:37 +010077def _have_socket_rds():
78 """Check whether RDS sockets are supported on this host."""
79 try:
80 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
81 except (AttributeError, OSError):
82 return False
83 else:
84 s.close()
85 return True
86
Christian Heimes48371412016-09-06 00:37:46 +020087def _have_socket_alg():
88 """Check whether AF_ALG sockets are supported on this host."""
89 try:
90 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
91 except (AttributeError, OSError):
92 return False
93 else:
94 s.close()
95 return True
96
caaveryeffc12f2017-09-06 18:18:10 -040097def _have_socket_vsock():
98 """Check whether AF_VSOCK sockets are supported on this host."""
99 ret = get_cid() is not None
100 return ret
101
Yury Selivanovf11b4602018-01-28 17:27:38 -0500102
103def _is_fd_in_blocking_mode(sock):
104 return not bool(
105 fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
106
107
Charles-François Natali47413c12011-10-06 19:47:44 +0200108HAVE_SOCKET_CAN = _have_socket_can()
109
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400110HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
111
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100112HAVE_SOCKET_RDS = _have_socket_rds()
113
Christian Heimes48371412016-09-06 00:37:46 +0200114HAVE_SOCKET_ALG = _have_socket_alg()
115
caaveryeffc12f2017-09-06 18:18:10 -0400116HAVE_SOCKET_VSOCK = _have_socket_vsock()
117
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000118# Size in bytes of the int type
119SIZEOF_INT = array.array("i").itemsize
120
Guido van Rossum24e4af82002-06-12 19:18:08 +0000121class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000122
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123 def setUp(self):
124 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000125 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100126 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000127
Guido van Rossum24e4af82002-06-12 19:18:08 +0000128 def tearDown(self):
129 self.serv.close()
130 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000131
Guido van Rossum24e4af82002-06-12 19:18:08 +0000132class SocketUDPTest(unittest.TestCase):
133
134 def setUp(self):
135 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000136 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000137
138 def tearDown(self):
139 self.serv.close()
140 self.serv = None
141
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000142class ThreadSafeCleanupTestCase(unittest.TestCase):
143 """Subclass of unittest.TestCase with thread-safe cleanup methods.
144
145 This subclass protects the addCleanup() and doCleanups() methods
146 with a recursive lock.
147 """
148
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200149 def __init__(self, *args, **kwargs):
150 super().__init__(*args, **kwargs)
151 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000152
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200153 def addCleanup(self, *args, **kwargs):
154 with self._cleanup_lock:
155 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000156
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200157 def doCleanups(self, *args, **kwargs):
158 with self._cleanup_lock:
159 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000160
Charles-François Natali47413c12011-10-06 19:47:44 +0200161class SocketCANTest(unittest.TestCase):
162
163 """To be able to run this test, a `vcan0` CAN interface can be created with
164 the following commands:
165 # modprobe vcan
166 # ip link add dev vcan0 type vcan
167 # ifconfig vcan0 up
168 """
169 interface = 'vcan0'
170 bufsize = 128
171
Charles-François Natali773e42d2013-02-05 19:42:01 +0100172 """The CAN frame structure is defined in <linux/can.h>:
173
174 struct can_frame {
175 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
176 __u8 can_dlc; /* data length code: 0 .. 8 */
177 __u8 data[8] __attribute__((aligned(8)));
178 };
179 """
180 can_frame_fmt = "=IB3x8s"
181 can_frame_size = struct.calcsize(can_frame_fmt)
182
183 """The Broadcast Management Command frame structure is defined
184 in <linux/can/bcm.h>:
185
186 struct bcm_msg_head {
187 __u32 opcode;
188 __u32 flags;
189 __u32 count;
190 struct timeval ival1, ival2;
191 canid_t can_id;
192 __u32 nframes;
193 struct can_frame frames[0];
194 }
195
196 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
197 `struct can_frame` definition). Must use native not standard types for packing.
198 """
199 bcm_cmd_msg_fmt = "@3I4l2I"
200 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
201
Charles-François Natali47413c12011-10-06 19:47:44 +0200202 def setUp(self):
203 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200204 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200205 try:
206 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200207 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200208 self.skipTest('network interface `%s` does not exist' %
209 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200210
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100211
212class SocketRDSTest(unittest.TestCase):
213
214 """To be able to run this test, the `rds` kernel module must be loaded:
215 # modprobe rds
216 """
217 bufsize = 8192
218
219 def setUp(self):
220 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
221 self.addCleanup(self.serv.close)
222 try:
223 self.port = support.bind_port(self.serv)
224 except OSError:
225 self.skipTest('unable to bind RDS socket')
226
227
Guido van Rossum24e4af82002-06-12 19:18:08 +0000228class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000229 """Threadable Test class
230
231 The ThreadableTest class makes it easy to create a threaded
232 client/server pair from an existing unit test. To create a
233 new threaded class from an existing unit test, use multiple
234 inheritance:
235
236 class NewClass (OldClass, ThreadableTest):
237 pass
238
239 This class defines two new fixture functions with obvious
240 purposes for overriding:
241
242 clientSetUp ()
243 clientTearDown ()
244
245 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000246 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000247 '_' to indicate the client portion of the test. Ex:
248
249 def testFoo(self):
250 # Server portion
251
252 def _testFoo(self):
253 # Client portion
254
255 Any exceptions raised by the clients during their tests
256 are caught and transferred to the main thread to alert
257 the testing framework.
258
259 Note, the server setup function cannot call any blocking
260 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000261 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000262 the blocking call (such as in setting up a client/server
263 connection and performing the accept() in setUp().
264 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000265
266 def __init__(self):
267 # Swap the true setup function
268 self.__setUp = self.setUp
269 self.__tearDown = self.tearDown
270 self.setUp = self._setUp
271 self.tearDown = self._tearDown
272
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000273 def serverExplicitReady(self):
274 """This method allows the server to explicitly indicate that
275 it wants the client thread to proceed. This is useful if the
276 server is about to execute a blocking routine that is
277 dependent upon the client thread during its setup routine."""
278 self.server_ready.set()
279
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280 def _setUp(self):
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700281 self.wait_threads = support.wait_threads_exit()
282 self.wait_threads.__enter__()
283
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000284 self.server_ready = threading.Event()
285 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000286 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000287 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200288 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000289
290 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000291 methodname = self.id()
292 i = methodname.rfind('.')
293 methodname = methodname[i+1:]
294 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000295 self.client_thread = thread.start_new_thread(
296 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000297
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200298 try:
299 self.__setUp()
300 except:
301 self.server_crashed = True
302 raise
303 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000304 self.server_ready.set()
305 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000306
307 def _tearDown(self):
308 self.__tearDown()
309 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700310 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000311
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000312 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000313 exc = self.queue.get()
314 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000315
316 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000317 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100318 try:
319 self.clientSetUp()
320 except BaseException as e:
321 self.queue.put(e)
322 self.clientTearDown()
323 return
324 finally:
325 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200326 if self.server_crashed:
327 self.clientTearDown()
328 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000329 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000330 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000331 try:
332 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000333 except BaseException as e:
334 self.queue.put(e)
335 finally:
336 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000337
338 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000339 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000340
341 def clientTearDown(self):
342 self.done.set()
343 thread.exit()
344
345class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
346
347 def __init__(self, methodName='runTest'):
348 SocketTCPTest.__init__(self, methodName=methodName)
349 ThreadableTest.__init__(self)
350
351 def clientSetUp(self):
352 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
353
354 def clientTearDown(self):
355 self.cli.close()
356 self.cli = None
357 ThreadableTest.clientTearDown(self)
358
359class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
360
361 def __init__(self, methodName='runTest'):
362 SocketUDPTest.__init__(self, methodName=methodName)
363 ThreadableTest.__init__(self)
364
365 def clientSetUp(self):
366 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
367
Brian Curtin3beb38f2010-11-04 03:41:43 +0000368 def clientTearDown(self):
369 self.cli.close()
370 self.cli = None
371 ThreadableTest.clientTearDown(self)
372
Charles-François Natali47413c12011-10-06 19:47:44 +0200373class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
374
375 def __init__(self, methodName='runTest'):
376 SocketCANTest.__init__(self, methodName=methodName)
377 ThreadableTest.__init__(self)
378
379 def clientSetUp(self):
380 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
381 try:
382 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200383 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200384 # skipTest should not be called here, and will be called in the
385 # server instead
386 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200387
388 def clientTearDown(self):
389 self.cli.close()
390 self.cli = None
391 ThreadableTest.clientTearDown(self)
392
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100393class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
394
395 def __init__(self, methodName='runTest'):
396 SocketRDSTest.__init__(self, methodName=methodName)
397 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100398
399 def clientSetUp(self):
400 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
401 try:
402 # RDS sockets must be bound explicitly to send or receive data
403 self.cli.bind((HOST, 0))
404 self.cli_addr = self.cli.getsockname()
405 except OSError:
406 # skipTest should not be called here, and will be called in the
407 # server instead
408 pass
409
410 def clientTearDown(self):
411 self.cli.close()
412 self.cli = None
413 ThreadableTest.clientTearDown(self)
414
caaveryeffc12f2017-09-06 18:18:10 -0400415@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400416@unittest.skipUnless(HAVE_SOCKET_VSOCK,
417 'VSOCK sockets required for this test.')
418@unittest.skipUnless(get_cid() != 2,
419 "This test can only be run on a virtual guest.")
420class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
421
422 def __init__(self, methodName='runTest'):
423 unittest.TestCase.__init__(self, methodName=methodName)
424 ThreadableTest.__init__(self)
425
426 def setUp(self):
427 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
428 self.addCleanup(self.serv.close)
429 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
430 self.serv.listen()
431 self.serverExplicitReady()
432 self.conn, self.connaddr = self.serv.accept()
433 self.addCleanup(self.conn.close)
434
435 def clientSetUp(self):
436 time.sleep(0.1)
437 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
438 self.addCleanup(self.cli.close)
439 cid = get_cid()
440 self.cli.connect((cid, VSOCKPORT))
441
442 def testStream(self):
443 msg = self.conn.recv(1024)
444 self.assertEqual(msg, MSG)
445
446 def _testStream(self):
447 self.cli.send(MSG)
448 self.cli.close()
449
Guido van Rossum24e4af82002-06-12 19:18:08 +0000450class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000451 """Socket tests for client-server connection.
452
453 self.cli_conn is a client socket connected to the server. The
454 setUp() method guarantees that it is connected to the server.
455 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000456
457 def __init__(self, methodName='runTest'):
458 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
459
460 def setUp(self):
461 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000462 # Indicate explicitly we're ready for the client thread to
463 # proceed and then perform the blocking call to accept
464 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000465 conn, addr = self.serv.accept()
466 self.cli_conn = conn
467
468 def tearDown(self):
469 self.cli_conn.close()
470 self.cli_conn = None
471 ThreadedTCPSocketTest.tearDown(self)
472
473 def clientSetUp(self):
474 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000475 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000476 self.serv_conn = self.cli
477
478 def clientTearDown(self):
479 self.serv_conn.close()
480 self.serv_conn = None
481 ThreadedTCPSocketTest.clientTearDown(self)
482
Dave Cole331708b2004-08-09 04:51:41 +0000483class SocketPairTest(unittest.TestCase, ThreadableTest):
484
485 def __init__(self, methodName='runTest'):
486 unittest.TestCase.__init__(self, methodName=methodName)
487 ThreadableTest.__init__(self)
488
489 def setUp(self):
490 self.serv, self.cli = socket.socketpair()
491
492 def tearDown(self):
493 self.serv.close()
494 self.serv = None
495
496 def clientSetUp(self):
497 pass
498
499 def clientTearDown(self):
500 self.cli.close()
501 self.cli = None
502 ThreadableTest.clientTearDown(self)
503
Tim Peters494aaee2004-08-09 18:54:11 +0000504
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000505# The following classes are used by the sendmsg()/recvmsg() tests.
506# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
507# gives a drop-in replacement for SocketConnectedTest, but different
508# address families can be used, and the attributes serv_addr and
509# cli_addr will be set to the addresses of the endpoints.
510
511class SocketTestBase(unittest.TestCase):
512 """A base class for socket tests.
513
514 Subclasses must provide methods newSocket() to return a new socket
515 and bindSock(sock) to bind it to an unused address.
516
517 Creates a socket self.serv and sets self.serv_addr to its address.
518 """
519
520 def setUp(self):
521 self.serv = self.newSocket()
522 self.bindServer()
523
524 def bindServer(self):
525 """Bind server socket and set self.serv_addr to its address."""
526 self.bindSock(self.serv)
527 self.serv_addr = self.serv.getsockname()
528
529 def tearDown(self):
530 self.serv.close()
531 self.serv = None
532
533
534class SocketListeningTestMixin(SocketTestBase):
535 """Mixin to listen on the server socket."""
536
537 def setUp(self):
538 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100539 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000540
541
542class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
543 ThreadableTest):
544 """Mixin to add client socket and allow client/server tests.
545
546 Client socket is self.cli and its address is self.cli_addr. See
547 ThreadableTest for usage information.
548 """
549
550 def __init__(self, *args, **kwargs):
551 super().__init__(*args, **kwargs)
552 ThreadableTest.__init__(self)
553
554 def clientSetUp(self):
555 self.cli = self.newClientSocket()
556 self.bindClient()
557
558 def newClientSocket(self):
559 """Return a new socket for use as client."""
560 return self.newSocket()
561
562 def bindClient(self):
563 """Bind client socket and set self.cli_addr to its address."""
564 self.bindSock(self.cli)
565 self.cli_addr = self.cli.getsockname()
566
567 def clientTearDown(self):
568 self.cli.close()
569 self.cli = None
570 ThreadableTest.clientTearDown(self)
571
572
573class ConnectedStreamTestMixin(SocketListeningTestMixin,
574 ThreadedSocketTestMixin):
575 """Mixin to allow client/server stream tests with connected client.
576
577 Server's socket representing connection to client is self.cli_conn
578 and client's connection to server is self.serv_conn. (Based on
579 SocketConnectedTest.)
580 """
581
582 def setUp(self):
583 super().setUp()
584 # Indicate explicitly we're ready for the client thread to
585 # proceed and then perform the blocking call to accept
586 self.serverExplicitReady()
587 conn, addr = self.serv.accept()
588 self.cli_conn = conn
589
590 def tearDown(self):
591 self.cli_conn.close()
592 self.cli_conn = None
593 super().tearDown()
594
595 def clientSetUp(self):
596 super().clientSetUp()
597 self.cli.connect(self.serv_addr)
598 self.serv_conn = self.cli
599
600 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100601 try:
602 self.serv_conn.close()
603 self.serv_conn = None
604 except AttributeError:
605 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000606 super().clientTearDown()
607
608
609class UnixSocketTestBase(SocketTestBase):
610 """Base class for Unix-domain socket tests."""
611
612 # This class is used for file descriptor passing tests, so we
613 # create the sockets in a private directory so that other users
614 # can't send anything that might be problematic for a privileged
615 # user running the tests.
616
617 def setUp(self):
618 self.dir_path = tempfile.mkdtemp()
619 self.addCleanup(os.rmdir, self.dir_path)
620 super().setUp()
621
622 def bindSock(self, sock):
623 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100624 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000625 self.addCleanup(support.unlink, path)
626
627class UnixStreamBase(UnixSocketTestBase):
628 """Base class for Unix-domain SOCK_STREAM tests."""
629
630 def newSocket(self):
631 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
632
633
634class InetTestBase(SocketTestBase):
635 """Base class for IPv4 socket tests."""
636
637 host = HOST
638
639 def setUp(self):
640 super().setUp()
641 self.port = self.serv_addr[1]
642
643 def bindSock(self, sock):
644 support.bind_port(sock, host=self.host)
645
646class TCPTestBase(InetTestBase):
647 """Base class for TCP-over-IPv4 tests."""
648
649 def newSocket(self):
650 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
651
652class UDPTestBase(InetTestBase):
653 """Base class for UDP-over-IPv4 tests."""
654
655 def newSocket(self):
656 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
657
658class SCTPStreamBase(InetTestBase):
659 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
660
661 def newSocket(self):
662 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
663 socket.IPPROTO_SCTP)
664
665
666class Inet6TestBase(InetTestBase):
667 """Base class for IPv6 socket tests."""
668
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200669 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000670
671class UDP6TestBase(Inet6TestBase):
672 """Base class for UDP-over-IPv6 tests."""
673
674 def newSocket(self):
675 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
676
677
678# Test-skipping decorators for use with ThreadableTest.
679
680def skipWithClientIf(condition, reason):
681 """Skip decorated test if condition is true, add client_skip decorator.
682
683 If the decorated object is not a class, sets its attribute
684 "client_skip" to a decorator which will return an empty function
685 if the test is to be skipped, or the original function if it is
686 not. This can be used to avoid running the client part of a
687 skipped test when using ThreadableTest.
688 """
689 def client_pass(*args, **kwargs):
690 pass
691 def skipdec(obj):
692 retval = unittest.skip(reason)(obj)
693 if not isinstance(obj, type):
694 retval.client_skip = lambda f: client_pass
695 return retval
696 def noskipdec(obj):
697 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
698 obj.client_skip = lambda f: f
699 return obj
700 return skipdec if condition else noskipdec
701
702
703def requireAttrs(obj, *attributes):
704 """Skip decorated test if obj is missing any of the given attributes.
705
706 Sets client_skip attribute as skipWithClientIf() does.
707 """
708 missing = [name for name in attributes if not hasattr(obj, name)]
709 return skipWithClientIf(
710 missing, "don't have " + ", ".join(name for name in missing))
711
712
713def requireSocket(*args):
714 """Skip decorated test if a socket cannot be created with given arguments.
715
716 When an argument is given as a string, will use the value of that
717 attribute of the socket module, or skip the test if it doesn't
718 exist. Sets client_skip attribute as skipWithClientIf() does.
719 """
720 err = None
721 missing = [obj for obj in args if
722 isinstance(obj, str) and not hasattr(socket, obj)]
723 if missing:
724 err = "don't have " + ", ".join(name for name in missing)
725 else:
726 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
727 for obj in args]
728 try:
729 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200730 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000731 # XXX: check errno?
732 err = str(e)
733 else:
734 s.close()
735 return skipWithClientIf(
736 err is not None,
737 "can't create socket({0}): {1}".format(
738 ", ".join(str(o) for o in args), err))
739
740
Guido van Rossum24e4af82002-06-12 19:18:08 +0000741#######################################################################
742## Begin Tests
743
744class GeneralModuleTests(unittest.TestCase):
745
Ethan Furman7184bac2014-10-14 18:56:53 -0700746 def test_SocketType_is_socketobject(self):
747 import _socket
748 self.assertTrue(socket.SocketType is _socket.socket)
749 s = socket.socket()
750 self.assertIsInstance(s, socket.SocketType)
751 s.close()
752
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000753 def test_repr(self):
754 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200755 with s:
756 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000757 self.assertIn('family=%s' % socket.AF_INET, repr(s))
758 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200759 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200760 self.assertNotIn('raddr', repr(s))
761 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200762 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200763 self.assertIn(str(s.getsockname()), repr(s))
764 self.assertIn('[closed]', repr(s))
765 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000766
Victor Stinnere254e532014-07-26 14:36:55 +0200767 @unittest.skipUnless(_socket is not None, 'need _socket module')
768 def test_csocket_repr(self):
769 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
770 try:
771 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
772 % (s.fileno(), s.family, s.type, s.proto))
773 self.assertEqual(repr(s), expected)
774 finally:
775 s.close()
776 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
777 % (s.family, s.type, s.proto))
778 self.assertEqual(repr(s), expected)
779
Raymond Hettinger027bb632004-05-31 03:09:25 +0000780 def test_weakref(self):
781 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
782 p = proxy(s)
783 self.assertEqual(p.fileno(), s.fileno())
784 s.close()
785 s = None
786 try:
787 p.fileno()
788 except ReferenceError:
789 pass
790 else:
791 self.fail('Socket proxy still exists')
792
Guido van Rossum24e4af82002-06-12 19:18:08 +0000793 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000794 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300795 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200796 with self.assertRaises(OSError, msg=msg % 'OSError'):
797 raise OSError
798 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000799 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200800 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000801 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000802
Ezio Melotti63e42302011-05-07 19:47:48 +0300803 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000804 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300805 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
806 self.addCleanup(s.close)
807 s.bind(('', 0))
808 sockname = s.getsockname()
809 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300810 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300811 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300812 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400813 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300814 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300815 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300816 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400817 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300818 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300819 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300820 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300821 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300822 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300823 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300824 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400825 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300826 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300827 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300828 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400829 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300830 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300831 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300832 self.assertIn('not NoneType', str(cm.exception))
833 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300834 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300835 self.assertIn('an integer is required', str(cm.exception))
836 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300837 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300838 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300839 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300840 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300841 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300842 self.assertIn('(1 given)', str(cm.exception))
843 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300844 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300845 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300846
Guido van Rossum24e4af82002-06-12 19:18:08 +0000847 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000848 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000849 socket.AF_INET
850 socket.SOCK_STREAM
851 socket.SOCK_DGRAM
852 socket.SOCK_RAW
853 socket.SOCK_RDM
854 socket.SOCK_SEQPACKET
855 socket.SOL_SOCKET
856 socket.SO_REUSEADDR
857
Guido van Rossum654c11e2002-06-13 20:24:17 +0000858 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000859 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000860 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000861 try:
862 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200863 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000864 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600865 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000866 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000867 try:
868 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200869 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000870 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600871 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000872 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000873 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000874 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000875 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000876
Charles-François Natali0cc86852013-09-13 19:53:08 +0200877 def test_host_resolution(self):
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700878 for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200879 self.assertEqual(socket.gethostbyname(addr), addr)
880
881 # we don't test support.HOSTv6 because there's a chance it doesn't have
882 # a matching name entry (e.g. 'ip6-localhost')
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700883 for host in [support.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200884 self.assertIn(host, socket.gethostbyaddr(host)[2])
885
Xiang Zhangd36a7162017-03-07 11:06:09 +0800886 def test_host_resolution_bad_address(self):
887 # These are all malformed IP addresses and expected not to resolve to
888 # any result. But some ISPs, e.g. AWS, may successfully resolve these
889 # IPs.
890 explanation = (
891 "resolving an invalid IP address did not raise OSError; "
892 "can be caused by a broken DNS server"
893 )
894 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
895 '1:1:1:1:1:1:1:1:1']:
896 with self.assertRaises(OSError):
897 socket.gethostbyname(addr)
898 with self.assertRaises(OSError, msg=explanation):
899 socket.gethostbyaddr(addr)
900
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000901 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
902 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
903 def test_sethostname(self):
904 oldhn = socket.gethostname()
905 try:
906 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200907 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000908 if e.errno == errno.EPERM:
909 self.skipTest("test should be run as root")
910 else:
911 raise
912 try:
913 # running test as root!
914 self.assertEqual(socket.gethostname(), 'new')
915 # Should work with bytes objects too
916 socket.sethostname(b'bar')
917 self.assertEqual(socket.gethostname(), 'bar')
918 finally:
919 socket.sethostname(oldhn)
920
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700921 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
922 'socket.if_nameindex() not available.')
923 def testInterfaceNameIndex(self):
924 interfaces = socket.if_nameindex()
925 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200926 self.assertIsInstance(index, int)
927 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700928 # interface indices are non-zero integers
929 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200930 _index = socket.if_nametoindex(name)
931 self.assertIsInstance(_index, int)
932 self.assertEqual(index, _index)
933 _name = socket.if_indextoname(index)
934 self.assertIsInstance(_name, str)
935 self.assertEqual(name, _name)
936
937 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
938 'socket.if_nameindex() not available.')
939 def testInvalidInterfaceNameIndex(self):
940 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200941 self.assertRaises(OSError, socket.if_indextoname, 0)
942 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200943 # test with invalid values
944 self.assertRaises(TypeError, socket.if_nametoindex, 0)
945 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700946
Serhiy Storchaka43767632013-11-03 21:31:38 +0200947 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
948 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000949 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000950 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200951 try:
952 # On some versions, this loses a reference
953 orig = sys.getrefcount(__name__)
954 socket.getnameinfo(__name__,0)
955 except TypeError:
956 if sys.getrefcount(__name__) != orig:
957 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000958
Guido van Rossum24e4af82002-06-12 19:18:08 +0000959 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000960 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000961 try:
962 # On some versions, this crashes the interpreter.
963 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200964 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000965 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000966
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000967 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000968 # This just checks that htons etc. are their own inverse,
969 # when looking at the lower 16 or 32 bits.
970 sizes = {socket.htonl: 32, socket.ntohl: 32,
971 socket.htons: 16, socket.ntohs: 16}
972 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000973 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000974 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
975 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000976
Guido van Rossuma2627af2002-09-14 00:58:46 +0000977 swapped = func(mask)
978 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000979 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000980
Serhiy Storchaka24c738a2017-03-19 20:20:10 +0200981 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +0000982 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300983 import _testcapi
984 s_good_values = [0, 1, 2, 0xffff]
985 l_good_values = s_good_values + [0xffffffff]
986 l_bad_values = [-1, -2, 1<<32, 1<<1000]
987 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
988 _testcapi.INT_MAX + 1]
989 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
990 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000991 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000992 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300993 for k in l_good_values:
994 socket.ntohl(k)
995 socket.htonl(k)
996 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000997 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000998 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300999 for k in l_bad_values:
1000 self.assertRaises(OverflowError, socket.ntohl, k)
1001 self.assertRaises(OverflowError, socket.htonl, k)
1002 for k in s_deprecated_values:
1003 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1004 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001005
Barry Warsaw11b91a02004-06-28 00:50:43 +00001006 def testGetServBy(self):
1007 eq = self.assertEqual
1008 # Find one service that exists, then check all the related interfaces.
1009 # I've ordered this by protocols that have both a tcp and udp
1010 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001011 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001012 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001013 # avoid the 'echo' service on this platform, as there is an
1014 # assumption breaking non-standard port/protocol entry
1015 services = ('daytime', 'qotd', 'domain')
1016 else:
1017 services = ('echo', 'daytime', 'domain')
1018 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001019 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001020 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001021 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001022 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001023 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001024 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001025 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001026 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001027 # Issue #26936: Android getservbyname() was broken before API 23.
1028 if (not hasattr(sys, 'getandroidapilevel') or
1029 sys.getandroidapilevel() >= 23):
1030 port2 = socket.getservbyname(service)
1031 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001032 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001033 try:
1034 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001035 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001036 udpport = None
1037 else:
1038 eq(udpport, port)
1039 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001040 # Issue #26936: Android getservbyport() is broken.
1041 if not support.is_android:
1042 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001043 eq(socket.getservbyport(port, 'tcp'), service)
1044 if udpport is not None:
1045 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001046 # Make sure getservbyport does not accept out of range ports.
1047 self.assertRaises(OverflowError, socket.getservbyport, -1)
1048 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001049
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001050 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001051 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001052 # The default timeout should initially be None
1053 self.assertEqual(socket.getdefaulttimeout(), None)
1054 s = socket.socket()
1055 self.assertEqual(s.gettimeout(), None)
1056 s.close()
1057
1058 # Set the default timeout to 10, and see if it propagates
1059 socket.setdefaulttimeout(10)
1060 self.assertEqual(socket.getdefaulttimeout(), 10)
1061 s = socket.socket()
1062 self.assertEqual(s.gettimeout(), 10)
1063 s.close()
1064
1065 # Reset the default timeout to None, and see if it propagates
1066 socket.setdefaulttimeout(None)
1067 self.assertEqual(socket.getdefaulttimeout(), None)
1068 s = socket.socket()
1069 self.assertEqual(s.gettimeout(), None)
1070 s.close()
1071
1072 # Check that setting it to an invalid value raises ValueError
1073 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1074
1075 # Check that setting it to an invalid type raises TypeError
1076 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1077
Serhiy Storchaka43767632013-11-03 21:31:38 +02001078 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1079 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001080 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001081 # Test that issue1008086 and issue767150 are fixed.
1082 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001083 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1084 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001085
Serhiy Storchaka43767632013-11-03 21:31:38 +02001086 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1087 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001088 def testIPv4toString(self):
1089 from socket import inet_aton as f, inet_pton, AF_INET
1090 g = lambda a: inet_pton(AF_INET, a)
1091
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001092 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001093 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001094 )
1095
Ezio Melottib3aedd42010-11-20 19:04:17 +00001096 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1097 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1098 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1099 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1100 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001101 # bpo-29972: inet_pton() doesn't fail on AIX
1102 if not sys.platform.startswith('aix'):
1103 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001104 assertInvalid(f, '300.0.0.0')
1105 assertInvalid(f, 'a.0.0.0')
1106 assertInvalid(f, '1.2.3.4.5')
1107 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001108
Ezio Melottib3aedd42010-11-20 19:04:17 +00001109 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1110 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1111 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1112 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001113 assertInvalid(g, '0.0.0.')
1114 assertInvalid(g, '300.0.0.0')
1115 assertInvalid(g, 'a.0.0.0')
1116 assertInvalid(g, '1.2.3.4.5')
1117 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001118
Serhiy Storchaka43767632013-11-03 21:31:38 +02001119 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1120 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001121 def testIPv6toString(self):
1122 try:
1123 from socket import inet_pton, AF_INET6, has_ipv6
1124 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001125 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001126 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001127 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001128
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001129 if sys.platform == "win32":
1130 try:
1131 inet_pton(AF_INET6, '::')
1132 except OSError as e:
1133 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001134 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001135
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001136 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001137 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001138 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001139 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001140
Ezio Melottib3aedd42010-11-20 19:04:17 +00001141 self.assertEqual(b'\x00' * 16, f('::'))
1142 self.assertEqual(b'\x00' * 16, f('0::0'))
1143 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1144 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001145 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 +00001146 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1147 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001148 self.assertEqual(
1149 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1150 f('ad42:abc::127:0:254:2')
1151 )
1152 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1153 assertInvalid('0x20::')
1154 assertInvalid(':::')
1155 assertInvalid('::0::')
1156 assertInvalid('1::abc::')
1157 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001158 assertInvalid('1:2:3:4:5:6')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001159 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001160 # bpo-29972: inet_pton() doesn't fail on AIX
1161 if not sys.platform.startswith('aix'):
1162 assertInvalid('1:2:3:4:5:6:')
1163 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001164
1165 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1166 f('::254.42.23.64')
1167 )
1168 self.assertEqual(
1169 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1170 f('42::a29b:254.42.23.64')
1171 )
1172 self.assertEqual(
1173 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1174 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1175 )
1176 assertInvalid('255.254.253.252')
1177 assertInvalid('1::260.2.3.0')
1178 assertInvalid('1::0.be.e.0')
1179 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1180 assertInvalid('::1.2.3.4:0')
1181 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001182
Serhiy Storchaka43767632013-11-03 21:31:38 +02001183 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1184 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001185 def testStringToIPv4(self):
1186 from socket import inet_ntoa as f, inet_ntop, AF_INET
1187 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001188 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001189 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001190 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001191
Ezio Melottib3aedd42010-11-20 19:04:17 +00001192 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1193 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1194 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1195 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001196 assertInvalid(f, b'\x00' * 3)
1197 assertInvalid(f, b'\x00' * 5)
1198 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001199 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001200
Ezio Melottib3aedd42010-11-20 19:04:17 +00001201 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1202 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1203 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001204 assertInvalid(g, b'\x00' * 3)
1205 assertInvalid(g, b'\x00' * 5)
1206 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001207 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001208
Serhiy Storchaka43767632013-11-03 21:31:38 +02001209 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1210 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001211 def testStringToIPv6(self):
1212 try:
1213 from socket import inet_ntop, AF_INET6, has_ipv6
1214 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001215 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001216 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001217 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001218
1219 if sys.platform == "win32":
1220 try:
1221 inet_ntop(AF_INET6, b'\x00' * 16)
1222 except OSError as e:
1223 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001224 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001225
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001226 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001227 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001228 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001229 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001230
Ezio Melottib3aedd42010-11-20 19:04:17 +00001231 self.assertEqual('::', f(b'\x00' * 16))
1232 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1233 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001234 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001235 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 +00001236 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001237 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001238
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001239 assertInvalid(b'\x12' * 15)
1240 assertInvalid(b'\x12' * 17)
1241 assertInvalid(b'\x12' * 4)
1242
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001243 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001244
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001245 def testSockName(self):
1246 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001247 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001248 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001249 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001250 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001251 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001252 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1253 # it reasonable to get the host's addr in addition to 0.0.0.0.
1254 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001255 try:
1256 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001257 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001258 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001259 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001260 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001261 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001262
1263 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001264 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001265 # We know a socket should start without reuse==0
1266 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001267 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001268 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001269 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001270
1271 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001272 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001273 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001274 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001275 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1276 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001277 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001278
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001279 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001280 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001281 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1282 sock.settimeout(1)
1283 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001284 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001285
Martin Panter50ab1a32016-04-11 00:38:12 +00001286 def testCloseException(self):
1287 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001288 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001289 socket.socket(fileno=sock.fileno()).close()
1290 try:
1291 sock.close()
1292 except OSError as err:
1293 # Winsock apparently raises ENOTSOCK
1294 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1295 else:
1296 self.fail("close() should raise EBADF/ENOTSOCK")
1297
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001298 def testNewAttributes(self):
1299 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001300
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001301 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1302 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001303 if hasattr(socket, 'SOCK_CLOEXEC'):
1304 self.assertIn(sock.type,
1305 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1306 socket.SOCK_STREAM))
1307 else:
1308 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001309 self.assertEqual(sock.proto, 0)
1310 sock.close()
1311
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001312 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001313 sock = socket.socket()
1314 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001315 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001316 big_port = port + 65536
1317 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001318 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1319 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1320 # Since find_unused_port() is inherently subject to race conditions, we
1321 # call it a couple times if necessary.
1322 for i in itertools.count():
1323 port = support.find_unused_port()
1324 try:
1325 sock.bind((HOST, port))
1326 except OSError as e:
1327 if e.errno != errno.EADDRINUSE or i == 5:
1328 raise
1329 else:
1330 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001331
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001332 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001333 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001334 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1335 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1336 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1337 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001338 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1339 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001340 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001341 self.assertRaises(ValueError, s.ioctl, -1, None)
1342 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001343
Steve Dowerea93ac02016-06-17 12:52:18 -07001344 @unittest.skipUnless(os.name == "nt", "Windows specific")
1345 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1346 'Loopback fast path support required for this test')
1347 def test_sio_loopback_fast_path(self):
1348 s = socket.socket()
1349 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001350 try:
1351 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1352 except OSError as exc:
1353 WSAEOPNOTSUPP = 10045
1354 if exc.winerror == WSAEOPNOTSUPP:
1355 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1356 "doesn't implemented in this Windows version")
1357 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001358 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1359
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001360 def testGetaddrinfo(self):
1361 try:
1362 socket.getaddrinfo('localhost', 80)
1363 except socket.gaierror as err:
1364 if err.errno == socket.EAI_SERVICE:
1365 # see http://bugs.python.org/issue1282647
1366 self.skipTest("buggy libc version")
1367 raise
1368 # len of every sequence is supposed to be == 5
1369 for info in socket.getaddrinfo(HOST, None):
1370 self.assertEqual(len(info), 5)
1371 # host can be a domain name, a string representation of an
1372 # IPv4/v6 address or None
1373 socket.getaddrinfo('localhost', 80)
1374 socket.getaddrinfo('127.0.0.1', 80)
1375 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001376 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001377 socket.getaddrinfo('::1', 80)
1378 # port can be a string service name such as "http", a numeric
1379 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001380 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1381 if (not hasattr(sys, 'getandroidapilevel') or
1382 sys.getandroidapilevel() >= 23):
1383 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001384 socket.getaddrinfo(HOST, 80)
1385 socket.getaddrinfo(HOST, None)
1386 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001387 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1388 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001389 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001390 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1391 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001392 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001393 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1394 for _, socktype, _, _, _ in infos:
1395 self.assertEqual(socktype, socket.SOCK_STREAM)
1396 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001397 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001398 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1399 # a server willing to support both IPv4 and IPv6 will
1400 # usually do this
1401 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1402 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001403 # test keyword arguments
1404 a = socket.getaddrinfo(HOST, None)
1405 b = socket.getaddrinfo(host=HOST, port=None)
1406 self.assertEqual(a, b)
1407 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1408 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1409 self.assertEqual(a, b)
1410 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1411 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1412 self.assertEqual(a, b)
1413 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1414 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1415 self.assertEqual(a, b)
1416 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1417 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1418 self.assertEqual(a, b)
1419 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1420 socket.AI_PASSIVE)
1421 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1422 type=socket.SOCK_STREAM, proto=0,
1423 flags=socket.AI_PASSIVE)
1424 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001425 # Issue #6697.
1426 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001427
Ned Deilyb24f4812014-02-13 22:50:42 -08001428 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001429 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001430 try:
1431 # The arguments here are undefined and the call may succeed
1432 # or fail. All we care here is that it doesn't segfault.
1433 socket.getaddrinfo("localhost", None, 0, 0, 0,
1434 socket.AI_NUMERICSERV)
1435 except socket.gaierror:
1436 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001437
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001438 def test_getnameinfo(self):
1439 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001440 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001441
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001442 @unittest.skipUnless(support.is_resource_enabled('network'),
1443 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001444 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001445 # Check for internet access before running test
1446 # (issue #12804, issue #25138).
1447 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001448 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001449
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001450 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001451 domain = 'испытание.pythontest.net'
1452 socket.gethostbyname(domain)
1453 socket.gethostbyname_ex(domain)
1454 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001455 # this may not work if the forward lookup chooses the IPv6 address, as that doesn't
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001456 # have a reverse entry yet
1457 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001458
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001459 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001460 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001461 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1462 self.skipTest("signal.alarm and socket.socketpair required for this test")
1463 # Our signal handlers clobber the C errno by calling a math function
1464 # with an invalid domain value.
1465 def ok_handler(*args):
1466 self.assertRaises(ValueError, math.acosh, 0)
1467 def raising_handler(*args):
1468 self.assertRaises(ValueError, math.acosh, 0)
1469 1 // 0
1470 c, s = socket.socketpair()
1471 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1472 try:
1473 if with_timeout:
1474 # Just above the one second minimum for signal.alarm
1475 c.settimeout(1.5)
1476 with self.assertRaises(ZeroDivisionError):
1477 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001478 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001479 if with_timeout:
1480 signal.signal(signal.SIGALRM, ok_handler)
1481 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001482 self.assertRaises(socket.timeout, c.sendall,
1483 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001484 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001485 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001486 signal.signal(signal.SIGALRM, old_alarm)
1487 c.close()
1488 s.close()
1489
1490 def test_sendall_interrupted(self):
1491 self.check_sendall_interrupted(False)
1492
1493 def test_sendall_interrupted_with_timeout(self):
1494 self.check_sendall_interrupted(True)
1495
Antoine Pitroue033e062010-10-29 10:38:18 +00001496 def test_dealloc_warn(self):
1497 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1498 r = repr(sock)
1499 with self.assertWarns(ResourceWarning) as cm:
1500 sock = None
1501 support.gc_collect()
1502 self.assertIn(r, str(cm.warning.args[0]))
1503 # An open socket file object gets dereferenced after the socket
1504 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1505 f = sock.makefile('rb')
1506 r = repr(sock)
1507 sock = None
1508 support.gc_collect()
1509 with self.assertWarns(ResourceWarning):
1510 f = None
1511 support.gc_collect()
1512
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001513 def test_name_closed_socketio(self):
1514 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1515 fp = sock.makefile("rb")
1516 fp.close()
1517 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1518
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001519 def test_unusable_closed_socketio(self):
1520 with socket.socket() as sock:
1521 fp = sock.makefile("rb", buffering=0)
1522 self.assertTrue(fp.readable())
1523 self.assertFalse(fp.writable())
1524 self.assertFalse(fp.seekable())
1525 fp.close()
1526 self.assertRaises(ValueError, fp.readable)
1527 self.assertRaises(ValueError, fp.writable)
1528 self.assertRaises(ValueError, fp.seekable)
1529
Christian Heimesd0e31b92018-01-27 09:54:13 +01001530 def test_socket_close(self):
1531 sock = socket.socket()
1532 try:
1533 sock.bind((HOST, 0))
1534 socket.close(sock.fileno())
1535 with self.assertRaises(OSError):
1536 sock.listen(1)
1537 finally:
1538 with self.assertRaises(OSError):
1539 # sock.close() fails with EBADF
1540 sock.close()
1541 with self.assertRaises(TypeError):
1542 socket.close(None)
1543 with self.assertRaises(OSError):
1544 socket.close(-1)
1545
Berker Peksag3fe64d02016-02-18 17:34:00 +02001546 def test_makefile_mode(self):
1547 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1548 with self.subTest(mode=mode):
1549 with socket.socket() as sock:
1550 with sock.makefile(mode) as fp:
1551 self.assertEqual(fp.mode, mode)
1552
1553 def test_makefile_invalid_mode(self):
1554 for mode in 'rt', 'x', '+', 'a':
1555 with self.subTest(mode=mode):
1556 with socket.socket() as sock:
1557 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1558 sock.makefile(mode)
1559
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001560 def test_pickle(self):
1561 sock = socket.socket()
1562 with sock:
1563 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1564 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001565 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1566 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1567 self.assertEqual(family, socket.AF_INET)
1568 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1569 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001570
Serhiy Storchaka78980432013-01-15 01:12:17 +02001571 def test_listen_backlog(self):
1572 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001573 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1574 srv.bind((HOST, 0))
1575 srv.listen(backlog)
1576
1577 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001578 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001579 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001580
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001581 @support.cpython_only
1582 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001583 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001584 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001585 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1586 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001587 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001588 srv.close()
1589
Charles-François Natali42663332012-01-02 15:57:30 +01001590 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001591 def test_flowinfo(self):
1592 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001593 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001594 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001595 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001596
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001597 def test_str_for_enums(self):
1598 # Make sure that the AF_* and SOCK_* constants have enum-like string
1599 # reprs.
1600 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1601 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001602 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001603
Yury Selivanov98181422017-12-18 20:02:54 -05001604 def test_socket_consistent_sock_type(self):
1605 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1606 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1607 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1608
1609 with socket.socket(socket.AF_INET, sock_type) as s:
1610 self.assertEqual(s.type, socket.SOCK_STREAM)
1611 s.settimeout(1)
1612 self.assertEqual(s.type, socket.SOCK_STREAM)
1613 s.settimeout(0)
1614 self.assertEqual(s.type, socket.SOCK_STREAM)
1615 s.setblocking(True)
1616 self.assertEqual(s.type, socket.SOCK_STREAM)
1617 s.setblocking(False)
1618 self.assertEqual(s.type, socket.SOCK_STREAM)
1619
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001620 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001621 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001622 # Test that when created with a family that's not one of the known
1623 # AF_*/SOCK_* constants, socket.family just returns the number.
1624 #
1625 # To do this we fool socket.socket into believing it already has an
1626 # open fd because on this path it doesn't actually verify the family and
1627 # type and populates the socket object.
1628 #
1629 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001630 fd, path = tempfile.mkstemp()
1631 self.addCleanup(os.unlink, path)
Yury Selivanov98181422017-12-18 20:02:54 -05001632 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1633
1634 unknown_type = max(
1635 kind
1636 for name, kind in socket.SocketKind.__members__.items()
1637 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1638 ) + 1
1639
1640 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001641 family=unknown_family, type=unknown_type, proto=23,
1642 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001643 self.assertEqual(s.family, unknown_family)
1644 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001645 # some OS like macOS ignore proto
1646 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001647
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001648 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1649 def test__sendfile_use_sendfile(self):
1650 class File:
1651 def __init__(self, fd):
1652 self.fd = fd
1653
1654 def fileno(self):
1655 return self.fd
1656 with socket.socket() as sock:
1657 fd = os.open(os.curdir, os.O_RDONLY)
1658 os.close(fd)
1659 with self.assertRaises(socket._GiveupOnSendfile):
1660 sock._sendfile_use_sendfile(File(fd))
1661 with self.assertRaises(OverflowError):
1662 sock._sendfile_use_sendfile(File(2**1000))
1663 with self.assertRaises(TypeError):
1664 sock._sendfile_use_sendfile(File(None))
1665
Christian Heimesb6e43af2018-01-29 22:37:58 +01001666 def _test_socket_fileno(self, s, family, stype):
1667 self.assertEqual(s.family, family)
1668 self.assertEqual(s.type, stype)
1669
1670 fd = s.fileno()
1671 s2 = socket.socket(fileno=fd)
1672 self.addCleanup(s2.close)
1673 # detach old fd to avoid double close
1674 s.detach()
1675 self.assertEqual(s2.family, family)
1676 self.assertEqual(s2.type, stype)
1677 self.assertEqual(s2.fileno(), fd)
1678
1679 def test_socket_fileno(self):
1680 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1681 self.addCleanup(s.close)
1682 s.bind((support.HOST, 0))
1683 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1684
1685 if hasattr(socket, "SOCK_DGRAM"):
1686 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1687 self.addCleanup(s.close)
1688 s.bind((support.HOST, 0))
1689 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1690
1691 if support.IPV6_ENABLED:
1692 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1693 self.addCleanup(s.close)
1694 s.bind((support.HOSTv6, 0, 0, 0))
1695 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1696
1697 if hasattr(socket, "AF_UNIX"):
1698 tmpdir = tempfile.mkdtemp()
1699 self.addCleanup(shutil.rmtree, tmpdir)
1700 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1701 self.addCleanup(s.close)
1702 s.bind(os.path.join(tmpdir, 'socket'))
1703 self._test_socket_fileno(s, socket.AF_UNIX, socket.SOCK_STREAM)
1704
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001705
Charles-François Natali47413c12011-10-06 19:47:44 +02001706@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1707class BasicCANTest(unittest.TestCase):
1708
1709 def testCrucialConstants(self):
1710 socket.AF_CAN
1711 socket.PF_CAN
1712 socket.CAN_RAW
1713
Charles-François Natali773e42d2013-02-05 19:42:01 +01001714 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1715 'socket.CAN_BCM required for this test.')
1716 def testBCMConstants(self):
1717 socket.CAN_BCM
1718
1719 # opcodes
1720 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1721 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1722 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1723 socket.CAN_BCM_TX_SEND # send one CAN frame
1724 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1725 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1726 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1727 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1728 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1729 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1730 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1731 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1732
Charles-François Natali47413c12011-10-06 19:47:44 +02001733 def testCreateSocket(self):
1734 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1735 pass
1736
Charles-François Natali773e42d2013-02-05 19:42:01 +01001737 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1738 'socket.CAN_BCM required for this test.')
1739 def testCreateBCMSocket(self):
1740 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1741 pass
1742
Charles-François Natali47413c12011-10-06 19:47:44 +02001743 def testBindAny(self):
1744 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1745 s.bind(('', ))
1746
1747 def testTooLongInterfaceName(self):
1748 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1749 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001750 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001751 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001752
1753 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1754 'socket.CAN_RAW_LOOPBACK required for this test.')
1755 def testLoopback(self):
1756 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1757 for loopback in (0, 1):
1758 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1759 loopback)
1760 self.assertEqual(loopback,
1761 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1762
1763 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1764 'socket.CAN_RAW_FILTER required for this test.')
1765 def testFilter(self):
1766 can_id, can_mask = 0x200, 0x700
1767 can_filter = struct.pack("=II", can_id, can_mask)
1768 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1769 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1770 self.assertEqual(can_filter,
1771 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001772 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001773
1774
1775@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001776class CANTest(ThreadedCANSocketTest):
1777
Charles-François Natali47413c12011-10-06 19:47:44 +02001778 def __init__(self, methodName='runTest'):
1779 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1780
1781 @classmethod
1782 def build_can_frame(cls, can_id, data):
1783 """Build a CAN frame."""
1784 can_dlc = len(data)
1785 data = data.ljust(8, b'\x00')
1786 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1787
1788 @classmethod
1789 def dissect_can_frame(cls, frame):
1790 """Dissect a CAN frame."""
1791 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1792 return (can_id, can_dlc, data[:can_dlc])
1793
1794 def testSendFrame(self):
1795 cf, addr = self.s.recvfrom(self.bufsize)
1796 self.assertEqual(self.cf, cf)
1797 self.assertEqual(addr[0], self.interface)
1798 self.assertEqual(addr[1], socket.AF_CAN)
1799
1800 def _testSendFrame(self):
1801 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1802 self.cli.send(self.cf)
1803
1804 def testSendMaxFrame(self):
1805 cf, addr = self.s.recvfrom(self.bufsize)
1806 self.assertEqual(self.cf, cf)
1807
1808 def _testSendMaxFrame(self):
1809 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1810 self.cli.send(self.cf)
1811
1812 def testSendMultiFrames(self):
1813 cf, addr = self.s.recvfrom(self.bufsize)
1814 self.assertEqual(self.cf1, cf)
1815
1816 cf, addr = self.s.recvfrom(self.bufsize)
1817 self.assertEqual(self.cf2, cf)
1818
1819 def _testSendMultiFrames(self):
1820 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1821 self.cli.send(self.cf1)
1822
1823 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1824 self.cli.send(self.cf2)
1825
Charles-François Natali773e42d2013-02-05 19:42:01 +01001826 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1827 'socket.CAN_BCM required for this test.')
1828 def _testBCM(self):
1829 cf, addr = self.cli.recvfrom(self.bufsize)
1830 self.assertEqual(self.cf, cf)
1831 can_id, can_dlc, data = self.dissect_can_frame(cf)
1832 self.assertEqual(self.can_id, can_id)
1833 self.assertEqual(self.data, data)
1834
1835 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1836 'socket.CAN_BCM required for this test.')
1837 def testBCM(self):
1838 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1839 self.addCleanup(bcm.close)
1840 bcm.connect((self.interface,))
1841 self.can_id = 0x123
1842 self.data = bytes([0xc0, 0xff, 0xee])
1843 self.cf = self.build_can_frame(self.can_id, self.data)
1844 opcode = socket.CAN_BCM_TX_SEND
1845 flags = 0
1846 count = 0
1847 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1848 bcm_can_id = 0x0222
1849 nframes = 1
1850 assert len(self.cf) == 16
1851 header = struct.pack(self.bcm_cmd_msg_fmt,
1852 opcode,
1853 flags,
1854 count,
1855 ival1_seconds,
1856 ival1_usec,
1857 ival2_seconds,
1858 ival2_usec,
1859 bcm_can_id,
1860 nframes,
1861 )
1862 header_plus_frame = header + self.cf
1863 bytes_sent = bcm.send(header_plus_frame)
1864 self.assertEqual(bytes_sent, len(header_plus_frame))
1865
Charles-François Natali47413c12011-10-06 19:47:44 +02001866
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001867@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
1868class ISOTPTest(unittest.TestCase):
1869
1870 def __init__(self, *args, **kwargs):
1871 super().__init__(*args, **kwargs)
1872 self.interface = "vcan0"
1873
1874 def testCrucialConstants(self):
1875 socket.AF_CAN
1876 socket.PF_CAN
1877 socket.CAN_ISOTP
1878 socket.SOCK_DGRAM
1879
1880 def testCreateSocket(self):
1881 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1882 pass
1883
1884 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
1885 'socket.CAN_ISOTP required for this test.')
1886 def testCreateISOTPSocket(self):
1887 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1888 pass
1889
1890 def testTooLongInterfaceName(self):
1891 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1892 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1893 with self.assertRaisesRegex(OSError, 'interface name too long'):
1894 s.bind(('x' * 1024, 1, 2))
1895
1896 def testBind(self):
1897 try:
1898 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1899 addr = self.interface, 0x123, 0x456
1900 s.bind(addr)
1901 self.assertEqual(s.getsockname(), addr)
1902 except OSError as e:
1903 if e.errno == errno.ENODEV:
1904 self.skipTest('network interface `%s` does not exist' %
1905 self.interface)
1906 else:
1907 raise
1908
1909
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001910@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1911class BasicRDSTest(unittest.TestCase):
1912
1913 def testCrucialConstants(self):
1914 socket.AF_RDS
1915 socket.PF_RDS
1916
1917 def testCreateSocket(self):
1918 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1919 pass
1920
1921 def testSocketBufferSize(self):
1922 bufsize = 16384
1923 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1924 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1925 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1926
1927
1928@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001929class RDSTest(ThreadedRDSSocketTest):
1930
1931 def __init__(self, methodName='runTest'):
1932 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1933
Charles-François Natali240c55f2011-11-10 20:33:36 +01001934 def setUp(self):
1935 super().setUp()
1936 self.evt = threading.Event()
1937
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001938 def testSendAndRecv(self):
1939 data, addr = self.serv.recvfrom(self.bufsize)
1940 self.assertEqual(self.data, data)
1941 self.assertEqual(self.cli_addr, addr)
1942
1943 def _testSendAndRecv(self):
1944 self.data = b'spam'
1945 self.cli.sendto(self.data, 0, (HOST, self.port))
1946
1947 def testPeek(self):
1948 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1949 self.assertEqual(self.data, data)
1950 data, addr = self.serv.recvfrom(self.bufsize)
1951 self.assertEqual(self.data, data)
1952
1953 def _testPeek(self):
1954 self.data = b'spam'
1955 self.cli.sendto(self.data, 0, (HOST, self.port))
1956
1957 @requireAttrs(socket.socket, 'recvmsg')
1958 def testSendAndRecvMsg(self):
1959 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1960 self.assertEqual(self.data, data)
1961
1962 @requireAttrs(socket.socket, 'sendmsg')
1963 def _testSendAndRecvMsg(self):
1964 self.data = b'hello ' * 10
1965 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1966
1967 def testSendAndRecvMulti(self):
1968 data, addr = self.serv.recvfrom(self.bufsize)
1969 self.assertEqual(self.data1, data)
1970
1971 data, addr = self.serv.recvfrom(self.bufsize)
1972 self.assertEqual(self.data2, data)
1973
1974 def _testSendAndRecvMulti(self):
1975 self.data1 = b'bacon'
1976 self.cli.sendto(self.data1, 0, (HOST, self.port))
1977
1978 self.data2 = b'egg'
1979 self.cli.sendto(self.data2, 0, (HOST, self.port))
1980
1981 def testSelect(self):
1982 r, w, x = select.select([self.serv], [], [], 3.0)
1983 self.assertIn(self.serv, r)
1984 data, addr = self.serv.recvfrom(self.bufsize)
1985 self.assertEqual(self.data, data)
1986
1987 def _testSelect(self):
1988 self.data = b'select'
1989 self.cli.sendto(self.data, 0, (HOST, self.port))
1990
1991 def testCongestion(self):
1992 # wait until the sender is done
1993 self.evt.wait()
1994
1995 def _testCongestion(self):
1996 # test the behavior in case of congestion
1997 self.data = b'fill'
1998 self.cli.setblocking(False)
1999 try:
2000 # try to lower the receiver's socket buffer size
2001 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
2002 except OSError:
2003 pass
2004 with self.assertRaises(OSError) as cm:
2005 try:
2006 # fill the receiver's socket buffer
2007 while True:
2008 self.cli.sendto(self.data, 0, (HOST, self.port))
2009 finally:
2010 # signal the receiver we're done
2011 self.evt.set()
2012 # sendto() should have failed with ENOBUFS
2013 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
2014 # and we should have received a congestion notification through poll
2015 r, w, x = select.select([self.serv], [], [], 3.0)
2016 self.assertIn(self.serv, r)
2017
2018
caaveryeffc12f2017-09-06 18:18:10 -04002019@unittest.skipIf(fcntl is None, "need fcntl")
2020@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2021 'VSOCK sockets required for this test.')
2022class BasicVSOCKTest(unittest.TestCase):
2023
2024 def testCrucialConstants(self):
2025 socket.AF_VSOCK
2026
2027 def testVSOCKConstants(self):
2028 socket.SO_VM_SOCKETS_BUFFER_SIZE
2029 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2030 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2031 socket.VMADDR_CID_ANY
2032 socket.VMADDR_PORT_ANY
2033 socket.VMADDR_CID_HOST
2034 socket.VM_SOCKETS_INVALID_VERSION
2035 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2036
2037 def testCreateSocket(self):
2038 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2039 pass
2040
2041 def testSocketBufferSize(self):
2042 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2043 orig_max = s.getsockopt(socket.AF_VSOCK,
2044 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2045 orig = s.getsockopt(socket.AF_VSOCK,
2046 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2047 orig_min = s.getsockopt(socket.AF_VSOCK,
2048 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2049
2050 s.setsockopt(socket.AF_VSOCK,
2051 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2052 s.setsockopt(socket.AF_VSOCK,
2053 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2054 s.setsockopt(socket.AF_VSOCK,
2055 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2056
2057 self.assertEqual(orig_max * 2,
2058 s.getsockopt(socket.AF_VSOCK,
2059 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2060 self.assertEqual(orig * 2,
2061 s.getsockopt(socket.AF_VSOCK,
2062 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2063 self.assertEqual(orig_min * 2,
2064 s.getsockopt(socket.AF_VSOCK,
2065 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2066
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002067
Guido van Rossum24e4af82002-06-12 19:18:08 +00002068class BasicTCPTest(SocketConnectedTest):
2069
2070 def __init__(self, methodName='runTest'):
2071 SocketConnectedTest.__init__(self, methodName=methodName)
2072
2073 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002074 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002075 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002076 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002077
2078 def _testRecv(self):
2079 self.serv_conn.send(MSG)
2080
2081 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002082 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002083 seg1 = self.cli_conn.recv(len(MSG) - 3)
2084 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002085 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002086 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002087
2088 def _testOverFlowRecv(self):
2089 self.serv_conn.send(MSG)
2090
2091 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002092 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002093 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002094 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002095
2096 def _testRecvFrom(self):
2097 self.serv_conn.send(MSG)
2098
2099 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002100 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002101 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2102 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002103 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002104 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002105
2106 def _testOverFlowRecvFrom(self):
2107 self.serv_conn.send(MSG)
2108
2109 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002110 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002111 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002112 while 1:
2113 read = self.cli_conn.recv(1024)
2114 if not read:
2115 break
Guido van Rossume531e292002-08-08 20:28:34 +00002116 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002117 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002118
2119 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002120 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002121 self.serv_conn.sendall(big_chunk)
2122
2123 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002124 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002125 fd = self.cli_conn.fileno()
2126 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002127 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002128 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002129 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002130 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002131
2132 def _testFromFd(self):
2133 self.serv_conn.send(MSG)
2134
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002135 def testDup(self):
2136 # Testing dup()
2137 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002138 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002139 msg = sock.recv(1024)
2140 self.assertEqual(msg, MSG)
2141
2142 def _testDup(self):
2143 self.serv_conn.send(MSG)
2144
Guido van Rossum24e4af82002-06-12 19:18:08 +00002145 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002146 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002147 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002148 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002149 # wait for _testShutdown to finish: on OS X, when the server
2150 # closes the connection the client also becomes disconnected,
2151 # and the client's shutdown call will fail. (Issue #4397.)
2152 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002153
2154 def _testShutdown(self):
2155 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002156 self.serv_conn.shutdown(2)
2157
2158 testShutdown_overflow = support.cpython_only(testShutdown)
2159
2160 @support.cpython_only
2161 def _testShutdown_overflow(self):
2162 import _testcapi
2163 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002164 # Issue 15989
2165 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2166 _testcapi.INT_MAX + 1)
2167 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2168 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002169 self.serv_conn.shutdown(2)
2170
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002171 def testDetach(self):
2172 # Testing detach()
2173 fileno = self.cli_conn.fileno()
2174 f = self.cli_conn.detach()
2175 self.assertEqual(f, fileno)
2176 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002177 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002178 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002179 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002180 # ...but we can create another socket using the (still open)
2181 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002182 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002183 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002184 msg = sock.recv(1024)
2185 self.assertEqual(msg, MSG)
2186
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002187 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002188 self.serv_conn.send(MSG)
2189
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002190
Guido van Rossum24e4af82002-06-12 19:18:08 +00002191class BasicUDPTest(ThreadedUDPSocketTest):
2192
2193 def __init__(self, methodName='runTest'):
2194 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2195
2196 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002197 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002198 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002199 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002200
2201 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002202 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002203
Guido van Rossum1c938012002-06-12 21:17:20 +00002204 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002205 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002206 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002207 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002208
Guido van Rossum1c938012002-06-12 21:17:20 +00002209 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002210 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002211
Guido van Rossumd8faa362007-04-27 19:54:29 +00002212 def testRecvFromNegative(self):
2213 # Negative lengths passed to recvfrom should give ValueError.
2214 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2215
2216 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002217 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002218
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002219# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2220# same test code is used with different families and types of socket
2221# (e.g. stream, datagram), and tests using recvmsg() are repeated
2222# using recvmsg_into().
2223#
2224# The generic test classes such as SendmsgTests and
2225# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2226# supplied with sockets cli_sock and serv_sock representing the
2227# client's and the server's end of the connection respectively, and
2228# attributes cli_addr and serv_addr holding their (numeric where
2229# appropriate) addresses.
2230#
2231# The final concrete test classes combine these with subclasses of
2232# SocketTestBase which set up client and server sockets of a specific
2233# type, and with subclasses of SendrecvmsgBase such as
2234# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2235# sockets to cli_sock and serv_sock and override the methods and
2236# attributes of SendrecvmsgBase to fill in destination addresses if
2237# needed when sending, check for specific flags in msg_flags, etc.
2238#
2239# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2240# recvmsg_into().
2241
2242# XXX: like the other datagram (UDP) tests in this module, the code
2243# here assumes that datagram delivery on the local machine will be
2244# reliable.
2245
2246class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2247 # Base class for sendmsg()/recvmsg() tests.
2248
2249 # Time in seconds to wait before considering a test failed, or
2250 # None for no timeout. Not all tests actually set a timeout.
2251 fail_timeout = 3.0
2252
2253 def setUp(self):
2254 self.misc_event = threading.Event()
2255 super().setUp()
2256
2257 def sendToServer(self, msg):
2258 # Send msg to the server.
2259 return self.cli_sock.send(msg)
2260
2261 # Tuple of alternative default arguments for sendmsg() when called
2262 # via sendmsgToServer() (e.g. to include a destination address).
2263 sendmsg_to_server_defaults = ()
2264
2265 def sendmsgToServer(self, *args):
2266 # Call sendmsg() on self.cli_sock with the given arguments,
2267 # filling in any arguments which are not supplied with the
2268 # corresponding items of self.sendmsg_to_server_defaults, if
2269 # any.
2270 return self.cli_sock.sendmsg(
2271 *(args + self.sendmsg_to_server_defaults[len(args):]))
2272
2273 def doRecvmsg(self, sock, bufsize, *args):
2274 # Call recvmsg() on sock with given arguments and return its
2275 # result. Should be used for tests which can use either
2276 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2277 # this method with one which emulates it using recvmsg_into(),
2278 # thus allowing the same test to be used for both methods.
2279 result = sock.recvmsg(bufsize, *args)
2280 self.registerRecvmsgResult(result)
2281 return result
2282
2283 def registerRecvmsgResult(self, result):
2284 # Called by doRecvmsg() with the return value of recvmsg() or
2285 # recvmsg_into(). Can be overridden to arrange cleanup based
2286 # on the returned ancillary data, for instance.
2287 pass
2288
2289 def checkRecvmsgAddress(self, addr1, addr2):
2290 # Called to compare the received address with the address of
2291 # the peer.
2292 self.assertEqual(addr1, addr2)
2293
2294 # Flags that are normally unset in msg_flags
2295 msg_flags_common_unset = 0
2296 for name in ("MSG_CTRUNC", "MSG_OOB"):
2297 msg_flags_common_unset |= getattr(socket, name, 0)
2298
2299 # Flags that are normally set
2300 msg_flags_common_set = 0
2301
2302 # Flags set when a complete record has been received (e.g. MSG_EOR
2303 # for SCTP)
2304 msg_flags_eor_indicator = 0
2305
2306 # Flags set when a complete record has not been received
2307 # (e.g. MSG_TRUNC for datagram sockets)
2308 msg_flags_non_eor_indicator = 0
2309
2310 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2311 # Method to check the value of msg_flags returned by recvmsg[_into]().
2312 #
2313 # Checks that all bits in msg_flags_common_set attribute are
2314 # set in "flags" and all bits in msg_flags_common_unset are
2315 # unset.
2316 #
2317 # The "eor" argument specifies whether the flags should
2318 # indicate that a full record (or datagram) has been received.
2319 # If "eor" is None, no checks are done; otherwise, checks
2320 # that:
2321 #
2322 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2323 # set and all bits in msg_flags_non_eor_indicator are unset
2324 #
2325 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2326 # are set and all bits in msg_flags_eor_indicator are unset
2327 #
2328 # If "checkset" and/or "checkunset" are supplied, they require
2329 # the given bits to be set or unset respectively, overriding
2330 # what the attributes require for those bits.
2331 #
2332 # If any bits are set in "ignore", they will not be checked,
2333 # regardless of the other inputs.
2334 #
2335 # Will raise Exception if the inputs require a bit to be both
2336 # set and unset, and it is not ignored.
2337
2338 defaultset = self.msg_flags_common_set
2339 defaultunset = self.msg_flags_common_unset
2340
2341 if eor:
2342 defaultset |= self.msg_flags_eor_indicator
2343 defaultunset |= self.msg_flags_non_eor_indicator
2344 elif eor is not None:
2345 defaultset |= self.msg_flags_non_eor_indicator
2346 defaultunset |= self.msg_flags_eor_indicator
2347
2348 # Function arguments override defaults
2349 defaultset &= ~checkunset
2350 defaultunset &= ~checkset
2351
2352 # Merge arguments with remaining defaults, and check for conflicts
2353 checkset |= defaultset
2354 checkunset |= defaultunset
2355 inboth = checkset & checkunset & ~ignore
2356 if inboth:
2357 raise Exception("contradictory set, unset requirements for flags "
2358 "{0:#x}".format(inboth))
2359
2360 # Compare with given msg_flags value
2361 mask = (checkset | checkunset) & ~ignore
2362 self.assertEqual(flags & mask, checkset & mask)
2363
2364
2365class RecvmsgIntoMixin(SendrecvmsgBase):
2366 # Mixin to implement doRecvmsg() using recvmsg_into().
2367
2368 def doRecvmsg(self, sock, bufsize, *args):
2369 buf = bytearray(bufsize)
2370 result = sock.recvmsg_into([buf], *args)
2371 self.registerRecvmsgResult(result)
2372 self.assertGreaterEqual(result[0], 0)
2373 self.assertLessEqual(result[0], bufsize)
2374 return (bytes(buf[:result[0]]),) + result[1:]
2375
2376
2377class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2378 # Defines flags to be checked in msg_flags for datagram sockets.
2379
2380 @property
2381 def msg_flags_non_eor_indicator(self):
2382 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2383
2384
2385class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2386 # Defines flags to be checked in msg_flags for SCTP sockets.
2387
2388 @property
2389 def msg_flags_eor_indicator(self):
2390 return super().msg_flags_eor_indicator | socket.MSG_EOR
2391
2392
2393class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2394 # Base class for tests on connectionless-mode sockets. Users must
2395 # supply sockets on attributes cli and serv to be mapped to
2396 # cli_sock and serv_sock respectively.
2397
2398 @property
2399 def serv_sock(self):
2400 return self.serv
2401
2402 @property
2403 def cli_sock(self):
2404 return self.cli
2405
2406 @property
2407 def sendmsg_to_server_defaults(self):
2408 return ([], [], 0, self.serv_addr)
2409
2410 def sendToServer(self, msg):
2411 return self.cli_sock.sendto(msg, self.serv_addr)
2412
2413
2414class SendrecvmsgConnectedBase(SendrecvmsgBase):
2415 # Base class for tests on connected sockets. Users must supply
2416 # sockets on attributes serv_conn and cli_conn (representing the
2417 # connections *to* the server and the client), to be mapped to
2418 # cli_sock and serv_sock respectively.
2419
2420 @property
2421 def serv_sock(self):
2422 return self.cli_conn
2423
2424 @property
2425 def cli_sock(self):
2426 return self.serv_conn
2427
2428 def checkRecvmsgAddress(self, addr1, addr2):
2429 # Address is currently "unspecified" for a connected socket,
2430 # so we don't examine it
2431 pass
2432
2433
2434class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2435 # Base class to set a timeout on server's socket.
2436
2437 def setUp(self):
2438 super().setUp()
2439 self.serv_sock.settimeout(self.fail_timeout)
2440
2441
2442class SendmsgTests(SendrecvmsgServerTimeoutBase):
2443 # Tests for sendmsg() which can use any socket type and do not
2444 # involve recvmsg() or recvmsg_into().
2445
2446 def testSendmsg(self):
2447 # Send a simple message with sendmsg().
2448 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2449
2450 def _testSendmsg(self):
2451 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2452
2453 def testSendmsgDataGenerator(self):
2454 # Send from buffer obtained from a generator (not a sequence).
2455 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2456
2457 def _testSendmsgDataGenerator(self):
2458 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2459 len(MSG))
2460
2461 def testSendmsgAncillaryGenerator(self):
2462 # Gather (empty) ancillary data from a generator.
2463 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2464
2465 def _testSendmsgAncillaryGenerator(self):
2466 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2467 len(MSG))
2468
2469 def testSendmsgArray(self):
2470 # Send data from an array instead of the usual bytes object.
2471 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2472
2473 def _testSendmsgArray(self):
2474 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2475 len(MSG))
2476
2477 def testSendmsgGather(self):
2478 # Send message data from more than one buffer (gather write).
2479 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2480
2481 def _testSendmsgGather(self):
2482 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2483
2484 def testSendmsgBadArgs(self):
2485 # Check that sendmsg() rejects invalid arguments.
2486 self.assertEqual(self.serv_sock.recv(1000), b"done")
2487
2488 def _testSendmsgBadArgs(self):
2489 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2490 self.assertRaises(TypeError, self.sendmsgToServer,
2491 b"not in an iterable")
2492 self.assertRaises(TypeError, self.sendmsgToServer,
2493 object())
2494 self.assertRaises(TypeError, self.sendmsgToServer,
2495 [object()])
2496 self.assertRaises(TypeError, self.sendmsgToServer,
2497 [MSG, object()])
2498 self.assertRaises(TypeError, self.sendmsgToServer,
2499 [MSG], object())
2500 self.assertRaises(TypeError, self.sendmsgToServer,
2501 [MSG], [], object())
2502 self.assertRaises(TypeError, self.sendmsgToServer,
2503 [MSG], [], 0, object())
2504 self.sendToServer(b"done")
2505
2506 def testSendmsgBadCmsg(self):
2507 # Check that invalid ancillary data items are rejected.
2508 self.assertEqual(self.serv_sock.recv(1000), b"done")
2509
2510 def _testSendmsgBadCmsg(self):
2511 self.assertRaises(TypeError, self.sendmsgToServer,
2512 [MSG], [object()])
2513 self.assertRaises(TypeError, self.sendmsgToServer,
2514 [MSG], [(object(), 0, b"data")])
2515 self.assertRaises(TypeError, self.sendmsgToServer,
2516 [MSG], [(0, object(), b"data")])
2517 self.assertRaises(TypeError, self.sendmsgToServer,
2518 [MSG], [(0, 0, object())])
2519 self.assertRaises(TypeError, self.sendmsgToServer,
2520 [MSG], [(0, 0)])
2521 self.assertRaises(TypeError, self.sendmsgToServer,
2522 [MSG], [(0, 0, b"data", 42)])
2523 self.sendToServer(b"done")
2524
2525 @requireAttrs(socket, "CMSG_SPACE")
2526 def testSendmsgBadMultiCmsg(self):
2527 # Check that invalid ancillary data items are rejected when
2528 # more than one item is present.
2529 self.assertEqual(self.serv_sock.recv(1000), b"done")
2530
2531 @testSendmsgBadMultiCmsg.client_skip
2532 def _testSendmsgBadMultiCmsg(self):
2533 self.assertRaises(TypeError, self.sendmsgToServer,
2534 [MSG], [0, 0, b""])
2535 self.assertRaises(TypeError, self.sendmsgToServer,
2536 [MSG], [(0, 0, b""), object()])
2537 self.sendToServer(b"done")
2538
2539 def testSendmsgExcessCmsgReject(self):
2540 # Check that sendmsg() rejects excess ancillary data items
2541 # when the number that can be sent is limited.
2542 self.assertEqual(self.serv_sock.recv(1000), b"done")
2543
2544 def _testSendmsgExcessCmsgReject(self):
2545 if not hasattr(socket, "CMSG_SPACE"):
2546 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002547 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002548 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2549 self.assertIsNone(cm.exception.errno)
2550 self.sendToServer(b"done")
2551
2552 def testSendmsgAfterClose(self):
2553 # Check that sendmsg() fails on a closed socket.
2554 pass
2555
2556 def _testSendmsgAfterClose(self):
2557 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002558 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002559
2560
2561class SendmsgStreamTests(SendmsgTests):
2562 # Tests for sendmsg() which require a stream socket and do not
2563 # involve recvmsg() or recvmsg_into().
2564
2565 def testSendmsgExplicitNoneAddr(self):
2566 # Check that peer address can be specified as None.
2567 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2568
2569 def _testSendmsgExplicitNoneAddr(self):
2570 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2571
2572 def testSendmsgTimeout(self):
2573 # Check that timeout works with sendmsg().
2574 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2575 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2576
2577 def _testSendmsgTimeout(self):
2578 try:
2579 self.cli_sock.settimeout(0.03)
2580 with self.assertRaises(socket.timeout):
2581 while True:
2582 self.sendmsgToServer([b"a"*512])
2583 finally:
2584 self.misc_event.set()
2585
2586 # XXX: would be nice to have more tests for sendmsg flags argument.
2587
2588 # Linux supports MSG_DONTWAIT when sending, but in general, it
2589 # only works when receiving. Could add other platforms if they
2590 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002591 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002592 "MSG_DONTWAIT not known to work on this platform when "
2593 "sending")
2594 def testSendmsgDontWait(self):
2595 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2596 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2597 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2598
2599 @testSendmsgDontWait.client_skip
2600 def _testSendmsgDontWait(self):
2601 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002602 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002603 while True:
2604 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2605 self.assertIn(cm.exception.errno,
2606 (errno.EAGAIN, errno.EWOULDBLOCK))
2607 finally:
2608 self.misc_event.set()
2609
2610
2611class SendmsgConnectionlessTests(SendmsgTests):
2612 # Tests for sendmsg() which require a connectionless-mode
2613 # (e.g. datagram) socket, and do not involve recvmsg() or
2614 # recvmsg_into().
2615
2616 def testSendmsgNoDestAddr(self):
2617 # Check that sendmsg() fails when no destination address is
2618 # given for unconnected socket.
2619 pass
2620
2621 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002622 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002623 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002624 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002625 [MSG], [], 0, None)
2626
2627
2628class RecvmsgGenericTests(SendrecvmsgBase):
2629 # Tests for recvmsg() which can also be emulated using
2630 # recvmsg_into(), and can use any socket type.
2631
2632 def testRecvmsg(self):
2633 # Receive a simple message with recvmsg[_into]().
2634 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2635 self.assertEqual(msg, MSG)
2636 self.checkRecvmsgAddress(addr, self.cli_addr)
2637 self.assertEqual(ancdata, [])
2638 self.checkFlags(flags, eor=True)
2639
2640 def _testRecvmsg(self):
2641 self.sendToServer(MSG)
2642
2643 def testRecvmsgExplicitDefaults(self):
2644 # Test recvmsg[_into]() with default arguments provided explicitly.
2645 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2646 len(MSG), 0, 0)
2647 self.assertEqual(msg, MSG)
2648 self.checkRecvmsgAddress(addr, self.cli_addr)
2649 self.assertEqual(ancdata, [])
2650 self.checkFlags(flags, eor=True)
2651
2652 def _testRecvmsgExplicitDefaults(self):
2653 self.sendToServer(MSG)
2654
2655 def testRecvmsgShorter(self):
2656 # Receive a message smaller than buffer.
2657 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2658 len(MSG) + 42)
2659 self.assertEqual(msg, MSG)
2660 self.checkRecvmsgAddress(addr, self.cli_addr)
2661 self.assertEqual(ancdata, [])
2662 self.checkFlags(flags, eor=True)
2663
2664 def _testRecvmsgShorter(self):
2665 self.sendToServer(MSG)
2666
2667 def testRecvmsgTrunc(self):
2668 # Receive part of message, check for truncation indicators.
2669 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2670 len(MSG) - 3)
2671 self.assertEqual(msg, MSG[:-3])
2672 self.checkRecvmsgAddress(addr, self.cli_addr)
2673 self.assertEqual(ancdata, [])
2674 self.checkFlags(flags, eor=False)
2675
2676 def _testRecvmsgTrunc(self):
2677 self.sendToServer(MSG)
2678
2679 def testRecvmsgShortAncillaryBuf(self):
2680 # Test ancillary data buffer too small to hold any ancillary data.
2681 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2682 len(MSG), 1)
2683 self.assertEqual(msg, MSG)
2684 self.checkRecvmsgAddress(addr, self.cli_addr)
2685 self.assertEqual(ancdata, [])
2686 self.checkFlags(flags, eor=True)
2687
2688 def _testRecvmsgShortAncillaryBuf(self):
2689 self.sendToServer(MSG)
2690
2691 def testRecvmsgLongAncillaryBuf(self):
2692 # Test large ancillary data buffer.
2693 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2694 len(MSG), 10240)
2695 self.assertEqual(msg, MSG)
2696 self.checkRecvmsgAddress(addr, self.cli_addr)
2697 self.assertEqual(ancdata, [])
2698 self.checkFlags(flags, eor=True)
2699
2700 def _testRecvmsgLongAncillaryBuf(self):
2701 self.sendToServer(MSG)
2702
2703 def testRecvmsgAfterClose(self):
2704 # Check that recvmsg[_into]() fails on a closed socket.
2705 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002706 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002707
2708 def _testRecvmsgAfterClose(self):
2709 pass
2710
2711 def testRecvmsgTimeout(self):
2712 # Check that timeout works.
2713 try:
2714 self.serv_sock.settimeout(0.03)
2715 self.assertRaises(socket.timeout,
2716 self.doRecvmsg, self.serv_sock, len(MSG))
2717 finally:
2718 self.misc_event.set()
2719
2720 def _testRecvmsgTimeout(self):
2721 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2722
2723 @requireAttrs(socket, "MSG_PEEK")
2724 def testRecvmsgPeek(self):
2725 # Check that MSG_PEEK in flags enables examination of pending
2726 # data without consuming it.
2727
2728 # Receive part of data with MSG_PEEK.
2729 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2730 len(MSG) - 3, 0,
2731 socket.MSG_PEEK)
2732 self.assertEqual(msg, MSG[:-3])
2733 self.checkRecvmsgAddress(addr, self.cli_addr)
2734 self.assertEqual(ancdata, [])
2735 # Ignoring MSG_TRUNC here (so this test is the same for stream
2736 # and datagram sockets). Some wording in POSIX seems to
2737 # suggest that it needn't be set when peeking, but that may
2738 # just be a slip.
2739 self.checkFlags(flags, eor=False,
2740 ignore=getattr(socket, "MSG_TRUNC", 0))
2741
2742 # Receive all data with MSG_PEEK.
2743 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2744 len(MSG), 0,
2745 socket.MSG_PEEK)
2746 self.assertEqual(msg, MSG)
2747 self.checkRecvmsgAddress(addr, self.cli_addr)
2748 self.assertEqual(ancdata, [])
2749 self.checkFlags(flags, eor=True)
2750
2751 # Check that the same data can still be received normally.
2752 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2753 self.assertEqual(msg, MSG)
2754 self.checkRecvmsgAddress(addr, self.cli_addr)
2755 self.assertEqual(ancdata, [])
2756 self.checkFlags(flags, eor=True)
2757
2758 @testRecvmsgPeek.client_skip
2759 def _testRecvmsgPeek(self):
2760 self.sendToServer(MSG)
2761
2762 @requireAttrs(socket.socket, "sendmsg")
2763 def testRecvmsgFromSendmsg(self):
2764 # Test receiving with recvmsg[_into]() when message is sent
2765 # using sendmsg().
2766 self.serv_sock.settimeout(self.fail_timeout)
2767 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2768 self.assertEqual(msg, MSG)
2769 self.checkRecvmsgAddress(addr, self.cli_addr)
2770 self.assertEqual(ancdata, [])
2771 self.checkFlags(flags, eor=True)
2772
2773 @testRecvmsgFromSendmsg.client_skip
2774 def _testRecvmsgFromSendmsg(self):
2775 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2776
2777
2778class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2779 # Tests which require a stream socket and can use either recvmsg()
2780 # or recvmsg_into().
2781
2782 def testRecvmsgEOF(self):
2783 # Receive end-of-stream indicator (b"", peer socket closed).
2784 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2785 self.assertEqual(msg, b"")
2786 self.checkRecvmsgAddress(addr, self.cli_addr)
2787 self.assertEqual(ancdata, [])
2788 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2789
2790 def _testRecvmsgEOF(self):
2791 self.cli_sock.close()
2792
2793 def testRecvmsgOverflow(self):
2794 # Receive a message in more than one chunk.
2795 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2796 len(MSG) - 3)
2797 self.checkRecvmsgAddress(addr, self.cli_addr)
2798 self.assertEqual(ancdata, [])
2799 self.checkFlags(flags, eor=False)
2800
2801 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2802 self.checkRecvmsgAddress(addr, self.cli_addr)
2803 self.assertEqual(ancdata, [])
2804 self.checkFlags(flags, eor=True)
2805
2806 msg = seg1 + seg2
2807 self.assertEqual(msg, MSG)
2808
2809 def _testRecvmsgOverflow(self):
2810 self.sendToServer(MSG)
2811
2812
2813class RecvmsgTests(RecvmsgGenericTests):
2814 # Tests for recvmsg() which can use any socket type.
2815
2816 def testRecvmsgBadArgs(self):
2817 # Check that recvmsg() rejects invalid arguments.
2818 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2819 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2820 -1, 0, 0)
2821 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2822 len(MSG), -1, 0)
2823 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2824 [bytearray(10)], 0, 0)
2825 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2826 object(), 0, 0)
2827 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2828 len(MSG), object(), 0)
2829 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2830 len(MSG), 0, object())
2831
2832 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2833 self.assertEqual(msg, MSG)
2834 self.checkRecvmsgAddress(addr, self.cli_addr)
2835 self.assertEqual(ancdata, [])
2836 self.checkFlags(flags, eor=True)
2837
2838 def _testRecvmsgBadArgs(self):
2839 self.sendToServer(MSG)
2840
2841
2842class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2843 # Tests for recvmsg_into() which can use any socket type.
2844
2845 def testRecvmsgIntoBadArgs(self):
2846 # Check that recvmsg_into() rejects invalid arguments.
2847 buf = bytearray(len(MSG))
2848 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2849 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2850 len(MSG), 0, 0)
2851 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2852 buf, 0, 0)
2853 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2854 [object()], 0, 0)
2855 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2856 [b"I'm not writable"], 0, 0)
2857 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2858 [buf, object()], 0, 0)
2859 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2860 [buf], -1, 0)
2861 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2862 [buf], object(), 0)
2863 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2864 [buf], 0, object())
2865
2866 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2867 self.assertEqual(nbytes, len(MSG))
2868 self.assertEqual(buf, bytearray(MSG))
2869 self.checkRecvmsgAddress(addr, self.cli_addr)
2870 self.assertEqual(ancdata, [])
2871 self.checkFlags(flags, eor=True)
2872
2873 def _testRecvmsgIntoBadArgs(self):
2874 self.sendToServer(MSG)
2875
2876 def testRecvmsgIntoGenerator(self):
2877 # Receive into buffer obtained from a generator (not a sequence).
2878 buf = bytearray(len(MSG))
2879 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2880 (o for o in [buf]))
2881 self.assertEqual(nbytes, len(MSG))
2882 self.assertEqual(buf, bytearray(MSG))
2883 self.checkRecvmsgAddress(addr, self.cli_addr)
2884 self.assertEqual(ancdata, [])
2885 self.checkFlags(flags, eor=True)
2886
2887 def _testRecvmsgIntoGenerator(self):
2888 self.sendToServer(MSG)
2889
2890 def testRecvmsgIntoArray(self):
2891 # Receive into an array rather than the usual bytearray.
2892 buf = array.array("B", [0] * len(MSG))
2893 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2894 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002895 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002896 self.checkRecvmsgAddress(addr, self.cli_addr)
2897 self.assertEqual(ancdata, [])
2898 self.checkFlags(flags, eor=True)
2899
2900 def _testRecvmsgIntoArray(self):
2901 self.sendToServer(MSG)
2902
2903 def testRecvmsgIntoScatter(self):
2904 # Receive into multiple buffers (scatter write).
2905 b1 = bytearray(b"----")
2906 b2 = bytearray(b"0123456789")
2907 b3 = bytearray(b"--------------")
2908 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2909 [b1, memoryview(b2)[2:9], b3])
2910 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2911 self.assertEqual(b1, bytearray(b"Mary"))
2912 self.assertEqual(b2, bytearray(b"01 had a 9"))
2913 self.assertEqual(b3, bytearray(b"little lamb---"))
2914 self.checkRecvmsgAddress(addr, self.cli_addr)
2915 self.assertEqual(ancdata, [])
2916 self.checkFlags(flags, eor=True)
2917
2918 def _testRecvmsgIntoScatter(self):
2919 self.sendToServer(b"Mary had a little lamb")
2920
2921
2922class CmsgMacroTests(unittest.TestCase):
2923 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2924 # assumptions used by sendmsg() and recvmsg[_into](), which share
2925 # code with these functions.
2926
2927 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002928 try:
2929 import _testcapi
2930 except ImportError:
2931 socklen_t_limit = 0x7fffffff
2932 else:
2933 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002934
2935 @requireAttrs(socket, "CMSG_LEN")
2936 def testCMSG_LEN(self):
2937 # Test CMSG_LEN() with various valid and invalid values,
2938 # checking the assumptions used by recvmsg() and sendmsg().
2939 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2940 values = list(range(257)) + list(range(toobig - 257, toobig))
2941
2942 # struct cmsghdr has at least three members, two of which are ints
2943 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2944 for n in values:
2945 ret = socket.CMSG_LEN(n)
2946 # This is how recvmsg() calculates the data size
2947 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2948 self.assertLessEqual(ret, self.socklen_t_limit)
2949
2950 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2951 # sendmsg() shares code with these functions, and requires
2952 # that it reject values over the limit.
2953 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2954 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2955
2956 @requireAttrs(socket, "CMSG_SPACE")
2957 def testCMSG_SPACE(self):
2958 # Test CMSG_SPACE() with various valid and invalid values,
2959 # checking the assumptions used by sendmsg().
2960 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2961 values = list(range(257)) + list(range(toobig - 257, toobig))
2962
2963 last = socket.CMSG_SPACE(0)
2964 # struct cmsghdr has at least three members, two of which are ints
2965 self.assertGreater(last, array.array("i").itemsize * 2)
2966 for n in values:
2967 ret = socket.CMSG_SPACE(n)
2968 self.assertGreaterEqual(ret, last)
2969 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2970 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2971 self.assertLessEqual(ret, self.socklen_t_limit)
2972 last = ret
2973
2974 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2975 # sendmsg() shares code with these functions, and requires
2976 # that it reject values over the limit.
2977 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2978 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2979
2980
2981class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2982 # Tests for file descriptor passing on Unix-domain sockets.
2983
2984 # Invalid file descriptor value that's unlikely to evaluate to a
2985 # real FD even if one of its bytes is replaced with a different
2986 # value (which shouldn't actually happen).
2987 badfd = -0x5555
2988
2989 def newFDs(self, n):
2990 # Return a list of n file descriptors for newly-created files
2991 # containing their list indices as ASCII numbers.
2992 fds = []
2993 for i in range(n):
2994 fd, path = tempfile.mkstemp()
2995 self.addCleanup(os.unlink, path)
2996 self.addCleanup(os.close, fd)
2997 os.write(fd, str(i).encode())
2998 fds.append(fd)
2999 return fds
3000
3001 def checkFDs(self, fds):
3002 # Check that the file descriptors in the given list contain
3003 # their correct list indices as ASCII numbers.
3004 for n, fd in enumerate(fds):
3005 os.lseek(fd, 0, os.SEEK_SET)
3006 self.assertEqual(os.read(fd, 1024), str(n).encode())
3007
3008 def registerRecvmsgResult(self, result):
3009 self.addCleanup(self.closeRecvmsgFDs, result)
3010
3011 def closeRecvmsgFDs(self, recvmsg_result):
3012 # Close all file descriptors specified in the ancillary data
3013 # of the given return value from recvmsg() or recvmsg_into().
3014 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3015 if (cmsg_level == socket.SOL_SOCKET and
3016 cmsg_type == socket.SCM_RIGHTS):
3017 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003018 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003019 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3020 for fd in fds:
3021 os.close(fd)
3022
3023 def createAndSendFDs(self, n):
3024 # Send n new file descriptors created by newFDs() to the
3025 # server, with the constant MSG as the non-ancillary data.
3026 self.assertEqual(
3027 self.sendmsgToServer([MSG],
3028 [(socket.SOL_SOCKET,
3029 socket.SCM_RIGHTS,
3030 array.array("i", self.newFDs(n)))]),
3031 len(MSG))
3032
3033 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3034 # Check that constant MSG was received with numfds file
3035 # descriptors in a maximum of maxcmsgs control messages (which
3036 # must contain only complete integers). By default, check
3037 # that MSG_CTRUNC is unset, but ignore any flags in
3038 # ignoreflags.
3039 msg, ancdata, flags, addr = result
3040 self.assertEqual(msg, MSG)
3041 self.checkRecvmsgAddress(addr, self.cli_addr)
3042 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3043 ignore=ignoreflags)
3044
3045 self.assertIsInstance(ancdata, list)
3046 self.assertLessEqual(len(ancdata), maxcmsgs)
3047 fds = array.array("i")
3048 for item in ancdata:
3049 self.assertIsInstance(item, tuple)
3050 cmsg_level, cmsg_type, cmsg_data = item
3051 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3052 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3053 self.assertIsInstance(cmsg_data, bytes)
3054 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003055 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003056
3057 self.assertEqual(len(fds), numfds)
3058 self.checkFDs(fds)
3059
3060 def testFDPassSimple(self):
3061 # Pass a single FD (array read from bytes object).
3062 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3063 len(MSG), 10240))
3064
3065 def _testFDPassSimple(self):
3066 self.assertEqual(
3067 self.sendmsgToServer(
3068 [MSG],
3069 [(socket.SOL_SOCKET,
3070 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003071 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003072 len(MSG))
3073
3074 def testMultipleFDPass(self):
3075 # Pass multiple FDs in a single array.
3076 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3077 len(MSG), 10240))
3078
3079 def _testMultipleFDPass(self):
3080 self.createAndSendFDs(4)
3081
3082 @requireAttrs(socket, "CMSG_SPACE")
3083 def testFDPassCMSG_SPACE(self):
3084 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3085 self.checkRecvmsgFDs(
3086 4, self.doRecvmsg(self.serv_sock, len(MSG),
3087 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3088
3089 @testFDPassCMSG_SPACE.client_skip
3090 def _testFDPassCMSG_SPACE(self):
3091 self.createAndSendFDs(4)
3092
3093 def testFDPassCMSG_LEN(self):
3094 # Test using CMSG_LEN() to calculate ancillary buffer size.
3095 self.checkRecvmsgFDs(1,
3096 self.doRecvmsg(self.serv_sock, len(MSG),
3097 socket.CMSG_LEN(4 * SIZEOF_INT)),
3098 # RFC 3542 says implementations may set
3099 # MSG_CTRUNC if there isn't enough space
3100 # for trailing padding.
3101 ignoreflags=socket.MSG_CTRUNC)
3102
3103 def _testFDPassCMSG_LEN(self):
3104 self.createAndSendFDs(1)
3105
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003106 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003107 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003108 @requireAttrs(socket, "CMSG_SPACE")
3109 def testFDPassSeparate(self):
3110 # Pass two FDs in two separate arrays. Arrays may be combined
3111 # into a single control message by the OS.
3112 self.checkRecvmsgFDs(2,
3113 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3114 maxcmsgs=2)
3115
3116 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003117 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003118 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003119 def _testFDPassSeparate(self):
3120 fd0, fd1 = self.newFDs(2)
3121 self.assertEqual(
3122 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3123 socket.SCM_RIGHTS,
3124 array.array("i", [fd0])),
3125 (socket.SOL_SOCKET,
3126 socket.SCM_RIGHTS,
3127 array.array("i", [fd1]))]),
3128 len(MSG))
3129
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003130 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003131 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003132 @requireAttrs(socket, "CMSG_SPACE")
3133 def testFDPassSeparateMinSpace(self):
3134 # Pass two FDs in two separate arrays, receiving them into the
3135 # minimum space for two arrays.
3136 self.checkRecvmsgFDs(2,
3137 self.doRecvmsg(self.serv_sock, len(MSG),
3138 socket.CMSG_SPACE(SIZEOF_INT) +
3139 socket.CMSG_LEN(SIZEOF_INT)),
3140 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3141
3142 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003143 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003144 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003145 def _testFDPassSeparateMinSpace(self):
3146 fd0, fd1 = self.newFDs(2)
3147 self.assertEqual(
3148 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3149 socket.SCM_RIGHTS,
3150 array.array("i", [fd0])),
3151 (socket.SOL_SOCKET,
3152 socket.SCM_RIGHTS,
3153 array.array("i", [fd1]))]),
3154 len(MSG))
3155
3156 def sendAncillaryIfPossible(self, msg, ancdata):
3157 # Try to send msg and ancdata to server, but if the system
3158 # call fails, just send msg with no ancillary data.
3159 try:
3160 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003161 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003162 # Check that it was the system call that failed
3163 self.assertIsInstance(e.errno, int)
3164 nbytes = self.sendmsgToServer([msg])
3165 self.assertEqual(nbytes, len(msg))
3166
Brett Cannon3bbad122015-12-28 17:21:44 -08003167 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003168 def testFDPassEmpty(self):
3169 # Try to pass an empty FD array. Can receive either no array
3170 # or an empty array.
3171 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3172 len(MSG), 10240),
3173 ignoreflags=socket.MSG_CTRUNC)
3174
3175 def _testFDPassEmpty(self):
3176 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3177 socket.SCM_RIGHTS,
3178 b"")])
3179
3180 def testFDPassPartialInt(self):
3181 # Try to pass a truncated FD array.
3182 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3183 len(MSG), 10240)
3184 self.assertEqual(msg, MSG)
3185 self.checkRecvmsgAddress(addr, self.cli_addr)
3186 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3187 self.assertLessEqual(len(ancdata), 1)
3188 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3189 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3190 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3191 self.assertLess(len(cmsg_data), SIZEOF_INT)
3192
3193 def _testFDPassPartialInt(self):
3194 self.sendAncillaryIfPossible(
3195 MSG,
3196 [(socket.SOL_SOCKET,
3197 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003198 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003199
3200 @requireAttrs(socket, "CMSG_SPACE")
3201 def testFDPassPartialIntInMiddle(self):
3202 # Try to pass two FD arrays, the first of which is truncated.
3203 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3204 len(MSG), 10240)
3205 self.assertEqual(msg, MSG)
3206 self.checkRecvmsgAddress(addr, self.cli_addr)
3207 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3208 self.assertLessEqual(len(ancdata), 2)
3209 fds = array.array("i")
3210 # Arrays may have been combined in a single control message
3211 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3212 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3213 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003214 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003215 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3216 self.assertLessEqual(len(fds), 2)
3217 self.checkFDs(fds)
3218
3219 @testFDPassPartialIntInMiddle.client_skip
3220 def _testFDPassPartialIntInMiddle(self):
3221 fd0, fd1 = self.newFDs(2)
3222 self.sendAncillaryIfPossible(
3223 MSG,
3224 [(socket.SOL_SOCKET,
3225 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003226 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003227 (socket.SOL_SOCKET,
3228 socket.SCM_RIGHTS,
3229 array.array("i", [fd1]))])
3230
3231 def checkTruncatedHeader(self, result, ignoreflags=0):
3232 # Check that no ancillary data items are returned when data is
3233 # truncated inside the cmsghdr structure.
3234 msg, ancdata, flags, addr = result
3235 self.assertEqual(msg, MSG)
3236 self.checkRecvmsgAddress(addr, self.cli_addr)
3237 self.assertEqual(ancdata, [])
3238 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3239 ignore=ignoreflags)
3240
3241 def testCmsgTruncNoBufSize(self):
3242 # Check that no ancillary data is received when no buffer size
3243 # is specified.
3244 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3245 # BSD seems to set MSG_CTRUNC only
3246 # if an item has been partially
3247 # received.
3248 ignoreflags=socket.MSG_CTRUNC)
3249
3250 def _testCmsgTruncNoBufSize(self):
3251 self.createAndSendFDs(1)
3252
3253 def testCmsgTrunc0(self):
3254 # Check that no ancillary data is received when buffer size is 0.
3255 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3256 ignoreflags=socket.MSG_CTRUNC)
3257
3258 def _testCmsgTrunc0(self):
3259 self.createAndSendFDs(1)
3260
3261 # Check that no ancillary data is returned for various non-zero
3262 # (but still too small) buffer sizes.
3263
3264 def testCmsgTrunc1(self):
3265 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3266
3267 def _testCmsgTrunc1(self):
3268 self.createAndSendFDs(1)
3269
3270 def testCmsgTrunc2Int(self):
3271 # The cmsghdr structure has at least three members, two of
3272 # which are ints, so we still shouldn't see any ancillary
3273 # data.
3274 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3275 SIZEOF_INT * 2))
3276
3277 def _testCmsgTrunc2Int(self):
3278 self.createAndSendFDs(1)
3279
3280 def testCmsgTruncLen0Minus1(self):
3281 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3282 socket.CMSG_LEN(0) - 1))
3283
3284 def _testCmsgTruncLen0Minus1(self):
3285 self.createAndSendFDs(1)
3286
3287 # The following tests try to truncate the control message in the
3288 # middle of the FD array.
3289
3290 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3291 # Check that file descriptor data is truncated to between
3292 # mindata and maxdata bytes when received with buffer size
3293 # ancbuf, and that any complete file descriptor numbers are
3294 # valid.
3295 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3296 len(MSG), ancbuf)
3297 self.assertEqual(msg, MSG)
3298 self.checkRecvmsgAddress(addr, self.cli_addr)
3299 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3300
3301 if mindata == 0 and ancdata == []:
3302 return
3303 self.assertEqual(len(ancdata), 1)
3304 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3305 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3306 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3307 self.assertGreaterEqual(len(cmsg_data), mindata)
3308 self.assertLessEqual(len(cmsg_data), maxdata)
3309 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003310 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003311 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3312 self.checkFDs(fds)
3313
3314 def testCmsgTruncLen0(self):
3315 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3316
3317 def _testCmsgTruncLen0(self):
3318 self.createAndSendFDs(1)
3319
3320 def testCmsgTruncLen0Plus1(self):
3321 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3322
3323 def _testCmsgTruncLen0Plus1(self):
3324 self.createAndSendFDs(2)
3325
3326 def testCmsgTruncLen1(self):
3327 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3328 maxdata=SIZEOF_INT)
3329
3330 def _testCmsgTruncLen1(self):
3331 self.createAndSendFDs(2)
3332
3333 def testCmsgTruncLen2Minus1(self):
3334 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3335 maxdata=(2 * SIZEOF_INT) - 1)
3336
3337 def _testCmsgTruncLen2Minus1(self):
3338 self.createAndSendFDs(2)
3339
3340
3341class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3342 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3343 # features of the RFC 3542 Advanced Sockets API for IPv6.
3344 # Currently we can only handle certain data items (e.g. traffic
3345 # class, hop limit, MTU discovery and fragmentation settings)
3346 # without resorting to unportable means such as the struct module,
3347 # but the tests here are aimed at testing the ancillary data
3348 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3349 # itself.
3350
3351 # Test value to use when setting hop limit of packet
3352 hop_limit = 2
3353
3354 # Test value to use when setting traffic class of packet.
3355 # -1 means "use kernel default".
3356 traffic_class = -1
3357
3358 def ancillaryMapping(self, ancdata):
3359 # Given ancillary data list ancdata, return a mapping from
3360 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3361 # Check that no (level, type) pair appears more than once.
3362 d = {}
3363 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3364 self.assertNotIn((cmsg_level, cmsg_type), d)
3365 d[(cmsg_level, cmsg_type)] = cmsg_data
3366 return d
3367
3368 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3369 # Receive hop limit into ancbufsize bytes of ancillary data
3370 # space. Check that data is MSG, ancillary data is not
3371 # truncated (but ignore any flags in ignoreflags), and hop
3372 # limit is between 0 and maxhop inclusive.
3373 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3374 socket.IPV6_RECVHOPLIMIT, 1)
3375 self.misc_event.set()
3376 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3377 len(MSG), ancbufsize)
3378
3379 self.assertEqual(msg, MSG)
3380 self.checkRecvmsgAddress(addr, self.cli_addr)
3381 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3382 ignore=ignoreflags)
3383
3384 self.assertEqual(len(ancdata), 1)
3385 self.assertIsInstance(ancdata[0], tuple)
3386 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3387 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3388 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3389 self.assertIsInstance(cmsg_data, bytes)
3390 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3391 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003392 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003393 self.assertGreaterEqual(a[0], 0)
3394 self.assertLessEqual(a[0], maxhop)
3395
3396 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3397 def testRecvHopLimit(self):
3398 # Test receiving the packet hop limit as ancillary data.
3399 self.checkHopLimit(ancbufsize=10240)
3400
3401 @testRecvHopLimit.client_skip
3402 def _testRecvHopLimit(self):
3403 # Need to wait until server has asked to receive ancillary
3404 # data, as implementations are not required to buffer it
3405 # otherwise.
3406 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3407 self.sendToServer(MSG)
3408
3409 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3410 def testRecvHopLimitCMSG_SPACE(self):
3411 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3412 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3413
3414 @testRecvHopLimitCMSG_SPACE.client_skip
3415 def _testRecvHopLimitCMSG_SPACE(self):
3416 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3417 self.sendToServer(MSG)
3418
3419 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3420 # 3542 says portable applications must provide space for trailing
3421 # padding. Implementations may set MSG_CTRUNC if there isn't
3422 # enough space for the padding.
3423
3424 @requireAttrs(socket.socket, "sendmsg")
3425 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3426 def testSetHopLimit(self):
3427 # Test setting hop limit on outgoing packet and receiving it
3428 # at the other end.
3429 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3430
3431 @testSetHopLimit.client_skip
3432 def _testSetHopLimit(self):
3433 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3434 self.assertEqual(
3435 self.sendmsgToServer([MSG],
3436 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3437 array.array("i", [self.hop_limit]))]),
3438 len(MSG))
3439
3440 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3441 ignoreflags=0):
3442 # Receive traffic class and hop limit into ancbufsize bytes of
3443 # ancillary data space. Check that data is MSG, ancillary
3444 # data is not truncated (but ignore any flags in ignoreflags),
3445 # and traffic class and hop limit are in range (hop limit no
3446 # more than maxhop).
3447 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3448 socket.IPV6_RECVHOPLIMIT, 1)
3449 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3450 socket.IPV6_RECVTCLASS, 1)
3451 self.misc_event.set()
3452 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3453 len(MSG), ancbufsize)
3454
3455 self.assertEqual(msg, MSG)
3456 self.checkRecvmsgAddress(addr, self.cli_addr)
3457 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3458 ignore=ignoreflags)
3459 self.assertEqual(len(ancdata), 2)
3460 ancmap = self.ancillaryMapping(ancdata)
3461
3462 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3463 self.assertEqual(len(tcdata), SIZEOF_INT)
3464 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003465 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003466 self.assertGreaterEqual(a[0], 0)
3467 self.assertLessEqual(a[0], 255)
3468
3469 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3470 self.assertEqual(len(hldata), SIZEOF_INT)
3471 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003472 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003473 self.assertGreaterEqual(a[0], 0)
3474 self.assertLessEqual(a[0], maxhop)
3475
3476 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3477 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3478 def testRecvTrafficClassAndHopLimit(self):
3479 # Test receiving traffic class and hop limit as ancillary data.
3480 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3481
3482 @testRecvTrafficClassAndHopLimit.client_skip
3483 def _testRecvTrafficClassAndHopLimit(self):
3484 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3485 self.sendToServer(MSG)
3486
3487 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3488 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3489 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3490 # Test receiving traffic class and hop limit, using
3491 # CMSG_SPACE() to calculate buffer size.
3492 self.checkTrafficClassAndHopLimit(
3493 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3494
3495 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3496 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3497 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3498 self.sendToServer(MSG)
3499
3500 @requireAttrs(socket.socket, "sendmsg")
3501 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3502 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3503 def testSetTrafficClassAndHopLimit(self):
3504 # Test setting traffic class and hop limit on outgoing packet,
3505 # and receiving them at the other end.
3506 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3507 maxhop=self.hop_limit)
3508
3509 @testSetTrafficClassAndHopLimit.client_skip
3510 def _testSetTrafficClassAndHopLimit(self):
3511 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3512 self.assertEqual(
3513 self.sendmsgToServer([MSG],
3514 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3515 array.array("i", [self.traffic_class])),
3516 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3517 array.array("i", [self.hop_limit]))]),
3518 len(MSG))
3519
3520 @requireAttrs(socket.socket, "sendmsg")
3521 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3522 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3523 def testOddCmsgSize(self):
3524 # Try to send ancillary data with first item one byte too
3525 # long. Fall back to sending with correct size if this fails,
3526 # and check that second item was handled correctly.
3527 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3528 maxhop=self.hop_limit)
3529
3530 @testOddCmsgSize.client_skip
3531 def _testOddCmsgSize(self):
3532 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3533 try:
3534 nbytes = self.sendmsgToServer(
3535 [MSG],
3536 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003537 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003538 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3539 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003540 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003541 self.assertIsInstance(e.errno, int)
3542 nbytes = self.sendmsgToServer(
3543 [MSG],
3544 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3545 array.array("i", [self.traffic_class])),
3546 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3547 array.array("i", [self.hop_limit]))])
3548 self.assertEqual(nbytes, len(MSG))
3549
3550 # Tests for proper handling of truncated ancillary data
3551
3552 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3553 # Receive hop limit into ancbufsize bytes of ancillary data
3554 # space, which should be too small to contain the ancillary
3555 # data header (if ancbufsize is None, pass no second argument
3556 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3557 # (unless included in ignoreflags), and no ancillary data is
3558 # returned.
3559 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3560 socket.IPV6_RECVHOPLIMIT, 1)
3561 self.misc_event.set()
3562 args = () if ancbufsize is None else (ancbufsize,)
3563 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3564 len(MSG), *args)
3565
3566 self.assertEqual(msg, MSG)
3567 self.checkRecvmsgAddress(addr, self.cli_addr)
3568 self.assertEqual(ancdata, [])
3569 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3570 ignore=ignoreflags)
3571
3572 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3573 def testCmsgTruncNoBufSize(self):
3574 # Check that no ancillary data is received when no ancillary
3575 # buffer size is provided.
3576 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3577 # BSD seems to set
3578 # MSG_CTRUNC only if an item
3579 # has been partially
3580 # received.
3581 ignoreflags=socket.MSG_CTRUNC)
3582
3583 @testCmsgTruncNoBufSize.client_skip
3584 def _testCmsgTruncNoBufSize(self):
3585 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3586 self.sendToServer(MSG)
3587
3588 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3589 def testSingleCmsgTrunc0(self):
3590 # Check that no ancillary data is received when ancillary
3591 # buffer size is zero.
3592 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3593 ignoreflags=socket.MSG_CTRUNC)
3594
3595 @testSingleCmsgTrunc0.client_skip
3596 def _testSingleCmsgTrunc0(self):
3597 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3598 self.sendToServer(MSG)
3599
3600 # Check that no ancillary data is returned for various non-zero
3601 # (but still too small) buffer sizes.
3602
3603 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3604 def testSingleCmsgTrunc1(self):
3605 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3606
3607 @testSingleCmsgTrunc1.client_skip
3608 def _testSingleCmsgTrunc1(self):
3609 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3610 self.sendToServer(MSG)
3611
3612 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3613 def testSingleCmsgTrunc2Int(self):
3614 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3615
3616 @testSingleCmsgTrunc2Int.client_skip
3617 def _testSingleCmsgTrunc2Int(self):
3618 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3619 self.sendToServer(MSG)
3620
3621 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3622 def testSingleCmsgTruncLen0Minus1(self):
3623 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3624
3625 @testSingleCmsgTruncLen0Minus1.client_skip
3626 def _testSingleCmsgTruncLen0Minus1(self):
3627 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3628 self.sendToServer(MSG)
3629
3630 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3631 def testSingleCmsgTruncInData(self):
3632 # Test truncation of a control message inside its associated
3633 # data. The message may be returned with its data truncated,
3634 # or not returned at all.
3635 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3636 socket.IPV6_RECVHOPLIMIT, 1)
3637 self.misc_event.set()
3638 msg, ancdata, flags, addr = self.doRecvmsg(
3639 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3640
3641 self.assertEqual(msg, MSG)
3642 self.checkRecvmsgAddress(addr, self.cli_addr)
3643 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3644
3645 self.assertLessEqual(len(ancdata), 1)
3646 if ancdata:
3647 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3648 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3649 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3650 self.assertLess(len(cmsg_data), SIZEOF_INT)
3651
3652 @testSingleCmsgTruncInData.client_skip
3653 def _testSingleCmsgTruncInData(self):
3654 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3655 self.sendToServer(MSG)
3656
3657 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3658 # Receive traffic class and hop limit into ancbufsize bytes of
3659 # ancillary data space, which should be large enough to
3660 # contain the first item, but too small to contain the header
3661 # of the second. Check that data is MSG, MSG_CTRUNC is set
3662 # (unless included in ignoreflags), and only one ancillary
3663 # data item is returned.
3664 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3665 socket.IPV6_RECVHOPLIMIT, 1)
3666 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3667 socket.IPV6_RECVTCLASS, 1)
3668 self.misc_event.set()
3669 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3670 len(MSG), ancbufsize)
3671
3672 self.assertEqual(msg, MSG)
3673 self.checkRecvmsgAddress(addr, self.cli_addr)
3674 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3675 ignore=ignoreflags)
3676
3677 self.assertEqual(len(ancdata), 1)
3678 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3679 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3680 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3681 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3682 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003683 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003684 self.assertGreaterEqual(a[0], 0)
3685 self.assertLessEqual(a[0], 255)
3686
3687 # Try the above test with various buffer sizes.
3688
3689 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3690 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3691 def testSecondCmsgTrunc0(self):
3692 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3693 ignoreflags=socket.MSG_CTRUNC)
3694
3695 @testSecondCmsgTrunc0.client_skip
3696 def _testSecondCmsgTrunc0(self):
3697 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3698 self.sendToServer(MSG)
3699
3700 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3701 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3702 def testSecondCmsgTrunc1(self):
3703 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3704
3705 @testSecondCmsgTrunc1.client_skip
3706 def _testSecondCmsgTrunc1(self):
3707 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3708 self.sendToServer(MSG)
3709
3710 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3711 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3712 def testSecondCmsgTrunc2Int(self):
3713 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3714 2 * SIZEOF_INT)
3715
3716 @testSecondCmsgTrunc2Int.client_skip
3717 def _testSecondCmsgTrunc2Int(self):
3718 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3719 self.sendToServer(MSG)
3720
3721 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3722 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3723 def testSecondCmsgTruncLen0Minus1(self):
3724 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3725 socket.CMSG_LEN(0) - 1)
3726
3727 @testSecondCmsgTruncLen0Minus1.client_skip
3728 def _testSecondCmsgTruncLen0Minus1(self):
3729 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3730 self.sendToServer(MSG)
3731
3732 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3733 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3734 def testSecomdCmsgTruncInData(self):
3735 # Test truncation of the second of two control messages inside
3736 # its associated data.
3737 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3738 socket.IPV6_RECVHOPLIMIT, 1)
3739 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3740 socket.IPV6_RECVTCLASS, 1)
3741 self.misc_event.set()
3742 msg, ancdata, flags, addr = self.doRecvmsg(
3743 self.serv_sock, len(MSG),
3744 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3745
3746 self.assertEqual(msg, MSG)
3747 self.checkRecvmsgAddress(addr, self.cli_addr)
3748 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3749
3750 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3751
3752 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3753 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3754 cmsg_types.remove(cmsg_type)
3755 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3756 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003757 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003758 self.assertGreaterEqual(a[0], 0)
3759 self.assertLessEqual(a[0], 255)
3760
3761 if ancdata:
3762 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3763 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3764 cmsg_types.remove(cmsg_type)
3765 self.assertLess(len(cmsg_data), SIZEOF_INT)
3766
3767 self.assertEqual(ancdata, [])
3768
3769 @testSecomdCmsgTruncInData.client_skip
3770 def _testSecomdCmsgTruncInData(self):
3771 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3772 self.sendToServer(MSG)
3773
3774
3775# Derive concrete test classes for different socket types.
3776
3777class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3778 SendrecvmsgConnectionlessBase,
3779 ThreadedSocketTestMixin, UDPTestBase):
3780 pass
3781
3782@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003783class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3784 pass
3785
3786@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003787class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3788 pass
3789
3790@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003791class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3792 pass
3793
3794
3795class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3796 SendrecvmsgConnectionlessBase,
3797 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003798
3799 def checkRecvmsgAddress(self, addr1, addr2):
3800 # Called to compare the received address with the address of
3801 # the peer, ignoring scope ID
3802 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003803
3804@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003805@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003806@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003807class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3808 pass
3809
3810@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003811@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003812@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003813class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3814 pass
3815
3816@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003817@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003818@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003819class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3820 pass
3821
3822@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003823@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003824@requireAttrs(socket, "IPPROTO_IPV6")
3825@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003826class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3827 SendrecvmsgUDP6TestBase):
3828 pass
3829
3830@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003831@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003832@requireAttrs(socket, "IPPROTO_IPV6")
3833@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003834class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3835 RFC3542AncillaryTest,
3836 SendrecvmsgUDP6TestBase):
3837 pass
3838
3839
3840class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3841 ConnectedStreamTestMixin, TCPTestBase):
3842 pass
3843
3844@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003845class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3846 pass
3847
3848@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003849class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3850 SendrecvmsgTCPTestBase):
3851 pass
3852
3853@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003854class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3855 SendrecvmsgTCPTestBase):
3856 pass
3857
3858
3859class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3860 SendrecvmsgConnectedBase,
3861 ConnectedStreamTestMixin, SCTPStreamBase):
3862 pass
3863
3864@requireAttrs(socket.socket, "sendmsg")
3865@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003866class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3867 pass
3868
3869@requireAttrs(socket.socket, "recvmsg")
3870@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003871class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3872 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003873
3874 def testRecvmsgEOF(self):
3875 try:
3876 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3877 except OSError as e:
3878 if e.errno != errno.ENOTCONN:
3879 raise
3880 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003881
3882@requireAttrs(socket.socket, "recvmsg_into")
3883@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003884class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3885 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003886
3887 def testRecvmsgEOF(self):
3888 try:
3889 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3890 except OSError as e:
3891 if e.errno != errno.ENOTCONN:
3892 raise
3893 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003894
3895
3896class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3897 ConnectedStreamTestMixin, UnixStreamBase):
3898 pass
3899
3900@requireAttrs(socket.socket, "sendmsg")
3901@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003902class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3903 pass
3904
3905@requireAttrs(socket.socket, "recvmsg")
3906@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003907class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3908 SendrecvmsgUnixStreamTestBase):
3909 pass
3910
3911@requireAttrs(socket.socket, "recvmsg_into")
3912@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003913class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3914 SendrecvmsgUnixStreamTestBase):
3915 pass
3916
3917@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3918@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003919class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3920 pass
3921
3922@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3923@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003924class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3925 SendrecvmsgUnixStreamTestBase):
3926 pass
3927
3928
3929# Test interrupting the interruptible send/receive methods with a
3930# signal when a timeout is set. These tests avoid having multiple
3931# threads alive during the test so that the OS cannot deliver the
3932# signal to the wrong one.
3933
3934class InterruptedTimeoutBase(unittest.TestCase):
3935 # Base class for interrupted send/receive tests. Installs an
3936 # empty handler for SIGALRM and removes it on teardown, along with
3937 # any scheduled alarms.
3938
3939 def setUp(self):
3940 super().setUp()
3941 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003942 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003943 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003944
3945 # Timeout for socket operations
3946 timeout = 4.0
3947
3948 # Provide setAlarm() method to schedule delivery of SIGALRM after
3949 # given number of seconds, or cancel it if zero, and an
3950 # appropriate time value to use. Use setitimer() if available.
3951 if hasattr(signal, "setitimer"):
3952 alarm_time = 0.05
3953
3954 def setAlarm(self, seconds):
3955 signal.setitimer(signal.ITIMER_REAL, seconds)
3956 else:
3957 # Old systems may deliver the alarm up to one second early
3958 alarm_time = 2
3959
3960 def setAlarm(self, seconds):
3961 signal.alarm(seconds)
3962
3963
3964# Require siginterrupt() in order to ensure that system calls are
3965# interrupted by default.
3966@requireAttrs(signal, "siginterrupt")
3967@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3968 "Don't have signal.alarm or signal.setitimer")
3969class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3970 # Test interrupting the recv*() methods with signals when a
3971 # timeout is set.
3972
3973 def setUp(self):
3974 super().setUp()
3975 self.serv.settimeout(self.timeout)
3976
3977 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003978 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003979 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07003980 try:
3981 self.setAlarm(self.alarm_time)
3982 with self.assertRaises(ZeroDivisionError) as cm:
3983 func(*args, **kwargs)
3984 finally:
3985 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003986
3987 def testInterruptedRecvTimeout(self):
3988 self.checkInterruptedRecv(self.serv.recv, 1024)
3989
3990 def testInterruptedRecvIntoTimeout(self):
3991 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3992
3993 def testInterruptedRecvfromTimeout(self):
3994 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3995
3996 def testInterruptedRecvfromIntoTimeout(self):
3997 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3998
3999 @requireAttrs(socket.socket, "recvmsg")
4000 def testInterruptedRecvmsgTimeout(self):
4001 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4002
4003 @requireAttrs(socket.socket, "recvmsg_into")
4004 def testInterruptedRecvmsgIntoTimeout(self):
4005 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4006
4007
4008# Require siginterrupt() in order to ensure that system calls are
4009# interrupted by default.
4010@requireAttrs(signal, "siginterrupt")
4011@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4012 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004013class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4014 ThreadSafeCleanupTestCase,
4015 SocketListeningTestMixin, TCPTestBase):
4016 # Test interrupting the interruptible send*() methods with signals
4017 # when a timeout is set.
4018
4019 def setUp(self):
4020 super().setUp()
4021 self.serv_conn = self.newSocket()
4022 self.addCleanup(self.serv_conn.close)
4023 # Use a thread to complete the connection, but wait for it to
4024 # terminate before running the test, so that there is only one
4025 # thread to accept the signal.
4026 cli_thread = threading.Thread(target=self.doConnect)
4027 cli_thread.start()
4028 self.cli_conn, addr = self.serv.accept()
4029 self.addCleanup(self.cli_conn.close)
4030 cli_thread.join()
4031 self.serv_conn.settimeout(self.timeout)
4032
4033 def doConnect(self):
4034 self.serv_conn.connect(self.serv_addr)
4035
4036 def checkInterruptedSend(self, func, *args, **kwargs):
4037 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004038 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004039 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004040 try:
4041 with self.assertRaises(ZeroDivisionError) as cm:
4042 while True:
4043 self.setAlarm(self.alarm_time)
4044 func(*args, **kwargs)
4045 finally:
4046 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004047
Ned Deilyc5640382014-02-03 13:58:31 -08004048 # Issue #12958: The following tests have problems on OS X prior to 10.7
4049 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004050 def testInterruptedSendTimeout(self):
4051 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4052
Ned Deilyc5640382014-02-03 13:58:31 -08004053 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004054 def testInterruptedSendtoTimeout(self):
4055 # Passing an actual address here as Python's wrapper for
4056 # sendto() doesn't allow passing a zero-length one; POSIX
4057 # requires that the address is ignored since the socket is
4058 # connection-mode, however.
4059 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4060 self.serv_addr)
4061
Ned Deilyc5640382014-02-03 13:58:31 -08004062 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004063 @requireAttrs(socket.socket, "sendmsg")
4064 def testInterruptedSendmsgTimeout(self):
4065 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4066
4067
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004068class TCPCloserTest(ThreadedTCPSocketTest):
4069
4070 def testClose(self):
4071 conn, addr = self.serv.accept()
4072 conn.close()
4073
4074 sd = self.cli
4075 read, write, err = select.select([sd], [], [], 1.0)
4076 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004077 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004078
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004079 # Calling close() many times should be safe.
4080 conn.close()
4081 conn.close()
4082
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004083 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004084 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004085 time.sleep(1.0)
4086
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004087
Dave Cole331708b2004-08-09 04:51:41 +00004088class BasicSocketPairTest(SocketPairTest):
4089
4090 def __init__(self, methodName='runTest'):
4091 SocketPairTest.__init__(self, methodName=methodName)
4092
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004093 def _check_defaults(self, sock):
4094 self.assertIsInstance(sock, socket.socket)
4095 if hasattr(socket, 'AF_UNIX'):
4096 self.assertEqual(sock.family, socket.AF_UNIX)
4097 else:
4098 self.assertEqual(sock.family, socket.AF_INET)
4099 self.assertEqual(sock.type, socket.SOCK_STREAM)
4100 self.assertEqual(sock.proto, 0)
4101
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004102 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004103 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004104
4105 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004106 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004107
Dave Cole331708b2004-08-09 04:51:41 +00004108 def testRecv(self):
4109 msg = self.serv.recv(1024)
4110 self.assertEqual(msg, MSG)
4111
4112 def _testRecv(self):
4113 self.cli.send(MSG)
4114
4115 def testSend(self):
4116 self.serv.send(MSG)
4117
4118 def _testSend(self):
4119 msg = self.cli.recv(1024)
4120 self.assertEqual(msg, MSG)
4121
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004122
Guido van Rossum24e4af82002-06-12 19:18:08 +00004123class NonBlockingTCPTests(ThreadedTCPSocketTest):
4124
4125 def __init__(self, methodName='runTest'):
4126 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4127
4128 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004129 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004130 self.serv.setblocking(True)
4131 self.assertIsNone(self.serv.gettimeout())
Yury Selivanovf11b4602018-01-28 17:27:38 -05004132 self.assertTrue(self.serv.getblocking())
4133 if fcntl:
4134 self.assertTrue(_is_fd_in_blocking_mode(self.serv))
4135
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004136 self.serv.setblocking(False)
4137 self.assertEqual(self.serv.gettimeout(), 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004138 self.assertFalse(self.serv.getblocking())
4139 if fcntl:
4140 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4141
4142 self.serv.settimeout(None)
4143 self.assertTrue(self.serv.getblocking())
4144 if fcntl:
4145 self.assertTrue(_is_fd_in_blocking_mode(self.serv))
4146
4147 self.serv.settimeout(0)
4148 self.assertFalse(self.serv.getblocking())
4149 self.assertEqual(self.serv.gettimeout(), 0)
4150 if fcntl:
4151 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4152
4153 self.serv.settimeout(10)
4154 self.assertTrue(self.serv.getblocking())
4155 self.assertEqual(self.serv.gettimeout(), 10)
4156 if fcntl:
4157 # When a Python socket has a non-zero timeout, it's
4158 # switched internally to a non-blocking mode.
4159 # Later, sock.sendall(), sock.recv(), and other socket
4160 # operations use a `select()` call and handle EWOULDBLOCK/EGAIN
4161 # on all socket operations. That's how timeouts are
4162 # enforced.
4163 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4164
4165 self.serv.settimeout(0)
4166 self.assertFalse(self.serv.getblocking())
4167 if fcntl:
4168 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4169
Guido van Rossum24e4af82002-06-12 19:18:08 +00004170 start = time.time()
4171 try:
4172 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004173 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004174 pass
4175 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004176 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00004177
4178 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004179 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004180
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004181 @support.cpython_only
4182 def testSetBlocking_overflow(self):
4183 # Issue 15989
4184 import _testcapi
4185 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4186 self.skipTest('needs UINT_MAX < ULONG_MAX')
4187 self.serv.setblocking(False)
4188 self.assertEqual(self.serv.gettimeout(), 0.0)
4189 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4190 self.assertIsNone(self.serv.gettimeout())
4191
4192 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4193
Serhiy Storchaka43767632013-11-03 21:31:38 +02004194 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4195 'test needs socket.SOCK_NONBLOCK')
4196 @support.requires_linux_version(2, 6, 28)
4197 def testInitNonBlocking(self):
4198 # reinit server socket
4199 self.serv.close()
4200 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
4201 socket.SOCK_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004202 self.assertFalse(self.serv.getblocking())
4203 self.assertEqual(self.serv.gettimeout(), 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004204 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01004205 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02004206 # actual testing
4207 start = time.time()
4208 try:
4209 self.serv.accept()
4210 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00004211 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02004212 end = time.time()
4213 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
4214
4215 def _testInitNonBlocking(self):
4216 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004217
Antoine Pitrou600232b2011-01-05 21:03:42 +00004218 def testInheritFlags(self):
4219 # Issue #7995: when calling accept() on a listening socket with a
4220 # timeout, the resulting socket should not be non-blocking.
4221 self.serv.settimeout(10)
4222 try:
4223 conn, addr = self.serv.accept()
4224 message = conn.recv(len(MSG))
4225 finally:
4226 conn.close()
4227 self.serv.settimeout(None)
4228
4229 def _testInheritFlags(self):
4230 time.sleep(0.1)
4231 self.cli.connect((HOST, self.port))
4232 time.sleep(0.5)
4233 self.cli.send(MSG)
4234
Guido van Rossum24e4af82002-06-12 19:18:08 +00004235 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004236 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004237 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00004238 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004239 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004240 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004241 pass
4242 else:
4243 self.fail("Error trying to do non-blocking accept.")
4244 read, write, err = select.select([self.serv], [], [])
4245 if self.serv in read:
4246 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07004247 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00004248 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004249 else:
4250 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004251
Guido van Rossum24e4af82002-06-12 19:18:08 +00004252 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004253 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00004254 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004255
4256 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004257 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00004258 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004259 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004260
4261 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00004262 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00004263 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004264
4265 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004266 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004267 conn, addr = self.serv.accept()
4268 conn.setblocking(0)
4269 try:
4270 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02004271 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004272 pass
4273 else:
4274 self.fail("Error trying to do non-blocking recv.")
4275 read, write, err = select.select([conn], [], [])
4276 if conn in read:
4277 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004278 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00004279 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004280 else:
4281 self.fail("Error during select call to non-blocking socket.")
4282
4283 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004284 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004285 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004286 self.cli.send(MSG)
4287
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004288
Guido van Rossum24e4af82002-06-12 19:18:08 +00004289class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004290 """Unit tests for the object returned by socket.makefile()
4291
Antoine Pitrou834bd812010-10-13 16:17:14 +00004292 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004293 the client connection. You can read from this file to
4294 get output from the server.
4295
Antoine Pitrou834bd812010-10-13 16:17:14 +00004296 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004297 server connection. You can write to this file to send output
4298 to the client.
4299 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004300
Guido van Rossume9f66142002-08-07 15:46:19 +00004301 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004302 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004303 errors = 'strict'
4304 newline = None
4305
4306 read_mode = 'rb'
4307 read_msg = MSG
4308 write_mode = 'wb'
4309 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004310
Guido van Rossum24e4af82002-06-12 19:18:08 +00004311 def __init__(self, methodName='runTest'):
4312 SocketConnectedTest.__init__(self, methodName=methodName)
4313
4314 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004315 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4316 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004317 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004318 self.read_file = self.cli_conn.makefile(
4319 self.read_mode, self.bufsize,
4320 encoding = self.encoding,
4321 errors = self.errors,
4322 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004323
4324 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004325 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004326 self.read_file.close()
4327 self.assertTrue(self.read_file.closed)
4328 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004329 SocketConnectedTest.tearDown(self)
4330
4331 def clientSetUp(self):
4332 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004333 self.write_file = self.serv_conn.makefile(
4334 self.write_mode, self.bufsize,
4335 encoding = self.encoding,
4336 errors = self.errors,
4337 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004338
4339 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004340 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004341 self.write_file.close()
4342 self.assertTrue(self.write_file.closed)
4343 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004344 SocketConnectedTest.clientTearDown(self)
4345
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004346 def testReadAfterTimeout(self):
4347 # Issue #7322: A file object must disallow further reads
4348 # after a timeout has occurred.
4349 self.cli_conn.settimeout(1)
4350 self.read_file.read(3)
4351 # First read raises a timeout
4352 self.assertRaises(socket.timeout, self.read_file.read, 1)
4353 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004354 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004355 self.read_file.read(1)
4356 self.assertIn("cannot read from timed out object", str(ctx.exception))
4357
4358 def _testReadAfterTimeout(self):
4359 self.write_file.write(self.write_msg[0:3])
4360 self.write_file.flush()
4361 self.serv_finished.wait()
4362
Guido van Rossum24e4af82002-06-12 19:18:08 +00004363 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004364 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004365 first_seg = self.read_file.read(len(self.read_msg)-3)
4366 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004367 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004368 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004369
4370 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004371 self.write_file.write(self.write_msg)
4372 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004373
Guido van Rossum8c943832002-08-08 01:00:28 +00004374 def testFullRead(self):
4375 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004376 msg = self.read_file.read()
4377 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004378
4379 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004380 self.write_file.write(self.write_msg)
4381 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004382
Guido van Rossum24e4af82002-06-12 19:18:08 +00004383 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004384 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004385 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004386 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004387 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004388 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004389 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004390 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004391 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004392
4393 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004394 self.write_file.write(self.write_msg)
4395 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004396
4397 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004398 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004399 line = self.read_file.readline()
4400 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004401
4402 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004403 self.write_file.write(self.write_msg)
4404 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004405
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004406 def testCloseAfterMakefile(self):
4407 # The file returned by makefile should keep the socket open.
4408 self.cli_conn.close()
4409 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004410 msg = self.read_file.read()
4411 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004412
4413 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004414 self.write_file.write(self.write_msg)
4415 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004416
4417 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004418 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004419 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004420 if isinstance(self.read_msg, str):
4421 msg = msg.decode()
4422 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004423
4424 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004425 self.write_file.write(self.write_msg)
4426 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004427
Tim Peters116d83c2004-03-28 02:20:45 +00004428 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004429 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004430
4431 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004432 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004433
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004434 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004435 self.assertEqual(self.read_file.mode, self.read_mode)
4436 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004437
4438 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004439 self.assertEqual(self.write_file.mode, self.write_mode)
4440 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004441
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004442 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004443 self.read_file.close()
4444 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004445 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004446 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004447
4448 def _testRealClose(self):
4449 pass
4450
4451
Guido van Rossume9f66142002-08-07 15:46:19 +00004452class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4453
4454 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004455
Guido van Rossume9f66142002-08-07 15:46:19 +00004456 In this case (and in this case only), it should be possible to
4457 create a file object, read a line from it, create another file
4458 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004459 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004460 when reading multiple requests from the same socket."""
4461
4462 bufsize = 0 # Use unbuffered mode
4463
4464 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004465 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004466 line = self.read_file.readline() # first line
4467 self.assertEqual(line, b"A. " + self.write_msg) # first line
4468 self.read_file = self.cli_conn.makefile('rb', 0)
4469 line = self.read_file.readline() # second line
4470 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004471
4472 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004473 self.write_file.write(b"A. " + self.write_msg)
4474 self.write_file.write(b"B. " + self.write_msg)
4475 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004476
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004477 def testMakefileClose(self):
4478 # The file returned by makefile should keep the socket open...
4479 self.cli_conn.close()
4480 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004481 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004482 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004483 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004484 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004485
4486 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004487 self.write_file.write(self.write_msg)
4488 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004489
4490 def testMakefileCloseSocketDestroy(self):
4491 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004492 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004493 refcount_after = sys.getrefcount(self.cli_conn)
4494 self.assertEqual(refcount_before - 1, refcount_after)
4495
4496 def _testMakefileCloseSocketDestroy(self):
4497 pass
4498
Antoine Pitrou98b46702010-09-18 22:59:00 +00004499 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004500 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004501 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4502
4503 def testSmallReadNonBlocking(self):
4504 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004505 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4506 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004507 self.evt1.set()
4508 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004509 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004510 if first_seg is None:
4511 # Data not arrived (can happen under Windows), wait a bit
4512 time.sleep(0.5)
4513 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004514 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004515 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004516 self.assertEqual(n, 3)
4517 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004518 self.assertEqual(msg, self.read_msg)
4519 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4520 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004521
4522 def _testSmallReadNonBlocking(self):
4523 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004524 self.write_file.write(self.write_msg)
4525 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004526 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004527 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004528 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4529 self.serv_finished.wait(5.0)
4530
4531 def testWriteNonBlocking(self):
4532 self.cli_finished.wait(5.0)
4533 # The client thread can't skip directly - the SkipTest exception
4534 # would appear as a failure.
4535 if self.serv_skipped:
4536 self.skipTest(self.serv_skipped)
4537
4538 def _testWriteNonBlocking(self):
4539 self.serv_skipped = None
4540 self.serv_conn.setblocking(False)
4541 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004542 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004543 LIMIT = 10
4544 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004545 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004546 self.assertGreater(n, 0)
4547 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004548 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004549 if n is None:
4550 # Succeeded
4551 break
4552 self.assertGreater(n, 0)
4553 else:
4554 # Let us know that this test didn't manage to establish
4555 # the expected conditions. This is not a failure in itself but,
4556 # if it happens repeatedly, the test should be fixed.
4557 self.serv_skipped = "failed to saturate the socket buffer"
4558
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004559
Guido van Rossum8c943832002-08-08 01:00:28 +00004560class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4561
4562 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4563
4564
4565class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4566
4567 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004568
Thomas Woutersb2137042007-02-01 18:02:27 +00004569
Antoine Pitrou834bd812010-10-13 16:17:14 +00004570class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4571 """Tests for socket.makefile() in text mode (rather than binary)"""
4572
4573 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004574 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004575 write_mode = 'wb'
4576 write_msg = MSG
4577 newline = ''
4578
4579
4580class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4581 """Tests for socket.makefile() in text mode (rather than binary)"""
4582
4583 read_mode = 'rb'
4584 read_msg = MSG
4585 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004586 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004587 newline = ''
4588
4589
4590class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4591 """Tests for socket.makefile() in text mode (rather than binary)"""
4592
4593 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004594 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004595 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004596 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004597 newline = ''
4598
4599
Guido van Rossumd8faa362007-04-27 19:54:29 +00004600class NetworkConnectionTest(object):
4601 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004602
Guido van Rossumd8faa362007-04-27 19:54:29 +00004603 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004604 # We're inherited below by BasicTCPTest2, which also inherits
4605 # BasicTCPTest, which defines self.port referenced below.
4606 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004607 self.serv_conn = self.cli
4608
4609class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4610 """Tests that NetworkConnection does not break existing TCP functionality.
4611 """
4612
4613class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004614
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004615 class MockSocket(socket.socket):
4616 def connect(self, *args):
4617 raise socket.timeout('timed out')
4618
4619 @contextlib.contextmanager
4620 def mocked_socket_module(self):
4621 """Return a socket which times out on connect"""
4622 old_socket = socket.socket
4623 socket.socket = self.MockSocket
4624 try:
4625 yield
4626 finally:
4627 socket.socket = old_socket
4628
4629 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004630 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004631 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004632 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004633 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004634 cli.connect((HOST, port))
4635 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4636
4637 def test_create_connection(self):
4638 # Issue #9792: errors raised by create_connection() should have
4639 # a proper errno attribute.
4640 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004641 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004642 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004643
4644 # Issue #16257: create_connection() calls getaddrinfo() against
4645 # 'localhost'. This may result in an IPV6 addr being returned
4646 # as well as an IPV4 one:
4647 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4648 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4649 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4650 #
4651 # create_connection() enumerates through all the addresses returned
4652 # and if it doesn't successfully bind to any of them, it propagates
4653 # the last exception it encountered.
4654 #
4655 # On Solaris, ENETUNREACH is returned in this circumstance instead
4656 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4657 # expected errnos.
4658 expected_errnos = [ errno.ECONNREFUSED, ]
4659 if hasattr(errno, 'ENETUNREACH'):
4660 expected_errnos.append(errno.ENETUNREACH)
Victor Stinner280c22a2017-10-31 19:48:14 -07004661 if hasattr(errno, 'EADDRNOTAVAIL'):
4662 # bpo-31910: socket.create_connection() fails randomly
4663 # with EADDRNOTAVAIL on Travis CI
4664 expected_errnos.append(errno.EADDRNOTAVAIL)
Trent Nelson45bb6132012-10-17 06:15:15 -04004665
4666 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004667
4668 def test_create_connection_timeout(self):
4669 # Issue #9792: create_connection() should not recast timeout errors
4670 # as generic socket errors.
4671 with self.mocked_socket_module():
4672 with self.assertRaises(socket.timeout):
4673 socket.create_connection((HOST, 1234))
4674
Guido van Rossumd8faa362007-04-27 19:54:29 +00004675
4676class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4677
4678 def __init__(self, methodName='runTest'):
4679 SocketTCPTest.__init__(self, methodName=methodName)
4680 ThreadableTest.__init__(self)
4681
4682 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004683 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004684
4685 def clientTearDown(self):
4686 self.cli.close()
4687 self.cli = None
4688 ThreadableTest.clientTearDown(self)
4689
4690 def _justAccept(self):
4691 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004692 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004693
4694 testFamily = _justAccept
4695 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004696 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004697 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004698 self.assertEqual(self.cli.family, 2)
4699
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004700 testSourceAddress = _justAccept
4701 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004702 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4703 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004704 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004705 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004706 # The port number being used is sufficient to show that the bind()
4707 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004708
Guido van Rossumd8faa362007-04-27 19:54:29 +00004709 testTimeoutDefault = _justAccept
4710 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004711 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004712 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004713 socket.setdefaulttimeout(42)
4714 try:
4715 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004716 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004717 finally:
4718 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004719 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004720
4721 testTimeoutNone = _justAccept
4722 def _testTimeoutNone(self):
4723 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004724 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004725 socket.setdefaulttimeout(30)
4726 try:
4727 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004728 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004729 finally:
4730 socket.setdefaulttimeout(None)
4731 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004732
4733 testTimeoutValueNamed = _justAccept
4734 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004735 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004736 self.assertEqual(self.cli.gettimeout(), 30)
4737
4738 testTimeoutValueNonamed = _justAccept
4739 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004740 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004741 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004742 self.assertEqual(self.cli.gettimeout(), 30)
4743
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004744
Guido van Rossumd8faa362007-04-27 19:54:29 +00004745class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4746
4747 def __init__(self, methodName='runTest'):
4748 SocketTCPTest.__init__(self, methodName=methodName)
4749 ThreadableTest.__init__(self)
4750
4751 def clientSetUp(self):
4752 pass
4753
4754 def clientTearDown(self):
4755 self.cli.close()
4756 self.cli = None
4757 ThreadableTest.clientTearDown(self)
4758
4759 def testInsideTimeout(self):
4760 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004761 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004762 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004763 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004764 testOutsideTimeout = testInsideTimeout
4765
4766 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004767 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004768 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004769 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004770
4771 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004772 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004773 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004774
4775
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004776class TCPTimeoutTest(SocketTCPTest):
4777
4778 def testTCPTimeout(self):
4779 def raise_timeout(*args, **kwargs):
4780 self.serv.settimeout(1.0)
4781 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004782 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004783 "Error generating a timeout exception (TCP)")
4784
4785 def testTimeoutZero(self):
4786 ok = False
4787 try:
4788 self.serv.settimeout(0.0)
4789 foo = self.serv.accept()
4790 except socket.timeout:
4791 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004792 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004793 ok = True
4794 except:
4795 self.fail("caught unexpected exception (TCP)")
4796 if not ok:
4797 self.fail("accept() returned success when we did not expect it")
4798
Serhiy Storchaka43767632013-11-03 21:31:38 +02004799 @unittest.skipUnless(hasattr(signal, 'alarm'),
4800 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004801 def testInterruptedTimeout(self):
4802 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06004803 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004804 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004805 self.serv.settimeout(5.0) # must be longer than alarm
4806 class Alarm(Exception):
4807 pass
4808 def alarm_handler(signal, frame):
4809 raise Alarm
4810 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4811 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004812 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004813 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004814 foo = self.serv.accept()
4815 except socket.timeout:
4816 self.fail("caught timeout instead of Alarm")
4817 except Alarm:
4818 pass
4819 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004820 self.fail("caught other exception instead of Alarm:"
4821 " %s(%s):\n%s" %
4822 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004823 else:
4824 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004825 finally:
4826 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004827 except Alarm:
4828 self.fail("got Alarm in wrong place")
4829 finally:
4830 # no alarm can be pending. Safe to restore old handler.
4831 signal.signal(signal.SIGALRM, old_alarm)
4832
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004833class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004834
4835 def testUDPTimeout(self):
4836 def raise_timeout(*args, **kwargs):
4837 self.serv.settimeout(1.0)
4838 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004839 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004840 "Error generating a timeout exception (UDP)")
4841
4842 def testTimeoutZero(self):
4843 ok = False
4844 try:
4845 self.serv.settimeout(0.0)
4846 foo = self.serv.recv(1024)
4847 except socket.timeout:
4848 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004849 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004850 ok = True
4851 except:
4852 self.fail("caught unexpected exception (UDP)")
4853 if not ok:
4854 self.fail("recv() returned success when we did not expect it")
4855
4856class TestExceptions(unittest.TestCase):
4857
4858 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004859 self.assertTrue(issubclass(OSError, Exception))
4860 self.assertTrue(issubclass(socket.herror, OSError))
4861 self.assertTrue(issubclass(socket.gaierror, OSError))
4862 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004863
Yury Selivanovfa22b292016-10-18 16:03:52 -04004864 def test_setblocking_invalidfd(self):
4865 # Regression test for issue #28471
4866
4867 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4868 sock = socket.socket(
4869 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4870 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004871 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004872
4873 with self.assertRaises(OSError):
4874 sock.setblocking(False)
4875
4876
Serhiy Storchaka43767632013-11-03 21:31:38 +02004877@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004878class TestLinuxAbstractNamespace(unittest.TestCase):
4879
4880 UNIX_PATH_MAX = 108
4881
4882 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004883 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004884 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4885 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004886 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004887 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4888 s2.connect(s1.getsockname())
4889 with s1.accept()[0] as s3:
4890 self.assertEqual(s1.getsockname(), address)
4891 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004892
4893 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004894 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004895 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4896 s.bind(address)
4897 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004898
4899 def testNameOverflow(self):
4900 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004901 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004902 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004903
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004904 def testStrName(self):
4905 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004906 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4907 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004908 s.bind("\x00python\x00test\x00")
4909 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004910 finally:
4911 s.close()
4912
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004913 def testBytearrayName(self):
4914 # Check that an abstract name can be passed as a bytearray.
4915 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4916 s.bind(bytearray(b"\x00python\x00test\x00"))
4917 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4918
Serhiy Storchaka43767632013-11-03 21:31:38 +02004919@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004920class TestUnixDomain(unittest.TestCase):
4921
4922 def setUp(self):
4923 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4924
4925 def tearDown(self):
4926 self.sock.close()
4927
4928 def encoded(self, path):
4929 # Return the given path encoded in the file system encoding,
4930 # or skip the test if this is not possible.
4931 try:
4932 return os.fsencode(path)
4933 except UnicodeEncodeError:
4934 self.skipTest(
4935 "Pathname {0!a} cannot be represented in file "
4936 "system encoding {1!r}".format(
4937 path, sys.getfilesystemencoding()))
4938
Antoine Pitrou16374872011-12-16 15:04:12 +01004939 def bind(self, sock, path):
4940 # Bind the socket
4941 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004942 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004943 except OSError as e:
4944 if str(e) == "AF_UNIX path too long":
4945 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004946 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004947 .format(path))
4948 else:
4949 raise
4950
Antoine Pitrou495b5022017-05-02 17:20:00 +02004951 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02004952 # Issue #30205 (note getsockname() can return None on OS X)
4953 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02004954
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004955 def testStrAddr(self):
4956 # Test binding to and retrieving a normal string pathname.
4957 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004958 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004959 self.addCleanup(support.unlink, path)
4960 self.assertEqual(self.sock.getsockname(), path)
4961
4962 def testBytesAddr(self):
4963 # Test binding to a bytes pathname.
4964 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004965 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004966 self.addCleanup(support.unlink, path)
4967 self.assertEqual(self.sock.getsockname(), path)
4968
4969 def testSurrogateescapeBind(self):
4970 # Test binding to a valid non-ASCII pathname, with the
4971 # non-ASCII bytes supplied using surrogateescape encoding.
4972 path = os.path.abspath(support.TESTFN_UNICODE)
4973 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004974 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004975 self.addCleanup(support.unlink, path)
4976 self.assertEqual(self.sock.getsockname(), path)
4977
4978 def testUnencodableAddr(self):
4979 # Test binding to a pathname that cannot be encoded in the
4980 # file system encoding.
4981 if support.TESTFN_UNENCODABLE is None:
4982 self.skipTest("No unencodable filename available")
4983 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004984 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004985 self.addCleanup(support.unlink, path)
4986 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004987
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004988
Thomas Wouters477c8d52006-05-27 19:21:47 +00004989class BufferIOTest(SocketConnectedTest):
4990 """
4991 Test the buffer versions of socket.recv() and socket.send().
4992 """
4993 def __init__(self, methodName='runTest'):
4994 SocketConnectedTest.__init__(self, methodName=methodName)
4995
Antoine Pitrou25480782010-03-17 22:50:28 +00004996 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004997 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004998 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004999 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005000 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005001 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005002 self.assertEqual(msg, MSG)
5003
Antoine Pitrou25480782010-03-17 22:50:28 +00005004 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005005 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005006 self.serv_conn.send(buf)
5007
Antoine Pitrou25480782010-03-17 22:50:28 +00005008 def testRecvIntoBytearray(self):
5009 buf = bytearray(1024)
5010 nbytes = self.cli_conn.recv_into(buf)
5011 self.assertEqual(nbytes, len(MSG))
5012 msg = buf[:len(MSG)]
5013 self.assertEqual(msg, MSG)
5014
5015 _testRecvIntoBytearray = _testRecvIntoArray
5016
5017 def testRecvIntoMemoryview(self):
5018 buf = bytearray(1024)
5019 nbytes = self.cli_conn.recv_into(memoryview(buf))
5020 self.assertEqual(nbytes, len(MSG))
5021 msg = buf[:len(MSG)]
5022 self.assertEqual(msg, MSG)
5023
5024 _testRecvIntoMemoryview = _testRecvIntoArray
5025
5026 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005027 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005028 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005029 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005030 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005031 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005032 self.assertEqual(msg, MSG)
5033
Antoine Pitrou25480782010-03-17 22:50:28 +00005034 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005035 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005036 self.serv_conn.send(buf)
5037
Antoine Pitrou25480782010-03-17 22:50:28 +00005038 def testRecvFromIntoBytearray(self):
5039 buf = bytearray(1024)
5040 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5041 self.assertEqual(nbytes, len(MSG))
5042 msg = buf[:len(MSG)]
5043 self.assertEqual(msg, MSG)
5044
5045 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5046
5047 def testRecvFromIntoMemoryview(self):
5048 buf = bytearray(1024)
5049 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5050 self.assertEqual(nbytes, len(MSG))
5051 msg = buf[:len(MSG)]
5052 self.assertEqual(msg, MSG)
5053
5054 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5055
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005056 def testRecvFromIntoSmallBuffer(self):
5057 # See issue #20246.
5058 buf = bytearray(8)
5059 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5060
5061 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005062 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005063
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005064 def testRecvFromIntoEmptyBuffer(self):
5065 buf = bytearray()
5066 self.cli_conn.recvfrom_into(buf)
5067 self.cli_conn.recvfrom_into(buf, 0)
5068
5069 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5070
Christian Heimes043d6f62008-01-07 17:19:16 +00005071
5072TIPC_STYPE = 2000
5073TIPC_LOWER = 200
5074TIPC_UPPER = 210
5075
5076def isTipcAvailable():
5077 """Check if the TIPC module is loaded
5078
5079 The TIPC module is not loaded automatically on Ubuntu and probably
5080 other Linux distros.
5081 """
5082 if not hasattr(socket, "AF_TIPC"):
5083 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005084 try:
5085 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005086 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005087 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005088 # have not the permission to read it.
5089 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005090 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005091 for line in f:
5092 if line.startswith("tipc "):
5093 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005094 return False
5095
Serhiy Storchaka43767632013-11-03 21:31:38 +02005096@unittest.skipUnless(isTipcAvailable(),
5097 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005098class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005099 def testRDM(self):
5100 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5101 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005102 self.addCleanup(srv.close)
5103 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005104
5105 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5106 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5107 TIPC_LOWER, TIPC_UPPER)
5108 srv.bind(srvaddr)
5109
5110 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5111 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5112 cli.sendto(MSG, sendaddr)
5113
5114 msg, recvaddr = srv.recvfrom(1024)
5115
5116 self.assertEqual(cli.getsockname(), recvaddr)
5117 self.assertEqual(msg, MSG)
5118
5119
Serhiy Storchaka43767632013-11-03 21:31:38 +02005120@unittest.skipUnless(isTipcAvailable(),
5121 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005122class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005123 def __init__(self, methodName = 'runTest'):
5124 unittest.TestCase.__init__(self, methodName = methodName)
5125 ThreadableTest.__init__(self)
5126
5127 def setUp(self):
5128 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005129 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005130 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5131 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5132 TIPC_LOWER, TIPC_UPPER)
5133 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005134 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005135 self.serverExplicitReady()
5136 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005137 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005138
5139 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005140 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005141 # accept() call; sleep a little while to avoid it, otherwise
5142 # we could get an exception
5143 time.sleep(0.1)
5144 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005145 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005146 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5147 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5148 self.cli.connect(addr)
5149 self.cliaddr = self.cli.getsockname()
5150
5151 def testStream(self):
5152 msg = self.conn.recv(1024)
5153 self.assertEqual(msg, MSG)
5154 self.assertEqual(self.cliaddr, self.connaddr)
5155
5156 def _testStream(self):
5157 self.cli.send(MSG)
5158 self.cli.close()
5159
5160
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005161class ContextManagersTest(ThreadedTCPSocketTest):
5162
5163 def _testSocketClass(self):
5164 # base test
5165 with socket.socket() as sock:
5166 self.assertFalse(sock._closed)
5167 self.assertTrue(sock._closed)
5168 # close inside with block
5169 with socket.socket() as sock:
5170 sock.close()
5171 self.assertTrue(sock._closed)
5172 # exception inside with block
5173 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005174 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005175 self.assertTrue(sock._closed)
5176
5177 def testCreateConnectionBase(self):
5178 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005179 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005180 data = conn.recv(1024)
5181 conn.sendall(data)
5182
5183 def _testCreateConnectionBase(self):
5184 address = self.serv.getsockname()
5185 with socket.create_connection(address) as sock:
5186 self.assertFalse(sock._closed)
5187 sock.sendall(b'foo')
5188 self.assertEqual(sock.recv(1024), b'foo')
5189 self.assertTrue(sock._closed)
5190
5191 def testCreateConnectionClose(self):
5192 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005193 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005194 data = conn.recv(1024)
5195 conn.sendall(data)
5196
5197 def _testCreateConnectionClose(self):
5198 address = self.serv.getsockname()
5199 with socket.create_connection(address) as sock:
5200 sock.close()
5201 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005202 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005203
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005204
Victor Stinnerdaf45552013-08-28 00:53:59 +02005205class InheritanceTest(unittest.TestCase):
5206 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5207 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005208 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005209 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005210 with socket.socket(socket.AF_INET,
5211 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005212 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005213 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005214
5215 def test_default_inheritable(self):
5216 sock = socket.socket()
5217 with sock:
5218 self.assertEqual(sock.get_inheritable(), False)
5219
5220 def test_dup(self):
5221 sock = socket.socket()
5222 with sock:
5223 newsock = sock.dup()
5224 sock.close()
5225 with newsock:
5226 self.assertEqual(newsock.get_inheritable(), False)
5227
5228 def test_set_inheritable(self):
5229 sock = socket.socket()
5230 with sock:
5231 sock.set_inheritable(True)
5232 self.assertEqual(sock.get_inheritable(), True)
5233
5234 sock.set_inheritable(False)
5235 self.assertEqual(sock.get_inheritable(), False)
5236
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005237 @unittest.skipIf(fcntl is None, "need fcntl")
5238 def test_get_inheritable_cloexec(self):
5239 sock = socket.socket()
5240 with sock:
5241 fd = sock.fileno()
5242 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005243
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005244 # clear FD_CLOEXEC flag
5245 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5246 flags &= ~fcntl.FD_CLOEXEC
5247 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005248
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005249 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005250
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005251 @unittest.skipIf(fcntl is None, "need fcntl")
5252 def test_set_inheritable_cloexec(self):
5253 sock = socket.socket()
5254 with sock:
5255 fd = sock.fileno()
5256 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5257 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005258
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005259 sock.set_inheritable(True)
5260 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5261 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005262
5263
Victor Stinnerdaf45552013-08-28 00:53:59 +02005264 def test_socketpair(self):
5265 s1, s2 = socket.socketpair()
5266 self.addCleanup(s1.close)
5267 self.addCleanup(s2.close)
5268 self.assertEqual(s1.get_inheritable(), False)
5269 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005270
5271
5272@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5273 "SOCK_NONBLOCK not defined")
5274class NonblockConstantTest(unittest.TestCase):
5275 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5276 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005277 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005278 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005279 self.assertTrue(
5280 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005281 if timeout == 0:
5282 # timeout == 0: means that getblocking() must be False.
5283 self.assertFalse(s.getblocking())
5284 else:
5285 # If timeout > 0, the socket will be in a "blocking" mode
5286 # from the standpoint of the Python API. For Python socket
5287 # object, "blocking" means that operations like 'sock.recv()'
5288 # will block. Internally, file descriptors for
5289 # "blocking" Python sockets *with timeouts* are in a
5290 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5291 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5292 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005293 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005294 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005295 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005296 self.assertFalse(
5297 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005298 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005299
Charles-François Natali239bb962011-06-03 12:55:15 +02005300 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005301 def test_SOCK_NONBLOCK(self):
5302 # a lot of it seems silly and redundant, but I wanted to test that
5303 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005304 with socket.socket(socket.AF_INET,
5305 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5306 self.checkNonblock(s)
5307 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005308 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005309 s.setblocking(0)
5310 self.checkNonblock(s)
5311 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005312 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005313 s.settimeout(2.0)
5314 self.checkNonblock(s, timeout=2.0)
5315 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005316 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005317 # defaulttimeout
5318 t = socket.getdefaulttimeout()
5319 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005320 with socket.socket() as s:
5321 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005322 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005323 with socket.socket() as s:
5324 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005325 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005326 with socket.socket() as s:
5327 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005328 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005329 with socket.socket() as s:
5330 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005331 socket.setdefaulttimeout(t)
5332
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005333
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005334@unittest.skipUnless(os.name == "nt", "Windows specific")
5335@unittest.skipUnless(multiprocessing, "need multiprocessing")
5336class TestSocketSharing(SocketTCPTest):
5337 # This must be classmethod and not staticmethod or multiprocessing
5338 # won't be able to bootstrap it.
5339 @classmethod
5340 def remoteProcessServer(cls, q):
5341 # Recreate socket from shared data
5342 sdata = q.get()
5343 message = q.get()
5344
5345 s = socket.fromshare(sdata)
5346 s2, c = s.accept()
5347
5348 # Send the message
5349 s2.sendall(message)
5350 s2.close()
5351 s.close()
5352
5353 def testShare(self):
5354 # Transfer the listening server socket to another process
5355 # and service it from there.
5356
5357 # Create process:
5358 q = multiprocessing.Queue()
5359 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5360 p.start()
5361
5362 # Get the shared socket data
5363 data = self.serv.share(p.pid)
5364
5365 # Pass the shared socket to the other process
5366 addr = self.serv.getsockname()
5367 self.serv.close()
5368 q.put(data)
5369
5370 # The data that the server will send us
5371 message = b"slapmahfro"
5372 q.put(message)
5373
5374 # Connect
5375 s = socket.create_connection(addr)
5376 # listen for the data
5377 m = []
5378 while True:
5379 data = s.recv(100)
5380 if not data:
5381 break
5382 m.append(data)
5383 s.close()
5384 received = b"".join(m)
5385 self.assertEqual(received, message)
5386 p.join()
5387
5388 def testShareLength(self):
5389 data = self.serv.share(os.getpid())
5390 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5391 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5392
5393 def compareSockets(self, org, other):
5394 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005395 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005396 self.assertEqual(org.gettimeout(), None)
5397 self.assertEqual(org.gettimeout(), other.gettimeout())
5398
5399 self.assertEqual(org.family, other.family)
5400 self.assertEqual(org.type, other.type)
5401 # If the user specified "0" for proto, then
5402 # internally windows will have picked the correct value.
5403 # Python introspection on the socket however will still return
5404 # 0. For the shared socket, the python value is recreated
5405 # from the actual value, so it may not compare correctly.
5406 if org.proto != 0:
5407 self.assertEqual(org.proto, other.proto)
5408
5409 def testShareLocal(self):
5410 data = self.serv.share(os.getpid())
5411 s = socket.fromshare(data)
5412 try:
5413 self.compareSockets(self.serv, s)
5414 finally:
5415 s.close()
5416
5417 def testTypes(self):
5418 families = [socket.AF_INET, socket.AF_INET6]
5419 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5420 for f in families:
5421 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005422 try:
5423 source = socket.socket(f, t)
5424 except OSError:
5425 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005426 try:
5427 data = source.share(os.getpid())
5428 shared = socket.fromshare(data)
5429 try:
5430 self.compareSockets(source, shared)
5431 finally:
5432 shared.close()
5433 finally:
5434 source.close()
5435
5436
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005437class SendfileUsingSendTest(ThreadedTCPSocketTest):
5438 """
5439 Test the send() implementation of socket.sendfile().
5440 """
5441
Victor Stinner8c663fd2017-11-08 14:44:44 -08005442 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005443 BUFSIZE = 8192
5444 FILEDATA = b""
5445 TIMEOUT = 2
5446
5447 @classmethod
5448 def setUpClass(cls):
5449 def chunks(total, step):
5450 assert total >= step
5451 while total > step:
5452 yield step
5453 total -= step
5454 if total:
5455 yield total
5456
5457 chunk = b"".join([random.choice(string.ascii_letters).encode()
5458 for i in range(cls.BUFSIZE)])
5459 with open(support.TESTFN, 'wb') as f:
5460 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5461 f.write(chunk)
5462 with open(support.TESTFN, 'rb') as f:
5463 cls.FILEDATA = f.read()
5464 assert len(cls.FILEDATA) == cls.FILESIZE
5465
5466 @classmethod
5467 def tearDownClass(cls):
5468 support.unlink(support.TESTFN)
5469
5470 def accept_conn(self):
5471 self.serv.settimeout(self.TIMEOUT)
5472 conn, addr = self.serv.accept()
5473 conn.settimeout(self.TIMEOUT)
5474 self.addCleanup(conn.close)
5475 return conn
5476
5477 def recv_data(self, conn):
5478 received = []
5479 while True:
5480 chunk = conn.recv(self.BUFSIZE)
5481 if not chunk:
5482 break
5483 received.append(chunk)
5484 return b''.join(received)
5485
5486 def meth_from_sock(self, sock):
5487 # Depending on the mixin class being run return either send()
5488 # or sendfile() method implementation.
5489 return getattr(sock, "_sendfile_use_send")
5490
5491 # regular file
5492
5493 def _testRegularFile(self):
5494 address = self.serv.getsockname()
5495 file = open(support.TESTFN, 'rb')
5496 with socket.create_connection(address) as sock, file as file:
5497 meth = self.meth_from_sock(sock)
5498 sent = meth(file)
5499 self.assertEqual(sent, self.FILESIZE)
5500 self.assertEqual(file.tell(), self.FILESIZE)
5501
5502 def testRegularFile(self):
5503 conn = self.accept_conn()
5504 data = self.recv_data(conn)
5505 self.assertEqual(len(data), self.FILESIZE)
5506 self.assertEqual(data, self.FILEDATA)
5507
5508 # non regular file
5509
5510 def _testNonRegularFile(self):
5511 address = self.serv.getsockname()
5512 file = io.BytesIO(self.FILEDATA)
5513 with socket.create_connection(address) as sock, file as file:
5514 sent = sock.sendfile(file)
5515 self.assertEqual(sent, self.FILESIZE)
5516 self.assertEqual(file.tell(), self.FILESIZE)
5517 self.assertRaises(socket._GiveupOnSendfile,
5518 sock._sendfile_use_sendfile, file)
5519
5520 def testNonRegularFile(self):
5521 conn = self.accept_conn()
5522 data = self.recv_data(conn)
5523 self.assertEqual(len(data), self.FILESIZE)
5524 self.assertEqual(data, self.FILEDATA)
5525
5526 # empty file
5527
5528 def _testEmptyFileSend(self):
5529 address = self.serv.getsockname()
5530 filename = support.TESTFN + "2"
5531 with open(filename, 'wb'):
5532 self.addCleanup(support.unlink, filename)
5533 file = open(filename, 'rb')
5534 with socket.create_connection(address) as sock, file as file:
5535 meth = self.meth_from_sock(sock)
5536 sent = meth(file)
5537 self.assertEqual(sent, 0)
5538 self.assertEqual(file.tell(), 0)
5539
5540 def testEmptyFileSend(self):
5541 conn = self.accept_conn()
5542 data = self.recv_data(conn)
5543 self.assertEqual(data, b"")
5544
5545 # offset
5546
5547 def _testOffset(self):
5548 address = self.serv.getsockname()
5549 file = open(support.TESTFN, 'rb')
5550 with socket.create_connection(address) as sock, file as file:
5551 meth = self.meth_from_sock(sock)
5552 sent = meth(file, offset=5000)
5553 self.assertEqual(sent, self.FILESIZE - 5000)
5554 self.assertEqual(file.tell(), self.FILESIZE)
5555
5556 def testOffset(self):
5557 conn = self.accept_conn()
5558 data = self.recv_data(conn)
5559 self.assertEqual(len(data), self.FILESIZE - 5000)
5560 self.assertEqual(data, self.FILEDATA[5000:])
5561
5562 # count
5563
5564 def _testCount(self):
5565 address = self.serv.getsockname()
5566 file = open(support.TESTFN, 'rb')
5567 with socket.create_connection(address, timeout=2) as sock, file as file:
5568 count = 5000007
5569 meth = self.meth_from_sock(sock)
5570 sent = meth(file, count=count)
5571 self.assertEqual(sent, count)
5572 self.assertEqual(file.tell(), count)
5573
5574 def testCount(self):
5575 count = 5000007
5576 conn = self.accept_conn()
5577 data = self.recv_data(conn)
5578 self.assertEqual(len(data), count)
5579 self.assertEqual(data, self.FILEDATA[:count])
5580
5581 # count small
5582
5583 def _testCountSmall(self):
5584 address = self.serv.getsockname()
5585 file = open(support.TESTFN, 'rb')
5586 with socket.create_connection(address, timeout=2) as sock, file as file:
5587 count = 1
5588 meth = self.meth_from_sock(sock)
5589 sent = meth(file, count=count)
5590 self.assertEqual(sent, count)
5591 self.assertEqual(file.tell(), count)
5592
5593 def testCountSmall(self):
5594 count = 1
5595 conn = self.accept_conn()
5596 data = self.recv_data(conn)
5597 self.assertEqual(len(data), count)
5598 self.assertEqual(data, self.FILEDATA[:count])
5599
5600 # count + offset
5601
5602 def _testCountWithOffset(self):
5603 address = self.serv.getsockname()
5604 file = open(support.TESTFN, 'rb')
5605 with socket.create_connection(address, timeout=2) as sock, file as file:
5606 count = 100007
5607 meth = self.meth_from_sock(sock)
5608 sent = meth(file, offset=2007, count=count)
5609 self.assertEqual(sent, count)
5610 self.assertEqual(file.tell(), count + 2007)
5611
5612 def testCountWithOffset(self):
5613 count = 100007
5614 conn = self.accept_conn()
5615 data = self.recv_data(conn)
5616 self.assertEqual(len(data), count)
5617 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5618
5619 # non blocking sockets are not supposed to work
5620
5621 def _testNonBlocking(self):
5622 address = self.serv.getsockname()
5623 file = open(support.TESTFN, 'rb')
5624 with socket.create_connection(address) as sock, file as file:
5625 sock.setblocking(False)
5626 meth = self.meth_from_sock(sock)
5627 self.assertRaises(ValueError, meth, file)
5628 self.assertRaises(ValueError, sock.sendfile, file)
5629
5630 def testNonBlocking(self):
5631 conn = self.accept_conn()
5632 if conn.recv(8192):
5633 self.fail('was not supposed to receive any data')
5634
5635 # timeout (non-triggered)
5636
5637 def _testWithTimeout(self):
5638 address = self.serv.getsockname()
5639 file = open(support.TESTFN, 'rb')
5640 with socket.create_connection(address, timeout=2) as sock, file as file:
5641 meth = self.meth_from_sock(sock)
5642 sent = meth(file)
5643 self.assertEqual(sent, self.FILESIZE)
5644
5645 def testWithTimeout(self):
5646 conn = self.accept_conn()
5647 data = self.recv_data(conn)
5648 self.assertEqual(len(data), self.FILESIZE)
5649 self.assertEqual(data, self.FILEDATA)
5650
5651 # timeout (triggered)
5652
5653 def _testWithTimeoutTriggeredSend(self):
5654 address = self.serv.getsockname()
5655 file = open(support.TESTFN, 'rb')
5656 with socket.create_connection(address, timeout=0.01) as sock, \
5657 file as file:
5658 meth = self.meth_from_sock(sock)
5659 self.assertRaises(socket.timeout, meth, file)
5660
5661 def testWithTimeoutTriggeredSend(self):
5662 conn = self.accept_conn()
5663 conn.recv(88192)
5664
5665 # errors
5666
5667 def _test_errors(self):
5668 pass
5669
5670 def test_errors(self):
5671 with open(support.TESTFN, 'rb') as file:
5672 with socket.socket(type=socket.SOCK_DGRAM) as s:
5673 meth = self.meth_from_sock(s)
5674 self.assertRaisesRegex(
5675 ValueError, "SOCK_STREAM", meth, file)
5676 with open(support.TESTFN, 'rt') as file:
5677 with socket.socket() as s:
5678 meth = self.meth_from_sock(s)
5679 self.assertRaisesRegex(
5680 ValueError, "binary mode", meth, file)
5681 with open(support.TESTFN, 'rb') as file:
5682 with socket.socket() as s:
5683 meth = self.meth_from_sock(s)
5684 self.assertRaisesRegex(TypeError, "positive integer",
5685 meth, file, count='2')
5686 self.assertRaisesRegex(TypeError, "positive integer",
5687 meth, file, count=0.1)
5688 self.assertRaisesRegex(ValueError, "positive integer",
5689 meth, file, count=0)
5690 self.assertRaisesRegex(ValueError, "positive integer",
5691 meth, file, count=-1)
5692
5693
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005694@unittest.skipUnless(hasattr(os, "sendfile"),
5695 'os.sendfile() required for this test.')
5696class SendfileUsingSendfileTest(SendfileUsingSendTest):
5697 """
5698 Test the sendfile() implementation of socket.sendfile().
5699 """
5700 def meth_from_sock(self, sock):
5701 return getattr(sock, "_sendfile_use_sendfile")
5702
Christian Heimes48371412016-09-06 00:37:46 +02005703
5704@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005705class LinuxKernelCryptoAPI(unittest.TestCase):
5706 # tests for AF_ALG
5707 def create_alg(self, typ, name):
5708 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005709 try:
5710 sock.bind((typ, name))
5711 except FileNotFoundError as e:
5712 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005713 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005714 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005715 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005716 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005717
Victor Stinner86afc1f2017-11-30 13:58:43 +01005718 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
5719 # at least on ppc64le architecture
5720 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02005721 def test_sha256(self):
5722 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5723 "177a9cb410ff61f20015ad")
5724 with self.create_alg('hash', 'sha256') as algo:
5725 op, _ = algo.accept()
5726 with op:
5727 op.sendall(b"abc")
5728 self.assertEqual(op.recv(512), expected)
5729
5730 op, _ = algo.accept()
5731 with op:
5732 op.send(b'a', socket.MSG_MORE)
5733 op.send(b'b', socket.MSG_MORE)
5734 op.send(b'c', socket.MSG_MORE)
5735 op.send(b'')
5736 self.assertEqual(op.recv(512), expected)
5737
5738 def test_hmac_sha1(self):
5739 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5740 with self.create_alg('hash', 'hmac(sha1)') as algo:
5741 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5742 op, _ = algo.accept()
5743 with op:
5744 op.sendall(b"what do ya want for nothing?")
5745 self.assertEqual(op.recv(512), expected)
5746
Christian Heimese084f842016-09-11 20:11:30 +02005747 # Although it should work with 3.19 and newer the test blocks on
5748 # Ubuntu 15.10 with Kernel 4.2.0-19.
5749 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005750 def test_aes_cbc(self):
5751 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5752 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5753 msg = b"Single block msg"
5754 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5755 msglen = len(msg)
5756 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5757 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5758 op, _ = algo.accept()
5759 with op:
5760 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5761 flags=socket.MSG_MORE)
5762 op.sendall(msg)
5763 self.assertEqual(op.recv(msglen), ciphertext)
5764
5765 op, _ = algo.accept()
5766 with op:
5767 op.sendmsg_afalg([ciphertext],
5768 op=socket.ALG_OP_DECRYPT, iv=iv)
5769 self.assertEqual(op.recv(msglen), msg)
5770
5771 # long message
5772 multiplier = 1024
5773 longmsg = [msg] * multiplier
5774 op, _ = algo.accept()
5775 with op:
5776 op.sendmsg_afalg(longmsg,
5777 op=socket.ALG_OP_ENCRYPT, iv=iv)
5778 enc = op.recv(msglen * multiplier)
5779 self.assertEqual(len(enc), msglen * multiplier)
5780 self.assertTrue(enc[:msglen], ciphertext)
5781
5782 op, _ = algo.accept()
5783 with op:
5784 op.sendmsg_afalg([enc],
5785 op=socket.ALG_OP_DECRYPT, iv=iv)
5786 dec = op.recv(msglen * multiplier)
5787 self.assertEqual(len(dec), msglen * multiplier)
5788 self.assertEqual(dec, msg * multiplier)
5789
matejcik9764c152017-02-16 14:41:31 +01005790 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005791 def test_aead_aes_gcm(self):
5792 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5793 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5794 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5795 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5796 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5797 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5798
5799 taglen = len(expected_tag)
5800 assoclen = len(assoc)
5801
5802 with self.create_alg('aead', 'gcm(aes)') as algo:
5803 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5804 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5805 None, taglen)
5806
5807 # send assoc, plain and tag buffer in separate steps
5808 op, _ = algo.accept()
5809 with op:
5810 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5811 assoclen=assoclen, flags=socket.MSG_MORE)
5812 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005813 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005814 res = op.recv(assoclen + len(plain) + taglen)
5815 self.assertEqual(expected_ct, res[assoclen:-taglen])
5816 self.assertEqual(expected_tag, res[-taglen:])
5817
5818 # now with msg
5819 op, _ = algo.accept()
5820 with op:
matejcik9764c152017-02-16 14:41:31 +01005821 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005822 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5823 assoclen=assoclen)
5824 res = op.recv(assoclen + len(plain) + taglen)
5825 self.assertEqual(expected_ct, res[assoclen:-taglen])
5826 self.assertEqual(expected_tag, res[-taglen:])
5827
5828 # create anc data manually
5829 pack_uint32 = struct.Struct('I').pack
5830 op, _ = algo.accept()
5831 with op:
matejcik9764c152017-02-16 14:41:31 +01005832 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005833 op.sendmsg(
5834 [msg],
5835 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5836 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5837 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5838 )
5839 )
matejcik9764c152017-02-16 14:41:31 +01005840 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005841 self.assertEqual(expected_ct, res[assoclen:-taglen])
5842 self.assertEqual(expected_tag, res[-taglen:])
5843
5844 # decrypt and verify
5845 op, _ = algo.accept()
5846 with op:
5847 msg = assoc + expected_ct + expected_tag
5848 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5849 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005850 res = op.recv(len(msg) - taglen)
5851 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005852
Christian Heimese084f842016-09-11 20:11:30 +02005853 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005854 def test_drbg_pr_sha256(self):
5855 # deterministic random bit generator, prediction resistance, sha256
5856 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5857 extra_seed = os.urandom(32)
5858 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5859 op, _ = algo.accept()
5860 with op:
5861 rn = op.recv(32)
5862 self.assertEqual(len(rn), 32)
5863
5864 def test_sendmsg_afalg_args(self):
5865 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005866 with sock:
5867 with self.assertRaises(TypeError):
5868 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005869
Christian Heimes02b30352016-09-11 19:49:56 +02005870 with self.assertRaises(TypeError):
5871 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005872
Christian Heimes02b30352016-09-11 19:49:56 +02005873 with self.assertRaises(TypeError):
5874 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005875
Christian Heimes02b30352016-09-11 19:49:56 +02005876 with self.assertRaises(TypeError):
5877 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005878
Christian Heimes02b30352016-09-11 19:49:56 +02005879 with self.assertRaises(TypeError):
5880 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5881
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005882
Guido van Rossumb995eb72002-07-31 16:08:40 +00005883def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005884 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005885 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005886
5887 tests.extend([
5888 NonBlockingTCPTests,
5889 FileObjectClassTestCase,
5890 UnbufferedFileObjectClassTestCase,
5891 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005892 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005893 UnicodeReadFileObjectClassTestCase,
5894 UnicodeWriteFileObjectClassTestCase,
5895 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005896 NetworkConnectionNoServer,
5897 NetworkConnectionAttributesTest,
5898 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005899 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005900 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005901 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005902 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005903 tests.append(BasicSocketPairTest)
5904 tests.append(TestUnixDomain)
5905 tests.append(TestLinuxAbstractNamespace)
5906 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005907 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005908 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005909 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005910 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04005911 BasicVSOCKTest,
5912 ThreadedVSOCKSocketStreamTest,
5913 ])
5914 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005915 CmsgMacroTests,
5916 SendmsgUDPTest,
5917 RecvmsgUDPTest,
5918 RecvmsgIntoUDPTest,
5919 SendmsgUDP6Test,
5920 RecvmsgUDP6Test,
5921 RecvmsgRFC3542AncillaryUDP6Test,
5922 RecvmsgIntoRFC3542AncillaryUDP6Test,
5923 RecvmsgIntoUDP6Test,
5924 SendmsgTCPTest,
5925 RecvmsgTCPTest,
5926 RecvmsgIntoTCPTest,
5927 SendmsgSCTPStreamTest,
5928 RecvmsgSCTPStreamTest,
5929 RecvmsgIntoSCTPStreamTest,
5930 SendmsgUnixStreamTest,
5931 RecvmsgUnixStreamTest,
5932 RecvmsgIntoUnixStreamTest,
5933 RecvmsgSCMRightsStreamTest,
5934 RecvmsgIntoSCMRightsStreamTest,
5935 # These are slow when setitimer() is not available
5936 InterruptedRecvTimeoutTest,
5937 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005938 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005939 SendfileUsingSendTest,
5940 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005941 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005942
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005943 thread_info = support.threading_setup()
5944 support.run_unittest(*tests)
5945 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005946
5947if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005948 test_main()