blob: f4d58ebf7157ba6ffe355a2b97fceb36db590c17 [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']:
Miss Islington (bot)56882db2018-05-17 09:53:24 -0700896 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.
1041 if not support.is_android:
1042 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001043 eq(socket.getservbyport(port, 'tcp'), service)
1044 if udpport is not None:
1045 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001046 # Make sure getservbyport does not accept out of range ports.
1047 self.assertRaises(OverflowError, socket.getservbyport, -1)
1048 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001049
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001050 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001051 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001052 # The default timeout should initially be None
1053 self.assertEqual(socket.getdefaulttimeout(), None)
1054 s = socket.socket()
1055 self.assertEqual(s.gettimeout(), None)
1056 s.close()
1057
1058 # Set the default timeout to 10, and see if it propagates
1059 socket.setdefaulttimeout(10)
1060 self.assertEqual(socket.getdefaulttimeout(), 10)
1061 s = socket.socket()
1062 self.assertEqual(s.gettimeout(), 10)
1063 s.close()
1064
1065 # Reset the default timeout to None, and see if it propagates
1066 socket.setdefaulttimeout(None)
1067 self.assertEqual(socket.getdefaulttimeout(), None)
1068 s = socket.socket()
1069 self.assertEqual(s.gettimeout(), None)
1070 s.close()
1071
1072 # Check that setting it to an invalid value raises ValueError
1073 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1074
1075 # Check that setting it to an invalid type raises TypeError
1076 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1077
Serhiy Storchaka43767632013-11-03 21:31:38 +02001078 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1079 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001080 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001081 # Test that issue1008086 and issue767150 are fixed.
1082 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001083 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1084 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001085
Serhiy Storchaka43767632013-11-03 21:31:38 +02001086 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1087 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001088 def testIPv4toString(self):
1089 from socket import inet_aton as f, inet_pton, AF_INET
1090 g = lambda a: inet_pton(AF_INET, a)
1091
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001092 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001093 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001094 )
1095
Ezio Melottib3aedd42010-11-20 19:04:17 +00001096 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1097 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1098 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1099 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1100 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001101 # bpo-29972: inet_pton() doesn't fail on AIX
1102 if not sys.platform.startswith('aix'):
1103 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001104 assertInvalid(f, '300.0.0.0')
1105 assertInvalid(f, 'a.0.0.0')
1106 assertInvalid(f, '1.2.3.4.5')
1107 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001108
Ezio Melottib3aedd42010-11-20 19:04:17 +00001109 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1110 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1111 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1112 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001113 assertInvalid(g, '0.0.0.')
1114 assertInvalid(g, '300.0.0.0')
1115 assertInvalid(g, 'a.0.0.0')
1116 assertInvalid(g, '1.2.3.4.5')
1117 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001118
Serhiy Storchaka43767632013-11-03 21:31:38 +02001119 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1120 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001121 def testIPv6toString(self):
1122 try:
1123 from socket import inet_pton, AF_INET6, has_ipv6
1124 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001125 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001126 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001127 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001128
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001129 if sys.platform == "win32":
1130 try:
1131 inet_pton(AF_INET6, '::')
1132 except OSError as e:
1133 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001134 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001135
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001136 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001137 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001138 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001139 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001140
Ezio Melottib3aedd42010-11-20 19:04:17 +00001141 self.assertEqual(b'\x00' * 16, f('::'))
1142 self.assertEqual(b'\x00' * 16, f('0::0'))
1143 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1144 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001145 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001146 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1147 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001148 self.assertEqual(
1149 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1150 f('ad42:abc::127:0:254:2')
1151 )
1152 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1153 assertInvalid('0x20::')
1154 assertInvalid(':::')
1155 assertInvalid('::0::')
1156 assertInvalid('1::abc::')
1157 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001158 assertInvalid('1:2:3:4:5:6')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001159 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001160 # bpo-29972: inet_pton() doesn't fail on AIX
1161 if not sys.platform.startswith('aix'):
1162 assertInvalid('1:2:3:4:5:6:')
1163 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001164
1165 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1166 f('::254.42.23.64')
1167 )
1168 self.assertEqual(
1169 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1170 f('42::a29b:254.42.23.64')
1171 )
1172 self.assertEqual(
1173 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1174 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1175 )
1176 assertInvalid('255.254.253.252')
1177 assertInvalid('1::260.2.3.0')
1178 assertInvalid('1::0.be.e.0')
1179 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1180 assertInvalid('::1.2.3.4:0')
1181 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001182
Serhiy Storchaka43767632013-11-03 21:31:38 +02001183 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1184 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001185 def testStringToIPv4(self):
1186 from socket import inet_ntoa as f, inet_ntop, AF_INET
1187 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001188 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001189 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001190 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001191
Ezio Melottib3aedd42010-11-20 19:04:17 +00001192 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1193 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1194 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1195 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001196 assertInvalid(f, b'\x00' * 3)
1197 assertInvalid(f, b'\x00' * 5)
1198 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001199 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001200
Ezio Melottib3aedd42010-11-20 19:04:17 +00001201 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1202 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1203 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001204 assertInvalid(g, b'\x00' * 3)
1205 assertInvalid(g, b'\x00' * 5)
1206 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001207 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001208
Serhiy Storchaka43767632013-11-03 21:31:38 +02001209 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1210 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001211 def testStringToIPv6(self):
1212 try:
1213 from socket import inet_ntop, AF_INET6, has_ipv6
1214 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001215 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001216 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001217 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001218
1219 if sys.platform == "win32":
1220 try:
1221 inet_ntop(AF_INET6, b'\x00' * 16)
1222 except OSError as e:
1223 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001224 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001225
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001226 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001227 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001228 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001229 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001230
Ezio Melottib3aedd42010-11-20 19:04:17 +00001231 self.assertEqual('::', f(b'\x00' * 16))
1232 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1233 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001234 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001235 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001236 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001237 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001238
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001239 assertInvalid(b'\x12' * 15)
1240 assertInvalid(b'\x12' * 17)
1241 assertInvalid(b'\x12' * 4)
1242
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001243 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001244
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001245 def testSockName(self):
1246 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001247 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001248 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001249 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001250 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001251 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001252 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1253 # it reasonable to get the host's addr in addition to 0.0.0.0.
1254 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001255 try:
1256 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001257 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001258 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001259 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001260 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001261 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001262
1263 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001264 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001265 # We know a socket should start without reuse==0
1266 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001267 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001268 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001269 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001270
1271 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001272 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001273 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001274 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001275 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1276 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001277 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001278
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001279 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001280 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001281 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1282 sock.settimeout(1)
1283 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001284 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001285
Martin Panter50ab1a32016-04-11 00:38:12 +00001286 def testCloseException(self):
1287 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001288 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001289 socket.socket(fileno=sock.fileno()).close()
1290 try:
1291 sock.close()
1292 except OSError as err:
1293 # Winsock apparently raises ENOTSOCK
1294 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1295 else:
1296 self.fail("close() should raise EBADF/ENOTSOCK")
1297
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001298 def testNewAttributes(self):
1299 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001300
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001301 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1302 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001303 if hasattr(socket, 'SOCK_CLOEXEC'):
1304 self.assertIn(sock.type,
1305 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1306 socket.SOCK_STREAM))
1307 else:
1308 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001309 self.assertEqual(sock.proto, 0)
1310 sock.close()
1311
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001312 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001313 sock = socket.socket()
1314 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001315 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001316 big_port = port + 65536
1317 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001318 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1319 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1320 # Since find_unused_port() is inherently subject to race conditions, we
1321 # call it a couple times if necessary.
1322 for i in itertools.count():
1323 port = support.find_unused_port()
1324 try:
1325 sock.bind((HOST, port))
1326 except OSError as e:
1327 if e.errno != errno.EADDRINUSE or i == 5:
1328 raise
1329 else:
1330 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001331
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001332 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001333 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001334 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1335 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1336 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1337 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001338 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1339 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001340 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001341 self.assertRaises(ValueError, s.ioctl, -1, None)
1342 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001343
Steve Dowerea93ac02016-06-17 12:52:18 -07001344 @unittest.skipUnless(os.name == "nt", "Windows specific")
1345 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1346 'Loopback fast path support required for this test')
1347 def test_sio_loopback_fast_path(self):
1348 s = socket.socket()
1349 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001350 try:
1351 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1352 except OSError as exc:
1353 WSAEOPNOTSUPP = 10045
1354 if exc.winerror == WSAEOPNOTSUPP:
1355 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1356 "doesn't implemented in this Windows version")
1357 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001358 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1359
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001360 def testGetaddrinfo(self):
1361 try:
1362 socket.getaddrinfo('localhost', 80)
1363 except socket.gaierror as err:
1364 if err.errno == socket.EAI_SERVICE:
1365 # see http://bugs.python.org/issue1282647
1366 self.skipTest("buggy libc version")
1367 raise
1368 # len of every sequence is supposed to be == 5
1369 for info in socket.getaddrinfo(HOST, None):
1370 self.assertEqual(len(info), 5)
1371 # host can be a domain name, a string representation of an
1372 # IPv4/v6 address or None
1373 socket.getaddrinfo('localhost', 80)
1374 socket.getaddrinfo('127.0.0.1', 80)
1375 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001376 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001377 socket.getaddrinfo('::1', 80)
1378 # port can be a string service name such as "http", a numeric
1379 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001380 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1381 if (not hasattr(sys, 'getandroidapilevel') or
1382 sys.getandroidapilevel() >= 23):
1383 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001384 socket.getaddrinfo(HOST, 80)
1385 socket.getaddrinfo(HOST, None)
1386 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001387 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1388 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001389 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001390 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1391 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001392 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001393 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1394 for _, socktype, _, _, _ in infos:
1395 self.assertEqual(socktype, socket.SOCK_STREAM)
1396 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001397 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001398 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1399 # a server willing to support both IPv4 and IPv6 will
1400 # usually do this
1401 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1402 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001403 # test keyword arguments
1404 a = socket.getaddrinfo(HOST, None)
1405 b = socket.getaddrinfo(host=HOST, port=None)
1406 self.assertEqual(a, b)
1407 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1408 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1409 self.assertEqual(a, b)
1410 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1411 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1412 self.assertEqual(a, b)
1413 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1414 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1415 self.assertEqual(a, b)
1416 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1417 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1418 self.assertEqual(a, b)
1419 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1420 socket.AI_PASSIVE)
1421 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1422 type=socket.SOCK_STREAM, proto=0,
1423 flags=socket.AI_PASSIVE)
1424 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001425 # Issue #6697.
1426 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001427
Ned Deilyb24f4812014-02-13 22:50:42 -08001428 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001429 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001430 try:
1431 # The arguments here are undefined and the call may succeed
1432 # or fail. All we care here is that it doesn't segfault.
1433 socket.getaddrinfo("localhost", None, 0, 0, 0,
1434 socket.AI_NUMERICSERV)
1435 except socket.gaierror:
1436 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001437
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001438 def test_getnameinfo(self):
1439 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001440 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001441
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001442 @unittest.skipUnless(support.is_resource_enabled('network'),
1443 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001444 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001445 # Check for internet access before running test
1446 # (issue #12804, issue #25138).
1447 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001448 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001449
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001450 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001451 domain = 'испытание.pythontest.net'
1452 socket.gethostbyname(domain)
1453 socket.gethostbyname_ex(domain)
1454 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001455 # this may not work if the forward lookup chooses the IPv6 address, as that doesn't
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001456 # have a reverse entry yet
1457 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001458
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001459 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001460 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001461 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1462 self.skipTest("signal.alarm and socket.socketpair required for this test")
1463 # Our signal handlers clobber the C errno by calling a math function
1464 # with an invalid domain value.
1465 def ok_handler(*args):
1466 self.assertRaises(ValueError, math.acosh, 0)
1467 def raising_handler(*args):
1468 self.assertRaises(ValueError, math.acosh, 0)
1469 1 // 0
1470 c, s = socket.socketpair()
1471 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1472 try:
1473 if with_timeout:
1474 # Just above the one second minimum for signal.alarm
1475 c.settimeout(1.5)
1476 with self.assertRaises(ZeroDivisionError):
1477 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001478 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001479 if with_timeout:
1480 signal.signal(signal.SIGALRM, ok_handler)
1481 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001482 self.assertRaises(socket.timeout, c.sendall,
1483 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001484 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001485 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001486 signal.signal(signal.SIGALRM, old_alarm)
1487 c.close()
1488 s.close()
1489
1490 def test_sendall_interrupted(self):
1491 self.check_sendall_interrupted(False)
1492
1493 def test_sendall_interrupted_with_timeout(self):
1494 self.check_sendall_interrupted(True)
1495
Antoine Pitroue033e062010-10-29 10:38:18 +00001496 def test_dealloc_warn(self):
1497 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1498 r = repr(sock)
1499 with self.assertWarns(ResourceWarning) as cm:
1500 sock = None
1501 support.gc_collect()
1502 self.assertIn(r, str(cm.warning.args[0]))
1503 # An open socket file object gets dereferenced after the socket
1504 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1505 f = sock.makefile('rb')
1506 r = repr(sock)
1507 sock = None
1508 support.gc_collect()
1509 with self.assertWarns(ResourceWarning):
1510 f = None
1511 support.gc_collect()
1512
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001513 def test_name_closed_socketio(self):
1514 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1515 fp = sock.makefile("rb")
1516 fp.close()
1517 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1518
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001519 def test_unusable_closed_socketio(self):
1520 with socket.socket() as sock:
1521 fp = sock.makefile("rb", buffering=0)
1522 self.assertTrue(fp.readable())
1523 self.assertFalse(fp.writable())
1524 self.assertFalse(fp.seekable())
1525 fp.close()
1526 self.assertRaises(ValueError, fp.readable)
1527 self.assertRaises(ValueError, fp.writable)
1528 self.assertRaises(ValueError, fp.seekable)
1529
Christian Heimesd0e31b92018-01-27 09:54:13 +01001530 def test_socket_close(self):
1531 sock = socket.socket()
1532 try:
1533 sock.bind((HOST, 0))
1534 socket.close(sock.fileno())
1535 with self.assertRaises(OSError):
1536 sock.listen(1)
1537 finally:
1538 with self.assertRaises(OSError):
1539 # sock.close() fails with EBADF
1540 sock.close()
1541 with self.assertRaises(TypeError):
1542 socket.close(None)
1543 with self.assertRaises(OSError):
1544 socket.close(-1)
1545
Berker Peksag3fe64d02016-02-18 17:34:00 +02001546 def test_makefile_mode(self):
1547 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1548 with self.subTest(mode=mode):
1549 with socket.socket() as sock:
1550 with sock.makefile(mode) as fp:
1551 self.assertEqual(fp.mode, mode)
1552
1553 def test_makefile_invalid_mode(self):
1554 for mode in 'rt', 'x', '+', 'a':
1555 with self.subTest(mode=mode):
1556 with socket.socket() as sock:
1557 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1558 sock.makefile(mode)
1559
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001560 def test_pickle(self):
1561 sock = socket.socket()
1562 with sock:
1563 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1564 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001565 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1566 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1567 self.assertEqual(family, socket.AF_INET)
1568 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1569 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001570
Serhiy Storchaka78980432013-01-15 01:12:17 +02001571 def test_listen_backlog(self):
1572 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001573 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1574 srv.bind((HOST, 0))
1575 srv.listen(backlog)
1576
1577 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001578 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001579 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001580
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001581 @support.cpython_only
1582 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001583 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001584 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001585 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1586 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001587 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001588 srv.close()
1589
Charles-François Natali42663332012-01-02 15:57:30 +01001590 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001591 def test_flowinfo(self):
1592 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001593 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001594 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001595 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001596
Miss Islington (bot)04425992018-02-12 12:12:24 -08001597 @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
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002057
caaveryeffc12f2017-09-06 18:18:10 -04002058@unittest.skipIf(fcntl is None, "need fcntl")
2059@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2060 'VSOCK sockets required for this test.')
2061class BasicVSOCKTest(unittest.TestCase):
2062
2063 def testCrucialConstants(self):
2064 socket.AF_VSOCK
2065
2066 def testVSOCKConstants(self):
2067 socket.SO_VM_SOCKETS_BUFFER_SIZE
2068 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2069 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2070 socket.VMADDR_CID_ANY
2071 socket.VMADDR_PORT_ANY
2072 socket.VMADDR_CID_HOST
2073 socket.VM_SOCKETS_INVALID_VERSION
2074 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2075
2076 def testCreateSocket(self):
2077 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2078 pass
2079
2080 def testSocketBufferSize(self):
2081 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2082 orig_max = s.getsockopt(socket.AF_VSOCK,
2083 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2084 orig = s.getsockopt(socket.AF_VSOCK,
2085 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2086 orig_min = s.getsockopt(socket.AF_VSOCK,
2087 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2088
2089 s.setsockopt(socket.AF_VSOCK,
2090 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2091 s.setsockopt(socket.AF_VSOCK,
2092 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2093 s.setsockopt(socket.AF_VSOCK,
2094 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2095
2096 self.assertEqual(orig_max * 2,
2097 s.getsockopt(socket.AF_VSOCK,
2098 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2099 self.assertEqual(orig * 2,
2100 s.getsockopt(socket.AF_VSOCK,
2101 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2102 self.assertEqual(orig_min * 2,
2103 s.getsockopt(socket.AF_VSOCK,
2104 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2105
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002106
Guido van Rossum24e4af82002-06-12 19:18:08 +00002107class BasicTCPTest(SocketConnectedTest):
2108
2109 def __init__(self, methodName='runTest'):
2110 SocketConnectedTest.__init__(self, methodName=methodName)
2111
2112 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002113 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002114 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002115 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002116
2117 def _testRecv(self):
2118 self.serv_conn.send(MSG)
2119
2120 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002121 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002122 seg1 = self.cli_conn.recv(len(MSG) - 3)
2123 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002124 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002125 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002126
2127 def _testOverFlowRecv(self):
2128 self.serv_conn.send(MSG)
2129
2130 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002131 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002132 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002133 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002134
2135 def _testRecvFrom(self):
2136 self.serv_conn.send(MSG)
2137
2138 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002139 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002140 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2141 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002142 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002143 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002144
2145 def _testOverFlowRecvFrom(self):
2146 self.serv_conn.send(MSG)
2147
2148 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002149 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002150 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002151 while 1:
2152 read = self.cli_conn.recv(1024)
2153 if not read:
2154 break
Guido van Rossume531e292002-08-08 20:28:34 +00002155 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002156 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002157
2158 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002159 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002160 self.serv_conn.sendall(big_chunk)
2161
2162 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002163 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002164 fd = self.cli_conn.fileno()
2165 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002166 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002167 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002168 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002169 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002170
2171 def _testFromFd(self):
2172 self.serv_conn.send(MSG)
2173
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002174 def testDup(self):
2175 # Testing dup()
2176 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002177 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002178 msg = sock.recv(1024)
2179 self.assertEqual(msg, MSG)
2180
2181 def _testDup(self):
2182 self.serv_conn.send(MSG)
2183
Guido van Rossum24e4af82002-06-12 19:18:08 +00002184 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002185 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002186 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002187 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002188 # wait for _testShutdown to finish: on OS X, when the server
2189 # closes the connection the client also becomes disconnected,
2190 # and the client's shutdown call will fail. (Issue #4397.)
2191 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002192
2193 def _testShutdown(self):
2194 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002195 self.serv_conn.shutdown(2)
2196
2197 testShutdown_overflow = support.cpython_only(testShutdown)
2198
2199 @support.cpython_only
2200 def _testShutdown_overflow(self):
2201 import _testcapi
2202 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002203 # Issue 15989
2204 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2205 _testcapi.INT_MAX + 1)
2206 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2207 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002208 self.serv_conn.shutdown(2)
2209
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002210 def testDetach(self):
2211 # Testing detach()
2212 fileno = self.cli_conn.fileno()
2213 f = self.cli_conn.detach()
2214 self.assertEqual(f, fileno)
2215 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002216 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002217 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002218 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002219 # ...but we can create another socket using the (still open)
2220 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002221 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002222 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002223 msg = sock.recv(1024)
2224 self.assertEqual(msg, MSG)
2225
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002226 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002227 self.serv_conn.send(MSG)
2228
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002229
Guido van Rossum24e4af82002-06-12 19:18:08 +00002230class BasicUDPTest(ThreadedUDPSocketTest):
2231
2232 def __init__(self, methodName='runTest'):
2233 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2234
2235 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002236 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002237 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002238 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002239
2240 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002241 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002242
Guido van Rossum1c938012002-06-12 21:17:20 +00002243 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002244 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002245 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002246 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002247
Guido van Rossum1c938012002-06-12 21:17:20 +00002248 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002249 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002250
Guido van Rossumd8faa362007-04-27 19:54:29 +00002251 def testRecvFromNegative(self):
2252 # Negative lengths passed to recvfrom should give ValueError.
2253 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2254
2255 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002256 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002257
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002258# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2259# same test code is used with different families and types of socket
2260# (e.g. stream, datagram), and tests using recvmsg() are repeated
2261# using recvmsg_into().
2262#
2263# The generic test classes such as SendmsgTests and
2264# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2265# supplied with sockets cli_sock and serv_sock representing the
2266# client's and the server's end of the connection respectively, and
2267# attributes cli_addr and serv_addr holding their (numeric where
2268# appropriate) addresses.
2269#
2270# The final concrete test classes combine these with subclasses of
2271# SocketTestBase which set up client and server sockets of a specific
2272# type, and with subclasses of SendrecvmsgBase such as
2273# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2274# sockets to cli_sock and serv_sock and override the methods and
2275# attributes of SendrecvmsgBase to fill in destination addresses if
2276# needed when sending, check for specific flags in msg_flags, etc.
2277#
2278# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2279# recvmsg_into().
2280
2281# XXX: like the other datagram (UDP) tests in this module, the code
2282# here assumes that datagram delivery on the local machine will be
2283# reliable.
2284
2285class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2286 # Base class for sendmsg()/recvmsg() tests.
2287
2288 # Time in seconds to wait before considering a test failed, or
2289 # None for no timeout. Not all tests actually set a timeout.
2290 fail_timeout = 3.0
2291
2292 def setUp(self):
2293 self.misc_event = threading.Event()
2294 super().setUp()
2295
2296 def sendToServer(self, msg):
2297 # Send msg to the server.
2298 return self.cli_sock.send(msg)
2299
2300 # Tuple of alternative default arguments for sendmsg() when called
2301 # via sendmsgToServer() (e.g. to include a destination address).
2302 sendmsg_to_server_defaults = ()
2303
2304 def sendmsgToServer(self, *args):
2305 # Call sendmsg() on self.cli_sock with the given arguments,
2306 # filling in any arguments which are not supplied with the
2307 # corresponding items of self.sendmsg_to_server_defaults, if
2308 # any.
2309 return self.cli_sock.sendmsg(
2310 *(args + self.sendmsg_to_server_defaults[len(args):]))
2311
2312 def doRecvmsg(self, sock, bufsize, *args):
2313 # Call recvmsg() on sock with given arguments and return its
2314 # result. Should be used for tests which can use either
2315 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2316 # this method with one which emulates it using recvmsg_into(),
2317 # thus allowing the same test to be used for both methods.
2318 result = sock.recvmsg(bufsize, *args)
2319 self.registerRecvmsgResult(result)
2320 return result
2321
2322 def registerRecvmsgResult(self, result):
2323 # Called by doRecvmsg() with the return value of recvmsg() or
2324 # recvmsg_into(). Can be overridden to arrange cleanup based
2325 # on the returned ancillary data, for instance.
2326 pass
2327
2328 def checkRecvmsgAddress(self, addr1, addr2):
2329 # Called to compare the received address with the address of
2330 # the peer.
2331 self.assertEqual(addr1, addr2)
2332
2333 # Flags that are normally unset in msg_flags
2334 msg_flags_common_unset = 0
2335 for name in ("MSG_CTRUNC", "MSG_OOB"):
2336 msg_flags_common_unset |= getattr(socket, name, 0)
2337
2338 # Flags that are normally set
2339 msg_flags_common_set = 0
2340
2341 # Flags set when a complete record has been received (e.g. MSG_EOR
2342 # for SCTP)
2343 msg_flags_eor_indicator = 0
2344
2345 # Flags set when a complete record has not been received
2346 # (e.g. MSG_TRUNC for datagram sockets)
2347 msg_flags_non_eor_indicator = 0
2348
2349 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2350 # Method to check the value of msg_flags returned by recvmsg[_into]().
2351 #
2352 # Checks that all bits in msg_flags_common_set attribute are
2353 # set in "flags" and all bits in msg_flags_common_unset are
2354 # unset.
2355 #
2356 # The "eor" argument specifies whether the flags should
2357 # indicate that a full record (or datagram) has been received.
2358 # If "eor" is None, no checks are done; otherwise, checks
2359 # that:
2360 #
2361 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2362 # set and all bits in msg_flags_non_eor_indicator are unset
2363 #
2364 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2365 # are set and all bits in msg_flags_eor_indicator are unset
2366 #
2367 # If "checkset" and/or "checkunset" are supplied, they require
2368 # the given bits to be set or unset respectively, overriding
2369 # what the attributes require for those bits.
2370 #
2371 # If any bits are set in "ignore", they will not be checked,
2372 # regardless of the other inputs.
2373 #
2374 # Will raise Exception if the inputs require a bit to be both
2375 # set and unset, and it is not ignored.
2376
2377 defaultset = self.msg_flags_common_set
2378 defaultunset = self.msg_flags_common_unset
2379
2380 if eor:
2381 defaultset |= self.msg_flags_eor_indicator
2382 defaultunset |= self.msg_flags_non_eor_indicator
2383 elif eor is not None:
2384 defaultset |= self.msg_flags_non_eor_indicator
2385 defaultunset |= self.msg_flags_eor_indicator
2386
2387 # Function arguments override defaults
2388 defaultset &= ~checkunset
2389 defaultunset &= ~checkset
2390
2391 # Merge arguments with remaining defaults, and check for conflicts
2392 checkset |= defaultset
2393 checkunset |= defaultunset
2394 inboth = checkset & checkunset & ~ignore
2395 if inboth:
2396 raise Exception("contradictory set, unset requirements for flags "
2397 "{0:#x}".format(inboth))
2398
2399 # Compare with given msg_flags value
2400 mask = (checkset | checkunset) & ~ignore
2401 self.assertEqual(flags & mask, checkset & mask)
2402
2403
2404class RecvmsgIntoMixin(SendrecvmsgBase):
2405 # Mixin to implement doRecvmsg() using recvmsg_into().
2406
2407 def doRecvmsg(self, sock, bufsize, *args):
2408 buf = bytearray(bufsize)
2409 result = sock.recvmsg_into([buf], *args)
2410 self.registerRecvmsgResult(result)
2411 self.assertGreaterEqual(result[0], 0)
2412 self.assertLessEqual(result[0], bufsize)
2413 return (bytes(buf[:result[0]]),) + result[1:]
2414
2415
2416class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2417 # Defines flags to be checked in msg_flags for datagram sockets.
2418
2419 @property
2420 def msg_flags_non_eor_indicator(self):
2421 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2422
2423
2424class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2425 # Defines flags to be checked in msg_flags for SCTP sockets.
2426
2427 @property
2428 def msg_flags_eor_indicator(self):
2429 return super().msg_flags_eor_indicator | socket.MSG_EOR
2430
2431
2432class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2433 # Base class for tests on connectionless-mode sockets. Users must
2434 # supply sockets on attributes cli and serv to be mapped to
2435 # cli_sock and serv_sock respectively.
2436
2437 @property
2438 def serv_sock(self):
2439 return self.serv
2440
2441 @property
2442 def cli_sock(self):
2443 return self.cli
2444
2445 @property
2446 def sendmsg_to_server_defaults(self):
2447 return ([], [], 0, self.serv_addr)
2448
2449 def sendToServer(self, msg):
2450 return self.cli_sock.sendto(msg, self.serv_addr)
2451
2452
2453class SendrecvmsgConnectedBase(SendrecvmsgBase):
2454 # Base class for tests on connected sockets. Users must supply
2455 # sockets on attributes serv_conn and cli_conn (representing the
2456 # connections *to* the server and the client), to be mapped to
2457 # cli_sock and serv_sock respectively.
2458
2459 @property
2460 def serv_sock(self):
2461 return self.cli_conn
2462
2463 @property
2464 def cli_sock(self):
2465 return self.serv_conn
2466
2467 def checkRecvmsgAddress(self, addr1, addr2):
2468 # Address is currently "unspecified" for a connected socket,
2469 # so we don't examine it
2470 pass
2471
2472
2473class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2474 # Base class to set a timeout on server's socket.
2475
2476 def setUp(self):
2477 super().setUp()
2478 self.serv_sock.settimeout(self.fail_timeout)
2479
2480
2481class SendmsgTests(SendrecvmsgServerTimeoutBase):
2482 # Tests for sendmsg() which can use any socket type and do not
2483 # involve recvmsg() or recvmsg_into().
2484
2485 def testSendmsg(self):
2486 # Send a simple message with sendmsg().
2487 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2488
2489 def _testSendmsg(self):
2490 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2491
2492 def testSendmsgDataGenerator(self):
2493 # Send from buffer obtained from a generator (not a sequence).
2494 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2495
2496 def _testSendmsgDataGenerator(self):
2497 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2498 len(MSG))
2499
2500 def testSendmsgAncillaryGenerator(self):
2501 # Gather (empty) ancillary data from a generator.
2502 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2503
2504 def _testSendmsgAncillaryGenerator(self):
2505 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2506 len(MSG))
2507
2508 def testSendmsgArray(self):
2509 # Send data from an array instead of the usual bytes object.
2510 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2511
2512 def _testSendmsgArray(self):
2513 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2514 len(MSG))
2515
2516 def testSendmsgGather(self):
2517 # Send message data from more than one buffer (gather write).
2518 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2519
2520 def _testSendmsgGather(self):
2521 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2522
2523 def testSendmsgBadArgs(self):
2524 # Check that sendmsg() rejects invalid arguments.
2525 self.assertEqual(self.serv_sock.recv(1000), b"done")
2526
2527 def _testSendmsgBadArgs(self):
2528 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2529 self.assertRaises(TypeError, self.sendmsgToServer,
2530 b"not in an iterable")
2531 self.assertRaises(TypeError, self.sendmsgToServer,
2532 object())
2533 self.assertRaises(TypeError, self.sendmsgToServer,
2534 [object()])
2535 self.assertRaises(TypeError, self.sendmsgToServer,
2536 [MSG, object()])
2537 self.assertRaises(TypeError, self.sendmsgToServer,
2538 [MSG], object())
2539 self.assertRaises(TypeError, self.sendmsgToServer,
2540 [MSG], [], object())
2541 self.assertRaises(TypeError, self.sendmsgToServer,
2542 [MSG], [], 0, object())
2543 self.sendToServer(b"done")
2544
2545 def testSendmsgBadCmsg(self):
2546 # Check that invalid ancillary data items are rejected.
2547 self.assertEqual(self.serv_sock.recv(1000), b"done")
2548
2549 def _testSendmsgBadCmsg(self):
2550 self.assertRaises(TypeError, self.sendmsgToServer,
2551 [MSG], [object()])
2552 self.assertRaises(TypeError, self.sendmsgToServer,
2553 [MSG], [(object(), 0, b"data")])
2554 self.assertRaises(TypeError, self.sendmsgToServer,
2555 [MSG], [(0, object(), b"data")])
2556 self.assertRaises(TypeError, self.sendmsgToServer,
2557 [MSG], [(0, 0, object())])
2558 self.assertRaises(TypeError, self.sendmsgToServer,
2559 [MSG], [(0, 0)])
2560 self.assertRaises(TypeError, self.sendmsgToServer,
2561 [MSG], [(0, 0, b"data", 42)])
2562 self.sendToServer(b"done")
2563
2564 @requireAttrs(socket, "CMSG_SPACE")
2565 def testSendmsgBadMultiCmsg(self):
2566 # Check that invalid ancillary data items are rejected when
2567 # more than one item is present.
2568 self.assertEqual(self.serv_sock.recv(1000), b"done")
2569
2570 @testSendmsgBadMultiCmsg.client_skip
2571 def _testSendmsgBadMultiCmsg(self):
2572 self.assertRaises(TypeError, self.sendmsgToServer,
2573 [MSG], [0, 0, b""])
2574 self.assertRaises(TypeError, self.sendmsgToServer,
2575 [MSG], [(0, 0, b""), object()])
2576 self.sendToServer(b"done")
2577
2578 def testSendmsgExcessCmsgReject(self):
2579 # Check that sendmsg() rejects excess ancillary data items
2580 # when the number that can be sent is limited.
2581 self.assertEqual(self.serv_sock.recv(1000), b"done")
2582
2583 def _testSendmsgExcessCmsgReject(self):
2584 if not hasattr(socket, "CMSG_SPACE"):
2585 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002586 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002587 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2588 self.assertIsNone(cm.exception.errno)
2589 self.sendToServer(b"done")
2590
2591 def testSendmsgAfterClose(self):
2592 # Check that sendmsg() fails on a closed socket.
2593 pass
2594
2595 def _testSendmsgAfterClose(self):
2596 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002597 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002598
2599
2600class SendmsgStreamTests(SendmsgTests):
2601 # Tests for sendmsg() which require a stream socket and do not
2602 # involve recvmsg() or recvmsg_into().
2603
2604 def testSendmsgExplicitNoneAddr(self):
2605 # Check that peer address can be specified as None.
2606 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2607
2608 def _testSendmsgExplicitNoneAddr(self):
2609 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2610
2611 def testSendmsgTimeout(self):
2612 # Check that timeout works with sendmsg().
2613 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2614 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2615
2616 def _testSendmsgTimeout(self):
2617 try:
2618 self.cli_sock.settimeout(0.03)
2619 with self.assertRaises(socket.timeout):
2620 while True:
2621 self.sendmsgToServer([b"a"*512])
2622 finally:
2623 self.misc_event.set()
2624
2625 # XXX: would be nice to have more tests for sendmsg flags argument.
2626
2627 # Linux supports MSG_DONTWAIT when sending, but in general, it
2628 # only works when receiving. Could add other platforms if they
2629 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002630 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002631 "MSG_DONTWAIT not known to work on this platform when "
2632 "sending")
2633 def testSendmsgDontWait(self):
2634 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2635 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2636 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2637
2638 @testSendmsgDontWait.client_skip
2639 def _testSendmsgDontWait(self):
2640 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002641 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002642 while True:
2643 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2644 self.assertIn(cm.exception.errno,
2645 (errno.EAGAIN, errno.EWOULDBLOCK))
2646 finally:
2647 self.misc_event.set()
2648
2649
2650class SendmsgConnectionlessTests(SendmsgTests):
2651 # Tests for sendmsg() which require a connectionless-mode
2652 # (e.g. datagram) socket, and do not involve recvmsg() or
2653 # recvmsg_into().
2654
2655 def testSendmsgNoDestAddr(self):
2656 # Check that sendmsg() fails when no destination address is
2657 # given for unconnected socket.
2658 pass
2659
2660 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002661 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002662 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002663 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002664 [MSG], [], 0, None)
2665
2666
2667class RecvmsgGenericTests(SendrecvmsgBase):
2668 # Tests for recvmsg() which can also be emulated using
2669 # recvmsg_into(), and can use any socket type.
2670
2671 def testRecvmsg(self):
2672 # Receive a simple message with recvmsg[_into]().
2673 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2674 self.assertEqual(msg, MSG)
2675 self.checkRecvmsgAddress(addr, self.cli_addr)
2676 self.assertEqual(ancdata, [])
2677 self.checkFlags(flags, eor=True)
2678
2679 def _testRecvmsg(self):
2680 self.sendToServer(MSG)
2681
2682 def testRecvmsgExplicitDefaults(self):
2683 # Test recvmsg[_into]() with default arguments provided explicitly.
2684 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2685 len(MSG), 0, 0)
2686 self.assertEqual(msg, MSG)
2687 self.checkRecvmsgAddress(addr, self.cli_addr)
2688 self.assertEqual(ancdata, [])
2689 self.checkFlags(flags, eor=True)
2690
2691 def _testRecvmsgExplicitDefaults(self):
2692 self.sendToServer(MSG)
2693
2694 def testRecvmsgShorter(self):
2695 # Receive a message smaller than buffer.
2696 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2697 len(MSG) + 42)
2698 self.assertEqual(msg, MSG)
2699 self.checkRecvmsgAddress(addr, self.cli_addr)
2700 self.assertEqual(ancdata, [])
2701 self.checkFlags(flags, eor=True)
2702
2703 def _testRecvmsgShorter(self):
2704 self.sendToServer(MSG)
2705
2706 def testRecvmsgTrunc(self):
2707 # Receive part of message, check for truncation indicators.
2708 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2709 len(MSG) - 3)
2710 self.assertEqual(msg, MSG[:-3])
2711 self.checkRecvmsgAddress(addr, self.cli_addr)
2712 self.assertEqual(ancdata, [])
2713 self.checkFlags(flags, eor=False)
2714
2715 def _testRecvmsgTrunc(self):
2716 self.sendToServer(MSG)
2717
2718 def testRecvmsgShortAncillaryBuf(self):
2719 # Test ancillary data buffer too small to hold any ancillary data.
2720 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2721 len(MSG), 1)
2722 self.assertEqual(msg, MSG)
2723 self.checkRecvmsgAddress(addr, self.cli_addr)
2724 self.assertEqual(ancdata, [])
2725 self.checkFlags(flags, eor=True)
2726
2727 def _testRecvmsgShortAncillaryBuf(self):
2728 self.sendToServer(MSG)
2729
2730 def testRecvmsgLongAncillaryBuf(self):
2731 # Test large ancillary data buffer.
2732 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2733 len(MSG), 10240)
2734 self.assertEqual(msg, MSG)
2735 self.checkRecvmsgAddress(addr, self.cli_addr)
2736 self.assertEqual(ancdata, [])
2737 self.checkFlags(flags, eor=True)
2738
2739 def _testRecvmsgLongAncillaryBuf(self):
2740 self.sendToServer(MSG)
2741
2742 def testRecvmsgAfterClose(self):
2743 # Check that recvmsg[_into]() fails on a closed socket.
2744 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002745 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002746
2747 def _testRecvmsgAfterClose(self):
2748 pass
2749
2750 def testRecvmsgTimeout(self):
2751 # Check that timeout works.
2752 try:
2753 self.serv_sock.settimeout(0.03)
2754 self.assertRaises(socket.timeout,
2755 self.doRecvmsg, self.serv_sock, len(MSG))
2756 finally:
2757 self.misc_event.set()
2758
2759 def _testRecvmsgTimeout(self):
2760 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2761
2762 @requireAttrs(socket, "MSG_PEEK")
2763 def testRecvmsgPeek(self):
2764 # Check that MSG_PEEK in flags enables examination of pending
2765 # data without consuming it.
2766
2767 # Receive part of data with MSG_PEEK.
2768 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2769 len(MSG) - 3, 0,
2770 socket.MSG_PEEK)
2771 self.assertEqual(msg, MSG[:-3])
2772 self.checkRecvmsgAddress(addr, self.cli_addr)
2773 self.assertEqual(ancdata, [])
2774 # Ignoring MSG_TRUNC here (so this test is the same for stream
2775 # and datagram sockets). Some wording in POSIX seems to
2776 # suggest that it needn't be set when peeking, but that may
2777 # just be a slip.
2778 self.checkFlags(flags, eor=False,
2779 ignore=getattr(socket, "MSG_TRUNC", 0))
2780
2781 # Receive all data with MSG_PEEK.
2782 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2783 len(MSG), 0,
2784 socket.MSG_PEEK)
2785 self.assertEqual(msg, MSG)
2786 self.checkRecvmsgAddress(addr, self.cli_addr)
2787 self.assertEqual(ancdata, [])
2788 self.checkFlags(flags, eor=True)
2789
2790 # Check that the same data can still be received normally.
2791 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2792 self.assertEqual(msg, MSG)
2793 self.checkRecvmsgAddress(addr, self.cli_addr)
2794 self.assertEqual(ancdata, [])
2795 self.checkFlags(flags, eor=True)
2796
2797 @testRecvmsgPeek.client_skip
2798 def _testRecvmsgPeek(self):
2799 self.sendToServer(MSG)
2800
2801 @requireAttrs(socket.socket, "sendmsg")
2802 def testRecvmsgFromSendmsg(self):
2803 # Test receiving with recvmsg[_into]() when message is sent
2804 # using sendmsg().
2805 self.serv_sock.settimeout(self.fail_timeout)
2806 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2807 self.assertEqual(msg, MSG)
2808 self.checkRecvmsgAddress(addr, self.cli_addr)
2809 self.assertEqual(ancdata, [])
2810 self.checkFlags(flags, eor=True)
2811
2812 @testRecvmsgFromSendmsg.client_skip
2813 def _testRecvmsgFromSendmsg(self):
2814 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2815
2816
2817class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2818 # Tests which require a stream socket and can use either recvmsg()
2819 # or recvmsg_into().
2820
2821 def testRecvmsgEOF(self):
2822 # Receive end-of-stream indicator (b"", peer socket closed).
2823 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2824 self.assertEqual(msg, b"")
2825 self.checkRecvmsgAddress(addr, self.cli_addr)
2826 self.assertEqual(ancdata, [])
2827 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2828
2829 def _testRecvmsgEOF(self):
2830 self.cli_sock.close()
2831
2832 def testRecvmsgOverflow(self):
2833 # Receive a message in more than one chunk.
2834 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2835 len(MSG) - 3)
2836 self.checkRecvmsgAddress(addr, self.cli_addr)
2837 self.assertEqual(ancdata, [])
2838 self.checkFlags(flags, eor=False)
2839
2840 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2841 self.checkRecvmsgAddress(addr, self.cli_addr)
2842 self.assertEqual(ancdata, [])
2843 self.checkFlags(flags, eor=True)
2844
2845 msg = seg1 + seg2
2846 self.assertEqual(msg, MSG)
2847
2848 def _testRecvmsgOverflow(self):
2849 self.sendToServer(MSG)
2850
2851
2852class RecvmsgTests(RecvmsgGenericTests):
2853 # Tests for recvmsg() which can use any socket type.
2854
2855 def testRecvmsgBadArgs(self):
2856 # Check that recvmsg() rejects invalid arguments.
2857 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2858 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2859 -1, 0, 0)
2860 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2861 len(MSG), -1, 0)
2862 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2863 [bytearray(10)], 0, 0)
2864 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2865 object(), 0, 0)
2866 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2867 len(MSG), object(), 0)
2868 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2869 len(MSG), 0, object())
2870
2871 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2872 self.assertEqual(msg, MSG)
2873 self.checkRecvmsgAddress(addr, self.cli_addr)
2874 self.assertEqual(ancdata, [])
2875 self.checkFlags(flags, eor=True)
2876
2877 def _testRecvmsgBadArgs(self):
2878 self.sendToServer(MSG)
2879
2880
2881class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2882 # Tests for recvmsg_into() which can use any socket type.
2883
2884 def testRecvmsgIntoBadArgs(self):
2885 # Check that recvmsg_into() rejects invalid arguments.
2886 buf = bytearray(len(MSG))
2887 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2888 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2889 len(MSG), 0, 0)
2890 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2891 buf, 0, 0)
2892 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2893 [object()], 0, 0)
2894 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2895 [b"I'm not writable"], 0, 0)
2896 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2897 [buf, object()], 0, 0)
2898 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2899 [buf], -1, 0)
2900 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2901 [buf], object(), 0)
2902 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2903 [buf], 0, object())
2904
2905 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2906 self.assertEqual(nbytes, len(MSG))
2907 self.assertEqual(buf, bytearray(MSG))
2908 self.checkRecvmsgAddress(addr, self.cli_addr)
2909 self.assertEqual(ancdata, [])
2910 self.checkFlags(flags, eor=True)
2911
2912 def _testRecvmsgIntoBadArgs(self):
2913 self.sendToServer(MSG)
2914
2915 def testRecvmsgIntoGenerator(self):
2916 # Receive into buffer obtained from a generator (not a sequence).
2917 buf = bytearray(len(MSG))
2918 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2919 (o for o in [buf]))
2920 self.assertEqual(nbytes, len(MSG))
2921 self.assertEqual(buf, bytearray(MSG))
2922 self.checkRecvmsgAddress(addr, self.cli_addr)
2923 self.assertEqual(ancdata, [])
2924 self.checkFlags(flags, eor=True)
2925
2926 def _testRecvmsgIntoGenerator(self):
2927 self.sendToServer(MSG)
2928
2929 def testRecvmsgIntoArray(self):
2930 # Receive into an array rather than the usual bytearray.
2931 buf = array.array("B", [0] * len(MSG))
2932 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2933 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002934 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002935 self.checkRecvmsgAddress(addr, self.cli_addr)
2936 self.assertEqual(ancdata, [])
2937 self.checkFlags(flags, eor=True)
2938
2939 def _testRecvmsgIntoArray(self):
2940 self.sendToServer(MSG)
2941
2942 def testRecvmsgIntoScatter(self):
2943 # Receive into multiple buffers (scatter write).
2944 b1 = bytearray(b"----")
2945 b2 = bytearray(b"0123456789")
2946 b3 = bytearray(b"--------------")
2947 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2948 [b1, memoryview(b2)[2:9], b3])
2949 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2950 self.assertEqual(b1, bytearray(b"Mary"))
2951 self.assertEqual(b2, bytearray(b"01 had a 9"))
2952 self.assertEqual(b3, bytearray(b"little lamb---"))
2953 self.checkRecvmsgAddress(addr, self.cli_addr)
2954 self.assertEqual(ancdata, [])
2955 self.checkFlags(flags, eor=True)
2956
2957 def _testRecvmsgIntoScatter(self):
2958 self.sendToServer(b"Mary had a little lamb")
2959
2960
2961class CmsgMacroTests(unittest.TestCase):
2962 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2963 # assumptions used by sendmsg() and recvmsg[_into](), which share
2964 # code with these functions.
2965
2966 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002967 try:
2968 import _testcapi
2969 except ImportError:
2970 socklen_t_limit = 0x7fffffff
2971 else:
2972 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002973
2974 @requireAttrs(socket, "CMSG_LEN")
2975 def testCMSG_LEN(self):
2976 # Test CMSG_LEN() with various valid and invalid values,
2977 # checking the assumptions used by recvmsg() and sendmsg().
2978 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2979 values = list(range(257)) + list(range(toobig - 257, toobig))
2980
2981 # struct cmsghdr has at least three members, two of which are ints
2982 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2983 for n in values:
2984 ret = socket.CMSG_LEN(n)
2985 # This is how recvmsg() calculates the data size
2986 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2987 self.assertLessEqual(ret, self.socklen_t_limit)
2988
2989 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2990 # sendmsg() shares code with these functions, and requires
2991 # that it reject values over the limit.
2992 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2993 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2994
2995 @requireAttrs(socket, "CMSG_SPACE")
2996 def testCMSG_SPACE(self):
2997 # Test CMSG_SPACE() with various valid and invalid values,
2998 # checking the assumptions used by sendmsg().
2999 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3000 values = list(range(257)) + list(range(toobig - 257, toobig))
3001
3002 last = socket.CMSG_SPACE(0)
3003 # struct cmsghdr has at least three members, two of which are ints
3004 self.assertGreater(last, array.array("i").itemsize * 2)
3005 for n in values:
3006 ret = socket.CMSG_SPACE(n)
3007 self.assertGreaterEqual(ret, last)
3008 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3009 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3010 self.assertLessEqual(ret, self.socklen_t_limit)
3011 last = ret
3012
3013 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3014 # sendmsg() shares code with these functions, and requires
3015 # that it reject values over the limit.
3016 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3017 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3018
3019
3020class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3021 # Tests for file descriptor passing on Unix-domain sockets.
3022
3023 # Invalid file descriptor value that's unlikely to evaluate to a
3024 # real FD even if one of its bytes is replaced with a different
3025 # value (which shouldn't actually happen).
3026 badfd = -0x5555
3027
3028 def newFDs(self, n):
3029 # Return a list of n file descriptors for newly-created files
3030 # containing their list indices as ASCII numbers.
3031 fds = []
3032 for i in range(n):
3033 fd, path = tempfile.mkstemp()
3034 self.addCleanup(os.unlink, path)
3035 self.addCleanup(os.close, fd)
3036 os.write(fd, str(i).encode())
3037 fds.append(fd)
3038 return fds
3039
3040 def checkFDs(self, fds):
3041 # Check that the file descriptors in the given list contain
3042 # their correct list indices as ASCII numbers.
3043 for n, fd in enumerate(fds):
3044 os.lseek(fd, 0, os.SEEK_SET)
3045 self.assertEqual(os.read(fd, 1024), str(n).encode())
3046
3047 def registerRecvmsgResult(self, result):
3048 self.addCleanup(self.closeRecvmsgFDs, result)
3049
3050 def closeRecvmsgFDs(self, recvmsg_result):
3051 # Close all file descriptors specified in the ancillary data
3052 # of the given return value from recvmsg() or recvmsg_into().
3053 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3054 if (cmsg_level == socket.SOL_SOCKET and
3055 cmsg_type == socket.SCM_RIGHTS):
3056 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003057 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003058 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3059 for fd in fds:
3060 os.close(fd)
3061
3062 def createAndSendFDs(self, n):
3063 # Send n new file descriptors created by newFDs() to the
3064 # server, with the constant MSG as the non-ancillary data.
3065 self.assertEqual(
3066 self.sendmsgToServer([MSG],
3067 [(socket.SOL_SOCKET,
3068 socket.SCM_RIGHTS,
3069 array.array("i", self.newFDs(n)))]),
3070 len(MSG))
3071
3072 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3073 # Check that constant MSG was received with numfds file
3074 # descriptors in a maximum of maxcmsgs control messages (which
3075 # must contain only complete integers). By default, check
3076 # that MSG_CTRUNC is unset, but ignore any flags in
3077 # ignoreflags.
3078 msg, ancdata, flags, addr = result
3079 self.assertEqual(msg, MSG)
3080 self.checkRecvmsgAddress(addr, self.cli_addr)
3081 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3082 ignore=ignoreflags)
3083
3084 self.assertIsInstance(ancdata, list)
3085 self.assertLessEqual(len(ancdata), maxcmsgs)
3086 fds = array.array("i")
3087 for item in ancdata:
3088 self.assertIsInstance(item, tuple)
3089 cmsg_level, cmsg_type, cmsg_data = item
3090 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3091 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3092 self.assertIsInstance(cmsg_data, bytes)
3093 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003094 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003095
3096 self.assertEqual(len(fds), numfds)
3097 self.checkFDs(fds)
3098
3099 def testFDPassSimple(self):
3100 # Pass a single FD (array read from bytes object).
3101 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3102 len(MSG), 10240))
3103
3104 def _testFDPassSimple(self):
3105 self.assertEqual(
3106 self.sendmsgToServer(
3107 [MSG],
3108 [(socket.SOL_SOCKET,
3109 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003110 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003111 len(MSG))
3112
3113 def testMultipleFDPass(self):
3114 # Pass multiple FDs in a single array.
3115 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3116 len(MSG), 10240))
3117
3118 def _testMultipleFDPass(self):
3119 self.createAndSendFDs(4)
3120
3121 @requireAttrs(socket, "CMSG_SPACE")
3122 def testFDPassCMSG_SPACE(self):
3123 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3124 self.checkRecvmsgFDs(
3125 4, self.doRecvmsg(self.serv_sock, len(MSG),
3126 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3127
3128 @testFDPassCMSG_SPACE.client_skip
3129 def _testFDPassCMSG_SPACE(self):
3130 self.createAndSendFDs(4)
3131
3132 def testFDPassCMSG_LEN(self):
3133 # Test using CMSG_LEN() to calculate ancillary buffer size.
3134 self.checkRecvmsgFDs(1,
3135 self.doRecvmsg(self.serv_sock, len(MSG),
3136 socket.CMSG_LEN(4 * SIZEOF_INT)),
3137 # RFC 3542 says implementations may set
3138 # MSG_CTRUNC if there isn't enough space
3139 # for trailing padding.
3140 ignoreflags=socket.MSG_CTRUNC)
3141
3142 def _testFDPassCMSG_LEN(self):
3143 self.createAndSendFDs(1)
3144
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003145 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003146 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003147 @requireAttrs(socket, "CMSG_SPACE")
3148 def testFDPassSeparate(self):
3149 # Pass two FDs in two separate arrays. Arrays may be combined
3150 # into a single control message by the OS.
3151 self.checkRecvmsgFDs(2,
3152 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3153 maxcmsgs=2)
3154
3155 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003156 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003157 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003158 def _testFDPassSeparate(self):
3159 fd0, fd1 = self.newFDs(2)
3160 self.assertEqual(
3161 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3162 socket.SCM_RIGHTS,
3163 array.array("i", [fd0])),
3164 (socket.SOL_SOCKET,
3165 socket.SCM_RIGHTS,
3166 array.array("i", [fd1]))]),
3167 len(MSG))
3168
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003169 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003170 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003171 @requireAttrs(socket, "CMSG_SPACE")
3172 def testFDPassSeparateMinSpace(self):
3173 # Pass two FDs in two separate arrays, receiving them into the
3174 # minimum space for two arrays.
3175 self.checkRecvmsgFDs(2,
3176 self.doRecvmsg(self.serv_sock, len(MSG),
3177 socket.CMSG_SPACE(SIZEOF_INT) +
3178 socket.CMSG_LEN(SIZEOF_INT)),
3179 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3180
3181 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003182 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003183 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003184 def _testFDPassSeparateMinSpace(self):
3185 fd0, fd1 = self.newFDs(2)
3186 self.assertEqual(
3187 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3188 socket.SCM_RIGHTS,
3189 array.array("i", [fd0])),
3190 (socket.SOL_SOCKET,
3191 socket.SCM_RIGHTS,
3192 array.array("i", [fd1]))]),
3193 len(MSG))
3194
3195 def sendAncillaryIfPossible(self, msg, ancdata):
3196 # Try to send msg and ancdata to server, but if the system
3197 # call fails, just send msg with no ancillary data.
3198 try:
3199 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003200 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003201 # Check that it was the system call that failed
3202 self.assertIsInstance(e.errno, int)
3203 nbytes = self.sendmsgToServer([msg])
3204 self.assertEqual(nbytes, len(msg))
3205
Brett Cannon3bbad122015-12-28 17:21:44 -08003206 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003207 def testFDPassEmpty(self):
3208 # Try to pass an empty FD array. Can receive either no array
3209 # or an empty array.
3210 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3211 len(MSG), 10240),
3212 ignoreflags=socket.MSG_CTRUNC)
3213
3214 def _testFDPassEmpty(self):
3215 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3216 socket.SCM_RIGHTS,
3217 b"")])
3218
3219 def testFDPassPartialInt(self):
3220 # Try to pass a truncated FD array.
3221 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3222 len(MSG), 10240)
3223 self.assertEqual(msg, MSG)
3224 self.checkRecvmsgAddress(addr, self.cli_addr)
3225 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3226 self.assertLessEqual(len(ancdata), 1)
3227 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3228 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3229 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3230 self.assertLess(len(cmsg_data), SIZEOF_INT)
3231
3232 def _testFDPassPartialInt(self):
3233 self.sendAncillaryIfPossible(
3234 MSG,
3235 [(socket.SOL_SOCKET,
3236 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003237 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003238
3239 @requireAttrs(socket, "CMSG_SPACE")
3240 def testFDPassPartialIntInMiddle(self):
3241 # Try to pass two FD arrays, the first of which is truncated.
3242 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3243 len(MSG), 10240)
3244 self.assertEqual(msg, MSG)
3245 self.checkRecvmsgAddress(addr, self.cli_addr)
3246 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3247 self.assertLessEqual(len(ancdata), 2)
3248 fds = array.array("i")
3249 # Arrays may have been combined in a single control message
3250 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3251 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3252 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003253 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003254 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3255 self.assertLessEqual(len(fds), 2)
3256 self.checkFDs(fds)
3257
3258 @testFDPassPartialIntInMiddle.client_skip
3259 def _testFDPassPartialIntInMiddle(self):
3260 fd0, fd1 = self.newFDs(2)
3261 self.sendAncillaryIfPossible(
3262 MSG,
3263 [(socket.SOL_SOCKET,
3264 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003265 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003266 (socket.SOL_SOCKET,
3267 socket.SCM_RIGHTS,
3268 array.array("i", [fd1]))])
3269
3270 def checkTruncatedHeader(self, result, ignoreflags=0):
3271 # Check that no ancillary data items are returned when data is
3272 # truncated inside the cmsghdr structure.
3273 msg, ancdata, flags, addr = result
3274 self.assertEqual(msg, MSG)
3275 self.checkRecvmsgAddress(addr, self.cli_addr)
3276 self.assertEqual(ancdata, [])
3277 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3278 ignore=ignoreflags)
3279
3280 def testCmsgTruncNoBufSize(self):
3281 # Check that no ancillary data is received when no buffer size
3282 # is specified.
3283 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3284 # BSD seems to set MSG_CTRUNC only
3285 # if an item has been partially
3286 # received.
3287 ignoreflags=socket.MSG_CTRUNC)
3288
3289 def _testCmsgTruncNoBufSize(self):
3290 self.createAndSendFDs(1)
3291
3292 def testCmsgTrunc0(self):
3293 # Check that no ancillary data is received when buffer size is 0.
3294 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3295 ignoreflags=socket.MSG_CTRUNC)
3296
3297 def _testCmsgTrunc0(self):
3298 self.createAndSendFDs(1)
3299
3300 # Check that no ancillary data is returned for various non-zero
3301 # (but still too small) buffer sizes.
3302
3303 def testCmsgTrunc1(self):
3304 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3305
3306 def _testCmsgTrunc1(self):
3307 self.createAndSendFDs(1)
3308
3309 def testCmsgTrunc2Int(self):
3310 # The cmsghdr structure has at least three members, two of
3311 # which are ints, so we still shouldn't see any ancillary
3312 # data.
3313 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3314 SIZEOF_INT * 2))
3315
3316 def _testCmsgTrunc2Int(self):
3317 self.createAndSendFDs(1)
3318
3319 def testCmsgTruncLen0Minus1(self):
3320 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3321 socket.CMSG_LEN(0) - 1))
3322
3323 def _testCmsgTruncLen0Minus1(self):
3324 self.createAndSendFDs(1)
3325
3326 # The following tests try to truncate the control message in the
3327 # middle of the FD array.
3328
3329 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3330 # Check that file descriptor data is truncated to between
3331 # mindata and maxdata bytes when received with buffer size
3332 # ancbuf, and that any complete file descriptor numbers are
3333 # valid.
3334 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3335 len(MSG), ancbuf)
3336 self.assertEqual(msg, MSG)
3337 self.checkRecvmsgAddress(addr, self.cli_addr)
3338 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3339
3340 if mindata == 0 and ancdata == []:
3341 return
3342 self.assertEqual(len(ancdata), 1)
3343 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3344 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3345 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3346 self.assertGreaterEqual(len(cmsg_data), mindata)
3347 self.assertLessEqual(len(cmsg_data), maxdata)
3348 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003349 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003350 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3351 self.checkFDs(fds)
3352
3353 def testCmsgTruncLen0(self):
3354 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3355
3356 def _testCmsgTruncLen0(self):
3357 self.createAndSendFDs(1)
3358
3359 def testCmsgTruncLen0Plus1(self):
3360 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3361
3362 def _testCmsgTruncLen0Plus1(self):
3363 self.createAndSendFDs(2)
3364
3365 def testCmsgTruncLen1(self):
3366 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3367 maxdata=SIZEOF_INT)
3368
3369 def _testCmsgTruncLen1(self):
3370 self.createAndSendFDs(2)
3371
3372 def testCmsgTruncLen2Minus1(self):
3373 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3374 maxdata=(2 * SIZEOF_INT) - 1)
3375
3376 def _testCmsgTruncLen2Minus1(self):
3377 self.createAndSendFDs(2)
3378
3379
3380class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3381 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3382 # features of the RFC 3542 Advanced Sockets API for IPv6.
3383 # Currently we can only handle certain data items (e.g. traffic
3384 # class, hop limit, MTU discovery and fragmentation settings)
3385 # without resorting to unportable means such as the struct module,
3386 # but the tests here are aimed at testing the ancillary data
3387 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3388 # itself.
3389
3390 # Test value to use when setting hop limit of packet
3391 hop_limit = 2
3392
3393 # Test value to use when setting traffic class of packet.
3394 # -1 means "use kernel default".
3395 traffic_class = -1
3396
3397 def ancillaryMapping(self, ancdata):
3398 # Given ancillary data list ancdata, return a mapping from
3399 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3400 # Check that no (level, type) pair appears more than once.
3401 d = {}
3402 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3403 self.assertNotIn((cmsg_level, cmsg_type), d)
3404 d[(cmsg_level, cmsg_type)] = cmsg_data
3405 return d
3406
3407 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3408 # Receive hop limit into ancbufsize bytes of ancillary data
3409 # space. Check that data is MSG, ancillary data is not
3410 # truncated (but ignore any flags in ignoreflags), and hop
3411 # limit is between 0 and maxhop inclusive.
3412 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3413 socket.IPV6_RECVHOPLIMIT, 1)
3414 self.misc_event.set()
3415 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3416 len(MSG), ancbufsize)
3417
3418 self.assertEqual(msg, MSG)
3419 self.checkRecvmsgAddress(addr, self.cli_addr)
3420 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3421 ignore=ignoreflags)
3422
3423 self.assertEqual(len(ancdata), 1)
3424 self.assertIsInstance(ancdata[0], tuple)
3425 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3426 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3427 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3428 self.assertIsInstance(cmsg_data, bytes)
3429 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3430 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003431 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003432 self.assertGreaterEqual(a[0], 0)
3433 self.assertLessEqual(a[0], maxhop)
3434
3435 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3436 def testRecvHopLimit(self):
3437 # Test receiving the packet hop limit as ancillary data.
3438 self.checkHopLimit(ancbufsize=10240)
3439
3440 @testRecvHopLimit.client_skip
3441 def _testRecvHopLimit(self):
3442 # Need to wait until server has asked to receive ancillary
3443 # data, as implementations are not required to buffer it
3444 # otherwise.
3445 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3446 self.sendToServer(MSG)
3447
3448 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3449 def testRecvHopLimitCMSG_SPACE(self):
3450 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3451 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3452
3453 @testRecvHopLimitCMSG_SPACE.client_skip
3454 def _testRecvHopLimitCMSG_SPACE(self):
3455 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3456 self.sendToServer(MSG)
3457
3458 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3459 # 3542 says portable applications must provide space for trailing
3460 # padding. Implementations may set MSG_CTRUNC if there isn't
3461 # enough space for the padding.
3462
3463 @requireAttrs(socket.socket, "sendmsg")
3464 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3465 def testSetHopLimit(self):
3466 # Test setting hop limit on outgoing packet and receiving it
3467 # at the other end.
3468 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3469
3470 @testSetHopLimit.client_skip
3471 def _testSetHopLimit(self):
3472 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3473 self.assertEqual(
3474 self.sendmsgToServer([MSG],
3475 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3476 array.array("i", [self.hop_limit]))]),
3477 len(MSG))
3478
3479 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3480 ignoreflags=0):
3481 # Receive traffic class and hop limit into ancbufsize bytes of
3482 # ancillary data space. Check that data is MSG, ancillary
3483 # data is not truncated (but ignore any flags in ignoreflags),
3484 # and traffic class and hop limit are in range (hop limit no
3485 # more than maxhop).
3486 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3487 socket.IPV6_RECVHOPLIMIT, 1)
3488 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3489 socket.IPV6_RECVTCLASS, 1)
3490 self.misc_event.set()
3491 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3492 len(MSG), ancbufsize)
3493
3494 self.assertEqual(msg, MSG)
3495 self.checkRecvmsgAddress(addr, self.cli_addr)
3496 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3497 ignore=ignoreflags)
3498 self.assertEqual(len(ancdata), 2)
3499 ancmap = self.ancillaryMapping(ancdata)
3500
3501 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3502 self.assertEqual(len(tcdata), SIZEOF_INT)
3503 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003504 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003505 self.assertGreaterEqual(a[0], 0)
3506 self.assertLessEqual(a[0], 255)
3507
3508 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3509 self.assertEqual(len(hldata), SIZEOF_INT)
3510 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003511 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003512 self.assertGreaterEqual(a[0], 0)
3513 self.assertLessEqual(a[0], maxhop)
3514
3515 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3516 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3517 def testRecvTrafficClassAndHopLimit(self):
3518 # Test receiving traffic class and hop limit as ancillary data.
3519 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3520
3521 @testRecvTrafficClassAndHopLimit.client_skip
3522 def _testRecvTrafficClassAndHopLimit(self):
3523 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3524 self.sendToServer(MSG)
3525
3526 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3527 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3528 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3529 # Test receiving traffic class and hop limit, using
3530 # CMSG_SPACE() to calculate buffer size.
3531 self.checkTrafficClassAndHopLimit(
3532 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3533
3534 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3535 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3536 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3537 self.sendToServer(MSG)
3538
3539 @requireAttrs(socket.socket, "sendmsg")
3540 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3541 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3542 def testSetTrafficClassAndHopLimit(self):
3543 # Test setting traffic class and hop limit on outgoing packet,
3544 # and receiving them at the other end.
3545 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3546 maxhop=self.hop_limit)
3547
3548 @testSetTrafficClassAndHopLimit.client_skip
3549 def _testSetTrafficClassAndHopLimit(self):
3550 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3551 self.assertEqual(
3552 self.sendmsgToServer([MSG],
3553 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3554 array.array("i", [self.traffic_class])),
3555 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3556 array.array("i", [self.hop_limit]))]),
3557 len(MSG))
3558
3559 @requireAttrs(socket.socket, "sendmsg")
3560 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3561 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3562 def testOddCmsgSize(self):
3563 # Try to send ancillary data with first item one byte too
3564 # long. Fall back to sending with correct size if this fails,
3565 # and check that second item was handled correctly.
3566 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3567 maxhop=self.hop_limit)
3568
3569 @testOddCmsgSize.client_skip
3570 def _testOddCmsgSize(self):
3571 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3572 try:
3573 nbytes = self.sendmsgToServer(
3574 [MSG],
3575 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003576 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003577 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3578 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003579 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003580 self.assertIsInstance(e.errno, int)
3581 nbytes = self.sendmsgToServer(
3582 [MSG],
3583 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3584 array.array("i", [self.traffic_class])),
3585 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3586 array.array("i", [self.hop_limit]))])
3587 self.assertEqual(nbytes, len(MSG))
3588
3589 # Tests for proper handling of truncated ancillary data
3590
3591 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3592 # Receive hop limit into ancbufsize bytes of ancillary data
3593 # space, which should be too small to contain the ancillary
3594 # data header (if ancbufsize is None, pass no second argument
3595 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3596 # (unless included in ignoreflags), and no ancillary data is
3597 # returned.
3598 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3599 socket.IPV6_RECVHOPLIMIT, 1)
3600 self.misc_event.set()
3601 args = () if ancbufsize is None else (ancbufsize,)
3602 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3603 len(MSG), *args)
3604
3605 self.assertEqual(msg, MSG)
3606 self.checkRecvmsgAddress(addr, self.cli_addr)
3607 self.assertEqual(ancdata, [])
3608 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3609 ignore=ignoreflags)
3610
3611 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3612 def testCmsgTruncNoBufSize(self):
3613 # Check that no ancillary data is received when no ancillary
3614 # buffer size is provided.
3615 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3616 # BSD seems to set
3617 # MSG_CTRUNC only if an item
3618 # has been partially
3619 # received.
3620 ignoreflags=socket.MSG_CTRUNC)
3621
3622 @testCmsgTruncNoBufSize.client_skip
3623 def _testCmsgTruncNoBufSize(self):
3624 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3625 self.sendToServer(MSG)
3626
3627 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3628 def testSingleCmsgTrunc0(self):
3629 # Check that no ancillary data is received when ancillary
3630 # buffer size is zero.
3631 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3632 ignoreflags=socket.MSG_CTRUNC)
3633
3634 @testSingleCmsgTrunc0.client_skip
3635 def _testSingleCmsgTrunc0(self):
3636 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3637 self.sendToServer(MSG)
3638
3639 # Check that no ancillary data is returned for various non-zero
3640 # (but still too small) buffer sizes.
3641
3642 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3643 def testSingleCmsgTrunc1(self):
3644 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3645
3646 @testSingleCmsgTrunc1.client_skip
3647 def _testSingleCmsgTrunc1(self):
3648 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3649 self.sendToServer(MSG)
3650
3651 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3652 def testSingleCmsgTrunc2Int(self):
3653 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3654
3655 @testSingleCmsgTrunc2Int.client_skip
3656 def _testSingleCmsgTrunc2Int(self):
3657 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3658 self.sendToServer(MSG)
3659
3660 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3661 def testSingleCmsgTruncLen0Minus1(self):
3662 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3663
3664 @testSingleCmsgTruncLen0Minus1.client_skip
3665 def _testSingleCmsgTruncLen0Minus1(self):
3666 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3667 self.sendToServer(MSG)
3668
3669 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3670 def testSingleCmsgTruncInData(self):
3671 # Test truncation of a control message inside its associated
3672 # data. The message may be returned with its data truncated,
3673 # or not returned at all.
3674 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3675 socket.IPV6_RECVHOPLIMIT, 1)
3676 self.misc_event.set()
3677 msg, ancdata, flags, addr = self.doRecvmsg(
3678 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3679
3680 self.assertEqual(msg, MSG)
3681 self.checkRecvmsgAddress(addr, self.cli_addr)
3682 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3683
3684 self.assertLessEqual(len(ancdata), 1)
3685 if ancdata:
3686 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3687 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3688 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3689 self.assertLess(len(cmsg_data), SIZEOF_INT)
3690
3691 @testSingleCmsgTruncInData.client_skip
3692 def _testSingleCmsgTruncInData(self):
3693 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3694 self.sendToServer(MSG)
3695
3696 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3697 # Receive traffic class and hop limit into ancbufsize bytes of
3698 # ancillary data space, which should be large enough to
3699 # contain the first item, but too small to contain the header
3700 # of the second. Check that data is MSG, MSG_CTRUNC is set
3701 # (unless included in ignoreflags), and only one ancillary
3702 # data item is returned.
3703 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3704 socket.IPV6_RECVHOPLIMIT, 1)
3705 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3706 socket.IPV6_RECVTCLASS, 1)
3707 self.misc_event.set()
3708 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3709 len(MSG), ancbufsize)
3710
3711 self.assertEqual(msg, MSG)
3712 self.checkRecvmsgAddress(addr, self.cli_addr)
3713 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3714 ignore=ignoreflags)
3715
3716 self.assertEqual(len(ancdata), 1)
3717 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3718 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3719 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3720 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3721 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003722 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003723 self.assertGreaterEqual(a[0], 0)
3724 self.assertLessEqual(a[0], 255)
3725
3726 # Try the above test with various buffer sizes.
3727
3728 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3729 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3730 def testSecondCmsgTrunc0(self):
3731 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3732 ignoreflags=socket.MSG_CTRUNC)
3733
3734 @testSecondCmsgTrunc0.client_skip
3735 def _testSecondCmsgTrunc0(self):
3736 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3737 self.sendToServer(MSG)
3738
3739 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3740 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3741 def testSecondCmsgTrunc1(self):
3742 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3743
3744 @testSecondCmsgTrunc1.client_skip
3745 def _testSecondCmsgTrunc1(self):
3746 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3747 self.sendToServer(MSG)
3748
3749 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3750 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3751 def testSecondCmsgTrunc2Int(self):
3752 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3753 2 * SIZEOF_INT)
3754
3755 @testSecondCmsgTrunc2Int.client_skip
3756 def _testSecondCmsgTrunc2Int(self):
3757 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3758 self.sendToServer(MSG)
3759
3760 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3761 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3762 def testSecondCmsgTruncLen0Minus1(self):
3763 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3764 socket.CMSG_LEN(0) - 1)
3765
3766 @testSecondCmsgTruncLen0Minus1.client_skip
3767 def _testSecondCmsgTruncLen0Minus1(self):
3768 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3769 self.sendToServer(MSG)
3770
3771 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3772 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3773 def testSecomdCmsgTruncInData(self):
3774 # Test truncation of the second of two control messages inside
3775 # its associated data.
3776 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3777 socket.IPV6_RECVHOPLIMIT, 1)
3778 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3779 socket.IPV6_RECVTCLASS, 1)
3780 self.misc_event.set()
3781 msg, ancdata, flags, addr = self.doRecvmsg(
3782 self.serv_sock, len(MSG),
3783 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3784
3785 self.assertEqual(msg, MSG)
3786 self.checkRecvmsgAddress(addr, self.cli_addr)
3787 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3788
3789 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3790
3791 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3792 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3793 cmsg_types.remove(cmsg_type)
3794 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3795 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003796 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003797 self.assertGreaterEqual(a[0], 0)
3798 self.assertLessEqual(a[0], 255)
3799
3800 if ancdata:
3801 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3802 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3803 cmsg_types.remove(cmsg_type)
3804 self.assertLess(len(cmsg_data), SIZEOF_INT)
3805
3806 self.assertEqual(ancdata, [])
3807
3808 @testSecomdCmsgTruncInData.client_skip
3809 def _testSecomdCmsgTruncInData(self):
3810 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3811 self.sendToServer(MSG)
3812
3813
3814# Derive concrete test classes for different socket types.
3815
3816class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3817 SendrecvmsgConnectionlessBase,
3818 ThreadedSocketTestMixin, UDPTestBase):
3819 pass
3820
3821@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003822class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3823 pass
3824
3825@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003826class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3827 pass
3828
3829@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003830class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3831 pass
3832
3833
3834class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3835 SendrecvmsgConnectionlessBase,
3836 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003837
3838 def checkRecvmsgAddress(self, addr1, addr2):
3839 # Called to compare the received address with the address of
3840 # the peer, ignoring scope ID
3841 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003842
3843@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003844@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003845@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003846class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3847 pass
3848
3849@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003850@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003851@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003852class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3853 pass
3854
3855@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003856@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003857@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003858class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3859 pass
3860
3861@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003862@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003863@requireAttrs(socket, "IPPROTO_IPV6")
3864@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003865class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3866 SendrecvmsgUDP6TestBase):
3867 pass
3868
3869@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003870@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003871@requireAttrs(socket, "IPPROTO_IPV6")
3872@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003873class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3874 RFC3542AncillaryTest,
3875 SendrecvmsgUDP6TestBase):
3876 pass
3877
3878
3879class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3880 ConnectedStreamTestMixin, TCPTestBase):
3881 pass
3882
3883@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003884class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3885 pass
3886
3887@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003888class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3889 SendrecvmsgTCPTestBase):
3890 pass
3891
3892@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003893class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3894 SendrecvmsgTCPTestBase):
3895 pass
3896
3897
3898class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3899 SendrecvmsgConnectedBase,
3900 ConnectedStreamTestMixin, SCTPStreamBase):
3901 pass
3902
3903@requireAttrs(socket.socket, "sendmsg")
3904@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003905class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3906 pass
3907
3908@requireAttrs(socket.socket, "recvmsg")
3909@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003910class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3911 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003912
3913 def testRecvmsgEOF(self):
3914 try:
3915 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3916 except OSError as e:
3917 if e.errno != errno.ENOTCONN:
3918 raise
3919 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003920
3921@requireAttrs(socket.socket, "recvmsg_into")
3922@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003923class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3924 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003925
3926 def testRecvmsgEOF(self):
3927 try:
3928 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3929 except OSError as e:
3930 if e.errno != errno.ENOTCONN:
3931 raise
3932 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003933
3934
3935class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3936 ConnectedStreamTestMixin, UnixStreamBase):
3937 pass
3938
3939@requireAttrs(socket.socket, "sendmsg")
3940@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003941class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3942 pass
3943
3944@requireAttrs(socket.socket, "recvmsg")
3945@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003946class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3947 SendrecvmsgUnixStreamTestBase):
3948 pass
3949
3950@requireAttrs(socket.socket, "recvmsg_into")
3951@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003952class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3953 SendrecvmsgUnixStreamTestBase):
3954 pass
3955
3956@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3957@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003958class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3959 pass
3960
3961@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3962@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003963class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3964 SendrecvmsgUnixStreamTestBase):
3965 pass
3966
3967
3968# Test interrupting the interruptible send/receive methods with a
3969# signal when a timeout is set. These tests avoid having multiple
3970# threads alive during the test so that the OS cannot deliver the
3971# signal to the wrong one.
3972
3973class InterruptedTimeoutBase(unittest.TestCase):
3974 # Base class for interrupted send/receive tests. Installs an
3975 # empty handler for SIGALRM and removes it on teardown, along with
3976 # any scheduled alarms.
3977
3978 def setUp(self):
3979 super().setUp()
3980 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003981 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003982 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003983
3984 # Timeout for socket operations
3985 timeout = 4.0
3986
3987 # Provide setAlarm() method to schedule delivery of SIGALRM after
3988 # given number of seconds, or cancel it if zero, and an
3989 # appropriate time value to use. Use setitimer() if available.
3990 if hasattr(signal, "setitimer"):
3991 alarm_time = 0.05
3992
3993 def setAlarm(self, seconds):
3994 signal.setitimer(signal.ITIMER_REAL, seconds)
3995 else:
3996 # Old systems may deliver the alarm up to one second early
3997 alarm_time = 2
3998
3999 def setAlarm(self, seconds):
4000 signal.alarm(seconds)
4001
4002
4003# Require siginterrupt() in order to ensure that system calls are
4004# interrupted by default.
4005@requireAttrs(signal, "siginterrupt")
4006@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4007 "Don't have signal.alarm or signal.setitimer")
4008class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4009 # Test interrupting the recv*() methods with signals when a
4010 # timeout is set.
4011
4012 def setUp(self):
4013 super().setUp()
4014 self.serv.settimeout(self.timeout)
4015
4016 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004017 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004018 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004019 try:
4020 self.setAlarm(self.alarm_time)
4021 with self.assertRaises(ZeroDivisionError) as cm:
4022 func(*args, **kwargs)
4023 finally:
4024 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004025
4026 def testInterruptedRecvTimeout(self):
4027 self.checkInterruptedRecv(self.serv.recv, 1024)
4028
4029 def testInterruptedRecvIntoTimeout(self):
4030 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4031
4032 def testInterruptedRecvfromTimeout(self):
4033 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4034
4035 def testInterruptedRecvfromIntoTimeout(self):
4036 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4037
4038 @requireAttrs(socket.socket, "recvmsg")
4039 def testInterruptedRecvmsgTimeout(self):
4040 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4041
4042 @requireAttrs(socket.socket, "recvmsg_into")
4043 def testInterruptedRecvmsgIntoTimeout(self):
4044 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4045
4046
4047# Require siginterrupt() in order to ensure that system calls are
4048# interrupted by default.
4049@requireAttrs(signal, "siginterrupt")
4050@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4051 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004052class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4053 ThreadSafeCleanupTestCase,
4054 SocketListeningTestMixin, TCPTestBase):
4055 # Test interrupting the interruptible send*() methods with signals
4056 # when a timeout is set.
4057
4058 def setUp(self):
4059 super().setUp()
4060 self.serv_conn = self.newSocket()
4061 self.addCleanup(self.serv_conn.close)
4062 # Use a thread to complete the connection, but wait for it to
4063 # terminate before running the test, so that there is only one
4064 # thread to accept the signal.
4065 cli_thread = threading.Thread(target=self.doConnect)
4066 cli_thread.start()
4067 self.cli_conn, addr = self.serv.accept()
4068 self.addCleanup(self.cli_conn.close)
4069 cli_thread.join()
4070 self.serv_conn.settimeout(self.timeout)
4071
4072 def doConnect(self):
4073 self.serv_conn.connect(self.serv_addr)
4074
4075 def checkInterruptedSend(self, func, *args, **kwargs):
4076 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004077 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004078 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004079 try:
4080 with self.assertRaises(ZeroDivisionError) as cm:
4081 while True:
4082 self.setAlarm(self.alarm_time)
4083 func(*args, **kwargs)
4084 finally:
4085 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004086
Ned Deilyc5640382014-02-03 13:58:31 -08004087 # Issue #12958: The following tests have problems on OS X prior to 10.7
4088 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004089 def testInterruptedSendTimeout(self):
4090 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4091
Ned Deilyc5640382014-02-03 13:58:31 -08004092 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004093 def testInterruptedSendtoTimeout(self):
4094 # Passing an actual address here as Python's wrapper for
4095 # sendto() doesn't allow passing a zero-length one; POSIX
4096 # requires that the address is ignored since the socket is
4097 # connection-mode, however.
4098 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4099 self.serv_addr)
4100
Ned Deilyc5640382014-02-03 13:58:31 -08004101 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004102 @requireAttrs(socket.socket, "sendmsg")
4103 def testInterruptedSendmsgTimeout(self):
4104 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4105
4106
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004107class TCPCloserTest(ThreadedTCPSocketTest):
4108
4109 def testClose(self):
4110 conn, addr = self.serv.accept()
4111 conn.close()
4112
4113 sd = self.cli
4114 read, write, err = select.select([sd], [], [], 1.0)
4115 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004116 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004117
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004118 # Calling close() many times should be safe.
4119 conn.close()
4120 conn.close()
4121
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004122 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004123 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004124 time.sleep(1.0)
4125
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004126
Dave Cole331708b2004-08-09 04:51:41 +00004127class BasicSocketPairTest(SocketPairTest):
4128
4129 def __init__(self, methodName='runTest'):
4130 SocketPairTest.__init__(self, methodName=methodName)
4131
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004132 def _check_defaults(self, sock):
4133 self.assertIsInstance(sock, socket.socket)
4134 if hasattr(socket, 'AF_UNIX'):
4135 self.assertEqual(sock.family, socket.AF_UNIX)
4136 else:
4137 self.assertEqual(sock.family, socket.AF_INET)
4138 self.assertEqual(sock.type, socket.SOCK_STREAM)
4139 self.assertEqual(sock.proto, 0)
4140
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004141 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004142 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004143
4144 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004145 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004146
Dave Cole331708b2004-08-09 04:51:41 +00004147 def testRecv(self):
4148 msg = self.serv.recv(1024)
4149 self.assertEqual(msg, MSG)
4150
4151 def _testRecv(self):
4152 self.cli.send(MSG)
4153
4154 def testSend(self):
4155 self.serv.send(MSG)
4156
4157 def _testSend(self):
4158 msg = self.cli.recv(1024)
4159 self.assertEqual(msg, MSG)
4160
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004161
Guido van Rossum24e4af82002-06-12 19:18:08 +00004162class NonBlockingTCPTests(ThreadedTCPSocketTest):
4163
4164 def __init__(self, methodName='runTest'):
4165 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4166
4167 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004168 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004169 self.serv.setblocking(True)
4170 self.assertIsNone(self.serv.gettimeout())
Yury Selivanovf11b4602018-01-28 17:27:38 -05004171 self.assertTrue(self.serv.getblocking())
4172 if fcntl:
4173 self.assertTrue(_is_fd_in_blocking_mode(self.serv))
4174
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004175 self.serv.setblocking(False)
4176 self.assertEqual(self.serv.gettimeout(), 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004177 self.assertFalse(self.serv.getblocking())
4178 if fcntl:
4179 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4180
4181 self.serv.settimeout(None)
4182 self.assertTrue(self.serv.getblocking())
4183 if fcntl:
4184 self.assertTrue(_is_fd_in_blocking_mode(self.serv))
4185
4186 self.serv.settimeout(0)
4187 self.assertFalse(self.serv.getblocking())
4188 self.assertEqual(self.serv.gettimeout(), 0)
4189 if fcntl:
4190 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4191
4192 self.serv.settimeout(10)
4193 self.assertTrue(self.serv.getblocking())
4194 self.assertEqual(self.serv.gettimeout(), 10)
4195 if fcntl:
4196 # When a Python socket has a non-zero timeout, it's
4197 # switched internally to a non-blocking mode.
4198 # Later, sock.sendall(), sock.recv(), and other socket
4199 # operations use a `select()` call and handle EWOULDBLOCK/EGAIN
4200 # on all socket operations. That's how timeouts are
4201 # enforced.
4202 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4203
4204 self.serv.settimeout(0)
4205 self.assertFalse(self.serv.getblocking())
4206 if fcntl:
4207 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4208
Guido van Rossum24e4af82002-06-12 19:18:08 +00004209 start = time.time()
4210 try:
4211 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004212 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004213 pass
4214 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004215 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00004216
4217 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004218 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004219
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004220 @support.cpython_only
4221 def testSetBlocking_overflow(self):
4222 # Issue 15989
4223 import _testcapi
4224 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4225 self.skipTest('needs UINT_MAX < ULONG_MAX')
4226 self.serv.setblocking(False)
4227 self.assertEqual(self.serv.gettimeout(), 0.0)
4228 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4229 self.assertIsNone(self.serv.gettimeout())
4230
4231 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4232
Serhiy Storchaka43767632013-11-03 21:31:38 +02004233 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4234 'test needs socket.SOCK_NONBLOCK')
4235 @support.requires_linux_version(2, 6, 28)
4236 def testInitNonBlocking(self):
4237 # reinit server socket
4238 self.serv.close()
4239 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
4240 socket.SOCK_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004241 self.assertFalse(self.serv.getblocking())
4242 self.assertEqual(self.serv.gettimeout(), 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004243 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01004244 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02004245 # actual testing
4246 start = time.time()
4247 try:
4248 self.serv.accept()
4249 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00004250 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02004251 end = time.time()
4252 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
4253
4254 def _testInitNonBlocking(self):
4255 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004256
Antoine Pitrou600232b2011-01-05 21:03:42 +00004257 def testInheritFlags(self):
4258 # Issue #7995: when calling accept() on a listening socket with a
4259 # timeout, the resulting socket should not be non-blocking.
4260 self.serv.settimeout(10)
4261 try:
4262 conn, addr = self.serv.accept()
4263 message = conn.recv(len(MSG))
4264 finally:
4265 conn.close()
4266 self.serv.settimeout(None)
4267
4268 def _testInheritFlags(self):
4269 time.sleep(0.1)
4270 self.cli.connect((HOST, self.port))
4271 time.sleep(0.5)
4272 self.cli.send(MSG)
4273
Guido van Rossum24e4af82002-06-12 19:18:08 +00004274 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004275 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004276 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00004277 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004278 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004279 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004280 pass
4281 else:
4282 self.fail("Error trying to do non-blocking accept.")
4283 read, write, err = select.select([self.serv], [], [])
4284 if self.serv in read:
4285 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07004286 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00004287 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004288 else:
4289 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004290
Guido van Rossum24e4af82002-06-12 19:18:08 +00004291 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004292 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00004293 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004294
4295 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004296 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00004297 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004298 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004299
4300 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00004301 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00004302 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004303
4304 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004305 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004306 conn, addr = self.serv.accept()
4307 conn.setblocking(0)
4308 try:
4309 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02004310 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004311 pass
4312 else:
4313 self.fail("Error trying to do non-blocking recv.")
4314 read, write, err = select.select([conn], [], [])
4315 if conn in read:
4316 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004317 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00004318 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004319 else:
4320 self.fail("Error during select call to non-blocking socket.")
4321
4322 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004323 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004324 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004325 self.cli.send(MSG)
4326
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004327
Guido van Rossum24e4af82002-06-12 19:18:08 +00004328class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004329 """Unit tests for the object returned by socket.makefile()
4330
Antoine Pitrou834bd812010-10-13 16:17:14 +00004331 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004332 the client connection. You can read from this file to
4333 get output from the server.
4334
Antoine Pitrou834bd812010-10-13 16:17:14 +00004335 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004336 server connection. You can write to this file to send output
4337 to the client.
4338 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004339
Guido van Rossume9f66142002-08-07 15:46:19 +00004340 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004341 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004342 errors = 'strict'
4343 newline = None
4344
4345 read_mode = 'rb'
4346 read_msg = MSG
4347 write_mode = 'wb'
4348 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004349
Guido van Rossum24e4af82002-06-12 19:18:08 +00004350 def __init__(self, methodName='runTest'):
4351 SocketConnectedTest.__init__(self, methodName=methodName)
4352
4353 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004354 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4355 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004356 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004357 self.read_file = self.cli_conn.makefile(
4358 self.read_mode, self.bufsize,
4359 encoding = self.encoding,
4360 errors = self.errors,
4361 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004362
4363 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004364 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004365 self.read_file.close()
4366 self.assertTrue(self.read_file.closed)
4367 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004368 SocketConnectedTest.tearDown(self)
4369
4370 def clientSetUp(self):
4371 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004372 self.write_file = self.serv_conn.makefile(
4373 self.write_mode, self.bufsize,
4374 encoding = self.encoding,
4375 errors = self.errors,
4376 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004377
4378 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004379 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004380 self.write_file.close()
4381 self.assertTrue(self.write_file.closed)
4382 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004383 SocketConnectedTest.clientTearDown(self)
4384
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004385 def testReadAfterTimeout(self):
4386 # Issue #7322: A file object must disallow further reads
4387 # after a timeout has occurred.
4388 self.cli_conn.settimeout(1)
4389 self.read_file.read(3)
4390 # First read raises a timeout
4391 self.assertRaises(socket.timeout, self.read_file.read, 1)
4392 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004393 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004394 self.read_file.read(1)
4395 self.assertIn("cannot read from timed out object", str(ctx.exception))
4396
4397 def _testReadAfterTimeout(self):
4398 self.write_file.write(self.write_msg[0:3])
4399 self.write_file.flush()
4400 self.serv_finished.wait()
4401
Guido van Rossum24e4af82002-06-12 19:18:08 +00004402 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004403 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004404 first_seg = self.read_file.read(len(self.read_msg)-3)
4405 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004406 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004407 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004408
4409 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004410 self.write_file.write(self.write_msg)
4411 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004412
Guido van Rossum8c943832002-08-08 01:00:28 +00004413 def testFullRead(self):
4414 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004415 msg = self.read_file.read()
4416 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004417
4418 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004419 self.write_file.write(self.write_msg)
4420 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004421
Guido van Rossum24e4af82002-06-12 19:18:08 +00004422 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004423 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004424 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004425 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004426 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004427 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004428 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004429 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004430 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004431
4432 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004433 self.write_file.write(self.write_msg)
4434 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004435
4436 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004437 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004438 line = self.read_file.readline()
4439 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004440
4441 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004442 self.write_file.write(self.write_msg)
4443 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004444
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004445 def testCloseAfterMakefile(self):
4446 # The file returned by makefile should keep the socket open.
4447 self.cli_conn.close()
4448 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004449 msg = self.read_file.read()
4450 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004451
4452 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004453 self.write_file.write(self.write_msg)
4454 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004455
4456 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004457 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004458 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004459 if isinstance(self.read_msg, str):
4460 msg = msg.decode()
4461 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004462
4463 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004464 self.write_file.write(self.write_msg)
4465 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004466
Tim Peters116d83c2004-03-28 02:20:45 +00004467 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004468 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004469
4470 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004471 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004472
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004473 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004474 self.assertEqual(self.read_file.mode, self.read_mode)
4475 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004476
4477 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004478 self.assertEqual(self.write_file.mode, self.write_mode)
4479 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004480
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004481 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004482 self.read_file.close()
4483 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004484 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004485 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004486
4487 def _testRealClose(self):
4488 pass
4489
4490
Guido van Rossume9f66142002-08-07 15:46:19 +00004491class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4492
4493 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004494
Guido van Rossume9f66142002-08-07 15:46:19 +00004495 In this case (and in this case only), it should be possible to
4496 create a file object, read a line from it, create another file
4497 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004498 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004499 when reading multiple requests from the same socket."""
4500
4501 bufsize = 0 # Use unbuffered mode
4502
4503 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004504 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004505 line = self.read_file.readline() # first line
4506 self.assertEqual(line, b"A. " + self.write_msg) # first line
4507 self.read_file = self.cli_conn.makefile('rb', 0)
4508 line = self.read_file.readline() # second line
4509 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004510
4511 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004512 self.write_file.write(b"A. " + self.write_msg)
4513 self.write_file.write(b"B. " + self.write_msg)
4514 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004515
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004516 def testMakefileClose(self):
4517 # The file returned by makefile should keep the socket open...
4518 self.cli_conn.close()
4519 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004520 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004521 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004522 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004523 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004524
4525 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004526 self.write_file.write(self.write_msg)
4527 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004528
4529 def testMakefileCloseSocketDestroy(self):
4530 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004531 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004532 refcount_after = sys.getrefcount(self.cli_conn)
4533 self.assertEqual(refcount_before - 1, refcount_after)
4534
4535 def _testMakefileCloseSocketDestroy(self):
4536 pass
4537
Antoine Pitrou98b46702010-09-18 22:59:00 +00004538 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004539 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004540 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4541
4542 def testSmallReadNonBlocking(self):
4543 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004544 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4545 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004546 self.evt1.set()
4547 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004548 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004549 if first_seg is None:
4550 # Data not arrived (can happen under Windows), wait a bit
4551 time.sleep(0.5)
4552 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004553 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004554 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004555 self.assertEqual(n, 3)
4556 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004557 self.assertEqual(msg, self.read_msg)
4558 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4559 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004560
4561 def _testSmallReadNonBlocking(self):
4562 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004563 self.write_file.write(self.write_msg)
4564 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004565 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004566 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004567 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4568 self.serv_finished.wait(5.0)
4569
4570 def testWriteNonBlocking(self):
4571 self.cli_finished.wait(5.0)
4572 # The client thread can't skip directly - the SkipTest exception
4573 # would appear as a failure.
4574 if self.serv_skipped:
4575 self.skipTest(self.serv_skipped)
4576
4577 def _testWriteNonBlocking(self):
4578 self.serv_skipped = None
4579 self.serv_conn.setblocking(False)
4580 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004581 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004582 LIMIT = 10
4583 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004584 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004585 self.assertGreater(n, 0)
4586 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004587 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004588 if n is None:
4589 # Succeeded
4590 break
4591 self.assertGreater(n, 0)
4592 else:
4593 # Let us know that this test didn't manage to establish
4594 # the expected conditions. This is not a failure in itself but,
4595 # if it happens repeatedly, the test should be fixed.
4596 self.serv_skipped = "failed to saturate the socket buffer"
4597
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004598
Guido van Rossum8c943832002-08-08 01:00:28 +00004599class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4600
4601 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4602
4603
4604class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4605
4606 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004607
Thomas Woutersb2137042007-02-01 18:02:27 +00004608
Antoine Pitrou834bd812010-10-13 16:17:14 +00004609class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4610 """Tests for socket.makefile() in text mode (rather than binary)"""
4611
4612 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004613 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004614 write_mode = 'wb'
4615 write_msg = MSG
4616 newline = ''
4617
4618
4619class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4620 """Tests for socket.makefile() in text mode (rather than binary)"""
4621
4622 read_mode = 'rb'
4623 read_msg = MSG
4624 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004625 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004626 newline = ''
4627
4628
4629class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4630 """Tests for socket.makefile() in text mode (rather than binary)"""
4631
4632 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004633 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004634 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004635 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004636 newline = ''
4637
4638
Guido van Rossumd8faa362007-04-27 19:54:29 +00004639class NetworkConnectionTest(object):
4640 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004641
Guido van Rossumd8faa362007-04-27 19:54:29 +00004642 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004643 # We're inherited below by BasicTCPTest2, which also inherits
4644 # BasicTCPTest, which defines self.port referenced below.
4645 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004646 self.serv_conn = self.cli
4647
4648class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4649 """Tests that NetworkConnection does not break existing TCP functionality.
4650 """
4651
4652class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004653
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004654 class MockSocket(socket.socket):
4655 def connect(self, *args):
4656 raise socket.timeout('timed out')
4657
4658 @contextlib.contextmanager
4659 def mocked_socket_module(self):
4660 """Return a socket which times out on connect"""
4661 old_socket = socket.socket
4662 socket.socket = self.MockSocket
4663 try:
4664 yield
4665 finally:
4666 socket.socket = old_socket
4667
4668 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004669 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004670 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004671 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004672 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004673 cli.connect((HOST, port))
4674 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4675
4676 def test_create_connection(self):
4677 # Issue #9792: errors raised by create_connection() should have
4678 # a proper errno attribute.
4679 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004680 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004681 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004682
4683 # Issue #16257: create_connection() calls getaddrinfo() against
4684 # 'localhost'. This may result in an IPV6 addr being returned
4685 # as well as an IPV4 one:
4686 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4687 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4688 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4689 #
4690 # create_connection() enumerates through all the addresses returned
4691 # and if it doesn't successfully bind to any of them, it propagates
4692 # the last exception it encountered.
4693 #
4694 # On Solaris, ENETUNREACH is returned in this circumstance instead
4695 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4696 # expected errnos.
4697 expected_errnos = [ errno.ECONNREFUSED, ]
4698 if hasattr(errno, 'ENETUNREACH'):
4699 expected_errnos.append(errno.ENETUNREACH)
Victor Stinner280c22a2017-10-31 19:48:14 -07004700 if hasattr(errno, 'EADDRNOTAVAIL'):
4701 # bpo-31910: socket.create_connection() fails randomly
4702 # with EADDRNOTAVAIL on Travis CI
4703 expected_errnos.append(errno.EADDRNOTAVAIL)
Trent Nelson45bb6132012-10-17 06:15:15 -04004704
4705 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004706
4707 def test_create_connection_timeout(self):
4708 # Issue #9792: create_connection() should not recast timeout errors
4709 # as generic socket errors.
4710 with self.mocked_socket_module():
4711 with self.assertRaises(socket.timeout):
4712 socket.create_connection((HOST, 1234))
4713
Guido van Rossumd8faa362007-04-27 19:54:29 +00004714
4715class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4716
4717 def __init__(self, methodName='runTest'):
4718 SocketTCPTest.__init__(self, methodName=methodName)
4719 ThreadableTest.__init__(self)
4720
4721 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004722 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004723
4724 def clientTearDown(self):
4725 self.cli.close()
4726 self.cli = None
4727 ThreadableTest.clientTearDown(self)
4728
4729 def _justAccept(self):
4730 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004731 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004732
4733 testFamily = _justAccept
4734 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004735 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004736 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004737 self.assertEqual(self.cli.family, 2)
4738
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004739 testSourceAddress = _justAccept
4740 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004741 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4742 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004743 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004744 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004745 # The port number being used is sufficient to show that the bind()
4746 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004747
Guido van Rossumd8faa362007-04-27 19:54:29 +00004748 testTimeoutDefault = _justAccept
4749 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004750 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004751 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004752 socket.setdefaulttimeout(42)
4753 try:
4754 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004755 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004756 finally:
4757 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004758 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004759
4760 testTimeoutNone = _justAccept
4761 def _testTimeoutNone(self):
4762 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004763 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004764 socket.setdefaulttimeout(30)
4765 try:
4766 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004767 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004768 finally:
4769 socket.setdefaulttimeout(None)
4770 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004771
4772 testTimeoutValueNamed = _justAccept
4773 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004774 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004775 self.assertEqual(self.cli.gettimeout(), 30)
4776
4777 testTimeoutValueNonamed = _justAccept
4778 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004779 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004780 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004781 self.assertEqual(self.cli.gettimeout(), 30)
4782
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004783
Guido van Rossumd8faa362007-04-27 19:54:29 +00004784class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4785
4786 def __init__(self, methodName='runTest'):
4787 SocketTCPTest.__init__(self, methodName=methodName)
4788 ThreadableTest.__init__(self)
4789
4790 def clientSetUp(self):
4791 pass
4792
4793 def clientTearDown(self):
4794 self.cli.close()
4795 self.cli = None
4796 ThreadableTest.clientTearDown(self)
4797
4798 def testInsideTimeout(self):
4799 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004800 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004801 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004802 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004803 testOutsideTimeout = testInsideTimeout
4804
4805 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004806 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004807 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004808 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004809
4810 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004811 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004812 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004813
4814
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004815class TCPTimeoutTest(SocketTCPTest):
4816
4817 def testTCPTimeout(self):
4818 def raise_timeout(*args, **kwargs):
4819 self.serv.settimeout(1.0)
4820 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004821 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004822 "Error generating a timeout exception (TCP)")
4823
4824 def testTimeoutZero(self):
4825 ok = False
4826 try:
4827 self.serv.settimeout(0.0)
4828 foo = self.serv.accept()
4829 except socket.timeout:
4830 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004831 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004832 ok = True
4833 except:
4834 self.fail("caught unexpected exception (TCP)")
4835 if not ok:
4836 self.fail("accept() returned success when we did not expect it")
4837
Serhiy Storchaka43767632013-11-03 21:31:38 +02004838 @unittest.skipUnless(hasattr(signal, 'alarm'),
4839 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004840 def testInterruptedTimeout(self):
4841 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06004842 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004843 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004844 self.serv.settimeout(5.0) # must be longer than alarm
4845 class Alarm(Exception):
4846 pass
4847 def alarm_handler(signal, frame):
4848 raise Alarm
4849 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4850 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004851 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004852 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004853 foo = self.serv.accept()
4854 except socket.timeout:
4855 self.fail("caught timeout instead of Alarm")
4856 except Alarm:
4857 pass
4858 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004859 self.fail("caught other exception instead of Alarm:"
4860 " %s(%s):\n%s" %
4861 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004862 else:
4863 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004864 finally:
4865 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004866 except Alarm:
4867 self.fail("got Alarm in wrong place")
4868 finally:
4869 # no alarm can be pending. Safe to restore old handler.
4870 signal.signal(signal.SIGALRM, old_alarm)
4871
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004872class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004873
4874 def testUDPTimeout(self):
4875 def raise_timeout(*args, **kwargs):
4876 self.serv.settimeout(1.0)
4877 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004878 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004879 "Error generating a timeout exception (UDP)")
4880
4881 def testTimeoutZero(self):
4882 ok = False
4883 try:
4884 self.serv.settimeout(0.0)
4885 foo = self.serv.recv(1024)
4886 except socket.timeout:
4887 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004888 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004889 ok = True
4890 except:
4891 self.fail("caught unexpected exception (UDP)")
4892 if not ok:
4893 self.fail("recv() returned success when we did not expect it")
4894
4895class TestExceptions(unittest.TestCase):
4896
4897 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004898 self.assertTrue(issubclass(OSError, Exception))
4899 self.assertTrue(issubclass(socket.herror, OSError))
4900 self.assertTrue(issubclass(socket.gaierror, OSError))
4901 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004902
Yury Selivanovfa22b292016-10-18 16:03:52 -04004903 def test_setblocking_invalidfd(self):
4904 # Regression test for issue #28471
4905
4906 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4907 sock = socket.socket(
4908 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4909 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004910 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004911
4912 with self.assertRaises(OSError):
4913 sock.setblocking(False)
4914
4915
Serhiy Storchaka43767632013-11-03 21:31:38 +02004916@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004917class TestLinuxAbstractNamespace(unittest.TestCase):
4918
4919 UNIX_PATH_MAX = 108
4920
4921 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004922 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004923 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4924 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004925 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004926 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4927 s2.connect(s1.getsockname())
4928 with s1.accept()[0] as s3:
4929 self.assertEqual(s1.getsockname(), address)
4930 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004931
4932 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004933 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004934 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4935 s.bind(address)
4936 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004937
4938 def testNameOverflow(self):
4939 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004940 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004941 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004942
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004943 def testStrName(self):
4944 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004945 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4946 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004947 s.bind("\x00python\x00test\x00")
4948 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004949 finally:
4950 s.close()
4951
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004952 def testBytearrayName(self):
4953 # Check that an abstract name can be passed as a bytearray.
4954 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4955 s.bind(bytearray(b"\x00python\x00test\x00"))
4956 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4957
Serhiy Storchaka43767632013-11-03 21:31:38 +02004958@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004959class TestUnixDomain(unittest.TestCase):
4960
4961 def setUp(self):
4962 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4963
4964 def tearDown(self):
4965 self.sock.close()
4966
4967 def encoded(self, path):
4968 # Return the given path encoded in the file system encoding,
4969 # or skip the test if this is not possible.
4970 try:
4971 return os.fsencode(path)
4972 except UnicodeEncodeError:
4973 self.skipTest(
4974 "Pathname {0!a} cannot be represented in file "
4975 "system encoding {1!r}".format(
4976 path, sys.getfilesystemencoding()))
4977
Antoine Pitrou16374872011-12-16 15:04:12 +01004978 def bind(self, sock, path):
4979 # Bind the socket
4980 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004981 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004982 except OSError as e:
4983 if str(e) == "AF_UNIX path too long":
4984 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004985 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004986 .format(path))
4987 else:
4988 raise
4989
Antoine Pitrou495b5022017-05-02 17:20:00 +02004990 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02004991 # Issue #30205 (note getsockname() can return None on OS X)
4992 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02004993
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004994 def testStrAddr(self):
4995 # Test binding to and retrieving a normal string pathname.
4996 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004997 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004998 self.addCleanup(support.unlink, path)
4999 self.assertEqual(self.sock.getsockname(), path)
5000
5001 def testBytesAddr(self):
5002 # Test binding to a bytes pathname.
5003 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005004 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005005 self.addCleanup(support.unlink, path)
5006 self.assertEqual(self.sock.getsockname(), path)
5007
5008 def testSurrogateescapeBind(self):
5009 # Test binding to a valid non-ASCII pathname, with the
5010 # non-ASCII bytes supplied using surrogateescape encoding.
5011 path = os.path.abspath(support.TESTFN_UNICODE)
5012 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005013 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005014 self.addCleanup(support.unlink, path)
5015 self.assertEqual(self.sock.getsockname(), path)
5016
5017 def testUnencodableAddr(self):
5018 # Test binding to a pathname that cannot be encoded in the
5019 # file system encoding.
5020 if support.TESTFN_UNENCODABLE is None:
5021 self.skipTest("No unencodable filename available")
5022 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005023 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005024 self.addCleanup(support.unlink, path)
5025 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005026
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005027
Thomas Wouters477c8d52006-05-27 19:21:47 +00005028class BufferIOTest(SocketConnectedTest):
5029 """
5030 Test the buffer versions of socket.recv() and socket.send().
5031 """
5032 def __init__(self, methodName='runTest'):
5033 SocketConnectedTest.__init__(self, methodName=methodName)
5034
Antoine Pitrou25480782010-03-17 22:50:28 +00005035 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005036 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005037 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005038 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005039 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005040 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005041 self.assertEqual(msg, MSG)
5042
Antoine Pitrou25480782010-03-17 22:50:28 +00005043 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005044 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005045 self.serv_conn.send(buf)
5046
Antoine Pitrou25480782010-03-17 22:50:28 +00005047 def testRecvIntoBytearray(self):
5048 buf = bytearray(1024)
5049 nbytes = self.cli_conn.recv_into(buf)
5050 self.assertEqual(nbytes, len(MSG))
5051 msg = buf[:len(MSG)]
5052 self.assertEqual(msg, MSG)
5053
5054 _testRecvIntoBytearray = _testRecvIntoArray
5055
5056 def testRecvIntoMemoryview(self):
5057 buf = bytearray(1024)
5058 nbytes = self.cli_conn.recv_into(memoryview(buf))
5059 self.assertEqual(nbytes, len(MSG))
5060 msg = buf[:len(MSG)]
5061 self.assertEqual(msg, MSG)
5062
5063 _testRecvIntoMemoryview = _testRecvIntoArray
5064
5065 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005066 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005067 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005068 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005069 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005070 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005071 self.assertEqual(msg, MSG)
5072
Antoine Pitrou25480782010-03-17 22:50:28 +00005073 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005074 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005075 self.serv_conn.send(buf)
5076
Antoine Pitrou25480782010-03-17 22:50:28 +00005077 def testRecvFromIntoBytearray(self):
5078 buf = bytearray(1024)
5079 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5080 self.assertEqual(nbytes, len(MSG))
5081 msg = buf[:len(MSG)]
5082 self.assertEqual(msg, MSG)
5083
5084 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5085
5086 def testRecvFromIntoMemoryview(self):
5087 buf = bytearray(1024)
5088 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5089 self.assertEqual(nbytes, len(MSG))
5090 msg = buf[:len(MSG)]
5091 self.assertEqual(msg, MSG)
5092
5093 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5094
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005095 def testRecvFromIntoSmallBuffer(self):
5096 # See issue #20246.
5097 buf = bytearray(8)
5098 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5099
5100 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005101 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005102
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005103 def testRecvFromIntoEmptyBuffer(self):
5104 buf = bytearray()
5105 self.cli_conn.recvfrom_into(buf)
5106 self.cli_conn.recvfrom_into(buf, 0)
5107
5108 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5109
Christian Heimes043d6f62008-01-07 17:19:16 +00005110
5111TIPC_STYPE = 2000
5112TIPC_LOWER = 200
5113TIPC_UPPER = 210
5114
5115def isTipcAvailable():
5116 """Check if the TIPC module is loaded
5117
5118 The TIPC module is not loaded automatically on Ubuntu and probably
5119 other Linux distros.
5120 """
5121 if not hasattr(socket, "AF_TIPC"):
5122 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005123 try:
5124 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005125 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005126 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005127 # have not the permission to read it.
5128 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005129 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005130 for line in f:
5131 if line.startswith("tipc "):
5132 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005133 return False
5134
Serhiy Storchaka43767632013-11-03 21:31:38 +02005135@unittest.skipUnless(isTipcAvailable(),
5136 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005137class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005138 def testRDM(self):
5139 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5140 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005141 self.addCleanup(srv.close)
5142 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005143
5144 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5145 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5146 TIPC_LOWER, TIPC_UPPER)
5147 srv.bind(srvaddr)
5148
5149 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5150 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5151 cli.sendto(MSG, sendaddr)
5152
5153 msg, recvaddr = srv.recvfrom(1024)
5154
5155 self.assertEqual(cli.getsockname(), recvaddr)
5156 self.assertEqual(msg, MSG)
5157
5158
Serhiy Storchaka43767632013-11-03 21:31:38 +02005159@unittest.skipUnless(isTipcAvailable(),
5160 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005161class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005162 def __init__(self, methodName = 'runTest'):
5163 unittest.TestCase.__init__(self, methodName = methodName)
5164 ThreadableTest.__init__(self)
5165
5166 def setUp(self):
5167 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005168 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005169 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5170 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5171 TIPC_LOWER, TIPC_UPPER)
5172 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005173 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005174 self.serverExplicitReady()
5175 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005176 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005177
5178 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005179 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005180 # accept() call; sleep a little while to avoid it, otherwise
5181 # we could get an exception
5182 time.sleep(0.1)
5183 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005184 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005185 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5186 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5187 self.cli.connect(addr)
5188 self.cliaddr = self.cli.getsockname()
5189
5190 def testStream(self):
5191 msg = self.conn.recv(1024)
5192 self.assertEqual(msg, MSG)
5193 self.assertEqual(self.cliaddr, self.connaddr)
5194
5195 def _testStream(self):
5196 self.cli.send(MSG)
5197 self.cli.close()
5198
5199
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005200class ContextManagersTest(ThreadedTCPSocketTest):
5201
5202 def _testSocketClass(self):
5203 # base test
5204 with socket.socket() as sock:
5205 self.assertFalse(sock._closed)
5206 self.assertTrue(sock._closed)
5207 # close inside with block
5208 with socket.socket() as sock:
5209 sock.close()
5210 self.assertTrue(sock._closed)
5211 # exception inside with block
5212 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005213 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005214 self.assertTrue(sock._closed)
5215
5216 def testCreateConnectionBase(self):
5217 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005218 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005219 data = conn.recv(1024)
5220 conn.sendall(data)
5221
5222 def _testCreateConnectionBase(self):
5223 address = self.serv.getsockname()
5224 with socket.create_connection(address) as sock:
5225 self.assertFalse(sock._closed)
5226 sock.sendall(b'foo')
5227 self.assertEqual(sock.recv(1024), b'foo')
5228 self.assertTrue(sock._closed)
5229
5230 def testCreateConnectionClose(self):
5231 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005232 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005233 data = conn.recv(1024)
5234 conn.sendall(data)
5235
5236 def _testCreateConnectionClose(self):
5237 address = self.serv.getsockname()
5238 with socket.create_connection(address) as sock:
5239 sock.close()
5240 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005241 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005242
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005243
Victor Stinnerdaf45552013-08-28 00:53:59 +02005244class InheritanceTest(unittest.TestCase):
5245 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5246 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005247 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005248 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005249 with socket.socket(socket.AF_INET,
5250 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005251 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005252 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005253
5254 def test_default_inheritable(self):
5255 sock = socket.socket()
5256 with sock:
5257 self.assertEqual(sock.get_inheritable(), False)
5258
5259 def test_dup(self):
5260 sock = socket.socket()
5261 with sock:
5262 newsock = sock.dup()
5263 sock.close()
5264 with newsock:
5265 self.assertEqual(newsock.get_inheritable(), False)
5266
5267 def test_set_inheritable(self):
5268 sock = socket.socket()
5269 with sock:
5270 sock.set_inheritable(True)
5271 self.assertEqual(sock.get_inheritable(), True)
5272
5273 sock.set_inheritable(False)
5274 self.assertEqual(sock.get_inheritable(), False)
5275
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005276 @unittest.skipIf(fcntl is None, "need fcntl")
5277 def test_get_inheritable_cloexec(self):
5278 sock = socket.socket()
5279 with sock:
5280 fd = sock.fileno()
5281 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005282
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005283 # clear FD_CLOEXEC flag
5284 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5285 flags &= ~fcntl.FD_CLOEXEC
5286 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005287
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005288 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005289
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005290 @unittest.skipIf(fcntl is None, "need fcntl")
5291 def test_set_inheritable_cloexec(self):
5292 sock = socket.socket()
5293 with sock:
5294 fd = sock.fileno()
5295 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5296 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005297
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005298 sock.set_inheritable(True)
5299 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5300 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005301
5302
Victor Stinnerdaf45552013-08-28 00:53:59 +02005303 def test_socketpair(self):
5304 s1, s2 = socket.socketpair()
5305 self.addCleanup(s1.close)
5306 self.addCleanup(s2.close)
5307 self.assertEqual(s1.get_inheritable(), False)
5308 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005309
5310
5311@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5312 "SOCK_NONBLOCK not defined")
5313class NonblockConstantTest(unittest.TestCase):
5314 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5315 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005316 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005317 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005318 self.assertTrue(
5319 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005320 if timeout == 0:
5321 # timeout == 0: means that getblocking() must be False.
5322 self.assertFalse(s.getblocking())
5323 else:
5324 # If timeout > 0, the socket will be in a "blocking" mode
5325 # from the standpoint of the Python API. For Python socket
5326 # object, "blocking" means that operations like 'sock.recv()'
5327 # will block. Internally, file descriptors for
5328 # "blocking" Python sockets *with timeouts* are in a
5329 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5330 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5331 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005332 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005333 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005334 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005335 self.assertFalse(
5336 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005337 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005338
Charles-François Natali239bb962011-06-03 12:55:15 +02005339 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005340 def test_SOCK_NONBLOCK(self):
5341 # a lot of it seems silly and redundant, but I wanted to test that
5342 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005343 with socket.socket(socket.AF_INET,
5344 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5345 self.checkNonblock(s)
5346 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005347 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005348 s.setblocking(0)
5349 self.checkNonblock(s)
5350 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005351 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005352 s.settimeout(2.0)
5353 self.checkNonblock(s, timeout=2.0)
5354 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005355 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005356 # defaulttimeout
5357 t = socket.getdefaulttimeout()
5358 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005359 with socket.socket() as s:
5360 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005361 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005362 with socket.socket() as s:
5363 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005364 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005365 with socket.socket() as s:
5366 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005367 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005368 with socket.socket() as s:
5369 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005370 socket.setdefaulttimeout(t)
5371
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005372
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005373@unittest.skipUnless(os.name == "nt", "Windows specific")
5374@unittest.skipUnless(multiprocessing, "need multiprocessing")
5375class TestSocketSharing(SocketTCPTest):
5376 # This must be classmethod and not staticmethod or multiprocessing
5377 # won't be able to bootstrap it.
5378 @classmethod
5379 def remoteProcessServer(cls, q):
5380 # Recreate socket from shared data
5381 sdata = q.get()
5382 message = q.get()
5383
5384 s = socket.fromshare(sdata)
5385 s2, c = s.accept()
5386
5387 # Send the message
5388 s2.sendall(message)
5389 s2.close()
5390 s.close()
5391
5392 def testShare(self):
5393 # Transfer the listening server socket to another process
5394 # and service it from there.
5395
5396 # Create process:
5397 q = multiprocessing.Queue()
5398 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5399 p.start()
5400
5401 # Get the shared socket data
5402 data = self.serv.share(p.pid)
5403
5404 # Pass the shared socket to the other process
5405 addr = self.serv.getsockname()
5406 self.serv.close()
5407 q.put(data)
5408
5409 # The data that the server will send us
5410 message = b"slapmahfro"
5411 q.put(message)
5412
5413 # Connect
5414 s = socket.create_connection(addr)
5415 # listen for the data
5416 m = []
5417 while True:
5418 data = s.recv(100)
5419 if not data:
5420 break
5421 m.append(data)
5422 s.close()
5423 received = b"".join(m)
5424 self.assertEqual(received, message)
5425 p.join()
5426
5427 def testShareLength(self):
5428 data = self.serv.share(os.getpid())
5429 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5430 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5431
5432 def compareSockets(self, org, other):
5433 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005434 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005435 self.assertEqual(org.gettimeout(), None)
5436 self.assertEqual(org.gettimeout(), other.gettimeout())
5437
5438 self.assertEqual(org.family, other.family)
5439 self.assertEqual(org.type, other.type)
5440 # If the user specified "0" for proto, then
5441 # internally windows will have picked the correct value.
5442 # Python introspection on the socket however will still return
5443 # 0. For the shared socket, the python value is recreated
5444 # from the actual value, so it may not compare correctly.
5445 if org.proto != 0:
5446 self.assertEqual(org.proto, other.proto)
5447
5448 def testShareLocal(self):
5449 data = self.serv.share(os.getpid())
5450 s = socket.fromshare(data)
5451 try:
5452 self.compareSockets(self.serv, s)
5453 finally:
5454 s.close()
5455
5456 def testTypes(self):
5457 families = [socket.AF_INET, socket.AF_INET6]
5458 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5459 for f in families:
5460 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005461 try:
5462 source = socket.socket(f, t)
5463 except OSError:
5464 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005465 try:
5466 data = source.share(os.getpid())
5467 shared = socket.fromshare(data)
5468 try:
5469 self.compareSockets(source, shared)
5470 finally:
5471 shared.close()
5472 finally:
5473 source.close()
5474
5475
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005476class SendfileUsingSendTest(ThreadedTCPSocketTest):
5477 """
5478 Test the send() implementation of socket.sendfile().
5479 """
5480
Victor Stinner8c663fd2017-11-08 14:44:44 -08005481 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005482 BUFSIZE = 8192
5483 FILEDATA = b""
5484 TIMEOUT = 2
5485
5486 @classmethod
5487 def setUpClass(cls):
5488 def chunks(total, step):
5489 assert total >= step
5490 while total > step:
5491 yield step
5492 total -= step
5493 if total:
5494 yield total
5495
5496 chunk = b"".join([random.choice(string.ascii_letters).encode()
5497 for i in range(cls.BUFSIZE)])
5498 with open(support.TESTFN, 'wb') as f:
5499 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5500 f.write(chunk)
5501 with open(support.TESTFN, 'rb') as f:
5502 cls.FILEDATA = f.read()
5503 assert len(cls.FILEDATA) == cls.FILESIZE
5504
5505 @classmethod
5506 def tearDownClass(cls):
5507 support.unlink(support.TESTFN)
5508
5509 def accept_conn(self):
5510 self.serv.settimeout(self.TIMEOUT)
5511 conn, addr = self.serv.accept()
5512 conn.settimeout(self.TIMEOUT)
5513 self.addCleanup(conn.close)
5514 return conn
5515
5516 def recv_data(self, conn):
5517 received = []
5518 while True:
5519 chunk = conn.recv(self.BUFSIZE)
5520 if not chunk:
5521 break
5522 received.append(chunk)
5523 return b''.join(received)
5524
5525 def meth_from_sock(self, sock):
5526 # Depending on the mixin class being run return either send()
5527 # or sendfile() method implementation.
5528 return getattr(sock, "_sendfile_use_send")
5529
5530 # regular file
5531
5532 def _testRegularFile(self):
5533 address = self.serv.getsockname()
5534 file = open(support.TESTFN, 'rb')
5535 with socket.create_connection(address) as sock, file as file:
5536 meth = self.meth_from_sock(sock)
5537 sent = meth(file)
5538 self.assertEqual(sent, self.FILESIZE)
5539 self.assertEqual(file.tell(), self.FILESIZE)
5540
5541 def testRegularFile(self):
5542 conn = self.accept_conn()
5543 data = self.recv_data(conn)
5544 self.assertEqual(len(data), self.FILESIZE)
5545 self.assertEqual(data, self.FILEDATA)
5546
5547 # non regular file
5548
5549 def _testNonRegularFile(self):
5550 address = self.serv.getsockname()
5551 file = io.BytesIO(self.FILEDATA)
5552 with socket.create_connection(address) as sock, file as file:
5553 sent = sock.sendfile(file)
5554 self.assertEqual(sent, self.FILESIZE)
5555 self.assertEqual(file.tell(), self.FILESIZE)
5556 self.assertRaises(socket._GiveupOnSendfile,
5557 sock._sendfile_use_sendfile, file)
5558
5559 def testNonRegularFile(self):
5560 conn = self.accept_conn()
5561 data = self.recv_data(conn)
5562 self.assertEqual(len(data), self.FILESIZE)
5563 self.assertEqual(data, self.FILEDATA)
5564
5565 # empty file
5566
5567 def _testEmptyFileSend(self):
5568 address = self.serv.getsockname()
5569 filename = support.TESTFN + "2"
5570 with open(filename, 'wb'):
5571 self.addCleanup(support.unlink, filename)
5572 file = open(filename, 'rb')
5573 with socket.create_connection(address) as sock, file as file:
5574 meth = self.meth_from_sock(sock)
5575 sent = meth(file)
5576 self.assertEqual(sent, 0)
5577 self.assertEqual(file.tell(), 0)
5578
5579 def testEmptyFileSend(self):
5580 conn = self.accept_conn()
5581 data = self.recv_data(conn)
5582 self.assertEqual(data, b"")
5583
5584 # offset
5585
5586 def _testOffset(self):
5587 address = self.serv.getsockname()
5588 file = open(support.TESTFN, 'rb')
5589 with socket.create_connection(address) as sock, file as file:
5590 meth = self.meth_from_sock(sock)
5591 sent = meth(file, offset=5000)
5592 self.assertEqual(sent, self.FILESIZE - 5000)
5593 self.assertEqual(file.tell(), self.FILESIZE)
5594
5595 def testOffset(self):
5596 conn = self.accept_conn()
5597 data = self.recv_data(conn)
5598 self.assertEqual(len(data), self.FILESIZE - 5000)
5599 self.assertEqual(data, self.FILEDATA[5000:])
5600
5601 # count
5602
5603 def _testCount(self):
5604 address = self.serv.getsockname()
5605 file = open(support.TESTFN, 'rb')
5606 with socket.create_connection(address, timeout=2) as sock, file as file:
5607 count = 5000007
5608 meth = self.meth_from_sock(sock)
5609 sent = meth(file, count=count)
5610 self.assertEqual(sent, count)
5611 self.assertEqual(file.tell(), count)
5612
5613 def testCount(self):
5614 count = 5000007
5615 conn = self.accept_conn()
5616 data = self.recv_data(conn)
5617 self.assertEqual(len(data), count)
5618 self.assertEqual(data, self.FILEDATA[:count])
5619
5620 # count small
5621
5622 def _testCountSmall(self):
5623 address = self.serv.getsockname()
5624 file = open(support.TESTFN, 'rb')
5625 with socket.create_connection(address, timeout=2) as sock, file as file:
5626 count = 1
5627 meth = self.meth_from_sock(sock)
5628 sent = meth(file, count=count)
5629 self.assertEqual(sent, count)
5630 self.assertEqual(file.tell(), count)
5631
5632 def testCountSmall(self):
5633 count = 1
5634 conn = self.accept_conn()
5635 data = self.recv_data(conn)
5636 self.assertEqual(len(data), count)
5637 self.assertEqual(data, self.FILEDATA[:count])
5638
5639 # count + offset
5640
5641 def _testCountWithOffset(self):
5642 address = self.serv.getsockname()
5643 file = open(support.TESTFN, 'rb')
5644 with socket.create_connection(address, timeout=2) as sock, file as file:
5645 count = 100007
5646 meth = self.meth_from_sock(sock)
5647 sent = meth(file, offset=2007, count=count)
5648 self.assertEqual(sent, count)
5649 self.assertEqual(file.tell(), count + 2007)
5650
5651 def testCountWithOffset(self):
5652 count = 100007
5653 conn = self.accept_conn()
5654 data = self.recv_data(conn)
5655 self.assertEqual(len(data), count)
5656 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5657
5658 # non blocking sockets are not supposed to work
5659
5660 def _testNonBlocking(self):
5661 address = self.serv.getsockname()
5662 file = open(support.TESTFN, 'rb')
5663 with socket.create_connection(address) as sock, file as file:
5664 sock.setblocking(False)
5665 meth = self.meth_from_sock(sock)
5666 self.assertRaises(ValueError, meth, file)
5667 self.assertRaises(ValueError, sock.sendfile, file)
5668
5669 def testNonBlocking(self):
5670 conn = self.accept_conn()
5671 if conn.recv(8192):
5672 self.fail('was not supposed to receive any data')
5673
5674 # timeout (non-triggered)
5675
5676 def _testWithTimeout(self):
5677 address = self.serv.getsockname()
5678 file = open(support.TESTFN, 'rb')
5679 with socket.create_connection(address, timeout=2) as sock, file as file:
5680 meth = self.meth_from_sock(sock)
5681 sent = meth(file)
5682 self.assertEqual(sent, self.FILESIZE)
5683
5684 def testWithTimeout(self):
5685 conn = self.accept_conn()
5686 data = self.recv_data(conn)
5687 self.assertEqual(len(data), self.FILESIZE)
5688 self.assertEqual(data, self.FILEDATA)
5689
5690 # timeout (triggered)
5691
5692 def _testWithTimeoutTriggeredSend(self):
5693 address = self.serv.getsockname()
5694 file = open(support.TESTFN, 'rb')
5695 with socket.create_connection(address, timeout=0.01) as sock, \
5696 file as file:
5697 meth = self.meth_from_sock(sock)
5698 self.assertRaises(socket.timeout, meth, file)
5699
5700 def testWithTimeoutTriggeredSend(self):
5701 conn = self.accept_conn()
5702 conn.recv(88192)
5703
5704 # errors
5705
5706 def _test_errors(self):
5707 pass
5708
5709 def test_errors(self):
5710 with open(support.TESTFN, 'rb') as file:
5711 with socket.socket(type=socket.SOCK_DGRAM) as s:
5712 meth = self.meth_from_sock(s)
5713 self.assertRaisesRegex(
5714 ValueError, "SOCK_STREAM", meth, file)
5715 with open(support.TESTFN, 'rt') as file:
5716 with socket.socket() as s:
5717 meth = self.meth_from_sock(s)
5718 self.assertRaisesRegex(
5719 ValueError, "binary mode", meth, file)
5720 with open(support.TESTFN, 'rb') as file:
5721 with socket.socket() as s:
5722 meth = self.meth_from_sock(s)
5723 self.assertRaisesRegex(TypeError, "positive integer",
5724 meth, file, count='2')
5725 self.assertRaisesRegex(TypeError, "positive integer",
5726 meth, file, count=0.1)
5727 self.assertRaisesRegex(ValueError, "positive integer",
5728 meth, file, count=0)
5729 self.assertRaisesRegex(ValueError, "positive integer",
5730 meth, file, count=-1)
5731
5732
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005733@unittest.skipUnless(hasattr(os, "sendfile"),
5734 'os.sendfile() required for this test.')
5735class SendfileUsingSendfileTest(SendfileUsingSendTest):
5736 """
5737 Test the sendfile() implementation of socket.sendfile().
5738 """
5739 def meth_from_sock(self, sock):
5740 return getattr(sock, "_sendfile_use_sendfile")
5741
Christian Heimes48371412016-09-06 00:37:46 +02005742
5743@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005744class LinuxKernelCryptoAPI(unittest.TestCase):
5745 # tests for AF_ALG
5746 def create_alg(self, typ, name):
5747 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005748 try:
5749 sock.bind((typ, name))
5750 except FileNotFoundError as e:
5751 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005752 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005753 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005754 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005755 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005756
Victor Stinner86afc1f2017-11-30 13:58:43 +01005757 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
5758 # at least on ppc64le architecture
5759 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02005760 def test_sha256(self):
5761 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5762 "177a9cb410ff61f20015ad")
5763 with self.create_alg('hash', 'sha256') as algo:
5764 op, _ = algo.accept()
5765 with op:
5766 op.sendall(b"abc")
5767 self.assertEqual(op.recv(512), expected)
5768
5769 op, _ = algo.accept()
5770 with op:
5771 op.send(b'a', socket.MSG_MORE)
5772 op.send(b'b', socket.MSG_MORE)
5773 op.send(b'c', socket.MSG_MORE)
5774 op.send(b'')
5775 self.assertEqual(op.recv(512), expected)
5776
5777 def test_hmac_sha1(self):
5778 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5779 with self.create_alg('hash', 'hmac(sha1)') as algo:
5780 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5781 op, _ = algo.accept()
5782 with op:
5783 op.sendall(b"what do ya want for nothing?")
5784 self.assertEqual(op.recv(512), expected)
5785
Christian Heimese084f842016-09-11 20:11:30 +02005786 # Although it should work with 3.19 and newer the test blocks on
5787 # Ubuntu 15.10 with Kernel 4.2.0-19.
5788 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005789 def test_aes_cbc(self):
5790 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5791 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5792 msg = b"Single block msg"
5793 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5794 msglen = len(msg)
5795 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5796 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5797 op, _ = algo.accept()
5798 with op:
5799 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5800 flags=socket.MSG_MORE)
5801 op.sendall(msg)
5802 self.assertEqual(op.recv(msglen), ciphertext)
5803
5804 op, _ = algo.accept()
5805 with op:
5806 op.sendmsg_afalg([ciphertext],
5807 op=socket.ALG_OP_DECRYPT, iv=iv)
5808 self.assertEqual(op.recv(msglen), msg)
5809
5810 # long message
5811 multiplier = 1024
5812 longmsg = [msg] * multiplier
5813 op, _ = algo.accept()
5814 with op:
5815 op.sendmsg_afalg(longmsg,
5816 op=socket.ALG_OP_ENCRYPT, iv=iv)
5817 enc = op.recv(msglen * multiplier)
5818 self.assertEqual(len(enc), msglen * multiplier)
Miss Islington (bot)958a25e2018-07-09 08:47:14 -07005819 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02005820
5821 op, _ = algo.accept()
5822 with op:
5823 op.sendmsg_afalg([enc],
5824 op=socket.ALG_OP_DECRYPT, iv=iv)
5825 dec = op.recv(msglen * multiplier)
5826 self.assertEqual(len(dec), msglen * multiplier)
5827 self.assertEqual(dec, msg * multiplier)
5828
matejcik9764c152017-02-16 14:41:31 +01005829 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005830 def test_aead_aes_gcm(self):
5831 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5832 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5833 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5834 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5835 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5836 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5837
5838 taglen = len(expected_tag)
5839 assoclen = len(assoc)
5840
5841 with self.create_alg('aead', 'gcm(aes)') as algo:
5842 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5843 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5844 None, taglen)
5845
5846 # send assoc, plain and tag buffer in separate steps
5847 op, _ = algo.accept()
5848 with op:
5849 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5850 assoclen=assoclen, flags=socket.MSG_MORE)
5851 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005852 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005853 res = op.recv(assoclen + len(plain) + taglen)
5854 self.assertEqual(expected_ct, res[assoclen:-taglen])
5855 self.assertEqual(expected_tag, res[-taglen:])
5856
5857 # now with msg
5858 op, _ = algo.accept()
5859 with op:
matejcik9764c152017-02-16 14:41:31 +01005860 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005861 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5862 assoclen=assoclen)
5863 res = op.recv(assoclen + len(plain) + taglen)
5864 self.assertEqual(expected_ct, res[assoclen:-taglen])
5865 self.assertEqual(expected_tag, res[-taglen:])
5866
5867 # create anc data manually
5868 pack_uint32 = struct.Struct('I').pack
5869 op, _ = algo.accept()
5870 with op:
matejcik9764c152017-02-16 14:41:31 +01005871 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005872 op.sendmsg(
5873 [msg],
5874 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5875 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5876 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5877 )
5878 )
matejcik9764c152017-02-16 14:41:31 +01005879 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005880 self.assertEqual(expected_ct, res[assoclen:-taglen])
5881 self.assertEqual(expected_tag, res[-taglen:])
5882
5883 # decrypt and verify
5884 op, _ = algo.accept()
5885 with op:
5886 msg = assoc + expected_ct + expected_tag
5887 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5888 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005889 res = op.recv(len(msg) - taglen)
5890 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005891
Christian Heimese084f842016-09-11 20:11:30 +02005892 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005893 def test_drbg_pr_sha256(self):
5894 # deterministic random bit generator, prediction resistance, sha256
5895 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5896 extra_seed = os.urandom(32)
5897 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5898 op, _ = algo.accept()
5899 with op:
5900 rn = op.recv(32)
5901 self.assertEqual(len(rn), 32)
5902
5903 def test_sendmsg_afalg_args(self):
5904 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005905 with sock:
5906 with self.assertRaises(TypeError):
5907 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005908
Christian Heimes02b30352016-09-11 19:49:56 +02005909 with self.assertRaises(TypeError):
5910 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005911
Christian Heimes02b30352016-09-11 19:49:56 +02005912 with self.assertRaises(TypeError):
5913 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005914
Christian Heimes02b30352016-09-11 19:49:56 +02005915 with self.assertRaises(TypeError):
5916 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005917
Christian Heimes02b30352016-09-11 19:49:56 +02005918 with self.assertRaises(TypeError):
5919 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5920
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08005921@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
5922class TestMSWindowsTCPFlags(unittest.TestCase):
5923 knownTCPFlags = {
Miss Islington (bot)32955292018-04-20 14:00:41 -07005924 # available since long time ago
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08005925 'TCP_MAXSEG',
5926 'TCP_NODELAY',
5927 # available starting with Windows 10 1607
5928 'TCP_FASTOPEN',
5929 # available starting with Windows 10 1703
5930 'TCP_KEEPCNT',
5931 # available starting with Windows 10 1709
5932 'TCP_KEEPIDLE',
5933 'TCP_KEEPINTVL'
5934 }
5935
5936 def test_new_tcp_flags(self):
5937 provided = [s for s in dir(socket) if s.startswith('TCP')]
5938 unknown = [s for s in provided if s not in self.knownTCPFlags]
5939
5940 self.assertEqual([], unknown,
5941 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005942
Guido van Rossumb995eb72002-07-31 16:08:40 +00005943def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005944 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005945 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005946
5947 tests.extend([
5948 NonBlockingTCPTests,
5949 FileObjectClassTestCase,
5950 UnbufferedFileObjectClassTestCase,
5951 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005952 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005953 UnicodeReadFileObjectClassTestCase,
5954 UnicodeWriteFileObjectClassTestCase,
5955 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005956 NetworkConnectionNoServer,
5957 NetworkConnectionAttributesTest,
5958 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005959 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005960 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005961 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005962 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005963 tests.append(BasicSocketPairTest)
5964 tests.append(TestUnixDomain)
5965 tests.append(TestLinuxAbstractNamespace)
5966 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005967 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005968 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005969 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005970 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04005971 BasicVSOCKTest,
5972 ThreadedVSOCKSocketStreamTest,
5973 ])
5974 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005975 CmsgMacroTests,
5976 SendmsgUDPTest,
5977 RecvmsgUDPTest,
5978 RecvmsgIntoUDPTest,
5979 SendmsgUDP6Test,
5980 RecvmsgUDP6Test,
5981 RecvmsgRFC3542AncillaryUDP6Test,
5982 RecvmsgIntoRFC3542AncillaryUDP6Test,
5983 RecvmsgIntoUDP6Test,
5984 SendmsgTCPTest,
5985 RecvmsgTCPTest,
5986 RecvmsgIntoTCPTest,
5987 SendmsgSCTPStreamTest,
5988 RecvmsgSCTPStreamTest,
5989 RecvmsgIntoSCTPStreamTest,
5990 SendmsgUnixStreamTest,
5991 RecvmsgUnixStreamTest,
5992 RecvmsgIntoUnixStreamTest,
5993 RecvmsgSCMRightsStreamTest,
5994 RecvmsgIntoSCMRightsStreamTest,
5995 # These are slow when setitimer() is not available
5996 InterruptedRecvTimeoutTest,
5997 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005998 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005999 SendfileUsingSendTest,
6000 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006001 ])
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08006002 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006003
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006004 thread_info = support.threading_setup()
6005 support.run_unittest(*tests)
6006 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006007
6008if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006009 test_main()