blob: 5f9891de4936db0371f013b97f92728259c461fe [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)
Miss Islington (bot)ef1173a2018-09-25 08:49:28 -07002619 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002620 while True:
2621 self.sendmsgToServer([b"a"*512])
Miss Islington (bot)ef1173a2018-09-25 08:49:28 -07002622 except socket.timeout:
2623 pass
2624 except OSError as exc:
2625 if exc.errno != errno.ENOMEM:
2626 raise
2627 # bpo-33937 the test randomly fails on Travis CI with
2628 # "OSError: [Errno 12] Cannot allocate memory"
2629 else:
2630 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002631 finally:
2632 self.misc_event.set()
2633
2634 # XXX: would be nice to have more tests for sendmsg flags argument.
2635
2636 # Linux supports MSG_DONTWAIT when sending, but in general, it
2637 # only works when receiving. Could add other platforms if they
2638 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002639 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002640 "MSG_DONTWAIT not known to work on this platform when "
2641 "sending")
2642 def testSendmsgDontWait(self):
2643 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2644 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2645 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2646
2647 @testSendmsgDontWait.client_skip
2648 def _testSendmsgDontWait(self):
2649 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002650 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002651 while True:
2652 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Miss Islington (bot)ef1173a2018-09-25 08:49:28 -07002653 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2654 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002655 self.assertIn(cm.exception.errno,
Miss Islington (bot)ef1173a2018-09-25 08:49:28 -07002656 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002657 finally:
2658 self.misc_event.set()
2659
2660
2661class SendmsgConnectionlessTests(SendmsgTests):
2662 # Tests for sendmsg() which require a connectionless-mode
2663 # (e.g. datagram) socket, and do not involve recvmsg() or
2664 # recvmsg_into().
2665
2666 def testSendmsgNoDestAddr(self):
2667 # Check that sendmsg() fails when no destination address is
2668 # given for unconnected socket.
2669 pass
2670
2671 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002672 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002673 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002674 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002675 [MSG], [], 0, None)
2676
2677
2678class RecvmsgGenericTests(SendrecvmsgBase):
2679 # Tests for recvmsg() which can also be emulated using
2680 # recvmsg_into(), and can use any socket type.
2681
2682 def testRecvmsg(self):
2683 # Receive a simple message with recvmsg[_into]().
2684 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2685 self.assertEqual(msg, MSG)
2686 self.checkRecvmsgAddress(addr, self.cli_addr)
2687 self.assertEqual(ancdata, [])
2688 self.checkFlags(flags, eor=True)
2689
2690 def _testRecvmsg(self):
2691 self.sendToServer(MSG)
2692
2693 def testRecvmsgExplicitDefaults(self):
2694 # Test recvmsg[_into]() with default arguments provided explicitly.
2695 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2696 len(MSG), 0, 0)
2697 self.assertEqual(msg, MSG)
2698 self.checkRecvmsgAddress(addr, self.cli_addr)
2699 self.assertEqual(ancdata, [])
2700 self.checkFlags(flags, eor=True)
2701
2702 def _testRecvmsgExplicitDefaults(self):
2703 self.sendToServer(MSG)
2704
2705 def testRecvmsgShorter(self):
2706 # Receive a message smaller than buffer.
2707 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2708 len(MSG) + 42)
2709 self.assertEqual(msg, MSG)
2710 self.checkRecvmsgAddress(addr, self.cli_addr)
2711 self.assertEqual(ancdata, [])
2712 self.checkFlags(flags, eor=True)
2713
2714 def _testRecvmsgShorter(self):
2715 self.sendToServer(MSG)
2716
2717 def testRecvmsgTrunc(self):
2718 # Receive part of message, check for truncation indicators.
2719 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2720 len(MSG) - 3)
2721 self.assertEqual(msg, MSG[:-3])
2722 self.checkRecvmsgAddress(addr, self.cli_addr)
2723 self.assertEqual(ancdata, [])
2724 self.checkFlags(flags, eor=False)
2725
2726 def _testRecvmsgTrunc(self):
2727 self.sendToServer(MSG)
2728
2729 def testRecvmsgShortAncillaryBuf(self):
2730 # Test ancillary data buffer too small to hold any ancillary data.
2731 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2732 len(MSG), 1)
2733 self.assertEqual(msg, MSG)
2734 self.checkRecvmsgAddress(addr, self.cli_addr)
2735 self.assertEqual(ancdata, [])
2736 self.checkFlags(flags, eor=True)
2737
2738 def _testRecvmsgShortAncillaryBuf(self):
2739 self.sendToServer(MSG)
2740
2741 def testRecvmsgLongAncillaryBuf(self):
2742 # Test large ancillary data buffer.
2743 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2744 len(MSG), 10240)
2745 self.assertEqual(msg, MSG)
2746 self.checkRecvmsgAddress(addr, self.cli_addr)
2747 self.assertEqual(ancdata, [])
2748 self.checkFlags(flags, eor=True)
2749
2750 def _testRecvmsgLongAncillaryBuf(self):
2751 self.sendToServer(MSG)
2752
2753 def testRecvmsgAfterClose(self):
2754 # Check that recvmsg[_into]() fails on a closed socket.
2755 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002756 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002757
2758 def _testRecvmsgAfterClose(self):
2759 pass
2760
2761 def testRecvmsgTimeout(self):
2762 # Check that timeout works.
2763 try:
2764 self.serv_sock.settimeout(0.03)
2765 self.assertRaises(socket.timeout,
2766 self.doRecvmsg, self.serv_sock, len(MSG))
2767 finally:
2768 self.misc_event.set()
2769
2770 def _testRecvmsgTimeout(self):
2771 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2772
2773 @requireAttrs(socket, "MSG_PEEK")
2774 def testRecvmsgPeek(self):
2775 # Check that MSG_PEEK in flags enables examination of pending
2776 # data without consuming it.
2777
2778 # Receive part of data with MSG_PEEK.
2779 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2780 len(MSG) - 3, 0,
2781 socket.MSG_PEEK)
2782 self.assertEqual(msg, MSG[:-3])
2783 self.checkRecvmsgAddress(addr, self.cli_addr)
2784 self.assertEqual(ancdata, [])
2785 # Ignoring MSG_TRUNC here (so this test is the same for stream
2786 # and datagram sockets). Some wording in POSIX seems to
2787 # suggest that it needn't be set when peeking, but that may
2788 # just be a slip.
2789 self.checkFlags(flags, eor=False,
2790 ignore=getattr(socket, "MSG_TRUNC", 0))
2791
2792 # Receive all data with MSG_PEEK.
2793 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2794 len(MSG), 0,
2795 socket.MSG_PEEK)
2796 self.assertEqual(msg, MSG)
2797 self.checkRecvmsgAddress(addr, self.cli_addr)
2798 self.assertEqual(ancdata, [])
2799 self.checkFlags(flags, eor=True)
2800
2801 # Check that the same data can still be received normally.
2802 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2803 self.assertEqual(msg, MSG)
2804 self.checkRecvmsgAddress(addr, self.cli_addr)
2805 self.assertEqual(ancdata, [])
2806 self.checkFlags(flags, eor=True)
2807
2808 @testRecvmsgPeek.client_skip
2809 def _testRecvmsgPeek(self):
2810 self.sendToServer(MSG)
2811
2812 @requireAttrs(socket.socket, "sendmsg")
2813 def testRecvmsgFromSendmsg(self):
2814 # Test receiving with recvmsg[_into]() when message is sent
2815 # using sendmsg().
2816 self.serv_sock.settimeout(self.fail_timeout)
2817 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2818 self.assertEqual(msg, MSG)
2819 self.checkRecvmsgAddress(addr, self.cli_addr)
2820 self.assertEqual(ancdata, [])
2821 self.checkFlags(flags, eor=True)
2822
2823 @testRecvmsgFromSendmsg.client_skip
2824 def _testRecvmsgFromSendmsg(self):
2825 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2826
2827
2828class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2829 # Tests which require a stream socket and can use either recvmsg()
2830 # or recvmsg_into().
2831
2832 def testRecvmsgEOF(self):
2833 # Receive end-of-stream indicator (b"", peer socket closed).
2834 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2835 self.assertEqual(msg, b"")
2836 self.checkRecvmsgAddress(addr, self.cli_addr)
2837 self.assertEqual(ancdata, [])
2838 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2839
2840 def _testRecvmsgEOF(self):
2841 self.cli_sock.close()
2842
2843 def testRecvmsgOverflow(self):
2844 # Receive a message in more than one chunk.
2845 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2846 len(MSG) - 3)
2847 self.checkRecvmsgAddress(addr, self.cli_addr)
2848 self.assertEqual(ancdata, [])
2849 self.checkFlags(flags, eor=False)
2850
2851 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2852 self.checkRecvmsgAddress(addr, self.cli_addr)
2853 self.assertEqual(ancdata, [])
2854 self.checkFlags(flags, eor=True)
2855
2856 msg = seg1 + seg2
2857 self.assertEqual(msg, MSG)
2858
2859 def _testRecvmsgOverflow(self):
2860 self.sendToServer(MSG)
2861
2862
2863class RecvmsgTests(RecvmsgGenericTests):
2864 # Tests for recvmsg() which can use any socket type.
2865
2866 def testRecvmsgBadArgs(self):
2867 # Check that recvmsg() rejects invalid arguments.
2868 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2869 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2870 -1, 0, 0)
2871 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2872 len(MSG), -1, 0)
2873 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2874 [bytearray(10)], 0, 0)
2875 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2876 object(), 0, 0)
2877 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2878 len(MSG), object(), 0)
2879 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2880 len(MSG), 0, object())
2881
2882 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2883 self.assertEqual(msg, MSG)
2884 self.checkRecvmsgAddress(addr, self.cli_addr)
2885 self.assertEqual(ancdata, [])
2886 self.checkFlags(flags, eor=True)
2887
2888 def _testRecvmsgBadArgs(self):
2889 self.sendToServer(MSG)
2890
2891
2892class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2893 # Tests for recvmsg_into() which can use any socket type.
2894
2895 def testRecvmsgIntoBadArgs(self):
2896 # Check that recvmsg_into() rejects invalid arguments.
2897 buf = bytearray(len(MSG))
2898 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2899 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2900 len(MSG), 0, 0)
2901 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2902 buf, 0, 0)
2903 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2904 [object()], 0, 0)
2905 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2906 [b"I'm not writable"], 0, 0)
2907 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2908 [buf, object()], 0, 0)
2909 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2910 [buf], -1, 0)
2911 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2912 [buf], object(), 0)
2913 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2914 [buf], 0, object())
2915
2916 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2917 self.assertEqual(nbytes, len(MSG))
2918 self.assertEqual(buf, bytearray(MSG))
2919 self.checkRecvmsgAddress(addr, self.cli_addr)
2920 self.assertEqual(ancdata, [])
2921 self.checkFlags(flags, eor=True)
2922
2923 def _testRecvmsgIntoBadArgs(self):
2924 self.sendToServer(MSG)
2925
2926 def testRecvmsgIntoGenerator(self):
2927 # Receive into buffer obtained from a generator (not a sequence).
2928 buf = bytearray(len(MSG))
2929 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2930 (o for o in [buf]))
2931 self.assertEqual(nbytes, len(MSG))
2932 self.assertEqual(buf, bytearray(MSG))
2933 self.checkRecvmsgAddress(addr, self.cli_addr)
2934 self.assertEqual(ancdata, [])
2935 self.checkFlags(flags, eor=True)
2936
2937 def _testRecvmsgIntoGenerator(self):
2938 self.sendToServer(MSG)
2939
2940 def testRecvmsgIntoArray(self):
2941 # Receive into an array rather than the usual bytearray.
2942 buf = array.array("B", [0] * len(MSG))
2943 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2944 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002945 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002946 self.checkRecvmsgAddress(addr, self.cli_addr)
2947 self.assertEqual(ancdata, [])
2948 self.checkFlags(flags, eor=True)
2949
2950 def _testRecvmsgIntoArray(self):
2951 self.sendToServer(MSG)
2952
2953 def testRecvmsgIntoScatter(self):
2954 # Receive into multiple buffers (scatter write).
2955 b1 = bytearray(b"----")
2956 b2 = bytearray(b"0123456789")
2957 b3 = bytearray(b"--------------")
2958 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2959 [b1, memoryview(b2)[2:9], b3])
2960 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2961 self.assertEqual(b1, bytearray(b"Mary"))
2962 self.assertEqual(b2, bytearray(b"01 had a 9"))
2963 self.assertEqual(b3, bytearray(b"little lamb---"))
2964 self.checkRecvmsgAddress(addr, self.cli_addr)
2965 self.assertEqual(ancdata, [])
2966 self.checkFlags(flags, eor=True)
2967
2968 def _testRecvmsgIntoScatter(self):
2969 self.sendToServer(b"Mary had a little lamb")
2970
2971
2972class CmsgMacroTests(unittest.TestCase):
2973 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2974 # assumptions used by sendmsg() and recvmsg[_into](), which share
2975 # code with these functions.
2976
2977 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002978 try:
2979 import _testcapi
2980 except ImportError:
2981 socklen_t_limit = 0x7fffffff
2982 else:
2983 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002984
2985 @requireAttrs(socket, "CMSG_LEN")
2986 def testCMSG_LEN(self):
2987 # Test CMSG_LEN() with various valid and invalid values,
2988 # checking the assumptions used by recvmsg() and sendmsg().
2989 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2990 values = list(range(257)) + list(range(toobig - 257, toobig))
2991
2992 # struct cmsghdr has at least three members, two of which are ints
2993 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2994 for n in values:
2995 ret = socket.CMSG_LEN(n)
2996 # This is how recvmsg() calculates the data size
2997 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2998 self.assertLessEqual(ret, self.socklen_t_limit)
2999
3000 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3001 # sendmsg() shares code with these functions, and requires
3002 # that it reject values over the limit.
3003 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3004 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3005
3006 @requireAttrs(socket, "CMSG_SPACE")
3007 def testCMSG_SPACE(self):
3008 # Test CMSG_SPACE() with various valid and invalid values,
3009 # checking the assumptions used by sendmsg().
3010 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3011 values = list(range(257)) + list(range(toobig - 257, toobig))
3012
3013 last = socket.CMSG_SPACE(0)
3014 # struct cmsghdr has at least three members, two of which are ints
3015 self.assertGreater(last, array.array("i").itemsize * 2)
3016 for n in values:
3017 ret = socket.CMSG_SPACE(n)
3018 self.assertGreaterEqual(ret, last)
3019 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3020 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3021 self.assertLessEqual(ret, self.socklen_t_limit)
3022 last = ret
3023
3024 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3025 # sendmsg() shares code with these functions, and requires
3026 # that it reject values over the limit.
3027 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3028 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3029
3030
3031class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3032 # Tests for file descriptor passing on Unix-domain sockets.
3033
3034 # Invalid file descriptor value that's unlikely to evaluate to a
3035 # real FD even if one of its bytes is replaced with a different
3036 # value (which shouldn't actually happen).
3037 badfd = -0x5555
3038
3039 def newFDs(self, n):
3040 # Return a list of n file descriptors for newly-created files
3041 # containing their list indices as ASCII numbers.
3042 fds = []
3043 for i in range(n):
3044 fd, path = tempfile.mkstemp()
3045 self.addCleanup(os.unlink, path)
3046 self.addCleanup(os.close, fd)
3047 os.write(fd, str(i).encode())
3048 fds.append(fd)
3049 return fds
3050
3051 def checkFDs(self, fds):
3052 # Check that the file descriptors in the given list contain
3053 # their correct list indices as ASCII numbers.
3054 for n, fd in enumerate(fds):
3055 os.lseek(fd, 0, os.SEEK_SET)
3056 self.assertEqual(os.read(fd, 1024), str(n).encode())
3057
3058 def registerRecvmsgResult(self, result):
3059 self.addCleanup(self.closeRecvmsgFDs, result)
3060
3061 def closeRecvmsgFDs(self, recvmsg_result):
3062 # Close all file descriptors specified in the ancillary data
3063 # of the given return value from recvmsg() or recvmsg_into().
3064 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3065 if (cmsg_level == socket.SOL_SOCKET and
3066 cmsg_type == socket.SCM_RIGHTS):
3067 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003068 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003069 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3070 for fd in fds:
3071 os.close(fd)
3072
3073 def createAndSendFDs(self, n):
3074 # Send n new file descriptors created by newFDs() to the
3075 # server, with the constant MSG as the non-ancillary data.
3076 self.assertEqual(
3077 self.sendmsgToServer([MSG],
3078 [(socket.SOL_SOCKET,
3079 socket.SCM_RIGHTS,
3080 array.array("i", self.newFDs(n)))]),
3081 len(MSG))
3082
3083 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3084 # Check that constant MSG was received with numfds file
3085 # descriptors in a maximum of maxcmsgs control messages (which
3086 # must contain only complete integers). By default, check
3087 # that MSG_CTRUNC is unset, but ignore any flags in
3088 # ignoreflags.
3089 msg, ancdata, flags, addr = result
3090 self.assertEqual(msg, MSG)
3091 self.checkRecvmsgAddress(addr, self.cli_addr)
3092 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3093 ignore=ignoreflags)
3094
3095 self.assertIsInstance(ancdata, list)
3096 self.assertLessEqual(len(ancdata), maxcmsgs)
3097 fds = array.array("i")
3098 for item in ancdata:
3099 self.assertIsInstance(item, tuple)
3100 cmsg_level, cmsg_type, cmsg_data = item
3101 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3102 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3103 self.assertIsInstance(cmsg_data, bytes)
3104 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003105 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003106
3107 self.assertEqual(len(fds), numfds)
3108 self.checkFDs(fds)
3109
3110 def testFDPassSimple(self):
3111 # Pass a single FD (array read from bytes object).
3112 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3113 len(MSG), 10240))
3114
3115 def _testFDPassSimple(self):
3116 self.assertEqual(
3117 self.sendmsgToServer(
3118 [MSG],
3119 [(socket.SOL_SOCKET,
3120 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003121 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003122 len(MSG))
3123
3124 def testMultipleFDPass(self):
3125 # Pass multiple FDs in a single array.
3126 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3127 len(MSG), 10240))
3128
3129 def _testMultipleFDPass(self):
3130 self.createAndSendFDs(4)
3131
3132 @requireAttrs(socket, "CMSG_SPACE")
3133 def testFDPassCMSG_SPACE(self):
3134 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3135 self.checkRecvmsgFDs(
3136 4, self.doRecvmsg(self.serv_sock, len(MSG),
3137 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3138
3139 @testFDPassCMSG_SPACE.client_skip
3140 def _testFDPassCMSG_SPACE(self):
3141 self.createAndSendFDs(4)
3142
3143 def testFDPassCMSG_LEN(self):
3144 # Test using CMSG_LEN() to calculate ancillary buffer size.
3145 self.checkRecvmsgFDs(1,
3146 self.doRecvmsg(self.serv_sock, len(MSG),
3147 socket.CMSG_LEN(4 * SIZEOF_INT)),
3148 # RFC 3542 says implementations may set
3149 # MSG_CTRUNC if there isn't enough space
3150 # for trailing padding.
3151 ignoreflags=socket.MSG_CTRUNC)
3152
3153 def _testFDPassCMSG_LEN(self):
3154 self.createAndSendFDs(1)
3155
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 @requireAttrs(socket, "CMSG_SPACE")
3159 def testFDPassSeparate(self):
3160 # Pass two FDs in two separate arrays. Arrays may be combined
3161 # into a single control message by the OS.
3162 self.checkRecvmsgFDs(2,
3163 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3164 maxcmsgs=2)
3165
3166 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003167 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003168 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003169 def _testFDPassSeparate(self):
3170 fd0, fd1 = self.newFDs(2)
3171 self.assertEqual(
3172 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3173 socket.SCM_RIGHTS,
3174 array.array("i", [fd0])),
3175 (socket.SOL_SOCKET,
3176 socket.SCM_RIGHTS,
3177 array.array("i", [fd1]))]),
3178 len(MSG))
3179
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003180 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003181 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003182 @requireAttrs(socket, "CMSG_SPACE")
3183 def testFDPassSeparateMinSpace(self):
3184 # Pass two FDs in two separate arrays, receiving them into the
3185 # minimum space for two arrays.
Miss Islington (bot)addef072018-09-27 06:30:47 -07003186 num_fds = 2
3187 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003188 self.doRecvmsg(self.serv_sock, len(MSG),
3189 socket.CMSG_SPACE(SIZEOF_INT) +
Miss Islington (bot)addef072018-09-27 06:30:47 -07003190 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003191 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3192
3193 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003194 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003195 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003196 def _testFDPassSeparateMinSpace(self):
3197 fd0, fd1 = self.newFDs(2)
3198 self.assertEqual(
3199 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3200 socket.SCM_RIGHTS,
3201 array.array("i", [fd0])),
3202 (socket.SOL_SOCKET,
3203 socket.SCM_RIGHTS,
3204 array.array("i", [fd1]))]),
3205 len(MSG))
3206
3207 def sendAncillaryIfPossible(self, msg, ancdata):
3208 # Try to send msg and ancdata to server, but if the system
3209 # call fails, just send msg with no ancillary data.
3210 try:
3211 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003212 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003213 # Check that it was the system call that failed
3214 self.assertIsInstance(e.errno, int)
3215 nbytes = self.sendmsgToServer([msg])
3216 self.assertEqual(nbytes, len(msg))
3217
Brett Cannon3bbad122015-12-28 17:21:44 -08003218 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003219 def testFDPassEmpty(self):
3220 # Try to pass an empty FD array. Can receive either no array
3221 # or an empty array.
3222 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3223 len(MSG), 10240),
3224 ignoreflags=socket.MSG_CTRUNC)
3225
3226 def _testFDPassEmpty(self):
3227 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3228 socket.SCM_RIGHTS,
3229 b"")])
3230
3231 def testFDPassPartialInt(self):
3232 # Try to pass a truncated FD array.
3233 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3234 len(MSG), 10240)
3235 self.assertEqual(msg, MSG)
3236 self.checkRecvmsgAddress(addr, self.cli_addr)
3237 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3238 self.assertLessEqual(len(ancdata), 1)
3239 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3240 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3241 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3242 self.assertLess(len(cmsg_data), SIZEOF_INT)
3243
3244 def _testFDPassPartialInt(self):
3245 self.sendAncillaryIfPossible(
3246 MSG,
3247 [(socket.SOL_SOCKET,
3248 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003249 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003250
3251 @requireAttrs(socket, "CMSG_SPACE")
3252 def testFDPassPartialIntInMiddle(self):
3253 # Try to pass two FD arrays, the first of which is truncated.
3254 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3255 len(MSG), 10240)
3256 self.assertEqual(msg, MSG)
3257 self.checkRecvmsgAddress(addr, self.cli_addr)
3258 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3259 self.assertLessEqual(len(ancdata), 2)
3260 fds = array.array("i")
3261 # Arrays may have been combined in a single control message
3262 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3263 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3264 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003265 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003266 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3267 self.assertLessEqual(len(fds), 2)
3268 self.checkFDs(fds)
3269
3270 @testFDPassPartialIntInMiddle.client_skip
3271 def _testFDPassPartialIntInMiddle(self):
3272 fd0, fd1 = self.newFDs(2)
3273 self.sendAncillaryIfPossible(
3274 MSG,
3275 [(socket.SOL_SOCKET,
3276 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003277 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003278 (socket.SOL_SOCKET,
3279 socket.SCM_RIGHTS,
3280 array.array("i", [fd1]))])
3281
3282 def checkTruncatedHeader(self, result, ignoreflags=0):
3283 # Check that no ancillary data items are returned when data is
3284 # truncated inside the cmsghdr structure.
3285 msg, ancdata, flags, addr = result
3286 self.assertEqual(msg, MSG)
3287 self.checkRecvmsgAddress(addr, self.cli_addr)
3288 self.assertEqual(ancdata, [])
3289 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3290 ignore=ignoreflags)
3291
3292 def testCmsgTruncNoBufSize(self):
3293 # Check that no ancillary data is received when no buffer size
3294 # is specified.
3295 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3296 # BSD seems to set MSG_CTRUNC only
3297 # if an item has been partially
3298 # received.
3299 ignoreflags=socket.MSG_CTRUNC)
3300
3301 def _testCmsgTruncNoBufSize(self):
3302 self.createAndSendFDs(1)
3303
3304 def testCmsgTrunc0(self):
3305 # Check that no ancillary data is received when buffer size is 0.
3306 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3307 ignoreflags=socket.MSG_CTRUNC)
3308
3309 def _testCmsgTrunc0(self):
3310 self.createAndSendFDs(1)
3311
3312 # Check that no ancillary data is returned for various non-zero
3313 # (but still too small) buffer sizes.
3314
3315 def testCmsgTrunc1(self):
3316 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3317
3318 def _testCmsgTrunc1(self):
3319 self.createAndSendFDs(1)
3320
3321 def testCmsgTrunc2Int(self):
3322 # The cmsghdr structure has at least three members, two of
3323 # which are ints, so we still shouldn't see any ancillary
3324 # data.
3325 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3326 SIZEOF_INT * 2))
3327
3328 def _testCmsgTrunc2Int(self):
3329 self.createAndSendFDs(1)
3330
3331 def testCmsgTruncLen0Minus1(self):
3332 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3333 socket.CMSG_LEN(0) - 1))
3334
3335 def _testCmsgTruncLen0Minus1(self):
3336 self.createAndSendFDs(1)
3337
3338 # The following tests try to truncate the control message in the
3339 # middle of the FD array.
3340
3341 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3342 # Check that file descriptor data is truncated to between
3343 # mindata and maxdata bytes when received with buffer size
3344 # ancbuf, and that any complete file descriptor numbers are
3345 # valid.
3346 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3347 len(MSG), ancbuf)
3348 self.assertEqual(msg, MSG)
3349 self.checkRecvmsgAddress(addr, self.cli_addr)
3350 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3351
3352 if mindata == 0 and ancdata == []:
3353 return
3354 self.assertEqual(len(ancdata), 1)
3355 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3356 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3357 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3358 self.assertGreaterEqual(len(cmsg_data), mindata)
3359 self.assertLessEqual(len(cmsg_data), maxdata)
3360 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003361 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003362 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3363 self.checkFDs(fds)
3364
3365 def testCmsgTruncLen0(self):
3366 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3367
3368 def _testCmsgTruncLen0(self):
3369 self.createAndSendFDs(1)
3370
3371 def testCmsgTruncLen0Plus1(self):
3372 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3373
3374 def _testCmsgTruncLen0Plus1(self):
3375 self.createAndSendFDs(2)
3376
3377 def testCmsgTruncLen1(self):
3378 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3379 maxdata=SIZEOF_INT)
3380
3381 def _testCmsgTruncLen1(self):
3382 self.createAndSendFDs(2)
3383
3384 def testCmsgTruncLen2Minus1(self):
3385 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3386 maxdata=(2 * SIZEOF_INT) - 1)
3387
3388 def _testCmsgTruncLen2Minus1(self):
3389 self.createAndSendFDs(2)
3390
3391
3392class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3393 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3394 # features of the RFC 3542 Advanced Sockets API for IPv6.
3395 # Currently we can only handle certain data items (e.g. traffic
3396 # class, hop limit, MTU discovery and fragmentation settings)
3397 # without resorting to unportable means such as the struct module,
3398 # but the tests here are aimed at testing the ancillary data
3399 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3400 # itself.
3401
3402 # Test value to use when setting hop limit of packet
3403 hop_limit = 2
3404
3405 # Test value to use when setting traffic class of packet.
3406 # -1 means "use kernel default".
3407 traffic_class = -1
3408
3409 def ancillaryMapping(self, ancdata):
3410 # Given ancillary data list ancdata, return a mapping from
3411 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3412 # Check that no (level, type) pair appears more than once.
3413 d = {}
3414 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3415 self.assertNotIn((cmsg_level, cmsg_type), d)
3416 d[(cmsg_level, cmsg_type)] = cmsg_data
3417 return d
3418
3419 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3420 # Receive hop limit into ancbufsize bytes of ancillary data
3421 # space. Check that data is MSG, ancillary data is not
3422 # truncated (but ignore any flags in ignoreflags), and hop
3423 # limit is between 0 and maxhop inclusive.
3424 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3425 socket.IPV6_RECVHOPLIMIT, 1)
3426 self.misc_event.set()
3427 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3428 len(MSG), ancbufsize)
3429
3430 self.assertEqual(msg, MSG)
3431 self.checkRecvmsgAddress(addr, self.cli_addr)
3432 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3433 ignore=ignoreflags)
3434
3435 self.assertEqual(len(ancdata), 1)
3436 self.assertIsInstance(ancdata[0], tuple)
3437 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3438 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3439 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3440 self.assertIsInstance(cmsg_data, bytes)
3441 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3442 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003443 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003444 self.assertGreaterEqual(a[0], 0)
3445 self.assertLessEqual(a[0], maxhop)
3446
3447 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3448 def testRecvHopLimit(self):
3449 # Test receiving the packet hop limit as ancillary data.
3450 self.checkHopLimit(ancbufsize=10240)
3451
3452 @testRecvHopLimit.client_skip
3453 def _testRecvHopLimit(self):
3454 # Need to wait until server has asked to receive ancillary
3455 # data, as implementations are not required to buffer it
3456 # otherwise.
3457 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3458 self.sendToServer(MSG)
3459
3460 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3461 def testRecvHopLimitCMSG_SPACE(self):
3462 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3463 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3464
3465 @testRecvHopLimitCMSG_SPACE.client_skip
3466 def _testRecvHopLimitCMSG_SPACE(self):
3467 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3468 self.sendToServer(MSG)
3469
3470 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3471 # 3542 says portable applications must provide space for trailing
3472 # padding. Implementations may set MSG_CTRUNC if there isn't
3473 # enough space for the padding.
3474
3475 @requireAttrs(socket.socket, "sendmsg")
3476 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3477 def testSetHopLimit(self):
3478 # Test setting hop limit on outgoing packet and receiving it
3479 # at the other end.
3480 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3481
3482 @testSetHopLimit.client_skip
3483 def _testSetHopLimit(self):
3484 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3485 self.assertEqual(
3486 self.sendmsgToServer([MSG],
3487 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3488 array.array("i", [self.hop_limit]))]),
3489 len(MSG))
3490
3491 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3492 ignoreflags=0):
3493 # Receive traffic class and hop limit into ancbufsize bytes of
3494 # ancillary data space. Check that data is MSG, ancillary
3495 # data is not truncated (but ignore any flags in ignoreflags),
3496 # and traffic class and hop limit are in range (hop limit no
3497 # more than maxhop).
3498 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3499 socket.IPV6_RECVHOPLIMIT, 1)
3500 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3501 socket.IPV6_RECVTCLASS, 1)
3502 self.misc_event.set()
3503 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3504 len(MSG), ancbufsize)
3505
3506 self.assertEqual(msg, MSG)
3507 self.checkRecvmsgAddress(addr, self.cli_addr)
3508 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3509 ignore=ignoreflags)
3510 self.assertEqual(len(ancdata), 2)
3511 ancmap = self.ancillaryMapping(ancdata)
3512
3513 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3514 self.assertEqual(len(tcdata), SIZEOF_INT)
3515 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003516 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003517 self.assertGreaterEqual(a[0], 0)
3518 self.assertLessEqual(a[0], 255)
3519
3520 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3521 self.assertEqual(len(hldata), SIZEOF_INT)
3522 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003523 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003524 self.assertGreaterEqual(a[0], 0)
3525 self.assertLessEqual(a[0], maxhop)
3526
3527 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3528 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3529 def testRecvTrafficClassAndHopLimit(self):
3530 # Test receiving traffic class and hop limit as ancillary data.
3531 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3532
3533 @testRecvTrafficClassAndHopLimit.client_skip
3534 def _testRecvTrafficClassAndHopLimit(self):
3535 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3536 self.sendToServer(MSG)
3537
3538 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3539 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3540 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3541 # Test receiving traffic class and hop limit, using
3542 # CMSG_SPACE() to calculate buffer size.
3543 self.checkTrafficClassAndHopLimit(
3544 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3545
3546 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3547 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3548 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3549 self.sendToServer(MSG)
3550
3551 @requireAttrs(socket.socket, "sendmsg")
3552 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3553 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3554 def testSetTrafficClassAndHopLimit(self):
3555 # Test setting traffic class and hop limit on outgoing packet,
3556 # and receiving them at the other end.
3557 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3558 maxhop=self.hop_limit)
3559
3560 @testSetTrafficClassAndHopLimit.client_skip
3561 def _testSetTrafficClassAndHopLimit(self):
3562 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3563 self.assertEqual(
3564 self.sendmsgToServer([MSG],
3565 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3566 array.array("i", [self.traffic_class])),
3567 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3568 array.array("i", [self.hop_limit]))]),
3569 len(MSG))
3570
3571 @requireAttrs(socket.socket, "sendmsg")
3572 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3573 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3574 def testOddCmsgSize(self):
3575 # Try to send ancillary data with first item one byte too
3576 # long. Fall back to sending with correct size if this fails,
3577 # and check that second item was handled correctly.
3578 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3579 maxhop=self.hop_limit)
3580
3581 @testOddCmsgSize.client_skip
3582 def _testOddCmsgSize(self):
3583 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3584 try:
3585 nbytes = self.sendmsgToServer(
3586 [MSG],
3587 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003588 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003589 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3590 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003591 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003592 self.assertIsInstance(e.errno, int)
3593 nbytes = self.sendmsgToServer(
3594 [MSG],
3595 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3596 array.array("i", [self.traffic_class])),
3597 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3598 array.array("i", [self.hop_limit]))])
3599 self.assertEqual(nbytes, len(MSG))
3600
3601 # Tests for proper handling of truncated ancillary data
3602
3603 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3604 # Receive hop limit into ancbufsize bytes of ancillary data
3605 # space, which should be too small to contain the ancillary
3606 # data header (if ancbufsize is None, pass no second argument
3607 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3608 # (unless included in ignoreflags), and no ancillary data is
3609 # returned.
3610 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3611 socket.IPV6_RECVHOPLIMIT, 1)
3612 self.misc_event.set()
3613 args = () if ancbufsize is None else (ancbufsize,)
3614 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3615 len(MSG), *args)
3616
3617 self.assertEqual(msg, MSG)
3618 self.checkRecvmsgAddress(addr, self.cli_addr)
3619 self.assertEqual(ancdata, [])
3620 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3621 ignore=ignoreflags)
3622
3623 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3624 def testCmsgTruncNoBufSize(self):
3625 # Check that no ancillary data is received when no ancillary
3626 # buffer size is provided.
3627 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3628 # BSD seems to set
3629 # MSG_CTRUNC only if an item
3630 # has been partially
3631 # received.
3632 ignoreflags=socket.MSG_CTRUNC)
3633
3634 @testCmsgTruncNoBufSize.client_skip
3635 def _testCmsgTruncNoBufSize(self):
3636 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3637 self.sendToServer(MSG)
3638
3639 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3640 def testSingleCmsgTrunc0(self):
3641 # Check that no ancillary data is received when ancillary
3642 # buffer size is zero.
3643 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3644 ignoreflags=socket.MSG_CTRUNC)
3645
3646 @testSingleCmsgTrunc0.client_skip
3647 def _testSingleCmsgTrunc0(self):
3648 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3649 self.sendToServer(MSG)
3650
3651 # Check that no ancillary data is returned for various non-zero
3652 # (but still too small) buffer sizes.
3653
3654 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3655 def testSingleCmsgTrunc1(self):
3656 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3657
3658 @testSingleCmsgTrunc1.client_skip
3659 def _testSingleCmsgTrunc1(self):
3660 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3661 self.sendToServer(MSG)
3662
3663 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3664 def testSingleCmsgTrunc2Int(self):
3665 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3666
3667 @testSingleCmsgTrunc2Int.client_skip
3668 def _testSingleCmsgTrunc2Int(self):
3669 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3670 self.sendToServer(MSG)
3671
3672 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3673 def testSingleCmsgTruncLen0Minus1(self):
3674 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3675
3676 @testSingleCmsgTruncLen0Minus1.client_skip
3677 def _testSingleCmsgTruncLen0Minus1(self):
3678 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3679 self.sendToServer(MSG)
3680
3681 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3682 def testSingleCmsgTruncInData(self):
3683 # Test truncation of a control message inside its associated
3684 # data. The message may be returned with its data truncated,
3685 # or not returned at all.
3686 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3687 socket.IPV6_RECVHOPLIMIT, 1)
3688 self.misc_event.set()
3689 msg, ancdata, flags, addr = self.doRecvmsg(
3690 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3691
3692 self.assertEqual(msg, MSG)
3693 self.checkRecvmsgAddress(addr, self.cli_addr)
3694 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3695
3696 self.assertLessEqual(len(ancdata), 1)
3697 if ancdata:
3698 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3699 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3700 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3701 self.assertLess(len(cmsg_data), SIZEOF_INT)
3702
3703 @testSingleCmsgTruncInData.client_skip
3704 def _testSingleCmsgTruncInData(self):
3705 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3706 self.sendToServer(MSG)
3707
3708 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3709 # Receive traffic class and hop limit into ancbufsize bytes of
3710 # ancillary data space, which should be large enough to
3711 # contain the first item, but too small to contain the header
3712 # of the second. Check that data is MSG, MSG_CTRUNC is set
3713 # (unless included in ignoreflags), and only one ancillary
3714 # data item is returned.
3715 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3716 socket.IPV6_RECVHOPLIMIT, 1)
3717 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3718 socket.IPV6_RECVTCLASS, 1)
3719 self.misc_event.set()
3720 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3721 len(MSG), ancbufsize)
3722
3723 self.assertEqual(msg, MSG)
3724 self.checkRecvmsgAddress(addr, self.cli_addr)
3725 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3726 ignore=ignoreflags)
3727
3728 self.assertEqual(len(ancdata), 1)
3729 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3730 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3731 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3732 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3733 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003734 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003735 self.assertGreaterEqual(a[0], 0)
3736 self.assertLessEqual(a[0], 255)
3737
3738 # Try the above test with various buffer sizes.
3739
3740 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3741 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3742 def testSecondCmsgTrunc0(self):
3743 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3744 ignoreflags=socket.MSG_CTRUNC)
3745
3746 @testSecondCmsgTrunc0.client_skip
3747 def _testSecondCmsgTrunc0(self):
3748 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3749 self.sendToServer(MSG)
3750
3751 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3752 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3753 def testSecondCmsgTrunc1(self):
3754 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3755
3756 @testSecondCmsgTrunc1.client_skip
3757 def _testSecondCmsgTrunc1(self):
3758 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3759 self.sendToServer(MSG)
3760
3761 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3762 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3763 def testSecondCmsgTrunc2Int(self):
3764 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3765 2 * SIZEOF_INT)
3766
3767 @testSecondCmsgTrunc2Int.client_skip
3768 def _testSecondCmsgTrunc2Int(self):
3769 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3770 self.sendToServer(MSG)
3771
3772 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3773 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3774 def testSecondCmsgTruncLen0Minus1(self):
3775 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3776 socket.CMSG_LEN(0) - 1)
3777
3778 @testSecondCmsgTruncLen0Minus1.client_skip
3779 def _testSecondCmsgTruncLen0Minus1(self):
3780 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3781 self.sendToServer(MSG)
3782
3783 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3784 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3785 def testSecomdCmsgTruncInData(self):
3786 # Test truncation of the second of two control messages inside
3787 # its associated data.
3788 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3789 socket.IPV6_RECVHOPLIMIT, 1)
3790 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3791 socket.IPV6_RECVTCLASS, 1)
3792 self.misc_event.set()
3793 msg, ancdata, flags, addr = self.doRecvmsg(
3794 self.serv_sock, len(MSG),
3795 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3796
3797 self.assertEqual(msg, MSG)
3798 self.checkRecvmsgAddress(addr, self.cli_addr)
3799 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3800
3801 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3802
3803 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3804 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3805 cmsg_types.remove(cmsg_type)
3806 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3807 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003808 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003809 self.assertGreaterEqual(a[0], 0)
3810 self.assertLessEqual(a[0], 255)
3811
3812 if ancdata:
3813 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3814 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3815 cmsg_types.remove(cmsg_type)
3816 self.assertLess(len(cmsg_data), SIZEOF_INT)
3817
3818 self.assertEqual(ancdata, [])
3819
3820 @testSecomdCmsgTruncInData.client_skip
3821 def _testSecomdCmsgTruncInData(self):
3822 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3823 self.sendToServer(MSG)
3824
3825
3826# Derive concrete test classes for different socket types.
3827
3828class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3829 SendrecvmsgConnectionlessBase,
3830 ThreadedSocketTestMixin, UDPTestBase):
3831 pass
3832
3833@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003834class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3835 pass
3836
3837@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003838class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3839 pass
3840
3841@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003842class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3843 pass
3844
3845
3846class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3847 SendrecvmsgConnectionlessBase,
3848 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003849
3850 def checkRecvmsgAddress(self, addr1, addr2):
3851 # Called to compare the received address with the address of
3852 # the peer, ignoring scope ID
3853 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003854
3855@requireAttrs(socket.socket, "sendmsg")
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 SendmsgUDP6Test(SendmsgConnectionlessTests, 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@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003864class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3865 pass
3866
3867@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003868@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003869@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003870class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3871 pass
3872
3873@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003874@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003875@requireAttrs(socket, "IPPROTO_IPV6")
3876@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003877class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3878 SendrecvmsgUDP6TestBase):
3879 pass
3880
3881@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003882@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003883@requireAttrs(socket, "IPPROTO_IPV6")
3884@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003885class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3886 RFC3542AncillaryTest,
3887 SendrecvmsgUDP6TestBase):
3888 pass
3889
3890
3891class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3892 ConnectedStreamTestMixin, TCPTestBase):
3893 pass
3894
3895@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003896class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3897 pass
3898
3899@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003900class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3901 SendrecvmsgTCPTestBase):
3902 pass
3903
3904@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003905class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3906 SendrecvmsgTCPTestBase):
3907 pass
3908
3909
3910class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3911 SendrecvmsgConnectedBase,
3912 ConnectedStreamTestMixin, SCTPStreamBase):
3913 pass
3914
3915@requireAttrs(socket.socket, "sendmsg")
3916@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003917class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3918 pass
3919
3920@requireAttrs(socket.socket, "recvmsg")
3921@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003922class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3923 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003924
3925 def testRecvmsgEOF(self):
3926 try:
3927 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3928 except OSError as e:
3929 if e.errno != errno.ENOTCONN:
3930 raise
3931 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003932
3933@requireAttrs(socket.socket, "recvmsg_into")
3934@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003935class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3936 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003937
3938 def testRecvmsgEOF(self):
3939 try:
3940 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3941 except OSError as e:
3942 if e.errno != errno.ENOTCONN:
3943 raise
3944 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003945
3946
3947class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3948 ConnectedStreamTestMixin, UnixStreamBase):
3949 pass
3950
3951@requireAttrs(socket.socket, "sendmsg")
3952@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003953class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3954 pass
3955
3956@requireAttrs(socket.socket, "recvmsg")
3957@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003958class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3959 SendrecvmsgUnixStreamTestBase):
3960 pass
3961
3962@requireAttrs(socket.socket, "recvmsg_into")
3963@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003964class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3965 SendrecvmsgUnixStreamTestBase):
3966 pass
3967
3968@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3969@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003970class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3971 pass
3972
3973@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3974@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003975class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3976 SendrecvmsgUnixStreamTestBase):
3977 pass
3978
3979
3980# Test interrupting the interruptible send/receive methods with a
3981# signal when a timeout is set. These tests avoid having multiple
3982# threads alive during the test so that the OS cannot deliver the
3983# signal to the wrong one.
3984
3985class InterruptedTimeoutBase(unittest.TestCase):
3986 # Base class for interrupted send/receive tests. Installs an
3987 # empty handler for SIGALRM and removes it on teardown, along with
3988 # any scheduled alarms.
3989
3990 def setUp(self):
3991 super().setUp()
3992 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003993 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003994 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003995
3996 # Timeout for socket operations
3997 timeout = 4.0
3998
3999 # Provide setAlarm() method to schedule delivery of SIGALRM after
4000 # given number of seconds, or cancel it if zero, and an
4001 # appropriate time value to use. Use setitimer() if available.
4002 if hasattr(signal, "setitimer"):
4003 alarm_time = 0.05
4004
4005 def setAlarm(self, seconds):
4006 signal.setitimer(signal.ITIMER_REAL, seconds)
4007 else:
4008 # Old systems may deliver the alarm up to one second early
4009 alarm_time = 2
4010
4011 def setAlarm(self, seconds):
4012 signal.alarm(seconds)
4013
4014
4015# Require siginterrupt() in order to ensure that system calls are
4016# interrupted by default.
4017@requireAttrs(signal, "siginterrupt")
4018@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4019 "Don't have signal.alarm or signal.setitimer")
4020class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4021 # Test interrupting the recv*() methods with signals when a
4022 # timeout is set.
4023
4024 def setUp(self):
4025 super().setUp()
4026 self.serv.settimeout(self.timeout)
4027
4028 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004029 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004030 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004031 try:
4032 self.setAlarm(self.alarm_time)
4033 with self.assertRaises(ZeroDivisionError) as cm:
4034 func(*args, **kwargs)
4035 finally:
4036 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004037
4038 def testInterruptedRecvTimeout(self):
4039 self.checkInterruptedRecv(self.serv.recv, 1024)
4040
4041 def testInterruptedRecvIntoTimeout(self):
4042 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4043
4044 def testInterruptedRecvfromTimeout(self):
4045 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4046
4047 def testInterruptedRecvfromIntoTimeout(self):
4048 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4049
4050 @requireAttrs(socket.socket, "recvmsg")
4051 def testInterruptedRecvmsgTimeout(self):
4052 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4053
4054 @requireAttrs(socket.socket, "recvmsg_into")
4055 def testInterruptedRecvmsgIntoTimeout(self):
4056 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4057
4058
4059# Require siginterrupt() in order to ensure that system calls are
4060# interrupted by default.
4061@requireAttrs(signal, "siginterrupt")
4062@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4063 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004064class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4065 ThreadSafeCleanupTestCase,
4066 SocketListeningTestMixin, TCPTestBase):
4067 # Test interrupting the interruptible send*() methods with signals
4068 # when a timeout is set.
4069
4070 def setUp(self):
4071 super().setUp()
4072 self.serv_conn = self.newSocket()
4073 self.addCleanup(self.serv_conn.close)
4074 # Use a thread to complete the connection, but wait for it to
4075 # terminate before running the test, so that there is only one
4076 # thread to accept the signal.
4077 cli_thread = threading.Thread(target=self.doConnect)
4078 cli_thread.start()
4079 self.cli_conn, addr = self.serv.accept()
4080 self.addCleanup(self.cli_conn.close)
4081 cli_thread.join()
4082 self.serv_conn.settimeout(self.timeout)
4083
4084 def doConnect(self):
4085 self.serv_conn.connect(self.serv_addr)
4086
4087 def checkInterruptedSend(self, func, *args, **kwargs):
4088 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004089 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004090 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004091 try:
4092 with self.assertRaises(ZeroDivisionError) as cm:
4093 while True:
4094 self.setAlarm(self.alarm_time)
4095 func(*args, **kwargs)
4096 finally:
4097 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004098
Ned Deilyc5640382014-02-03 13:58:31 -08004099 # Issue #12958: The following tests have problems on OS X prior to 10.7
4100 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004101 def testInterruptedSendTimeout(self):
4102 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4103
Ned Deilyc5640382014-02-03 13:58:31 -08004104 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004105 def testInterruptedSendtoTimeout(self):
4106 # Passing an actual address here as Python's wrapper for
4107 # sendto() doesn't allow passing a zero-length one; POSIX
4108 # requires that the address is ignored since the socket is
4109 # connection-mode, however.
4110 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4111 self.serv_addr)
4112
Ned Deilyc5640382014-02-03 13:58:31 -08004113 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004114 @requireAttrs(socket.socket, "sendmsg")
4115 def testInterruptedSendmsgTimeout(self):
4116 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4117
4118
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004119class TCPCloserTest(ThreadedTCPSocketTest):
4120
4121 def testClose(self):
4122 conn, addr = self.serv.accept()
4123 conn.close()
4124
4125 sd = self.cli
4126 read, write, err = select.select([sd], [], [], 1.0)
4127 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004128 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004129
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004130 # Calling close() many times should be safe.
4131 conn.close()
4132 conn.close()
4133
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004134 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004135 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004136 time.sleep(1.0)
4137
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004138
Dave Cole331708b2004-08-09 04:51:41 +00004139class BasicSocketPairTest(SocketPairTest):
4140
4141 def __init__(self, methodName='runTest'):
4142 SocketPairTest.__init__(self, methodName=methodName)
4143
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004144 def _check_defaults(self, sock):
4145 self.assertIsInstance(sock, socket.socket)
4146 if hasattr(socket, 'AF_UNIX'):
4147 self.assertEqual(sock.family, socket.AF_UNIX)
4148 else:
4149 self.assertEqual(sock.family, socket.AF_INET)
4150 self.assertEqual(sock.type, socket.SOCK_STREAM)
4151 self.assertEqual(sock.proto, 0)
4152
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004153 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004154 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004155
4156 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004157 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004158
Dave Cole331708b2004-08-09 04:51:41 +00004159 def testRecv(self):
4160 msg = self.serv.recv(1024)
4161 self.assertEqual(msg, MSG)
4162
4163 def _testRecv(self):
4164 self.cli.send(MSG)
4165
4166 def testSend(self):
4167 self.serv.send(MSG)
4168
4169 def _testSend(self):
4170 msg = self.cli.recv(1024)
4171 self.assertEqual(msg, MSG)
4172
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004173
Guido van Rossum24e4af82002-06-12 19:18:08 +00004174class NonBlockingTCPTests(ThreadedTCPSocketTest):
4175
4176 def __init__(self, methodName='runTest'):
4177 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4178
4179 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004180 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004181 self.serv.setblocking(True)
4182 self.assertIsNone(self.serv.gettimeout())
Yury Selivanovf11b4602018-01-28 17:27:38 -05004183 self.assertTrue(self.serv.getblocking())
4184 if fcntl:
4185 self.assertTrue(_is_fd_in_blocking_mode(self.serv))
4186
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004187 self.serv.setblocking(False)
4188 self.assertEqual(self.serv.gettimeout(), 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004189 self.assertFalse(self.serv.getblocking())
4190 if fcntl:
4191 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4192
4193 self.serv.settimeout(None)
4194 self.assertTrue(self.serv.getblocking())
4195 if fcntl:
4196 self.assertTrue(_is_fd_in_blocking_mode(self.serv))
4197
4198 self.serv.settimeout(0)
4199 self.assertFalse(self.serv.getblocking())
4200 self.assertEqual(self.serv.gettimeout(), 0)
4201 if fcntl:
4202 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4203
4204 self.serv.settimeout(10)
4205 self.assertTrue(self.serv.getblocking())
4206 self.assertEqual(self.serv.gettimeout(), 10)
4207 if fcntl:
4208 # When a Python socket has a non-zero timeout, it's
4209 # switched internally to a non-blocking mode.
4210 # Later, sock.sendall(), sock.recv(), and other socket
4211 # operations use a `select()` call and handle EWOULDBLOCK/EGAIN
4212 # on all socket operations. That's how timeouts are
4213 # enforced.
4214 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4215
4216 self.serv.settimeout(0)
4217 self.assertFalse(self.serv.getblocking())
4218 if fcntl:
4219 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4220
Guido van Rossum24e4af82002-06-12 19:18:08 +00004221 start = time.time()
4222 try:
4223 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004224 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004225 pass
4226 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004227 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00004228
4229 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004230 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004231
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004232 @support.cpython_only
4233 def testSetBlocking_overflow(self):
4234 # Issue 15989
4235 import _testcapi
4236 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4237 self.skipTest('needs UINT_MAX < ULONG_MAX')
4238 self.serv.setblocking(False)
4239 self.assertEqual(self.serv.gettimeout(), 0.0)
4240 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4241 self.assertIsNone(self.serv.gettimeout())
4242
4243 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4244
Serhiy Storchaka43767632013-11-03 21:31:38 +02004245 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4246 'test needs socket.SOCK_NONBLOCK')
4247 @support.requires_linux_version(2, 6, 28)
4248 def testInitNonBlocking(self):
4249 # reinit server socket
4250 self.serv.close()
4251 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
4252 socket.SOCK_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004253 self.assertFalse(self.serv.getblocking())
4254 self.assertEqual(self.serv.gettimeout(), 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004255 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01004256 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02004257 # actual testing
4258 start = time.time()
4259 try:
4260 self.serv.accept()
4261 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00004262 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02004263 end = time.time()
4264 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
4265
4266 def _testInitNonBlocking(self):
4267 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004268
Antoine Pitrou600232b2011-01-05 21:03:42 +00004269 def testInheritFlags(self):
4270 # Issue #7995: when calling accept() on a listening socket with a
4271 # timeout, the resulting socket should not be non-blocking.
4272 self.serv.settimeout(10)
4273 try:
4274 conn, addr = self.serv.accept()
4275 message = conn.recv(len(MSG))
4276 finally:
4277 conn.close()
4278 self.serv.settimeout(None)
4279
4280 def _testInheritFlags(self):
4281 time.sleep(0.1)
4282 self.cli.connect((HOST, self.port))
4283 time.sleep(0.5)
4284 self.cli.send(MSG)
4285
Guido van Rossum24e4af82002-06-12 19:18:08 +00004286 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004287 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004288 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00004289 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004290 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004291 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004292 pass
4293 else:
4294 self.fail("Error trying to do non-blocking accept.")
4295 read, write, err = select.select([self.serv], [], [])
4296 if self.serv in read:
4297 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07004298 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00004299 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004300 else:
4301 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004302
Guido van Rossum24e4af82002-06-12 19:18:08 +00004303 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004304 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00004305 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004306
4307 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004308 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00004309 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004310 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004311
4312 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00004313 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00004314 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004315
4316 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004317 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004318 conn, addr = self.serv.accept()
4319 conn.setblocking(0)
4320 try:
4321 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02004322 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004323 pass
4324 else:
4325 self.fail("Error trying to do non-blocking recv.")
4326 read, write, err = select.select([conn], [], [])
4327 if conn in read:
4328 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004329 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00004330 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004331 else:
4332 self.fail("Error during select call to non-blocking socket.")
4333
4334 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004335 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004336 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004337 self.cli.send(MSG)
4338
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004339
Guido van Rossum24e4af82002-06-12 19:18:08 +00004340class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004341 """Unit tests for the object returned by socket.makefile()
4342
Antoine Pitrou834bd812010-10-13 16:17:14 +00004343 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004344 the client connection. You can read from this file to
4345 get output from the server.
4346
Antoine Pitrou834bd812010-10-13 16:17:14 +00004347 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004348 server connection. You can write to this file to send output
4349 to the client.
4350 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004351
Guido van Rossume9f66142002-08-07 15:46:19 +00004352 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004353 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004354 errors = 'strict'
4355 newline = None
4356
4357 read_mode = 'rb'
4358 read_msg = MSG
4359 write_mode = 'wb'
4360 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004361
Guido van Rossum24e4af82002-06-12 19:18:08 +00004362 def __init__(self, methodName='runTest'):
4363 SocketConnectedTest.__init__(self, methodName=methodName)
4364
4365 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004366 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4367 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004368 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004369 self.read_file = self.cli_conn.makefile(
4370 self.read_mode, self.bufsize,
4371 encoding = self.encoding,
4372 errors = self.errors,
4373 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004374
4375 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004376 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004377 self.read_file.close()
4378 self.assertTrue(self.read_file.closed)
4379 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004380 SocketConnectedTest.tearDown(self)
4381
4382 def clientSetUp(self):
4383 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004384 self.write_file = self.serv_conn.makefile(
4385 self.write_mode, self.bufsize,
4386 encoding = self.encoding,
4387 errors = self.errors,
4388 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004389
4390 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004391 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004392 self.write_file.close()
4393 self.assertTrue(self.write_file.closed)
4394 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004395 SocketConnectedTest.clientTearDown(self)
4396
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004397 def testReadAfterTimeout(self):
4398 # Issue #7322: A file object must disallow further reads
4399 # after a timeout has occurred.
4400 self.cli_conn.settimeout(1)
4401 self.read_file.read(3)
4402 # First read raises a timeout
4403 self.assertRaises(socket.timeout, self.read_file.read, 1)
4404 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004405 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004406 self.read_file.read(1)
4407 self.assertIn("cannot read from timed out object", str(ctx.exception))
4408
4409 def _testReadAfterTimeout(self):
4410 self.write_file.write(self.write_msg[0:3])
4411 self.write_file.flush()
4412 self.serv_finished.wait()
4413
Guido van Rossum24e4af82002-06-12 19:18:08 +00004414 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004415 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004416 first_seg = self.read_file.read(len(self.read_msg)-3)
4417 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004418 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004419 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004420
4421 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004422 self.write_file.write(self.write_msg)
4423 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004424
Guido van Rossum8c943832002-08-08 01:00:28 +00004425 def testFullRead(self):
4426 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004427 msg = self.read_file.read()
4428 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004429
4430 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004431 self.write_file.write(self.write_msg)
4432 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004433
Guido van Rossum24e4af82002-06-12 19:18:08 +00004434 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004435 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004436 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004437 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004438 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004439 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004440 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004441 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004442 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004443
4444 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004445 self.write_file.write(self.write_msg)
4446 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004447
4448 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004449 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004450 line = self.read_file.readline()
4451 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004452
4453 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004454 self.write_file.write(self.write_msg)
4455 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004456
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004457 def testCloseAfterMakefile(self):
4458 # The file returned by makefile should keep the socket open.
4459 self.cli_conn.close()
4460 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004461 msg = self.read_file.read()
4462 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004463
4464 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004465 self.write_file.write(self.write_msg)
4466 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004467
4468 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004469 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004470 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004471 if isinstance(self.read_msg, str):
4472 msg = msg.decode()
4473 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004474
4475 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004476 self.write_file.write(self.write_msg)
4477 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004478
Tim Peters116d83c2004-03-28 02:20:45 +00004479 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004480 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004481
4482 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004483 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004484
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004485 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004486 self.assertEqual(self.read_file.mode, self.read_mode)
4487 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004488
4489 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004490 self.assertEqual(self.write_file.mode, self.write_mode)
4491 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004492
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004493 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004494 self.read_file.close()
4495 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004496 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004497 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004498
4499 def _testRealClose(self):
4500 pass
4501
4502
Guido van Rossume9f66142002-08-07 15:46:19 +00004503class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4504
4505 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004506
Guido van Rossume9f66142002-08-07 15:46:19 +00004507 In this case (and in this case only), it should be possible to
4508 create a file object, read a line from it, create another file
4509 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004510 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004511 when reading multiple requests from the same socket."""
4512
4513 bufsize = 0 # Use unbuffered mode
4514
4515 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004516 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004517 line = self.read_file.readline() # first line
4518 self.assertEqual(line, b"A. " + self.write_msg) # first line
4519 self.read_file = self.cli_conn.makefile('rb', 0)
4520 line = self.read_file.readline() # second line
4521 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004522
4523 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004524 self.write_file.write(b"A. " + self.write_msg)
4525 self.write_file.write(b"B. " + self.write_msg)
4526 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004527
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004528 def testMakefileClose(self):
4529 # The file returned by makefile should keep the socket open...
4530 self.cli_conn.close()
4531 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004532 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004533 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004534 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004535 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004536
4537 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004538 self.write_file.write(self.write_msg)
4539 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004540
4541 def testMakefileCloseSocketDestroy(self):
4542 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004543 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004544 refcount_after = sys.getrefcount(self.cli_conn)
4545 self.assertEqual(refcount_before - 1, refcount_after)
4546
4547 def _testMakefileCloseSocketDestroy(self):
4548 pass
4549
Antoine Pitrou98b46702010-09-18 22:59:00 +00004550 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004551 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004552 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4553
4554 def testSmallReadNonBlocking(self):
4555 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004556 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4557 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004558 self.evt1.set()
4559 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004560 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004561 if first_seg is None:
4562 # Data not arrived (can happen under Windows), wait a bit
4563 time.sleep(0.5)
4564 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004565 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004566 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004567 self.assertEqual(n, 3)
4568 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004569 self.assertEqual(msg, self.read_msg)
4570 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4571 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004572
4573 def _testSmallReadNonBlocking(self):
4574 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004575 self.write_file.write(self.write_msg)
4576 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004577 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004578 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004579 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4580 self.serv_finished.wait(5.0)
4581
4582 def testWriteNonBlocking(self):
4583 self.cli_finished.wait(5.0)
4584 # The client thread can't skip directly - the SkipTest exception
4585 # would appear as a failure.
4586 if self.serv_skipped:
4587 self.skipTest(self.serv_skipped)
4588
4589 def _testWriteNonBlocking(self):
4590 self.serv_skipped = None
4591 self.serv_conn.setblocking(False)
4592 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004593 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004594 LIMIT = 10
4595 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004596 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004597 self.assertGreater(n, 0)
4598 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004599 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004600 if n is None:
4601 # Succeeded
4602 break
4603 self.assertGreater(n, 0)
4604 else:
4605 # Let us know that this test didn't manage to establish
4606 # the expected conditions. This is not a failure in itself but,
4607 # if it happens repeatedly, the test should be fixed.
4608 self.serv_skipped = "failed to saturate the socket buffer"
4609
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004610
Guido van Rossum8c943832002-08-08 01:00:28 +00004611class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4612
4613 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4614
4615
4616class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4617
4618 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004619
Thomas Woutersb2137042007-02-01 18:02:27 +00004620
Antoine Pitrou834bd812010-10-13 16:17:14 +00004621class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4622 """Tests for socket.makefile() in text mode (rather than binary)"""
4623
4624 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004625 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004626 write_mode = 'wb'
4627 write_msg = MSG
4628 newline = ''
4629
4630
4631class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4632 """Tests for socket.makefile() in text mode (rather than binary)"""
4633
4634 read_mode = 'rb'
4635 read_msg = MSG
4636 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004637 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004638 newline = ''
4639
4640
4641class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4642 """Tests for socket.makefile() in text mode (rather than binary)"""
4643
4644 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004645 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004646 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004647 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004648 newline = ''
4649
4650
Guido van Rossumd8faa362007-04-27 19:54:29 +00004651class NetworkConnectionTest(object):
4652 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004653
Guido van Rossumd8faa362007-04-27 19:54:29 +00004654 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004655 # We're inherited below by BasicTCPTest2, which also inherits
4656 # BasicTCPTest, which defines self.port referenced below.
4657 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004658 self.serv_conn = self.cli
4659
4660class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4661 """Tests that NetworkConnection does not break existing TCP functionality.
4662 """
4663
4664class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004665
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004666 class MockSocket(socket.socket):
4667 def connect(self, *args):
4668 raise socket.timeout('timed out')
4669
4670 @contextlib.contextmanager
4671 def mocked_socket_module(self):
4672 """Return a socket which times out on connect"""
4673 old_socket = socket.socket
4674 socket.socket = self.MockSocket
4675 try:
4676 yield
4677 finally:
4678 socket.socket = old_socket
4679
4680 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004681 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004682 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004683 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004684 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004685 cli.connect((HOST, port))
4686 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4687
4688 def test_create_connection(self):
4689 # Issue #9792: errors raised by create_connection() should have
4690 # a proper errno attribute.
4691 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004692 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004693 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004694
4695 # Issue #16257: create_connection() calls getaddrinfo() against
4696 # 'localhost'. This may result in an IPV6 addr being returned
4697 # as well as an IPV4 one:
4698 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4699 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4700 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4701 #
4702 # create_connection() enumerates through all the addresses returned
4703 # and if it doesn't successfully bind to any of them, it propagates
4704 # the last exception it encountered.
4705 #
4706 # On Solaris, ENETUNREACH is returned in this circumstance instead
4707 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4708 # expected errnos.
4709 expected_errnos = [ errno.ECONNREFUSED, ]
4710 if hasattr(errno, 'ENETUNREACH'):
4711 expected_errnos.append(errno.ENETUNREACH)
Victor Stinner280c22a2017-10-31 19:48:14 -07004712 if hasattr(errno, 'EADDRNOTAVAIL'):
4713 # bpo-31910: socket.create_connection() fails randomly
4714 # with EADDRNOTAVAIL on Travis CI
4715 expected_errnos.append(errno.EADDRNOTAVAIL)
Trent Nelson45bb6132012-10-17 06:15:15 -04004716
4717 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004718
4719 def test_create_connection_timeout(self):
4720 # Issue #9792: create_connection() should not recast timeout errors
4721 # as generic socket errors.
4722 with self.mocked_socket_module():
4723 with self.assertRaises(socket.timeout):
4724 socket.create_connection((HOST, 1234))
4725
Guido van Rossumd8faa362007-04-27 19:54:29 +00004726
4727class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4728
4729 def __init__(self, methodName='runTest'):
4730 SocketTCPTest.__init__(self, methodName=methodName)
4731 ThreadableTest.__init__(self)
4732
4733 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004734 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004735
4736 def clientTearDown(self):
4737 self.cli.close()
4738 self.cli = None
4739 ThreadableTest.clientTearDown(self)
4740
4741 def _justAccept(self):
4742 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004743 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004744
4745 testFamily = _justAccept
4746 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004747 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004748 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004749 self.assertEqual(self.cli.family, 2)
4750
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004751 testSourceAddress = _justAccept
4752 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004753 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4754 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004755 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004756 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004757 # The port number being used is sufficient to show that the bind()
4758 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004759
Guido van Rossumd8faa362007-04-27 19:54:29 +00004760 testTimeoutDefault = _justAccept
4761 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004762 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004763 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004764 socket.setdefaulttimeout(42)
4765 try:
4766 self.cli = socket.create_connection((HOST, self.port))
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)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004770 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004771
4772 testTimeoutNone = _justAccept
4773 def _testTimeoutNone(self):
4774 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004775 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004776 socket.setdefaulttimeout(30)
4777 try:
4778 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004779 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004780 finally:
4781 socket.setdefaulttimeout(None)
4782 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004783
4784 testTimeoutValueNamed = _justAccept
4785 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004786 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004787 self.assertEqual(self.cli.gettimeout(), 30)
4788
4789 testTimeoutValueNonamed = _justAccept
4790 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004791 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004792 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004793 self.assertEqual(self.cli.gettimeout(), 30)
4794
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004795
Guido van Rossumd8faa362007-04-27 19:54:29 +00004796class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4797
4798 def __init__(self, methodName='runTest'):
4799 SocketTCPTest.__init__(self, methodName=methodName)
4800 ThreadableTest.__init__(self)
4801
4802 def clientSetUp(self):
4803 pass
4804
4805 def clientTearDown(self):
4806 self.cli.close()
4807 self.cli = None
4808 ThreadableTest.clientTearDown(self)
4809
4810 def testInsideTimeout(self):
4811 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004812 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004813 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004814 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004815 testOutsideTimeout = testInsideTimeout
4816
4817 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004818 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004819 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004820 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004821
4822 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004823 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004824 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004825
4826
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004827class TCPTimeoutTest(SocketTCPTest):
4828
4829 def testTCPTimeout(self):
4830 def raise_timeout(*args, **kwargs):
4831 self.serv.settimeout(1.0)
4832 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004833 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004834 "Error generating a timeout exception (TCP)")
4835
4836 def testTimeoutZero(self):
4837 ok = False
4838 try:
4839 self.serv.settimeout(0.0)
4840 foo = self.serv.accept()
4841 except socket.timeout:
4842 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004843 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004844 ok = True
4845 except:
4846 self.fail("caught unexpected exception (TCP)")
4847 if not ok:
4848 self.fail("accept() returned success when we did not expect it")
4849
Serhiy Storchaka43767632013-11-03 21:31:38 +02004850 @unittest.skipUnless(hasattr(signal, 'alarm'),
4851 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004852 def testInterruptedTimeout(self):
4853 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06004854 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004855 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004856 self.serv.settimeout(5.0) # must be longer than alarm
4857 class Alarm(Exception):
4858 pass
4859 def alarm_handler(signal, frame):
4860 raise Alarm
4861 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4862 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004863 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004864 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004865 foo = self.serv.accept()
4866 except socket.timeout:
4867 self.fail("caught timeout instead of Alarm")
4868 except Alarm:
4869 pass
4870 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004871 self.fail("caught other exception instead of Alarm:"
4872 " %s(%s):\n%s" %
4873 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004874 else:
4875 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004876 finally:
4877 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004878 except Alarm:
4879 self.fail("got Alarm in wrong place")
4880 finally:
4881 # no alarm can be pending. Safe to restore old handler.
4882 signal.signal(signal.SIGALRM, old_alarm)
4883
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004884class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004885
4886 def testUDPTimeout(self):
4887 def raise_timeout(*args, **kwargs):
4888 self.serv.settimeout(1.0)
4889 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004890 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004891 "Error generating a timeout exception (UDP)")
4892
4893 def testTimeoutZero(self):
4894 ok = False
4895 try:
4896 self.serv.settimeout(0.0)
4897 foo = self.serv.recv(1024)
4898 except socket.timeout:
4899 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004900 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004901 ok = True
4902 except:
4903 self.fail("caught unexpected exception (UDP)")
4904 if not ok:
4905 self.fail("recv() returned success when we did not expect it")
4906
4907class TestExceptions(unittest.TestCase):
4908
4909 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004910 self.assertTrue(issubclass(OSError, Exception))
4911 self.assertTrue(issubclass(socket.herror, OSError))
4912 self.assertTrue(issubclass(socket.gaierror, OSError))
4913 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004914
Yury Selivanovfa22b292016-10-18 16:03:52 -04004915 def test_setblocking_invalidfd(self):
4916 # Regression test for issue #28471
4917
4918 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4919 sock = socket.socket(
4920 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4921 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004922 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004923
4924 with self.assertRaises(OSError):
4925 sock.setblocking(False)
4926
4927
Serhiy Storchaka43767632013-11-03 21:31:38 +02004928@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004929class TestLinuxAbstractNamespace(unittest.TestCase):
4930
4931 UNIX_PATH_MAX = 108
4932
4933 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004934 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004935 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4936 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004937 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004938 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4939 s2.connect(s1.getsockname())
4940 with s1.accept()[0] as s3:
4941 self.assertEqual(s1.getsockname(), address)
4942 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004943
4944 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004945 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004946 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4947 s.bind(address)
4948 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004949
4950 def testNameOverflow(self):
4951 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004952 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004953 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004954
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004955 def testStrName(self):
4956 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004957 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4958 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004959 s.bind("\x00python\x00test\x00")
4960 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004961 finally:
4962 s.close()
4963
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004964 def testBytearrayName(self):
4965 # Check that an abstract name can be passed as a bytearray.
4966 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4967 s.bind(bytearray(b"\x00python\x00test\x00"))
4968 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4969
Serhiy Storchaka43767632013-11-03 21:31:38 +02004970@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004971class TestUnixDomain(unittest.TestCase):
4972
4973 def setUp(self):
4974 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4975
4976 def tearDown(self):
4977 self.sock.close()
4978
4979 def encoded(self, path):
4980 # Return the given path encoded in the file system encoding,
4981 # or skip the test if this is not possible.
4982 try:
4983 return os.fsencode(path)
4984 except UnicodeEncodeError:
4985 self.skipTest(
4986 "Pathname {0!a} cannot be represented in file "
4987 "system encoding {1!r}".format(
4988 path, sys.getfilesystemencoding()))
4989
Antoine Pitrou16374872011-12-16 15:04:12 +01004990 def bind(self, sock, path):
4991 # Bind the socket
4992 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004993 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004994 except OSError as e:
4995 if str(e) == "AF_UNIX path too long":
4996 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004997 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004998 .format(path))
4999 else:
5000 raise
5001
Antoine Pitrou495b5022017-05-02 17:20:00 +02005002 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005003 # Issue #30205 (note getsockname() can return None on OS X)
5004 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005005
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005006 def testStrAddr(self):
5007 # Test binding to and retrieving a normal string pathname.
5008 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005009 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005010 self.addCleanup(support.unlink, path)
5011 self.assertEqual(self.sock.getsockname(), path)
5012
5013 def testBytesAddr(self):
5014 # Test binding to a bytes pathname.
5015 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005016 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005017 self.addCleanup(support.unlink, path)
5018 self.assertEqual(self.sock.getsockname(), path)
5019
5020 def testSurrogateescapeBind(self):
5021 # Test binding to a valid non-ASCII pathname, with the
5022 # non-ASCII bytes supplied using surrogateescape encoding.
5023 path = os.path.abspath(support.TESTFN_UNICODE)
5024 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005025 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005026 self.addCleanup(support.unlink, path)
5027 self.assertEqual(self.sock.getsockname(), path)
5028
5029 def testUnencodableAddr(self):
5030 # Test binding to a pathname that cannot be encoded in the
5031 # file system encoding.
5032 if support.TESTFN_UNENCODABLE is None:
5033 self.skipTest("No unencodable filename available")
5034 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005035 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005036 self.addCleanup(support.unlink, path)
5037 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005038
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005039
Thomas Wouters477c8d52006-05-27 19:21:47 +00005040class BufferIOTest(SocketConnectedTest):
5041 """
5042 Test the buffer versions of socket.recv() and socket.send().
5043 """
5044 def __init__(self, methodName='runTest'):
5045 SocketConnectedTest.__init__(self, methodName=methodName)
5046
Antoine Pitrou25480782010-03-17 22:50:28 +00005047 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005048 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005049 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005050 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005051 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005052 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005053 self.assertEqual(msg, MSG)
5054
Antoine Pitrou25480782010-03-17 22:50:28 +00005055 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005056 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005057 self.serv_conn.send(buf)
5058
Antoine Pitrou25480782010-03-17 22:50:28 +00005059 def testRecvIntoBytearray(self):
5060 buf = bytearray(1024)
5061 nbytes = self.cli_conn.recv_into(buf)
5062 self.assertEqual(nbytes, len(MSG))
5063 msg = buf[:len(MSG)]
5064 self.assertEqual(msg, MSG)
5065
5066 _testRecvIntoBytearray = _testRecvIntoArray
5067
5068 def testRecvIntoMemoryview(self):
5069 buf = bytearray(1024)
5070 nbytes = self.cli_conn.recv_into(memoryview(buf))
5071 self.assertEqual(nbytes, len(MSG))
5072 msg = buf[:len(MSG)]
5073 self.assertEqual(msg, MSG)
5074
5075 _testRecvIntoMemoryview = _testRecvIntoArray
5076
5077 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005078 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005079 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005080 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005081 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005082 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005083 self.assertEqual(msg, MSG)
5084
Antoine Pitrou25480782010-03-17 22:50:28 +00005085 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005086 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005087 self.serv_conn.send(buf)
5088
Antoine Pitrou25480782010-03-17 22:50:28 +00005089 def testRecvFromIntoBytearray(self):
5090 buf = bytearray(1024)
5091 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5092 self.assertEqual(nbytes, len(MSG))
5093 msg = buf[:len(MSG)]
5094 self.assertEqual(msg, MSG)
5095
5096 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5097
5098 def testRecvFromIntoMemoryview(self):
5099 buf = bytearray(1024)
5100 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5101 self.assertEqual(nbytes, len(MSG))
5102 msg = buf[:len(MSG)]
5103 self.assertEqual(msg, MSG)
5104
5105 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5106
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005107 def testRecvFromIntoSmallBuffer(self):
5108 # See issue #20246.
5109 buf = bytearray(8)
5110 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5111
5112 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005113 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005114
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005115 def testRecvFromIntoEmptyBuffer(self):
5116 buf = bytearray()
5117 self.cli_conn.recvfrom_into(buf)
5118 self.cli_conn.recvfrom_into(buf, 0)
5119
5120 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5121
Christian Heimes043d6f62008-01-07 17:19:16 +00005122
5123TIPC_STYPE = 2000
5124TIPC_LOWER = 200
5125TIPC_UPPER = 210
5126
5127def isTipcAvailable():
5128 """Check if the TIPC module is loaded
5129
5130 The TIPC module is not loaded automatically on Ubuntu and probably
5131 other Linux distros.
5132 """
5133 if not hasattr(socket, "AF_TIPC"):
5134 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005135 try:
5136 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005137 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005138 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005139 # have not the permission to read it.
5140 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005141 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005142 for line in f:
5143 if line.startswith("tipc "):
5144 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005145 return False
5146
Serhiy Storchaka43767632013-11-03 21:31:38 +02005147@unittest.skipUnless(isTipcAvailable(),
5148 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005149class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005150 def testRDM(self):
5151 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5152 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005153 self.addCleanup(srv.close)
5154 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005155
5156 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5157 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5158 TIPC_LOWER, TIPC_UPPER)
5159 srv.bind(srvaddr)
5160
5161 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5162 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5163 cli.sendto(MSG, sendaddr)
5164
5165 msg, recvaddr = srv.recvfrom(1024)
5166
5167 self.assertEqual(cli.getsockname(), recvaddr)
5168 self.assertEqual(msg, MSG)
5169
5170
Serhiy Storchaka43767632013-11-03 21:31:38 +02005171@unittest.skipUnless(isTipcAvailable(),
5172 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005173class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005174 def __init__(self, methodName = 'runTest'):
5175 unittest.TestCase.__init__(self, methodName = methodName)
5176 ThreadableTest.__init__(self)
5177
5178 def setUp(self):
5179 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005180 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005181 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5182 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5183 TIPC_LOWER, TIPC_UPPER)
5184 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005185 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005186 self.serverExplicitReady()
5187 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005188 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005189
5190 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005191 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005192 # accept() call; sleep a little while to avoid it, otherwise
5193 # we could get an exception
5194 time.sleep(0.1)
5195 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005196 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005197 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5198 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5199 self.cli.connect(addr)
5200 self.cliaddr = self.cli.getsockname()
5201
5202 def testStream(self):
5203 msg = self.conn.recv(1024)
5204 self.assertEqual(msg, MSG)
5205 self.assertEqual(self.cliaddr, self.connaddr)
5206
5207 def _testStream(self):
5208 self.cli.send(MSG)
5209 self.cli.close()
5210
5211
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005212class ContextManagersTest(ThreadedTCPSocketTest):
5213
5214 def _testSocketClass(self):
5215 # base test
5216 with socket.socket() as sock:
5217 self.assertFalse(sock._closed)
5218 self.assertTrue(sock._closed)
5219 # close inside with block
5220 with socket.socket() as sock:
5221 sock.close()
5222 self.assertTrue(sock._closed)
5223 # exception inside with block
5224 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005225 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005226 self.assertTrue(sock._closed)
5227
5228 def testCreateConnectionBase(self):
5229 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005230 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005231 data = conn.recv(1024)
5232 conn.sendall(data)
5233
5234 def _testCreateConnectionBase(self):
5235 address = self.serv.getsockname()
5236 with socket.create_connection(address) as sock:
5237 self.assertFalse(sock._closed)
5238 sock.sendall(b'foo')
5239 self.assertEqual(sock.recv(1024), b'foo')
5240 self.assertTrue(sock._closed)
5241
5242 def testCreateConnectionClose(self):
5243 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005244 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005245 data = conn.recv(1024)
5246 conn.sendall(data)
5247
5248 def _testCreateConnectionClose(self):
5249 address = self.serv.getsockname()
5250 with socket.create_connection(address) as sock:
5251 sock.close()
5252 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005253 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005254
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005255
Victor Stinnerdaf45552013-08-28 00:53:59 +02005256class InheritanceTest(unittest.TestCase):
5257 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5258 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005259 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005260 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005261 with socket.socket(socket.AF_INET,
5262 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005263 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005264 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005265
5266 def test_default_inheritable(self):
5267 sock = socket.socket()
5268 with sock:
5269 self.assertEqual(sock.get_inheritable(), False)
5270
5271 def test_dup(self):
5272 sock = socket.socket()
5273 with sock:
5274 newsock = sock.dup()
5275 sock.close()
5276 with newsock:
5277 self.assertEqual(newsock.get_inheritable(), False)
5278
5279 def test_set_inheritable(self):
5280 sock = socket.socket()
5281 with sock:
5282 sock.set_inheritable(True)
5283 self.assertEqual(sock.get_inheritable(), True)
5284
5285 sock.set_inheritable(False)
5286 self.assertEqual(sock.get_inheritable(), False)
5287
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005288 @unittest.skipIf(fcntl is None, "need fcntl")
5289 def test_get_inheritable_cloexec(self):
5290 sock = socket.socket()
5291 with sock:
5292 fd = sock.fileno()
5293 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005294
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005295 # clear FD_CLOEXEC flag
5296 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5297 flags &= ~fcntl.FD_CLOEXEC
5298 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005299
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005300 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005301
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005302 @unittest.skipIf(fcntl is None, "need fcntl")
5303 def test_set_inheritable_cloexec(self):
5304 sock = socket.socket()
5305 with sock:
5306 fd = sock.fileno()
5307 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5308 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005309
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005310 sock.set_inheritable(True)
5311 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5312 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005313
5314
Victor Stinnerdaf45552013-08-28 00:53:59 +02005315 def test_socketpair(self):
5316 s1, s2 = socket.socketpair()
5317 self.addCleanup(s1.close)
5318 self.addCleanup(s2.close)
5319 self.assertEqual(s1.get_inheritable(), False)
5320 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005321
5322
5323@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5324 "SOCK_NONBLOCK not defined")
5325class NonblockConstantTest(unittest.TestCase):
5326 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5327 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005328 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005329 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005330 self.assertTrue(
5331 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005332 if timeout == 0:
5333 # timeout == 0: means that getblocking() must be False.
5334 self.assertFalse(s.getblocking())
5335 else:
5336 # If timeout > 0, the socket will be in a "blocking" mode
5337 # from the standpoint of the Python API. For Python socket
5338 # object, "blocking" means that operations like 'sock.recv()'
5339 # will block. Internally, file descriptors for
5340 # "blocking" Python sockets *with timeouts* are in a
5341 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5342 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5343 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005344 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005345 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005346 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005347 self.assertFalse(
5348 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005349 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005350
Charles-François Natali239bb962011-06-03 12:55:15 +02005351 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005352 def test_SOCK_NONBLOCK(self):
5353 # a lot of it seems silly and redundant, but I wanted to test that
5354 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005355 with socket.socket(socket.AF_INET,
5356 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5357 self.checkNonblock(s)
5358 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005359 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005360 s.setblocking(0)
5361 self.checkNonblock(s)
5362 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005363 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005364 s.settimeout(2.0)
5365 self.checkNonblock(s, timeout=2.0)
5366 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005367 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005368 # defaulttimeout
5369 t = socket.getdefaulttimeout()
5370 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005371 with socket.socket() as s:
5372 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005373 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005374 with socket.socket() as s:
5375 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005376 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005377 with socket.socket() as s:
5378 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005379 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005380 with socket.socket() as s:
5381 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005382 socket.setdefaulttimeout(t)
5383
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005384
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005385@unittest.skipUnless(os.name == "nt", "Windows specific")
5386@unittest.skipUnless(multiprocessing, "need multiprocessing")
5387class TestSocketSharing(SocketTCPTest):
5388 # This must be classmethod and not staticmethod or multiprocessing
5389 # won't be able to bootstrap it.
5390 @classmethod
5391 def remoteProcessServer(cls, q):
5392 # Recreate socket from shared data
5393 sdata = q.get()
5394 message = q.get()
5395
5396 s = socket.fromshare(sdata)
5397 s2, c = s.accept()
5398
5399 # Send the message
5400 s2.sendall(message)
5401 s2.close()
5402 s.close()
5403
5404 def testShare(self):
5405 # Transfer the listening server socket to another process
5406 # and service it from there.
5407
5408 # Create process:
5409 q = multiprocessing.Queue()
5410 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5411 p.start()
5412
5413 # Get the shared socket data
5414 data = self.serv.share(p.pid)
5415
5416 # Pass the shared socket to the other process
5417 addr = self.serv.getsockname()
5418 self.serv.close()
5419 q.put(data)
5420
5421 # The data that the server will send us
5422 message = b"slapmahfro"
5423 q.put(message)
5424
5425 # Connect
5426 s = socket.create_connection(addr)
5427 # listen for the data
5428 m = []
5429 while True:
5430 data = s.recv(100)
5431 if not data:
5432 break
5433 m.append(data)
5434 s.close()
5435 received = b"".join(m)
5436 self.assertEqual(received, message)
5437 p.join()
5438
5439 def testShareLength(self):
5440 data = self.serv.share(os.getpid())
5441 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5442 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5443
5444 def compareSockets(self, org, other):
5445 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005446 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005447 self.assertEqual(org.gettimeout(), None)
5448 self.assertEqual(org.gettimeout(), other.gettimeout())
5449
5450 self.assertEqual(org.family, other.family)
5451 self.assertEqual(org.type, other.type)
5452 # If the user specified "0" for proto, then
5453 # internally windows will have picked the correct value.
5454 # Python introspection on the socket however will still return
5455 # 0. For the shared socket, the python value is recreated
5456 # from the actual value, so it may not compare correctly.
5457 if org.proto != 0:
5458 self.assertEqual(org.proto, other.proto)
5459
5460 def testShareLocal(self):
5461 data = self.serv.share(os.getpid())
5462 s = socket.fromshare(data)
5463 try:
5464 self.compareSockets(self.serv, s)
5465 finally:
5466 s.close()
5467
5468 def testTypes(self):
5469 families = [socket.AF_INET, socket.AF_INET6]
5470 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5471 for f in families:
5472 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005473 try:
5474 source = socket.socket(f, t)
5475 except OSError:
5476 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005477 try:
5478 data = source.share(os.getpid())
5479 shared = socket.fromshare(data)
5480 try:
5481 self.compareSockets(source, shared)
5482 finally:
5483 shared.close()
5484 finally:
5485 source.close()
5486
5487
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005488class SendfileUsingSendTest(ThreadedTCPSocketTest):
5489 """
5490 Test the send() implementation of socket.sendfile().
5491 """
5492
Victor Stinner8c663fd2017-11-08 14:44:44 -08005493 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005494 BUFSIZE = 8192
5495 FILEDATA = b""
5496 TIMEOUT = 2
5497
5498 @classmethod
5499 def setUpClass(cls):
5500 def chunks(total, step):
5501 assert total >= step
5502 while total > step:
5503 yield step
5504 total -= step
5505 if total:
5506 yield total
5507
5508 chunk = b"".join([random.choice(string.ascii_letters).encode()
5509 for i in range(cls.BUFSIZE)])
5510 with open(support.TESTFN, 'wb') as f:
5511 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5512 f.write(chunk)
5513 with open(support.TESTFN, 'rb') as f:
5514 cls.FILEDATA = f.read()
5515 assert len(cls.FILEDATA) == cls.FILESIZE
5516
5517 @classmethod
5518 def tearDownClass(cls):
5519 support.unlink(support.TESTFN)
5520
5521 def accept_conn(self):
5522 self.serv.settimeout(self.TIMEOUT)
5523 conn, addr = self.serv.accept()
5524 conn.settimeout(self.TIMEOUT)
5525 self.addCleanup(conn.close)
5526 return conn
5527
5528 def recv_data(self, conn):
5529 received = []
5530 while True:
5531 chunk = conn.recv(self.BUFSIZE)
5532 if not chunk:
5533 break
5534 received.append(chunk)
5535 return b''.join(received)
5536
5537 def meth_from_sock(self, sock):
5538 # Depending on the mixin class being run return either send()
5539 # or sendfile() method implementation.
5540 return getattr(sock, "_sendfile_use_send")
5541
5542 # regular file
5543
5544 def _testRegularFile(self):
5545 address = self.serv.getsockname()
5546 file = open(support.TESTFN, 'rb')
5547 with socket.create_connection(address) as sock, file as file:
5548 meth = self.meth_from_sock(sock)
5549 sent = meth(file)
5550 self.assertEqual(sent, self.FILESIZE)
5551 self.assertEqual(file.tell(), self.FILESIZE)
5552
5553 def testRegularFile(self):
5554 conn = self.accept_conn()
5555 data = self.recv_data(conn)
5556 self.assertEqual(len(data), self.FILESIZE)
5557 self.assertEqual(data, self.FILEDATA)
5558
5559 # non regular file
5560
5561 def _testNonRegularFile(self):
5562 address = self.serv.getsockname()
5563 file = io.BytesIO(self.FILEDATA)
5564 with socket.create_connection(address) as sock, file as file:
5565 sent = sock.sendfile(file)
5566 self.assertEqual(sent, self.FILESIZE)
5567 self.assertEqual(file.tell(), self.FILESIZE)
5568 self.assertRaises(socket._GiveupOnSendfile,
5569 sock._sendfile_use_sendfile, file)
5570
5571 def testNonRegularFile(self):
5572 conn = self.accept_conn()
5573 data = self.recv_data(conn)
5574 self.assertEqual(len(data), self.FILESIZE)
5575 self.assertEqual(data, self.FILEDATA)
5576
5577 # empty file
5578
5579 def _testEmptyFileSend(self):
5580 address = self.serv.getsockname()
5581 filename = support.TESTFN + "2"
5582 with open(filename, 'wb'):
5583 self.addCleanup(support.unlink, filename)
5584 file = open(filename, 'rb')
5585 with socket.create_connection(address) as sock, file as file:
5586 meth = self.meth_from_sock(sock)
5587 sent = meth(file)
5588 self.assertEqual(sent, 0)
5589 self.assertEqual(file.tell(), 0)
5590
5591 def testEmptyFileSend(self):
5592 conn = self.accept_conn()
5593 data = self.recv_data(conn)
5594 self.assertEqual(data, b"")
5595
5596 # offset
5597
5598 def _testOffset(self):
5599 address = self.serv.getsockname()
5600 file = open(support.TESTFN, 'rb')
5601 with socket.create_connection(address) as sock, file as file:
5602 meth = self.meth_from_sock(sock)
5603 sent = meth(file, offset=5000)
5604 self.assertEqual(sent, self.FILESIZE - 5000)
5605 self.assertEqual(file.tell(), self.FILESIZE)
5606
5607 def testOffset(self):
5608 conn = self.accept_conn()
5609 data = self.recv_data(conn)
5610 self.assertEqual(len(data), self.FILESIZE - 5000)
5611 self.assertEqual(data, self.FILEDATA[5000:])
5612
5613 # count
5614
5615 def _testCount(self):
5616 address = self.serv.getsockname()
5617 file = open(support.TESTFN, 'rb')
5618 with socket.create_connection(address, timeout=2) as sock, file as file:
5619 count = 5000007
5620 meth = self.meth_from_sock(sock)
5621 sent = meth(file, count=count)
5622 self.assertEqual(sent, count)
5623 self.assertEqual(file.tell(), count)
5624
5625 def testCount(self):
5626 count = 5000007
5627 conn = self.accept_conn()
5628 data = self.recv_data(conn)
5629 self.assertEqual(len(data), count)
5630 self.assertEqual(data, self.FILEDATA[:count])
5631
5632 # count small
5633
5634 def _testCountSmall(self):
5635 address = self.serv.getsockname()
5636 file = open(support.TESTFN, 'rb')
5637 with socket.create_connection(address, timeout=2) as sock, file as file:
5638 count = 1
5639 meth = self.meth_from_sock(sock)
5640 sent = meth(file, count=count)
5641 self.assertEqual(sent, count)
5642 self.assertEqual(file.tell(), count)
5643
5644 def testCountSmall(self):
5645 count = 1
5646 conn = self.accept_conn()
5647 data = self.recv_data(conn)
5648 self.assertEqual(len(data), count)
5649 self.assertEqual(data, self.FILEDATA[:count])
5650
5651 # count + offset
5652
5653 def _testCountWithOffset(self):
5654 address = self.serv.getsockname()
5655 file = open(support.TESTFN, 'rb')
5656 with socket.create_connection(address, timeout=2) as sock, file as file:
5657 count = 100007
5658 meth = self.meth_from_sock(sock)
5659 sent = meth(file, offset=2007, count=count)
5660 self.assertEqual(sent, count)
5661 self.assertEqual(file.tell(), count + 2007)
5662
5663 def testCountWithOffset(self):
5664 count = 100007
5665 conn = self.accept_conn()
5666 data = self.recv_data(conn)
5667 self.assertEqual(len(data), count)
5668 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5669
5670 # non blocking sockets are not supposed to work
5671
5672 def _testNonBlocking(self):
5673 address = self.serv.getsockname()
5674 file = open(support.TESTFN, 'rb')
5675 with socket.create_connection(address) as sock, file as file:
5676 sock.setblocking(False)
5677 meth = self.meth_from_sock(sock)
5678 self.assertRaises(ValueError, meth, file)
5679 self.assertRaises(ValueError, sock.sendfile, file)
5680
5681 def testNonBlocking(self):
5682 conn = self.accept_conn()
5683 if conn.recv(8192):
5684 self.fail('was not supposed to receive any data')
5685
5686 # timeout (non-triggered)
5687
5688 def _testWithTimeout(self):
5689 address = self.serv.getsockname()
5690 file = open(support.TESTFN, 'rb')
5691 with socket.create_connection(address, timeout=2) as sock, file as file:
5692 meth = self.meth_from_sock(sock)
5693 sent = meth(file)
5694 self.assertEqual(sent, self.FILESIZE)
5695
5696 def testWithTimeout(self):
5697 conn = self.accept_conn()
5698 data = self.recv_data(conn)
5699 self.assertEqual(len(data), self.FILESIZE)
5700 self.assertEqual(data, self.FILEDATA)
5701
5702 # timeout (triggered)
5703
5704 def _testWithTimeoutTriggeredSend(self):
5705 address = self.serv.getsockname()
5706 file = open(support.TESTFN, 'rb')
5707 with socket.create_connection(address, timeout=0.01) as sock, \
5708 file as file:
5709 meth = self.meth_from_sock(sock)
5710 self.assertRaises(socket.timeout, meth, file)
5711
5712 def testWithTimeoutTriggeredSend(self):
5713 conn = self.accept_conn()
5714 conn.recv(88192)
5715
5716 # errors
5717
5718 def _test_errors(self):
5719 pass
5720
5721 def test_errors(self):
5722 with open(support.TESTFN, 'rb') as file:
5723 with socket.socket(type=socket.SOCK_DGRAM) as s:
5724 meth = self.meth_from_sock(s)
5725 self.assertRaisesRegex(
5726 ValueError, "SOCK_STREAM", meth, file)
5727 with open(support.TESTFN, 'rt') as file:
5728 with socket.socket() as s:
5729 meth = self.meth_from_sock(s)
5730 self.assertRaisesRegex(
5731 ValueError, "binary mode", meth, file)
5732 with open(support.TESTFN, 'rb') as file:
5733 with socket.socket() as s:
5734 meth = self.meth_from_sock(s)
5735 self.assertRaisesRegex(TypeError, "positive integer",
5736 meth, file, count='2')
5737 self.assertRaisesRegex(TypeError, "positive integer",
5738 meth, file, count=0.1)
5739 self.assertRaisesRegex(ValueError, "positive integer",
5740 meth, file, count=0)
5741 self.assertRaisesRegex(ValueError, "positive integer",
5742 meth, file, count=-1)
5743
5744
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005745@unittest.skipUnless(hasattr(os, "sendfile"),
5746 'os.sendfile() required for this test.')
5747class SendfileUsingSendfileTest(SendfileUsingSendTest):
5748 """
5749 Test the sendfile() implementation of socket.sendfile().
5750 """
5751 def meth_from_sock(self, sock):
5752 return getattr(sock, "_sendfile_use_sendfile")
5753
Christian Heimes48371412016-09-06 00:37:46 +02005754
5755@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005756class LinuxKernelCryptoAPI(unittest.TestCase):
5757 # tests for AF_ALG
5758 def create_alg(self, typ, name):
5759 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005760 try:
5761 sock.bind((typ, name))
5762 except FileNotFoundError as e:
5763 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005764 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005765 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005766 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005767 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005768
Victor Stinner86afc1f2017-11-30 13:58:43 +01005769 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
5770 # at least on ppc64le architecture
5771 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02005772 def test_sha256(self):
5773 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5774 "177a9cb410ff61f20015ad")
5775 with self.create_alg('hash', 'sha256') as algo:
5776 op, _ = algo.accept()
5777 with op:
5778 op.sendall(b"abc")
5779 self.assertEqual(op.recv(512), expected)
5780
5781 op, _ = algo.accept()
5782 with op:
5783 op.send(b'a', socket.MSG_MORE)
5784 op.send(b'b', socket.MSG_MORE)
5785 op.send(b'c', socket.MSG_MORE)
5786 op.send(b'')
5787 self.assertEqual(op.recv(512), expected)
5788
5789 def test_hmac_sha1(self):
5790 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5791 with self.create_alg('hash', 'hmac(sha1)') as algo:
5792 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5793 op, _ = algo.accept()
5794 with op:
5795 op.sendall(b"what do ya want for nothing?")
5796 self.assertEqual(op.recv(512), expected)
5797
Christian Heimese084f842016-09-11 20:11:30 +02005798 # Although it should work with 3.19 and newer the test blocks on
5799 # Ubuntu 15.10 with Kernel 4.2.0-19.
5800 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005801 def test_aes_cbc(self):
5802 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5803 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5804 msg = b"Single block msg"
5805 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5806 msglen = len(msg)
5807 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5808 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5809 op, _ = algo.accept()
5810 with op:
5811 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5812 flags=socket.MSG_MORE)
5813 op.sendall(msg)
5814 self.assertEqual(op.recv(msglen), ciphertext)
5815
5816 op, _ = algo.accept()
5817 with op:
5818 op.sendmsg_afalg([ciphertext],
5819 op=socket.ALG_OP_DECRYPT, iv=iv)
5820 self.assertEqual(op.recv(msglen), msg)
5821
5822 # long message
5823 multiplier = 1024
5824 longmsg = [msg] * multiplier
5825 op, _ = algo.accept()
5826 with op:
5827 op.sendmsg_afalg(longmsg,
5828 op=socket.ALG_OP_ENCRYPT, iv=iv)
5829 enc = op.recv(msglen * multiplier)
5830 self.assertEqual(len(enc), msglen * multiplier)
Miss Islington (bot)958a25e2018-07-09 08:47:14 -07005831 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02005832
5833 op, _ = algo.accept()
5834 with op:
5835 op.sendmsg_afalg([enc],
5836 op=socket.ALG_OP_DECRYPT, iv=iv)
5837 dec = op.recv(msglen * multiplier)
5838 self.assertEqual(len(dec), msglen * multiplier)
5839 self.assertEqual(dec, msg * multiplier)
5840
matejcik9764c152017-02-16 14:41:31 +01005841 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005842 def test_aead_aes_gcm(self):
5843 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5844 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5845 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5846 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5847 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5848 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5849
5850 taglen = len(expected_tag)
5851 assoclen = len(assoc)
5852
5853 with self.create_alg('aead', 'gcm(aes)') as algo:
5854 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5855 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5856 None, taglen)
5857
5858 # send assoc, plain and tag buffer in separate steps
5859 op, _ = algo.accept()
5860 with op:
5861 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5862 assoclen=assoclen, flags=socket.MSG_MORE)
5863 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005864 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005865 res = op.recv(assoclen + len(plain) + taglen)
5866 self.assertEqual(expected_ct, res[assoclen:-taglen])
5867 self.assertEqual(expected_tag, res[-taglen:])
5868
5869 # now with msg
5870 op, _ = algo.accept()
5871 with op:
matejcik9764c152017-02-16 14:41:31 +01005872 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005873 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5874 assoclen=assoclen)
5875 res = op.recv(assoclen + len(plain) + taglen)
5876 self.assertEqual(expected_ct, res[assoclen:-taglen])
5877 self.assertEqual(expected_tag, res[-taglen:])
5878
5879 # create anc data manually
5880 pack_uint32 = struct.Struct('I').pack
5881 op, _ = algo.accept()
5882 with op:
matejcik9764c152017-02-16 14:41:31 +01005883 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005884 op.sendmsg(
5885 [msg],
5886 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5887 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5888 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5889 )
5890 )
matejcik9764c152017-02-16 14:41:31 +01005891 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005892 self.assertEqual(expected_ct, res[assoclen:-taglen])
5893 self.assertEqual(expected_tag, res[-taglen:])
5894
5895 # decrypt and verify
5896 op, _ = algo.accept()
5897 with op:
5898 msg = assoc + expected_ct + expected_tag
5899 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5900 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005901 res = op.recv(len(msg) - taglen)
5902 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005903
Christian Heimese084f842016-09-11 20:11:30 +02005904 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005905 def test_drbg_pr_sha256(self):
5906 # deterministic random bit generator, prediction resistance, sha256
5907 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5908 extra_seed = os.urandom(32)
5909 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5910 op, _ = algo.accept()
5911 with op:
5912 rn = op.recv(32)
5913 self.assertEqual(len(rn), 32)
5914
5915 def test_sendmsg_afalg_args(self):
5916 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005917 with sock:
5918 with self.assertRaises(TypeError):
5919 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005920
Christian Heimes02b30352016-09-11 19:49:56 +02005921 with self.assertRaises(TypeError):
5922 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005923
Christian Heimes02b30352016-09-11 19:49:56 +02005924 with self.assertRaises(TypeError):
5925 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005926
Christian Heimes02b30352016-09-11 19:49:56 +02005927 with self.assertRaises(TypeError):
5928 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005929
Christian Heimes02b30352016-09-11 19:49:56 +02005930 with self.assertRaises(TypeError):
5931 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5932
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08005933@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
5934class TestMSWindowsTCPFlags(unittest.TestCase):
5935 knownTCPFlags = {
Miss Islington (bot)32955292018-04-20 14:00:41 -07005936 # available since long time ago
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08005937 'TCP_MAXSEG',
5938 'TCP_NODELAY',
5939 # available starting with Windows 10 1607
5940 'TCP_FASTOPEN',
5941 # available starting with Windows 10 1703
5942 'TCP_KEEPCNT',
5943 # available starting with Windows 10 1709
5944 'TCP_KEEPIDLE',
5945 'TCP_KEEPINTVL'
5946 }
5947
5948 def test_new_tcp_flags(self):
5949 provided = [s for s in dir(socket) if s.startswith('TCP')]
5950 unknown = [s for s in provided if s not in self.knownTCPFlags]
5951
5952 self.assertEqual([], unknown,
5953 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005954
Guido van Rossumb995eb72002-07-31 16:08:40 +00005955def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005956 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005957 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005958
5959 tests.extend([
5960 NonBlockingTCPTests,
5961 FileObjectClassTestCase,
5962 UnbufferedFileObjectClassTestCase,
5963 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005964 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005965 UnicodeReadFileObjectClassTestCase,
5966 UnicodeWriteFileObjectClassTestCase,
5967 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005968 NetworkConnectionNoServer,
5969 NetworkConnectionAttributesTest,
5970 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005971 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005972 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005973 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005974 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005975 tests.append(BasicSocketPairTest)
5976 tests.append(TestUnixDomain)
5977 tests.append(TestLinuxAbstractNamespace)
5978 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005979 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005980 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005981 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005982 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04005983 BasicVSOCKTest,
5984 ThreadedVSOCKSocketStreamTest,
5985 ])
5986 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005987 CmsgMacroTests,
5988 SendmsgUDPTest,
5989 RecvmsgUDPTest,
5990 RecvmsgIntoUDPTest,
5991 SendmsgUDP6Test,
5992 RecvmsgUDP6Test,
5993 RecvmsgRFC3542AncillaryUDP6Test,
5994 RecvmsgIntoRFC3542AncillaryUDP6Test,
5995 RecvmsgIntoUDP6Test,
5996 SendmsgTCPTest,
5997 RecvmsgTCPTest,
5998 RecvmsgIntoTCPTest,
5999 SendmsgSCTPStreamTest,
6000 RecvmsgSCTPStreamTest,
6001 RecvmsgIntoSCTPStreamTest,
6002 SendmsgUnixStreamTest,
6003 RecvmsgUnixStreamTest,
6004 RecvmsgIntoUnixStreamTest,
6005 RecvmsgSCMRightsStreamTest,
6006 RecvmsgIntoSCMRightsStreamTest,
6007 # These are slow when setitimer() is not available
6008 InterruptedRecvTimeoutTest,
6009 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006010 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006011 SendfileUsingSendTest,
6012 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006013 ])
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08006014 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006015
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006016 thread_info = support.threading_setup()
6017 support.run_unittest(*tests)
6018 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006019
6020if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006021 test_main()