blob: db2160eaf58317419edc239302b3896c456d335b [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
Miss Islington (bot)365f21c2018-11-30 03:48:17 -080038MAIN_TIMEOUT = 60.0
Barry Warsawcf3d4b51997-01-03 20:03:32 +000039
caaveryeffc12f2017-09-06 18:18:10 -040040VSOCKPORT = 1234
41
Victor Stinner45df8202010-04-28 22:31:17 +000042try:
Victor Stinnere254e532014-07-26 14:36:55 +020043 import _socket
44except ImportError:
45 _socket = None
46
caaveryeffc12f2017-09-06 18:18:10 -040047def get_cid():
48 if fcntl is None:
49 return None
50 try:
51 with open("/dev/vsock", "rb") as f:
52 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
53 except OSError:
54 return None
55 else:
56 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000057
Charles-François Natali47413c12011-10-06 19:47:44 +020058def _have_socket_can():
59 """Check whether CAN sockets are supported on this host."""
60 try:
61 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020062 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020063 return False
64 else:
65 s.close()
66 return True
67
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040068def _have_socket_can_isotp():
69 """Check whether CAN ISOTP sockets are supported on this host."""
70 try:
71 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
72 except (AttributeError, OSError):
73 return False
74 else:
75 s.close()
76 return True
77
Charles-François Natali10b8cf42011-11-10 19:21:37 +010078def _have_socket_rds():
79 """Check whether RDS sockets are supported on this host."""
80 try:
81 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
82 except (AttributeError, OSError):
83 return False
84 else:
85 s.close()
86 return True
87
Christian Heimes48371412016-09-06 00:37:46 +020088def _have_socket_alg():
89 """Check whether AF_ALG sockets are supported on this host."""
90 try:
91 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
92 except (AttributeError, OSError):
93 return False
94 else:
95 s.close()
96 return True
97
caaveryeffc12f2017-09-06 18:18:10 -040098def _have_socket_vsock():
99 """Check whether AF_VSOCK sockets are supported on this host."""
100 ret = get_cid() is not None
101 return ret
102
Yury Selivanovf11b4602018-01-28 17:27:38 -0500103
104def _is_fd_in_blocking_mode(sock):
105 return not bool(
106 fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
107
108
Charles-François Natali47413c12011-10-06 19:47:44 +0200109HAVE_SOCKET_CAN = _have_socket_can()
110
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400111HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
112
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100113HAVE_SOCKET_RDS = _have_socket_rds()
114
Christian Heimes48371412016-09-06 00:37:46 +0200115HAVE_SOCKET_ALG = _have_socket_alg()
116
caaveryeffc12f2017-09-06 18:18:10 -0400117HAVE_SOCKET_VSOCK = _have_socket_vsock()
118
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000119# Size in bytes of the int type
120SIZEOF_INT = array.array("i").itemsize
121
Guido van Rossum24e4af82002-06-12 19:18:08 +0000122class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000123
Guido van Rossum24e4af82002-06-12 19:18:08 +0000124 def setUp(self):
125 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000126 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100127 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000128
Guido van Rossum24e4af82002-06-12 19:18:08 +0000129 def tearDown(self):
130 self.serv.close()
131 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000132
Guido van Rossum24e4af82002-06-12 19:18:08 +0000133class SocketUDPTest(unittest.TestCase):
134
135 def setUp(self):
136 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000137 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000138
139 def tearDown(self):
140 self.serv.close()
141 self.serv = None
142
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000143class ThreadSafeCleanupTestCase(unittest.TestCase):
144 """Subclass of unittest.TestCase with thread-safe cleanup methods.
145
146 This subclass protects the addCleanup() and doCleanups() methods
147 with a recursive lock.
148 """
149
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200150 def __init__(self, *args, **kwargs):
151 super().__init__(*args, **kwargs)
152 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000153
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200154 def addCleanup(self, *args, **kwargs):
155 with self._cleanup_lock:
156 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000157
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200158 def doCleanups(self, *args, **kwargs):
159 with self._cleanup_lock:
160 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000161
Charles-François Natali47413c12011-10-06 19:47:44 +0200162class SocketCANTest(unittest.TestCase):
163
164 """To be able to run this test, a `vcan0` CAN interface can be created with
165 the following commands:
166 # modprobe vcan
167 # ip link add dev vcan0 type vcan
168 # ifconfig vcan0 up
169 """
170 interface = 'vcan0'
171 bufsize = 128
172
Charles-François Natali773e42d2013-02-05 19:42:01 +0100173 """The CAN frame structure is defined in <linux/can.h>:
174
175 struct can_frame {
176 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
177 __u8 can_dlc; /* data length code: 0 .. 8 */
178 __u8 data[8] __attribute__((aligned(8)));
179 };
180 """
181 can_frame_fmt = "=IB3x8s"
182 can_frame_size = struct.calcsize(can_frame_fmt)
183
184 """The Broadcast Management Command frame structure is defined
185 in <linux/can/bcm.h>:
186
187 struct bcm_msg_head {
188 __u32 opcode;
189 __u32 flags;
190 __u32 count;
191 struct timeval ival1, ival2;
192 canid_t can_id;
193 __u32 nframes;
194 struct can_frame frames[0];
195 }
196
197 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
198 `struct can_frame` definition). Must use native not standard types for packing.
199 """
200 bcm_cmd_msg_fmt = "@3I4l2I"
201 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
202
Charles-François Natali47413c12011-10-06 19:47:44 +0200203 def setUp(self):
204 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200205 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200206 try:
207 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200208 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200209 self.skipTest('network interface `%s` does not exist' %
210 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200211
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100212
213class SocketRDSTest(unittest.TestCase):
214
215 """To be able to run this test, the `rds` kernel module must be loaded:
216 # modprobe rds
217 """
218 bufsize = 8192
219
220 def setUp(self):
221 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
222 self.addCleanup(self.serv.close)
223 try:
224 self.port = support.bind_port(self.serv)
225 except OSError:
226 self.skipTest('unable to bind RDS socket')
227
228
Guido van Rossum24e4af82002-06-12 19:18:08 +0000229class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000230 """Threadable Test class
231
232 The ThreadableTest class makes it easy to create a threaded
233 client/server pair from an existing unit test. To create a
234 new threaded class from an existing unit test, use multiple
235 inheritance:
236
237 class NewClass (OldClass, ThreadableTest):
238 pass
239
240 This class defines two new fixture functions with obvious
241 purposes for overriding:
242
243 clientSetUp ()
244 clientTearDown ()
245
246 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000247 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000248 '_' to indicate the client portion of the test. Ex:
249
250 def testFoo(self):
251 # Server portion
252
253 def _testFoo(self):
254 # Client portion
255
256 Any exceptions raised by the clients during their tests
257 are caught and transferred to the main thread to alert
258 the testing framework.
259
260 Note, the server setup function cannot call any blocking
261 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000262 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000263 the blocking call (such as in setting up a client/server
264 connection and performing the accept() in setUp().
265 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000266
267 def __init__(self):
268 # Swap the true setup function
269 self.__setUp = self.setUp
270 self.__tearDown = self.tearDown
271 self.setUp = self._setUp
272 self.tearDown = self._tearDown
273
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000274 def serverExplicitReady(self):
275 """This method allows the server to explicitly indicate that
276 it wants the client thread to proceed. This is useful if the
277 server is about to execute a blocking routine that is
278 dependent upon the client thread during its setup routine."""
279 self.server_ready.set()
280
Guido van Rossum24e4af82002-06-12 19:18:08 +0000281 def _setUp(self):
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700282 self.wait_threads = support.wait_threads_exit()
283 self.wait_threads.__enter__()
284
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000285 self.server_ready = threading.Event()
286 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000287 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000288 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200289 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000290
291 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000292 methodname = self.id()
293 i = methodname.rfind('.')
294 methodname = methodname[i+1:]
295 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000296 self.client_thread = thread.start_new_thread(
297 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000298
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200299 try:
300 self.__setUp()
301 except:
302 self.server_crashed = True
303 raise
304 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000305 self.server_ready.set()
306 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000307
308 def _tearDown(self):
309 self.__tearDown()
310 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700311 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000312
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000313 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000314 exc = self.queue.get()
315 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000316
317 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000318 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100319 try:
320 self.clientSetUp()
321 except BaseException as e:
322 self.queue.put(e)
323 self.clientTearDown()
324 return
325 finally:
326 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200327 if self.server_crashed:
328 self.clientTearDown()
329 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000330 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000331 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000332 try:
333 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000334 except BaseException as e:
335 self.queue.put(e)
336 finally:
337 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000338
339 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000340 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000341
342 def clientTearDown(self):
343 self.done.set()
344 thread.exit()
345
346class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
347
348 def __init__(self, methodName='runTest'):
349 SocketTCPTest.__init__(self, methodName=methodName)
350 ThreadableTest.__init__(self)
351
352 def clientSetUp(self):
353 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
354
355 def clientTearDown(self):
356 self.cli.close()
357 self.cli = None
358 ThreadableTest.clientTearDown(self)
359
360class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
361
362 def __init__(self, methodName='runTest'):
363 SocketUDPTest.__init__(self, methodName=methodName)
364 ThreadableTest.__init__(self)
365
366 def clientSetUp(self):
367 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
368
Brian Curtin3beb38f2010-11-04 03:41:43 +0000369 def clientTearDown(self):
370 self.cli.close()
371 self.cli = None
372 ThreadableTest.clientTearDown(self)
373
Charles-François Natali47413c12011-10-06 19:47:44 +0200374class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
375
376 def __init__(self, methodName='runTest'):
377 SocketCANTest.__init__(self, methodName=methodName)
378 ThreadableTest.__init__(self)
379
380 def clientSetUp(self):
381 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
382 try:
383 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200384 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200385 # skipTest should not be called here, and will be called in the
386 # server instead
387 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200388
389 def clientTearDown(self):
390 self.cli.close()
391 self.cli = None
392 ThreadableTest.clientTearDown(self)
393
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100394class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
395
396 def __init__(self, methodName='runTest'):
397 SocketRDSTest.__init__(self, methodName=methodName)
398 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100399
400 def clientSetUp(self):
401 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
402 try:
403 # RDS sockets must be bound explicitly to send or receive data
404 self.cli.bind((HOST, 0))
405 self.cli_addr = self.cli.getsockname()
406 except OSError:
407 # skipTest should not be called here, and will be called in the
408 # server instead
409 pass
410
411 def clientTearDown(self):
412 self.cli.close()
413 self.cli = None
414 ThreadableTest.clientTearDown(self)
415
caaveryeffc12f2017-09-06 18:18:10 -0400416@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400417@unittest.skipUnless(HAVE_SOCKET_VSOCK,
418 'VSOCK sockets required for this test.')
419@unittest.skipUnless(get_cid() != 2,
420 "This test can only be run on a virtual guest.")
421class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
422
423 def __init__(self, methodName='runTest'):
424 unittest.TestCase.__init__(self, methodName=methodName)
425 ThreadableTest.__init__(self)
426
427 def setUp(self):
428 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
429 self.addCleanup(self.serv.close)
430 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
431 self.serv.listen()
432 self.serverExplicitReady()
433 self.conn, self.connaddr = self.serv.accept()
434 self.addCleanup(self.conn.close)
435
436 def clientSetUp(self):
437 time.sleep(0.1)
438 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
439 self.addCleanup(self.cli.close)
440 cid = get_cid()
441 self.cli.connect((cid, VSOCKPORT))
442
443 def testStream(self):
444 msg = self.conn.recv(1024)
445 self.assertEqual(msg, MSG)
446
447 def _testStream(self):
448 self.cli.send(MSG)
449 self.cli.close()
450
Guido van Rossum24e4af82002-06-12 19:18:08 +0000451class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000452 """Socket tests for client-server connection.
453
454 self.cli_conn is a client socket connected to the server. The
455 setUp() method guarantees that it is connected to the server.
456 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000457
458 def __init__(self, methodName='runTest'):
459 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
460
461 def setUp(self):
462 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000463 # Indicate explicitly we're ready for the client thread to
464 # proceed and then perform the blocking call to accept
465 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000466 conn, addr = self.serv.accept()
467 self.cli_conn = conn
468
469 def tearDown(self):
470 self.cli_conn.close()
471 self.cli_conn = None
472 ThreadedTCPSocketTest.tearDown(self)
473
474 def clientSetUp(self):
475 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000476 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000477 self.serv_conn = self.cli
478
479 def clientTearDown(self):
480 self.serv_conn.close()
481 self.serv_conn = None
482 ThreadedTCPSocketTest.clientTearDown(self)
483
Dave Cole331708b2004-08-09 04:51:41 +0000484class SocketPairTest(unittest.TestCase, ThreadableTest):
485
486 def __init__(self, methodName='runTest'):
487 unittest.TestCase.__init__(self, methodName=methodName)
488 ThreadableTest.__init__(self)
489
490 def setUp(self):
491 self.serv, self.cli = socket.socketpair()
492
493 def tearDown(self):
494 self.serv.close()
495 self.serv = None
496
497 def clientSetUp(self):
498 pass
499
500 def clientTearDown(self):
501 self.cli.close()
502 self.cli = None
503 ThreadableTest.clientTearDown(self)
504
Tim Peters494aaee2004-08-09 18:54:11 +0000505
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000506# The following classes are used by the sendmsg()/recvmsg() tests.
507# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
508# gives a drop-in replacement for SocketConnectedTest, but different
509# address families can be used, and the attributes serv_addr and
510# cli_addr will be set to the addresses of the endpoints.
511
512class SocketTestBase(unittest.TestCase):
513 """A base class for socket tests.
514
515 Subclasses must provide methods newSocket() to return a new socket
516 and bindSock(sock) to bind it to an unused address.
517
518 Creates a socket self.serv and sets self.serv_addr to its address.
519 """
520
521 def setUp(self):
522 self.serv = self.newSocket()
523 self.bindServer()
524
525 def bindServer(self):
526 """Bind server socket and set self.serv_addr to its address."""
527 self.bindSock(self.serv)
528 self.serv_addr = self.serv.getsockname()
529
530 def tearDown(self):
531 self.serv.close()
532 self.serv = None
533
534
535class SocketListeningTestMixin(SocketTestBase):
536 """Mixin to listen on the server socket."""
537
538 def setUp(self):
539 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100540 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000541
542
543class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
544 ThreadableTest):
545 """Mixin to add client socket and allow client/server tests.
546
547 Client socket is self.cli and its address is self.cli_addr. See
548 ThreadableTest for usage information.
549 """
550
551 def __init__(self, *args, **kwargs):
552 super().__init__(*args, **kwargs)
553 ThreadableTest.__init__(self)
554
555 def clientSetUp(self):
556 self.cli = self.newClientSocket()
557 self.bindClient()
558
559 def newClientSocket(self):
560 """Return a new socket for use as client."""
561 return self.newSocket()
562
563 def bindClient(self):
564 """Bind client socket and set self.cli_addr to its address."""
565 self.bindSock(self.cli)
566 self.cli_addr = self.cli.getsockname()
567
568 def clientTearDown(self):
569 self.cli.close()
570 self.cli = None
571 ThreadableTest.clientTearDown(self)
572
573
574class ConnectedStreamTestMixin(SocketListeningTestMixin,
575 ThreadedSocketTestMixin):
576 """Mixin to allow client/server stream tests with connected client.
577
578 Server's socket representing connection to client is self.cli_conn
579 and client's connection to server is self.serv_conn. (Based on
580 SocketConnectedTest.)
581 """
582
583 def setUp(self):
584 super().setUp()
585 # Indicate explicitly we're ready for the client thread to
586 # proceed and then perform the blocking call to accept
587 self.serverExplicitReady()
588 conn, addr = self.serv.accept()
589 self.cli_conn = conn
590
591 def tearDown(self):
592 self.cli_conn.close()
593 self.cli_conn = None
594 super().tearDown()
595
596 def clientSetUp(self):
597 super().clientSetUp()
598 self.cli.connect(self.serv_addr)
599 self.serv_conn = self.cli
600
601 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100602 try:
603 self.serv_conn.close()
604 self.serv_conn = None
605 except AttributeError:
606 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000607 super().clientTearDown()
608
609
610class UnixSocketTestBase(SocketTestBase):
611 """Base class for Unix-domain socket tests."""
612
613 # This class is used for file descriptor passing tests, so we
614 # create the sockets in a private directory so that other users
615 # can't send anything that might be problematic for a privileged
616 # user running the tests.
617
618 def setUp(self):
619 self.dir_path = tempfile.mkdtemp()
620 self.addCleanup(os.rmdir, self.dir_path)
621 super().setUp()
622
623 def bindSock(self, sock):
624 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100625 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000626 self.addCleanup(support.unlink, path)
627
628class UnixStreamBase(UnixSocketTestBase):
629 """Base class for Unix-domain SOCK_STREAM tests."""
630
631 def newSocket(self):
632 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
633
634
635class InetTestBase(SocketTestBase):
636 """Base class for IPv4 socket tests."""
637
638 host = HOST
639
640 def setUp(self):
641 super().setUp()
642 self.port = self.serv_addr[1]
643
644 def bindSock(self, sock):
645 support.bind_port(sock, host=self.host)
646
647class TCPTestBase(InetTestBase):
648 """Base class for TCP-over-IPv4 tests."""
649
650 def newSocket(self):
651 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
652
653class UDPTestBase(InetTestBase):
654 """Base class for UDP-over-IPv4 tests."""
655
656 def newSocket(self):
657 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
658
659class SCTPStreamBase(InetTestBase):
660 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
661
662 def newSocket(self):
663 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
664 socket.IPPROTO_SCTP)
665
666
667class Inet6TestBase(InetTestBase):
668 """Base class for IPv6 socket tests."""
669
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200670 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000671
672class UDP6TestBase(Inet6TestBase):
673 """Base class for UDP-over-IPv6 tests."""
674
675 def newSocket(self):
676 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
677
678
679# Test-skipping decorators for use with ThreadableTest.
680
681def skipWithClientIf(condition, reason):
682 """Skip decorated test if condition is true, add client_skip decorator.
683
684 If the decorated object is not a class, sets its attribute
685 "client_skip" to a decorator which will return an empty function
686 if the test is to be skipped, or the original function if it is
687 not. This can be used to avoid running the client part of a
688 skipped test when using ThreadableTest.
689 """
690 def client_pass(*args, **kwargs):
691 pass
692 def skipdec(obj):
693 retval = unittest.skip(reason)(obj)
694 if not isinstance(obj, type):
695 retval.client_skip = lambda f: client_pass
696 return retval
697 def noskipdec(obj):
698 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
699 obj.client_skip = lambda f: f
700 return obj
701 return skipdec if condition else noskipdec
702
703
704def requireAttrs(obj, *attributes):
705 """Skip decorated test if obj is missing any of the given attributes.
706
707 Sets client_skip attribute as skipWithClientIf() does.
708 """
709 missing = [name for name in attributes if not hasattr(obj, name)]
710 return skipWithClientIf(
711 missing, "don't have " + ", ".join(name for name in missing))
712
713
714def requireSocket(*args):
715 """Skip decorated test if a socket cannot be created with given arguments.
716
717 When an argument is given as a string, will use the value of that
718 attribute of the socket module, or skip the test if it doesn't
719 exist. Sets client_skip attribute as skipWithClientIf() does.
720 """
721 err = None
722 missing = [obj for obj in args if
723 isinstance(obj, str) and not hasattr(socket, obj)]
724 if missing:
725 err = "don't have " + ", ".join(name for name in missing)
726 else:
727 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
728 for obj in args]
729 try:
730 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200731 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000732 # XXX: check errno?
733 err = str(e)
734 else:
735 s.close()
736 return skipWithClientIf(
737 err is not None,
738 "can't create socket({0}): {1}".format(
739 ", ".join(str(o) for o in args), err))
740
741
Guido van Rossum24e4af82002-06-12 19:18:08 +0000742#######################################################################
743## Begin Tests
744
745class GeneralModuleTests(unittest.TestCase):
746
Ethan Furman7184bac2014-10-14 18:56:53 -0700747 def test_SocketType_is_socketobject(self):
748 import _socket
749 self.assertTrue(socket.SocketType is _socket.socket)
750 s = socket.socket()
751 self.assertIsInstance(s, socket.SocketType)
752 s.close()
753
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000754 def test_repr(self):
755 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200756 with s:
757 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000758 self.assertIn('family=%s' % socket.AF_INET, repr(s))
759 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200760 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200761 self.assertNotIn('raddr', repr(s))
762 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200763 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200764 self.assertIn(str(s.getsockname()), repr(s))
765 self.assertIn('[closed]', repr(s))
766 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000767
Victor Stinnere254e532014-07-26 14:36:55 +0200768 @unittest.skipUnless(_socket is not None, 'need _socket module')
769 def test_csocket_repr(self):
770 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
771 try:
772 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
773 % (s.fileno(), s.family, s.type, s.proto))
774 self.assertEqual(repr(s), expected)
775 finally:
776 s.close()
777 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
778 % (s.family, s.type, s.proto))
779 self.assertEqual(repr(s), expected)
780
Raymond Hettinger027bb632004-05-31 03:09:25 +0000781 def test_weakref(self):
782 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
783 p = proxy(s)
784 self.assertEqual(p.fileno(), s.fileno())
785 s.close()
786 s = None
787 try:
788 p.fileno()
789 except ReferenceError:
790 pass
791 else:
792 self.fail('Socket proxy still exists')
793
Guido van Rossum24e4af82002-06-12 19:18:08 +0000794 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000795 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300796 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200797 with self.assertRaises(OSError, msg=msg % 'OSError'):
798 raise OSError
799 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000800 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200801 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000802 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000803
Ezio Melotti63e42302011-05-07 19:47:48 +0300804 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000805 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300806 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
807 self.addCleanup(s.close)
808 s.bind(('', 0))
809 sockname = s.getsockname()
810 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300811 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300812 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300813 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400814 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300815 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300816 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300817 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400818 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300819 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300820 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300821 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300822 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300823 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300824 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300825 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400826 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300827 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300828 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300829 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400830 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300831 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300832 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300833 self.assertIn('not NoneType', str(cm.exception))
834 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300835 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300836 self.assertIn('an integer is required', str(cm.exception))
837 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300838 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300839 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300840 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300841 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300842 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300843 self.assertIn('(1 given)', str(cm.exception))
844 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300845 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300846 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300847
Guido van Rossum24e4af82002-06-12 19:18:08 +0000848 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000849 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000850 socket.AF_INET
851 socket.SOCK_STREAM
852 socket.SOCK_DGRAM
853 socket.SOCK_RAW
854 socket.SOCK_RDM
855 socket.SOCK_SEQPACKET
856 socket.SOL_SOCKET
857 socket.SO_REUSEADDR
858
Guido van Rossum654c11e2002-06-13 20:24:17 +0000859 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000860 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000861 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000862 try:
863 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200864 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000865 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600866 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000867 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000868 try:
869 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200870 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000871 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600872 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000873 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000874 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000875 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000876 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000877
Charles-François Natali0cc86852013-09-13 19:53:08 +0200878 def test_host_resolution(self):
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700879 for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200880 self.assertEqual(socket.gethostbyname(addr), addr)
881
882 # we don't test support.HOSTv6 because there's a chance it doesn't have
883 # a matching name entry (e.g. 'ip6-localhost')
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700884 for host in [support.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200885 self.assertIn(host, socket.gethostbyaddr(host)[2])
886
Xiang Zhangd36a7162017-03-07 11:06:09 +0800887 def test_host_resolution_bad_address(self):
888 # These are all malformed IP addresses and expected not to resolve to
889 # any result. But some ISPs, e.g. AWS, may successfully resolve these
890 # IPs.
891 explanation = (
892 "resolving an invalid IP address did not raise OSError; "
893 "can be caused by a broken DNS server"
894 )
895 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
896 '1:1:1:1:1:1:1:1:1']:
Miss Islington (bot)56882db2018-05-17 09:53:24 -0700897 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +0800898 socket.gethostbyname(addr)
899 with self.assertRaises(OSError, msg=explanation):
900 socket.gethostbyaddr(addr)
901
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000902 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
903 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
904 def test_sethostname(self):
905 oldhn = socket.gethostname()
906 try:
907 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200908 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000909 if e.errno == errno.EPERM:
910 self.skipTest("test should be run as root")
911 else:
912 raise
913 try:
914 # running test as root!
915 self.assertEqual(socket.gethostname(), 'new')
916 # Should work with bytes objects too
917 socket.sethostname(b'bar')
918 self.assertEqual(socket.gethostname(), 'bar')
919 finally:
920 socket.sethostname(oldhn)
921
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700922 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
923 'socket.if_nameindex() not available.')
924 def testInterfaceNameIndex(self):
925 interfaces = socket.if_nameindex()
926 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200927 self.assertIsInstance(index, int)
928 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700929 # interface indices are non-zero integers
930 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200931 _index = socket.if_nametoindex(name)
932 self.assertIsInstance(_index, int)
933 self.assertEqual(index, _index)
934 _name = socket.if_indextoname(index)
935 self.assertIsInstance(_name, str)
936 self.assertEqual(name, _name)
937
938 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
939 'socket.if_nameindex() not available.')
940 def testInvalidInterfaceNameIndex(self):
941 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200942 self.assertRaises(OSError, socket.if_indextoname, 0)
943 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200944 # test with invalid values
945 self.assertRaises(TypeError, socket.if_nametoindex, 0)
946 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700947
Serhiy Storchaka43767632013-11-03 21:31:38 +0200948 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
949 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000950 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000951 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200952 try:
953 # On some versions, this loses a reference
954 orig = sys.getrefcount(__name__)
955 socket.getnameinfo(__name__,0)
956 except TypeError:
957 if sys.getrefcount(__name__) != orig:
958 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000959
Guido van Rossum24e4af82002-06-12 19:18:08 +0000960 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000961 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000962 try:
963 # On some versions, this crashes the interpreter.
964 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200965 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000966 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000967
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000968 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000969 # This just checks that htons etc. are their own inverse,
970 # when looking at the lower 16 or 32 bits.
971 sizes = {socket.htonl: 32, socket.ntohl: 32,
972 socket.htons: 16, socket.ntohs: 16}
973 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000974 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000975 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
976 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000977
Guido van Rossuma2627af2002-09-14 00:58:46 +0000978 swapped = func(mask)
979 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000980 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000981
Serhiy Storchaka24c738a2017-03-19 20:20:10 +0200982 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +0000983 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300984 import _testcapi
985 s_good_values = [0, 1, 2, 0xffff]
986 l_good_values = s_good_values + [0xffffffff]
987 l_bad_values = [-1, -2, 1<<32, 1<<1000]
988 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
989 _testcapi.INT_MAX + 1]
990 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
991 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000992 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000993 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300994 for k in l_good_values:
995 socket.ntohl(k)
996 socket.htonl(k)
997 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000998 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000999 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001000 for k in l_bad_values:
1001 self.assertRaises(OverflowError, socket.ntohl, k)
1002 self.assertRaises(OverflowError, socket.htonl, k)
1003 for k in s_deprecated_values:
1004 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1005 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001006
Barry Warsaw11b91a02004-06-28 00:50:43 +00001007 def testGetServBy(self):
1008 eq = self.assertEqual
1009 # Find one service that exists, then check all the related interfaces.
1010 # I've ordered this by protocols that have both a tcp and udp
1011 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001012 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001013 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001014 # avoid the 'echo' service on this platform, as there is an
1015 # assumption breaking non-standard port/protocol entry
1016 services = ('daytime', 'qotd', 'domain')
1017 else:
1018 services = ('echo', 'daytime', 'domain')
1019 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001020 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001021 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001022 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001023 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001024 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001025 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001026 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001027 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001028 # Issue #26936: Android getservbyname() was broken before API 23.
1029 if (not hasattr(sys, 'getandroidapilevel') or
1030 sys.getandroidapilevel() >= 23):
1031 port2 = socket.getservbyname(service)
1032 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001033 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001034 try:
1035 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001036 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001037 udpport = None
1038 else:
1039 eq(udpport, port)
1040 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001041 # Issue #26936: Android getservbyport() is broken.
1042 if not support.is_android:
1043 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001044 eq(socket.getservbyport(port, 'tcp'), service)
1045 if udpport is not None:
1046 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001047 # Make sure getservbyport does not accept out of range ports.
1048 self.assertRaises(OverflowError, socket.getservbyport, -1)
1049 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001050
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001051 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001052 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001053 # The default timeout should initially be None
1054 self.assertEqual(socket.getdefaulttimeout(), None)
1055 s = socket.socket()
1056 self.assertEqual(s.gettimeout(), None)
1057 s.close()
1058
1059 # Set the default timeout to 10, and see if it propagates
1060 socket.setdefaulttimeout(10)
1061 self.assertEqual(socket.getdefaulttimeout(), 10)
1062 s = socket.socket()
1063 self.assertEqual(s.gettimeout(), 10)
1064 s.close()
1065
1066 # Reset the default timeout to None, and see if it propagates
1067 socket.setdefaulttimeout(None)
1068 self.assertEqual(socket.getdefaulttimeout(), None)
1069 s = socket.socket()
1070 self.assertEqual(s.gettimeout(), None)
1071 s.close()
1072
1073 # Check that setting it to an invalid value raises ValueError
1074 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1075
1076 # Check that setting it to an invalid type raises TypeError
1077 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1078
Serhiy Storchaka43767632013-11-03 21:31:38 +02001079 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1080 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001081 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001082 # Test that issue1008086 and issue767150 are fixed.
1083 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001084 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1085 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001086
Serhiy Storchaka43767632013-11-03 21:31:38 +02001087 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1088 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001089 def testIPv4toString(self):
1090 from socket import inet_aton as f, inet_pton, AF_INET
1091 g = lambda a: inet_pton(AF_INET, a)
1092
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001093 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001094 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001095 )
1096
Ezio Melottib3aedd42010-11-20 19:04:17 +00001097 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1098 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1099 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1100 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1101 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001102 # bpo-29972: inet_pton() doesn't fail on AIX
1103 if not sys.platform.startswith('aix'):
1104 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001105 assertInvalid(f, '300.0.0.0')
1106 assertInvalid(f, 'a.0.0.0')
1107 assertInvalid(f, '1.2.3.4.5')
1108 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001109
Ezio Melottib3aedd42010-11-20 19:04:17 +00001110 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1111 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1112 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1113 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001114 assertInvalid(g, '0.0.0.')
1115 assertInvalid(g, '300.0.0.0')
1116 assertInvalid(g, 'a.0.0.0')
1117 assertInvalid(g, '1.2.3.4.5')
1118 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001119
Serhiy Storchaka43767632013-11-03 21:31:38 +02001120 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1121 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001122 def testIPv6toString(self):
1123 try:
1124 from socket import inet_pton, AF_INET6, has_ipv6
1125 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001126 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001127 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001128 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001129
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001130 if sys.platform == "win32":
1131 try:
1132 inet_pton(AF_INET6, '::')
1133 except OSError as e:
1134 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001135 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001136
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001137 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001138 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001139 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001140 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001141
Ezio Melottib3aedd42010-11-20 19:04:17 +00001142 self.assertEqual(b'\x00' * 16, f('::'))
1143 self.assertEqual(b'\x00' * 16, f('0::0'))
1144 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1145 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001146 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 +00001147 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1148 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001149 self.assertEqual(
1150 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1151 f('ad42:abc::127:0:254:2')
1152 )
1153 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1154 assertInvalid('0x20::')
1155 assertInvalid(':::')
1156 assertInvalid('::0::')
1157 assertInvalid('1::abc::')
1158 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001159 assertInvalid('1:2:3:4:5:6')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001160 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001161 # bpo-29972: inet_pton() doesn't fail on AIX
1162 if not sys.platform.startswith('aix'):
1163 assertInvalid('1:2:3:4:5:6:')
1164 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001165
1166 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1167 f('::254.42.23.64')
1168 )
1169 self.assertEqual(
1170 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1171 f('42::a29b:254.42.23.64')
1172 )
1173 self.assertEqual(
1174 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1175 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1176 )
1177 assertInvalid('255.254.253.252')
1178 assertInvalid('1::260.2.3.0')
1179 assertInvalid('1::0.be.e.0')
1180 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1181 assertInvalid('::1.2.3.4:0')
1182 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001183
Serhiy Storchaka43767632013-11-03 21:31:38 +02001184 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1185 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001186 def testStringToIPv4(self):
1187 from socket import inet_ntoa as f, inet_ntop, AF_INET
1188 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001189 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001190 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001191 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001192
Ezio Melottib3aedd42010-11-20 19:04:17 +00001193 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1194 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1195 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1196 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001197 assertInvalid(f, b'\x00' * 3)
1198 assertInvalid(f, b'\x00' * 5)
1199 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001200 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001201
Ezio Melottib3aedd42010-11-20 19:04:17 +00001202 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1203 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1204 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001205 assertInvalid(g, b'\x00' * 3)
1206 assertInvalid(g, b'\x00' * 5)
1207 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001208 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001209
Serhiy Storchaka43767632013-11-03 21:31:38 +02001210 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1211 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001212 def testStringToIPv6(self):
1213 try:
1214 from socket import inet_ntop, AF_INET6, has_ipv6
1215 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001216 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001217 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001218 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001219
1220 if sys.platform == "win32":
1221 try:
1222 inet_ntop(AF_INET6, b'\x00' * 16)
1223 except OSError as e:
1224 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001225 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001226
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001227 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001228 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001229 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001230 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001231
Ezio Melottib3aedd42010-11-20 19:04:17 +00001232 self.assertEqual('::', f(b'\x00' * 16))
1233 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1234 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001235 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001236 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 +00001237 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001238 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001239
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001240 assertInvalid(b'\x12' * 15)
1241 assertInvalid(b'\x12' * 17)
1242 assertInvalid(b'\x12' * 4)
1243
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001244 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001245
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001246 def testSockName(self):
1247 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001248 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001249 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001250 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001251 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001252 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001253 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1254 # it reasonable to get the host's addr in addition to 0.0.0.0.
1255 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001256 try:
1257 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001258 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001259 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001260 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001261 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001262 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001263
1264 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001265 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001266 # We know a socket should start without reuse==0
1267 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001268 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001269 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001270 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001271
1272 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001273 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001274 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001275 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001276 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1277 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001278 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001279
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001280 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001281 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001282 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1283 sock.settimeout(1)
1284 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001285 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001286
Martin Panter50ab1a32016-04-11 00:38:12 +00001287 def testCloseException(self):
1288 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001289 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001290 socket.socket(fileno=sock.fileno()).close()
1291 try:
1292 sock.close()
1293 except OSError as err:
1294 # Winsock apparently raises ENOTSOCK
1295 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1296 else:
1297 self.fail("close() should raise EBADF/ENOTSOCK")
1298
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001299 def testNewAttributes(self):
1300 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001301
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001302 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1303 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001304 if hasattr(socket, 'SOCK_CLOEXEC'):
1305 self.assertIn(sock.type,
1306 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1307 socket.SOCK_STREAM))
1308 else:
1309 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001310 self.assertEqual(sock.proto, 0)
1311 sock.close()
1312
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001313 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001314 sock = socket.socket()
1315 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001316 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001317 big_port = port + 65536
1318 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001319 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1320 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1321 # Since find_unused_port() is inherently subject to race conditions, we
1322 # call it a couple times if necessary.
1323 for i in itertools.count():
1324 port = support.find_unused_port()
1325 try:
1326 sock.bind((HOST, port))
1327 except OSError as e:
1328 if e.errno != errno.EADDRINUSE or i == 5:
1329 raise
1330 else:
1331 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001332
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001333 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001334 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001335 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1336 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1337 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1338 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001339 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1340 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001341 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001342 self.assertRaises(ValueError, s.ioctl, -1, None)
1343 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001344
Steve Dowerea93ac02016-06-17 12:52:18 -07001345 @unittest.skipUnless(os.name == "nt", "Windows specific")
1346 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1347 'Loopback fast path support required for this test')
1348 def test_sio_loopback_fast_path(self):
1349 s = socket.socket()
1350 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001351 try:
1352 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1353 except OSError as exc:
1354 WSAEOPNOTSUPP = 10045
1355 if exc.winerror == WSAEOPNOTSUPP:
1356 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1357 "doesn't implemented in this Windows version")
1358 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001359 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1360
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001361 def testGetaddrinfo(self):
1362 try:
1363 socket.getaddrinfo('localhost', 80)
1364 except socket.gaierror as err:
1365 if err.errno == socket.EAI_SERVICE:
1366 # see http://bugs.python.org/issue1282647
1367 self.skipTest("buggy libc version")
1368 raise
1369 # len of every sequence is supposed to be == 5
1370 for info in socket.getaddrinfo(HOST, None):
1371 self.assertEqual(len(info), 5)
1372 # host can be a domain name, a string representation of an
1373 # IPv4/v6 address or None
1374 socket.getaddrinfo('localhost', 80)
1375 socket.getaddrinfo('127.0.0.1', 80)
1376 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001377 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001378 socket.getaddrinfo('::1', 80)
1379 # port can be a string service name such as "http", a numeric
1380 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001381 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1382 if (not hasattr(sys, 'getandroidapilevel') or
1383 sys.getandroidapilevel() >= 23):
1384 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001385 socket.getaddrinfo(HOST, 80)
1386 socket.getaddrinfo(HOST, None)
1387 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001388 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1389 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001390 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001391 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1392 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001393 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001394 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1395 for _, socktype, _, _, _ in infos:
1396 self.assertEqual(socktype, socket.SOCK_STREAM)
1397 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001398 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001399 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1400 # a server willing to support both IPv4 and IPv6 will
1401 # usually do this
1402 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1403 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001404 # test keyword arguments
1405 a = socket.getaddrinfo(HOST, None)
1406 b = socket.getaddrinfo(host=HOST, port=None)
1407 self.assertEqual(a, b)
1408 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1409 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1410 self.assertEqual(a, b)
1411 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1412 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1413 self.assertEqual(a, b)
1414 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1415 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1416 self.assertEqual(a, b)
1417 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1418 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1419 self.assertEqual(a, b)
1420 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1421 socket.AI_PASSIVE)
1422 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1423 type=socket.SOCK_STREAM, proto=0,
1424 flags=socket.AI_PASSIVE)
1425 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001426 # Issue #6697.
1427 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001428
Ned Deilyb24f4812014-02-13 22:50:42 -08001429 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001430 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001431 try:
1432 # The arguments here are undefined and the call may succeed
1433 # or fail. All we care here is that it doesn't segfault.
1434 socket.getaddrinfo("localhost", None, 0, 0, 0,
1435 socket.AI_NUMERICSERV)
1436 except socket.gaierror:
1437 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001438
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001439 def test_getnameinfo(self):
1440 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001441 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001442
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001443 @unittest.skipUnless(support.is_resource_enabled('network'),
1444 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001445 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001446 # Check for internet access before running test
1447 # (issue #12804, issue #25138).
1448 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001449 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001450
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001451 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001452 domain = 'испытание.pythontest.net'
1453 socket.gethostbyname(domain)
1454 socket.gethostbyname_ex(domain)
1455 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001456 # 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 +00001457 # have a reverse entry yet
1458 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001459
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001460 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001461 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001462 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1463 self.skipTest("signal.alarm and socket.socketpair required for this test")
1464 # Our signal handlers clobber the C errno by calling a math function
1465 # with an invalid domain value.
1466 def ok_handler(*args):
1467 self.assertRaises(ValueError, math.acosh, 0)
1468 def raising_handler(*args):
1469 self.assertRaises(ValueError, math.acosh, 0)
1470 1 // 0
1471 c, s = socket.socketpair()
1472 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1473 try:
1474 if with_timeout:
1475 # Just above the one second minimum for signal.alarm
1476 c.settimeout(1.5)
1477 with self.assertRaises(ZeroDivisionError):
1478 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001479 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001480 if with_timeout:
1481 signal.signal(signal.SIGALRM, ok_handler)
1482 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001483 self.assertRaises(socket.timeout, c.sendall,
1484 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001485 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001486 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001487 signal.signal(signal.SIGALRM, old_alarm)
1488 c.close()
1489 s.close()
1490
1491 def test_sendall_interrupted(self):
1492 self.check_sendall_interrupted(False)
1493
1494 def test_sendall_interrupted_with_timeout(self):
1495 self.check_sendall_interrupted(True)
1496
Antoine Pitroue033e062010-10-29 10:38:18 +00001497 def test_dealloc_warn(self):
1498 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1499 r = repr(sock)
1500 with self.assertWarns(ResourceWarning) as cm:
1501 sock = None
1502 support.gc_collect()
1503 self.assertIn(r, str(cm.warning.args[0]))
1504 # An open socket file object gets dereferenced after the socket
1505 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1506 f = sock.makefile('rb')
1507 r = repr(sock)
1508 sock = None
1509 support.gc_collect()
1510 with self.assertWarns(ResourceWarning):
1511 f = None
1512 support.gc_collect()
1513
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001514 def test_name_closed_socketio(self):
1515 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1516 fp = sock.makefile("rb")
1517 fp.close()
1518 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1519
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001520 def test_unusable_closed_socketio(self):
1521 with socket.socket() as sock:
1522 fp = sock.makefile("rb", buffering=0)
1523 self.assertTrue(fp.readable())
1524 self.assertFalse(fp.writable())
1525 self.assertFalse(fp.seekable())
1526 fp.close()
1527 self.assertRaises(ValueError, fp.readable)
1528 self.assertRaises(ValueError, fp.writable)
1529 self.assertRaises(ValueError, fp.seekable)
1530
Christian Heimesd0e31b92018-01-27 09:54:13 +01001531 def test_socket_close(self):
1532 sock = socket.socket()
1533 try:
1534 sock.bind((HOST, 0))
1535 socket.close(sock.fileno())
1536 with self.assertRaises(OSError):
1537 sock.listen(1)
1538 finally:
1539 with self.assertRaises(OSError):
1540 # sock.close() fails with EBADF
1541 sock.close()
1542 with self.assertRaises(TypeError):
1543 socket.close(None)
1544 with self.assertRaises(OSError):
1545 socket.close(-1)
1546
Berker Peksag3fe64d02016-02-18 17:34:00 +02001547 def test_makefile_mode(self):
1548 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1549 with self.subTest(mode=mode):
1550 with socket.socket() as sock:
1551 with sock.makefile(mode) as fp:
1552 self.assertEqual(fp.mode, mode)
1553
1554 def test_makefile_invalid_mode(self):
1555 for mode in 'rt', 'x', '+', 'a':
1556 with self.subTest(mode=mode):
1557 with socket.socket() as sock:
1558 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1559 sock.makefile(mode)
1560
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001561 def test_pickle(self):
1562 sock = socket.socket()
1563 with sock:
1564 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1565 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001566 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1567 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1568 self.assertEqual(family, socket.AF_INET)
1569 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1570 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001571
Serhiy Storchaka78980432013-01-15 01:12:17 +02001572 def test_listen_backlog(self):
1573 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001574 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1575 srv.bind((HOST, 0))
1576 srv.listen(backlog)
1577
1578 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001579 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001580 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001581
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001582 @support.cpython_only
1583 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001584 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001585 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001586 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1587 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001588 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001589 srv.close()
1590
Charles-François Natali42663332012-01-02 15:57:30 +01001591 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001592 def test_flowinfo(self):
1593 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001594 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001595 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001596 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001597
Miss Islington (bot)04425992018-02-12 12:12:24 -08001598 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1599 def test_getaddrinfo_ipv6_basic(self):
1600 ((*_, sockaddr),) = socket.getaddrinfo(
1601 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1602 1234, socket.AF_INET6,
1603 socket.SOCK_DGRAM,
1604 socket.IPPROTO_UDP
1605 )
1606 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1607
1608 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1609 @unittest.skipUnless(
1610 hasattr(socket, 'if_nameindex'),
1611 'if_nameindex is not supported')
1612 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1613 # Just pick up any network interface (Linux, Mac OS X)
1614 (ifindex, test_interface) = socket.if_nameindex()[0]
1615 ((*_, sockaddr),) = socket.getaddrinfo(
1616 'ff02::1de:c0:face:8D%' + test_interface,
1617 1234, socket.AF_INET6,
1618 socket.SOCK_DGRAM,
1619 socket.IPPROTO_UDP
1620 )
1621 # Note missing interface name part in IPv6 address
1622 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1623
1624 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1625 @unittest.skipUnless(
1626 sys.platform == 'win32',
1627 'Numeric scope id does not work or undocumented')
1628 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1629 # Also works on Linux and Mac OS X, but is not documented (?)
1630 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1631 ifindex = 42
1632 ((*_, sockaddr),) = socket.getaddrinfo(
1633 'ff02::1de:c0:face:8D%' + str(ifindex),
1634 1234, socket.AF_INET6,
1635 socket.SOCK_DGRAM,
1636 socket.IPPROTO_UDP
1637 )
1638 # Note missing interface name part in IPv6 address
1639 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1640
1641 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1642 @unittest.skipUnless(
1643 hasattr(socket, 'if_nameindex'),
1644 'if_nameindex is not supported')
1645 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1646 # Just pick up any network interface.
1647 (ifindex, test_interface) = socket.if_nameindex()[0]
1648 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1649 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1650 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1651
1652 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1653 @unittest.skipUnless(
1654 sys.platform == 'win32',
1655 'Numeric scope id does not work or undocumented')
1656 def test_getnameinfo_ipv6_scopeid_numeric(self):
1657 # Also works on Linux (undocumented), but does not work on Mac OS X
1658 # Windows and Linux allow nonexistent interface numbers here.
1659 ifindex = 42
1660 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1661 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1662 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1663
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001664 def test_str_for_enums(self):
1665 # Make sure that the AF_* and SOCK_* constants have enum-like string
1666 # reprs.
1667 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1668 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001669 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001670
Yury Selivanov98181422017-12-18 20:02:54 -05001671 def test_socket_consistent_sock_type(self):
1672 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1673 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1674 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1675
1676 with socket.socket(socket.AF_INET, sock_type) as s:
1677 self.assertEqual(s.type, socket.SOCK_STREAM)
1678 s.settimeout(1)
1679 self.assertEqual(s.type, socket.SOCK_STREAM)
1680 s.settimeout(0)
1681 self.assertEqual(s.type, socket.SOCK_STREAM)
1682 s.setblocking(True)
1683 self.assertEqual(s.type, socket.SOCK_STREAM)
1684 s.setblocking(False)
1685 self.assertEqual(s.type, socket.SOCK_STREAM)
1686
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001687 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001688 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001689 # Test that when created with a family that's not one of the known
1690 # AF_*/SOCK_* constants, socket.family just returns the number.
1691 #
1692 # To do this we fool socket.socket into believing it already has an
1693 # open fd because on this path it doesn't actually verify the family and
1694 # type and populates the socket object.
1695 #
1696 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001697 fd, path = tempfile.mkstemp()
1698 self.addCleanup(os.unlink, path)
Yury Selivanov98181422017-12-18 20:02:54 -05001699 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1700
1701 unknown_type = max(
1702 kind
1703 for name, kind in socket.SocketKind.__members__.items()
1704 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1705 ) + 1
1706
1707 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001708 family=unknown_family, type=unknown_type, proto=23,
1709 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001710 self.assertEqual(s.family, unknown_family)
1711 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001712 # some OS like macOS ignore proto
1713 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001714
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001715 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1716 def test__sendfile_use_sendfile(self):
1717 class File:
1718 def __init__(self, fd):
1719 self.fd = fd
1720
1721 def fileno(self):
1722 return self.fd
1723 with socket.socket() as sock:
1724 fd = os.open(os.curdir, os.O_RDONLY)
1725 os.close(fd)
1726 with self.assertRaises(socket._GiveupOnSendfile):
1727 sock._sendfile_use_sendfile(File(fd))
1728 with self.assertRaises(OverflowError):
1729 sock._sendfile_use_sendfile(File(2**1000))
1730 with self.assertRaises(TypeError):
1731 sock._sendfile_use_sendfile(File(None))
1732
Christian Heimesb6e43af2018-01-29 22:37:58 +01001733 def _test_socket_fileno(self, s, family, stype):
1734 self.assertEqual(s.family, family)
1735 self.assertEqual(s.type, stype)
1736
1737 fd = s.fileno()
1738 s2 = socket.socket(fileno=fd)
1739 self.addCleanup(s2.close)
1740 # detach old fd to avoid double close
1741 s.detach()
1742 self.assertEqual(s2.family, family)
1743 self.assertEqual(s2.type, stype)
1744 self.assertEqual(s2.fileno(), fd)
1745
1746 def test_socket_fileno(self):
1747 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1748 self.addCleanup(s.close)
1749 s.bind((support.HOST, 0))
1750 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1751
1752 if hasattr(socket, "SOCK_DGRAM"):
1753 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1754 self.addCleanup(s.close)
1755 s.bind((support.HOST, 0))
1756 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1757
1758 if support.IPV6_ENABLED:
1759 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1760 self.addCleanup(s.close)
1761 s.bind((support.HOSTv6, 0, 0, 0))
1762 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1763
1764 if hasattr(socket, "AF_UNIX"):
1765 tmpdir = tempfile.mkdtemp()
1766 self.addCleanup(shutil.rmtree, tmpdir)
1767 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1768 self.addCleanup(s.close)
1769 s.bind(os.path.join(tmpdir, 'socket'))
1770 self._test_socket_fileno(s, socket.AF_UNIX, socket.SOCK_STREAM)
1771
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001772
Charles-François Natali47413c12011-10-06 19:47:44 +02001773@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1774class BasicCANTest(unittest.TestCase):
1775
1776 def testCrucialConstants(self):
1777 socket.AF_CAN
1778 socket.PF_CAN
1779 socket.CAN_RAW
1780
Charles-François Natali773e42d2013-02-05 19:42:01 +01001781 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1782 'socket.CAN_BCM required for this test.')
1783 def testBCMConstants(self):
1784 socket.CAN_BCM
1785
1786 # opcodes
1787 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1788 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1789 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1790 socket.CAN_BCM_TX_SEND # send one CAN frame
1791 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1792 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1793 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1794 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1795 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1796 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1797 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1798 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1799
Charles-François Natali47413c12011-10-06 19:47:44 +02001800 def testCreateSocket(self):
1801 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1802 pass
1803
Charles-François Natali773e42d2013-02-05 19:42:01 +01001804 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1805 'socket.CAN_BCM required for this test.')
1806 def testCreateBCMSocket(self):
1807 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1808 pass
1809
Charles-François Natali47413c12011-10-06 19:47:44 +02001810 def testBindAny(self):
1811 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1812 s.bind(('', ))
1813
1814 def testTooLongInterfaceName(self):
1815 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1816 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001817 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001818 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001819
1820 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1821 'socket.CAN_RAW_LOOPBACK required for this test.')
1822 def testLoopback(self):
1823 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1824 for loopback in (0, 1):
1825 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1826 loopback)
1827 self.assertEqual(loopback,
1828 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1829
1830 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1831 'socket.CAN_RAW_FILTER required for this test.')
1832 def testFilter(self):
1833 can_id, can_mask = 0x200, 0x700
1834 can_filter = struct.pack("=II", can_id, can_mask)
1835 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1836 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1837 self.assertEqual(can_filter,
1838 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001839 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001840
1841
1842@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001843class CANTest(ThreadedCANSocketTest):
1844
Charles-François Natali47413c12011-10-06 19:47:44 +02001845 def __init__(self, methodName='runTest'):
1846 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1847
1848 @classmethod
1849 def build_can_frame(cls, can_id, data):
1850 """Build a CAN frame."""
1851 can_dlc = len(data)
1852 data = data.ljust(8, b'\x00')
1853 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1854
1855 @classmethod
1856 def dissect_can_frame(cls, frame):
1857 """Dissect a CAN frame."""
1858 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1859 return (can_id, can_dlc, data[:can_dlc])
1860
1861 def testSendFrame(self):
1862 cf, addr = self.s.recvfrom(self.bufsize)
1863 self.assertEqual(self.cf, cf)
1864 self.assertEqual(addr[0], self.interface)
1865 self.assertEqual(addr[1], socket.AF_CAN)
1866
1867 def _testSendFrame(self):
1868 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1869 self.cli.send(self.cf)
1870
1871 def testSendMaxFrame(self):
1872 cf, addr = self.s.recvfrom(self.bufsize)
1873 self.assertEqual(self.cf, cf)
1874
1875 def _testSendMaxFrame(self):
1876 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1877 self.cli.send(self.cf)
1878
1879 def testSendMultiFrames(self):
1880 cf, addr = self.s.recvfrom(self.bufsize)
1881 self.assertEqual(self.cf1, cf)
1882
1883 cf, addr = self.s.recvfrom(self.bufsize)
1884 self.assertEqual(self.cf2, cf)
1885
1886 def _testSendMultiFrames(self):
1887 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1888 self.cli.send(self.cf1)
1889
1890 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1891 self.cli.send(self.cf2)
1892
Charles-François Natali773e42d2013-02-05 19:42:01 +01001893 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1894 'socket.CAN_BCM required for this test.')
1895 def _testBCM(self):
1896 cf, addr = self.cli.recvfrom(self.bufsize)
1897 self.assertEqual(self.cf, cf)
1898 can_id, can_dlc, data = self.dissect_can_frame(cf)
1899 self.assertEqual(self.can_id, can_id)
1900 self.assertEqual(self.data, data)
1901
1902 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1903 'socket.CAN_BCM required for this test.')
1904 def testBCM(self):
1905 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1906 self.addCleanup(bcm.close)
1907 bcm.connect((self.interface,))
1908 self.can_id = 0x123
1909 self.data = bytes([0xc0, 0xff, 0xee])
1910 self.cf = self.build_can_frame(self.can_id, self.data)
1911 opcode = socket.CAN_BCM_TX_SEND
1912 flags = 0
1913 count = 0
1914 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1915 bcm_can_id = 0x0222
1916 nframes = 1
1917 assert len(self.cf) == 16
1918 header = struct.pack(self.bcm_cmd_msg_fmt,
1919 opcode,
1920 flags,
1921 count,
1922 ival1_seconds,
1923 ival1_usec,
1924 ival2_seconds,
1925 ival2_usec,
1926 bcm_can_id,
1927 nframes,
1928 )
1929 header_plus_frame = header + self.cf
1930 bytes_sent = bcm.send(header_plus_frame)
1931 self.assertEqual(bytes_sent, len(header_plus_frame))
1932
Charles-François Natali47413c12011-10-06 19:47:44 +02001933
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001934@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
1935class ISOTPTest(unittest.TestCase):
1936
1937 def __init__(self, *args, **kwargs):
1938 super().__init__(*args, **kwargs)
1939 self.interface = "vcan0"
1940
1941 def testCrucialConstants(self):
1942 socket.AF_CAN
1943 socket.PF_CAN
1944 socket.CAN_ISOTP
1945 socket.SOCK_DGRAM
1946
1947 def testCreateSocket(self):
1948 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1949 pass
1950
1951 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
1952 'socket.CAN_ISOTP required for this test.')
1953 def testCreateISOTPSocket(self):
1954 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1955 pass
1956
1957 def testTooLongInterfaceName(self):
1958 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1959 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1960 with self.assertRaisesRegex(OSError, 'interface name too long'):
1961 s.bind(('x' * 1024, 1, 2))
1962
1963 def testBind(self):
1964 try:
1965 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1966 addr = self.interface, 0x123, 0x456
1967 s.bind(addr)
1968 self.assertEqual(s.getsockname(), addr)
1969 except OSError as e:
1970 if e.errno == errno.ENODEV:
1971 self.skipTest('network interface `%s` does not exist' %
1972 self.interface)
1973 else:
1974 raise
1975
1976
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001977@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1978class BasicRDSTest(unittest.TestCase):
1979
1980 def testCrucialConstants(self):
1981 socket.AF_RDS
1982 socket.PF_RDS
1983
1984 def testCreateSocket(self):
1985 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1986 pass
1987
1988 def testSocketBufferSize(self):
1989 bufsize = 16384
1990 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1991 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1992 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1993
1994
1995@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001996class RDSTest(ThreadedRDSSocketTest):
1997
1998 def __init__(self, methodName='runTest'):
1999 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2000
Charles-François Natali240c55f2011-11-10 20:33:36 +01002001 def setUp(self):
2002 super().setUp()
2003 self.evt = threading.Event()
2004
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002005 def testSendAndRecv(self):
2006 data, addr = self.serv.recvfrom(self.bufsize)
2007 self.assertEqual(self.data, data)
2008 self.assertEqual(self.cli_addr, addr)
2009
2010 def _testSendAndRecv(self):
2011 self.data = b'spam'
2012 self.cli.sendto(self.data, 0, (HOST, self.port))
2013
2014 def testPeek(self):
2015 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2016 self.assertEqual(self.data, data)
2017 data, addr = self.serv.recvfrom(self.bufsize)
2018 self.assertEqual(self.data, data)
2019
2020 def _testPeek(self):
2021 self.data = b'spam'
2022 self.cli.sendto(self.data, 0, (HOST, self.port))
2023
2024 @requireAttrs(socket.socket, 'recvmsg')
2025 def testSendAndRecvMsg(self):
2026 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2027 self.assertEqual(self.data, data)
2028
2029 @requireAttrs(socket.socket, 'sendmsg')
2030 def _testSendAndRecvMsg(self):
2031 self.data = b'hello ' * 10
2032 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2033
2034 def testSendAndRecvMulti(self):
2035 data, addr = self.serv.recvfrom(self.bufsize)
2036 self.assertEqual(self.data1, data)
2037
2038 data, addr = self.serv.recvfrom(self.bufsize)
2039 self.assertEqual(self.data2, data)
2040
2041 def _testSendAndRecvMulti(self):
2042 self.data1 = b'bacon'
2043 self.cli.sendto(self.data1, 0, (HOST, self.port))
2044
2045 self.data2 = b'egg'
2046 self.cli.sendto(self.data2, 0, (HOST, self.port))
2047
2048 def testSelect(self):
2049 r, w, x = select.select([self.serv], [], [], 3.0)
2050 self.assertIn(self.serv, r)
2051 data, addr = self.serv.recvfrom(self.bufsize)
2052 self.assertEqual(self.data, data)
2053
2054 def _testSelect(self):
2055 self.data = b'select'
2056 self.cli.sendto(self.data, 0, (HOST, self.port))
2057
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002058
caaveryeffc12f2017-09-06 18:18:10 -04002059@unittest.skipIf(fcntl is None, "need fcntl")
2060@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2061 'VSOCK sockets required for this test.')
2062class BasicVSOCKTest(unittest.TestCase):
2063
2064 def testCrucialConstants(self):
2065 socket.AF_VSOCK
2066
2067 def testVSOCKConstants(self):
2068 socket.SO_VM_SOCKETS_BUFFER_SIZE
2069 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2070 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2071 socket.VMADDR_CID_ANY
2072 socket.VMADDR_PORT_ANY
2073 socket.VMADDR_CID_HOST
2074 socket.VM_SOCKETS_INVALID_VERSION
2075 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2076
2077 def testCreateSocket(self):
2078 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2079 pass
2080
2081 def testSocketBufferSize(self):
2082 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2083 orig_max = s.getsockopt(socket.AF_VSOCK,
2084 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2085 orig = s.getsockopt(socket.AF_VSOCK,
2086 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2087 orig_min = s.getsockopt(socket.AF_VSOCK,
2088 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2089
2090 s.setsockopt(socket.AF_VSOCK,
2091 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2092 s.setsockopt(socket.AF_VSOCK,
2093 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2094 s.setsockopt(socket.AF_VSOCK,
2095 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2096
2097 self.assertEqual(orig_max * 2,
2098 s.getsockopt(socket.AF_VSOCK,
2099 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2100 self.assertEqual(orig * 2,
2101 s.getsockopt(socket.AF_VSOCK,
2102 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2103 self.assertEqual(orig_min * 2,
2104 s.getsockopt(socket.AF_VSOCK,
2105 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2106
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002107
Guido van Rossum24e4af82002-06-12 19:18:08 +00002108class BasicTCPTest(SocketConnectedTest):
2109
2110 def __init__(self, methodName='runTest'):
2111 SocketConnectedTest.__init__(self, methodName=methodName)
2112
2113 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002114 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002115 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002116 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002117
2118 def _testRecv(self):
2119 self.serv_conn.send(MSG)
2120
2121 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002122 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002123 seg1 = self.cli_conn.recv(len(MSG) - 3)
2124 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002125 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002126 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002127
2128 def _testOverFlowRecv(self):
2129 self.serv_conn.send(MSG)
2130
2131 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002132 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002133 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002134 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002135
2136 def _testRecvFrom(self):
2137 self.serv_conn.send(MSG)
2138
2139 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002140 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002141 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2142 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002143 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002144 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002145
2146 def _testOverFlowRecvFrom(self):
2147 self.serv_conn.send(MSG)
2148
2149 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002150 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002151 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002152 while 1:
2153 read = self.cli_conn.recv(1024)
2154 if not read:
2155 break
Guido van Rossume531e292002-08-08 20:28:34 +00002156 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002157 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002158
2159 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002160 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002161 self.serv_conn.sendall(big_chunk)
2162
2163 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002164 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002165 fd = self.cli_conn.fileno()
2166 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002167 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002168 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002169 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002170 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002171
2172 def _testFromFd(self):
2173 self.serv_conn.send(MSG)
2174
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002175 def testDup(self):
2176 # Testing dup()
2177 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002178 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002179 msg = sock.recv(1024)
2180 self.assertEqual(msg, MSG)
2181
2182 def _testDup(self):
2183 self.serv_conn.send(MSG)
2184
Guido van Rossum24e4af82002-06-12 19:18:08 +00002185 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002186 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002187 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002188 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002189 # wait for _testShutdown to finish: on OS X, when the server
2190 # closes the connection the client also becomes disconnected,
2191 # and the client's shutdown call will fail. (Issue #4397.)
2192 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002193
2194 def _testShutdown(self):
2195 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002196 self.serv_conn.shutdown(2)
2197
2198 testShutdown_overflow = support.cpython_only(testShutdown)
2199
2200 @support.cpython_only
2201 def _testShutdown_overflow(self):
2202 import _testcapi
2203 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002204 # Issue 15989
2205 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2206 _testcapi.INT_MAX + 1)
2207 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2208 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002209 self.serv_conn.shutdown(2)
2210
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002211 def testDetach(self):
2212 # Testing detach()
2213 fileno = self.cli_conn.fileno()
2214 f = self.cli_conn.detach()
2215 self.assertEqual(f, fileno)
2216 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002217 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002218 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002219 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002220 # ...but we can create another socket using the (still open)
2221 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002222 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002223 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002224 msg = sock.recv(1024)
2225 self.assertEqual(msg, MSG)
2226
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002227 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002228 self.serv_conn.send(MSG)
2229
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002230
Guido van Rossum24e4af82002-06-12 19:18:08 +00002231class BasicUDPTest(ThreadedUDPSocketTest):
2232
2233 def __init__(self, methodName='runTest'):
2234 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2235
2236 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002237 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002238 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002239 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002240
2241 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002242 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002243
Guido van Rossum1c938012002-06-12 21:17:20 +00002244 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002245 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002246 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002247 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002248
Guido van Rossum1c938012002-06-12 21:17:20 +00002249 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002250 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002251
Guido van Rossumd8faa362007-04-27 19:54:29 +00002252 def testRecvFromNegative(self):
2253 # Negative lengths passed to recvfrom should give ValueError.
2254 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2255
2256 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002257 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002258
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002259# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2260# same test code is used with different families and types of socket
2261# (e.g. stream, datagram), and tests using recvmsg() are repeated
2262# using recvmsg_into().
2263#
2264# The generic test classes such as SendmsgTests and
2265# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2266# supplied with sockets cli_sock and serv_sock representing the
2267# client's and the server's end of the connection respectively, and
2268# attributes cli_addr and serv_addr holding their (numeric where
2269# appropriate) addresses.
2270#
2271# The final concrete test classes combine these with subclasses of
2272# SocketTestBase which set up client and server sockets of a specific
2273# type, and with subclasses of SendrecvmsgBase such as
2274# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2275# sockets to cli_sock and serv_sock and override the methods and
2276# attributes of SendrecvmsgBase to fill in destination addresses if
2277# needed when sending, check for specific flags in msg_flags, etc.
2278#
2279# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2280# recvmsg_into().
2281
2282# XXX: like the other datagram (UDP) tests in this module, the code
2283# here assumes that datagram delivery on the local machine will be
2284# reliable.
2285
2286class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2287 # Base class for sendmsg()/recvmsg() tests.
2288
2289 # Time in seconds to wait before considering a test failed, or
2290 # None for no timeout. Not all tests actually set a timeout.
2291 fail_timeout = 3.0
2292
2293 def setUp(self):
2294 self.misc_event = threading.Event()
2295 super().setUp()
2296
2297 def sendToServer(self, msg):
2298 # Send msg to the server.
2299 return self.cli_sock.send(msg)
2300
2301 # Tuple of alternative default arguments for sendmsg() when called
2302 # via sendmsgToServer() (e.g. to include a destination address).
2303 sendmsg_to_server_defaults = ()
2304
2305 def sendmsgToServer(self, *args):
2306 # Call sendmsg() on self.cli_sock with the given arguments,
2307 # filling in any arguments which are not supplied with the
2308 # corresponding items of self.sendmsg_to_server_defaults, if
2309 # any.
2310 return self.cli_sock.sendmsg(
2311 *(args + self.sendmsg_to_server_defaults[len(args):]))
2312
2313 def doRecvmsg(self, sock, bufsize, *args):
2314 # Call recvmsg() on sock with given arguments and return its
2315 # result. Should be used for tests which can use either
2316 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2317 # this method with one which emulates it using recvmsg_into(),
2318 # thus allowing the same test to be used for both methods.
2319 result = sock.recvmsg(bufsize, *args)
2320 self.registerRecvmsgResult(result)
2321 return result
2322
2323 def registerRecvmsgResult(self, result):
2324 # Called by doRecvmsg() with the return value of recvmsg() or
2325 # recvmsg_into(). Can be overridden to arrange cleanup based
2326 # on the returned ancillary data, for instance.
2327 pass
2328
2329 def checkRecvmsgAddress(self, addr1, addr2):
2330 # Called to compare the received address with the address of
2331 # the peer.
2332 self.assertEqual(addr1, addr2)
2333
2334 # Flags that are normally unset in msg_flags
2335 msg_flags_common_unset = 0
2336 for name in ("MSG_CTRUNC", "MSG_OOB"):
2337 msg_flags_common_unset |= getattr(socket, name, 0)
2338
2339 # Flags that are normally set
2340 msg_flags_common_set = 0
2341
2342 # Flags set when a complete record has been received (e.g. MSG_EOR
2343 # for SCTP)
2344 msg_flags_eor_indicator = 0
2345
2346 # Flags set when a complete record has not been received
2347 # (e.g. MSG_TRUNC for datagram sockets)
2348 msg_flags_non_eor_indicator = 0
2349
2350 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2351 # Method to check the value of msg_flags returned by recvmsg[_into]().
2352 #
2353 # Checks that all bits in msg_flags_common_set attribute are
2354 # set in "flags" and all bits in msg_flags_common_unset are
2355 # unset.
2356 #
2357 # The "eor" argument specifies whether the flags should
2358 # indicate that a full record (or datagram) has been received.
2359 # If "eor" is None, no checks are done; otherwise, checks
2360 # that:
2361 #
2362 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2363 # set and all bits in msg_flags_non_eor_indicator are unset
2364 #
2365 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2366 # are set and all bits in msg_flags_eor_indicator are unset
2367 #
2368 # If "checkset" and/or "checkunset" are supplied, they require
2369 # the given bits to be set or unset respectively, overriding
2370 # what the attributes require for those bits.
2371 #
2372 # If any bits are set in "ignore", they will not be checked,
2373 # regardless of the other inputs.
2374 #
2375 # Will raise Exception if the inputs require a bit to be both
2376 # set and unset, and it is not ignored.
2377
2378 defaultset = self.msg_flags_common_set
2379 defaultunset = self.msg_flags_common_unset
2380
2381 if eor:
2382 defaultset |= self.msg_flags_eor_indicator
2383 defaultunset |= self.msg_flags_non_eor_indicator
2384 elif eor is not None:
2385 defaultset |= self.msg_flags_non_eor_indicator
2386 defaultunset |= self.msg_flags_eor_indicator
2387
2388 # Function arguments override defaults
2389 defaultset &= ~checkunset
2390 defaultunset &= ~checkset
2391
2392 # Merge arguments with remaining defaults, and check for conflicts
2393 checkset |= defaultset
2394 checkunset |= defaultunset
2395 inboth = checkset & checkunset & ~ignore
2396 if inboth:
2397 raise Exception("contradictory set, unset requirements for flags "
2398 "{0:#x}".format(inboth))
2399
2400 # Compare with given msg_flags value
2401 mask = (checkset | checkunset) & ~ignore
2402 self.assertEqual(flags & mask, checkset & mask)
2403
2404
2405class RecvmsgIntoMixin(SendrecvmsgBase):
2406 # Mixin to implement doRecvmsg() using recvmsg_into().
2407
2408 def doRecvmsg(self, sock, bufsize, *args):
2409 buf = bytearray(bufsize)
2410 result = sock.recvmsg_into([buf], *args)
2411 self.registerRecvmsgResult(result)
2412 self.assertGreaterEqual(result[0], 0)
2413 self.assertLessEqual(result[0], bufsize)
2414 return (bytes(buf[:result[0]]),) + result[1:]
2415
2416
2417class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2418 # Defines flags to be checked in msg_flags for datagram sockets.
2419
2420 @property
2421 def msg_flags_non_eor_indicator(self):
2422 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2423
2424
2425class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2426 # Defines flags to be checked in msg_flags for SCTP sockets.
2427
2428 @property
2429 def msg_flags_eor_indicator(self):
2430 return super().msg_flags_eor_indicator | socket.MSG_EOR
2431
2432
2433class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2434 # Base class for tests on connectionless-mode sockets. Users must
2435 # supply sockets on attributes cli and serv to be mapped to
2436 # cli_sock and serv_sock respectively.
2437
2438 @property
2439 def serv_sock(self):
2440 return self.serv
2441
2442 @property
2443 def cli_sock(self):
2444 return self.cli
2445
2446 @property
2447 def sendmsg_to_server_defaults(self):
2448 return ([], [], 0, self.serv_addr)
2449
2450 def sendToServer(self, msg):
2451 return self.cli_sock.sendto(msg, self.serv_addr)
2452
2453
2454class SendrecvmsgConnectedBase(SendrecvmsgBase):
2455 # Base class for tests on connected sockets. Users must supply
2456 # sockets on attributes serv_conn and cli_conn (representing the
2457 # connections *to* the server and the client), to be mapped to
2458 # cli_sock and serv_sock respectively.
2459
2460 @property
2461 def serv_sock(self):
2462 return self.cli_conn
2463
2464 @property
2465 def cli_sock(self):
2466 return self.serv_conn
2467
2468 def checkRecvmsgAddress(self, addr1, addr2):
2469 # Address is currently "unspecified" for a connected socket,
2470 # so we don't examine it
2471 pass
2472
2473
2474class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2475 # Base class to set a timeout on server's socket.
2476
2477 def setUp(self):
2478 super().setUp()
2479 self.serv_sock.settimeout(self.fail_timeout)
2480
2481
2482class SendmsgTests(SendrecvmsgServerTimeoutBase):
2483 # Tests for sendmsg() which can use any socket type and do not
2484 # involve recvmsg() or recvmsg_into().
2485
2486 def testSendmsg(self):
2487 # Send a simple message with sendmsg().
2488 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2489
2490 def _testSendmsg(self):
2491 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2492
2493 def testSendmsgDataGenerator(self):
2494 # Send from buffer obtained from a generator (not a sequence).
2495 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2496
2497 def _testSendmsgDataGenerator(self):
2498 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2499 len(MSG))
2500
2501 def testSendmsgAncillaryGenerator(self):
2502 # Gather (empty) ancillary data from a generator.
2503 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2504
2505 def _testSendmsgAncillaryGenerator(self):
2506 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2507 len(MSG))
2508
2509 def testSendmsgArray(self):
2510 # Send data from an array instead of the usual bytes object.
2511 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2512
2513 def _testSendmsgArray(self):
2514 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2515 len(MSG))
2516
2517 def testSendmsgGather(self):
2518 # Send message data from more than one buffer (gather write).
2519 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2520
2521 def _testSendmsgGather(self):
2522 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2523
2524 def testSendmsgBadArgs(self):
2525 # Check that sendmsg() rejects invalid arguments.
2526 self.assertEqual(self.serv_sock.recv(1000), b"done")
2527
2528 def _testSendmsgBadArgs(self):
2529 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2530 self.assertRaises(TypeError, self.sendmsgToServer,
2531 b"not in an iterable")
2532 self.assertRaises(TypeError, self.sendmsgToServer,
2533 object())
2534 self.assertRaises(TypeError, self.sendmsgToServer,
2535 [object()])
2536 self.assertRaises(TypeError, self.sendmsgToServer,
2537 [MSG, object()])
2538 self.assertRaises(TypeError, self.sendmsgToServer,
2539 [MSG], object())
2540 self.assertRaises(TypeError, self.sendmsgToServer,
2541 [MSG], [], object())
2542 self.assertRaises(TypeError, self.sendmsgToServer,
2543 [MSG], [], 0, object())
2544 self.sendToServer(b"done")
2545
2546 def testSendmsgBadCmsg(self):
2547 # Check that invalid ancillary data items are rejected.
2548 self.assertEqual(self.serv_sock.recv(1000), b"done")
2549
2550 def _testSendmsgBadCmsg(self):
2551 self.assertRaises(TypeError, self.sendmsgToServer,
2552 [MSG], [object()])
2553 self.assertRaises(TypeError, self.sendmsgToServer,
2554 [MSG], [(object(), 0, b"data")])
2555 self.assertRaises(TypeError, self.sendmsgToServer,
2556 [MSG], [(0, object(), b"data")])
2557 self.assertRaises(TypeError, self.sendmsgToServer,
2558 [MSG], [(0, 0, object())])
2559 self.assertRaises(TypeError, self.sendmsgToServer,
2560 [MSG], [(0, 0)])
2561 self.assertRaises(TypeError, self.sendmsgToServer,
2562 [MSG], [(0, 0, b"data", 42)])
2563 self.sendToServer(b"done")
2564
2565 @requireAttrs(socket, "CMSG_SPACE")
2566 def testSendmsgBadMultiCmsg(self):
2567 # Check that invalid ancillary data items are rejected when
2568 # more than one item is present.
2569 self.assertEqual(self.serv_sock.recv(1000), b"done")
2570
2571 @testSendmsgBadMultiCmsg.client_skip
2572 def _testSendmsgBadMultiCmsg(self):
2573 self.assertRaises(TypeError, self.sendmsgToServer,
2574 [MSG], [0, 0, b""])
2575 self.assertRaises(TypeError, self.sendmsgToServer,
2576 [MSG], [(0, 0, b""), object()])
2577 self.sendToServer(b"done")
2578
2579 def testSendmsgExcessCmsgReject(self):
2580 # Check that sendmsg() rejects excess ancillary data items
2581 # when the number that can be sent is limited.
2582 self.assertEqual(self.serv_sock.recv(1000), b"done")
2583
2584 def _testSendmsgExcessCmsgReject(self):
2585 if not hasattr(socket, "CMSG_SPACE"):
2586 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002587 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002588 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2589 self.assertIsNone(cm.exception.errno)
2590 self.sendToServer(b"done")
2591
2592 def testSendmsgAfterClose(self):
2593 # Check that sendmsg() fails on a closed socket.
2594 pass
2595
2596 def _testSendmsgAfterClose(self):
2597 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002598 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002599
2600
2601class SendmsgStreamTests(SendmsgTests):
2602 # Tests for sendmsg() which require a stream socket and do not
2603 # involve recvmsg() or recvmsg_into().
2604
2605 def testSendmsgExplicitNoneAddr(self):
2606 # Check that peer address can be specified as None.
2607 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2608
2609 def _testSendmsgExplicitNoneAddr(self):
2610 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2611
2612 def testSendmsgTimeout(self):
2613 # Check that timeout works with sendmsg().
2614 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2615 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2616
2617 def _testSendmsgTimeout(self):
2618 try:
2619 self.cli_sock.settimeout(0.03)
Miss Islington (bot)ef1173a2018-09-25 08:49:28 -07002620 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002621 while True:
2622 self.sendmsgToServer([b"a"*512])
Miss Islington (bot)ef1173a2018-09-25 08:49:28 -07002623 except socket.timeout:
2624 pass
2625 except OSError as exc:
2626 if exc.errno != errno.ENOMEM:
2627 raise
2628 # bpo-33937 the test randomly fails on Travis CI with
2629 # "OSError: [Errno 12] Cannot allocate memory"
2630 else:
2631 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002632 finally:
2633 self.misc_event.set()
2634
2635 # XXX: would be nice to have more tests for sendmsg flags argument.
2636
2637 # Linux supports MSG_DONTWAIT when sending, but in general, it
2638 # only works when receiving. Could add other platforms if they
2639 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002640 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002641 "MSG_DONTWAIT not known to work on this platform when "
2642 "sending")
2643 def testSendmsgDontWait(self):
2644 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2645 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2646 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2647
2648 @testSendmsgDontWait.client_skip
2649 def _testSendmsgDontWait(self):
2650 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002651 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002652 while True:
2653 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Miss Islington (bot)ef1173a2018-09-25 08:49:28 -07002654 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2655 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002656 self.assertIn(cm.exception.errno,
Miss Islington (bot)ef1173a2018-09-25 08:49:28 -07002657 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002658 finally:
2659 self.misc_event.set()
2660
2661
2662class SendmsgConnectionlessTests(SendmsgTests):
2663 # Tests for sendmsg() which require a connectionless-mode
2664 # (e.g. datagram) socket, and do not involve recvmsg() or
2665 # recvmsg_into().
2666
2667 def testSendmsgNoDestAddr(self):
2668 # Check that sendmsg() fails when no destination address is
2669 # given for unconnected socket.
2670 pass
2671
2672 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002673 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002674 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002675 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002676 [MSG], [], 0, None)
2677
2678
2679class RecvmsgGenericTests(SendrecvmsgBase):
2680 # Tests for recvmsg() which can also be emulated using
2681 # recvmsg_into(), and can use any socket type.
2682
2683 def testRecvmsg(self):
2684 # Receive a simple message with recvmsg[_into]().
2685 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2686 self.assertEqual(msg, MSG)
2687 self.checkRecvmsgAddress(addr, self.cli_addr)
2688 self.assertEqual(ancdata, [])
2689 self.checkFlags(flags, eor=True)
2690
2691 def _testRecvmsg(self):
2692 self.sendToServer(MSG)
2693
2694 def testRecvmsgExplicitDefaults(self):
2695 # Test recvmsg[_into]() with default arguments provided explicitly.
2696 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2697 len(MSG), 0, 0)
2698 self.assertEqual(msg, MSG)
2699 self.checkRecvmsgAddress(addr, self.cli_addr)
2700 self.assertEqual(ancdata, [])
2701 self.checkFlags(flags, eor=True)
2702
2703 def _testRecvmsgExplicitDefaults(self):
2704 self.sendToServer(MSG)
2705
2706 def testRecvmsgShorter(self):
2707 # Receive a message smaller than buffer.
2708 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2709 len(MSG) + 42)
2710 self.assertEqual(msg, MSG)
2711 self.checkRecvmsgAddress(addr, self.cli_addr)
2712 self.assertEqual(ancdata, [])
2713 self.checkFlags(flags, eor=True)
2714
2715 def _testRecvmsgShorter(self):
2716 self.sendToServer(MSG)
2717
2718 def testRecvmsgTrunc(self):
2719 # Receive part of message, check for truncation indicators.
2720 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2721 len(MSG) - 3)
2722 self.assertEqual(msg, MSG[:-3])
2723 self.checkRecvmsgAddress(addr, self.cli_addr)
2724 self.assertEqual(ancdata, [])
2725 self.checkFlags(flags, eor=False)
2726
2727 def _testRecvmsgTrunc(self):
2728 self.sendToServer(MSG)
2729
2730 def testRecvmsgShortAncillaryBuf(self):
2731 # Test ancillary data buffer too small to hold any ancillary data.
2732 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2733 len(MSG), 1)
2734 self.assertEqual(msg, MSG)
2735 self.checkRecvmsgAddress(addr, self.cli_addr)
2736 self.assertEqual(ancdata, [])
2737 self.checkFlags(flags, eor=True)
2738
2739 def _testRecvmsgShortAncillaryBuf(self):
2740 self.sendToServer(MSG)
2741
2742 def testRecvmsgLongAncillaryBuf(self):
2743 # Test large ancillary data buffer.
2744 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2745 len(MSG), 10240)
2746 self.assertEqual(msg, MSG)
2747 self.checkRecvmsgAddress(addr, self.cli_addr)
2748 self.assertEqual(ancdata, [])
2749 self.checkFlags(flags, eor=True)
2750
2751 def _testRecvmsgLongAncillaryBuf(self):
2752 self.sendToServer(MSG)
2753
2754 def testRecvmsgAfterClose(self):
2755 # Check that recvmsg[_into]() fails on a closed socket.
2756 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002757 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002758
2759 def _testRecvmsgAfterClose(self):
2760 pass
2761
2762 def testRecvmsgTimeout(self):
2763 # Check that timeout works.
2764 try:
2765 self.serv_sock.settimeout(0.03)
2766 self.assertRaises(socket.timeout,
2767 self.doRecvmsg, self.serv_sock, len(MSG))
2768 finally:
2769 self.misc_event.set()
2770
2771 def _testRecvmsgTimeout(self):
2772 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2773
2774 @requireAttrs(socket, "MSG_PEEK")
2775 def testRecvmsgPeek(self):
2776 # Check that MSG_PEEK in flags enables examination of pending
2777 # data without consuming it.
2778
2779 # Receive part of data with MSG_PEEK.
2780 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2781 len(MSG) - 3, 0,
2782 socket.MSG_PEEK)
2783 self.assertEqual(msg, MSG[:-3])
2784 self.checkRecvmsgAddress(addr, self.cli_addr)
2785 self.assertEqual(ancdata, [])
2786 # Ignoring MSG_TRUNC here (so this test is the same for stream
2787 # and datagram sockets). Some wording in POSIX seems to
2788 # suggest that it needn't be set when peeking, but that may
2789 # just be a slip.
2790 self.checkFlags(flags, eor=False,
2791 ignore=getattr(socket, "MSG_TRUNC", 0))
2792
2793 # Receive all data with MSG_PEEK.
2794 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2795 len(MSG), 0,
2796 socket.MSG_PEEK)
2797 self.assertEqual(msg, MSG)
2798 self.checkRecvmsgAddress(addr, self.cli_addr)
2799 self.assertEqual(ancdata, [])
2800 self.checkFlags(flags, eor=True)
2801
2802 # Check that the same data can still be received normally.
2803 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2804 self.assertEqual(msg, MSG)
2805 self.checkRecvmsgAddress(addr, self.cli_addr)
2806 self.assertEqual(ancdata, [])
2807 self.checkFlags(flags, eor=True)
2808
2809 @testRecvmsgPeek.client_skip
2810 def _testRecvmsgPeek(self):
2811 self.sendToServer(MSG)
2812
2813 @requireAttrs(socket.socket, "sendmsg")
2814 def testRecvmsgFromSendmsg(self):
2815 # Test receiving with recvmsg[_into]() when message is sent
2816 # using sendmsg().
2817 self.serv_sock.settimeout(self.fail_timeout)
2818 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2819 self.assertEqual(msg, MSG)
2820 self.checkRecvmsgAddress(addr, self.cli_addr)
2821 self.assertEqual(ancdata, [])
2822 self.checkFlags(flags, eor=True)
2823
2824 @testRecvmsgFromSendmsg.client_skip
2825 def _testRecvmsgFromSendmsg(self):
2826 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2827
2828
2829class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2830 # Tests which require a stream socket and can use either recvmsg()
2831 # or recvmsg_into().
2832
2833 def testRecvmsgEOF(self):
2834 # Receive end-of-stream indicator (b"", peer socket closed).
2835 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2836 self.assertEqual(msg, b"")
2837 self.checkRecvmsgAddress(addr, self.cli_addr)
2838 self.assertEqual(ancdata, [])
2839 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2840
2841 def _testRecvmsgEOF(self):
2842 self.cli_sock.close()
2843
2844 def testRecvmsgOverflow(self):
2845 # Receive a message in more than one chunk.
2846 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2847 len(MSG) - 3)
2848 self.checkRecvmsgAddress(addr, self.cli_addr)
2849 self.assertEqual(ancdata, [])
2850 self.checkFlags(flags, eor=False)
2851
2852 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2853 self.checkRecvmsgAddress(addr, self.cli_addr)
2854 self.assertEqual(ancdata, [])
2855 self.checkFlags(flags, eor=True)
2856
2857 msg = seg1 + seg2
2858 self.assertEqual(msg, MSG)
2859
2860 def _testRecvmsgOverflow(self):
2861 self.sendToServer(MSG)
2862
2863
2864class RecvmsgTests(RecvmsgGenericTests):
2865 # Tests for recvmsg() which can use any socket type.
2866
2867 def testRecvmsgBadArgs(self):
2868 # Check that recvmsg() rejects invalid arguments.
2869 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2870 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2871 -1, 0, 0)
2872 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2873 len(MSG), -1, 0)
2874 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2875 [bytearray(10)], 0, 0)
2876 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2877 object(), 0, 0)
2878 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2879 len(MSG), object(), 0)
2880 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2881 len(MSG), 0, object())
2882
2883 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2884 self.assertEqual(msg, MSG)
2885 self.checkRecvmsgAddress(addr, self.cli_addr)
2886 self.assertEqual(ancdata, [])
2887 self.checkFlags(flags, eor=True)
2888
2889 def _testRecvmsgBadArgs(self):
2890 self.sendToServer(MSG)
2891
2892
2893class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2894 # Tests for recvmsg_into() which can use any socket type.
2895
2896 def testRecvmsgIntoBadArgs(self):
2897 # Check that recvmsg_into() rejects invalid arguments.
2898 buf = bytearray(len(MSG))
2899 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2900 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2901 len(MSG), 0, 0)
2902 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2903 buf, 0, 0)
2904 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2905 [object()], 0, 0)
2906 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2907 [b"I'm not writable"], 0, 0)
2908 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2909 [buf, object()], 0, 0)
2910 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2911 [buf], -1, 0)
2912 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2913 [buf], object(), 0)
2914 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2915 [buf], 0, object())
2916
2917 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2918 self.assertEqual(nbytes, len(MSG))
2919 self.assertEqual(buf, bytearray(MSG))
2920 self.checkRecvmsgAddress(addr, self.cli_addr)
2921 self.assertEqual(ancdata, [])
2922 self.checkFlags(flags, eor=True)
2923
2924 def _testRecvmsgIntoBadArgs(self):
2925 self.sendToServer(MSG)
2926
2927 def testRecvmsgIntoGenerator(self):
2928 # Receive into buffer obtained from a generator (not a sequence).
2929 buf = bytearray(len(MSG))
2930 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2931 (o for o in [buf]))
2932 self.assertEqual(nbytes, len(MSG))
2933 self.assertEqual(buf, bytearray(MSG))
2934 self.checkRecvmsgAddress(addr, self.cli_addr)
2935 self.assertEqual(ancdata, [])
2936 self.checkFlags(flags, eor=True)
2937
2938 def _testRecvmsgIntoGenerator(self):
2939 self.sendToServer(MSG)
2940
2941 def testRecvmsgIntoArray(self):
2942 # Receive into an array rather than the usual bytearray.
2943 buf = array.array("B", [0] * len(MSG))
2944 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2945 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002946 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002947 self.checkRecvmsgAddress(addr, self.cli_addr)
2948 self.assertEqual(ancdata, [])
2949 self.checkFlags(flags, eor=True)
2950
2951 def _testRecvmsgIntoArray(self):
2952 self.sendToServer(MSG)
2953
2954 def testRecvmsgIntoScatter(self):
2955 # Receive into multiple buffers (scatter write).
2956 b1 = bytearray(b"----")
2957 b2 = bytearray(b"0123456789")
2958 b3 = bytearray(b"--------------")
2959 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2960 [b1, memoryview(b2)[2:9], b3])
2961 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2962 self.assertEqual(b1, bytearray(b"Mary"))
2963 self.assertEqual(b2, bytearray(b"01 had a 9"))
2964 self.assertEqual(b3, bytearray(b"little lamb---"))
2965 self.checkRecvmsgAddress(addr, self.cli_addr)
2966 self.assertEqual(ancdata, [])
2967 self.checkFlags(flags, eor=True)
2968
2969 def _testRecvmsgIntoScatter(self):
2970 self.sendToServer(b"Mary had a little lamb")
2971
2972
2973class CmsgMacroTests(unittest.TestCase):
2974 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2975 # assumptions used by sendmsg() and recvmsg[_into](), which share
2976 # code with these functions.
2977
2978 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002979 try:
2980 import _testcapi
2981 except ImportError:
2982 socklen_t_limit = 0x7fffffff
2983 else:
2984 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002985
2986 @requireAttrs(socket, "CMSG_LEN")
2987 def testCMSG_LEN(self):
2988 # Test CMSG_LEN() with various valid and invalid values,
2989 # checking the assumptions used by recvmsg() and sendmsg().
2990 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2991 values = list(range(257)) + list(range(toobig - 257, toobig))
2992
2993 # struct cmsghdr has at least three members, two of which are ints
2994 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2995 for n in values:
2996 ret = socket.CMSG_LEN(n)
2997 # This is how recvmsg() calculates the data size
2998 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2999 self.assertLessEqual(ret, self.socklen_t_limit)
3000
3001 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3002 # sendmsg() shares code with these functions, and requires
3003 # that it reject values over the limit.
3004 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3005 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3006
3007 @requireAttrs(socket, "CMSG_SPACE")
3008 def testCMSG_SPACE(self):
3009 # Test CMSG_SPACE() with various valid and invalid values,
3010 # checking the assumptions used by sendmsg().
3011 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3012 values = list(range(257)) + list(range(toobig - 257, toobig))
3013
3014 last = socket.CMSG_SPACE(0)
3015 # struct cmsghdr has at least three members, two of which are ints
3016 self.assertGreater(last, array.array("i").itemsize * 2)
3017 for n in values:
3018 ret = socket.CMSG_SPACE(n)
3019 self.assertGreaterEqual(ret, last)
3020 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3021 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3022 self.assertLessEqual(ret, self.socklen_t_limit)
3023 last = ret
3024
3025 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3026 # sendmsg() shares code with these functions, and requires
3027 # that it reject values over the limit.
3028 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3029 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3030
3031
3032class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3033 # Tests for file descriptor passing on Unix-domain sockets.
3034
3035 # Invalid file descriptor value that's unlikely to evaluate to a
3036 # real FD even if one of its bytes is replaced with a different
3037 # value (which shouldn't actually happen).
3038 badfd = -0x5555
3039
3040 def newFDs(self, n):
3041 # Return a list of n file descriptors for newly-created files
3042 # containing their list indices as ASCII numbers.
3043 fds = []
3044 for i in range(n):
3045 fd, path = tempfile.mkstemp()
3046 self.addCleanup(os.unlink, path)
3047 self.addCleanup(os.close, fd)
3048 os.write(fd, str(i).encode())
3049 fds.append(fd)
3050 return fds
3051
3052 def checkFDs(self, fds):
3053 # Check that the file descriptors in the given list contain
3054 # their correct list indices as ASCII numbers.
3055 for n, fd in enumerate(fds):
3056 os.lseek(fd, 0, os.SEEK_SET)
3057 self.assertEqual(os.read(fd, 1024), str(n).encode())
3058
3059 def registerRecvmsgResult(self, result):
3060 self.addCleanup(self.closeRecvmsgFDs, result)
3061
3062 def closeRecvmsgFDs(self, recvmsg_result):
3063 # Close all file descriptors specified in the ancillary data
3064 # of the given return value from recvmsg() or recvmsg_into().
3065 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3066 if (cmsg_level == socket.SOL_SOCKET and
3067 cmsg_type == socket.SCM_RIGHTS):
3068 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003069 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003070 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3071 for fd in fds:
3072 os.close(fd)
3073
3074 def createAndSendFDs(self, n):
3075 # Send n new file descriptors created by newFDs() to the
3076 # server, with the constant MSG as the non-ancillary data.
3077 self.assertEqual(
3078 self.sendmsgToServer([MSG],
3079 [(socket.SOL_SOCKET,
3080 socket.SCM_RIGHTS,
3081 array.array("i", self.newFDs(n)))]),
3082 len(MSG))
3083
3084 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3085 # Check that constant MSG was received with numfds file
3086 # descriptors in a maximum of maxcmsgs control messages (which
3087 # must contain only complete integers). By default, check
3088 # that MSG_CTRUNC is unset, but ignore any flags in
3089 # ignoreflags.
3090 msg, ancdata, flags, addr = result
3091 self.assertEqual(msg, MSG)
3092 self.checkRecvmsgAddress(addr, self.cli_addr)
3093 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3094 ignore=ignoreflags)
3095
3096 self.assertIsInstance(ancdata, list)
3097 self.assertLessEqual(len(ancdata), maxcmsgs)
3098 fds = array.array("i")
3099 for item in ancdata:
3100 self.assertIsInstance(item, tuple)
3101 cmsg_level, cmsg_type, cmsg_data = item
3102 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3103 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3104 self.assertIsInstance(cmsg_data, bytes)
3105 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003106 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003107
3108 self.assertEqual(len(fds), numfds)
3109 self.checkFDs(fds)
3110
3111 def testFDPassSimple(self):
3112 # Pass a single FD (array read from bytes object).
3113 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3114 len(MSG), 10240))
3115
3116 def _testFDPassSimple(self):
3117 self.assertEqual(
3118 self.sendmsgToServer(
3119 [MSG],
3120 [(socket.SOL_SOCKET,
3121 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003122 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003123 len(MSG))
3124
3125 def testMultipleFDPass(self):
3126 # Pass multiple FDs in a single array.
3127 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3128 len(MSG), 10240))
3129
3130 def _testMultipleFDPass(self):
3131 self.createAndSendFDs(4)
3132
3133 @requireAttrs(socket, "CMSG_SPACE")
3134 def testFDPassCMSG_SPACE(self):
3135 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3136 self.checkRecvmsgFDs(
3137 4, self.doRecvmsg(self.serv_sock, len(MSG),
3138 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3139
3140 @testFDPassCMSG_SPACE.client_skip
3141 def _testFDPassCMSG_SPACE(self):
3142 self.createAndSendFDs(4)
3143
3144 def testFDPassCMSG_LEN(self):
3145 # Test using CMSG_LEN() to calculate ancillary buffer size.
3146 self.checkRecvmsgFDs(1,
3147 self.doRecvmsg(self.serv_sock, len(MSG),
3148 socket.CMSG_LEN(4 * SIZEOF_INT)),
3149 # RFC 3542 says implementations may set
3150 # MSG_CTRUNC if there isn't enough space
3151 # for trailing padding.
3152 ignoreflags=socket.MSG_CTRUNC)
3153
3154 def _testFDPassCMSG_LEN(self):
3155 self.createAndSendFDs(1)
3156
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003157 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003158 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003159 @requireAttrs(socket, "CMSG_SPACE")
3160 def testFDPassSeparate(self):
3161 # Pass two FDs in two separate arrays. Arrays may be combined
3162 # into a single control message by the OS.
3163 self.checkRecvmsgFDs(2,
3164 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3165 maxcmsgs=2)
3166
3167 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003168 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003169 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003170 def _testFDPassSeparate(self):
3171 fd0, fd1 = self.newFDs(2)
3172 self.assertEqual(
3173 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3174 socket.SCM_RIGHTS,
3175 array.array("i", [fd0])),
3176 (socket.SOL_SOCKET,
3177 socket.SCM_RIGHTS,
3178 array.array("i", [fd1]))]),
3179 len(MSG))
3180
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003181 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003182 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003183 @requireAttrs(socket, "CMSG_SPACE")
3184 def testFDPassSeparateMinSpace(self):
3185 # Pass two FDs in two separate arrays, receiving them into the
3186 # minimum space for two arrays.
Miss Islington (bot)addef072018-09-27 06:30:47 -07003187 num_fds = 2
3188 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003189 self.doRecvmsg(self.serv_sock, len(MSG),
3190 socket.CMSG_SPACE(SIZEOF_INT) +
Miss Islington (bot)addef072018-09-27 06:30:47 -07003191 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003192 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3193
3194 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003195 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003196 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003197 def _testFDPassSeparateMinSpace(self):
3198 fd0, fd1 = self.newFDs(2)
3199 self.assertEqual(
3200 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3201 socket.SCM_RIGHTS,
3202 array.array("i", [fd0])),
3203 (socket.SOL_SOCKET,
3204 socket.SCM_RIGHTS,
3205 array.array("i", [fd1]))]),
3206 len(MSG))
3207
3208 def sendAncillaryIfPossible(self, msg, ancdata):
3209 # Try to send msg and ancdata to server, but if the system
3210 # call fails, just send msg with no ancillary data.
3211 try:
3212 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003213 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003214 # Check that it was the system call that failed
3215 self.assertIsInstance(e.errno, int)
3216 nbytes = self.sendmsgToServer([msg])
3217 self.assertEqual(nbytes, len(msg))
3218
Brett Cannon3bbad122015-12-28 17:21:44 -08003219 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003220 def testFDPassEmpty(self):
3221 # Try to pass an empty FD array. Can receive either no array
3222 # or an empty array.
3223 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3224 len(MSG), 10240),
3225 ignoreflags=socket.MSG_CTRUNC)
3226
3227 def _testFDPassEmpty(self):
3228 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3229 socket.SCM_RIGHTS,
3230 b"")])
3231
3232 def testFDPassPartialInt(self):
3233 # Try to pass a truncated FD array.
3234 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3235 len(MSG), 10240)
3236 self.assertEqual(msg, MSG)
3237 self.checkRecvmsgAddress(addr, self.cli_addr)
3238 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3239 self.assertLessEqual(len(ancdata), 1)
3240 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3241 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3242 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3243 self.assertLess(len(cmsg_data), SIZEOF_INT)
3244
3245 def _testFDPassPartialInt(self):
3246 self.sendAncillaryIfPossible(
3247 MSG,
3248 [(socket.SOL_SOCKET,
3249 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003250 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003251
3252 @requireAttrs(socket, "CMSG_SPACE")
3253 def testFDPassPartialIntInMiddle(self):
3254 # Try to pass two FD arrays, the first of which is truncated.
3255 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3256 len(MSG), 10240)
3257 self.assertEqual(msg, MSG)
3258 self.checkRecvmsgAddress(addr, self.cli_addr)
3259 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3260 self.assertLessEqual(len(ancdata), 2)
3261 fds = array.array("i")
3262 # Arrays may have been combined in a single control message
3263 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3264 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3265 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003266 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003267 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3268 self.assertLessEqual(len(fds), 2)
3269 self.checkFDs(fds)
3270
3271 @testFDPassPartialIntInMiddle.client_skip
3272 def _testFDPassPartialIntInMiddle(self):
3273 fd0, fd1 = self.newFDs(2)
3274 self.sendAncillaryIfPossible(
3275 MSG,
3276 [(socket.SOL_SOCKET,
3277 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003278 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003279 (socket.SOL_SOCKET,
3280 socket.SCM_RIGHTS,
3281 array.array("i", [fd1]))])
3282
3283 def checkTruncatedHeader(self, result, ignoreflags=0):
3284 # Check that no ancillary data items are returned when data is
3285 # truncated inside the cmsghdr structure.
3286 msg, ancdata, flags, addr = result
3287 self.assertEqual(msg, MSG)
3288 self.checkRecvmsgAddress(addr, self.cli_addr)
3289 self.assertEqual(ancdata, [])
3290 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3291 ignore=ignoreflags)
3292
3293 def testCmsgTruncNoBufSize(self):
3294 # Check that no ancillary data is received when no buffer size
3295 # is specified.
3296 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3297 # BSD seems to set MSG_CTRUNC only
3298 # if an item has been partially
3299 # received.
3300 ignoreflags=socket.MSG_CTRUNC)
3301
3302 def _testCmsgTruncNoBufSize(self):
3303 self.createAndSendFDs(1)
3304
3305 def testCmsgTrunc0(self):
3306 # Check that no ancillary data is received when buffer size is 0.
3307 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3308 ignoreflags=socket.MSG_CTRUNC)
3309
3310 def _testCmsgTrunc0(self):
3311 self.createAndSendFDs(1)
3312
3313 # Check that no ancillary data is returned for various non-zero
3314 # (but still too small) buffer sizes.
3315
3316 def testCmsgTrunc1(self):
3317 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3318
3319 def _testCmsgTrunc1(self):
3320 self.createAndSendFDs(1)
3321
3322 def testCmsgTrunc2Int(self):
3323 # The cmsghdr structure has at least three members, two of
3324 # which are ints, so we still shouldn't see any ancillary
3325 # data.
3326 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3327 SIZEOF_INT * 2))
3328
3329 def _testCmsgTrunc2Int(self):
3330 self.createAndSendFDs(1)
3331
3332 def testCmsgTruncLen0Minus1(self):
3333 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3334 socket.CMSG_LEN(0) - 1))
3335
3336 def _testCmsgTruncLen0Minus1(self):
3337 self.createAndSendFDs(1)
3338
3339 # The following tests try to truncate the control message in the
3340 # middle of the FD array.
3341
3342 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3343 # Check that file descriptor data is truncated to between
3344 # mindata and maxdata bytes when received with buffer size
3345 # ancbuf, and that any complete file descriptor numbers are
3346 # valid.
3347 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3348 len(MSG), ancbuf)
3349 self.assertEqual(msg, MSG)
3350 self.checkRecvmsgAddress(addr, self.cli_addr)
3351 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3352
3353 if mindata == 0 and ancdata == []:
3354 return
3355 self.assertEqual(len(ancdata), 1)
3356 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3357 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3358 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3359 self.assertGreaterEqual(len(cmsg_data), mindata)
3360 self.assertLessEqual(len(cmsg_data), maxdata)
3361 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003362 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003363 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3364 self.checkFDs(fds)
3365
3366 def testCmsgTruncLen0(self):
3367 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3368
3369 def _testCmsgTruncLen0(self):
3370 self.createAndSendFDs(1)
3371
3372 def testCmsgTruncLen0Plus1(self):
3373 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3374
3375 def _testCmsgTruncLen0Plus1(self):
3376 self.createAndSendFDs(2)
3377
3378 def testCmsgTruncLen1(self):
3379 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3380 maxdata=SIZEOF_INT)
3381
3382 def _testCmsgTruncLen1(self):
3383 self.createAndSendFDs(2)
3384
3385 def testCmsgTruncLen2Minus1(self):
3386 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3387 maxdata=(2 * SIZEOF_INT) - 1)
3388
3389 def _testCmsgTruncLen2Minus1(self):
3390 self.createAndSendFDs(2)
3391
3392
3393class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3394 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3395 # features of the RFC 3542 Advanced Sockets API for IPv6.
3396 # Currently we can only handle certain data items (e.g. traffic
3397 # class, hop limit, MTU discovery and fragmentation settings)
3398 # without resorting to unportable means such as the struct module,
3399 # but the tests here are aimed at testing the ancillary data
3400 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3401 # itself.
3402
3403 # Test value to use when setting hop limit of packet
3404 hop_limit = 2
3405
3406 # Test value to use when setting traffic class of packet.
3407 # -1 means "use kernel default".
3408 traffic_class = -1
3409
3410 def ancillaryMapping(self, ancdata):
3411 # Given ancillary data list ancdata, return a mapping from
3412 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3413 # Check that no (level, type) pair appears more than once.
3414 d = {}
3415 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3416 self.assertNotIn((cmsg_level, cmsg_type), d)
3417 d[(cmsg_level, cmsg_type)] = cmsg_data
3418 return d
3419
3420 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3421 # Receive hop limit into ancbufsize bytes of ancillary data
3422 # space. Check that data is MSG, ancillary data is not
3423 # truncated (but ignore any flags in ignoreflags), and hop
3424 # limit is between 0 and maxhop inclusive.
3425 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3426 socket.IPV6_RECVHOPLIMIT, 1)
3427 self.misc_event.set()
3428 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3429 len(MSG), ancbufsize)
3430
3431 self.assertEqual(msg, MSG)
3432 self.checkRecvmsgAddress(addr, self.cli_addr)
3433 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3434 ignore=ignoreflags)
3435
3436 self.assertEqual(len(ancdata), 1)
3437 self.assertIsInstance(ancdata[0], tuple)
3438 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3439 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3440 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3441 self.assertIsInstance(cmsg_data, bytes)
3442 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3443 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003444 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003445 self.assertGreaterEqual(a[0], 0)
3446 self.assertLessEqual(a[0], maxhop)
3447
3448 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3449 def testRecvHopLimit(self):
3450 # Test receiving the packet hop limit as ancillary data.
3451 self.checkHopLimit(ancbufsize=10240)
3452
3453 @testRecvHopLimit.client_skip
3454 def _testRecvHopLimit(self):
3455 # Need to wait until server has asked to receive ancillary
3456 # data, as implementations are not required to buffer it
3457 # otherwise.
3458 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3459 self.sendToServer(MSG)
3460
3461 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3462 def testRecvHopLimitCMSG_SPACE(self):
3463 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3464 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3465
3466 @testRecvHopLimitCMSG_SPACE.client_skip
3467 def _testRecvHopLimitCMSG_SPACE(self):
3468 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3469 self.sendToServer(MSG)
3470
3471 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3472 # 3542 says portable applications must provide space for trailing
3473 # padding. Implementations may set MSG_CTRUNC if there isn't
3474 # enough space for the padding.
3475
3476 @requireAttrs(socket.socket, "sendmsg")
3477 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3478 def testSetHopLimit(self):
3479 # Test setting hop limit on outgoing packet and receiving it
3480 # at the other end.
3481 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3482
3483 @testSetHopLimit.client_skip
3484 def _testSetHopLimit(self):
3485 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3486 self.assertEqual(
3487 self.sendmsgToServer([MSG],
3488 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3489 array.array("i", [self.hop_limit]))]),
3490 len(MSG))
3491
3492 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3493 ignoreflags=0):
3494 # Receive traffic class and hop limit into ancbufsize bytes of
3495 # ancillary data space. Check that data is MSG, ancillary
3496 # data is not truncated (but ignore any flags in ignoreflags),
3497 # and traffic class and hop limit are in range (hop limit no
3498 # more than maxhop).
3499 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3500 socket.IPV6_RECVHOPLIMIT, 1)
3501 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3502 socket.IPV6_RECVTCLASS, 1)
3503 self.misc_event.set()
3504 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3505 len(MSG), ancbufsize)
3506
3507 self.assertEqual(msg, MSG)
3508 self.checkRecvmsgAddress(addr, self.cli_addr)
3509 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3510 ignore=ignoreflags)
3511 self.assertEqual(len(ancdata), 2)
3512 ancmap = self.ancillaryMapping(ancdata)
3513
3514 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3515 self.assertEqual(len(tcdata), SIZEOF_INT)
3516 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003517 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003518 self.assertGreaterEqual(a[0], 0)
3519 self.assertLessEqual(a[0], 255)
3520
3521 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3522 self.assertEqual(len(hldata), SIZEOF_INT)
3523 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003524 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003525 self.assertGreaterEqual(a[0], 0)
3526 self.assertLessEqual(a[0], maxhop)
3527
3528 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3529 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3530 def testRecvTrafficClassAndHopLimit(self):
3531 # Test receiving traffic class and hop limit as ancillary data.
3532 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3533
3534 @testRecvTrafficClassAndHopLimit.client_skip
3535 def _testRecvTrafficClassAndHopLimit(self):
3536 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3537 self.sendToServer(MSG)
3538
3539 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3540 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3541 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3542 # Test receiving traffic class and hop limit, using
3543 # CMSG_SPACE() to calculate buffer size.
3544 self.checkTrafficClassAndHopLimit(
3545 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3546
3547 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3548 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3549 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3550 self.sendToServer(MSG)
3551
3552 @requireAttrs(socket.socket, "sendmsg")
3553 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3554 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3555 def testSetTrafficClassAndHopLimit(self):
3556 # Test setting traffic class and hop limit on outgoing packet,
3557 # and receiving them at the other end.
3558 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3559 maxhop=self.hop_limit)
3560
3561 @testSetTrafficClassAndHopLimit.client_skip
3562 def _testSetTrafficClassAndHopLimit(self):
3563 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3564 self.assertEqual(
3565 self.sendmsgToServer([MSG],
3566 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3567 array.array("i", [self.traffic_class])),
3568 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3569 array.array("i", [self.hop_limit]))]),
3570 len(MSG))
3571
3572 @requireAttrs(socket.socket, "sendmsg")
3573 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3574 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3575 def testOddCmsgSize(self):
3576 # Try to send ancillary data with first item one byte too
3577 # long. Fall back to sending with correct size if this fails,
3578 # and check that second item was handled correctly.
3579 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3580 maxhop=self.hop_limit)
3581
3582 @testOddCmsgSize.client_skip
3583 def _testOddCmsgSize(self):
3584 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3585 try:
3586 nbytes = self.sendmsgToServer(
3587 [MSG],
3588 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003589 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003590 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3591 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003592 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003593 self.assertIsInstance(e.errno, int)
3594 nbytes = self.sendmsgToServer(
3595 [MSG],
3596 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3597 array.array("i", [self.traffic_class])),
3598 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3599 array.array("i", [self.hop_limit]))])
3600 self.assertEqual(nbytes, len(MSG))
3601
3602 # Tests for proper handling of truncated ancillary data
3603
3604 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3605 # Receive hop limit into ancbufsize bytes of ancillary data
3606 # space, which should be too small to contain the ancillary
3607 # data header (if ancbufsize is None, pass no second argument
3608 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3609 # (unless included in ignoreflags), and no ancillary data is
3610 # returned.
3611 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3612 socket.IPV6_RECVHOPLIMIT, 1)
3613 self.misc_event.set()
3614 args = () if ancbufsize is None else (ancbufsize,)
3615 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3616 len(MSG), *args)
3617
3618 self.assertEqual(msg, MSG)
3619 self.checkRecvmsgAddress(addr, self.cli_addr)
3620 self.assertEqual(ancdata, [])
3621 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3622 ignore=ignoreflags)
3623
3624 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3625 def testCmsgTruncNoBufSize(self):
3626 # Check that no ancillary data is received when no ancillary
3627 # buffer size is provided.
3628 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3629 # BSD seems to set
3630 # MSG_CTRUNC only if an item
3631 # has been partially
3632 # received.
3633 ignoreflags=socket.MSG_CTRUNC)
3634
3635 @testCmsgTruncNoBufSize.client_skip
3636 def _testCmsgTruncNoBufSize(self):
3637 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3638 self.sendToServer(MSG)
3639
3640 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3641 def testSingleCmsgTrunc0(self):
3642 # Check that no ancillary data is received when ancillary
3643 # buffer size is zero.
3644 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3645 ignoreflags=socket.MSG_CTRUNC)
3646
3647 @testSingleCmsgTrunc0.client_skip
3648 def _testSingleCmsgTrunc0(self):
3649 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3650 self.sendToServer(MSG)
3651
3652 # Check that no ancillary data is returned for various non-zero
3653 # (but still too small) buffer sizes.
3654
3655 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3656 def testSingleCmsgTrunc1(self):
3657 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3658
3659 @testSingleCmsgTrunc1.client_skip
3660 def _testSingleCmsgTrunc1(self):
3661 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3662 self.sendToServer(MSG)
3663
3664 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3665 def testSingleCmsgTrunc2Int(self):
3666 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3667
3668 @testSingleCmsgTrunc2Int.client_skip
3669 def _testSingleCmsgTrunc2Int(self):
3670 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3671 self.sendToServer(MSG)
3672
3673 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3674 def testSingleCmsgTruncLen0Minus1(self):
3675 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3676
3677 @testSingleCmsgTruncLen0Minus1.client_skip
3678 def _testSingleCmsgTruncLen0Minus1(self):
3679 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3680 self.sendToServer(MSG)
3681
3682 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3683 def testSingleCmsgTruncInData(self):
3684 # Test truncation of a control message inside its associated
3685 # data. The message may be returned with its data truncated,
3686 # or not returned at all.
3687 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3688 socket.IPV6_RECVHOPLIMIT, 1)
3689 self.misc_event.set()
3690 msg, ancdata, flags, addr = self.doRecvmsg(
3691 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3692
3693 self.assertEqual(msg, MSG)
3694 self.checkRecvmsgAddress(addr, self.cli_addr)
3695 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3696
3697 self.assertLessEqual(len(ancdata), 1)
3698 if ancdata:
3699 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3700 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3701 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3702 self.assertLess(len(cmsg_data), SIZEOF_INT)
3703
3704 @testSingleCmsgTruncInData.client_skip
3705 def _testSingleCmsgTruncInData(self):
3706 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3707 self.sendToServer(MSG)
3708
3709 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3710 # Receive traffic class and hop limit into ancbufsize bytes of
3711 # ancillary data space, which should be large enough to
3712 # contain the first item, but too small to contain the header
3713 # of the second. Check that data is MSG, MSG_CTRUNC is set
3714 # (unless included in ignoreflags), and only one ancillary
3715 # data item is returned.
3716 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3717 socket.IPV6_RECVHOPLIMIT, 1)
3718 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3719 socket.IPV6_RECVTCLASS, 1)
3720 self.misc_event.set()
3721 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3722 len(MSG), ancbufsize)
3723
3724 self.assertEqual(msg, MSG)
3725 self.checkRecvmsgAddress(addr, self.cli_addr)
3726 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3727 ignore=ignoreflags)
3728
3729 self.assertEqual(len(ancdata), 1)
3730 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3731 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3732 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3733 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3734 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003735 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003736 self.assertGreaterEqual(a[0], 0)
3737 self.assertLessEqual(a[0], 255)
3738
3739 # Try the above test with various buffer sizes.
3740
3741 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3742 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3743 def testSecondCmsgTrunc0(self):
3744 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3745 ignoreflags=socket.MSG_CTRUNC)
3746
3747 @testSecondCmsgTrunc0.client_skip
3748 def _testSecondCmsgTrunc0(self):
3749 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3750 self.sendToServer(MSG)
3751
3752 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3753 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3754 def testSecondCmsgTrunc1(self):
3755 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3756
3757 @testSecondCmsgTrunc1.client_skip
3758 def _testSecondCmsgTrunc1(self):
3759 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3760 self.sendToServer(MSG)
3761
3762 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3763 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3764 def testSecondCmsgTrunc2Int(self):
3765 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3766 2 * SIZEOF_INT)
3767
3768 @testSecondCmsgTrunc2Int.client_skip
3769 def _testSecondCmsgTrunc2Int(self):
3770 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3771 self.sendToServer(MSG)
3772
3773 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3774 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3775 def testSecondCmsgTruncLen0Minus1(self):
3776 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3777 socket.CMSG_LEN(0) - 1)
3778
3779 @testSecondCmsgTruncLen0Minus1.client_skip
3780 def _testSecondCmsgTruncLen0Minus1(self):
3781 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3782 self.sendToServer(MSG)
3783
3784 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3785 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3786 def testSecomdCmsgTruncInData(self):
3787 # Test truncation of the second of two control messages inside
3788 # its associated data.
3789 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3790 socket.IPV6_RECVHOPLIMIT, 1)
3791 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3792 socket.IPV6_RECVTCLASS, 1)
3793 self.misc_event.set()
3794 msg, ancdata, flags, addr = self.doRecvmsg(
3795 self.serv_sock, len(MSG),
3796 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3797
3798 self.assertEqual(msg, MSG)
3799 self.checkRecvmsgAddress(addr, self.cli_addr)
3800 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3801
3802 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3803
3804 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3805 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3806 cmsg_types.remove(cmsg_type)
3807 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3808 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003809 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003810 self.assertGreaterEqual(a[0], 0)
3811 self.assertLessEqual(a[0], 255)
3812
3813 if ancdata:
3814 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3815 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3816 cmsg_types.remove(cmsg_type)
3817 self.assertLess(len(cmsg_data), SIZEOF_INT)
3818
3819 self.assertEqual(ancdata, [])
3820
3821 @testSecomdCmsgTruncInData.client_skip
3822 def _testSecomdCmsgTruncInData(self):
3823 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3824 self.sendToServer(MSG)
3825
3826
3827# Derive concrete test classes for different socket types.
3828
3829class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3830 SendrecvmsgConnectionlessBase,
3831 ThreadedSocketTestMixin, UDPTestBase):
3832 pass
3833
3834@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003835class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3836 pass
3837
3838@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003839class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3840 pass
3841
3842@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003843class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3844 pass
3845
3846
3847class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3848 SendrecvmsgConnectionlessBase,
3849 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003850
3851 def checkRecvmsgAddress(self, addr1, addr2):
3852 # Called to compare the received address with the address of
3853 # the peer, ignoring scope ID
3854 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003855
3856@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003857@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003858@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003859class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3860 pass
3861
3862@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003863@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003864@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003865class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3866 pass
3867
3868@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003869@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003870@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003871class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3872 pass
3873
3874@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003875@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003876@requireAttrs(socket, "IPPROTO_IPV6")
3877@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003878class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3879 SendrecvmsgUDP6TestBase):
3880 pass
3881
3882@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003883@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003884@requireAttrs(socket, "IPPROTO_IPV6")
3885@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003886class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3887 RFC3542AncillaryTest,
3888 SendrecvmsgUDP6TestBase):
3889 pass
3890
3891
3892class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3893 ConnectedStreamTestMixin, TCPTestBase):
3894 pass
3895
3896@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003897class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3898 pass
3899
3900@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003901class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3902 SendrecvmsgTCPTestBase):
3903 pass
3904
3905@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003906class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3907 SendrecvmsgTCPTestBase):
3908 pass
3909
3910
3911class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3912 SendrecvmsgConnectedBase,
3913 ConnectedStreamTestMixin, SCTPStreamBase):
3914 pass
3915
3916@requireAttrs(socket.socket, "sendmsg")
3917@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003918class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3919 pass
3920
3921@requireAttrs(socket.socket, "recvmsg")
3922@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003923class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3924 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003925
3926 def testRecvmsgEOF(self):
3927 try:
3928 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3929 except OSError as e:
3930 if e.errno != errno.ENOTCONN:
3931 raise
3932 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003933
3934@requireAttrs(socket.socket, "recvmsg_into")
3935@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003936class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3937 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003938
3939 def testRecvmsgEOF(self):
3940 try:
3941 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3942 except OSError as e:
3943 if e.errno != errno.ENOTCONN:
3944 raise
3945 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003946
3947
3948class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3949 ConnectedStreamTestMixin, UnixStreamBase):
3950 pass
3951
3952@requireAttrs(socket.socket, "sendmsg")
3953@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003954class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3955 pass
3956
3957@requireAttrs(socket.socket, "recvmsg")
3958@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003959class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3960 SendrecvmsgUnixStreamTestBase):
3961 pass
3962
3963@requireAttrs(socket.socket, "recvmsg_into")
3964@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003965class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3966 SendrecvmsgUnixStreamTestBase):
3967 pass
3968
3969@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3970@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003971class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3972 pass
3973
3974@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3975@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003976class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3977 SendrecvmsgUnixStreamTestBase):
3978 pass
3979
3980
3981# Test interrupting the interruptible send/receive methods with a
3982# signal when a timeout is set. These tests avoid having multiple
3983# threads alive during the test so that the OS cannot deliver the
3984# signal to the wrong one.
3985
3986class InterruptedTimeoutBase(unittest.TestCase):
3987 # Base class for interrupted send/receive tests. Installs an
3988 # empty handler for SIGALRM and removes it on teardown, along with
3989 # any scheduled alarms.
3990
3991 def setUp(self):
3992 super().setUp()
3993 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003994 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003995 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003996
3997 # Timeout for socket operations
3998 timeout = 4.0
3999
4000 # Provide setAlarm() method to schedule delivery of SIGALRM after
4001 # given number of seconds, or cancel it if zero, and an
4002 # appropriate time value to use. Use setitimer() if available.
4003 if hasattr(signal, "setitimer"):
4004 alarm_time = 0.05
4005
4006 def setAlarm(self, seconds):
4007 signal.setitimer(signal.ITIMER_REAL, seconds)
4008 else:
4009 # Old systems may deliver the alarm up to one second early
4010 alarm_time = 2
4011
4012 def setAlarm(self, seconds):
4013 signal.alarm(seconds)
4014
4015
4016# Require siginterrupt() in order to ensure that system calls are
4017# interrupted by default.
4018@requireAttrs(signal, "siginterrupt")
4019@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4020 "Don't have signal.alarm or signal.setitimer")
4021class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4022 # Test interrupting the recv*() methods with signals when a
4023 # timeout is set.
4024
4025 def setUp(self):
4026 super().setUp()
4027 self.serv.settimeout(self.timeout)
4028
4029 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004030 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004031 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004032 try:
4033 self.setAlarm(self.alarm_time)
4034 with self.assertRaises(ZeroDivisionError) as cm:
4035 func(*args, **kwargs)
4036 finally:
4037 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004038
4039 def testInterruptedRecvTimeout(self):
4040 self.checkInterruptedRecv(self.serv.recv, 1024)
4041
4042 def testInterruptedRecvIntoTimeout(self):
4043 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4044
4045 def testInterruptedRecvfromTimeout(self):
4046 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4047
4048 def testInterruptedRecvfromIntoTimeout(self):
4049 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4050
4051 @requireAttrs(socket.socket, "recvmsg")
4052 def testInterruptedRecvmsgTimeout(self):
4053 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4054
4055 @requireAttrs(socket.socket, "recvmsg_into")
4056 def testInterruptedRecvmsgIntoTimeout(self):
4057 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4058
4059
4060# Require siginterrupt() in order to ensure that system calls are
4061# interrupted by default.
4062@requireAttrs(signal, "siginterrupt")
4063@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4064 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004065class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4066 ThreadSafeCleanupTestCase,
4067 SocketListeningTestMixin, TCPTestBase):
4068 # Test interrupting the interruptible send*() methods with signals
4069 # when a timeout is set.
4070
4071 def setUp(self):
4072 super().setUp()
4073 self.serv_conn = self.newSocket()
4074 self.addCleanup(self.serv_conn.close)
4075 # Use a thread to complete the connection, but wait for it to
4076 # terminate before running the test, so that there is only one
4077 # thread to accept the signal.
4078 cli_thread = threading.Thread(target=self.doConnect)
4079 cli_thread.start()
4080 self.cli_conn, addr = self.serv.accept()
4081 self.addCleanup(self.cli_conn.close)
4082 cli_thread.join()
4083 self.serv_conn.settimeout(self.timeout)
4084
4085 def doConnect(self):
4086 self.serv_conn.connect(self.serv_addr)
4087
4088 def checkInterruptedSend(self, func, *args, **kwargs):
4089 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004090 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004091 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004092 try:
4093 with self.assertRaises(ZeroDivisionError) as cm:
4094 while True:
4095 self.setAlarm(self.alarm_time)
4096 func(*args, **kwargs)
4097 finally:
4098 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004099
Ned Deilyc5640382014-02-03 13:58:31 -08004100 # Issue #12958: The following tests have problems on OS X prior to 10.7
4101 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004102 def testInterruptedSendTimeout(self):
4103 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4104
Ned Deilyc5640382014-02-03 13:58:31 -08004105 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004106 def testInterruptedSendtoTimeout(self):
4107 # Passing an actual address here as Python's wrapper for
4108 # sendto() doesn't allow passing a zero-length one; POSIX
4109 # requires that the address is ignored since the socket is
4110 # connection-mode, however.
4111 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4112 self.serv_addr)
4113
Ned Deilyc5640382014-02-03 13:58:31 -08004114 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004115 @requireAttrs(socket.socket, "sendmsg")
4116 def testInterruptedSendmsgTimeout(self):
4117 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4118
4119
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004120class TCPCloserTest(ThreadedTCPSocketTest):
4121
4122 def testClose(self):
4123 conn, addr = self.serv.accept()
4124 conn.close()
4125
4126 sd = self.cli
4127 read, write, err = select.select([sd], [], [], 1.0)
4128 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004129 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004130
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004131 # Calling close() many times should be safe.
4132 conn.close()
4133 conn.close()
4134
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004135 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004136 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004137 time.sleep(1.0)
4138
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004139
Dave Cole331708b2004-08-09 04:51:41 +00004140class BasicSocketPairTest(SocketPairTest):
4141
4142 def __init__(self, methodName='runTest'):
4143 SocketPairTest.__init__(self, methodName=methodName)
4144
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004145 def _check_defaults(self, sock):
4146 self.assertIsInstance(sock, socket.socket)
4147 if hasattr(socket, 'AF_UNIX'):
4148 self.assertEqual(sock.family, socket.AF_UNIX)
4149 else:
4150 self.assertEqual(sock.family, socket.AF_INET)
4151 self.assertEqual(sock.type, socket.SOCK_STREAM)
4152 self.assertEqual(sock.proto, 0)
4153
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004154 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004155 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004156
4157 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004158 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004159
Dave Cole331708b2004-08-09 04:51:41 +00004160 def testRecv(self):
4161 msg = self.serv.recv(1024)
4162 self.assertEqual(msg, MSG)
4163
4164 def _testRecv(self):
4165 self.cli.send(MSG)
4166
4167 def testSend(self):
4168 self.serv.send(MSG)
4169
4170 def _testSend(self):
4171 msg = self.cli.recv(1024)
4172 self.assertEqual(msg, MSG)
4173
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004174
Guido van Rossum24e4af82002-06-12 19:18:08 +00004175class NonBlockingTCPTests(ThreadedTCPSocketTest):
4176
4177 def __init__(self, methodName='runTest'):
Miss Islington (bot)365f21c2018-11-30 03:48:17 -08004178 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004179 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4180
4181 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004182 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004183 self.serv.setblocking(True)
4184 self.assertIsNone(self.serv.gettimeout())
Yury Selivanovf11b4602018-01-28 17:27:38 -05004185 self.assertTrue(self.serv.getblocking())
4186 if fcntl:
4187 self.assertTrue(_is_fd_in_blocking_mode(self.serv))
4188
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004189 self.serv.setblocking(False)
4190 self.assertEqual(self.serv.gettimeout(), 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004191 self.assertFalse(self.serv.getblocking())
4192 if fcntl:
4193 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4194
4195 self.serv.settimeout(None)
4196 self.assertTrue(self.serv.getblocking())
4197 if fcntl:
4198 self.assertTrue(_is_fd_in_blocking_mode(self.serv))
4199
4200 self.serv.settimeout(0)
4201 self.assertFalse(self.serv.getblocking())
4202 self.assertEqual(self.serv.gettimeout(), 0)
4203 if fcntl:
4204 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4205
4206 self.serv.settimeout(10)
4207 self.assertTrue(self.serv.getblocking())
4208 self.assertEqual(self.serv.gettimeout(), 10)
4209 if fcntl:
4210 # When a Python socket has a non-zero timeout, it's
4211 # switched internally to a non-blocking mode.
4212 # Later, sock.sendall(), sock.recv(), and other socket
4213 # operations use a `select()` call and handle EWOULDBLOCK/EGAIN
4214 # on all socket operations. That's how timeouts are
4215 # enforced.
4216 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4217
4218 self.serv.settimeout(0)
4219 self.assertFalse(self.serv.getblocking())
4220 if fcntl:
4221 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4222
Guido van Rossum24e4af82002-06-12 19:18:08 +00004223 start = time.time()
4224 try:
4225 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004226 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004227 pass
4228 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004229 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00004230
4231 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004232 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004233
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004234 @support.cpython_only
4235 def testSetBlocking_overflow(self):
4236 # Issue 15989
4237 import _testcapi
4238 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4239 self.skipTest('needs UINT_MAX < ULONG_MAX')
4240 self.serv.setblocking(False)
4241 self.assertEqual(self.serv.gettimeout(), 0.0)
4242 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4243 self.assertIsNone(self.serv.gettimeout())
4244
4245 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4246
Serhiy Storchaka43767632013-11-03 21:31:38 +02004247 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4248 'test needs socket.SOCK_NONBLOCK')
4249 @support.requires_linux_version(2, 6, 28)
4250 def testInitNonBlocking(self):
4251 # reinit server socket
4252 self.serv.close()
4253 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
4254 socket.SOCK_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004255 self.assertFalse(self.serv.getblocking())
4256 self.assertEqual(self.serv.gettimeout(), 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004257 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01004258 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02004259 # actual testing
4260 start = time.time()
4261 try:
4262 self.serv.accept()
4263 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00004264 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02004265 end = time.time()
4266 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
4267
4268 def _testInitNonBlocking(self):
4269 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004270
Antoine Pitrou600232b2011-01-05 21:03:42 +00004271 def testInheritFlags(self):
4272 # Issue #7995: when calling accept() on a listening socket with a
4273 # timeout, the resulting socket should not be non-blocking.
4274 self.serv.settimeout(10)
4275 try:
4276 conn, addr = self.serv.accept()
4277 message = conn.recv(len(MSG))
4278 finally:
4279 conn.close()
4280 self.serv.settimeout(None)
4281
4282 def _testInheritFlags(self):
4283 time.sleep(0.1)
4284 self.cli.connect((HOST, self.port))
4285 time.sleep(0.5)
4286 self.cli.send(MSG)
4287
Guido van Rossum24e4af82002-06-12 19:18:08 +00004288 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004289 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004290 self.serv.setblocking(0)
Miss Islington (bot)365f21c2018-11-30 03:48:17 -08004291
4292 # connect() didn't start: non-blocking accept() fails
4293 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004294 conn, addr = self.serv.accept()
Miss Islington (bot)365f21c2018-11-30 03:48:17 -08004295
4296 self.event.set()
4297
4298 read, write, err = select.select([self.serv], [], [], MAIN_TIMEOUT)
4299 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004300 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004301
Miss Islington (bot)365f21c2018-11-30 03:48:17 -08004302 # connect() completed: non-blocking accept() doesn't block
4303 conn, addr = self.serv.accept()
4304 self.addCleanup(conn.close)
4305 self.assertIsNone(conn.gettimeout())
4306
Guido van Rossum24e4af82002-06-12 19:18:08 +00004307 def _testAccept(self):
Miss Islington (bot)365f21c2018-11-30 03:48:17 -08004308 # don't connect before event is set to check
4309 # that non-blocking accept() raises BlockingIOError
4310 self.event.wait()
4311
Christian Heimes5e696852008-04-09 08:37:03 +00004312 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004313
4314 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004315 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00004316 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004317 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004318
4319 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00004320 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00004321 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004322
4323 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004324 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004325 conn, addr = self.serv.accept()
Miss Islington (bot)365f21c2018-11-30 03:48:17 -08004326 self.addCleanup(conn.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004327 conn.setblocking(0)
Miss Islington (bot)365f21c2018-11-30 03:48:17 -08004328
4329 # the server didn't send data yet: non-blocking recv() fails
4330 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004331 msg = conn.recv(len(MSG))
Miss Islington (bot)365f21c2018-11-30 03:48:17 -08004332
4333 self.event.set()
4334
4335 read, write, err = select.select([conn], [], [], MAIN_TIMEOUT)
4336 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004337 self.fail("Error during select call to non-blocking socket.")
4338
Miss Islington (bot)365f21c2018-11-30 03:48:17 -08004339 # the server sent data yet: non-blocking recv() doesn't block
4340 msg = conn.recv(len(MSG))
4341 self.assertEqual(msg, MSG)
4342
Guido van Rossum24e4af82002-06-12 19:18:08 +00004343 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004344 self.cli.connect((HOST, self.port))
Miss Islington (bot)365f21c2018-11-30 03:48:17 -08004345
4346 # don't send anything before event is set to check
4347 # that non-blocking recv() raises BlockingIOError
4348 self.event.wait()
4349
4350 # send data: recv() will no longer block
4351 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004352
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004353
Guido van Rossum24e4af82002-06-12 19:18:08 +00004354class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004355 """Unit tests for the object returned by socket.makefile()
4356
Antoine Pitrou834bd812010-10-13 16:17:14 +00004357 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004358 the client connection. You can read from this file to
4359 get output from the server.
4360
Antoine Pitrou834bd812010-10-13 16:17:14 +00004361 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004362 server connection. You can write to this file to send output
4363 to the client.
4364 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004365
Guido van Rossume9f66142002-08-07 15:46:19 +00004366 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004367 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004368 errors = 'strict'
4369 newline = None
4370
4371 read_mode = 'rb'
4372 read_msg = MSG
4373 write_mode = 'wb'
4374 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004375
Guido van Rossum24e4af82002-06-12 19:18:08 +00004376 def __init__(self, methodName='runTest'):
4377 SocketConnectedTest.__init__(self, methodName=methodName)
4378
4379 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004380 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4381 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004382 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004383 self.read_file = self.cli_conn.makefile(
4384 self.read_mode, self.bufsize,
4385 encoding = self.encoding,
4386 errors = self.errors,
4387 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004388
4389 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004390 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004391 self.read_file.close()
4392 self.assertTrue(self.read_file.closed)
4393 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004394 SocketConnectedTest.tearDown(self)
4395
4396 def clientSetUp(self):
4397 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004398 self.write_file = self.serv_conn.makefile(
4399 self.write_mode, self.bufsize,
4400 encoding = self.encoding,
4401 errors = self.errors,
4402 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004403
4404 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004405 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004406 self.write_file.close()
4407 self.assertTrue(self.write_file.closed)
4408 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004409 SocketConnectedTest.clientTearDown(self)
4410
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004411 def testReadAfterTimeout(self):
4412 # Issue #7322: A file object must disallow further reads
4413 # after a timeout has occurred.
4414 self.cli_conn.settimeout(1)
4415 self.read_file.read(3)
4416 # First read raises a timeout
4417 self.assertRaises(socket.timeout, self.read_file.read, 1)
4418 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004419 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004420 self.read_file.read(1)
4421 self.assertIn("cannot read from timed out object", str(ctx.exception))
4422
4423 def _testReadAfterTimeout(self):
4424 self.write_file.write(self.write_msg[0:3])
4425 self.write_file.flush()
4426 self.serv_finished.wait()
4427
Guido van Rossum24e4af82002-06-12 19:18:08 +00004428 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004429 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004430 first_seg = self.read_file.read(len(self.read_msg)-3)
4431 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004432 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004433 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004434
4435 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004436 self.write_file.write(self.write_msg)
4437 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004438
Guido van Rossum8c943832002-08-08 01:00:28 +00004439 def testFullRead(self):
4440 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004441 msg = self.read_file.read()
4442 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004443
4444 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004445 self.write_file.write(self.write_msg)
4446 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004447
Guido van Rossum24e4af82002-06-12 19:18:08 +00004448 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004449 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004450 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004451 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004452 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004453 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004454 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004455 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004456 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004457
4458 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004459 self.write_file.write(self.write_msg)
4460 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004461
4462 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004463 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004464 line = self.read_file.readline()
4465 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004466
4467 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004468 self.write_file.write(self.write_msg)
4469 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004470
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004471 def testCloseAfterMakefile(self):
4472 # The file returned by makefile should keep the socket open.
4473 self.cli_conn.close()
4474 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004475 msg = self.read_file.read()
4476 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004477
4478 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004479 self.write_file.write(self.write_msg)
4480 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004481
4482 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004483 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004484 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004485 if isinstance(self.read_msg, str):
4486 msg = msg.decode()
4487 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004488
4489 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004490 self.write_file.write(self.write_msg)
4491 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004492
Tim Peters116d83c2004-03-28 02:20:45 +00004493 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004494 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004495
4496 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004497 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004498
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004499 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004500 self.assertEqual(self.read_file.mode, self.read_mode)
4501 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004502
4503 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004504 self.assertEqual(self.write_file.mode, self.write_mode)
4505 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004506
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004507 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004508 self.read_file.close()
4509 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004510 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004511 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004512
4513 def _testRealClose(self):
4514 pass
4515
4516
Guido van Rossume9f66142002-08-07 15:46:19 +00004517class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4518
4519 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004520
Guido van Rossume9f66142002-08-07 15:46:19 +00004521 In this case (and in this case only), it should be possible to
4522 create a file object, read a line from it, create another file
4523 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004524 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004525 when reading multiple requests from the same socket."""
4526
4527 bufsize = 0 # Use unbuffered mode
4528
4529 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004530 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004531 line = self.read_file.readline() # first line
4532 self.assertEqual(line, b"A. " + self.write_msg) # first line
4533 self.read_file = self.cli_conn.makefile('rb', 0)
4534 line = self.read_file.readline() # second line
4535 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004536
4537 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004538 self.write_file.write(b"A. " + self.write_msg)
4539 self.write_file.write(b"B. " + self.write_msg)
4540 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004541
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004542 def testMakefileClose(self):
4543 # The file returned by makefile should keep the socket open...
4544 self.cli_conn.close()
4545 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004546 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004547 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004548 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004549 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004550
4551 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004552 self.write_file.write(self.write_msg)
4553 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004554
4555 def testMakefileCloseSocketDestroy(self):
4556 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004557 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004558 refcount_after = sys.getrefcount(self.cli_conn)
4559 self.assertEqual(refcount_before - 1, refcount_after)
4560
4561 def _testMakefileCloseSocketDestroy(self):
4562 pass
4563
Antoine Pitrou98b46702010-09-18 22:59:00 +00004564 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004565 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004566 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4567
4568 def testSmallReadNonBlocking(self):
4569 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004570 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4571 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004572 self.evt1.set()
4573 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004574 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004575 if first_seg is None:
4576 # Data not arrived (can happen under Windows), wait a bit
4577 time.sleep(0.5)
4578 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004579 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004580 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004581 self.assertEqual(n, 3)
4582 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004583 self.assertEqual(msg, self.read_msg)
4584 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4585 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004586
4587 def _testSmallReadNonBlocking(self):
4588 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004589 self.write_file.write(self.write_msg)
4590 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004591 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004592 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004593 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4594 self.serv_finished.wait(5.0)
4595
4596 def testWriteNonBlocking(self):
4597 self.cli_finished.wait(5.0)
4598 # The client thread can't skip directly - the SkipTest exception
4599 # would appear as a failure.
4600 if self.serv_skipped:
4601 self.skipTest(self.serv_skipped)
4602
4603 def _testWriteNonBlocking(self):
4604 self.serv_skipped = None
4605 self.serv_conn.setblocking(False)
4606 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004607 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004608 LIMIT = 10
4609 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004610 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004611 self.assertGreater(n, 0)
4612 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004613 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004614 if n is None:
4615 # Succeeded
4616 break
4617 self.assertGreater(n, 0)
4618 else:
4619 # Let us know that this test didn't manage to establish
4620 # the expected conditions. This is not a failure in itself but,
4621 # if it happens repeatedly, the test should be fixed.
4622 self.serv_skipped = "failed to saturate the socket buffer"
4623
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004624
Guido van Rossum8c943832002-08-08 01:00:28 +00004625class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4626
4627 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4628
4629
4630class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4631
4632 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004633
Thomas Woutersb2137042007-02-01 18:02:27 +00004634
Antoine Pitrou834bd812010-10-13 16:17:14 +00004635class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4636 """Tests for socket.makefile() in text mode (rather than binary)"""
4637
4638 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004639 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004640 write_mode = 'wb'
4641 write_msg = MSG
4642 newline = ''
4643
4644
4645class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4646 """Tests for socket.makefile() in text mode (rather than binary)"""
4647
4648 read_mode = 'rb'
4649 read_msg = MSG
4650 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004651 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004652 newline = ''
4653
4654
4655class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4656 """Tests for socket.makefile() in text mode (rather than binary)"""
4657
4658 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004659 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004660 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004661 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004662 newline = ''
4663
4664
Guido van Rossumd8faa362007-04-27 19:54:29 +00004665class NetworkConnectionTest(object):
4666 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004667
Guido van Rossumd8faa362007-04-27 19:54:29 +00004668 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004669 # We're inherited below by BasicTCPTest2, which also inherits
4670 # BasicTCPTest, which defines self.port referenced below.
4671 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004672 self.serv_conn = self.cli
4673
4674class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4675 """Tests that NetworkConnection does not break existing TCP functionality.
4676 """
4677
4678class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004679
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004680 class MockSocket(socket.socket):
4681 def connect(self, *args):
4682 raise socket.timeout('timed out')
4683
4684 @contextlib.contextmanager
4685 def mocked_socket_module(self):
4686 """Return a socket which times out on connect"""
4687 old_socket = socket.socket
4688 socket.socket = self.MockSocket
4689 try:
4690 yield
4691 finally:
4692 socket.socket = old_socket
4693
4694 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004695 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004696 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004697 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004698 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004699 cli.connect((HOST, port))
4700 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4701
4702 def test_create_connection(self):
4703 # Issue #9792: errors raised by create_connection() should have
4704 # a proper errno attribute.
4705 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004706 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004707 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004708
4709 # Issue #16257: create_connection() calls getaddrinfo() against
4710 # 'localhost'. This may result in an IPV6 addr being returned
4711 # as well as an IPV4 one:
4712 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4713 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4714 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4715 #
4716 # create_connection() enumerates through all the addresses returned
4717 # and if it doesn't successfully bind to any of them, it propagates
4718 # the last exception it encountered.
4719 #
4720 # On Solaris, ENETUNREACH is returned in this circumstance instead
4721 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4722 # expected errnos.
4723 expected_errnos = [ errno.ECONNREFUSED, ]
4724 if hasattr(errno, 'ENETUNREACH'):
4725 expected_errnos.append(errno.ENETUNREACH)
Victor Stinner280c22a2017-10-31 19:48:14 -07004726 if hasattr(errno, 'EADDRNOTAVAIL'):
4727 # bpo-31910: socket.create_connection() fails randomly
4728 # with EADDRNOTAVAIL on Travis CI
4729 expected_errnos.append(errno.EADDRNOTAVAIL)
Trent Nelson45bb6132012-10-17 06:15:15 -04004730
4731 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004732
4733 def test_create_connection_timeout(self):
4734 # Issue #9792: create_connection() should not recast timeout errors
4735 # as generic socket errors.
4736 with self.mocked_socket_module():
4737 with self.assertRaises(socket.timeout):
4738 socket.create_connection((HOST, 1234))
4739
Guido van Rossumd8faa362007-04-27 19:54:29 +00004740
4741class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4742
4743 def __init__(self, methodName='runTest'):
4744 SocketTCPTest.__init__(self, methodName=methodName)
4745 ThreadableTest.__init__(self)
4746
4747 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004748 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004749
4750 def clientTearDown(self):
4751 self.cli.close()
4752 self.cli = None
4753 ThreadableTest.clientTearDown(self)
4754
4755 def _justAccept(self):
4756 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004757 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004758
4759 testFamily = _justAccept
4760 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004761 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004762 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004763 self.assertEqual(self.cli.family, 2)
4764
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004765 testSourceAddress = _justAccept
4766 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004767 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4768 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004769 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004770 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004771 # The port number being used is sufficient to show that the bind()
4772 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004773
Guido van Rossumd8faa362007-04-27 19:54:29 +00004774 testTimeoutDefault = _justAccept
4775 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004776 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004777 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004778 socket.setdefaulttimeout(42)
4779 try:
4780 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004781 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004782 finally:
4783 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004784 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004785
4786 testTimeoutNone = _justAccept
4787 def _testTimeoutNone(self):
4788 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004789 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004790 socket.setdefaulttimeout(30)
4791 try:
4792 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004793 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004794 finally:
4795 socket.setdefaulttimeout(None)
4796 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004797
4798 testTimeoutValueNamed = _justAccept
4799 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004800 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004801 self.assertEqual(self.cli.gettimeout(), 30)
4802
4803 testTimeoutValueNonamed = _justAccept
4804 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004805 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004806 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004807 self.assertEqual(self.cli.gettimeout(), 30)
4808
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004809
Guido van Rossumd8faa362007-04-27 19:54:29 +00004810class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4811
4812 def __init__(self, methodName='runTest'):
4813 SocketTCPTest.__init__(self, methodName=methodName)
4814 ThreadableTest.__init__(self)
4815
4816 def clientSetUp(self):
4817 pass
4818
4819 def clientTearDown(self):
4820 self.cli.close()
4821 self.cli = None
4822 ThreadableTest.clientTearDown(self)
4823
4824 def testInsideTimeout(self):
4825 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004826 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004827 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004828 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004829 testOutsideTimeout = testInsideTimeout
4830
4831 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004832 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004833 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004834 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004835
4836 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004837 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004838 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004839
4840
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004841class TCPTimeoutTest(SocketTCPTest):
4842
4843 def testTCPTimeout(self):
4844 def raise_timeout(*args, **kwargs):
4845 self.serv.settimeout(1.0)
4846 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004847 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004848 "Error generating a timeout exception (TCP)")
4849
4850 def testTimeoutZero(self):
4851 ok = False
4852 try:
4853 self.serv.settimeout(0.0)
4854 foo = self.serv.accept()
4855 except socket.timeout:
4856 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004857 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004858 ok = True
4859 except:
4860 self.fail("caught unexpected exception (TCP)")
4861 if not ok:
4862 self.fail("accept() returned success when we did not expect it")
4863
Serhiy Storchaka43767632013-11-03 21:31:38 +02004864 @unittest.skipUnless(hasattr(signal, 'alarm'),
4865 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004866 def testInterruptedTimeout(self):
4867 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06004868 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004869 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004870 self.serv.settimeout(5.0) # must be longer than alarm
4871 class Alarm(Exception):
4872 pass
4873 def alarm_handler(signal, frame):
4874 raise Alarm
4875 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4876 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004877 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004878 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004879 foo = self.serv.accept()
4880 except socket.timeout:
4881 self.fail("caught timeout instead of Alarm")
4882 except Alarm:
4883 pass
4884 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004885 self.fail("caught other exception instead of Alarm:"
4886 " %s(%s):\n%s" %
4887 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004888 else:
4889 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004890 finally:
4891 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004892 except Alarm:
4893 self.fail("got Alarm in wrong place")
4894 finally:
4895 # no alarm can be pending. Safe to restore old handler.
4896 signal.signal(signal.SIGALRM, old_alarm)
4897
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004898class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004899
4900 def testUDPTimeout(self):
4901 def raise_timeout(*args, **kwargs):
4902 self.serv.settimeout(1.0)
4903 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004904 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004905 "Error generating a timeout exception (UDP)")
4906
4907 def testTimeoutZero(self):
4908 ok = False
4909 try:
4910 self.serv.settimeout(0.0)
4911 foo = self.serv.recv(1024)
4912 except socket.timeout:
4913 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004914 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004915 ok = True
4916 except:
4917 self.fail("caught unexpected exception (UDP)")
4918 if not ok:
4919 self.fail("recv() returned success when we did not expect it")
4920
4921class TestExceptions(unittest.TestCase):
4922
4923 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004924 self.assertTrue(issubclass(OSError, Exception))
4925 self.assertTrue(issubclass(socket.herror, OSError))
4926 self.assertTrue(issubclass(socket.gaierror, OSError))
4927 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004928
Yury Selivanovfa22b292016-10-18 16:03:52 -04004929 def test_setblocking_invalidfd(self):
4930 # Regression test for issue #28471
4931
4932 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4933 sock = socket.socket(
4934 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4935 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004936 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004937
4938 with self.assertRaises(OSError):
4939 sock.setblocking(False)
4940
4941
Serhiy Storchaka43767632013-11-03 21:31:38 +02004942@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004943class TestLinuxAbstractNamespace(unittest.TestCase):
4944
4945 UNIX_PATH_MAX = 108
4946
4947 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004948 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004949 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4950 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004951 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004952 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4953 s2.connect(s1.getsockname())
4954 with s1.accept()[0] as s3:
4955 self.assertEqual(s1.getsockname(), address)
4956 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004957
4958 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004959 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004960 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4961 s.bind(address)
4962 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004963
4964 def testNameOverflow(self):
4965 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004966 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004967 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004968
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004969 def testStrName(self):
4970 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004971 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4972 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004973 s.bind("\x00python\x00test\x00")
4974 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004975 finally:
4976 s.close()
4977
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004978 def testBytearrayName(self):
4979 # Check that an abstract name can be passed as a bytearray.
4980 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4981 s.bind(bytearray(b"\x00python\x00test\x00"))
4982 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4983
Serhiy Storchaka43767632013-11-03 21:31:38 +02004984@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004985class TestUnixDomain(unittest.TestCase):
4986
4987 def setUp(self):
4988 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4989
4990 def tearDown(self):
4991 self.sock.close()
4992
4993 def encoded(self, path):
4994 # Return the given path encoded in the file system encoding,
4995 # or skip the test if this is not possible.
4996 try:
4997 return os.fsencode(path)
4998 except UnicodeEncodeError:
4999 self.skipTest(
5000 "Pathname {0!a} cannot be represented in file "
5001 "system encoding {1!r}".format(
5002 path, sys.getfilesystemencoding()))
5003
Antoine Pitrou16374872011-12-16 15:04:12 +01005004 def bind(self, sock, path):
5005 # Bind the socket
5006 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01005007 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005008 except OSError as e:
5009 if str(e) == "AF_UNIX path too long":
5010 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005011 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005012 .format(path))
5013 else:
5014 raise
5015
Antoine Pitrou495b5022017-05-02 17:20:00 +02005016 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005017 # Issue #30205 (note getsockname() can return None on OS X)
5018 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005019
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005020 def testStrAddr(self):
5021 # Test binding to and retrieving a normal string pathname.
5022 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005023 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005024 self.addCleanup(support.unlink, path)
5025 self.assertEqual(self.sock.getsockname(), path)
5026
5027 def testBytesAddr(self):
5028 # Test binding to a bytes pathname.
5029 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005030 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005031 self.addCleanup(support.unlink, path)
5032 self.assertEqual(self.sock.getsockname(), path)
5033
5034 def testSurrogateescapeBind(self):
5035 # Test binding to a valid non-ASCII pathname, with the
5036 # non-ASCII bytes supplied using surrogateescape encoding.
5037 path = os.path.abspath(support.TESTFN_UNICODE)
5038 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005039 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005040 self.addCleanup(support.unlink, path)
5041 self.assertEqual(self.sock.getsockname(), path)
5042
5043 def testUnencodableAddr(self):
5044 # Test binding to a pathname that cannot be encoded in the
5045 # file system encoding.
5046 if support.TESTFN_UNENCODABLE is None:
5047 self.skipTest("No unencodable filename available")
5048 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005049 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005050 self.addCleanup(support.unlink, path)
5051 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005052
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005053
Thomas Wouters477c8d52006-05-27 19:21:47 +00005054class BufferIOTest(SocketConnectedTest):
5055 """
5056 Test the buffer versions of socket.recv() and socket.send().
5057 """
5058 def __init__(self, methodName='runTest'):
5059 SocketConnectedTest.__init__(self, methodName=methodName)
5060
Antoine Pitrou25480782010-03-17 22:50:28 +00005061 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005062 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005063 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005064 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005065 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005066 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005067 self.assertEqual(msg, MSG)
5068
Antoine Pitrou25480782010-03-17 22:50:28 +00005069 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005070 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005071 self.serv_conn.send(buf)
5072
Antoine Pitrou25480782010-03-17 22:50:28 +00005073 def testRecvIntoBytearray(self):
5074 buf = bytearray(1024)
5075 nbytes = self.cli_conn.recv_into(buf)
5076 self.assertEqual(nbytes, len(MSG))
5077 msg = buf[:len(MSG)]
5078 self.assertEqual(msg, MSG)
5079
5080 _testRecvIntoBytearray = _testRecvIntoArray
5081
5082 def testRecvIntoMemoryview(self):
5083 buf = bytearray(1024)
5084 nbytes = self.cli_conn.recv_into(memoryview(buf))
5085 self.assertEqual(nbytes, len(MSG))
5086 msg = buf[:len(MSG)]
5087 self.assertEqual(msg, MSG)
5088
5089 _testRecvIntoMemoryview = _testRecvIntoArray
5090
5091 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005092 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005093 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005094 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005095 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005096 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005097 self.assertEqual(msg, MSG)
5098
Antoine Pitrou25480782010-03-17 22:50:28 +00005099 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005100 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005101 self.serv_conn.send(buf)
5102
Antoine Pitrou25480782010-03-17 22:50:28 +00005103 def testRecvFromIntoBytearray(self):
5104 buf = bytearray(1024)
5105 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5106 self.assertEqual(nbytes, len(MSG))
5107 msg = buf[:len(MSG)]
5108 self.assertEqual(msg, MSG)
5109
5110 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5111
5112 def testRecvFromIntoMemoryview(self):
5113 buf = bytearray(1024)
5114 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5115 self.assertEqual(nbytes, len(MSG))
5116 msg = buf[:len(MSG)]
5117 self.assertEqual(msg, MSG)
5118
5119 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5120
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005121 def testRecvFromIntoSmallBuffer(self):
5122 # See issue #20246.
5123 buf = bytearray(8)
5124 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5125
5126 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005127 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005128
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005129 def testRecvFromIntoEmptyBuffer(self):
5130 buf = bytearray()
5131 self.cli_conn.recvfrom_into(buf)
5132 self.cli_conn.recvfrom_into(buf, 0)
5133
5134 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5135
Christian Heimes043d6f62008-01-07 17:19:16 +00005136
5137TIPC_STYPE = 2000
5138TIPC_LOWER = 200
5139TIPC_UPPER = 210
5140
5141def isTipcAvailable():
5142 """Check if the TIPC module is loaded
5143
5144 The TIPC module is not loaded automatically on Ubuntu and probably
5145 other Linux distros.
5146 """
5147 if not hasattr(socket, "AF_TIPC"):
5148 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005149 try:
5150 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005151 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005152 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005153 # have not the permission to read it.
5154 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005155 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005156 for line in f:
5157 if line.startswith("tipc "):
5158 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005159 return False
5160
Serhiy Storchaka43767632013-11-03 21:31:38 +02005161@unittest.skipUnless(isTipcAvailable(),
5162 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005163class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005164 def testRDM(self):
5165 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5166 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005167 self.addCleanup(srv.close)
5168 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005169
5170 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5171 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5172 TIPC_LOWER, TIPC_UPPER)
5173 srv.bind(srvaddr)
5174
5175 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5176 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5177 cli.sendto(MSG, sendaddr)
5178
5179 msg, recvaddr = srv.recvfrom(1024)
5180
5181 self.assertEqual(cli.getsockname(), recvaddr)
5182 self.assertEqual(msg, MSG)
5183
5184
Serhiy Storchaka43767632013-11-03 21:31:38 +02005185@unittest.skipUnless(isTipcAvailable(),
5186 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005187class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005188 def __init__(self, methodName = 'runTest'):
5189 unittest.TestCase.__init__(self, methodName = methodName)
5190 ThreadableTest.__init__(self)
5191
5192 def setUp(self):
5193 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005194 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005195 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5196 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5197 TIPC_LOWER, TIPC_UPPER)
5198 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005199 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005200 self.serverExplicitReady()
5201 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005202 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005203
5204 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005205 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005206 # accept() call; sleep a little while to avoid it, otherwise
5207 # we could get an exception
5208 time.sleep(0.1)
5209 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005210 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005211 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5212 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5213 self.cli.connect(addr)
5214 self.cliaddr = self.cli.getsockname()
5215
5216 def testStream(self):
5217 msg = self.conn.recv(1024)
5218 self.assertEqual(msg, MSG)
5219 self.assertEqual(self.cliaddr, self.connaddr)
5220
5221 def _testStream(self):
5222 self.cli.send(MSG)
5223 self.cli.close()
5224
5225
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005226class ContextManagersTest(ThreadedTCPSocketTest):
5227
5228 def _testSocketClass(self):
5229 # base test
5230 with socket.socket() as sock:
5231 self.assertFalse(sock._closed)
5232 self.assertTrue(sock._closed)
5233 # close inside with block
5234 with socket.socket() as sock:
5235 sock.close()
5236 self.assertTrue(sock._closed)
5237 # exception inside with block
5238 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005239 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005240 self.assertTrue(sock._closed)
5241
5242 def testCreateConnectionBase(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 _testCreateConnectionBase(self):
5249 address = self.serv.getsockname()
5250 with socket.create_connection(address) as sock:
5251 self.assertFalse(sock._closed)
5252 sock.sendall(b'foo')
5253 self.assertEqual(sock.recv(1024), b'foo')
5254 self.assertTrue(sock._closed)
5255
5256 def testCreateConnectionClose(self):
5257 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005258 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005259 data = conn.recv(1024)
5260 conn.sendall(data)
5261
5262 def _testCreateConnectionClose(self):
5263 address = self.serv.getsockname()
5264 with socket.create_connection(address) as sock:
5265 sock.close()
5266 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005267 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005268
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005269
Victor Stinnerdaf45552013-08-28 00:53:59 +02005270class InheritanceTest(unittest.TestCase):
5271 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5272 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005273 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005274 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005275 with socket.socket(socket.AF_INET,
5276 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005277 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005278 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005279
5280 def test_default_inheritable(self):
5281 sock = socket.socket()
5282 with sock:
5283 self.assertEqual(sock.get_inheritable(), False)
5284
5285 def test_dup(self):
5286 sock = socket.socket()
5287 with sock:
5288 newsock = sock.dup()
5289 sock.close()
5290 with newsock:
5291 self.assertEqual(newsock.get_inheritable(), False)
5292
5293 def test_set_inheritable(self):
5294 sock = socket.socket()
5295 with sock:
5296 sock.set_inheritable(True)
5297 self.assertEqual(sock.get_inheritable(), True)
5298
5299 sock.set_inheritable(False)
5300 self.assertEqual(sock.get_inheritable(), False)
5301
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005302 @unittest.skipIf(fcntl is None, "need fcntl")
5303 def test_get_inheritable_cloexec(self):
5304 sock = socket.socket()
5305 with sock:
5306 fd = sock.fileno()
5307 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005308
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005309 # clear FD_CLOEXEC flag
5310 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5311 flags &= ~fcntl.FD_CLOEXEC
5312 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005313
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005314 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005315
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005316 @unittest.skipIf(fcntl is None, "need fcntl")
5317 def test_set_inheritable_cloexec(self):
5318 sock = socket.socket()
5319 with sock:
5320 fd = sock.fileno()
5321 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5322 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005323
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005324 sock.set_inheritable(True)
5325 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5326 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005327
5328
Victor Stinnerdaf45552013-08-28 00:53:59 +02005329 def test_socketpair(self):
5330 s1, s2 = socket.socketpair()
5331 self.addCleanup(s1.close)
5332 self.addCleanup(s2.close)
5333 self.assertEqual(s1.get_inheritable(), False)
5334 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005335
5336
5337@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5338 "SOCK_NONBLOCK not defined")
5339class NonblockConstantTest(unittest.TestCase):
5340 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5341 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005342 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005343 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005344 self.assertTrue(
5345 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005346 if timeout == 0:
5347 # timeout == 0: means that getblocking() must be False.
5348 self.assertFalse(s.getblocking())
5349 else:
5350 # If timeout > 0, the socket will be in a "blocking" mode
5351 # from the standpoint of the Python API. For Python socket
5352 # object, "blocking" means that operations like 'sock.recv()'
5353 # will block. Internally, file descriptors for
5354 # "blocking" Python sockets *with timeouts* are in a
5355 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5356 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5357 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005358 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005359 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005360 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005361 self.assertFalse(
5362 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005363 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005364
Charles-François Natali239bb962011-06-03 12:55:15 +02005365 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005366 def test_SOCK_NONBLOCK(self):
5367 # a lot of it seems silly and redundant, but I wanted to test that
5368 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005369 with socket.socket(socket.AF_INET,
5370 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5371 self.checkNonblock(s)
5372 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005373 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005374 s.setblocking(0)
5375 self.checkNonblock(s)
5376 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005377 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005378 s.settimeout(2.0)
5379 self.checkNonblock(s, timeout=2.0)
5380 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005381 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005382 # defaulttimeout
5383 t = socket.getdefaulttimeout()
5384 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005385 with socket.socket() as s:
5386 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005387 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005388 with socket.socket() as s:
5389 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005390 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005391 with socket.socket() as s:
5392 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005393 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005394 with socket.socket() as s:
5395 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005396 socket.setdefaulttimeout(t)
5397
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005398
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005399@unittest.skipUnless(os.name == "nt", "Windows specific")
5400@unittest.skipUnless(multiprocessing, "need multiprocessing")
5401class TestSocketSharing(SocketTCPTest):
5402 # This must be classmethod and not staticmethod or multiprocessing
5403 # won't be able to bootstrap it.
5404 @classmethod
5405 def remoteProcessServer(cls, q):
5406 # Recreate socket from shared data
5407 sdata = q.get()
5408 message = q.get()
5409
5410 s = socket.fromshare(sdata)
5411 s2, c = s.accept()
5412
5413 # Send the message
5414 s2.sendall(message)
5415 s2.close()
5416 s.close()
5417
5418 def testShare(self):
5419 # Transfer the listening server socket to another process
5420 # and service it from there.
5421
5422 # Create process:
5423 q = multiprocessing.Queue()
5424 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5425 p.start()
5426
5427 # Get the shared socket data
5428 data = self.serv.share(p.pid)
5429
5430 # Pass the shared socket to the other process
5431 addr = self.serv.getsockname()
5432 self.serv.close()
5433 q.put(data)
5434
5435 # The data that the server will send us
5436 message = b"slapmahfro"
5437 q.put(message)
5438
5439 # Connect
5440 s = socket.create_connection(addr)
5441 # listen for the data
5442 m = []
5443 while True:
5444 data = s.recv(100)
5445 if not data:
5446 break
5447 m.append(data)
5448 s.close()
5449 received = b"".join(m)
5450 self.assertEqual(received, message)
5451 p.join()
5452
5453 def testShareLength(self):
5454 data = self.serv.share(os.getpid())
5455 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5456 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5457
5458 def compareSockets(self, org, other):
5459 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005460 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005461 self.assertEqual(org.gettimeout(), None)
5462 self.assertEqual(org.gettimeout(), other.gettimeout())
5463
5464 self.assertEqual(org.family, other.family)
5465 self.assertEqual(org.type, other.type)
5466 # If the user specified "0" for proto, then
5467 # internally windows will have picked the correct value.
5468 # Python introspection on the socket however will still return
5469 # 0. For the shared socket, the python value is recreated
5470 # from the actual value, so it may not compare correctly.
5471 if org.proto != 0:
5472 self.assertEqual(org.proto, other.proto)
5473
5474 def testShareLocal(self):
5475 data = self.serv.share(os.getpid())
5476 s = socket.fromshare(data)
5477 try:
5478 self.compareSockets(self.serv, s)
5479 finally:
5480 s.close()
5481
5482 def testTypes(self):
5483 families = [socket.AF_INET, socket.AF_INET6]
5484 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5485 for f in families:
5486 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005487 try:
5488 source = socket.socket(f, t)
5489 except OSError:
5490 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005491 try:
5492 data = source.share(os.getpid())
5493 shared = socket.fromshare(data)
5494 try:
5495 self.compareSockets(source, shared)
5496 finally:
5497 shared.close()
5498 finally:
5499 source.close()
5500
5501
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005502class SendfileUsingSendTest(ThreadedTCPSocketTest):
5503 """
5504 Test the send() implementation of socket.sendfile().
5505 """
5506
Victor Stinner8c663fd2017-11-08 14:44:44 -08005507 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005508 BUFSIZE = 8192
5509 FILEDATA = b""
5510 TIMEOUT = 2
5511
5512 @classmethod
5513 def setUpClass(cls):
5514 def chunks(total, step):
5515 assert total >= step
5516 while total > step:
5517 yield step
5518 total -= step
5519 if total:
5520 yield total
5521
5522 chunk = b"".join([random.choice(string.ascii_letters).encode()
5523 for i in range(cls.BUFSIZE)])
5524 with open(support.TESTFN, 'wb') as f:
5525 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5526 f.write(chunk)
5527 with open(support.TESTFN, 'rb') as f:
5528 cls.FILEDATA = f.read()
5529 assert len(cls.FILEDATA) == cls.FILESIZE
5530
5531 @classmethod
5532 def tearDownClass(cls):
5533 support.unlink(support.TESTFN)
5534
5535 def accept_conn(self):
5536 self.serv.settimeout(self.TIMEOUT)
5537 conn, addr = self.serv.accept()
5538 conn.settimeout(self.TIMEOUT)
5539 self.addCleanup(conn.close)
5540 return conn
5541
5542 def recv_data(self, conn):
5543 received = []
5544 while True:
5545 chunk = conn.recv(self.BUFSIZE)
5546 if not chunk:
5547 break
5548 received.append(chunk)
5549 return b''.join(received)
5550
5551 def meth_from_sock(self, sock):
5552 # Depending on the mixin class being run return either send()
5553 # or sendfile() method implementation.
5554 return getattr(sock, "_sendfile_use_send")
5555
5556 # regular file
5557
5558 def _testRegularFile(self):
5559 address = self.serv.getsockname()
5560 file = open(support.TESTFN, 'rb')
5561 with socket.create_connection(address) as sock, file as file:
5562 meth = self.meth_from_sock(sock)
5563 sent = meth(file)
5564 self.assertEqual(sent, self.FILESIZE)
5565 self.assertEqual(file.tell(), self.FILESIZE)
5566
5567 def testRegularFile(self):
5568 conn = self.accept_conn()
5569 data = self.recv_data(conn)
5570 self.assertEqual(len(data), self.FILESIZE)
5571 self.assertEqual(data, self.FILEDATA)
5572
5573 # non regular file
5574
5575 def _testNonRegularFile(self):
5576 address = self.serv.getsockname()
5577 file = io.BytesIO(self.FILEDATA)
5578 with socket.create_connection(address) as sock, file as file:
5579 sent = sock.sendfile(file)
5580 self.assertEqual(sent, self.FILESIZE)
5581 self.assertEqual(file.tell(), self.FILESIZE)
5582 self.assertRaises(socket._GiveupOnSendfile,
5583 sock._sendfile_use_sendfile, file)
5584
5585 def testNonRegularFile(self):
5586 conn = self.accept_conn()
5587 data = self.recv_data(conn)
5588 self.assertEqual(len(data), self.FILESIZE)
5589 self.assertEqual(data, self.FILEDATA)
5590
5591 # empty file
5592
5593 def _testEmptyFileSend(self):
5594 address = self.serv.getsockname()
5595 filename = support.TESTFN + "2"
5596 with open(filename, 'wb'):
5597 self.addCleanup(support.unlink, filename)
5598 file = open(filename, 'rb')
5599 with socket.create_connection(address) as sock, file as file:
5600 meth = self.meth_from_sock(sock)
5601 sent = meth(file)
5602 self.assertEqual(sent, 0)
5603 self.assertEqual(file.tell(), 0)
5604
5605 def testEmptyFileSend(self):
5606 conn = self.accept_conn()
5607 data = self.recv_data(conn)
5608 self.assertEqual(data, b"")
5609
5610 # offset
5611
5612 def _testOffset(self):
5613 address = self.serv.getsockname()
5614 file = open(support.TESTFN, 'rb')
5615 with socket.create_connection(address) as sock, file as file:
5616 meth = self.meth_from_sock(sock)
5617 sent = meth(file, offset=5000)
5618 self.assertEqual(sent, self.FILESIZE - 5000)
5619 self.assertEqual(file.tell(), self.FILESIZE)
5620
5621 def testOffset(self):
5622 conn = self.accept_conn()
5623 data = self.recv_data(conn)
5624 self.assertEqual(len(data), self.FILESIZE - 5000)
5625 self.assertEqual(data, self.FILEDATA[5000:])
5626
5627 # count
5628
5629 def _testCount(self):
5630 address = self.serv.getsockname()
5631 file = open(support.TESTFN, 'rb')
5632 with socket.create_connection(address, timeout=2) as sock, file as file:
5633 count = 5000007
5634 meth = self.meth_from_sock(sock)
5635 sent = meth(file, count=count)
5636 self.assertEqual(sent, count)
5637 self.assertEqual(file.tell(), count)
5638
5639 def testCount(self):
5640 count = 5000007
5641 conn = self.accept_conn()
5642 data = self.recv_data(conn)
5643 self.assertEqual(len(data), count)
5644 self.assertEqual(data, self.FILEDATA[:count])
5645
5646 # count small
5647
5648 def _testCountSmall(self):
5649 address = self.serv.getsockname()
5650 file = open(support.TESTFN, 'rb')
5651 with socket.create_connection(address, timeout=2) as sock, file as file:
5652 count = 1
5653 meth = self.meth_from_sock(sock)
5654 sent = meth(file, count=count)
5655 self.assertEqual(sent, count)
5656 self.assertEqual(file.tell(), count)
5657
5658 def testCountSmall(self):
5659 count = 1
5660 conn = self.accept_conn()
5661 data = self.recv_data(conn)
5662 self.assertEqual(len(data), count)
5663 self.assertEqual(data, self.FILEDATA[:count])
5664
5665 # count + offset
5666
5667 def _testCountWithOffset(self):
5668 address = self.serv.getsockname()
5669 file = open(support.TESTFN, 'rb')
5670 with socket.create_connection(address, timeout=2) as sock, file as file:
5671 count = 100007
5672 meth = self.meth_from_sock(sock)
5673 sent = meth(file, offset=2007, count=count)
5674 self.assertEqual(sent, count)
5675 self.assertEqual(file.tell(), count + 2007)
5676
5677 def testCountWithOffset(self):
5678 count = 100007
5679 conn = self.accept_conn()
5680 data = self.recv_data(conn)
5681 self.assertEqual(len(data), count)
5682 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5683
5684 # non blocking sockets are not supposed to work
5685
5686 def _testNonBlocking(self):
5687 address = self.serv.getsockname()
5688 file = open(support.TESTFN, 'rb')
5689 with socket.create_connection(address) as sock, file as file:
5690 sock.setblocking(False)
5691 meth = self.meth_from_sock(sock)
5692 self.assertRaises(ValueError, meth, file)
5693 self.assertRaises(ValueError, sock.sendfile, file)
5694
5695 def testNonBlocking(self):
5696 conn = self.accept_conn()
5697 if conn.recv(8192):
5698 self.fail('was not supposed to receive any data')
5699
5700 # timeout (non-triggered)
5701
5702 def _testWithTimeout(self):
5703 address = self.serv.getsockname()
5704 file = open(support.TESTFN, 'rb')
5705 with socket.create_connection(address, timeout=2) as sock, file as file:
5706 meth = self.meth_from_sock(sock)
5707 sent = meth(file)
5708 self.assertEqual(sent, self.FILESIZE)
5709
5710 def testWithTimeout(self):
5711 conn = self.accept_conn()
5712 data = self.recv_data(conn)
5713 self.assertEqual(len(data), self.FILESIZE)
5714 self.assertEqual(data, self.FILEDATA)
5715
5716 # timeout (triggered)
5717
5718 def _testWithTimeoutTriggeredSend(self):
5719 address = self.serv.getsockname()
5720 file = open(support.TESTFN, 'rb')
5721 with socket.create_connection(address, timeout=0.01) as sock, \
5722 file as file:
5723 meth = self.meth_from_sock(sock)
5724 self.assertRaises(socket.timeout, meth, file)
5725
5726 def testWithTimeoutTriggeredSend(self):
5727 conn = self.accept_conn()
5728 conn.recv(88192)
5729
5730 # errors
5731
5732 def _test_errors(self):
5733 pass
5734
5735 def test_errors(self):
5736 with open(support.TESTFN, 'rb') as file:
5737 with socket.socket(type=socket.SOCK_DGRAM) as s:
5738 meth = self.meth_from_sock(s)
5739 self.assertRaisesRegex(
5740 ValueError, "SOCK_STREAM", meth, file)
5741 with open(support.TESTFN, 'rt') as file:
5742 with socket.socket() as s:
5743 meth = self.meth_from_sock(s)
5744 self.assertRaisesRegex(
5745 ValueError, "binary mode", meth, file)
5746 with open(support.TESTFN, 'rb') as file:
5747 with socket.socket() as s:
5748 meth = self.meth_from_sock(s)
5749 self.assertRaisesRegex(TypeError, "positive integer",
5750 meth, file, count='2')
5751 self.assertRaisesRegex(TypeError, "positive integer",
5752 meth, file, count=0.1)
5753 self.assertRaisesRegex(ValueError, "positive integer",
5754 meth, file, count=0)
5755 self.assertRaisesRegex(ValueError, "positive integer",
5756 meth, file, count=-1)
5757
5758
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005759@unittest.skipUnless(hasattr(os, "sendfile"),
5760 'os.sendfile() required for this test.')
5761class SendfileUsingSendfileTest(SendfileUsingSendTest):
5762 """
5763 Test the sendfile() implementation of socket.sendfile().
5764 """
5765 def meth_from_sock(self, sock):
5766 return getattr(sock, "_sendfile_use_sendfile")
5767
Christian Heimes48371412016-09-06 00:37:46 +02005768
5769@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005770class LinuxKernelCryptoAPI(unittest.TestCase):
5771 # tests for AF_ALG
5772 def create_alg(self, typ, name):
5773 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005774 try:
5775 sock.bind((typ, name))
5776 except FileNotFoundError as e:
5777 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005778 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005779 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005780 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005781 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005782
Victor Stinner86afc1f2017-11-30 13:58:43 +01005783 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
5784 # at least on ppc64le architecture
5785 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02005786 def test_sha256(self):
5787 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5788 "177a9cb410ff61f20015ad")
5789 with self.create_alg('hash', 'sha256') as algo:
5790 op, _ = algo.accept()
5791 with op:
5792 op.sendall(b"abc")
5793 self.assertEqual(op.recv(512), expected)
5794
5795 op, _ = algo.accept()
5796 with op:
5797 op.send(b'a', socket.MSG_MORE)
5798 op.send(b'b', socket.MSG_MORE)
5799 op.send(b'c', socket.MSG_MORE)
5800 op.send(b'')
5801 self.assertEqual(op.recv(512), expected)
5802
5803 def test_hmac_sha1(self):
5804 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5805 with self.create_alg('hash', 'hmac(sha1)') as algo:
5806 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5807 op, _ = algo.accept()
5808 with op:
5809 op.sendall(b"what do ya want for nothing?")
5810 self.assertEqual(op.recv(512), expected)
5811
Christian Heimese084f842016-09-11 20:11:30 +02005812 # Although it should work with 3.19 and newer the test blocks on
5813 # Ubuntu 15.10 with Kernel 4.2.0-19.
5814 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005815 def test_aes_cbc(self):
5816 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5817 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5818 msg = b"Single block msg"
5819 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5820 msglen = len(msg)
5821 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5822 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5823 op, _ = algo.accept()
5824 with op:
5825 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5826 flags=socket.MSG_MORE)
5827 op.sendall(msg)
5828 self.assertEqual(op.recv(msglen), ciphertext)
5829
5830 op, _ = algo.accept()
5831 with op:
5832 op.sendmsg_afalg([ciphertext],
5833 op=socket.ALG_OP_DECRYPT, iv=iv)
5834 self.assertEqual(op.recv(msglen), msg)
5835
5836 # long message
5837 multiplier = 1024
5838 longmsg = [msg] * multiplier
5839 op, _ = algo.accept()
5840 with op:
5841 op.sendmsg_afalg(longmsg,
5842 op=socket.ALG_OP_ENCRYPT, iv=iv)
5843 enc = op.recv(msglen * multiplier)
5844 self.assertEqual(len(enc), msglen * multiplier)
Miss Islington (bot)958a25e2018-07-09 08:47:14 -07005845 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02005846
5847 op, _ = algo.accept()
5848 with op:
5849 op.sendmsg_afalg([enc],
5850 op=socket.ALG_OP_DECRYPT, iv=iv)
5851 dec = op.recv(msglen * multiplier)
5852 self.assertEqual(len(dec), msglen * multiplier)
5853 self.assertEqual(dec, msg * multiplier)
5854
matejcik9764c152017-02-16 14:41:31 +01005855 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005856 def test_aead_aes_gcm(self):
5857 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5858 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5859 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5860 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5861 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5862 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5863
5864 taglen = len(expected_tag)
5865 assoclen = len(assoc)
5866
5867 with self.create_alg('aead', 'gcm(aes)') as algo:
5868 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5869 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5870 None, taglen)
5871
5872 # send assoc, plain and tag buffer in separate steps
5873 op, _ = algo.accept()
5874 with op:
5875 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5876 assoclen=assoclen, flags=socket.MSG_MORE)
5877 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005878 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005879 res = op.recv(assoclen + len(plain) + taglen)
5880 self.assertEqual(expected_ct, res[assoclen:-taglen])
5881 self.assertEqual(expected_tag, res[-taglen:])
5882
5883 # now with msg
5884 op, _ = algo.accept()
5885 with op:
matejcik9764c152017-02-16 14:41:31 +01005886 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005887 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5888 assoclen=assoclen)
5889 res = op.recv(assoclen + len(plain) + taglen)
5890 self.assertEqual(expected_ct, res[assoclen:-taglen])
5891 self.assertEqual(expected_tag, res[-taglen:])
5892
5893 # create anc data manually
5894 pack_uint32 = struct.Struct('I').pack
5895 op, _ = algo.accept()
5896 with op:
matejcik9764c152017-02-16 14:41:31 +01005897 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005898 op.sendmsg(
5899 [msg],
5900 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5901 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5902 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5903 )
5904 )
matejcik9764c152017-02-16 14:41:31 +01005905 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005906 self.assertEqual(expected_ct, res[assoclen:-taglen])
5907 self.assertEqual(expected_tag, res[-taglen:])
5908
5909 # decrypt and verify
5910 op, _ = algo.accept()
5911 with op:
5912 msg = assoc + expected_ct + expected_tag
5913 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5914 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005915 res = op.recv(len(msg) - taglen)
5916 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005917
Christian Heimese084f842016-09-11 20:11:30 +02005918 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005919 def test_drbg_pr_sha256(self):
5920 # deterministic random bit generator, prediction resistance, sha256
5921 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5922 extra_seed = os.urandom(32)
5923 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5924 op, _ = algo.accept()
5925 with op:
5926 rn = op.recv(32)
5927 self.assertEqual(len(rn), 32)
5928
5929 def test_sendmsg_afalg_args(self):
5930 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005931 with sock:
5932 with self.assertRaises(TypeError):
5933 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005934
Christian Heimes02b30352016-09-11 19:49:56 +02005935 with self.assertRaises(TypeError):
5936 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005937
Christian Heimes02b30352016-09-11 19:49:56 +02005938 with self.assertRaises(TypeError):
5939 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005940
Christian Heimes02b30352016-09-11 19:49:56 +02005941 with self.assertRaises(TypeError):
5942 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005943
Christian Heimes02b30352016-09-11 19:49:56 +02005944 with self.assertRaises(TypeError):
5945 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5946
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08005947@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
5948class TestMSWindowsTCPFlags(unittest.TestCase):
5949 knownTCPFlags = {
Miss Islington (bot)32955292018-04-20 14:00:41 -07005950 # available since long time ago
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08005951 'TCP_MAXSEG',
5952 'TCP_NODELAY',
5953 # available starting with Windows 10 1607
5954 'TCP_FASTOPEN',
5955 # available starting with Windows 10 1703
5956 'TCP_KEEPCNT',
5957 # available starting with Windows 10 1709
5958 'TCP_KEEPIDLE',
5959 'TCP_KEEPINTVL'
5960 }
5961
5962 def test_new_tcp_flags(self):
5963 provided = [s for s in dir(socket) if s.startswith('TCP')]
5964 unknown = [s for s in provided if s not in self.knownTCPFlags]
5965
5966 self.assertEqual([], unknown,
5967 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005968
Guido van Rossumb995eb72002-07-31 16:08:40 +00005969def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005970 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005971 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005972
5973 tests.extend([
5974 NonBlockingTCPTests,
5975 FileObjectClassTestCase,
5976 UnbufferedFileObjectClassTestCase,
5977 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005978 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005979 UnicodeReadFileObjectClassTestCase,
5980 UnicodeWriteFileObjectClassTestCase,
5981 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005982 NetworkConnectionNoServer,
5983 NetworkConnectionAttributesTest,
5984 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005985 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005986 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005987 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005988 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005989 tests.append(BasicSocketPairTest)
5990 tests.append(TestUnixDomain)
5991 tests.append(TestLinuxAbstractNamespace)
5992 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005993 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005994 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005995 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005996 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04005997 BasicVSOCKTest,
5998 ThreadedVSOCKSocketStreamTest,
5999 ])
6000 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006001 CmsgMacroTests,
6002 SendmsgUDPTest,
6003 RecvmsgUDPTest,
6004 RecvmsgIntoUDPTest,
6005 SendmsgUDP6Test,
6006 RecvmsgUDP6Test,
6007 RecvmsgRFC3542AncillaryUDP6Test,
6008 RecvmsgIntoRFC3542AncillaryUDP6Test,
6009 RecvmsgIntoUDP6Test,
6010 SendmsgTCPTest,
6011 RecvmsgTCPTest,
6012 RecvmsgIntoTCPTest,
6013 SendmsgSCTPStreamTest,
6014 RecvmsgSCTPStreamTest,
6015 RecvmsgIntoSCTPStreamTest,
6016 SendmsgUnixStreamTest,
6017 RecvmsgUnixStreamTest,
6018 RecvmsgIntoUnixStreamTest,
6019 RecvmsgSCMRightsStreamTest,
6020 RecvmsgIntoSCMRightsStreamTest,
6021 # These are slow when setitimer() is not available
6022 InterruptedRecvTimeoutTest,
6023 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006024 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006025 SendfileUsingSendTest,
6026 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006027 ])
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08006028 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006029
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006030 thread_info = support.threading_setup()
6031 support.run_unittest(*tests)
6032 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006033
6034if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006035 test_main()