blob: f377ebcb27b2bf23d362b612ffa7c8bbb2b64787 [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']:
Barry Warsaw273f51f2018-05-17 11:54:01 -0400896 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +0800897 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.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001041 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001042 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
Коренберг Марк7766b962018-02-13 00:47:42 +05001597 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1598 def test_getaddrinfo_ipv6_basic(self):
1599 ((*_, sockaddr),) = socket.getaddrinfo(
1600 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1601 1234, socket.AF_INET6,
1602 socket.SOCK_DGRAM,
1603 socket.IPPROTO_UDP
1604 )
1605 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1606
1607 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1608 @unittest.skipUnless(
1609 hasattr(socket, 'if_nameindex'),
1610 'if_nameindex is not supported')
1611 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1612 # Just pick up any network interface (Linux, Mac OS X)
1613 (ifindex, test_interface) = socket.if_nameindex()[0]
1614 ((*_, sockaddr),) = socket.getaddrinfo(
1615 'ff02::1de:c0:face:8D%' + test_interface,
1616 1234, socket.AF_INET6,
1617 socket.SOCK_DGRAM,
1618 socket.IPPROTO_UDP
1619 )
1620 # Note missing interface name part in IPv6 address
1621 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1622
1623 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1624 @unittest.skipUnless(
1625 sys.platform == 'win32',
1626 'Numeric scope id does not work or undocumented')
1627 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1628 # Also works on Linux and Mac OS X, but is not documented (?)
1629 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1630 ifindex = 42
1631 ((*_, sockaddr),) = socket.getaddrinfo(
1632 'ff02::1de:c0:face:8D%' + str(ifindex),
1633 1234, socket.AF_INET6,
1634 socket.SOCK_DGRAM,
1635 socket.IPPROTO_UDP
1636 )
1637 # Note missing interface name part in IPv6 address
1638 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1639
1640 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1641 @unittest.skipUnless(
1642 hasattr(socket, 'if_nameindex'),
1643 'if_nameindex is not supported')
1644 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1645 # Just pick up any network interface.
1646 (ifindex, test_interface) = socket.if_nameindex()[0]
1647 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1648 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1649 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1650
1651 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1652 @unittest.skipUnless(
1653 sys.platform == 'win32',
1654 'Numeric scope id does not work or undocumented')
1655 def test_getnameinfo_ipv6_scopeid_numeric(self):
1656 # Also works on Linux (undocumented), but does not work on Mac OS X
1657 # Windows and Linux allow nonexistent interface numbers here.
1658 ifindex = 42
1659 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1660 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1661 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1662
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001663 def test_str_for_enums(self):
1664 # Make sure that the AF_* and SOCK_* constants have enum-like string
1665 # reprs.
1666 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1667 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001668 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001669
Yury Selivanov98181422017-12-18 20:02:54 -05001670 def test_socket_consistent_sock_type(self):
1671 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1672 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1673 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1674
1675 with socket.socket(socket.AF_INET, sock_type) as s:
1676 self.assertEqual(s.type, socket.SOCK_STREAM)
1677 s.settimeout(1)
1678 self.assertEqual(s.type, socket.SOCK_STREAM)
1679 s.settimeout(0)
1680 self.assertEqual(s.type, socket.SOCK_STREAM)
1681 s.setblocking(True)
1682 self.assertEqual(s.type, socket.SOCK_STREAM)
1683 s.setblocking(False)
1684 self.assertEqual(s.type, socket.SOCK_STREAM)
1685
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001686 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001687 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001688 # Test that when created with a family that's not one of the known
1689 # AF_*/SOCK_* constants, socket.family just returns the number.
1690 #
1691 # To do this we fool socket.socket into believing it already has an
1692 # open fd because on this path it doesn't actually verify the family and
1693 # type and populates the socket object.
1694 #
1695 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001696 fd, path = tempfile.mkstemp()
1697 self.addCleanup(os.unlink, path)
Yury Selivanov98181422017-12-18 20:02:54 -05001698 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1699
1700 unknown_type = max(
1701 kind
1702 for name, kind in socket.SocketKind.__members__.items()
1703 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1704 ) + 1
1705
1706 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001707 family=unknown_family, type=unknown_type, proto=23,
1708 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001709 self.assertEqual(s.family, unknown_family)
1710 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001711 # some OS like macOS ignore proto
1712 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001713
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001714 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1715 def test__sendfile_use_sendfile(self):
1716 class File:
1717 def __init__(self, fd):
1718 self.fd = fd
1719
1720 def fileno(self):
1721 return self.fd
1722 with socket.socket() as sock:
1723 fd = os.open(os.curdir, os.O_RDONLY)
1724 os.close(fd)
1725 with self.assertRaises(socket._GiveupOnSendfile):
1726 sock._sendfile_use_sendfile(File(fd))
1727 with self.assertRaises(OverflowError):
1728 sock._sendfile_use_sendfile(File(2**1000))
1729 with self.assertRaises(TypeError):
1730 sock._sendfile_use_sendfile(File(None))
1731
Christian Heimesb6e43af2018-01-29 22:37:58 +01001732 def _test_socket_fileno(self, s, family, stype):
1733 self.assertEqual(s.family, family)
1734 self.assertEqual(s.type, stype)
1735
1736 fd = s.fileno()
1737 s2 = socket.socket(fileno=fd)
1738 self.addCleanup(s2.close)
1739 # detach old fd to avoid double close
1740 s.detach()
1741 self.assertEqual(s2.family, family)
1742 self.assertEqual(s2.type, stype)
1743 self.assertEqual(s2.fileno(), fd)
1744
1745 def test_socket_fileno(self):
1746 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1747 self.addCleanup(s.close)
1748 s.bind((support.HOST, 0))
1749 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1750
1751 if hasattr(socket, "SOCK_DGRAM"):
1752 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1753 self.addCleanup(s.close)
1754 s.bind((support.HOST, 0))
1755 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1756
1757 if support.IPV6_ENABLED:
1758 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1759 self.addCleanup(s.close)
1760 s.bind((support.HOSTv6, 0, 0, 0))
1761 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1762
1763 if hasattr(socket, "AF_UNIX"):
1764 tmpdir = tempfile.mkdtemp()
1765 self.addCleanup(shutil.rmtree, tmpdir)
1766 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1767 self.addCleanup(s.close)
1768 s.bind(os.path.join(tmpdir, 'socket'))
1769 self._test_socket_fileno(s, socket.AF_UNIX, socket.SOCK_STREAM)
1770
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001771
Charles-François Natali47413c12011-10-06 19:47:44 +02001772@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1773class BasicCANTest(unittest.TestCase):
1774
1775 def testCrucialConstants(self):
1776 socket.AF_CAN
1777 socket.PF_CAN
1778 socket.CAN_RAW
1779
Charles-François Natali773e42d2013-02-05 19:42:01 +01001780 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1781 'socket.CAN_BCM required for this test.')
1782 def testBCMConstants(self):
1783 socket.CAN_BCM
1784
1785 # opcodes
1786 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1787 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1788 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1789 socket.CAN_BCM_TX_SEND # send one CAN frame
1790 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1791 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1792 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1793 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1794 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1795 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1796 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1797 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1798
Charles-François Natali47413c12011-10-06 19:47:44 +02001799 def testCreateSocket(self):
1800 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1801 pass
1802
Charles-François Natali773e42d2013-02-05 19:42:01 +01001803 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1804 'socket.CAN_BCM required for this test.')
1805 def testCreateBCMSocket(self):
1806 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1807 pass
1808
Charles-François Natali47413c12011-10-06 19:47:44 +02001809 def testBindAny(self):
1810 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1811 s.bind(('', ))
1812
1813 def testTooLongInterfaceName(self):
1814 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1815 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001816 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001817 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001818
1819 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1820 'socket.CAN_RAW_LOOPBACK required for this test.')
1821 def testLoopback(self):
1822 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1823 for loopback in (0, 1):
1824 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1825 loopback)
1826 self.assertEqual(loopback,
1827 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1828
1829 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1830 'socket.CAN_RAW_FILTER required for this test.')
1831 def testFilter(self):
1832 can_id, can_mask = 0x200, 0x700
1833 can_filter = struct.pack("=II", can_id, can_mask)
1834 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1835 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1836 self.assertEqual(can_filter,
1837 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001838 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001839
1840
1841@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001842class CANTest(ThreadedCANSocketTest):
1843
Charles-François Natali47413c12011-10-06 19:47:44 +02001844 def __init__(self, methodName='runTest'):
1845 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1846
1847 @classmethod
1848 def build_can_frame(cls, can_id, data):
1849 """Build a CAN frame."""
1850 can_dlc = len(data)
1851 data = data.ljust(8, b'\x00')
1852 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1853
1854 @classmethod
1855 def dissect_can_frame(cls, frame):
1856 """Dissect a CAN frame."""
1857 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1858 return (can_id, can_dlc, data[:can_dlc])
1859
1860 def testSendFrame(self):
1861 cf, addr = self.s.recvfrom(self.bufsize)
1862 self.assertEqual(self.cf, cf)
1863 self.assertEqual(addr[0], self.interface)
1864 self.assertEqual(addr[1], socket.AF_CAN)
1865
1866 def _testSendFrame(self):
1867 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1868 self.cli.send(self.cf)
1869
1870 def testSendMaxFrame(self):
1871 cf, addr = self.s.recvfrom(self.bufsize)
1872 self.assertEqual(self.cf, cf)
1873
1874 def _testSendMaxFrame(self):
1875 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1876 self.cli.send(self.cf)
1877
1878 def testSendMultiFrames(self):
1879 cf, addr = self.s.recvfrom(self.bufsize)
1880 self.assertEqual(self.cf1, cf)
1881
1882 cf, addr = self.s.recvfrom(self.bufsize)
1883 self.assertEqual(self.cf2, cf)
1884
1885 def _testSendMultiFrames(self):
1886 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1887 self.cli.send(self.cf1)
1888
1889 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1890 self.cli.send(self.cf2)
1891
Charles-François Natali773e42d2013-02-05 19:42:01 +01001892 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1893 'socket.CAN_BCM required for this test.')
1894 def _testBCM(self):
1895 cf, addr = self.cli.recvfrom(self.bufsize)
1896 self.assertEqual(self.cf, cf)
1897 can_id, can_dlc, data = self.dissect_can_frame(cf)
1898 self.assertEqual(self.can_id, can_id)
1899 self.assertEqual(self.data, data)
1900
1901 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1902 'socket.CAN_BCM required for this test.')
1903 def testBCM(self):
1904 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1905 self.addCleanup(bcm.close)
1906 bcm.connect((self.interface,))
1907 self.can_id = 0x123
1908 self.data = bytes([0xc0, 0xff, 0xee])
1909 self.cf = self.build_can_frame(self.can_id, self.data)
1910 opcode = socket.CAN_BCM_TX_SEND
1911 flags = 0
1912 count = 0
1913 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1914 bcm_can_id = 0x0222
1915 nframes = 1
1916 assert len(self.cf) == 16
1917 header = struct.pack(self.bcm_cmd_msg_fmt,
1918 opcode,
1919 flags,
1920 count,
1921 ival1_seconds,
1922 ival1_usec,
1923 ival2_seconds,
1924 ival2_usec,
1925 bcm_can_id,
1926 nframes,
1927 )
1928 header_plus_frame = header + self.cf
1929 bytes_sent = bcm.send(header_plus_frame)
1930 self.assertEqual(bytes_sent, len(header_plus_frame))
1931
Charles-François Natali47413c12011-10-06 19:47:44 +02001932
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001933@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
1934class ISOTPTest(unittest.TestCase):
1935
1936 def __init__(self, *args, **kwargs):
1937 super().__init__(*args, **kwargs)
1938 self.interface = "vcan0"
1939
1940 def testCrucialConstants(self):
1941 socket.AF_CAN
1942 socket.PF_CAN
1943 socket.CAN_ISOTP
1944 socket.SOCK_DGRAM
1945
1946 def testCreateSocket(self):
1947 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1948 pass
1949
1950 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
1951 'socket.CAN_ISOTP required for this test.')
1952 def testCreateISOTPSocket(self):
1953 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1954 pass
1955
1956 def testTooLongInterfaceName(self):
1957 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1958 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1959 with self.assertRaisesRegex(OSError, 'interface name too long'):
1960 s.bind(('x' * 1024, 1, 2))
1961
1962 def testBind(self):
1963 try:
1964 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1965 addr = self.interface, 0x123, 0x456
1966 s.bind(addr)
1967 self.assertEqual(s.getsockname(), addr)
1968 except OSError as e:
1969 if e.errno == errno.ENODEV:
1970 self.skipTest('network interface `%s` does not exist' %
1971 self.interface)
1972 else:
1973 raise
1974
1975
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001976@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1977class BasicRDSTest(unittest.TestCase):
1978
1979 def testCrucialConstants(self):
1980 socket.AF_RDS
1981 socket.PF_RDS
1982
1983 def testCreateSocket(self):
1984 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1985 pass
1986
1987 def testSocketBufferSize(self):
1988 bufsize = 16384
1989 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1990 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1991 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1992
1993
1994@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001995class RDSTest(ThreadedRDSSocketTest):
1996
1997 def __init__(self, methodName='runTest'):
1998 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1999
Charles-François Natali240c55f2011-11-10 20:33:36 +01002000 def setUp(self):
2001 super().setUp()
2002 self.evt = threading.Event()
2003
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002004 def testSendAndRecv(self):
2005 data, addr = self.serv.recvfrom(self.bufsize)
2006 self.assertEqual(self.data, data)
2007 self.assertEqual(self.cli_addr, addr)
2008
2009 def _testSendAndRecv(self):
2010 self.data = b'spam'
2011 self.cli.sendto(self.data, 0, (HOST, self.port))
2012
2013 def testPeek(self):
2014 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2015 self.assertEqual(self.data, data)
2016 data, addr = self.serv.recvfrom(self.bufsize)
2017 self.assertEqual(self.data, data)
2018
2019 def _testPeek(self):
2020 self.data = b'spam'
2021 self.cli.sendto(self.data, 0, (HOST, self.port))
2022
2023 @requireAttrs(socket.socket, 'recvmsg')
2024 def testSendAndRecvMsg(self):
2025 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2026 self.assertEqual(self.data, data)
2027
2028 @requireAttrs(socket.socket, 'sendmsg')
2029 def _testSendAndRecvMsg(self):
2030 self.data = b'hello ' * 10
2031 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2032
2033 def testSendAndRecvMulti(self):
2034 data, addr = self.serv.recvfrom(self.bufsize)
2035 self.assertEqual(self.data1, data)
2036
2037 data, addr = self.serv.recvfrom(self.bufsize)
2038 self.assertEqual(self.data2, data)
2039
2040 def _testSendAndRecvMulti(self):
2041 self.data1 = b'bacon'
2042 self.cli.sendto(self.data1, 0, (HOST, self.port))
2043
2044 self.data2 = b'egg'
2045 self.cli.sendto(self.data2, 0, (HOST, self.port))
2046
2047 def testSelect(self):
2048 r, w, x = select.select([self.serv], [], [], 3.0)
2049 self.assertIn(self.serv, r)
2050 data, addr = self.serv.recvfrom(self.bufsize)
2051 self.assertEqual(self.data, data)
2052
2053 def _testSelect(self):
2054 self.data = b'select'
2055 self.cli.sendto(self.data, 0, (HOST, self.port))
2056
2057 def testCongestion(self):
2058 # wait until the sender is done
2059 self.evt.wait()
2060
2061 def _testCongestion(self):
2062 # test the behavior in case of congestion
2063 self.data = b'fill'
2064 self.cli.setblocking(False)
2065 try:
2066 # try to lower the receiver's socket buffer size
2067 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
2068 except OSError:
2069 pass
2070 with self.assertRaises(OSError) as cm:
2071 try:
2072 # fill the receiver's socket buffer
2073 while True:
2074 self.cli.sendto(self.data, 0, (HOST, self.port))
2075 finally:
2076 # signal the receiver we're done
2077 self.evt.set()
2078 # sendto() should have failed with ENOBUFS
2079 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
2080 # and we should have received a congestion notification through poll
2081 r, w, x = select.select([self.serv], [], [], 3.0)
2082 self.assertIn(self.serv, r)
2083
2084
caaveryeffc12f2017-09-06 18:18:10 -04002085@unittest.skipIf(fcntl is None, "need fcntl")
2086@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2087 'VSOCK sockets required for this test.')
2088class BasicVSOCKTest(unittest.TestCase):
2089
2090 def testCrucialConstants(self):
2091 socket.AF_VSOCK
2092
2093 def testVSOCKConstants(self):
2094 socket.SO_VM_SOCKETS_BUFFER_SIZE
2095 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2096 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2097 socket.VMADDR_CID_ANY
2098 socket.VMADDR_PORT_ANY
2099 socket.VMADDR_CID_HOST
2100 socket.VM_SOCKETS_INVALID_VERSION
2101 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2102
2103 def testCreateSocket(self):
2104 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2105 pass
2106
2107 def testSocketBufferSize(self):
2108 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2109 orig_max = s.getsockopt(socket.AF_VSOCK,
2110 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2111 orig = s.getsockopt(socket.AF_VSOCK,
2112 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2113 orig_min = s.getsockopt(socket.AF_VSOCK,
2114 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2115
2116 s.setsockopt(socket.AF_VSOCK,
2117 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2118 s.setsockopt(socket.AF_VSOCK,
2119 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2120 s.setsockopt(socket.AF_VSOCK,
2121 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2122
2123 self.assertEqual(orig_max * 2,
2124 s.getsockopt(socket.AF_VSOCK,
2125 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2126 self.assertEqual(orig * 2,
2127 s.getsockopt(socket.AF_VSOCK,
2128 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2129 self.assertEqual(orig_min * 2,
2130 s.getsockopt(socket.AF_VSOCK,
2131 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2132
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002133
Guido van Rossum24e4af82002-06-12 19:18:08 +00002134class BasicTCPTest(SocketConnectedTest):
2135
2136 def __init__(self, methodName='runTest'):
2137 SocketConnectedTest.__init__(self, methodName=methodName)
2138
2139 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002140 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002141 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002142 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002143
2144 def _testRecv(self):
2145 self.serv_conn.send(MSG)
2146
2147 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002148 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002149 seg1 = self.cli_conn.recv(len(MSG) - 3)
2150 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002151 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002152 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002153
2154 def _testOverFlowRecv(self):
2155 self.serv_conn.send(MSG)
2156
2157 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002158 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002159 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002160 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002161
2162 def _testRecvFrom(self):
2163 self.serv_conn.send(MSG)
2164
2165 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002166 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002167 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2168 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002169 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002170 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002171
2172 def _testOverFlowRecvFrom(self):
2173 self.serv_conn.send(MSG)
2174
2175 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002176 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002177 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002178 while 1:
2179 read = self.cli_conn.recv(1024)
2180 if not read:
2181 break
Guido van Rossume531e292002-08-08 20:28:34 +00002182 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002183 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002184
2185 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002186 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002187 self.serv_conn.sendall(big_chunk)
2188
2189 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002190 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002191 fd = self.cli_conn.fileno()
2192 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002193 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002194 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002195 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002196 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002197
2198 def _testFromFd(self):
2199 self.serv_conn.send(MSG)
2200
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002201 def testDup(self):
2202 # Testing dup()
2203 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002204 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002205 msg = sock.recv(1024)
2206 self.assertEqual(msg, MSG)
2207
2208 def _testDup(self):
2209 self.serv_conn.send(MSG)
2210
Guido van Rossum24e4af82002-06-12 19:18:08 +00002211 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002212 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002213 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002214 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002215 # wait for _testShutdown to finish: on OS X, when the server
2216 # closes the connection the client also becomes disconnected,
2217 # and the client's shutdown call will fail. (Issue #4397.)
2218 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002219
2220 def _testShutdown(self):
2221 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002222 self.serv_conn.shutdown(2)
2223
2224 testShutdown_overflow = support.cpython_only(testShutdown)
2225
2226 @support.cpython_only
2227 def _testShutdown_overflow(self):
2228 import _testcapi
2229 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002230 # Issue 15989
2231 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2232 _testcapi.INT_MAX + 1)
2233 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2234 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002235 self.serv_conn.shutdown(2)
2236
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002237 def testDetach(self):
2238 # Testing detach()
2239 fileno = self.cli_conn.fileno()
2240 f = self.cli_conn.detach()
2241 self.assertEqual(f, fileno)
2242 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002243 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002244 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002245 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002246 # ...but we can create another socket using the (still open)
2247 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002248 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002249 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002250 msg = sock.recv(1024)
2251 self.assertEqual(msg, MSG)
2252
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002253 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002254 self.serv_conn.send(MSG)
2255
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002256
Guido van Rossum24e4af82002-06-12 19:18:08 +00002257class BasicUDPTest(ThreadedUDPSocketTest):
2258
2259 def __init__(self, methodName='runTest'):
2260 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2261
2262 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002263 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002264 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002265 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002266
2267 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002268 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002269
Guido van Rossum1c938012002-06-12 21:17:20 +00002270 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002271 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002272 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002273 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002274
Guido van Rossum1c938012002-06-12 21:17:20 +00002275 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002276 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002277
Guido van Rossumd8faa362007-04-27 19:54:29 +00002278 def testRecvFromNegative(self):
2279 # Negative lengths passed to recvfrom should give ValueError.
2280 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2281
2282 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002283 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002284
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002285# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2286# same test code is used with different families and types of socket
2287# (e.g. stream, datagram), and tests using recvmsg() are repeated
2288# using recvmsg_into().
2289#
2290# The generic test classes such as SendmsgTests and
2291# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2292# supplied with sockets cli_sock and serv_sock representing the
2293# client's and the server's end of the connection respectively, and
2294# attributes cli_addr and serv_addr holding their (numeric where
2295# appropriate) addresses.
2296#
2297# The final concrete test classes combine these with subclasses of
2298# SocketTestBase which set up client and server sockets of a specific
2299# type, and with subclasses of SendrecvmsgBase such as
2300# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2301# sockets to cli_sock and serv_sock and override the methods and
2302# attributes of SendrecvmsgBase to fill in destination addresses if
2303# needed when sending, check for specific flags in msg_flags, etc.
2304#
2305# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2306# recvmsg_into().
2307
2308# XXX: like the other datagram (UDP) tests in this module, the code
2309# here assumes that datagram delivery on the local machine will be
2310# reliable.
2311
2312class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2313 # Base class for sendmsg()/recvmsg() tests.
2314
2315 # Time in seconds to wait before considering a test failed, or
2316 # None for no timeout. Not all tests actually set a timeout.
2317 fail_timeout = 3.0
2318
2319 def setUp(self):
2320 self.misc_event = threading.Event()
2321 super().setUp()
2322
2323 def sendToServer(self, msg):
2324 # Send msg to the server.
2325 return self.cli_sock.send(msg)
2326
2327 # Tuple of alternative default arguments for sendmsg() when called
2328 # via sendmsgToServer() (e.g. to include a destination address).
2329 sendmsg_to_server_defaults = ()
2330
2331 def sendmsgToServer(self, *args):
2332 # Call sendmsg() on self.cli_sock with the given arguments,
2333 # filling in any arguments which are not supplied with the
2334 # corresponding items of self.sendmsg_to_server_defaults, if
2335 # any.
2336 return self.cli_sock.sendmsg(
2337 *(args + self.sendmsg_to_server_defaults[len(args):]))
2338
2339 def doRecvmsg(self, sock, bufsize, *args):
2340 # Call recvmsg() on sock with given arguments and return its
2341 # result. Should be used for tests which can use either
2342 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2343 # this method with one which emulates it using recvmsg_into(),
2344 # thus allowing the same test to be used for both methods.
2345 result = sock.recvmsg(bufsize, *args)
2346 self.registerRecvmsgResult(result)
2347 return result
2348
2349 def registerRecvmsgResult(self, result):
2350 # Called by doRecvmsg() with the return value of recvmsg() or
2351 # recvmsg_into(). Can be overridden to arrange cleanup based
2352 # on the returned ancillary data, for instance.
2353 pass
2354
2355 def checkRecvmsgAddress(self, addr1, addr2):
2356 # Called to compare the received address with the address of
2357 # the peer.
2358 self.assertEqual(addr1, addr2)
2359
2360 # Flags that are normally unset in msg_flags
2361 msg_flags_common_unset = 0
2362 for name in ("MSG_CTRUNC", "MSG_OOB"):
2363 msg_flags_common_unset |= getattr(socket, name, 0)
2364
2365 # Flags that are normally set
2366 msg_flags_common_set = 0
2367
2368 # Flags set when a complete record has been received (e.g. MSG_EOR
2369 # for SCTP)
2370 msg_flags_eor_indicator = 0
2371
2372 # Flags set when a complete record has not been received
2373 # (e.g. MSG_TRUNC for datagram sockets)
2374 msg_flags_non_eor_indicator = 0
2375
2376 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2377 # Method to check the value of msg_flags returned by recvmsg[_into]().
2378 #
2379 # Checks that all bits in msg_flags_common_set attribute are
2380 # set in "flags" and all bits in msg_flags_common_unset are
2381 # unset.
2382 #
2383 # The "eor" argument specifies whether the flags should
2384 # indicate that a full record (or datagram) has been received.
2385 # If "eor" is None, no checks are done; otherwise, checks
2386 # that:
2387 #
2388 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2389 # set and all bits in msg_flags_non_eor_indicator are unset
2390 #
2391 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2392 # are set and all bits in msg_flags_eor_indicator are unset
2393 #
2394 # If "checkset" and/or "checkunset" are supplied, they require
2395 # the given bits to be set or unset respectively, overriding
2396 # what the attributes require for those bits.
2397 #
2398 # If any bits are set in "ignore", they will not be checked,
2399 # regardless of the other inputs.
2400 #
2401 # Will raise Exception if the inputs require a bit to be both
2402 # set and unset, and it is not ignored.
2403
2404 defaultset = self.msg_flags_common_set
2405 defaultunset = self.msg_flags_common_unset
2406
2407 if eor:
2408 defaultset |= self.msg_flags_eor_indicator
2409 defaultunset |= self.msg_flags_non_eor_indicator
2410 elif eor is not None:
2411 defaultset |= self.msg_flags_non_eor_indicator
2412 defaultunset |= self.msg_flags_eor_indicator
2413
2414 # Function arguments override defaults
2415 defaultset &= ~checkunset
2416 defaultunset &= ~checkset
2417
2418 # Merge arguments with remaining defaults, and check for conflicts
2419 checkset |= defaultset
2420 checkunset |= defaultunset
2421 inboth = checkset & checkunset & ~ignore
2422 if inboth:
2423 raise Exception("contradictory set, unset requirements for flags "
2424 "{0:#x}".format(inboth))
2425
2426 # Compare with given msg_flags value
2427 mask = (checkset | checkunset) & ~ignore
2428 self.assertEqual(flags & mask, checkset & mask)
2429
2430
2431class RecvmsgIntoMixin(SendrecvmsgBase):
2432 # Mixin to implement doRecvmsg() using recvmsg_into().
2433
2434 def doRecvmsg(self, sock, bufsize, *args):
2435 buf = bytearray(bufsize)
2436 result = sock.recvmsg_into([buf], *args)
2437 self.registerRecvmsgResult(result)
2438 self.assertGreaterEqual(result[0], 0)
2439 self.assertLessEqual(result[0], bufsize)
2440 return (bytes(buf[:result[0]]),) + result[1:]
2441
2442
2443class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2444 # Defines flags to be checked in msg_flags for datagram sockets.
2445
2446 @property
2447 def msg_flags_non_eor_indicator(self):
2448 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2449
2450
2451class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2452 # Defines flags to be checked in msg_flags for SCTP sockets.
2453
2454 @property
2455 def msg_flags_eor_indicator(self):
2456 return super().msg_flags_eor_indicator | socket.MSG_EOR
2457
2458
2459class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2460 # Base class for tests on connectionless-mode sockets. Users must
2461 # supply sockets on attributes cli and serv to be mapped to
2462 # cli_sock and serv_sock respectively.
2463
2464 @property
2465 def serv_sock(self):
2466 return self.serv
2467
2468 @property
2469 def cli_sock(self):
2470 return self.cli
2471
2472 @property
2473 def sendmsg_to_server_defaults(self):
2474 return ([], [], 0, self.serv_addr)
2475
2476 def sendToServer(self, msg):
2477 return self.cli_sock.sendto(msg, self.serv_addr)
2478
2479
2480class SendrecvmsgConnectedBase(SendrecvmsgBase):
2481 # Base class for tests on connected sockets. Users must supply
2482 # sockets on attributes serv_conn and cli_conn (representing the
2483 # connections *to* the server and the client), to be mapped to
2484 # cli_sock and serv_sock respectively.
2485
2486 @property
2487 def serv_sock(self):
2488 return self.cli_conn
2489
2490 @property
2491 def cli_sock(self):
2492 return self.serv_conn
2493
2494 def checkRecvmsgAddress(self, addr1, addr2):
2495 # Address is currently "unspecified" for a connected socket,
2496 # so we don't examine it
2497 pass
2498
2499
2500class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2501 # Base class to set a timeout on server's socket.
2502
2503 def setUp(self):
2504 super().setUp()
2505 self.serv_sock.settimeout(self.fail_timeout)
2506
2507
2508class SendmsgTests(SendrecvmsgServerTimeoutBase):
2509 # Tests for sendmsg() which can use any socket type and do not
2510 # involve recvmsg() or recvmsg_into().
2511
2512 def testSendmsg(self):
2513 # Send a simple message with sendmsg().
2514 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2515
2516 def _testSendmsg(self):
2517 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2518
2519 def testSendmsgDataGenerator(self):
2520 # Send from buffer obtained from a generator (not a sequence).
2521 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2522
2523 def _testSendmsgDataGenerator(self):
2524 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2525 len(MSG))
2526
2527 def testSendmsgAncillaryGenerator(self):
2528 # Gather (empty) ancillary data from a generator.
2529 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2530
2531 def _testSendmsgAncillaryGenerator(self):
2532 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2533 len(MSG))
2534
2535 def testSendmsgArray(self):
2536 # Send data from an array instead of the usual bytes object.
2537 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2538
2539 def _testSendmsgArray(self):
2540 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2541 len(MSG))
2542
2543 def testSendmsgGather(self):
2544 # Send message data from more than one buffer (gather write).
2545 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2546
2547 def _testSendmsgGather(self):
2548 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2549
2550 def testSendmsgBadArgs(self):
2551 # Check that sendmsg() rejects invalid arguments.
2552 self.assertEqual(self.serv_sock.recv(1000), b"done")
2553
2554 def _testSendmsgBadArgs(self):
2555 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2556 self.assertRaises(TypeError, self.sendmsgToServer,
2557 b"not in an iterable")
2558 self.assertRaises(TypeError, self.sendmsgToServer,
2559 object())
2560 self.assertRaises(TypeError, self.sendmsgToServer,
2561 [object()])
2562 self.assertRaises(TypeError, self.sendmsgToServer,
2563 [MSG, object()])
2564 self.assertRaises(TypeError, self.sendmsgToServer,
2565 [MSG], object())
2566 self.assertRaises(TypeError, self.sendmsgToServer,
2567 [MSG], [], object())
2568 self.assertRaises(TypeError, self.sendmsgToServer,
2569 [MSG], [], 0, object())
2570 self.sendToServer(b"done")
2571
2572 def testSendmsgBadCmsg(self):
2573 # Check that invalid ancillary data items are rejected.
2574 self.assertEqual(self.serv_sock.recv(1000), b"done")
2575
2576 def _testSendmsgBadCmsg(self):
2577 self.assertRaises(TypeError, self.sendmsgToServer,
2578 [MSG], [object()])
2579 self.assertRaises(TypeError, self.sendmsgToServer,
2580 [MSG], [(object(), 0, b"data")])
2581 self.assertRaises(TypeError, self.sendmsgToServer,
2582 [MSG], [(0, object(), b"data")])
2583 self.assertRaises(TypeError, self.sendmsgToServer,
2584 [MSG], [(0, 0, object())])
2585 self.assertRaises(TypeError, self.sendmsgToServer,
2586 [MSG], [(0, 0)])
2587 self.assertRaises(TypeError, self.sendmsgToServer,
2588 [MSG], [(0, 0, b"data", 42)])
2589 self.sendToServer(b"done")
2590
2591 @requireAttrs(socket, "CMSG_SPACE")
2592 def testSendmsgBadMultiCmsg(self):
2593 # Check that invalid ancillary data items are rejected when
2594 # more than one item is present.
2595 self.assertEqual(self.serv_sock.recv(1000), b"done")
2596
2597 @testSendmsgBadMultiCmsg.client_skip
2598 def _testSendmsgBadMultiCmsg(self):
2599 self.assertRaises(TypeError, self.sendmsgToServer,
2600 [MSG], [0, 0, b""])
2601 self.assertRaises(TypeError, self.sendmsgToServer,
2602 [MSG], [(0, 0, b""), object()])
2603 self.sendToServer(b"done")
2604
2605 def testSendmsgExcessCmsgReject(self):
2606 # Check that sendmsg() rejects excess ancillary data items
2607 # when the number that can be sent is limited.
2608 self.assertEqual(self.serv_sock.recv(1000), b"done")
2609
2610 def _testSendmsgExcessCmsgReject(self):
2611 if not hasattr(socket, "CMSG_SPACE"):
2612 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002613 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002614 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2615 self.assertIsNone(cm.exception.errno)
2616 self.sendToServer(b"done")
2617
2618 def testSendmsgAfterClose(self):
2619 # Check that sendmsg() fails on a closed socket.
2620 pass
2621
2622 def _testSendmsgAfterClose(self):
2623 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002624 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002625
2626
2627class SendmsgStreamTests(SendmsgTests):
2628 # Tests for sendmsg() which require a stream socket and do not
2629 # involve recvmsg() or recvmsg_into().
2630
2631 def testSendmsgExplicitNoneAddr(self):
2632 # Check that peer address can be specified as None.
2633 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2634
2635 def _testSendmsgExplicitNoneAddr(self):
2636 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2637
2638 def testSendmsgTimeout(self):
2639 # Check that timeout works with sendmsg().
2640 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2641 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2642
2643 def _testSendmsgTimeout(self):
2644 try:
2645 self.cli_sock.settimeout(0.03)
2646 with self.assertRaises(socket.timeout):
2647 while True:
2648 self.sendmsgToServer([b"a"*512])
2649 finally:
2650 self.misc_event.set()
2651
2652 # XXX: would be nice to have more tests for sendmsg flags argument.
2653
2654 # Linux supports MSG_DONTWAIT when sending, but in general, it
2655 # only works when receiving. Could add other platforms if they
2656 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002657 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002658 "MSG_DONTWAIT not known to work on this platform when "
2659 "sending")
2660 def testSendmsgDontWait(self):
2661 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2662 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2663 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2664
2665 @testSendmsgDontWait.client_skip
2666 def _testSendmsgDontWait(self):
2667 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002668 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002669 while True:
2670 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2671 self.assertIn(cm.exception.errno,
2672 (errno.EAGAIN, errno.EWOULDBLOCK))
2673 finally:
2674 self.misc_event.set()
2675
2676
2677class SendmsgConnectionlessTests(SendmsgTests):
2678 # Tests for sendmsg() which require a connectionless-mode
2679 # (e.g. datagram) socket, and do not involve recvmsg() or
2680 # recvmsg_into().
2681
2682 def testSendmsgNoDestAddr(self):
2683 # Check that sendmsg() fails when no destination address is
2684 # given for unconnected socket.
2685 pass
2686
2687 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002688 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002689 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002690 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002691 [MSG], [], 0, None)
2692
2693
2694class RecvmsgGenericTests(SendrecvmsgBase):
2695 # Tests for recvmsg() which can also be emulated using
2696 # recvmsg_into(), and can use any socket type.
2697
2698 def testRecvmsg(self):
2699 # Receive a simple message with recvmsg[_into]().
2700 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2701 self.assertEqual(msg, MSG)
2702 self.checkRecvmsgAddress(addr, self.cli_addr)
2703 self.assertEqual(ancdata, [])
2704 self.checkFlags(flags, eor=True)
2705
2706 def _testRecvmsg(self):
2707 self.sendToServer(MSG)
2708
2709 def testRecvmsgExplicitDefaults(self):
2710 # Test recvmsg[_into]() with default arguments provided explicitly.
2711 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2712 len(MSG), 0, 0)
2713 self.assertEqual(msg, MSG)
2714 self.checkRecvmsgAddress(addr, self.cli_addr)
2715 self.assertEqual(ancdata, [])
2716 self.checkFlags(flags, eor=True)
2717
2718 def _testRecvmsgExplicitDefaults(self):
2719 self.sendToServer(MSG)
2720
2721 def testRecvmsgShorter(self):
2722 # Receive a message smaller than buffer.
2723 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2724 len(MSG) + 42)
2725 self.assertEqual(msg, MSG)
2726 self.checkRecvmsgAddress(addr, self.cli_addr)
2727 self.assertEqual(ancdata, [])
2728 self.checkFlags(flags, eor=True)
2729
2730 def _testRecvmsgShorter(self):
2731 self.sendToServer(MSG)
2732
2733 def testRecvmsgTrunc(self):
2734 # Receive part of message, check for truncation indicators.
2735 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2736 len(MSG) - 3)
2737 self.assertEqual(msg, MSG[:-3])
2738 self.checkRecvmsgAddress(addr, self.cli_addr)
2739 self.assertEqual(ancdata, [])
2740 self.checkFlags(flags, eor=False)
2741
2742 def _testRecvmsgTrunc(self):
2743 self.sendToServer(MSG)
2744
2745 def testRecvmsgShortAncillaryBuf(self):
2746 # Test ancillary data buffer too small to hold any ancillary data.
2747 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2748 len(MSG), 1)
2749 self.assertEqual(msg, MSG)
2750 self.checkRecvmsgAddress(addr, self.cli_addr)
2751 self.assertEqual(ancdata, [])
2752 self.checkFlags(flags, eor=True)
2753
2754 def _testRecvmsgShortAncillaryBuf(self):
2755 self.sendToServer(MSG)
2756
2757 def testRecvmsgLongAncillaryBuf(self):
2758 # Test large ancillary data buffer.
2759 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2760 len(MSG), 10240)
2761 self.assertEqual(msg, MSG)
2762 self.checkRecvmsgAddress(addr, self.cli_addr)
2763 self.assertEqual(ancdata, [])
2764 self.checkFlags(flags, eor=True)
2765
2766 def _testRecvmsgLongAncillaryBuf(self):
2767 self.sendToServer(MSG)
2768
2769 def testRecvmsgAfterClose(self):
2770 # Check that recvmsg[_into]() fails on a closed socket.
2771 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002772 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002773
2774 def _testRecvmsgAfterClose(self):
2775 pass
2776
2777 def testRecvmsgTimeout(self):
2778 # Check that timeout works.
2779 try:
2780 self.serv_sock.settimeout(0.03)
2781 self.assertRaises(socket.timeout,
2782 self.doRecvmsg, self.serv_sock, len(MSG))
2783 finally:
2784 self.misc_event.set()
2785
2786 def _testRecvmsgTimeout(self):
2787 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2788
2789 @requireAttrs(socket, "MSG_PEEK")
2790 def testRecvmsgPeek(self):
2791 # Check that MSG_PEEK in flags enables examination of pending
2792 # data without consuming it.
2793
2794 # Receive part of data with MSG_PEEK.
2795 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2796 len(MSG) - 3, 0,
2797 socket.MSG_PEEK)
2798 self.assertEqual(msg, MSG[:-3])
2799 self.checkRecvmsgAddress(addr, self.cli_addr)
2800 self.assertEqual(ancdata, [])
2801 # Ignoring MSG_TRUNC here (so this test is the same for stream
2802 # and datagram sockets). Some wording in POSIX seems to
2803 # suggest that it needn't be set when peeking, but that may
2804 # just be a slip.
2805 self.checkFlags(flags, eor=False,
2806 ignore=getattr(socket, "MSG_TRUNC", 0))
2807
2808 # Receive all data with MSG_PEEK.
2809 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2810 len(MSG), 0,
2811 socket.MSG_PEEK)
2812 self.assertEqual(msg, MSG)
2813 self.checkRecvmsgAddress(addr, self.cli_addr)
2814 self.assertEqual(ancdata, [])
2815 self.checkFlags(flags, eor=True)
2816
2817 # Check that the same data can still be received normally.
2818 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2819 self.assertEqual(msg, MSG)
2820 self.checkRecvmsgAddress(addr, self.cli_addr)
2821 self.assertEqual(ancdata, [])
2822 self.checkFlags(flags, eor=True)
2823
2824 @testRecvmsgPeek.client_skip
2825 def _testRecvmsgPeek(self):
2826 self.sendToServer(MSG)
2827
2828 @requireAttrs(socket.socket, "sendmsg")
2829 def testRecvmsgFromSendmsg(self):
2830 # Test receiving with recvmsg[_into]() when message is sent
2831 # using sendmsg().
2832 self.serv_sock.settimeout(self.fail_timeout)
2833 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2834 self.assertEqual(msg, MSG)
2835 self.checkRecvmsgAddress(addr, self.cli_addr)
2836 self.assertEqual(ancdata, [])
2837 self.checkFlags(flags, eor=True)
2838
2839 @testRecvmsgFromSendmsg.client_skip
2840 def _testRecvmsgFromSendmsg(self):
2841 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2842
2843
2844class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2845 # Tests which require a stream socket and can use either recvmsg()
2846 # or recvmsg_into().
2847
2848 def testRecvmsgEOF(self):
2849 # Receive end-of-stream indicator (b"", peer socket closed).
2850 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2851 self.assertEqual(msg, b"")
2852 self.checkRecvmsgAddress(addr, self.cli_addr)
2853 self.assertEqual(ancdata, [])
2854 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2855
2856 def _testRecvmsgEOF(self):
2857 self.cli_sock.close()
2858
2859 def testRecvmsgOverflow(self):
2860 # Receive a message in more than one chunk.
2861 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2862 len(MSG) - 3)
2863 self.checkRecvmsgAddress(addr, self.cli_addr)
2864 self.assertEqual(ancdata, [])
2865 self.checkFlags(flags, eor=False)
2866
2867 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2868 self.checkRecvmsgAddress(addr, self.cli_addr)
2869 self.assertEqual(ancdata, [])
2870 self.checkFlags(flags, eor=True)
2871
2872 msg = seg1 + seg2
2873 self.assertEqual(msg, MSG)
2874
2875 def _testRecvmsgOverflow(self):
2876 self.sendToServer(MSG)
2877
2878
2879class RecvmsgTests(RecvmsgGenericTests):
2880 # Tests for recvmsg() which can use any socket type.
2881
2882 def testRecvmsgBadArgs(self):
2883 # Check that recvmsg() rejects invalid arguments.
2884 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2885 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2886 -1, 0, 0)
2887 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2888 len(MSG), -1, 0)
2889 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2890 [bytearray(10)], 0, 0)
2891 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2892 object(), 0, 0)
2893 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2894 len(MSG), object(), 0)
2895 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2896 len(MSG), 0, object())
2897
2898 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2899 self.assertEqual(msg, MSG)
2900 self.checkRecvmsgAddress(addr, self.cli_addr)
2901 self.assertEqual(ancdata, [])
2902 self.checkFlags(flags, eor=True)
2903
2904 def _testRecvmsgBadArgs(self):
2905 self.sendToServer(MSG)
2906
2907
2908class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2909 # Tests for recvmsg_into() which can use any socket type.
2910
2911 def testRecvmsgIntoBadArgs(self):
2912 # Check that recvmsg_into() rejects invalid arguments.
2913 buf = bytearray(len(MSG))
2914 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2915 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2916 len(MSG), 0, 0)
2917 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2918 buf, 0, 0)
2919 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2920 [object()], 0, 0)
2921 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2922 [b"I'm not writable"], 0, 0)
2923 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2924 [buf, object()], 0, 0)
2925 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2926 [buf], -1, 0)
2927 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2928 [buf], object(), 0)
2929 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2930 [buf], 0, object())
2931
2932 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2933 self.assertEqual(nbytes, len(MSG))
2934 self.assertEqual(buf, bytearray(MSG))
2935 self.checkRecvmsgAddress(addr, self.cli_addr)
2936 self.assertEqual(ancdata, [])
2937 self.checkFlags(flags, eor=True)
2938
2939 def _testRecvmsgIntoBadArgs(self):
2940 self.sendToServer(MSG)
2941
2942 def testRecvmsgIntoGenerator(self):
2943 # Receive into buffer obtained from a generator (not a sequence).
2944 buf = bytearray(len(MSG))
2945 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2946 (o for o in [buf]))
2947 self.assertEqual(nbytes, len(MSG))
2948 self.assertEqual(buf, bytearray(MSG))
2949 self.checkRecvmsgAddress(addr, self.cli_addr)
2950 self.assertEqual(ancdata, [])
2951 self.checkFlags(flags, eor=True)
2952
2953 def _testRecvmsgIntoGenerator(self):
2954 self.sendToServer(MSG)
2955
2956 def testRecvmsgIntoArray(self):
2957 # Receive into an array rather than the usual bytearray.
2958 buf = array.array("B", [0] * len(MSG))
2959 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2960 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002961 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002962 self.checkRecvmsgAddress(addr, self.cli_addr)
2963 self.assertEqual(ancdata, [])
2964 self.checkFlags(flags, eor=True)
2965
2966 def _testRecvmsgIntoArray(self):
2967 self.sendToServer(MSG)
2968
2969 def testRecvmsgIntoScatter(self):
2970 # Receive into multiple buffers (scatter write).
2971 b1 = bytearray(b"----")
2972 b2 = bytearray(b"0123456789")
2973 b3 = bytearray(b"--------------")
2974 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2975 [b1, memoryview(b2)[2:9], b3])
2976 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2977 self.assertEqual(b1, bytearray(b"Mary"))
2978 self.assertEqual(b2, bytearray(b"01 had a 9"))
2979 self.assertEqual(b3, bytearray(b"little lamb---"))
2980 self.checkRecvmsgAddress(addr, self.cli_addr)
2981 self.assertEqual(ancdata, [])
2982 self.checkFlags(flags, eor=True)
2983
2984 def _testRecvmsgIntoScatter(self):
2985 self.sendToServer(b"Mary had a little lamb")
2986
2987
2988class CmsgMacroTests(unittest.TestCase):
2989 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2990 # assumptions used by sendmsg() and recvmsg[_into](), which share
2991 # code with these functions.
2992
2993 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002994 try:
2995 import _testcapi
2996 except ImportError:
2997 socklen_t_limit = 0x7fffffff
2998 else:
2999 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003000
3001 @requireAttrs(socket, "CMSG_LEN")
3002 def testCMSG_LEN(self):
3003 # Test CMSG_LEN() with various valid and invalid values,
3004 # checking the assumptions used by recvmsg() and sendmsg().
3005 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3006 values = list(range(257)) + list(range(toobig - 257, toobig))
3007
3008 # struct cmsghdr has at least three members, two of which are ints
3009 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3010 for n in values:
3011 ret = socket.CMSG_LEN(n)
3012 # This is how recvmsg() calculates the data size
3013 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3014 self.assertLessEqual(ret, self.socklen_t_limit)
3015
3016 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3017 # sendmsg() shares code with these functions, and requires
3018 # that it reject values over the limit.
3019 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3020 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3021
3022 @requireAttrs(socket, "CMSG_SPACE")
3023 def testCMSG_SPACE(self):
3024 # Test CMSG_SPACE() with various valid and invalid values,
3025 # checking the assumptions used by sendmsg().
3026 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3027 values = list(range(257)) + list(range(toobig - 257, toobig))
3028
3029 last = socket.CMSG_SPACE(0)
3030 # struct cmsghdr has at least three members, two of which are ints
3031 self.assertGreater(last, array.array("i").itemsize * 2)
3032 for n in values:
3033 ret = socket.CMSG_SPACE(n)
3034 self.assertGreaterEqual(ret, last)
3035 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3036 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3037 self.assertLessEqual(ret, self.socklen_t_limit)
3038 last = ret
3039
3040 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3041 # sendmsg() shares code with these functions, and requires
3042 # that it reject values over the limit.
3043 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3044 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3045
3046
3047class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3048 # Tests for file descriptor passing on Unix-domain sockets.
3049
3050 # Invalid file descriptor value that's unlikely to evaluate to a
3051 # real FD even if one of its bytes is replaced with a different
3052 # value (which shouldn't actually happen).
3053 badfd = -0x5555
3054
3055 def newFDs(self, n):
3056 # Return a list of n file descriptors for newly-created files
3057 # containing their list indices as ASCII numbers.
3058 fds = []
3059 for i in range(n):
3060 fd, path = tempfile.mkstemp()
3061 self.addCleanup(os.unlink, path)
3062 self.addCleanup(os.close, fd)
3063 os.write(fd, str(i).encode())
3064 fds.append(fd)
3065 return fds
3066
3067 def checkFDs(self, fds):
3068 # Check that the file descriptors in the given list contain
3069 # their correct list indices as ASCII numbers.
3070 for n, fd in enumerate(fds):
3071 os.lseek(fd, 0, os.SEEK_SET)
3072 self.assertEqual(os.read(fd, 1024), str(n).encode())
3073
3074 def registerRecvmsgResult(self, result):
3075 self.addCleanup(self.closeRecvmsgFDs, result)
3076
3077 def closeRecvmsgFDs(self, recvmsg_result):
3078 # Close all file descriptors specified in the ancillary data
3079 # of the given return value from recvmsg() or recvmsg_into().
3080 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3081 if (cmsg_level == socket.SOL_SOCKET and
3082 cmsg_type == socket.SCM_RIGHTS):
3083 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003084 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003085 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3086 for fd in fds:
3087 os.close(fd)
3088
3089 def createAndSendFDs(self, n):
3090 # Send n new file descriptors created by newFDs() to the
3091 # server, with the constant MSG as the non-ancillary data.
3092 self.assertEqual(
3093 self.sendmsgToServer([MSG],
3094 [(socket.SOL_SOCKET,
3095 socket.SCM_RIGHTS,
3096 array.array("i", self.newFDs(n)))]),
3097 len(MSG))
3098
3099 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3100 # Check that constant MSG was received with numfds file
3101 # descriptors in a maximum of maxcmsgs control messages (which
3102 # must contain only complete integers). By default, check
3103 # that MSG_CTRUNC is unset, but ignore any flags in
3104 # ignoreflags.
3105 msg, ancdata, flags, addr = result
3106 self.assertEqual(msg, MSG)
3107 self.checkRecvmsgAddress(addr, self.cli_addr)
3108 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3109 ignore=ignoreflags)
3110
3111 self.assertIsInstance(ancdata, list)
3112 self.assertLessEqual(len(ancdata), maxcmsgs)
3113 fds = array.array("i")
3114 for item in ancdata:
3115 self.assertIsInstance(item, tuple)
3116 cmsg_level, cmsg_type, cmsg_data = item
3117 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3118 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3119 self.assertIsInstance(cmsg_data, bytes)
3120 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003121 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003122
3123 self.assertEqual(len(fds), numfds)
3124 self.checkFDs(fds)
3125
3126 def testFDPassSimple(self):
3127 # Pass a single FD (array read from bytes object).
3128 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3129 len(MSG), 10240))
3130
3131 def _testFDPassSimple(self):
3132 self.assertEqual(
3133 self.sendmsgToServer(
3134 [MSG],
3135 [(socket.SOL_SOCKET,
3136 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003137 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003138 len(MSG))
3139
3140 def testMultipleFDPass(self):
3141 # Pass multiple FDs in a single array.
3142 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3143 len(MSG), 10240))
3144
3145 def _testMultipleFDPass(self):
3146 self.createAndSendFDs(4)
3147
3148 @requireAttrs(socket, "CMSG_SPACE")
3149 def testFDPassCMSG_SPACE(self):
3150 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3151 self.checkRecvmsgFDs(
3152 4, self.doRecvmsg(self.serv_sock, len(MSG),
3153 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3154
3155 @testFDPassCMSG_SPACE.client_skip
3156 def _testFDPassCMSG_SPACE(self):
3157 self.createAndSendFDs(4)
3158
3159 def testFDPassCMSG_LEN(self):
3160 # Test using CMSG_LEN() to calculate ancillary buffer size.
3161 self.checkRecvmsgFDs(1,
3162 self.doRecvmsg(self.serv_sock, len(MSG),
3163 socket.CMSG_LEN(4 * SIZEOF_INT)),
3164 # RFC 3542 says implementations may set
3165 # MSG_CTRUNC if there isn't enough space
3166 # for trailing padding.
3167 ignoreflags=socket.MSG_CTRUNC)
3168
3169 def _testFDPassCMSG_LEN(self):
3170 self.createAndSendFDs(1)
3171
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003172 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003173 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003174 @requireAttrs(socket, "CMSG_SPACE")
3175 def testFDPassSeparate(self):
3176 # Pass two FDs in two separate arrays. Arrays may be combined
3177 # into a single control message by the OS.
3178 self.checkRecvmsgFDs(2,
3179 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3180 maxcmsgs=2)
3181
3182 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003183 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003184 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003185 def _testFDPassSeparate(self):
3186 fd0, fd1 = self.newFDs(2)
3187 self.assertEqual(
3188 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3189 socket.SCM_RIGHTS,
3190 array.array("i", [fd0])),
3191 (socket.SOL_SOCKET,
3192 socket.SCM_RIGHTS,
3193 array.array("i", [fd1]))]),
3194 len(MSG))
3195
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003196 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003197 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003198 @requireAttrs(socket, "CMSG_SPACE")
3199 def testFDPassSeparateMinSpace(self):
3200 # Pass two FDs in two separate arrays, receiving them into the
3201 # minimum space for two arrays.
3202 self.checkRecvmsgFDs(2,
3203 self.doRecvmsg(self.serv_sock, len(MSG),
3204 socket.CMSG_SPACE(SIZEOF_INT) +
3205 socket.CMSG_LEN(SIZEOF_INT)),
3206 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3207
3208 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003209 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003210 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003211 def _testFDPassSeparateMinSpace(self):
3212 fd0, fd1 = self.newFDs(2)
3213 self.assertEqual(
3214 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3215 socket.SCM_RIGHTS,
3216 array.array("i", [fd0])),
3217 (socket.SOL_SOCKET,
3218 socket.SCM_RIGHTS,
3219 array.array("i", [fd1]))]),
3220 len(MSG))
3221
3222 def sendAncillaryIfPossible(self, msg, ancdata):
3223 # Try to send msg and ancdata to server, but if the system
3224 # call fails, just send msg with no ancillary data.
3225 try:
3226 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003227 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003228 # Check that it was the system call that failed
3229 self.assertIsInstance(e.errno, int)
3230 nbytes = self.sendmsgToServer([msg])
3231 self.assertEqual(nbytes, len(msg))
3232
Brett Cannon3bbad122015-12-28 17:21:44 -08003233 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003234 def testFDPassEmpty(self):
3235 # Try to pass an empty FD array. Can receive either no array
3236 # or an empty array.
3237 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3238 len(MSG), 10240),
3239 ignoreflags=socket.MSG_CTRUNC)
3240
3241 def _testFDPassEmpty(self):
3242 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3243 socket.SCM_RIGHTS,
3244 b"")])
3245
3246 def testFDPassPartialInt(self):
3247 # Try to pass a truncated FD array.
3248 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3249 len(MSG), 10240)
3250 self.assertEqual(msg, MSG)
3251 self.checkRecvmsgAddress(addr, self.cli_addr)
3252 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3253 self.assertLessEqual(len(ancdata), 1)
3254 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3255 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3256 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3257 self.assertLess(len(cmsg_data), SIZEOF_INT)
3258
3259 def _testFDPassPartialInt(self):
3260 self.sendAncillaryIfPossible(
3261 MSG,
3262 [(socket.SOL_SOCKET,
3263 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003264 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003265
3266 @requireAttrs(socket, "CMSG_SPACE")
3267 def testFDPassPartialIntInMiddle(self):
3268 # Try to pass two FD arrays, the first of which is truncated.
3269 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3270 len(MSG), 10240)
3271 self.assertEqual(msg, MSG)
3272 self.checkRecvmsgAddress(addr, self.cli_addr)
3273 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3274 self.assertLessEqual(len(ancdata), 2)
3275 fds = array.array("i")
3276 # Arrays may have been combined in a single control message
3277 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3278 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3279 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003280 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003281 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3282 self.assertLessEqual(len(fds), 2)
3283 self.checkFDs(fds)
3284
3285 @testFDPassPartialIntInMiddle.client_skip
3286 def _testFDPassPartialIntInMiddle(self):
3287 fd0, fd1 = self.newFDs(2)
3288 self.sendAncillaryIfPossible(
3289 MSG,
3290 [(socket.SOL_SOCKET,
3291 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003292 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003293 (socket.SOL_SOCKET,
3294 socket.SCM_RIGHTS,
3295 array.array("i", [fd1]))])
3296
3297 def checkTruncatedHeader(self, result, ignoreflags=0):
3298 # Check that no ancillary data items are returned when data is
3299 # truncated inside the cmsghdr structure.
3300 msg, ancdata, flags, addr = result
3301 self.assertEqual(msg, MSG)
3302 self.checkRecvmsgAddress(addr, self.cli_addr)
3303 self.assertEqual(ancdata, [])
3304 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3305 ignore=ignoreflags)
3306
3307 def testCmsgTruncNoBufSize(self):
3308 # Check that no ancillary data is received when no buffer size
3309 # is specified.
3310 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3311 # BSD seems to set MSG_CTRUNC only
3312 # if an item has been partially
3313 # received.
3314 ignoreflags=socket.MSG_CTRUNC)
3315
3316 def _testCmsgTruncNoBufSize(self):
3317 self.createAndSendFDs(1)
3318
3319 def testCmsgTrunc0(self):
3320 # Check that no ancillary data is received when buffer size is 0.
3321 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3322 ignoreflags=socket.MSG_CTRUNC)
3323
3324 def _testCmsgTrunc0(self):
3325 self.createAndSendFDs(1)
3326
3327 # Check that no ancillary data is returned for various non-zero
3328 # (but still too small) buffer sizes.
3329
3330 def testCmsgTrunc1(self):
3331 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3332
3333 def _testCmsgTrunc1(self):
3334 self.createAndSendFDs(1)
3335
3336 def testCmsgTrunc2Int(self):
3337 # The cmsghdr structure has at least three members, two of
3338 # which are ints, so we still shouldn't see any ancillary
3339 # data.
3340 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3341 SIZEOF_INT * 2))
3342
3343 def _testCmsgTrunc2Int(self):
3344 self.createAndSendFDs(1)
3345
3346 def testCmsgTruncLen0Minus1(self):
3347 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3348 socket.CMSG_LEN(0) - 1))
3349
3350 def _testCmsgTruncLen0Minus1(self):
3351 self.createAndSendFDs(1)
3352
3353 # The following tests try to truncate the control message in the
3354 # middle of the FD array.
3355
3356 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3357 # Check that file descriptor data is truncated to between
3358 # mindata and maxdata bytes when received with buffer size
3359 # ancbuf, and that any complete file descriptor numbers are
3360 # valid.
3361 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3362 len(MSG), ancbuf)
3363 self.assertEqual(msg, MSG)
3364 self.checkRecvmsgAddress(addr, self.cli_addr)
3365 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3366
3367 if mindata == 0 and ancdata == []:
3368 return
3369 self.assertEqual(len(ancdata), 1)
3370 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3371 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3372 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3373 self.assertGreaterEqual(len(cmsg_data), mindata)
3374 self.assertLessEqual(len(cmsg_data), maxdata)
3375 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003376 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003377 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3378 self.checkFDs(fds)
3379
3380 def testCmsgTruncLen0(self):
3381 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3382
3383 def _testCmsgTruncLen0(self):
3384 self.createAndSendFDs(1)
3385
3386 def testCmsgTruncLen0Plus1(self):
3387 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3388
3389 def _testCmsgTruncLen0Plus1(self):
3390 self.createAndSendFDs(2)
3391
3392 def testCmsgTruncLen1(self):
3393 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3394 maxdata=SIZEOF_INT)
3395
3396 def _testCmsgTruncLen1(self):
3397 self.createAndSendFDs(2)
3398
3399 def testCmsgTruncLen2Minus1(self):
3400 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3401 maxdata=(2 * SIZEOF_INT) - 1)
3402
3403 def _testCmsgTruncLen2Minus1(self):
3404 self.createAndSendFDs(2)
3405
3406
3407class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3408 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3409 # features of the RFC 3542 Advanced Sockets API for IPv6.
3410 # Currently we can only handle certain data items (e.g. traffic
3411 # class, hop limit, MTU discovery and fragmentation settings)
3412 # without resorting to unportable means such as the struct module,
3413 # but the tests here are aimed at testing the ancillary data
3414 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3415 # itself.
3416
3417 # Test value to use when setting hop limit of packet
3418 hop_limit = 2
3419
3420 # Test value to use when setting traffic class of packet.
3421 # -1 means "use kernel default".
3422 traffic_class = -1
3423
3424 def ancillaryMapping(self, ancdata):
3425 # Given ancillary data list ancdata, return a mapping from
3426 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3427 # Check that no (level, type) pair appears more than once.
3428 d = {}
3429 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3430 self.assertNotIn((cmsg_level, cmsg_type), d)
3431 d[(cmsg_level, cmsg_type)] = cmsg_data
3432 return d
3433
3434 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3435 # Receive hop limit into ancbufsize bytes of ancillary data
3436 # space. Check that data is MSG, ancillary data is not
3437 # truncated (but ignore any flags in ignoreflags), and hop
3438 # limit is between 0 and maxhop inclusive.
3439 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3440 socket.IPV6_RECVHOPLIMIT, 1)
3441 self.misc_event.set()
3442 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3443 len(MSG), ancbufsize)
3444
3445 self.assertEqual(msg, MSG)
3446 self.checkRecvmsgAddress(addr, self.cli_addr)
3447 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3448 ignore=ignoreflags)
3449
3450 self.assertEqual(len(ancdata), 1)
3451 self.assertIsInstance(ancdata[0], tuple)
3452 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3453 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3454 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3455 self.assertIsInstance(cmsg_data, bytes)
3456 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3457 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003458 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003459 self.assertGreaterEqual(a[0], 0)
3460 self.assertLessEqual(a[0], maxhop)
3461
3462 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3463 def testRecvHopLimit(self):
3464 # Test receiving the packet hop limit as ancillary data.
3465 self.checkHopLimit(ancbufsize=10240)
3466
3467 @testRecvHopLimit.client_skip
3468 def _testRecvHopLimit(self):
3469 # Need to wait until server has asked to receive ancillary
3470 # data, as implementations are not required to buffer it
3471 # otherwise.
3472 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3473 self.sendToServer(MSG)
3474
3475 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3476 def testRecvHopLimitCMSG_SPACE(self):
3477 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3478 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3479
3480 @testRecvHopLimitCMSG_SPACE.client_skip
3481 def _testRecvHopLimitCMSG_SPACE(self):
3482 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3483 self.sendToServer(MSG)
3484
3485 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3486 # 3542 says portable applications must provide space for trailing
3487 # padding. Implementations may set MSG_CTRUNC if there isn't
3488 # enough space for the padding.
3489
3490 @requireAttrs(socket.socket, "sendmsg")
3491 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3492 def testSetHopLimit(self):
3493 # Test setting hop limit on outgoing packet and receiving it
3494 # at the other end.
3495 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3496
3497 @testSetHopLimit.client_skip
3498 def _testSetHopLimit(self):
3499 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3500 self.assertEqual(
3501 self.sendmsgToServer([MSG],
3502 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3503 array.array("i", [self.hop_limit]))]),
3504 len(MSG))
3505
3506 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3507 ignoreflags=0):
3508 # Receive traffic class and hop limit into ancbufsize bytes of
3509 # ancillary data space. Check that data is MSG, ancillary
3510 # data is not truncated (but ignore any flags in ignoreflags),
3511 # and traffic class and hop limit are in range (hop limit no
3512 # more than maxhop).
3513 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3514 socket.IPV6_RECVHOPLIMIT, 1)
3515 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3516 socket.IPV6_RECVTCLASS, 1)
3517 self.misc_event.set()
3518 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3519 len(MSG), ancbufsize)
3520
3521 self.assertEqual(msg, MSG)
3522 self.checkRecvmsgAddress(addr, self.cli_addr)
3523 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3524 ignore=ignoreflags)
3525 self.assertEqual(len(ancdata), 2)
3526 ancmap = self.ancillaryMapping(ancdata)
3527
3528 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3529 self.assertEqual(len(tcdata), SIZEOF_INT)
3530 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003531 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003532 self.assertGreaterEqual(a[0], 0)
3533 self.assertLessEqual(a[0], 255)
3534
3535 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3536 self.assertEqual(len(hldata), SIZEOF_INT)
3537 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003538 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003539 self.assertGreaterEqual(a[0], 0)
3540 self.assertLessEqual(a[0], maxhop)
3541
3542 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3543 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3544 def testRecvTrafficClassAndHopLimit(self):
3545 # Test receiving traffic class and hop limit as ancillary data.
3546 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3547
3548 @testRecvTrafficClassAndHopLimit.client_skip
3549 def _testRecvTrafficClassAndHopLimit(self):
3550 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3551 self.sendToServer(MSG)
3552
3553 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3554 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3555 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3556 # Test receiving traffic class and hop limit, using
3557 # CMSG_SPACE() to calculate buffer size.
3558 self.checkTrafficClassAndHopLimit(
3559 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3560
3561 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3562 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3563 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3564 self.sendToServer(MSG)
3565
3566 @requireAttrs(socket.socket, "sendmsg")
3567 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3568 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3569 def testSetTrafficClassAndHopLimit(self):
3570 # Test setting traffic class and hop limit on outgoing packet,
3571 # and receiving them at the other end.
3572 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3573 maxhop=self.hop_limit)
3574
3575 @testSetTrafficClassAndHopLimit.client_skip
3576 def _testSetTrafficClassAndHopLimit(self):
3577 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3578 self.assertEqual(
3579 self.sendmsgToServer([MSG],
3580 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3581 array.array("i", [self.traffic_class])),
3582 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3583 array.array("i", [self.hop_limit]))]),
3584 len(MSG))
3585
3586 @requireAttrs(socket.socket, "sendmsg")
3587 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3588 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3589 def testOddCmsgSize(self):
3590 # Try to send ancillary data with first item one byte too
3591 # long. Fall back to sending with correct size if this fails,
3592 # and check that second item was handled correctly.
3593 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3594 maxhop=self.hop_limit)
3595
3596 @testOddCmsgSize.client_skip
3597 def _testOddCmsgSize(self):
3598 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3599 try:
3600 nbytes = self.sendmsgToServer(
3601 [MSG],
3602 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003603 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003604 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3605 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003606 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003607 self.assertIsInstance(e.errno, int)
3608 nbytes = self.sendmsgToServer(
3609 [MSG],
3610 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3611 array.array("i", [self.traffic_class])),
3612 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3613 array.array("i", [self.hop_limit]))])
3614 self.assertEqual(nbytes, len(MSG))
3615
3616 # Tests for proper handling of truncated ancillary data
3617
3618 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3619 # Receive hop limit into ancbufsize bytes of ancillary data
3620 # space, which should be too small to contain the ancillary
3621 # data header (if ancbufsize is None, pass no second argument
3622 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3623 # (unless included in ignoreflags), and no ancillary data is
3624 # returned.
3625 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3626 socket.IPV6_RECVHOPLIMIT, 1)
3627 self.misc_event.set()
3628 args = () if ancbufsize is None else (ancbufsize,)
3629 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3630 len(MSG), *args)
3631
3632 self.assertEqual(msg, MSG)
3633 self.checkRecvmsgAddress(addr, self.cli_addr)
3634 self.assertEqual(ancdata, [])
3635 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3636 ignore=ignoreflags)
3637
3638 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3639 def testCmsgTruncNoBufSize(self):
3640 # Check that no ancillary data is received when no ancillary
3641 # buffer size is provided.
3642 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3643 # BSD seems to set
3644 # MSG_CTRUNC only if an item
3645 # has been partially
3646 # received.
3647 ignoreflags=socket.MSG_CTRUNC)
3648
3649 @testCmsgTruncNoBufSize.client_skip
3650 def _testCmsgTruncNoBufSize(self):
3651 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3652 self.sendToServer(MSG)
3653
3654 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3655 def testSingleCmsgTrunc0(self):
3656 # Check that no ancillary data is received when ancillary
3657 # buffer size is zero.
3658 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3659 ignoreflags=socket.MSG_CTRUNC)
3660
3661 @testSingleCmsgTrunc0.client_skip
3662 def _testSingleCmsgTrunc0(self):
3663 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3664 self.sendToServer(MSG)
3665
3666 # Check that no ancillary data is returned for various non-zero
3667 # (but still too small) buffer sizes.
3668
3669 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3670 def testSingleCmsgTrunc1(self):
3671 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3672
3673 @testSingleCmsgTrunc1.client_skip
3674 def _testSingleCmsgTrunc1(self):
3675 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3676 self.sendToServer(MSG)
3677
3678 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3679 def testSingleCmsgTrunc2Int(self):
3680 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3681
3682 @testSingleCmsgTrunc2Int.client_skip
3683 def _testSingleCmsgTrunc2Int(self):
3684 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3685 self.sendToServer(MSG)
3686
3687 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3688 def testSingleCmsgTruncLen0Minus1(self):
3689 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3690
3691 @testSingleCmsgTruncLen0Minus1.client_skip
3692 def _testSingleCmsgTruncLen0Minus1(self):
3693 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3694 self.sendToServer(MSG)
3695
3696 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3697 def testSingleCmsgTruncInData(self):
3698 # Test truncation of a control message inside its associated
3699 # data. The message may be returned with its data truncated,
3700 # or not returned at all.
3701 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3702 socket.IPV6_RECVHOPLIMIT, 1)
3703 self.misc_event.set()
3704 msg, ancdata, flags, addr = self.doRecvmsg(
3705 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3706
3707 self.assertEqual(msg, MSG)
3708 self.checkRecvmsgAddress(addr, self.cli_addr)
3709 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3710
3711 self.assertLessEqual(len(ancdata), 1)
3712 if ancdata:
3713 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3714 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3715 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3716 self.assertLess(len(cmsg_data), SIZEOF_INT)
3717
3718 @testSingleCmsgTruncInData.client_skip
3719 def _testSingleCmsgTruncInData(self):
3720 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3721 self.sendToServer(MSG)
3722
3723 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3724 # Receive traffic class and hop limit into ancbufsize bytes of
3725 # ancillary data space, which should be large enough to
3726 # contain the first item, but too small to contain the header
3727 # of the second. Check that data is MSG, MSG_CTRUNC is set
3728 # (unless included in ignoreflags), and only one ancillary
3729 # data item is returned.
3730 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3731 socket.IPV6_RECVHOPLIMIT, 1)
3732 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3733 socket.IPV6_RECVTCLASS, 1)
3734 self.misc_event.set()
3735 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3736 len(MSG), ancbufsize)
3737
3738 self.assertEqual(msg, MSG)
3739 self.checkRecvmsgAddress(addr, self.cli_addr)
3740 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3741 ignore=ignoreflags)
3742
3743 self.assertEqual(len(ancdata), 1)
3744 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3745 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3746 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3747 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3748 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003749 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003750 self.assertGreaterEqual(a[0], 0)
3751 self.assertLessEqual(a[0], 255)
3752
3753 # Try the above test with various buffer sizes.
3754
3755 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3756 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3757 def testSecondCmsgTrunc0(self):
3758 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3759 ignoreflags=socket.MSG_CTRUNC)
3760
3761 @testSecondCmsgTrunc0.client_skip
3762 def _testSecondCmsgTrunc0(self):
3763 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3764 self.sendToServer(MSG)
3765
3766 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3767 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3768 def testSecondCmsgTrunc1(self):
3769 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3770
3771 @testSecondCmsgTrunc1.client_skip
3772 def _testSecondCmsgTrunc1(self):
3773 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3774 self.sendToServer(MSG)
3775
3776 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3777 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3778 def testSecondCmsgTrunc2Int(self):
3779 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3780 2 * SIZEOF_INT)
3781
3782 @testSecondCmsgTrunc2Int.client_skip
3783 def _testSecondCmsgTrunc2Int(self):
3784 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3785 self.sendToServer(MSG)
3786
3787 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3788 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3789 def testSecondCmsgTruncLen0Minus1(self):
3790 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3791 socket.CMSG_LEN(0) - 1)
3792
3793 @testSecondCmsgTruncLen0Minus1.client_skip
3794 def _testSecondCmsgTruncLen0Minus1(self):
3795 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3796 self.sendToServer(MSG)
3797
3798 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3799 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3800 def testSecomdCmsgTruncInData(self):
3801 # Test truncation of the second of two control messages inside
3802 # its associated data.
3803 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3804 socket.IPV6_RECVHOPLIMIT, 1)
3805 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3806 socket.IPV6_RECVTCLASS, 1)
3807 self.misc_event.set()
3808 msg, ancdata, flags, addr = self.doRecvmsg(
3809 self.serv_sock, len(MSG),
3810 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3811
3812 self.assertEqual(msg, MSG)
3813 self.checkRecvmsgAddress(addr, self.cli_addr)
3814 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3815
3816 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3817
3818 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3819 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3820 cmsg_types.remove(cmsg_type)
3821 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3822 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003823 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003824 self.assertGreaterEqual(a[0], 0)
3825 self.assertLessEqual(a[0], 255)
3826
3827 if ancdata:
3828 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3829 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3830 cmsg_types.remove(cmsg_type)
3831 self.assertLess(len(cmsg_data), SIZEOF_INT)
3832
3833 self.assertEqual(ancdata, [])
3834
3835 @testSecomdCmsgTruncInData.client_skip
3836 def _testSecomdCmsgTruncInData(self):
3837 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3838 self.sendToServer(MSG)
3839
3840
3841# Derive concrete test classes for different socket types.
3842
3843class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3844 SendrecvmsgConnectionlessBase,
3845 ThreadedSocketTestMixin, UDPTestBase):
3846 pass
3847
3848@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003849class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3850 pass
3851
3852@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003853class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3854 pass
3855
3856@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003857class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3858 pass
3859
3860
3861class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3862 SendrecvmsgConnectionlessBase,
3863 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003864
3865 def checkRecvmsgAddress(self, addr1, addr2):
3866 # Called to compare the received address with the address of
3867 # the peer, ignoring scope ID
3868 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003869
3870@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003871@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003872@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003873class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3874 pass
3875
3876@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003877@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003878@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003879class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3880 pass
3881
3882@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003883@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003884@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003885class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3886 pass
3887
3888@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003889@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003890@requireAttrs(socket, "IPPROTO_IPV6")
3891@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003892class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3893 SendrecvmsgUDP6TestBase):
3894 pass
3895
3896@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003897@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003898@requireAttrs(socket, "IPPROTO_IPV6")
3899@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003900class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3901 RFC3542AncillaryTest,
3902 SendrecvmsgUDP6TestBase):
3903 pass
3904
3905
3906class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3907 ConnectedStreamTestMixin, TCPTestBase):
3908 pass
3909
3910@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003911class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3912 pass
3913
3914@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003915class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3916 SendrecvmsgTCPTestBase):
3917 pass
3918
3919@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003920class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3921 SendrecvmsgTCPTestBase):
3922 pass
3923
3924
3925class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3926 SendrecvmsgConnectedBase,
3927 ConnectedStreamTestMixin, SCTPStreamBase):
3928 pass
3929
3930@requireAttrs(socket.socket, "sendmsg")
3931@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003932class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3933 pass
3934
3935@requireAttrs(socket.socket, "recvmsg")
3936@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003937class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3938 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003939
3940 def testRecvmsgEOF(self):
3941 try:
3942 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3943 except OSError as e:
3944 if e.errno != errno.ENOTCONN:
3945 raise
3946 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003947
3948@requireAttrs(socket.socket, "recvmsg_into")
3949@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003950class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3951 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003952
3953 def testRecvmsgEOF(self):
3954 try:
3955 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3956 except OSError as e:
3957 if e.errno != errno.ENOTCONN:
3958 raise
3959 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003960
3961
3962class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3963 ConnectedStreamTestMixin, UnixStreamBase):
3964 pass
3965
3966@requireAttrs(socket.socket, "sendmsg")
3967@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003968class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3969 pass
3970
3971@requireAttrs(socket.socket, "recvmsg")
3972@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003973class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3974 SendrecvmsgUnixStreamTestBase):
3975 pass
3976
3977@requireAttrs(socket.socket, "recvmsg_into")
3978@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003979class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3980 SendrecvmsgUnixStreamTestBase):
3981 pass
3982
3983@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3984@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003985class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3986 pass
3987
3988@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3989@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003990class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3991 SendrecvmsgUnixStreamTestBase):
3992 pass
3993
3994
3995# Test interrupting the interruptible send/receive methods with a
3996# signal when a timeout is set. These tests avoid having multiple
3997# threads alive during the test so that the OS cannot deliver the
3998# signal to the wrong one.
3999
4000class InterruptedTimeoutBase(unittest.TestCase):
4001 # Base class for interrupted send/receive tests. Installs an
4002 # empty handler for SIGALRM and removes it on teardown, along with
4003 # any scheduled alarms.
4004
4005 def setUp(self):
4006 super().setUp()
4007 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004008 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004009 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004010
4011 # Timeout for socket operations
4012 timeout = 4.0
4013
4014 # Provide setAlarm() method to schedule delivery of SIGALRM after
4015 # given number of seconds, or cancel it if zero, and an
4016 # appropriate time value to use. Use setitimer() if available.
4017 if hasattr(signal, "setitimer"):
4018 alarm_time = 0.05
4019
4020 def setAlarm(self, seconds):
4021 signal.setitimer(signal.ITIMER_REAL, seconds)
4022 else:
4023 # Old systems may deliver the alarm up to one second early
4024 alarm_time = 2
4025
4026 def setAlarm(self, seconds):
4027 signal.alarm(seconds)
4028
4029
4030# Require siginterrupt() in order to ensure that system calls are
4031# interrupted by default.
4032@requireAttrs(signal, "siginterrupt")
4033@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4034 "Don't have signal.alarm or signal.setitimer")
4035class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4036 # Test interrupting the recv*() methods with signals when a
4037 # timeout is set.
4038
4039 def setUp(self):
4040 super().setUp()
4041 self.serv.settimeout(self.timeout)
4042
4043 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004044 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004045 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004046 try:
4047 self.setAlarm(self.alarm_time)
4048 with self.assertRaises(ZeroDivisionError) as cm:
4049 func(*args, **kwargs)
4050 finally:
4051 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004052
4053 def testInterruptedRecvTimeout(self):
4054 self.checkInterruptedRecv(self.serv.recv, 1024)
4055
4056 def testInterruptedRecvIntoTimeout(self):
4057 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4058
4059 def testInterruptedRecvfromTimeout(self):
4060 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4061
4062 def testInterruptedRecvfromIntoTimeout(self):
4063 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4064
4065 @requireAttrs(socket.socket, "recvmsg")
4066 def testInterruptedRecvmsgTimeout(self):
4067 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4068
4069 @requireAttrs(socket.socket, "recvmsg_into")
4070 def testInterruptedRecvmsgIntoTimeout(self):
4071 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4072
4073
4074# Require siginterrupt() in order to ensure that system calls are
4075# interrupted by default.
4076@requireAttrs(signal, "siginterrupt")
4077@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4078 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004079class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4080 ThreadSafeCleanupTestCase,
4081 SocketListeningTestMixin, TCPTestBase):
4082 # Test interrupting the interruptible send*() methods with signals
4083 # when a timeout is set.
4084
4085 def setUp(self):
4086 super().setUp()
4087 self.serv_conn = self.newSocket()
4088 self.addCleanup(self.serv_conn.close)
4089 # Use a thread to complete the connection, but wait for it to
4090 # terminate before running the test, so that there is only one
4091 # thread to accept the signal.
4092 cli_thread = threading.Thread(target=self.doConnect)
4093 cli_thread.start()
4094 self.cli_conn, addr = self.serv.accept()
4095 self.addCleanup(self.cli_conn.close)
4096 cli_thread.join()
4097 self.serv_conn.settimeout(self.timeout)
4098
4099 def doConnect(self):
4100 self.serv_conn.connect(self.serv_addr)
4101
4102 def checkInterruptedSend(self, func, *args, **kwargs):
4103 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004104 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004105 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004106 try:
4107 with self.assertRaises(ZeroDivisionError) as cm:
4108 while True:
4109 self.setAlarm(self.alarm_time)
4110 func(*args, **kwargs)
4111 finally:
4112 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004113
Ned Deilyc5640382014-02-03 13:58:31 -08004114 # Issue #12958: The following tests have problems on OS X prior to 10.7
4115 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004116 def testInterruptedSendTimeout(self):
4117 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4118
Ned Deilyc5640382014-02-03 13:58:31 -08004119 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004120 def testInterruptedSendtoTimeout(self):
4121 # Passing an actual address here as Python's wrapper for
4122 # sendto() doesn't allow passing a zero-length one; POSIX
4123 # requires that the address is ignored since the socket is
4124 # connection-mode, however.
4125 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4126 self.serv_addr)
4127
Ned Deilyc5640382014-02-03 13:58:31 -08004128 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004129 @requireAttrs(socket.socket, "sendmsg")
4130 def testInterruptedSendmsgTimeout(self):
4131 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4132
4133
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004134class TCPCloserTest(ThreadedTCPSocketTest):
4135
4136 def testClose(self):
4137 conn, addr = self.serv.accept()
4138 conn.close()
4139
4140 sd = self.cli
4141 read, write, err = select.select([sd], [], [], 1.0)
4142 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004143 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004144
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004145 # Calling close() many times should be safe.
4146 conn.close()
4147 conn.close()
4148
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004149 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004150 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004151 time.sleep(1.0)
4152
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004153
Dave Cole331708b2004-08-09 04:51:41 +00004154class BasicSocketPairTest(SocketPairTest):
4155
4156 def __init__(self, methodName='runTest'):
4157 SocketPairTest.__init__(self, methodName=methodName)
4158
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004159 def _check_defaults(self, sock):
4160 self.assertIsInstance(sock, socket.socket)
4161 if hasattr(socket, 'AF_UNIX'):
4162 self.assertEqual(sock.family, socket.AF_UNIX)
4163 else:
4164 self.assertEqual(sock.family, socket.AF_INET)
4165 self.assertEqual(sock.type, socket.SOCK_STREAM)
4166 self.assertEqual(sock.proto, 0)
4167
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004168 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004169 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004170
4171 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004172 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004173
Dave Cole331708b2004-08-09 04:51:41 +00004174 def testRecv(self):
4175 msg = self.serv.recv(1024)
4176 self.assertEqual(msg, MSG)
4177
4178 def _testRecv(self):
4179 self.cli.send(MSG)
4180
4181 def testSend(self):
4182 self.serv.send(MSG)
4183
4184 def _testSend(self):
4185 msg = self.cli.recv(1024)
4186 self.assertEqual(msg, MSG)
4187
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004188
Guido van Rossum24e4af82002-06-12 19:18:08 +00004189class NonBlockingTCPTests(ThreadedTCPSocketTest):
4190
4191 def __init__(self, methodName='runTest'):
4192 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4193
4194 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004195 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004196 self.serv.setblocking(True)
4197 self.assertIsNone(self.serv.gettimeout())
Yury Selivanovf11b4602018-01-28 17:27:38 -05004198 self.assertTrue(self.serv.getblocking())
4199 if fcntl:
4200 self.assertTrue(_is_fd_in_blocking_mode(self.serv))
4201
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004202 self.serv.setblocking(False)
4203 self.assertEqual(self.serv.gettimeout(), 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004204 self.assertFalse(self.serv.getblocking())
4205 if fcntl:
4206 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4207
4208 self.serv.settimeout(None)
4209 self.assertTrue(self.serv.getblocking())
4210 if fcntl:
4211 self.assertTrue(_is_fd_in_blocking_mode(self.serv))
4212
4213 self.serv.settimeout(0)
4214 self.assertFalse(self.serv.getblocking())
4215 self.assertEqual(self.serv.gettimeout(), 0)
4216 if fcntl:
4217 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4218
4219 self.serv.settimeout(10)
4220 self.assertTrue(self.serv.getblocking())
4221 self.assertEqual(self.serv.gettimeout(), 10)
4222 if fcntl:
4223 # When a Python socket has a non-zero timeout, it's
4224 # switched internally to a non-blocking mode.
4225 # Later, sock.sendall(), sock.recv(), and other socket
4226 # operations use a `select()` call and handle EWOULDBLOCK/EGAIN
4227 # on all socket operations. That's how timeouts are
4228 # enforced.
4229 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4230
4231 self.serv.settimeout(0)
4232 self.assertFalse(self.serv.getblocking())
4233 if fcntl:
4234 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4235
Guido van Rossum24e4af82002-06-12 19:18:08 +00004236 start = time.time()
4237 try:
4238 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004239 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004240 pass
4241 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004242 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00004243
4244 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004245 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004246
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004247 @support.cpython_only
4248 def testSetBlocking_overflow(self):
4249 # Issue 15989
4250 import _testcapi
4251 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4252 self.skipTest('needs UINT_MAX < ULONG_MAX')
4253 self.serv.setblocking(False)
4254 self.assertEqual(self.serv.gettimeout(), 0.0)
4255 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4256 self.assertIsNone(self.serv.gettimeout())
4257
4258 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4259
Serhiy Storchaka43767632013-11-03 21:31:38 +02004260 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4261 'test needs socket.SOCK_NONBLOCK')
4262 @support.requires_linux_version(2, 6, 28)
4263 def testInitNonBlocking(self):
4264 # reinit server socket
4265 self.serv.close()
4266 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
4267 socket.SOCK_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004268 self.assertFalse(self.serv.getblocking())
4269 self.assertEqual(self.serv.gettimeout(), 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004270 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01004271 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02004272 # actual testing
4273 start = time.time()
4274 try:
4275 self.serv.accept()
4276 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00004277 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02004278 end = time.time()
4279 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
4280
4281 def _testInitNonBlocking(self):
4282 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004283
Antoine Pitrou600232b2011-01-05 21:03:42 +00004284 def testInheritFlags(self):
4285 # Issue #7995: when calling accept() on a listening socket with a
4286 # timeout, the resulting socket should not be non-blocking.
4287 self.serv.settimeout(10)
4288 try:
4289 conn, addr = self.serv.accept()
4290 message = conn.recv(len(MSG))
4291 finally:
4292 conn.close()
4293 self.serv.settimeout(None)
4294
4295 def _testInheritFlags(self):
4296 time.sleep(0.1)
4297 self.cli.connect((HOST, self.port))
4298 time.sleep(0.5)
4299 self.cli.send(MSG)
4300
Guido van Rossum24e4af82002-06-12 19:18:08 +00004301 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004302 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004303 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00004304 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004305 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004306 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004307 pass
4308 else:
4309 self.fail("Error trying to do non-blocking accept.")
4310 read, write, err = select.select([self.serv], [], [])
4311 if self.serv in read:
4312 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07004313 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00004314 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004315 else:
4316 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004317
Guido van Rossum24e4af82002-06-12 19:18:08 +00004318 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004319 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00004320 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004321
4322 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004323 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00004324 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004325 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004326
4327 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00004328 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00004329 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004330
4331 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004332 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004333 conn, addr = self.serv.accept()
4334 conn.setblocking(0)
4335 try:
4336 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02004337 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004338 pass
4339 else:
4340 self.fail("Error trying to do non-blocking recv.")
4341 read, write, err = select.select([conn], [], [])
4342 if conn in read:
4343 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004344 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00004345 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004346 else:
4347 self.fail("Error during select call to non-blocking socket.")
4348
4349 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004350 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004351 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004352 self.cli.send(MSG)
4353
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004354
Guido van Rossum24e4af82002-06-12 19:18:08 +00004355class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004356 """Unit tests for the object returned by socket.makefile()
4357
Antoine Pitrou834bd812010-10-13 16:17:14 +00004358 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004359 the client connection. You can read from this file to
4360 get output from the server.
4361
Antoine Pitrou834bd812010-10-13 16:17:14 +00004362 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004363 server connection. You can write to this file to send output
4364 to the client.
4365 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004366
Guido van Rossume9f66142002-08-07 15:46:19 +00004367 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004368 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004369 errors = 'strict'
4370 newline = None
4371
4372 read_mode = 'rb'
4373 read_msg = MSG
4374 write_mode = 'wb'
4375 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004376
Guido van Rossum24e4af82002-06-12 19:18:08 +00004377 def __init__(self, methodName='runTest'):
4378 SocketConnectedTest.__init__(self, methodName=methodName)
4379
4380 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004381 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4382 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004383 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004384 self.read_file = self.cli_conn.makefile(
4385 self.read_mode, self.bufsize,
4386 encoding = self.encoding,
4387 errors = self.errors,
4388 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004389
4390 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004391 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004392 self.read_file.close()
4393 self.assertTrue(self.read_file.closed)
4394 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004395 SocketConnectedTest.tearDown(self)
4396
4397 def clientSetUp(self):
4398 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004399 self.write_file = self.serv_conn.makefile(
4400 self.write_mode, self.bufsize,
4401 encoding = self.encoding,
4402 errors = self.errors,
4403 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004404
4405 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004406 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004407 self.write_file.close()
4408 self.assertTrue(self.write_file.closed)
4409 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004410 SocketConnectedTest.clientTearDown(self)
4411
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004412 def testReadAfterTimeout(self):
4413 # Issue #7322: A file object must disallow further reads
4414 # after a timeout has occurred.
4415 self.cli_conn.settimeout(1)
4416 self.read_file.read(3)
4417 # First read raises a timeout
4418 self.assertRaises(socket.timeout, self.read_file.read, 1)
4419 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004420 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004421 self.read_file.read(1)
4422 self.assertIn("cannot read from timed out object", str(ctx.exception))
4423
4424 def _testReadAfterTimeout(self):
4425 self.write_file.write(self.write_msg[0:3])
4426 self.write_file.flush()
4427 self.serv_finished.wait()
4428
Guido van Rossum24e4af82002-06-12 19:18:08 +00004429 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004430 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004431 first_seg = self.read_file.read(len(self.read_msg)-3)
4432 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004433 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004434 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004435
4436 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004437 self.write_file.write(self.write_msg)
4438 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004439
Guido van Rossum8c943832002-08-08 01:00:28 +00004440 def testFullRead(self):
4441 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004442 msg = self.read_file.read()
4443 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004444
4445 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004446 self.write_file.write(self.write_msg)
4447 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004448
Guido van Rossum24e4af82002-06-12 19:18:08 +00004449 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004450 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004451 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004452 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004453 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004454 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004455 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004456 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004457 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004458
4459 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004460 self.write_file.write(self.write_msg)
4461 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004462
4463 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004464 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004465 line = self.read_file.readline()
4466 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004467
4468 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004469 self.write_file.write(self.write_msg)
4470 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004471
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004472 def testCloseAfterMakefile(self):
4473 # The file returned by makefile should keep the socket open.
4474 self.cli_conn.close()
4475 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004476 msg = self.read_file.read()
4477 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004478
4479 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004480 self.write_file.write(self.write_msg)
4481 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004482
4483 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004484 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004485 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004486 if isinstance(self.read_msg, str):
4487 msg = msg.decode()
4488 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004489
4490 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004491 self.write_file.write(self.write_msg)
4492 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004493
Tim Peters116d83c2004-03-28 02:20:45 +00004494 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004495 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004496
4497 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004498 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004499
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004500 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004501 self.assertEqual(self.read_file.mode, self.read_mode)
4502 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004503
4504 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004505 self.assertEqual(self.write_file.mode, self.write_mode)
4506 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004507
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004508 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004509 self.read_file.close()
4510 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004511 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004512 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004513
4514 def _testRealClose(self):
4515 pass
4516
4517
Guido van Rossume9f66142002-08-07 15:46:19 +00004518class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4519
4520 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004521
Guido van Rossume9f66142002-08-07 15:46:19 +00004522 In this case (and in this case only), it should be possible to
4523 create a file object, read a line from it, create another file
4524 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004525 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004526 when reading multiple requests from the same socket."""
4527
4528 bufsize = 0 # Use unbuffered mode
4529
4530 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004531 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004532 line = self.read_file.readline() # first line
4533 self.assertEqual(line, b"A. " + self.write_msg) # first line
4534 self.read_file = self.cli_conn.makefile('rb', 0)
4535 line = self.read_file.readline() # second line
4536 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004537
4538 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004539 self.write_file.write(b"A. " + self.write_msg)
4540 self.write_file.write(b"B. " + self.write_msg)
4541 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004542
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004543 def testMakefileClose(self):
4544 # The file returned by makefile should keep the socket open...
4545 self.cli_conn.close()
4546 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004547 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004548 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004549 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004550 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004551
4552 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004553 self.write_file.write(self.write_msg)
4554 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004555
4556 def testMakefileCloseSocketDestroy(self):
4557 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004558 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004559 refcount_after = sys.getrefcount(self.cli_conn)
4560 self.assertEqual(refcount_before - 1, refcount_after)
4561
4562 def _testMakefileCloseSocketDestroy(self):
4563 pass
4564
Antoine Pitrou98b46702010-09-18 22:59:00 +00004565 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004566 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004567 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4568
4569 def testSmallReadNonBlocking(self):
4570 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004571 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4572 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004573 self.evt1.set()
4574 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004575 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004576 if first_seg is None:
4577 # Data not arrived (can happen under Windows), wait a bit
4578 time.sleep(0.5)
4579 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004580 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004581 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004582 self.assertEqual(n, 3)
4583 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004584 self.assertEqual(msg, self.read_msg)
4585 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4586 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004587
4588 def _testSmallReadNonBlocking(self):
4589 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004590 self.write_file.write(self.write_msg)
4591 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004592 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004593 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004594 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4595 self.serv_finished.wait(5.0)
4596
4597 def testWriteNonBlocking(self):
4598 self.cli_finished.wait(5.0)
4599 # The client thread can't skip directly - the SkipTest exception
4600 # would appear as a failure.
4601 if self.serv_skipped:
4602 self.skipTest(self.serv_skipped)
4603
4604 def _testWriteNonBlocking(self):
4605 self.serv_skipped = None
4606 self.serv_conn.setblocking(False)
4607 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004608 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004609 LIMIT = 10
4610 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004611 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004612 self.assertGreater(n, 0)
4613 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004614 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004615 if n is None:
4616 # Succeeded
4617 break
4618 self.assertGreater(n, 0)
4619 else:
4620 # Let us know that this test didn't manage to establish
4621 # the expected conditions. This is not a failure in itself but,
4622 # if it happens repeatedly, the test should be fixed.
4623 self.serv_skipped = "failed to saturate the socket buffer"
4624
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004625
Guido van Rossum8c943832002-08-08 01:00:28 +00004626class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4627
4628 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4629
4630
4631class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4632
4633 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004634
Thomas Woutersb2137042007-02-01 18:02:27 +00004635
Antoine Pitrou834bd812010-10-13 16:17:14 +00004636class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4637 """Tests for socket.makefile() in text mode (rather than binary)"""
4638
4639 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004640 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004641 write_mode = 'wb'
4642 write_msg = MSG
4643 newline = ''
4644
4645
4646class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4647 """Tests for socket.makefile() in text mode (rather than binary)"""
4648
4649 read_mode = 'rb'
4650 read_msg = MSG
4651 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004652 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004653 newline = ''
4654
4655
4656class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4657 """Tests for socket.makefile() in text mode (rather than binary)"""
4658
4659 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004660 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004661 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004662 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004663 newline = ''
4664
4665
Guido van Rossumd8faa362007-04-27 19:54:29 +00004666class NetworkConnectionTest(object):
4667 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004668
Guido van Rossumd8faa362007-04-27 19:54:29 +00004669 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004670 # We're inherited below by BasicTCPTest2, which also inherits
4671 # BasicTCPTest, which defines self.port referenced below.
4672 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004673 self.serv_conn = self.cli
4674
4675class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4676 """Tests that NetworkConnection does not break existing TCP functionality.
4677 """
4678
4679class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004680
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004681 class MockSocket(socket.socket):
4682 def connect(self, *args):
4683 raise socket.timeout('timed out')
4684
4685 @contextlib.contextmanager
4686 def mocked_socket_module(self):
4687 """Return a socket which times out on connect"""
4688 old_socket = socket.socket
4689 socket.socket = self.MockSocket
4690 try:
4691 yield
4692 finally:
4693 socket.socket = old_socket
4694
4695 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004696 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004697 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004698 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004699 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004700 cli.connect((HOST, port))
4701 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4702
4703 def test_create_connection(self):
4704 # Issue #9792: errors raised by create_connection() should have
4705 # a proper errno attribute.
4706 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004707 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004708 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004709
4710 # Issue #16257: create_connection() calls getaddrinfo() against
4711 # 'localhost'. This may result in an IPV6 addr being returned
4712 # as well as an IPV4 one:
4713 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4714 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4715 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4716 #
4717 # create_connection() enumerates through all the addresses returned
4718 # and if it doesn't successfully bind to any of them, it propagates
4719 # the last exception it encountered.
4720 #
4721 # On Solaris, ENETUNREACH is returned in this circumstance instead
4722 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4723 # expected errnos.
4724 expected_errnos = [ errno.ECONNREFUSED, ]
4725 if hasattr(errno, 'ENETUNREACH'):
4726 expected_errnos.append(errno.ENETUNREACH)
Victor Stinner280c22a2017-10-31 19:48:14 -07004727 if hasattr(errno, 'EADDRNOTAVAIL'):
4728 # bpo-31910: socket.create_connection() fails randomly
4729 # with EADDRNOTAVAIL on Travis CI
4730 expected_errnos.append(errno.EADDRNOTAVAIL)
Trent Nelson45bb6132012-10-17 06:15:15 -04004731
4732 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004733
4734 def test_create_connection_timeout(self):
4735 # Issue #9792: create_connection() should not recast timeout errors
4736 # as generic socket errors.
4737 with self.mocked_socket_module():
4738 with self.assertRaises(socket.timeout):
4739 socket.create_connection((HOST, 1234))
4740
Guido van Rossumd8faa362007-04-27 19:54:29 +00004741
4742class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4743
4744 def __init__(self, methodName='runTest'):
4745 SocketTCPTest.__init__(self, methodName=methodName)
4746 ThreadableTest.__init__(self)
4747
4748 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004749 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004750
4751 def clientTearDown(self):
4752 self.cli.close()
4753 self.cli = None
4754 ThreadableTest.clientTearDown(self)
4755
4756 def _justAccept(self):
4757 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004758 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004759
4760 testFamily = _justAccept
4761 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004762 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004763 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004764 self.assertEqual(self.cli.family, 2)
4765
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004766 testSourceAddress = _justAccept
4767 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004768 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4769 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004770 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004771 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004772 # The port number being used is sufficient to show that the bind()
4773 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004774
Guido van Rossumd8faa362007-04-27 19:54:29 +00004775 testTimeoutDefault = _justAccept
4776 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004777 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004778 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004779 socket.setdefaulttimeout(42)
4780 try:
4781 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004782 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004783 finally:
4784 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004785 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004786
4787 testTimeoutNone = _justAccept
4788 def _testTimeoutNone(self):
4789 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004790 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004791 socket.setdefaulttimeout(30)
4792 try:
4793 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004794 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004795 finally:
4796 socket.setdefaulttimeout(None)
4797 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004798
4799 testTimeoutValueNamed = _justAccept
4800 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004801 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004802 self.assertEqual(self.cli.gettimeout(), 30)
4803
4804 testTimeoutValueNonamed = _justAccept
4805 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004806 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004807 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004808 self.assertEqual(self.cli.gettimeout(), 30)
4809
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004810
Guido van Rossumd8faa362007-04-27 19:54:29 +00004811class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4812
4813 def __init__(self, methodName='runTest'):
4814 SocketTCPTest.__init__(self, methodName=methodName)
4815 ThreadableTest.__init__(self)
4816
4817 def clientSetUp(self):
4818 pass
4819
4820 def clientTearDown(self):
4821 self.cli.close()
4822 self.cli = None
4823 ThreadableTest.clientTearDown(self)
4824
4825 def testInsideTimeout(self):
4826 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004827 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004828 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004829 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004830 testOutsideTimeout = testInsideTimeout
4831
4832 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004833 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004834 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004835 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004836
4837 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004838 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004839 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004840
4841
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004842class TCPTimeoutTest(SocketTCPTest):
4843
4844 def testTCPTimeout(self):
4845 def raise_timeout(*args, **kwargs):
4846 self.serv.settimeout(1.0)
4847 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004848 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004849 "Error generating a timeout exception (TCP)")
4850
4851 def testTimeoutZero(self):
4852 ok = False
4853 try:
4854 self.serv.settimeout(0.0)
4855 foo = self.serv.accept()
4856 except socket.timeout:
4857 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004858 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004859 ok = True
4860 except:
4861 self.fail("caught unexpected exception (TCP)")
4862 if not ok:
4863 self.fail("accept() returned success when we did not expect it")
4864
Serhiy Storchaka43767632013-11-03 21:31:38 +02004865 @unittest.skipUnless(hasattr(signal, 'alarm'),
4866 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004867 def testInterruptedTimeout(self):
4868 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06004869 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004870 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004871 self.serv.settimeout(5.0) # must be longer than alarm
4872 class Alarm(Exception):
4873 pass
4874 def alarm_handler(signal, frame):
4875 raise Alarm
4876 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4877 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004878 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004879 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004880 foo = self.serv.accept()
4881 except socket.timeout:
4882 self.fail("caught timeout instead of Alarm")
4883 except Alarm:
4884 pass
4885 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004886 self.fail("caught other exception instead of Alarm:"
4887 " %s(%s):\n%s" %
4888 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004889 else:
4890 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004891 finally:
4892 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004893 except Alarm:
4894 self.fail("got Alarm in wrong place")
4895 finally:
4896 # no alarm can be pending. Safe to restore old handler.
4897 signal.signal(signal.SIGALRM, old_alarm)
4898
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004899class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004900
4901 def testUDPTimeout(self):
4902 def raise_timeout(*args, **kwargs):
4903 self.serv.settimeout(1.0)
4904 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004905 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004906 "Error generating a timeout exception (UDP)")
4907
4908 def testTimeoutZero(self):
4909 ok = False
4910 try:
4911 self.serv.settimeout(0.0)
4912 foo = self.serv.recv(1024)
4913 except socket.timeout:
4914 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004915 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004916 ok = True
4917 except:
4918 self.fail("caught unexpected exception (UDP)")
4919 if not ok:
4920 self.fail("recv() returned success when we did not expect it")
4921
4922class TestExceptions(unittest.TestCase):
4923
4924 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004925 self.assertTrue(issubclass(OSError, Exception))
4926 self.assertTrue(issubclass(socket.herror, OSError))
4927 self.assertTrue(issubclass(socket.gaierror, OSError))
4928 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004929
Yury Selivanovfa22b292016-10-18 16:03:52 -04004930 def test_setblocking_invalidfd(self):
4931 # Regression test for issue #28471
4932
4933 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4934 sock = socket.socket(
4935 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4936 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004937 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004938
4939 with self.assertRaises(OSError):
4940 sock.setblocking(False)
4941
4942
Serhiy Storchaka43767632013-11-03 21:31:38 +02004943@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004944class TestLinuxAbstractNamespace(unittest.TestCase):
4945
4946 UNIX_PATH_MAX = 108
4947
4948 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004949 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004950 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4951 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004952 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004953 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4954 s2.connect(s1.getsockname())
4955 with s1.accept()[0] as s3:
4956 self.assertEqual(s1.getsockname(), address)
4957 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004958
4959 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004960 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004961 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4962 s.bind(address)
4963 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004964
4965 def testNameOverflow(self):
4966 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004967 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004968 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004969
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004970 def testStrName(self):
4971 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004972 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4973 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004974 s.bind("\x00python\x00test\x00")
4975 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004976 finally:
4977 s.close()
4978
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004979 def testBytearrayName(self):
4980 # Check that an abstract name can be passed as a bytearray.
4981 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4982 s.bind(bytearray(b"\x00python\x00test\x00"))
4983 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4984
Serhiy Storchaka43767632013-11-03 21:31:38 +02004985@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004986class TestUnixDomain(unittest.TestCase):
4987
4988 def setUp(self):
4989 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4990
4991 def tearDown(self):
4992 self.sock.close()
4993
4994 def encoded(self, path):
4995 # Return the given path encoded in the file system encoding,
4996 # or skip the test if this is not possible.
4997 try:
4998 return os.fsencode(path)
4999 except UnicodeEncodeError:
5000 self.skipTest(
5001 "Pathname {0!a} cannot be represented in file "
5002 "system encoding {1!r}".format(
5003 path, sys.getfilesystemencoding()))
5004
Antoine Pitrou16374872011-12-16 15:04:12 +01005005 def bind(self, sock, path):
5006 # Bind the socket
5007 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01005008 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005009 except OSError as e:
5010 if str(e) == "AF_UNIX path too long":
5011 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005012 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005013 .format(path))
5014 else:
5015 raise
5016
Antoine Pitrou495b5022017-05-02 17:20:00 +02005017 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005018 # Issue #30205 (note getsockname() can return None on OS X)
5019 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005020
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005021 def testStrAddr(self):
5022 # Test binding to and retrieving a normal string pathname.
5023 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005024 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005025 self.addCleanup(support.unlink, path)
5026 self.assertEqual(self.sock.getsockname(), path)
5027
5028 def testBytesAddr(self):
5029 # Test binding to a bytes pathname.
5030 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005031 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005032 self.addCleanup(support.unlink, path)
5033 self.assertEqual(self.sock.getsockname(), path)
5034
5035 def testSurrogateescapeBind(self):
5036 # Test binding to a valid non-ASCII pathname, with the
5037 # non-ASCII bytes supplied using surrogateescape encoding.
5038 path = os.path.abspath(support.TESTFN_UNICODE)
5039 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005040 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005041 self.addCleanup(support.unlink, path)
5042 self.assertEqual(self.sock.getsockname(), path)
5043
5044 def testUnencodableAddr(self):
5045 # Test binding to a pathname that cannot be encoded in the
5046 # file system encoding.
5047 if support.TESTFN_UNENCODABLE is None:
5048 self.skipTest("No unencodable filename available")
5049 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005050 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005051 self.addCleanup(support.unlink, path)
5052 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005053
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005054
Thomas Wouters477c8d52006-05-27 19:21:47 +00005055class BufferIOTest(SocketConnectedTest):
5056 """
5057 Test the buffer versions of socket.recv() and socket.send().
5058 """
5059 def __init__(self, methodName='runTest'):
5060 SocketConnectedTest.__init__(self, methodName=methodName)
5061
Antoine Pitrou25480782010-03-17 22:50:28 +00005062 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005063 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005064 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005065 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005066 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005067 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005068 self.assertEqual(msg, MSG)
5069
Antoine Pitrou25480782010-03-17 22:50:28 +00005070 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005071 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005072 self.serv_conn.send(buf)
5073
Antoine Pitrou25480782010-03-17 22:50:28 +00005074 def testRecvIntoBytearray(self):
5075 buf = bytearray(1024)
5076 nbytes = self.cli_conn.recv_into(buf)
5077 self.assertEqual(nbytes, len(MSG))
5078 msg = buf[:len(MSG)]
5079 self.assertEqual(msg, MSG)
5080
5081 _testRecvIntoBytearray = _testRecvIntoArray
5082
5083 def testRecvIntoMemoryview(self):
5084 buf = bytearray(1024)
5085 nbytes = self.cli_conn.recv_into(memoryview(buf))
5086 self.assertEqual(nbytes, len(MSG))
5087 msg = buf[:len(MSG)]
5088 self.assertEqual(msg, MSG)
5089
5090 _testRecvIntoMemoryview = _testRecvIntoArray
5091
5092 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005093 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005094 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005095 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005096 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005097 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005098 self.assertEqual(msg, MSG)
5099
Antoine Pitrou25480782010-03-17 22:50:28 +00005100 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005101 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005102 self.serv_conn.send(buf)
5103
Antoine Pitrou25480782010-03-17 22:50:28 +00005104 def testRecvFromIntoBytearray(self):
5105 buf = bytearray(1024)
5106 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5107 self.assertEqual(nbytes, len(MSG))
5108 msg = buf[:len(MSG)]
5109 self.assertEqual(msg, MSG)
5110
5111 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5112
5113 def testRecvFromIntoMemoryview(self):
5114 buf = bytearray(1024)
5115 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5116 self.assertEqual(nbytes, len(MSG))
5117 msg = buf[:len(MSG)]
5118 self.assertEqual(msg, MSG)
5119
5120 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5121
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005122 def testRecvFromIntoSmallBuffer(self):
5123 # See issue #20246.
5124 buf = bytearray(8)
5125 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5126
5127 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005128 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005129
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005130 def testRecvFromIntoEmptyBuffer(self):
5131 buf = bytearray()
5132 self.cli_conn.recvfrom_into(buf)
5133 self.cli_conn.recvfrom_into(buf, 0)
5134
5135 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5136
Christian Heimes043d6f62008-01-07 17:19:16 +00005137
5138TIPC_STYPE = 2000
5139TIPC_LOWER = 200
5140TIPC_UPPER = 210
5141
5142def isTipcAvailable():
5143 """Check if the TIPC module is loaded
5144
5145 The TIPC module is not loaded automatically on Ubuntu and probably
5146 other Linux distros.
5147 """
5148 if not hasattr(socket, "AF_TIPC"):
5149 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005150 try:
5151 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005152 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005153 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005154 # have not the permission to read it.
5155 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005156 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005157 for line in f:
5158 if line.startswith("tipc "):
5159 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005160 return False
5161
Serhiy Storchaka43767632013-11-03 21:31:38 +02005162@unittest.skipUnless(isTipcAvailable(),
5163 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005164class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005165 def testRDM(self):
5166 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5167 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005168 self.addCleanup(srv.close)
5169 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005170
5171 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5172 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5173 TIPC_LOWER, TIPC_UPPER)
5174 srv.bind(srvaddr)
5175
5176 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5177 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5178 cli.sendto(MSG, sendaddr)
5179
5180 msg, recvaddr = srv.recvfrom(1024)
5181
5182 self.assertEqual(cli.getsockname(), recvaddr)
5183 self.assertEqual(msg, MSG)
5184
5185
Serhiy Storchaka43767632013-11-03 21:31:38 +02005186@unittest.skipUnless(isTipcAvailable(),
5187 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005188class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005189 def __init__(self, methodName = 'runTest'):
5190 unittest.TestCase.__init__(self, methodName = methodName)
5191 ThreadableTest.__init__(self)
5192
5193 def setUp(self):
5194 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005195 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005196 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5197 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5198 TIPC_LOWER, TIPC_UPPER)
5199 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005200 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005201 self.serverExplicitReady()
5202 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005203 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005204
5205 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005206 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005207 # accept() call; sleep a little while to avoid it, otherwise
5208 # we could get an exception
5209 time.sleep(0.1)
5210 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005211 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005212 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5213 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5214 self.cli.connect(addr)
5215 self.cliaddr = self.cli.getsockname()
5216
5217 def testStream(self):
5218 msg = self.conn.recv(1024)
5219 self.assertEqual(msg, MSG)
5220 self.assertEqual(self.cliaddr, self.connaddr)
5221
5222 def _testStream(self):
5223 self.cli.send(MSG)
5224 self.cli.close()
5225
5226
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005227class ContextManagersTest(ThreadedTCPSocketTest):
5228
5229 def _testSocketClass(self):
5230 # base test
5231 with socket.socket() as sock:
5232 self.assertFalse(sock._closed)
5233 self.assertTrue(sock._closed)
5234 # close inside with block
5235 with socket.socket() as sock:
5236 sock.close()
5237 self.assertTrue(sock._closed)
5238 # exception inside with block
5239 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005240 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005241 self.assertTrue(sock._closed)
5242
5243 def testCreateConnectionBase(self):
5244 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005245 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005246 data = conn.recv(1024)
5247 conn.sendall(data)
5248
5249 def _testCreateConnectionBase(self):
5250 address = self.serv.getsockname()
5251 with socket.create_connection(address) as sock:
5252 self.assertFalse(sock._closed)
5253 sock.sendall(b'foo')
5254 self.assertEqual(sock.recv(1024), b'foo')
5255 self.assertTrue(sock._closed)
5256
5257 def testCreateConnectionClose(self):
5258 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005259 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005260 data = conn.recv(1024)
5261 conn.sendall(data)
5262
5263 def _testCreateConnectionClose(self):
5264 address = self.serv.getsockname()
5265 with socket.create_connection(address) as sock:
5266 sock.close()
5267 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005268 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005269
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005270
Victor Stinnerdaf45552013-08-28 00:53:59 +02005271class InheritanceTest(unittest.TestCase):
5272 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5273 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005274 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005275 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005276 with socket.socket(socket.AF_INET,
5277 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005278 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005279 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005280
5281 def test_default_inheritable(self):
5282 sock = socket.socket()
5283 with sock:
5284 self.assertEqual(sock.get_inheritable(), False)
5285
5286 def test_dup(self):
5287 sock = socket.socket()
5288 with sock:
5289 newsock = sock.dup()
5290 sock.close()
5291 with newsock:
5292 self.assertEqual(newsock.get_inheritable(), False)
5293
5294 def test_set_inheritable(self):
5295 sock = socket.socket()
5296 with sock:
5297 sock.set_inheritable(True)
5298 self.assertEqual(sock.get_inheritable(), True)
5299
5300 sock.set_inheritable(False)
5301 self.assertEqual(sock.get_inheritable(), False)
5302
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005303 @unittest.skipIf(fcntl is None, "need fcntl")
5304 def test_get_inheritable_cloexec(self):
5305 sock = socket.socket()
5306 with sock:
5307 fd = sock.fileno()
5308 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005309
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005310 # clear FD_CLOEXEC flag
5311 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5312 flags &= ~fcntl.FD_CLOEXEC
5313 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005314
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005315 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005316
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005317 @unittest.skipIf(fcntl is None, "need fcntl")
5318 def test_set_inheritable_cloexec(self):
5319 sock = socket.socket()
5320 with sock:
5321 fd = sock.fileno()
5322 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5323 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005324
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005325 sock.set_inheritable(True)
5326 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5327 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005328
5329
Victor Stinnerdaf45552013-08-28 00:53:59 +02005330 def test_socketpair(self):
5331 s1, s2 = socket.socketpair()
5332 self.addCleanup(s1.close)
5333 self.addCleanup(s2.close)
5334 self.assertEqual(s1.get_inheritable(), False)
5335 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005336
5337
5338@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5339 "SOCK_NONBLOCK not defined")
5340class NonblockConstantTest(unittest.TestCase):
5341 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5342 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005343 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005344 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005345 self.assertTrue(
5346 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005347 if timeout == 0:
5348 # timeout == 0: means that getblocking() must be False.
5349 self.assertFalse(s.getblocking())
5350 else:
5351 # If timeout > 0, the socket will be in a "blocking" mode
5352 # from the standpoint of the Python API. For Python socket
5353 # object, "blocking" means that operations like 'sock.recv()'
5354 # will block. Internally, file descriptors for
5355 # "blocking" Python sockets *with timeouts* are in a
5356 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5357 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5358 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005359 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005360 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005361 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005362 self.assertFalse(
5363 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005364 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005365
Charles-François Natali239bb962011-06-03 12:55:15 +02005366 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005367 def test_SOCK_NONBLOCK(self):
5368 # a lot of it seems silly and redundant, but I wanted to test that
5369 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005370 with socket.socket(socket.AF_INET,
5371 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5372 self.checkNonblock(s)
5373 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005374 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005375 s.setblocking(0)
5376 self.checkNonblock(s)
5377 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005378 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005379 s.settimeout(2.0)
5380 self.checkNonblock(s, timeout=2.0)
5381 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005382 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005383 # defaulttimeout
5384 t = socket.getdefaulttimeout()
5385 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005386 with socket.socket() as s:
5387 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005388 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005389 with socket.socket() as s:
5390 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005391 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005392 with socket.socket() as s:
5393 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005394 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005395 with socket.socket() as s:
5396 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005397 socket.setdefaulttimeout(t)
5398
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005399
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005400@unittest.skipUnless(os.name == "nt", "Windows specific")
5401@unittest.skipUnless(multiprocessing, "need multiprocessing")
5402class TestSocketSharing(SocketTCPTest):
5403 # This must be classmethod and not staticmethod or multiprocessing
5404 # won't be able to bootstrap it.
5405 @classmethod
5406 def remoteProcessServer(cls, q):
5407 # Recreate socket from shared data
5408 sdata = q.get()
5409 message = q.get()
5410
5411 s = socket.fromshare(sdata)
5412 s2, c = s.accept()
5413
5414 # Send the message
5415 s2.sendall(message)
5416 s2.close()
5417 s.close()
5418
5419 def testShare(self):
5420 # Transfer the listening server socket to another process
5421 # and service it from there.
5422
5423 # Create process:
5424 q = multiprocessing.Queue()
5425 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5426 p.start()
5427
5428 # Get the shared socket data
5429 data = self.serv.share(p.pid)
5430
5431 # Pass the shared socket to the other process
5432 addr = self.serv.getsockname()
5433 self.serv.close()
5434 q.put(data)
5435
5436 # The data that the server will send us
5437 message = b"slapmahfro"
5438 q.put(message)
5439
5440 # Connect
5441 s = socket.create_connection(addr)
5442 # listen for the data
5443 m = []
5444 while True:
5445 data = s.recv(100)
5446 if not data:
5447 break
5448 m.append(data)
5449 s.close()
5450 received = b"".join(m)
5451 self.assertEqual(received, message)
5452 p.join()
5453
5454 def testShareLength(self):
5455 data = self.serv.share(os.getpid())
5456 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5457 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5458
5459 def compareSockets(self, org, other):
5460 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005461 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005462 self.assertEqual(org.gettimeout(), None)
5463 self.assertEqual(org.gettimeout(), other.gettimeout())
5464
5465 self.assertEqual(org.family, other.family)
5466 self.assertEqual(org.type, other.type)
5467 # If the user specified "0" for proto, then
5468 # internally windows will have picked the correct value.
5469 # Python introspection on the socket however will still return
5470 # 0. For the shared socket, the python value is recreated
5471 # from the actual value, so it may not compare correctly.
5472 if org.proto != 0:
5473 self.assertEqual(org.proto, other.proto)
5474
5475 def testShareLocal(self):
5476 data = self.serv.share(os.getpid())
5477 s = socket.fromshare(data)
5478 try:
5479 self.compareSockets(self.serv, s)
5480 finally:
5481 s.close()
5482
5483 def testTypes(self):
5484 families = [socket.AF_INET, socket.AF_INET6]
5485 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5486 for f in families:
5487 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005488 try:
5489 source = socket.socket(f, t)
5490 except OSError:
5491 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005492 try:
5493 data = source.share(os.getpid())
5494 shared = socket.fromshare(data)
5495 try:
5496 self.compareSockets(source, shared)
5497 finally:
5498 shared.close()
5499 finally:
5500 source.close()
5501
5502
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005503class SendfileUsingSendTest(ThreadedTCPSocketTest):
5504 """
5505 Test the send() implementation of socket.sendfile().
5506 """
5507
Victor Stinner8c663fd2017-11-08 14:44:44 -08005508 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005509 BUFSIZE = 8192
5510 FILEDATA = b""
5511 TIMEOUT = 2
5512
5513 @classmethod
5514 def setUpClass(cls):
5515 def chunks(total, step):
5516 assert total >= step
5517 while total > step:
5518 yield step
5519 total -= step
5520 if total:
5521 yield total
5522
5523 chunk = b"".join([random.choice(string.ascii_letters).encode()
5524 for i in range(cls.BUFSIZE)])
5525 with open(support.TESTFN, 'wb') as f:
5526 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5527 f.write(chunk)
5528 with open(support.TESTFN, 'rb') as f:
5529 cls.FILEDATA = f.read()
5530 assert len(cls.FILEDATA) == cls.FILESIZE
5531
5532 @classmethod
5533 def tearDownClass(cls):
5534 support.unlink(support.TESTFN)
5535
5536 def accept_conn(self):
5537 self.serv.settimeout(self.TIMEOUT)
5538 conn, addr = self.serv.accept()
5539 conn.settimeout(self.TIMEOUT)
5540 self.addCleanup(conn.close)
5541 return conn
5542
5543 def recv_data(self, conn):
5544 received = []
5545 while True:
5546 chunk = conn.recv(self.BUFSIZE)
5547 if not chunk:
5548 break
5549 received.append(chunk)
5550 return b''.join(received)
5551
5552 def meth_from_sock(self, sock):
5553 # Depending on the mixin class being run return either send()
5554 # or sendfile() method implementation.
5555 return getattr(sock, "_sendfile_use_send")
5556
5557 # regular file
5558
5559 def _testRegularFile(self):
5560 address = self.serv.getsockname()
5561 file = open(support.TESTFN, 'rb')
5562 with socket.create_connection(address) as sock, file as file:
5563 meth = self.meth_from_sock(sock)
5564 sent = meth(file)
5565 self.assertEqual(sent, self.FILESIZE)
5566 self.assertEqual(file.tell(), self.FILESIZE)
5567
5568 def testRegularFile(self):
5569 conn = self.accept_conn()
5570 data = self.recv_data(conn)
5571 self.assertEqual(len(data), self.FILESIZE)
5572 self.assertEqual(data, self.FILEDATA)
5573
5574 # non regular file
5575
5576 def _testNonRegularFile(self):
5577 address = self.serv.getsockname()
5578 file = io.BytesIO(self.FILEDATA)
5579 with socket.create_connection(address) as sock, file as file:
5580 sent = sock.sendfile(file)
5581 self.assertEqual(sent, self.FILESIZE)
5582 self.assertEqual(file.tell(), self.FILESIZE)
5583 self.assertRaises(socket._GiveupOnSendfile,
5584 sock._sendfile_use_sendfile, file)
5585
5586 def testNonRegularFile(self):
5587 conn = self.accept_conn()
5588 data = self.recv_data(conn)
5589 self.assertEqual(len(data), self.FILESIZE)
5590 self.assertEqual(data, self.FILEDATA)
5591
5592 # empty file
5593
5594 def _testEmptyFileSend(self):
5595 address = self.serv.getsockname()
5596 filename = support.TESTFN + "2"
5597 with open(filename, 'wb'):
5598 self.addCleanup(support.unlink, filename)
5599 file = open(filename, 'rb')
5600 with socket.create_connection(address) as sock, file as file:
5601 meth = self.meth_from_sock(sock)
5602 sent = meth(file)
5603 self.assertEqual(sent, 0)
5604 self.assertEqual(file.tell(), 0)
5605
5606 def testEmptyFileSend(self):
5607 conn = self.accept_conn()
5608 data = self.recv_data(conn)
5609 self.assertEqual(data, b"")
5610
5611 # offset
5612
5613 def _testOffset(self):
5614 address = self.serv.getsockname()
5615 file = open(support.TESTFN, 'rb')
5616 with socket.create_connection(address) as sock, file as file:
5617 meth = self.meth_from_sock(sock)
5618 sent = meth(file, offset=5000)
5619 self.assertEqual(sent, self.FILESIZE - 5000)
5620 self.assertEqual(file.tell(), self.FILESIZE)
5621
5622 def testOffset(self):
5623 conn = self.accept_conn()
5624 data = self.recv_data(conn)
5625 self.assertEqual(len(data), self.FILESIZE - 5000)
5626 self.assertEqual(data, self.FILEDATA[5000:])
5627
5628 # count
5629
5630 def _testCount(self):
5631 address = self.serv.getsockname()
5632 file = open(support.TESTFN, 'rb')
5633 with socket.create_connection(address, timeout=2) as sock, file as file:
5634 count = 5000007
5635 meth = self.meth_from_sock(sock)
5636 sent = meth(file, count=count)
5637 self.assertEqual(sent, count)
5638 self.assertEqual(file.tell(), count)
5639
5640 def testCount(self):
5641 count = 5000007
5642 conn = self.accept_conn()
5643 data = self.recv_data(conn)
5644 self.assertEqual(len(data), count)
5645 self.assertEqual(data, self.FILEDATA[:count])
5646
5647 # count small
5648
5649 def _testCountSmall(self):
5650 address = self.serv.getsockname()
5651 file = open(support.TESTFN, 'rb')
5652 with socket.create_connection(address, timeout=2) as sock, file as file:
5653 count = 1
5654 meth = self.meth_from_sock(sock)
5655 sent = meth(file, count=count)
5656 self.assertEqual(sent, count)
5657 self.assertEqual(file.tell(), count)
5658
5659 def testCountSmall(self):
5660 count = 1
5661 conn = self.accept_conn()
5662 data = self.recv_data(conn)
5663 self.assertEqual(len(data), count)
5664 self.assertEqual(data, self.FILEDATA[:count])
5665
5666 # count + offset
5667
5668 def _testCountWithOffset(self):
5669 address = self.serv.getsockname()
5670 file = open(support.TESTFN, 'rb')
5671 with socket.create_connection(address, timeout=2) as sock, file as file:
5672 count = 100007
5673 meth = self.meth_from_sock(sock)
5674 sent = meth(file, offset=2007, count=count)
5675 self.assertEqual(sent, count)
5676 self.assertEqual(file.tell(), count + 2007)
5677
5678 def testCountWithOffset(self):
5679 count = 100007
5680 conn = self.accept_conn()
5681 data = self.recv_data(conn)
5682 self.assertEqual(len(data), count)
5683 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5684
5685 # non blocking sockets are not supposed to work
5686
5687 def _testNonBlocking(self):
5688 address = self.serv.getsockname()
5689 file = open(support.TESTFN, 'rb')
5690 with socket.create_connection(address) as sock, file as file:
5691 sock.setblocking(False)
5692 meth = self.meth_from_sock(sock)
5693 self.assertRaises(ValueError, meth, file)
5694 self.assertRaises(ValueError, sock.sendfile, file)
5695
5696 def testNonBlocking(self):
5697 conn = self.accept_conn()
5698 if conn.recv(8192):
5699 self.fail('was not supposed to receive any data')
5700
5701 # timeout (non-triggered)
5702
5703 def _testWithTimeout(self):
5704 address = self.serv.getsockname()
5705 file = open(support.TESTFN, 'rb')
5706 with socket.create_connection(address, timeout=2) as sock, file as file:
5707 meth = self.meth_from_sock(sock)
5708 sent = meth(file)
5709 self.assertEqual(sent, self.FILESIZE)
5710
5711 def testWithTimeout(self):
5712 conn = self.accept_conn()
5713 data = self.recv_data(conn)
5714 self.assertEqual(len(data), self.FILESIZE)
5715 self.assertEqual(data, self.FILEDATA)
5716
5717 # timeout (triggered)
5718
5719 def _testWithTimeoutTriggeredSend(self):
5720 address = self.serv.getsockname()
5721 file = open(support.TESTFN, 'rb')
5722 with socket.create_connection(address, timeout=0.01) as sock, \
5723 file as file:
5724 meth = self.meth_from_sock(sock)
5725 self.assertRaises(socket.timeout, meth, file)
5726
5727 def testWithTimeoutTriggeredSend(self):
5728 conn = self.accept_conn()
5729 conn.recv(88192)
5730
5731 # errors
5732
5733 def _test_errors(self):
5734 pass
5735
5736 def test_errors(self):
5737 with open(support.TESTFN, 'rb') as file:
5738 with socket.socket(type=socket.SOCK_DGRAM) as s:
5739 meth = self.meth_from_sock(s)
5740 self.assertRaisesRegex(
5741 ValueError, "SOCK_STREAM", meth, file)
5742 with open(support.TESTFN, 'rt') as file:
5743 with socket.socket() as s:
5744 meth = self.meth_from_sock(s)
5745 self.assertRaisesRegex(
5746 ValueError, "binary mode", meth, file)
5747 with open(support.TESTFN, 'rb') as file:
5748 with socket.socket() as s:
5749 meth = self.meth_from_sock(s)
5750 self.assertRaisesRegex(TypeError, "positive integer",
5751 meth, file, count='2')
5752 self.assertRaisesRegex(TypeError, "positive integer",
5753 meth, file, count=0.1)
5754 self.assertRaisesRegex(ValueError, "positive integer",
5755 meth, file, count=0)
5756 self.assertRaisesRegex(ValueError, "positive integer",
5757 meth, file, count=-1)
5758
5759
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005760@unittest.skipUnless(hasattr(os, "sendfile"),
5761 'os.sendfile() required for this test.')
5762class SendfileUsingSendfileTest(SendfileUsingSendTest):
5763 """
5764 Test the sendfile() implementation of socket.sendfile().
5765 """
5766 def meth_from_sock(self, sock):
5767 return getattr(sock, "_sendfile_use_sendfile")
5768
Christian Heimes48371412016-09-06 00:37:46 +02005769
5770@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005771class LinuxKernelCryptoAPI(unittest.TestCase):
5772 # tests for AF_ALG
5773 def create_alg(self, typ, name):
5774 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005775 try:
5776 sock.bind((typ, name))
5777 except FileNotFoundError as e:
5778 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005779 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005780 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005781 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005782 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005783
Victor Stinner86afc1f2017-11-30 13:58:43 +01005784 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
5785 # at least on ppc64le architecture
5786 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02005787 def test_sha256(self):
5788 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5789 "177a9cb410ff61f20015ad")
5790 with self.create_alg('hash', 'sha256') as algo:
5791 op, _ = algo.accept()
5792 with op:
5793 op.sendall(b"abc")
5794 self.assertEqual(op.recv(512), expected)
5795
5796 op, _ = algo.accept()
5797 with op:
5798 op.send(b'a', socket.MSG_MORE)
5799 op.send(b'b', socket.MSG_MORE)
5800 op.send(b'c', socket.MSG_MORE)
5801 op.send(b'')
5802 self.assertEqual(op.recv(512), expected)
5803
5804 def test_hmac_sha1(self):
5805 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5806 with self.create_alg('hash', 'hmac(sha1)') as algo:
5807 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5808 op, _ = algo.accept()
5809 with op:
5810 op.sendall(b"what do ya want for nothing?")
5811 self.assertEqual(op.recv(512), expected)
5812
Christian Heimese084f842016-09-11 20:11:30 +02005813 # Although it should work with 3.19 and newer the test blocks on
5814 # Ubuntu 15.10 with Kernel 4.2.0-19.
5815 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005816 def test_aes_cbc(self):
5817 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5818 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5819 msg = b"Single block msg"
5820 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5821 msglen = len(msg)
5822 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5823 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5824 op, _ = algo.accept()
5825 with op:
5826 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5827 flags=socket.MSG_MORE)
5828 op.sendall(msg)
5829 self.assertEqual(op.recv(msglen), ciphertext)
5830
5831 op, _ = algo.accept()
5832 with op:
5833 op.sendmsg_afalg([ciphertext],
5834 op=socket.ALG_OP_DECRYPT, iv=iv)
5835 self.assertEqual(op.recv(msglen), msg)
5836
5837 # long message
5838 multiplier = 1024
5839 longmsg = [msg] * multiplier
5840 op, _ = algo.accept()
5841 with op:
5842 op.sendmsg_afalg(longmsg,
5843 op=socket.ALG_OP_ENCRYPT, iv=iv)
5844 enc = op.recv(msglen * multiplier)
5845 self.assertEqual(len(enc), msglen * multiplier)
5846 self.assertTrue(enc[:msglen], ciphertext)
5847
5848 op, _ = algo.accept()
5849 with op:
5850 op.sendmsg_afalg([enc],
5851 op=socket.ALG_OP_DECRYPT, iv=iv)
5852 dec = op.recv(msglen * multiplier)
5853 self.assertEqual(len(dec), msglen * multiplier)
5854 self.assertEqual(dec, msg * multiplier)
5855
matejcik9764c152017-02-16 14:41:31 +01005856 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005857 def test_aead_aes_gcm(self):
5858 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5859 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5860 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5861 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5862 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5863 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5864
5865 taglen = len(expected_tag)
5866 assoclen = len(assoc)
5867
5868 with self.create_alg('aead', 'gcm(aes)') as algo:
5869 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5870 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5871 None, taglen)
5872
5873 # send assoc, plain and tag buffer in separate steps
5874 op, _ = algo.accept()
5875 with op:
5876 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5877 assoclen=assoclen, flags=socket.MSG_MORE)
5878 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005879 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005880 res = op.recv(assoclen + len(plain) + taglen)
5881 self.assertEqual(expected_ct, res[assoclen:-taglen])
5882 self.assertEqual(expected_tag, res[-taglen:])
5883
5884 # now with msg
5885 op, _ = algo.accept()
5886 with op:
matejcik9764c152017-02-16 14:41:31 +01005887 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005888 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5889 assoclen=assoclen)
5890 res = op.recv(assoclen + len(plain) + taglen)
5891 self.assertEqual(expected_ct, res[assoclen:-taglen])
5892 self.assertEqual(expected_tag, res[-taglen:])
5893
5894 # create anc data manually
5895 pack_uint32 = struct.Struct('I').pack
5896 op, _ = algo.accept()
5897 with op:
matejcik9764c152017-02-16 14:41:31 +01005898 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005899 op.sendmsg(
5900 [msg],
5901 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5902 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5903 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5904 )
5905 )
matejcik9764c152017-02-16 14:41:31 +01005906 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005907 self.assertEqual(expected_ct, res[assoclen:-taglen])
5908 self.assertEqual(expected_tag, res[-taglen:])
5909
5910 # decrypt and verify
5911 op, _ = algo.accept()
5912 with op:
5913 msg = assoc + expected_ct + expected_tag
5914 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5915 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005916 res = op.recv(len(msg) - taglen)
5917 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005918
Christian Heimese084f842016-09-11 20:11:30 +02005919 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005920 def test_drbg_pr_sha256(self):
5921 # deterministic random bit generator, prediction resistance, sha256
5922 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5923 extra_seed = os.urandom(32)
5924 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5925 op, _ = algo.accept()
5926 with op:
5927 rn = op.recv(32)
5928 self.assertEqual(len(rn), 32)
5929
5930 def test_sendmsg_afalg_args(self):
5931 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005932 with sock:
5933 with self.assertRaises(TypeError):
5934 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005935
Christian Heimes02b30352016-09-11 19:49:56 +02005936 with self.assertRaises(TypeError):
5937 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005938
Christian Heimes02b30352016-09-11 19:49:56 +02005939 with self.assertRaises(TypeError):
5940 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005941
Christian Heimes02b30352016-09-11 19:49:56 +02005942 with self.assertRaises(TypeError):
5943 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005944
Christian Heimes02b30352016-09-11 19:49:56 +02005945 with self.assertRaises(TypeError):
5946 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5947
animalize19e7d482018-02-27 02:10:36 +08005948@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
5949class TestMSWindowsTCPFlags(unittest.TestCase):
5950 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03005951 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08005952 'TCP_MAXSEG',
5953 'TCP_NODELAY',
5954 # available starting with Windows 10 1607
5955 'TCP_FASTOPEN',
5956 # available starting with Windows 10 1703
5957 'TCP_KEEPCNT',
5958 # available starting with Windows 10 1709
5959 'TCP_KEEPIDLE',
5960 'TCP_KEEPINTVL'
5961 }
5962
5963 def test_new_tcp_flags(self):
5964 provided = [s for s in dir(socket) if s.startswith('TCP')]
5965 unknown = [s for s in provided if s not in self.knownTCPFlags]
5966
5967 self.assertEqual([], unknown,
5968 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005969
Guido van Rossumb995eb72002-07-31 16:08:40 +00005970def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005971 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005972 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005973
5974 tests.extend([
5975 NonBlockingTCPTests,
5976 FileObjectClassTestCase,
5977 UnbufferedFileObjectClassTestCase,
5978 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005979 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005980 UnicodeReadFileObjectClassTestCase,
5981 UnicodeWriteFileObjectClassTestCase,
5982 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005983 NetworkConnectionNoServer,
5984 NetworkConnectionAttributesTest,
5985 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005986 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005987 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005988 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005989 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005990 tests.append(BasicSocketPairTest)
5991 tests.append(TestUnixDomain)
5992 tests.append(TestLinuxAbstractNamespace)
5993 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005994 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005995 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005996 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005997 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04005998 BasicVSOCKTest,
5999 ThreadedVSOCKSocketStreamTest,
6000 ])
6001 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006002 CmsgMacroTests,
6003 SendmsgUDPTest,
6004 RecvmsgUDPTest,
6005 RecvmsgIntoUDPTest,
6006 SendmsgUDP6Test,
6007 RecvmsgUDP6Test,
6008 RecvmsgRFC3542AncillaryUDP6Test,
6009 RecvmsgIntoRFC3542AncillaryUDP6Test,
6010 RecvmsgIntoUDP6Test,
6011 SendmsgTCPTest,
6012 RecvmsgTCPTest,
6013 RecvmsgIntoTCPTest,
6014 SendmsgSCTPStreamTest,
6015 RecvmsgSCTPStreamTest,
6016 RecvmsgIntoSCTPStreamTest,
6017 SendmsgUnixStreamTest,
6018 RecvmsgUnixStreamTest,
6019 RecvmsgIntoUnixStreamTest,
6020 RecvmsgSCMRightsStreamTest,
6021 RecvmsgIntoSCMRightsStreamTest,
6022 # These are slow when setitimer() is not available
6023 InterruptedRecvTimeoutTest,
6024 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006025 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006026 SendfileUsingSendTest,
6027 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006028 ])
animalize19e7d482018-02-27 02:10:36 +08006029 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006030
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006031 thread_info = support.threading_setup()
6032 support.run_unittest(*tests)
6033 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006034
6035if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006036 test_main()