blob: 87ae2e127a23612e73f098ab841c22cd2fa2061d [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Serhiy Storchaka16994912020-04-25 10:06:29 +03003from test.support import socket_helper
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004
Christian Heimes5e696852008-04-09 08:37:03 +00005import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00006import io
Charles-François Natali65708cf2014-07-25 18:44:30 +01007import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +100010import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +000011import time
12import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000013import queue
Jack Jansen522e7692002-09-06 21:57:50 +000014import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000015import os
Michael Felt56614592018-12-26 04:34:37 +010016import platform
Christian Heimesfaf2f632008-01-06 16:59:19 +000017import array
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000018import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000019from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000020import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000021import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010022import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020023import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020024import random
Christian Heimesb6e43af2018-01-29 22:37:58 +010025import shutil
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020026import string
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020027import _thread as thread
28import threading
Antoine Pitroub1c54962010-10-14 15:05:38 +000029try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000030 import multiprocessing
31except ImportError:
32 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020033try:
34 import fcntl
35except ImportError:
36 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000037
Serhiy Storchaka16994912020-04-25 10:06:29 +030038HOST = socket_helper.HOST
Victor Stinner304315d2018-11-30 13:22:44 +010039# test unicode string and carriage return
40MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8')
Barry Warsawcf3d4b51997-01-03 20:03:32 +000041
caaveryeffc12f2017-09-06 18:18:10 -040042VSOCKPORT = 1234
Michael Felt56614592018-12-26 04:34:37 +010043AIX = platform.system() == "AIX"
caaveryeffc12f2017-09-06 18:18:10 -040044
Victor Stinner45df8202010-04-28 22:31:17 +000045try:
Victor Stinnere254e532014-07-26 14:36:55 +020046 import _socket
47except ImportError:
48 _socket = None
49
caaveryeffc12f2017-09-06 18:18:10 -040050def get_cid():
51 if fcntl is None:
52 return None
Pablo Galindo6eb96192020-04-01 01:48:37 +010053 if not hasattr(socket, 'IOCTL_VM_SOCKETS_GET_LOCAL_CID'):
54 return None
caaveryeffc12f2017-09-06 18:18:10 -040055 try:
56 with open("/dev/vsock", "rb") as f:
57 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
58 except OSError:
59 return None
60 else:
61 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000062
Charles-François Natali47413c12011-10-06 19:47:44 +020063def _have_socket_can():
64 """Check whether CAN sockets are supported on this host."""
65 try:
66 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020067 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020068 return False
69 else:
70 s.close()
71 return True
72
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040073def _have_socket_can_isotp():
74 """Check whether CAN ISOTP sockets are supported on this host."""
75 try:
76 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
77 except (AttributeError, OSError):
78 return False
79 else:
80 s.close()
81 return True
82
Charles-François Natali10b8cf42011-11-10 19:21:37 +010083def _have_socket_rds():
84 """Check whether RDS sockets are supported on this host."""
85 try:
86 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
87 except (AttributeError, OSError):
88 return False
89 else:
90 s.close()
91 return True
92
Christian Heimes48371412016-09-06 00:37:46 +020093def _have_socket_alg():
94 """Check whether AF_ALG sockets are supported on this host."""
95 try:
96 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
97 except (AttributeError, OSError):
98 return False
99 else:
100 s.close()
101 return True
102
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700103def _have_socket_qipcrtr():
104 """Check whether AF_QIPCRTR sockets are supported on this host."""
105 try:
106 s = socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM, 0)
107 except (AttributeError, OSError):
108 return False
109 else:
110 s.close()
111 return True
112
caaveryeffc12f2017-09-06 18:18:10 -0400113def _have_socket_vsock():
114 """Check whether AF_VSOCK sockets are supported on this host."""
115 ret = get_cid() is not None
116 return ret
117
Yury Selivanovf11b4602018-01-28 17:27:38 -0500118
Greg Bowser8fbece12019-08-02 16:29:52 -0400119def _have_socket_bluetooth():
120 """Check whether AF_BLUETOOTH sockets are supported on this host."""
121 try:
122 # RFCOMM is supported by all platforms with bluetooth support. Windows
123 # does not support omitting the protocol.
124 s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
125 except (AttributeError, OSError):
126 return False
127 else:
128 s.close()
129 return True
130
131
Victor Stinner304315d2018-11-30 13:22:44 +0100132@contextlib.contextmanager
133def socket_setdefaulttimeout(timeout):
134 old_timeout = socket.getdefaulttimeout()
135 try:
136 socket.setdefaulttimeout(timeout)
137 yield
138 finally:
139 socket.setdefaulttimeout(old_timeout)
Yury Selivanovf11b4602018-01-28 17:27:38 -0500140
141
Charles-François Natali47413c12011-10-06 19:47:44 +0200142HAVE_SOCKET_CAN = _have_socket_can()
143
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400144HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
145
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100146HAVE_SOCKET_RDS = _have_socket_rds()
147
Christian Heimes48371412016-09-06 00:37:46 +0200148HAVE_SOCKET_ALG = _have_socket_alg()
149
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700150HAVE_SOCKET_QIPCRTR = _have_socket_qipcrtr()
151
caaveryeffc12f2017-09-06 18:18:10 -0400152HAVE_SOCKET_VSOCK = _have_socket_vsock()
153
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700154HAVE_SOCKET_UDPLITE = hasattr(socket, "IPPROTO_UDPLITE")
155
Greg Bowser8fbece12019-08-02 16:29:52 -0400156HAVE_SOCKET_BLUETOOTH = _have_socket_bluetooth()
157
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000158# Size in bytes of the int type
159SIZEOF_INT = array.array("i").itemsize
160
Guido van Rossum24e4af82002-06-12 19:18:08 +0000161class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000162
Guido van Rossum24e4af82002-06-12 19:18:08 +0000163 def setUp(self):
164 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300165 self.port = socket_helper.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100166 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000167
Guido van Rossum24e4af82002-06-12 19:18:08 +0000168 def tearDown(self):
169 self.serv.close()
170 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000171
Guido van Rossum24e4af82002-06-12 19:18:08 +0000172class SocketUDPTest(unittest.TestCase):
173
174 def setUp(self):
175 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300176 self.port = socket_helper.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000177
178 def tearDown(self):
179 self.serv.close()
180 self.serv = None
181
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700182class SocketUDPLITETest(SocketUDPTest):
183
184 def setUp(self):
185 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300186 self.port = socket_helper.bind_port(self.serv)
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700187
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000188class ThreadSafeCleanupTestCase(unittest.TestCase):
189 """Subclass of unittest.TestCase with thread-safe cleanup methods.
190
191 This subclass protects the addCleanup() and doCleanups() methods
192 with a recursive lock.
193 """
194
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200195 def __init__(self, *args, **kwargs):
196 super().__init__(*args, **kwargs)
197 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000198
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200199 def addCleanup(self, *args, **kwargs):
200 with self._cleanup_lock:
201 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000202
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200203 def doCleanups(self, *args, **kwargs):
204 with self._cleanup_lock:
205 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000206
Charles-François Natali47413c12011-10-06 19:47:44 +0200207class SocketCANTest(unittest.TestCase):
208
209 """To be able to run this test, a `vcan0` CAN interface can be created with
210 the following commands:
211 # modprobe vcan
212 # ip link add dev vcan0 type vcan
213 # ifconfig vcan0 up
214 """
215 interface = 'vcan0'
216 bufsize = 128
217
Charles-François Natali773e42d2013-02-05 19:42:01 +0100218 """The CAN frame structure is defined in <linux/can.h>:
219
220 struct can_frame {
221 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
222 __u8 can_dlc; /* data length code: 0 .. 8 */
223 __u8 data[8] __attribute__((aligned(8)));
224 };
225 """
226 can_frame_fmt = "=IB3x8s"
227 can_frame_size = struct.calcsize(can_frame_fmt)
228
229 """The Broadcast Management Command frame structure is defined
230 in <linux/can/bcm.h>:
231
232 struct bcm_msg_head {
233 __u32 opcode;
234 __u32 flags;
235 __u32 count;
236 struct timeval ival1, ival2;
237 canid_t can_id;
238 __u32 nframes;
239 struct can_frame frames[0];
240 }
241
242 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
243 `struct can_frame` definition). Must use native not standard types for packing.
244 """
245 bcm_cmd_msg_fmt = "@3I4l2I"
246 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
247
Charles-François Natali47413c12011-10-06 19:47:44 +0200248 def setUp(self):
249 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200250 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200251 try:
252 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200253 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200254 self.skipTest('network interface `%s` does not exist' %
255 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200256
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100257
258class SocketRDSTest(unittest.TestCase):
259
260 """To be able to run this test, the `rds` kernel module must be loaded:
261 # modprobe rds
262 """
263 bufsize = 8192
264
265 def setUp(self):
266 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
267 self.addCleanup(self.serv.close)
268 try:
Serhiy Storchaka16994912020-04-25 10:06:29 +0300269 self.port = socket_helper.bind_port(self.serv)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100270 except OSError:
271 self.skipTest('unable to bind RDS socket')
272
273
Guido van Rossum24e4af82002-06-12 19:18:08 +0000274class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000275 """Threadable Test class
276
277 The ThreadableTest class makes it easy to create a threaded
278 client/server pair from an existing unit test. To create a
279 new threaded class from an existing unit test, use multiple
280 inheritance:
281
282 class NewClass (OldClass, ThreadableTest):
283 pass
284
285 This class defines two new fixture functions with obvious
286 purposes for overriding:
287
288 clientSetUp ()
289 clientTearDown ()
290
291 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000292 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000293 '_' to indicate the client portion of the test. Ex:
294
295 def testFoo(self):
296 # Server portion
297
298 def _testFoo(self):
299 # Client portion
300
301 Any exceptions raised by the clients during their tests
302 are caught and transferred to the main thread to alert
303 the testing framework.
304
305 Note, the server setup function cannot call any blocking
306 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000307 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000308 the blocking call (such as in setting up a client/server
309 connection and performing the accept() in setUp().
310 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000311
312 def __init__(self):
313 # Swap the true setup function
314 self.__setUp = self.setUp
315 self.__tearDown = self.tearDown
316 self.setUp = self._setUp
317 self.tearDown = self._tearDown
318
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000319 def serverExplicitReady(self):
320 """This method allows the server to explicitly indicate that
321 it wants the client thread to proceed. This is useful if the
322 server is about to execute a blocking routine that is
323 dependent upon the client thread during its setup routine."""
324 self.server_ready.set()
325
Guido van Rossum24e4af82002-06-12 19:18:08 +0000326 def _setUp(self):
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700327 self.wait_threads = support.wait_threads_exit()
328 self.wait_threads.__enter__()
329
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000330 self.server_ready = threading.Event()
331 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000332 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000333 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200334 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000335
336 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000337 methodname = self.id()
338 i = methodname.rfind('.')
339 methodname = methodname[i+1:]
340 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000341 self.client_thread = thread.start_new_thread(
342 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000343
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200344 try:
345 self.__setUp()
346 except:
347 self.server_crashed = True
348 raise
349 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000350 self.server_ready.set()
351 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000352
353 def _tearDown(self):
354 self.__tearDown()
355 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700356 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000357
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000358 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000359 exc = self.queue.get()
360 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000361
362 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000363 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100364 try:
365 self.clientSetUp()
366 except BaseException as e:
367 self.queue.put(e)
368 self.clientTearDown()
369 return
370 finally:
371 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200372 if self.server_crashed:
373 self.clientTearDown()
374 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000375 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000376 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000377 try:
378 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000379 except BaseException as e:
380 self.queue.put(e)
381 finally:
382 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000383
384 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000385 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000386
387 def clientTearDown(self):
388 self.done.set()
389 thread.exit()
390
391class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
392
393 def __init__(self, methodName='runTest'):
394 SocketTCPTest.__init__(self, methodName=methodName)
395 ThreadableTest.__init__(self)
396
397 def clientSetUp(self):
398 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
399
400 def clientTearDown(self):
401 self.cli.close()
402 self.cli = None
403 ThreadableTest.clientTearDown(self)
404
405class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
406
407 def __init__(self, methodName='runTest'):
408 SocketUDPTest.__init__(self, methodName=methodName)
409 ThreadableTest.__init__(self)
410
411 def clientSetUp(self):
412 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
413
Brian Curtin3beb38f2010-11-04 03:41:43 +0000414 def clientTearDown(self):
415 self.cli.close()
416 self.cli = None
417 ThreadableTest.clientTearDown(self)
418
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700419@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
420 'UDPLITE sockets required for this test.')
421class ThreadedUDPLITESocketTest(SocketUDPLITETest, ThreadableTest):
422
423 def __init__(self, methodName='runTest'):
424 SocketUDPLITETest.__init__(self, methodName=methodName)
425 ThreadableTest.__init__(self)
426
427 def clientSetUp(self):
428 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
429
430 def clientTearDown(self):
431 self.cli.close()
432 self.cli = None
433 ThreadableTest.clientTearDown(self)
434
Charles-François Natali47413c12011-10-06 19:47:44 +0200435class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
436
437 def __init__(self, methodName='runTest'):
438 SocketCANTest.__init__(self, methodName=methodName)
439 ThreadableTest.__init__(self)
440
441 def clientSetUp(self):
442 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
443 try:
444 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200445 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200446 # skipTest should not be called here, and will be called in the
447 # server instead
448 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200449
450 def clientTearDown(self):
451 self.cli.close()
452 self.cli = None
453 ThreadableTest.clientTearDown(self)
454
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100455class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
456
457 def __init__(self, methodName='runTest'):
458 SocketRDSTest.__init__(self, methodName=methodName)
459 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100460
461 def clientSetUp(self):
462 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
463 try:
464 # RDS sockets must be bound explicitly to send or receive data
465 self.cli.bind((HOST, 0))
466 self.cli_addr = self.cli.getsockname()
467 except OSError:
468 # skipTest should not be called here, and will be called in the
469 # server instead
470 pass
471
472 def clientTearDown(self):
473 self.cli.close()
474 self.cli = None
475 ThreadableTest.clientTearDown(self)
476
caaveryeffc12f2017-09-06 18:18:10 -0400477@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400478@unittest.skipUnless(HAVE_SOCKET_VSOCK,
479 'VSOCK sockets required for this test.')
480@unittest.skipUnless(get_cid() != 2,
481 "This test can only be run on a virtual guest.")
482class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
483
484 def __init__(self, methodName='runTest'):
485 unittest.TestCase.__init__(self, methodName=methodName)
486 ThreadableTest.__init__(self)
487
488 def setUp(self):
489 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
490 self.addCleanup(self.serv.close)
491 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
492 self.serv.listen()
493 self.serverExplicitReady()
494 self.conn, self.connaddr = self.serv.accept()
495 self.addCleanup(self.conn.close)
496
497 def clientSetUp(self):
498 time.sleep(0.1)
499 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
500 self.addCleanup(self.cli.close)
501 cid = get_cid()
502 self.cli.connect((cid, VSOCKPORT))
503
504 def testStream(self):
505 msg = self.conn.recv(1024)
506 self.assertEqual(msg, MSG)
507
508 def _testStream(self):
509 self.cli.send(MSG)
510 self.cli.close()
511
Guido van Rossum24e4af82002-06-12 19:18:08 +0000512class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000513 """Socket tests for client-server connection.
514
515 self.cli_conn is a client socket connected to the server. The
516 setUp() method guarantees that it is connected to the server.
517 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000518
519 def __init__(self, methodName='runTest'):
520 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
521
522 def setUp(self):
523 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000524 # Indicate explicitly we're ready for the client thread to
525 # proceed and then perform the blocking call to accept
526 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000527 conn, addr = self.serv.accept()
528 self.cli_conn = conn
529
530 def tearDown(self):
531 self.cli_conn.close()
532 self.cli_conn = None
533 ThreadedTCPSocketTest.tearDown(self)
534
535 def clientSetUp(self):
536 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000537 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000538 self.serv_conn = self.cli
539
540 def clientTearDown(self):
541 self.serv_conn.close()
542 self.serv_conn = None
543 ThreadedTCPSocketTest.clientTearDown(self)
544
Dave Cole331708b2004-08-09 04:51:41 +0000545class SocketPairTest(unittest.TestCase, ThreadableTest):
546
547 def __init__(self, methodName='runTest'):
548 unittest.TestCase.__init__(self, methodName=methodName)
549 ThreadableTest.__init__(self)
550
551 def setUp(self):
552 self.serv, self.cli = socket.socketpair()
553
554 def tearDown(self):
555 self.serv.close()
556 self.serv = None
557
558 def clientSetUp(self):
559 pass
560
561 def clientTearDown(self):
562 self.cli.close()
563 self.cli = None
564 ThreadableTest.clientTearDown(self)
565
Tim Peters494aaee2004-08-09 18:54:11 +0000566
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000567# The following classes are used by the sendmsg()/recvmsg() tests.
568# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
569# gives a drop-in replacement for SocketConnectedTest, but different
570# address families can be used, and the attributes serv_addr and
571# cli_addr will be set to the addresses of the endpoints.
572
573class SocketTestBase(unittest.TestCase):
574 """A base class for socket tests.
575
576 Subclasses must provide methods newSocket() to return a new socket
577 and bindSock(sock) to bind it to an unused address.
578
579 Creates a socket self.serv and sets self.serv_addr to its address.
580 """
581
582 def setUp(self):
583 self.serv = self.newSocket()
584 self.bindServer()
585
586 def bindServer(self):
587 """Bind server socket and set self.serv_addr to its address."""
588 self.bindSock(self.serv)
589 self.serv_addr = self.serv.getsockname()
590
591 def tearDown(self):
592 self.serv.close()
593 self.serv = None
594
595
596class SocketListeningTestMixin(SocketTestBase):
597 """Mixin to listen on the server socket."""
598
599 def setUp(self):
600 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100601 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000602
603
604class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
605 ThreadableTest):
606 """Mixin to add client socket and allow client/server tests.
607
608 Client socket is self.cli and its address is self.cli_addr. See
609 ThreadableTest for usage information.
610 """
611
612 def __init__(self, *args, **kwargs):
613 super().__init__(*args, **kwargs)
614 ThreadableTest.__init__(self)
615
616 def clientSetUp(self):
617 self.cli = self.newClientSocket()
618 self.bindClient()
619
620 def newClientSocket(self):
621 """Return a new socket for use as client."""
622 return self.newSocket()
623
624 def bindClient(self):
625 """Bind client socket and set self.cli_addr to its address."""
626 self.bindSock(self.cli)
627 self.cli_addr = self.cli.getsockname()
628
629 def clientTearDown(self):
630 self.cli.close()
631 self.cli = None
632 ThreadableTest.clientTearDown(self)
633
634
635class ConnectedStreamTestMixin(SocketListeningTestMixin,
636 ThreadedSocketTestMixin):
637 """Mixin to allow client/server stream tests with connected client.
638
639 Server's socket representing connection to client is self.cli_conn
640 and client's connection to server is self.serv_conn. (Based on
641 SocketConnectedTest.)
642 """
643
644 def setUp(self):
645 super().setUp()
646 # Indicate explicitly we're ready for the client thread to
647 # proceed and then perform the blocking call to accept
648 self.serverExplicitReady()
649 conn, addr = self.serv.accept()
650 self.cli_conn = conn
651
652 def tearDown(self):
653 self.cli_conn.close()
654 self.cli_conn = None
655 super().tearDown()
656
657 def clientSetUp(self):
658 super().clientSetUp()
659 self.cli.connect(self.serv_addr)
660 self.serv_conn = self.cli
661
662 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100663 try:
664 self.serv_conn.close()
665 self.serv_conn = None
666 except AttributeError:
667 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000668 super().clientTearDown()
669
670
671class UnixSocketTestBase(SocketTestBase):
672 """Base class for Unix-domain socket tests."""
673
674 # This class is used for file descriptor passing tests, so we
675 # create the sockets in a private directory so that other users
676 # can't send anything that might be problematic for a privileged
677 # user running the tests.
678
679 def setUp(self):
680 self.dir_path = tempfile.mkdtemp()
681 self.addCleanup(os.rmdir, self.dir_path)
682 super().setUp()
683
684 def bindSock(self, sock):
685 path = tempfile.mktemp(dir=self.dir_path)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300686 socket_helper.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000687 self.addCleanup(support.unlink, path)
688
689class UnixStreamBase(UnixSocketTestBase):
690 """Base class for Unix-domain SOCK_STREAM tests."""
691
692 def newSocket(self):
693 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
694
695
696class InetTestBase(SocketTestBase):
697 """Base class for IPv4 socket tests."""
698
699 host = HOST
700
701 def setUp(self):
702 super().setUp()
703 self.port = self.serv_addr[1]
704
705 def bindSock(self, sock):
Serhiy Storchaka16994912020-04-25 10:06:29 +0300706 socket_helper.bind_port(sock, host=self.host)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000707
708class TCPTestBase(InetTestBase):
709 """Base class for TCP-over-IPv4 tests."""
710
711 def newSocket(self):
712 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
713
714class UDPTestBase(InetTestBase):
715 """Base class for UDP-over-IPv4 tests."""
716
717 def newSocket(self):
718 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
719
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700720class UDPLITETestBase(InetTestBase):
721 """Base class for UDPLITE-over-IPv4 tests."""
722
723 def newSocket(self):
724 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
725
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000726class SCTPStreamBase(InetTestBase):
727 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
728
729 def newSocket(self):
730 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
731 socket.IPPROTO_SCTP)
732
733
734class Inet6TestBase(InetTestBase):
735 """Base class for IPv6 socket tests."""
736
Serhiy Storchaka16994912020-04-25 10:06:29 +0300737 host = socket_helper.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000738
739class UDP6TestBase(Inet6TestBase):
740 """Base class for UDP-over-IPv6 tests."""
741
742 def newSocket(self):
743 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
744
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700745class UDPLITE6TestBase(Inet6TestBase):
746 """Base class for UDPLITE-over-IPv6 tests."""
747
748 def newSocket(self):
749 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
750
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000751
752# Test-skipping decorators for use with ThreadableTest.
753
754def skipWithClientIf(condition, reason):
755 """Skip decorated test if condition is true, add client_skip decorator.
756
757 If the decorated object is not a class, sets its attribute
758 "client_skip" to a decorator which will return an empty function
759 if the test is to be skipped, or the original function if it is
760 not. This can be used to avoid running the client part of a
761 skipped test when using ThreadableTest.
762 """
763 def client_pass(*args, **kwargs):
764 pass
765 def skipdec(obj):
766 retval = unittest.skip(reason)(obj)
767 if not isinstance(obj, type):
768 retval.client_skip = lambda f: client_pass
769 return retval
770 def noskipdec(obj):
771 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
772 obj.client_skip = lambda f: f
773 return obj
774 return skipdec if condition else noskipdec
775
776
777def requireAttrs(obj, *attributes):
778 """Skip decorated test if obj is missing any of the given attributes.
779
780 Sets client_skip attribute as skipWithClientIf() does.
781 """
782 missing = [name for name in attributes if not hasattr(obj, name)]
783 return skipWithClientIf(
784 missing, "don't have " + ", ".join(name for name in missing))
785
786
787def requireSocket(*args):
788 """Skip decorated test if a socket cannot be created with given arguments.
789
790 When an argument is given as a string, will use the value of that
791 attribute of the socket module, or skip the test if it doesn't
792 exist. Sets client_skip attribute as skipWithClientIf() does.
793 """
794 err = None
795 missing = [obj for obj in args if
796 isinstance(obj, str) and not hasattr(socket, obj)]
797 if missing:
798 err = "don't have " + ", ".join(name for name in missing)
799 else:
800 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
801 for obj in args]
802 try:
803 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200804 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000805 # XXX: check errno?
806 err = str(e)
807 else:
808 s.close()
809 return skipWithClientIf(
810 err is not None,
811 "can't create socket({0}): {1}".format(
812 ", ".join(str(o) for o in args), err))
813
814
Guido van Rossum24e4af82002-06-12 19:18:08 +0000815#######################################################################
816## Begin Tests
817
818class GeneralModuleTests(unittest.TestCase):
819
Ethan Furman7184bac2014-10-14 18:56:53 -0700820 def test_SocketType_is_socketobject(self):
821 import _socket
822 self.assertTrue(socket.SocketType is _socket.socket)
823 s = socket.socket()
824 self.assertIsInstance(s, socket.SocketType)
825 s.close()
826
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000827 def test_repr(self):
828 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200829 with s:
830 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000831 self.assertIn('family=%s' % socket.AF_INET, repr(s))
832 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200833 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200834 self.assertNotIn('raddr', repr(s))
835 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200836 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200837 self.assertIn(str(s.getsockname()), repr(s))
838 self.assertIn('[closed]', repr(s))
839 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000840
Victor Stinnere254e532014-07-26 14:36:55 +0200841 @unittest.skipUnless(_socket is not None, 'need _socket module')
842 def test_csocket_repr(self):
843 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
844 try:
845 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
846 % (s.fileno(), s.family, s.type, s.proto))
847 self.assertEqual(repr(s), expected)
848 finally:
849 s.close()
850 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
851 % (s.family, s.type, s.proto))
852 self.assertEqual(repr(s), expected)
853
Raymond Hettinger027bb632004-05-31 03:09:25 +0000854 def test_weakref(self):
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +0200855 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
856 p = proxy(s)
857 self.assertEqual(p.fileno(), s.fileno())
Raymond Hettinger027bb632004-05-31 03:09:25 +0000858 s = None
859 try:
860 p.fileno()
861 except ReferenceError:
862 pass
863 else:
864 self.fail('Socket proxy still exists')
865
Guido van Rossum24e4af82002-06-12 19:18:08 +0000866 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000867 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300868 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200869 with self.assertRaises(OSError, msg=msg % 'OSError'):
870 raise OSError
871 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000872 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200873 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000874 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000875
Ezio Melotti63e42302011-05-07 19:47:48 +0300876 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000877 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300878 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
879 self.addCleanup(s.close)
880 s.bind(('', 0))
881 sockname = s.getsockname()
882 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300883 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300884 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300885 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400886 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300887 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300888 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300889 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400890 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300891 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300892 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300893 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300894 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300895 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300896 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300897 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400898 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300899 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300900 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300901 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400902 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300903 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300904 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300905 self.assertIn('not NoneType', str(cm.exception))
906 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300907 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300908 self.assertIn('an integer is required', str(cm.exception))
909 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300910 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300911 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300912 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300913 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300914 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300915 self.assertIn('(1 given)', str(cm.exception))
916 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300917 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300918 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300919
Guido van Rossum24e4af82002-06-12 19:18:08 +0000920 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000921 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000922 socket.AF_INET
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100923 if socket.has_ipv6:
924 socket.AF_INET6
Guido van Rossum24e4af82002-06-12 19:18:08 +0000925 socket.SOCK_STREAM
926 socket.SOCK_DGRAM
927 socket.SOCK_RAW
928 socket.SOCK_RDM
929 socket.SOCK_SEQPACKET
930 socket.SOL_SOCKET
931 socket.SO_REUSEADDR
932
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100933 def testCrucialIpProtoConstants(self):
934 socket.IPPROTO_TCP
935 socket.IPPROTO_UDP
936 if socket.has_ipv6:
937 socket.IPPROTO_IPV6
938
939 @unittest.skipUnless(os.name == "nt", "Windows specific")
940 def testWindowsSpecificConstants(self):
941 socket.IPPROTO_ICLFXBM
942 socket.IPPROTO_ST
943 socket.IPPROTO_CBT
944 socket.IPPROTO_IGP
945 socket.IPPROTO_RDP
946 socket.IPPROTO_PGM
947 socket.IPPROTO_L2TP
948 socket.IPPROTO_SCTP
949
Guido van Rossum654c11e2002-06-13 20:24:17 +0000950 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000951 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000952 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000953 try:
954 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200955 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000956 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600957 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000958 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000959 try:
960 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200961 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000962 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600963 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000964 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000965 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000966 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000967 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000968
Charles-François Natali0cc86852013-09-13 19:53:08 +0200969 def test_host_resolution(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +0300970 for addr in [socket_helper.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200971 self.assertEqual(socket.gethostbyname(addr), addr)
972
Serhiy Storchaka16994912020-04-25 10:06:29 +0300973 # we don't test socket_helper.HOSTv6 because there's a chance it doesn't have
Charles-François Natali0cc86852013-09-13 19:53:08 +0200974 # a matching name entry (e.g. 'ip6-localhost')
Serhiy Storchaka16994912020-04-25 10:06:29 +0300975 for host in [socket_helper.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200976 self.assertIn(host, socket.gethostbyaddr(host)[2])
977
Xiang Zhangd36a7162017-03-07 11:06:09 +0800978 def test_host_resolution_bad_address(self):
979 # These are all malformed IP addresses and expected not to resolve to
980 # any result. But some ISPs, e.g. AWS, may successfully resolve these
981 # IPs.
982 explanation = (
983 "resolving an invalid IP address did not raise OSError; "
984 "can be caused by a broken DNS server"
985 )
986 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
987 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -0400988 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +0800989 socket.gethostbyname(addr)
990 with self.assertRaises(OSError, msg=explanation):
991 socket.gethostbyaddr(addr)
992
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000993 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
994 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
995 def test_sethostname(self):
996 oldhn = socket.gethostname()
997 try:
998 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200999 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +00001000 if e.errno == errno.EPERM:
1001 self.skipTest("test should be run as root")
1002 else:
1003 raise
1004 try:
1005 # running test as root!
1006 self.assertEqual(socket.gethostname(), 'new')
1007 # Should work with bytes objects too
1008 socket.sethostname(b'bar')
1009 self.assertEqual(socket.gethostname(), 'bar')
1010 finally:
1011 socket.sethostname(oldhn)
1012
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001013 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
1014 'socket.if_nameindex() not available.')
1015 def testInterfaceNameIndex(self):
1016 interfaces = socket.if_nameindex()
1017 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +02001018 self.assertIsInstance(index, int)
1019 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001020 # interface indices are non-zero integers
1021 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001022 _index = socket.if_nametoindex(name)
1023 self.assertIsInstance(_index, int)
1024 self.assertEqual(index, _index)
1025 _name = socket.if_indextoname(index)
1026 self.assertIsInstance(_name, str)
1027 self.assertEqual(name, _name)
1028
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001029 @unittest.skipUnless(hasattr(socket, 'if_indextoname'),
1030 'socket.if_indextoname() not available.')
1031 def testInvalidInterfaceIndexToName(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02001032 self.assertRaises(OSError, socket.if_indextoname, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001033 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001034
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001035 @unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
1036 'socket.if_nametoindex() not available.')
1037 def testInvalidInterfaceNameToIndex(self):
1038 self.assertRaises(TypeError, socket.if_nametoindex, 0)
1039 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
1040
Serhiy Storchaka43767632013-11-03 21:31:38 +02001041 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1042 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +00001043 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001044 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +02001045 try:
1046 # On some versions, this loses a reference
1047 orig = sys.getrefcount(__name__)
1048 socket.getnameinfo(__name__,0)
1049 except TypeError:
1050 if sys.getrefcount(__name__) != orig:
1051 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001052
Guido van Rossum24e4af82002-06-12 19:18:08 +00001053 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001054 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +00001055 try:
1056 # On some versions, this crashes the interpreter.
1057 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001058 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001059 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001060
Guido van Rossumc0a0e082002-09-16 01:30:03 +00001061 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +00001062 # This just checks that htons etc. are their own inverse,
1063 # when looking at the lower 16 or 32 bits.
1064 sizes = {socket.htonl: 32, socket.ntohl: 32,
1065 socket.htons: 16, socket.ntohs: 16}
1066 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +00001067 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +00001068 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
1069 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +00001070
Guido van Rossuma2627af2002-09-14 00:58:46 +00001071 swapped = func(mask)
1072 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001073 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +00001074
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001075 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001076 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001077 import _testcapi
1078 s_good_values = [0, 1, 2, 0xffff]
1079 l_good_values = s_good_values + [0xffffffff]
1080 l_bad_values = [-1, -2, 1<<32, 1<<1000]
1081 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1082 _testcapi.INT_MAX + 1]
1083 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1084 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001085 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001086 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001087 for k in l_good_values:
1088 socket.ntohl(k)
1089 socket.htonl(k)
1090 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001091 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001092 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001093 for k in l_bad_values:
1094 self.assertRaises(OverflowError, socket.ntohl, k)
1095 self.assertRaises(OverflowError, socket.htonl, k)
1096 for k in s_deprecated_values:
1097 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1098 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001099
Barry Warsaw11b91a02004-06-28 00:50:43 +00001100 def testGetServBy(self):
1101 eq = self.assertEqual
1102 # Find one service that exists, then check all the related interfaces.
1103 # I've ordered this by protocols that have both a tcp and udp
1104 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001105 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001106 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001107 # avoid the 'echo' service on this platform, as there is an
1108 # assumption breaking non-standard port/protocol entry
1109 services = ('daytime', 'qotd', 'domain')
1110 else:
1111 services = ('echo', 'daytime', 'domain')
1112 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001113 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001114 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001115 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001116 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001117 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001118 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001119 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001120 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001121 # Issue #26936: Android getservbyname() was broken before API 23.
1122 if (not hasattr(sys, 'getandroidapilevel') or
1123 sys.getandroidapilevel() >= 23):
1124 port2 = socket.getservbyname(service)
1125 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001126 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001127 try:
1128 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001129 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001130 udpport = None
1131 else:
1132 eq(udpport, port)
1133 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001134 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001135 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001136 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001137 eq(socket.getservbyport(port, 'tcp'), service)
1138 if udpport is not None:
1139 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001140 # Make sure getservbyport does not accept out of range ports.
1141 self.assertRaises(OverflowError, socket.getservbyport, -1)
1142 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001143
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001144 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001145 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001146 # The default timeout should initially be None
1147 self.assertEqual(socket.getdefaulttimeout(), None)
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001148 with socket.socket() as s:
1149 self.assertEqual(s.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001150
1151 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001152 with socket_setdefaulttimeout(10):
1153 self.assertEqual(socket.getdefaulttimeout(), 10)
1154 with socket.socket() as sock:
1155 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001156
Victor Stinner304315d2018-11-30 13:22:44 +01001157 # Reset the default timeout to None, and see if it propagates
1158 socket.setdefaulttimeout(None)
1159 self.assertEqual(socket.getdefaulttimeout(), None)
1160 with socket.socket() as sock:
1161 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001162
1163 # Check that setting it to an invalid value raises ValueError
1164 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1165
1166 # Check that setting it to an invalid type raises TypeError
1167 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1168
Serhiy Storchaka43767632013-11-03 21:31:38 +02001169 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1170 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001171 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001172 # Test that issue1008086 and issue767150 are fixed.
1173 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001174 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1175 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001176
Serhiy Storchaka43767632013-11-03 21:31:38 +02001177 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1178 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001179 def testIPv4toString(self):
1180 from socket import inet_aton as f, inet_pton, AF_INET
1181 g = lambda a: inet_pton(AF_INET, a)
1182
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001183 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001184 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001185 )
1186
Ezio Melottib3aedd42010-11-20 19:04:17 +00001187 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1188 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1189 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1190 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1191 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001192 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001193 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001194 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001195 assertInvalid(f, '300.0.0.0')
1196 assertInvalid(f, 'a.0.0.0')
1197 assertInvalid(f, '1.2.3.4.5')
1198 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001199
Ezio Melottib3aedd42010-11-20 19:04:17 +00001200 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1201 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1202 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1203 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001204 assertInvalid(g, '0.0.0.')
1205 assertInvalid(g, '300.0.0.0')
1206 assertInvalid(g, 'a.0.0.0')
1207 assertInvalid(g, '1.2.3.4.5')
1208 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001209
Serhiy Storchaka43767632013-11-03 21:31:38 +02001210 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1211 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001212 def testIPv6toString(self):
1213 try:
1214 from socket import inet_pton, 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')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001219
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001220 if sys.platform == "win32":
1221 try:
1222 inet_pton(AF_INET6, '::')
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')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001226
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001227 f = lambda a: inet_pton(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(b'\x00' * 16, f('::'))
1233 self.assertEqual(b'\x00' * 16, f('0::0'))
1234 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1235 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001236 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 +00001237 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1238 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001239 self.assertEqual(
1240 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1241 f('ad42:abc::127:0:254:2')
1242 )
1243 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1244 assertInvalid('0x20::')
1245 assertInvalid(':::')
1246 assertInvalid('::0::')
1247 assertInvalid('1::abc::')
1248 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001249 assertInvalid('1:2:3:4:5:6')
Michael Felt56614592018-12-26 04:34:37 +01001250 assertInvalid('1:2:3:4:5:6:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001251 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001252 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001253 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001254 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001255
1256 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1257 f('::254.42.23.64')
1258 )
1259 self.assertEqual(
1260 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1261 f('42::a29b:254.42.23.64')
1262 )
1263 self.assertEqual(
1264 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1265 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1266 )
1267 assertInvalid('255.254.253.252')
1268 assertInvalid('1::260.2.3.0')
1269 assertInvalid('1::0.be.e.0')
1270 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1271 assertInvalid('::1.2.3.4:0')
1272 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001273
Serhiy Storchaka43767632013-11-03 21:31:38 +02001274 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1275 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001276 def testStringToIPv4(self):
1277 from socket import inet_ntoa as f, inet_ntop, AF_INET
1278 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001279 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001280 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001281 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001282
Ezio Melottib3aedd42010-11-20 19:04:17 +00001283 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1284 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1285 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1286 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001287 assertInvalid(f, b'\x00' * 3)
1288 assertInvalid(f, b'\x00' * 5)
1289 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001290 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001291
Ezio Melottib3aedd42010-11-20 19:04:17 +00001292 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1293 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1294 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001295 assertInvalid(g, b'\x00' * 3)
1296 assertInvalid(g, b'\x00' * 5)
1297 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001298 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001299
Serhiy Storchaka43767632013-11-03 21:31:38 +02001300 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1301 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001302 def testStringToIPv6(self):
1303 try:
1304 from socket import inet_ntop, AF_INET6, has_ipv6
1305 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001306 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001307 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001308 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001309
1310 if sys.platform == "win32":
1311 try:
1312 inet_ntop(AF_INET6, b'\x00' * 16)
1313 except OSError as e:
1314 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001315 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001316
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001317 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001318 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001319 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001320 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001321
Ezio Melottib3aedd42010-11-20 19:04:17 +00001322 self.assertEqual('::', f(b'\x00' * 16))
1323 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1324 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001325 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001326 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 +00001327 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001328 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001329
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001330 assertInvalid(b'\x12' * 15)
1331 assertInvalid(b'\x12' * 17)
1332 assertInvalid(b'\x12' * 4)
1333
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001334 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001335
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001336 def testSockName(self):
1337 # Testing getsockname()
Serhiy Storchaka16994912020-04-25 10:06:29 +03001338 port = socket_helper.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001339 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001340 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001341 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001342 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001343 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1344 # it reasonable to get the host's addr in addition to 0.0.0.0.
1345 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001346 try:
1347 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001348 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001349 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001350 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001351 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001352 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001353
1354 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001355 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001356 # We know a socket should start without reuse==0
1357 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001358 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001359 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001360 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001361
1362 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001363 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001364 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001365 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001366 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1367 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001368 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001369
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001370 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001371 # testing send() after close() with timeout
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001372 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1373 sock.settimeout(1)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001374 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001375
Martin Panter50ab1a32016-04-11 00:38:12 +00001376 def testCloseException(self):
1377 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001378 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001379 socket.socket(fileno=sock.fileno()).close()
1380 try:
1381 sock.close()
1382 except OSError as err:
1383 # Winsock apparently raises ENOTSOCK
1384 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1385 else:
1386 self.fail("close() should raise EBADF/ENOTSOCK")
1387
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001388 def testNewAttributes(self):
1389 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001390
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001391 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1392 self.assertEqual(sock.family, socket.AF_INET)
1393 if hasattr(socket, 'SOCK_CLOEXEC'):
1394 self.assertIn(sock.type,
1395 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1396 socket.SOCK_STREAM))
1397 else:
1398 self.assertEqual(sock.type, socket.SOCK_STREAM)
1399 self.assertEqual(sock.proto, 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001400
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001401 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001402 sock = socket.socket()
1403 self.addCleanup(sock.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001404 port = socket_helper.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001405 big_port = port + 65536
1406 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001407 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1408 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1409 # Since find_unused_port() is inherently subject to race conditions, we
1410 # call it a couple times if necessary.
1411 for i in itertools.count():
Serhiy Storchaka16994912020-04-25 10:06:29 +03001412 port = socket_helper.find_unused_port()
Charles-François Natali65708cf2014-07-25 18:44:30 +01001413 try:
1414 sock.bind((HOST, port))
1415 except OSError as e:
1416 if e.errno != errno.EADDRINUSE or i == 5:
1417 raise
1418 else:
1419 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001420
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001421 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001422 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001423 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1424 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1425 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1426 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001427 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1428 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001429 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001430 self.assertRaises(ValueError, s.ioctl, -1, None)
1431 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001432
Steve Dowerea93ac02016-06-17 12:52:18 -07001433 @unittest.skipUnless(os.name == "nt", "Windows specific")
1434 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1435 'Loopback fast path support required for this test')
1436 def test_sio_loopback_fast_path(self):
1437 s = socket.socket()
1438 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001439 try:
1440 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1441 except OSError as exc:
1442 WSAEOPNOTSUPP = 10045
1443 if exc.winerror == WSAEOPNOTSUPP:
1444 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1445 "doesn't implemented in this Windows version")
1446 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001447 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1448
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001449 def testGetaddrinfo(self):
1450 try:
1451 socket.getaddrinfo('localhost', 80)
1452 except socket.gaierror as err:
1453 if err.errno == socket.EAI_SERVICE:
1454 # see http://bugs.python.org/issue1282647
1455 self.skipTest("buggy libc version")
1456 raise
1457 # len of every sequence is supposed to be == 5
1458 for info in socket.getaddrinfo(HOST, None):
1459 self.assertEqual(len(info), 5)
1460 # host can be a domain name, a string representation of an
1461 # IPv4/v6 address or None
1462 socket.getaddrinfo('localhost', 80)
1463 socket.getaddrinfo('127.0.0.1', 80)
1464 socket.getaddrinfo(None, 80)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001465 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001466 socket.getaddrinfo('::1', 80)
1467 # port can be a string service name such as "http", a numeric
1468 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001469 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1470 if (not hasattr(sys, 'getandroidapilevel') or
1471 sys.getandroidapilevel() >= 23):
1472 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001473 socket.getaddrinfo(HOST, 80)
1474 socket.getaddrinfo(HOST, None)
1475 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001476 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1477 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001478 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001479 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1480 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001481 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001482 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1483 for _, socktype, _, _, _ in infos:
1484 self.assertEqual(socktype, socket.SOCK_STREAM)
1485 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001486 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001487 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1488 # a server willing to support both IPv4 and IPv6 will
1489 # usually do this
1490 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1491 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001492 # test keyword arguments
1493 a = socket.getaddrinfo(HOST, None)
1494 b = socket.getaddrinfo(host=HOST, port=None)
1495 self.assertEqual(a, b)
1496 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1497 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1498 self.assertEqual(a, b)
1499 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1500 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1501 self.assertEqual(a, b)
1502 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1503 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1504 self.assertEqual(a, b)
1505 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1506 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1507 self.assertEqual(a, b)
1508 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1509 socket.AI_PASSIVE)
1510 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1511 type=socket.SOCK_STREAM, proto=0,
1512 flags=socket.AI_PASSIVE)
1513 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001514 # Issue #6697.
1515 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001516
Ned Deilyb24f4812014-02-13 22:50:42 -08001517 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001518 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001519 try:
1520 # The arguments here are undefined and the call may succeed
1521 # or fail. All we care here is that it doesn't segfault.
1522 socket.getaddrinfo("localhost", None, 0, 0, 0,
1523 socket.AI_NUMERICSERV)
1524 except socket.gaierror:
1525 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001526
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001527 def test_getnameinfo(self):
1528 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001529 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001530
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001531 @unittest.skipUnless(support.is_resource_enabled('network'),
1532 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001533 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001534 # Check for internet access before running test
1535 # (issue #12804, issue #25138).
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +03001536 with socket_helper.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001537 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001538
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001539 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001540 domain = 'испытание.pythontest.net'
1541 socket.gethostbyname(domain)
1542 socket.gethostbyname_ex(domain)
1543 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001544 # 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 +00001545 # have a reverse entry yet
1546 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001547
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001548 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001549 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001550 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1551 self.skipTest("signal.alarm and socket.socketpair required for this test")
1552 # Our signal handlers clobber the C errno by calling a math function
1553 # with an invalid domain value.
1554 def ok_handler(*args):
1555 self.assertRaises(ValueError, math.acosh, 0)
1556 def raising_handler(*args):
1557 self.assertRaises(ValueError, math.acosh, 0)
1558 1 // 0
1559 c, s = socket.socketpair()
1560 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1561 try:
1562 if with_timeout:
1563 # Just above the one second minimum for signal.alarm
1564 c.settimeout(1.5)
1565 with self.assertRaises(ZeroDivisionError):
1566 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001567 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001568 if with_timeout:
1569 signal.signal(signal.SIGALRM, ok_handler)
1570 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001571 self.assertRaises(socket.timeout, c.sendall,
1572 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001573 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001574 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001575 signal.signal(signal.SIGALRM, old_alarm)
1576 c.close()
1577 s.close()
1578
1579 def test_sendall_interrupted(self):
1580 self.check_sendall_interrupted(False)
1581
1582 def test_sendall_interrupted_with_timeout(self):
1583 self.check_sendall_interrupted(True)
1584
Antoine Pitroue033e062010-10-29 10:38:18 +00001585 def test_dealloc_warn(self):
1586 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1587 r = repr(sock)
1588 with self.assertWarns(ResourceWarning) as cm:
1589 sock = None
1590 support.gc_collect()
1591 self.assertIn(r, str(cm.warning.args[0]))
1592 # An open socket file object gets dereferenced after the socket
1593 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1594 f = sock.makefile('rb')
1595 r = repr(sock)
1596 sock = None
1597 support.gc_collect()
1598 with self.assertWarns(ResourceWarning):
1599 f = None
1600 support.gc_collect()
1601
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001602 def test_name_closed_socketio(self):
1603 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1604 fp = sock.makefile("rb")
1605 fp.close()
1606 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1607
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001608 def test_unusable_closed_socketio(self):
1609 with socket.socket() as sock:
1610 fp = sock.makefile("rb", buffering=0)
1611 self.assertTrue(fp.readable())
1612 self.assertFalse(fp.writable())
1613 self.assertFalse(fp.seekable())
1614 fp.close()
1615 self.assertRaises(ValueError, fp.readable)
1616 self.assertRaises(ValueError, fp.writable)
1617 self.assertRaises(ValueError, fp.seekable)
1618
Christian Heimesd0e31b92018-01-27 09:54:13 +01001619 def test_socket_close(self):
1620 sock = socket.socket()
1621 try:
1622 sock.bind((HOST, 0))
1623 socket.close(sock.fileno())
1624 with self.assertRaises(OSError):
1625 sock.listen(1)
1626 finally:
1627 with self.assertRaises(OSError):
1628 # sock.close() fails with EBADF
1629 sock.close()
1630 with self.assertRaises(TypeError):
1631 socket.close(None)
1632 with self.assertRaises(OSError):
1633 socket.close(-1)
1634
Berker Peksag3fe64d02016-02-18 17:34:00 +02001635 def test_makefile_mode(self):
1636 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1637 with self.subTest(mode=mode):
1638 with socket.socket() as sock:
1639 with sock.makefile(mode) as fp:
1640 self.assertEqual(fp.mode, mode)
1641
1642 def test_makefile_invalid_mode(self):
1643 for mode in 'rt', 'x', '+', 'a':
1644 with self.subTest(mode=mode):
1645 with socket.socket() as sock:
1646 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1647 sock.makefile(mode)
1648
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001649 def test_pickle(self):
1650 sock = socket.socket()
1651 with sock:
1652 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1653 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001654 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1655 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1656 self.assertEqual(family, socket.AF_INET)
1657 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1658 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001659
Serhiy Storchaka78980432013-01-15 01:12:17 +02001660 def test_listen_backlog(self):
1661 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001662 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1663 srv.bind((HOST, 0))
1664 srv.listen(backlog)
1665
1666 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001667 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001668 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001669
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001670 @support.cpython_only
1671 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001672 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001673 import _testcapi
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001674 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1675 srv.bind((HOST, 0))
1676 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001677
Serhiy Storchaka16994912020-04-25 10:06:29 +03001678 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001679 def test_flowinfo(self):
1680 self.assertRaises(OverflowError, socket.getnameinfo,
Serhiy Storchaka16994912020-04-25 10:06:29 +03001681 (socket_helper.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001682 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03001683 self.assertRaises(OverflowError, s.bind, (socket_helper.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001684
Serhiy Storchaka16994912020-04-25 10:06:29 +03001685 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Коренберг Марк7766b962018-02-13 00:47:42 +05001686 def test_getaddrinfo_ipv6_basic(self):
1687 ((*_, sockaddr),) = socket.getaddrinfo(
1688 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1689 1234, socket.AF_INET6,
1690 socket.SOCK_DGRAM,
1691 socket.IPPROTO_UDP
1692 )
1693 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1694
Serhiy Storchaka16994912020-04-25 10:06:29 +03001695 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001696 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001697 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001698 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1699 # Just pick up any network interface (Linux, Mac OS X)
1700 (ifindex, test_interface) = socket.if_nameindex()[0]
1701 ((*_, sockaddr),) = socket.getaddrinfo(
1702 'ff02::1de:c0:face:8D%' + test_interface,
1703 1234, socket.AF_INET6,
1704 socket.SOCK_DGRAM,
1705 socket.IPPROTO_UDP
1706 )
1707 # Note missing interface name part in IPv6 address
1708 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1709
Serhiy Storchaka16994912020-04-25 10:06:29 +03001710 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Коренберг Марк7766b962018-02-13 00:47:42 +05001711 @unittest.skipUnless(
1712 sys.platform == 'win32',
1713 'Numeric scope id does not work or undocumented')
1714 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1715 # Also works on Linux and Mac OS X, but is not documented (?)
1716 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1717 ifindex = 42
1718 ((*_, sockaddr),) = socket.getaddrinfo(
1719 'ff02::1de:c0:face:8D%' + str(ifindex),
1720 1234, socket.AF_INET6,
1721 socket.SOCK_DGRAM,
1722 socket.IPPROTO_UDP
1723 )
1724 # Note missing interface name part in IPv6 address
1725 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1726
Serhiy Storchaka16994912020-04-25 10:06:29 +03001727 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001728 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001729 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001730 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1731 # Just pick up any network interface.
1732 (ifindex, test_interface) = socket.if_nameindex()[0]
1733 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1734 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1735 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1736
Serhiy Storchaka16994912020-04-25 10:06:29 +03001737 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Michael Felt56614592018-12-26 04:34:37 +01001738 @unittest.skipUnless( sys.platform == 'win32',
Коренберг Марк7766b962018-02-13 00:47:42 +05001739 'Numeric scope id does not work or undocumented')
1740 def test_getnameinfo_ipv6_scopeid_numeric(self):
1741 # Also works on Linux (undocumented), but does not work on Mac OS X
1742 # Windows and Linux allow nonexistent interface numbers here.
1743 ifindex = 42
1744 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1745 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1746 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1747
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001748 def test_str_for_enums(self):
1749 # Make sure that the AF_* and SOCK_* constants have enum-like string
1750 # reprs.
1751 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1752 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001753 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001754
Yury Selivanov98181422017-12-18 20:02:54 -05001755 def test_socket_consistent_sock_type(self):
1756 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1757 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1758 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1759
1760 with socket.socket(socket.AF_INET, sock_type) as s:
1761 self.assertEqual(s.type, socket.SOCK_STREAM)
1762 s.settimeout(1)
1763 self.assertEqual(s.type, socket.SOCK_STREAM)
1764 s.settimeout(0)
1765 self.assertEqual(s.type, socket.SOCK_STREAM)
1766 s.setblocking(True)
1767 self.assertEqual(s.type, socket.SOCK_STREAM)
1768 s.setblocking(False)
1769 self.assertEqual(s.type, socket.SOCK_STREAM)
1770
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001771 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001772 # Test that when created with a family that's not one of the known
1773 # AF_*/SOCK_* constants, socket.family just returns the number.
1774 #
1775 # To do this we fool socket.socket into believing it already has an
1776 # open fd because on this path it doesn't actually verify the family and
1777 # type and populates the socket object.
Dima Tisneke9912702018-12-17 22:07:55 +09001778 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1779 fd = sock.detach()
Yury Selivanov98181422017-12-18 20:02:54 -05001780 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1781
1782 unknown_type = max(
1783 kind
1784 for name, kind in socket.SocketKind.__members__.items()
1785 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1786 ) + 1
1787
1788 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001789 family=unknown_family, type=unknown_type, proto=23,
1790 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001791 self.assertEqual(s.family, unknown_family)
1792 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001793 # some OS like macOS ignore proto
1794 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001795
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001796 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1797 def test__sendfile_use_sendfile(self):
1798 class File:
1799 def __init__(self, fd):
1800 self.fd = fd
1801
1802 def fileno(self):
1803 return self.fd
1804 with socket.socket() as sock:
1805 fd = os.open(os.curdir, os.O_RDONLY)
1806 os.close(fd)
1807 with self.assertRaises(socket._GiveupOnSendfile):
1808 sock._sendfile_use_sendfile(File(fd))
1809 with self.assertRaises(OverflowError):
1810 sock._sendfile_use_sendfile(File(2**1000))
1811 with self.assertRaises(TypeError):
1812 sock._sendfile_use_sendfile(File(None))
1813
Christian Heimesb6e43af2018-01-29 22:37:58 +01001814 def _test_socket_fileno(self, s, family, stype):
1815 self.assertEqual(s.family, family)
1816 self.assertEqual(s.type, stype)
1817
1818 fd = s.fileno()
1819 s2 = socket.socket(fileno=fd)
1820 self.addCleanup(s2.close)
1821 # detach old fd to avoid double close
1822 s.detach()
1823 self.assertEqual(s2.family, family)
1824 self.assertEqual(s2.type, stype)
1825 self.assertEqual(s2.fileno(), fd)
1826
1827 def test_socket_fileno(self):
1828 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1829 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001830 s.bind((socket_helper.HOST, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001831 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1832
1833 if hasattr(socket, "SOCK_DGRAM"):
1834 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1835 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001836 s.bind((socket_helper.HOST, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001837 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1838
Serhiy Storchaka16994912020-04-25 10:06:29 +03001839 if socket_helper.IPV6_ENABLED:
Christian Heimesb6e43af2018-01-29 22:37:58 +01001840 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1841 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001842 s.bind((socket_helper.HOSTv6, 0, 0, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001843 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1844
1845 if hasattr(socket, "AF_UNIX"):
1846 tmpdir = tempfile.mkdtemp()
1847 self.addCleanup(shutil.rmtree, tmpdir)
1848 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1849 self.addCleanup(s.close)
xdegaye4461d702019-05-03 17:09:17 +02001850 try:
1851 s.bind(os.path.join(tmpdir, 'socket'))
1852 except PermissionError:
1853 pass
1854 else:
1855 self._test_socket_fileno(s, socket.AF_UNIX,
1856 socket.SOCK_STREAM)
Christian Heimesb6e43af2018-01-29 22:37:58 +01001857
Dima Tisneke9912702018-12-17 22:07:55 +09001858 def test_socket_fileno_rejects_float(self):
1859 with self.assertRaisesRegex(TypeError, "integer argument expected"):
1860 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
1861
1862 def test_socket_fileno_rejects_other_types(self):
1863 with self.assertRaisesRegex(TypeError, "integer is required"):
1864 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
1865
1866 def test_socket_fileno_rejects_invalid_socket(self):
1867 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1868 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
1869
1870 @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
1871 def test_socket_fileno_rejects_negative(self):
1872 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1873 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
1874
1875 def test_socket_fileno_requires_valid_fd(self):
1876 WSAENOTSOCK = 10038
1877 with self.assertRaises(OSError) as cm:
1878 socket.socket(fileno=support.make_bad_fd())
1879 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1880
1881 with self.assertRaises(OSError) as cm:
1882 socket.socket(
1883 socket.AF_INET,
1884 socket.SOCK_STREAM,
1885 fileno=support.make_bad_fd())
1886 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1887
1888 def test_socket_fileno_requires_socket_fd(self):
1889 with tempfile.NamedTemporaryFile() as afile:
1890 with self.assertRaises(OSError):
1891 socket.socket(fileno=afile.fileno())
1892
1893 with self.assertRaises(OSError) as cm:
1894 socket.socket(
1895 socket.AF_INET,
1896 socket.SOCK_STREAM,
1897 fileno=afile.fileno())
1898 self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
1899
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001900
Charles-François Natali47413c12011-10-06 19:47:44 +02001901@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1902class BasicCANTest(unittest.TestCase):
1903
1904 def testCrucialConstants(self):
1905 socket.AF_CAN
1906 socket.PF_CAN
1907 socket.CAN_RAW
1908
Charles-François Natali773e42d2013-02-05 19:42:01 +01001909 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1910 'socket.CAN_BCM required for this test.')
1911 def testBCMConstants(self):
1912 socket.CAN_BCM
1913
1914 # opcodes
1915 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1916 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1917 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1918 socket.CAN_BCM_TX_SEND # send one CAN frame
1919 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1920 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1921 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1922 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1923 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1924 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1925 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1926 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1927
karl ding31c4fd22019-07-31 01:47:16 -07001928 # flags
1929 socket.CAN_BCM_SETTIMER
1930 socket.CAN_BCM_STARTTIMER
1931 socket.CAN_BCM_TX_COUNTEVT
1932 socket.CAN_BCM_TX_ANNOUNCE
1933 socket.CAN_BCM_TX_CP_CAN_ID
1934 socket.CAN_BCM_RX_FILTER_ID
1935 socket.CAN_BCM_RX_CHECK_DLC
1936 socket.CAN_BCM_RX_NO_AUTOTIMER
1937 socket.CAN_BCM_RX_ANNOUNCE_RESUME
1938 socket.CAN_BCM_TX_RESET_MULTI_IDX
1939 socket.CAN_BCM_RX_RTR_FRAME
1940
Charles-François Natali47413c12011-10-06 19:47:44 +02001941 def testCreateSocket(self):
1942 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1943 pass
1944
Charles-François Natali773e42d2013-02-05 19:42:01 +01001945 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1946 'socket.CAN_BCM required for this test.')
1947 def testCreateBCMSocket(self):
1948 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1949 pass
1950
Charles-François Natali47413c12011-10-06 19:47:44 +02001951 def testBindAny(self):
1952 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
bggardner954900a2019-09-12 06:02:48 -04001953 address = ('', )
1954 s.bind(address)
1955 self.assertEqual(s.getsockname(), address)
Charles-François Natali47413c12011-10-06 19:47:44 +02001956
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_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001960 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001961 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001962
1963 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1964 'socket.CAN_RAW_LOOPBACK required for this test.')
1965 def testLoopback(self):
1966 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1967 for loopback in (0, 1):
1968 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1969 loopback)
1970 self.assertEqual(loopback,
1971 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1972
1973 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1974 'socket.CAN_RAW_FILTER required for this test.')
1975 def testFilter(self):
1976 can_id, can_mask = 0x200, 0x700
1977 can_filter = struct.pack("=II", can_id, can_mask)
1978 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1979 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1980 self.assertEqual(can_filter,
1981 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001982 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001983
1984
1985@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001986class CANTest(ThreadedCANSocketTest):
1987
Charles-François Natali47413c12011-10-06 19:47:44 +02001988 def __init__(self, methodName='runTest'):
1989 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1990
1991 @classmethod
1992 def build_can_frame(cls, can_id, data):
1993 """Build a CAN frame."""
1994 can_dlc = len(data)
1995 data = data.ljust(8, b'\x00')
1996 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1997
1998 @classmethod
1999 def dissect_can_frame(cls, frame):
2000 """Dissect a CAN frame."""
2001 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
2002 return (can_id, can_dlc, data[:can_dlc])
2003
2004 def testSendFrame(self):
2005 cf, addr = self.s.recvfrom(self.bufsize)
2006 self.assertEqual(self.cf, cf)
2007 self.assertEqual(addr[0], self.interface)
2008 self.assertEqual(addr[1], socket.AF_CAN)
2009
2010 def _testSendFrame(self):
2011 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
2012 self.cli.send(self.cf)
2013
2014 def testSendMaxFrame(self):
2015 cf, addr = self.s.recvfrom(self.bufsize)
2016 self.assertEqual(self.cf, cf)
2017
2018 def _testSendMaxFrame(self):
2019 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
2020 self.cli.send(self.cf)
2021
2022 def testSendMultiFrames(self):
2023 cf, addr = self.s.recvfrom(self.bufsize)
2024 self.assertEqual(self.cf1, cf)
2025
2026 cf, addr = self.s.recvfrom(self.bufsize)
2027 self.assertEqual(self.cf2, cf)
2028
2029 def _testSendMultiFrames(self):
2030 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
2031 self.cli.send(self.cf1)
2032
2033 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
2034 self.cli.send(self.cf2)
2035
Charles-François Natali773e42d2013-02-05 19:42:01 +01002036 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2037 'socket.CAN_BCM required for this test.')
2038 def _testBCM(self):
2039 cf, addr = self.cli.recvfrom(self.bufsize)
2040 self.assertEqual(self.cf, cf)
2041 can_id, can_dlc, data = self.dissect_can_frame(cf)
2042 self.assertEqual(self.can_id, can_id)
2043 self.assertEqual(self.data, data)
2044
2045 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2046 'socket.CAN_BCM required for this test.')
2047 def testBCM(self):
2048 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
2049 self.addCleanup(bcm.close)
2050 bcm.connect((self.interface,))
2051 self.can_id = 0x123
2052 self.data = bytes([0xc0, 0xff, 0xee])
2053 self.cf = self.build_can_frame(self.can_id, self.data)
2054 opcode = socket.CAN_BCM_TX_SEND
2055 flags = 0
2056 count = 0
2057 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2058 bcm_can_id = 0x0222
2059 nframes = 1
2060 assert len(self.cf) == 16
2061 header = struct.pack(self.bcm_cmd_msg_fmt,
2062 opcode,
2063 flags,
2064 count,
2065 ival1_seconds,
2066 ival1_usec,
2067 ival2_seconds,
2068 ival2_usec,
2069 bcm_can_id,
2070 nframes,
2071 )
2072 header_plus_frame = header + self.cf
2073 bytes_sent = bcm.send(header_plus_frame)
2074 self.assertEqual(bytes_sent, len(header_plus_frame))
2075
Charles-François Natali47413c12011-10-06 19:47:44 +02002076
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002077@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2078class ISOTPTest(unittest.TestCase):
2079
2080 def __init__(self, *args, **kwargs):
2081 super().__init__(*args, **kwargs)
2082 self.interface = "vcan0"
2083
2084 def testCrucialConstants(self):
2085 socket.AF_CAN
2086 socket.PF_CAN
2087 socket.CAN_ISOTP
2088 socket.SOCK_DGRAM
2089
2090 def testCreateSocket(self):
2091 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2092 pass
2093
2094 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2095 'socket.CAN_ISOTP required for this test.')
2096 def testCreateISOTPSocket(self):
2097 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2098 pass
2099
2100 def testTooLongInterfaceName(self):
2101 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2102 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2103 with self.assertRaisesRegex(OSError, 'interface name too long'):
2104 s.bind(('x' * 1024, 1, 2))
2105
2106 def testBind(self):
2107 try:
2108 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2109 addr = self.interface, 0x123, 0x456
2110 s.bind(addr)
2111 self.assertEqual(s.getsockname(), addr)
2112 except OSError as e:
2113 if e.errno == errno.ENODEV:
2114 self.skipTest('network interface `%s` does not exist' %
2115 self.interface)
2116 else:
2117 raise
2118
2119
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002120@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2121class BasicRDSTest(unittest.TestCase):
2122
2123 def testCrucialConstants(self):
2124 socket.AF_RDS
2125 socket.PF_RDS
2126
2127 def testCreateSocket(self):
2128 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2129 pass
2130
2131 def testSocketBufferSize(self):
2132 bufsize = 16384
2133 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2134 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2135 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2136
2137
2138@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002139class RDSTest(ThreadedRDSSocketTest):
2140
2141 def __init__(self, methodName='runTest'):
2142 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2143
Charles-François Natali240c55f2011-11-10 20:33:36 +01002144 def setUp(self):
2145 super().setUp()
2146 self.evt = threading.Event()
2147
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002148 def testSendAndRecv(self):
2149 data, addr = self.serv.recvfrom(self.bufsize)
2150 self.assertEqual(self.data, data)
2151 self.assertEqual(self.cli_addr, addr)
2152
2153 def _testSendAndRecv(self):
2154 self.data = b'spam'
2155 self.cli.sendto(self.data, 0, (HOST, self.port))
2156
2157 def testPeek(self):
2158 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2159 self.assertEqual(self.data, data)
2160 data, addr = self.serv.recvfrom(self.bufsize)
2161 self.assertEqual(self.data, data)
2162
2163 def _testPeek(self):
2164 self.data = b'spam'
2165 self.cli.sendto(self.data, 0, (HOST, self.port))
2166
2167 @requireAttrs(socket.socket, 'recvmsg')
2168 def testSendAndRecvMsg(self):
2169 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2170 self.assertEqual(self.data, data)
2171
2172 @requireAttrs(socket.socket, 'sendmsg')
2173 def _testSendAndRecvMsg(self):
2174 self.data = b'hello ' * 10
2175 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2176
2177 def testSendAndRecvMulti(self):
2178 data, addr = self.serv.recvfrom(self.bufsize)
2179 self.assertEqual(self.data1, data)
2180
2181 data, addr = self.serv.recvfrom(self.bufsize)
2182 self.assertEqual(self.data2, data)
2183
2184 def _testSendAndRecvMulti(self):
2185 self.data1 = b'bacon'
2186 self.cli.sendto(self.data1, 0, (HOST, self.port))
2187
2188 self.data2 = b'egg'
2189 self.cli.sendto(self.data2, 0, (HOST, self.port))
2190
2191 def testSelect(self):
2192 r, w, x = select.select([self.serv], [], [], 3.0)
2193 self.assertIn(self.serv, r)
2194 data, addr = self.serv.recvfrom(self.bufsize)
2195 self.assertEqual(self.data, data)
2196
2197 def _testSelect(self):
2198 self.data = b'select'
2199 self.cli.sendto(self.data, 0, (HOST, self.port))
2200
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002201@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2202 'QIPCRTR sockets required for this test.')
2203class BasicQIPCRTRTest(unittest.TestCase):
2204
2205 def testCrucialConstants(self):
2206 socket.AF_QIPCRTR
2207
2208 def testCreateSocket(self):
2209 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2210 pass
2211
2212 def testUnbound(self):
2213 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2214 self.assertEqual(s.getsockname()[1], 0)
2215
2216 def testBindSock(self):
2217 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002218 socket_helper.bind_port(s, host=s.getsockname()[0])
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002219 self.assertNotEqual(s.getsockname()[1], 0)
2220
2221 def testInvalidBindSock(self):
2222 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002223 self.assertRaises(OSError, socket_helper.bind_port, s, host=-2)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002224
2225 def testAutoBindSock(self):
2226 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2227 s.connect((123, 123))
2228 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002229
caaveryeffc12f2017-09-06 18:18:10 -04002230@unittest.skipIf(fcntl is None, "need fcntl")
2231@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2232 'VSOCK sockets required for this test.')
2233class BasicVSOCKTest(unittest.TestCase):
2234
2235 def testCrucialConstants(self):
2236 socket.AF_VSOCK
2237
2238 def testVSOCKConstants(self):
2239 socket.SO_VM_SOCKETS_BUFFER_SIZE
2240 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2241 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2242 socket.VMADDR_CID_ANY
2243 socket.VMADDR_PORT_ANY
2244 socket.VMADDR_CID_HOST
2245 socket.VM_SOCKETS_INVALID_VERSION
2246 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2247
2248 def testCreateSocket(self):
2249 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2250 pass
2251
2252 def testSocketBufferSize(self):
2253 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2254 orig_max = s.getsockopt(socket.AF_VSOCK,
2255 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2256 orig = s.getsockopt(socket.AF_VSOCK,
2257 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2258 orig_min = s.getsockopt(socket.AF_VSOCK,
2259 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2260
2261 s.setsockopt(socket.AF_VSOCK,
2262 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2263 s.setsockopt(socket.AF_VSOCK,
2264 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2265 s.setsockopt(socket.AF_VSOCK,
2266 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2267
2268 self.assertEqual(orig_max * 2,
2269 s.getsockopt(socket.AF_VSOCK,
2270 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2271 self.assertEqual(orig * 2,
2272 s.getsockopt(socket.AF_VSOCK,
2273 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2274 self.assertEqual(orig_min * 2,
2275 s.getsockopt(socket.AF_VSOCK,
2276 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2277
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002278
Greg Bowser8fbece12019-08-02 16:29:52 -04002279@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
2280 'Bluetooth sockets required for this test.')
2281class BasicBluetoothTest(unittest.TestCase):
2282
2283 def testBluetoothConstants(self):
2284 socket.BDADDR_ANY
2285 socket.BDADDR_LOCAL
2286 socket.AF_BLUETOOTH
2287 socket.BTPROTO_RFCOMM
2288
2289 if sys.platform != "win32":
2290 socket.BTPROTO_HCI
2291 socket.SOL_HCI
2292 socket.BTPROTO_L2CAP
2293
2294 if not sys.platform.startswith("freebsd"):
2295 socket.BTPROTO_SCO
2296
2297 def testCreateRfcommSocket(self):
2298 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
2299 pass
2300
2301 @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets")
2302 def testCreateL2capSocket(self):
2303 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s:
2304 pass
2305
2306 @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets")
2307 def testCreateHciSocket(self):
2308 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s:
2309 pass
2310
2311 @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"),
2312 "windows and freebsd do not support SCO sockets")
2313 def testCreateScoSocket(self):
2314 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s:
2315 pass
2316
2317
Guido van Rossum24e4af82002-06-12 19:18:08 +00002318class BasicTCPTest(SocketConnectedTest):
2319
2320 def __init__(self, methodName='runTest'):
2321 SocketConnectedTest.__init__(self, methodName=methodName)
2322
2323 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002324 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002325 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002326 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002327
2328 def _testRecv(self):
2329 self.serv_conn.send(MSG)
2330
2331 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002332 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002333 seg1 = self.cli_conn.recv(len(MSG) - 3)
2334 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002335 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002336 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002337
2338 def _testOverFlowRecv(self):
2339 self.serv_conn.send(MSG)
2340
2341 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002342 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002343 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002344 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002345
2346 def _testRecvFrom(self):
2347 self.serv_conn.send(MSG)
2348
2349 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002350 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002351 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2352 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002353 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002354 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002355
2356 def _testOverFlowRecvFrom(self):
2357 self.serv_conn.send(MSG)
2358
2359 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002360 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002361 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002362 while 1:
2363 read = self.cli_conn.recv(1024)
2364 if not read:
2365 break
Guido van Rossume531e292002-08-08 20:28:34 +00002366 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002367 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002368
2369 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002370 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002371 self.serv_conn.sendall(big_chunk)
2372
2373 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002374 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002375 fd = self.cli_conn.fileno()
2376 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002377 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002378 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002379 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002380 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002381
2382 def _testFromFd(self):
2383 self.serv_conn.send(MSG)
2384
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002385 def testDup(self):
2386 # Testing dup()
2387 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002388 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002389 msg = sock.recv(1024)
2390 self.assertEqual(msg, MSG)
2391
2392 def _testDup(self):
2393 self.serv_conn.send(MSG)
2394
Guido van Rossum24e4af82002-06-12 19:18:08 +00002395 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002396 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002397 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002398 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002399 # wait for _testShutdown to finish: on OS X, when the server
2400 # closes the connection the client also becomes disconnected,
2401 # and the client's shutdown call will fail. (Issue #4397.)
2402 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002403
2404 def _testShutdown(self):
2405 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002406 self.serv_conn.shutdown(2)
2407
2408 testShutdown_overflow = support.cpython_only(testShutdown)
2409
2410 @support.cpython_only
2411 def _testShutdown_overflow(self):
2412 import _testcapi
2413 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002414 # Issue 15989
2415 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2416 _testcapi.INT_MAX + 1)
2417 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2418 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002419 self.serv_conn.shutdown(2)
2420
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002421 def testDetach(self):
2422 # Testing detach()
2423 fileno = self.cli_conn.fileno()
2424 f = self.cli_conn.detach()
2425 self.assertEqual(f, fileno)
2426 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002427 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002428 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002429 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002430 # ...but we can create another socket using the (still open)
2431 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002432 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002433 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002434 msg = sock.recv(1024)
2435 self.assertEqual(msg, MSG)
2436
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002437 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002438 self.serv_conn.send(MSG)
2439
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002440
Guido van Rossum24e4af82002-06-12 19:18:08 +00002441class BasicUDPTest(ThreadedUDPSocketTest):
2442
2443 def __init__(self, methodName='runTest'):
2444 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2445
2446 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002447 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002448 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002449 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002450
2451 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002452 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002453
Guido van Rossum1c938012002-06-12 21:17:20 +00002454 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002455 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002456 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002457 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002458
Guido van Rossum1c938012002-06-12 21:17:20 +00002459 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002460 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002461
Guido van Rossumd8faa362007-04-27 19:54:29 +00002462 def testRecvFromNegative(self):
2463 # Negative lengths passed to recvfrom should give ValueError.
2464 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2465
2466 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002467 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002468
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07002469
2470@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
2471 'UDPLITE sockets required for this test.')
2472class BasicUDPLITETest(ThreadedUDPLITESocketTest):
2473
2474 def __init__(self, methodName='runTest'):
2475 ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
2476
2477 def testSendtoAndRecv(self):
2478 # Testing sendto() and Recv() over UDPLITE
2479 msg = self.serv.recv(len(MSG))
2480 self.assertEqual(msg, MSG)
2481
2482 def _testSendtoAndRecv(self):
2483 self.cli.sendto(MSG, 0, (HOST, self.port))
2484
2485 def testRecvFrom(self):
2486 # Testing recvfrom() over UDPLITE
2487 msg, addr = self.serv.recvfrom(len(MSG))
2488 self.assertEqual(msg, MSG)
2489
2490 def _testRecvFrom(self):
2491 self.cli.sendto(MSG, 0, (HOST, self.port))
2492
2493 def testRecvFromNegative(self):
2494 # Negative lengths passed to recvfrom should give ValueError.
2495 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2496
2497 def _testRecvFromNegative(self):
2498 self.cli.sendto(MSG, 0, (HOST, self.port))
2499
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002500# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2501# same test code is used with different families and types of socket
2502# (e.g. stream, datagram), and tests using recvmsg() are repeated
2503# using recvmsg_into().
2504#
2505# The generic test classes such as SendmsgTests and
2506# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2507# supplied with sockets cli_sock and serv_sock representing the
2508# client's and the server's end of the connection respectively, and
2509# attributes cli_addr and serv_addr holding their (numeric where
2510# appropriate) addresses.
2511#
2512# The final concrete test classes combine these with subclasses of
2513# SocketTestBase which set up client and server sockets of a specific
2514# type, and with subclasses of SendrecvmsgBase such as
2515# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2516# sockets to cli_sock and serv_sock and override the methods and
2517# attributes of SendrecvmsgBase to fill in destination addresses if
2518# needed when sending, check for specific flags in msg_flags, etc.
2519#
2520# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2521# recvmsg_into().
2522
2523# XXX: like the other datagram (UDP) tests in this module, the code
2524# here assumes that datagram delivery on the local machine will be
2525# reliable.
2526
2527class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2528 # Base class for sendmsg()/recvmsg() tests.
2529
2530 # Time in seconds to wait before considering a test failed, or
2531 # None for no timeout. Not all tests actually set a timeout.
Victor Stinner24c62582019-10-30 12:41:43 +01002532 fail_timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002533
2534 def setUp(self):
2535 self.misc_event = threading.Event()
2536 super().setUp()
2537
2538 def sendToServer(self, msg):
2539 # Send msg to the server.
2540 return self.cli_sock.send(msg)
2541
2542 # Tuple of alternative default arguments for sendmsg() when called
2543 # via sendmsgToServer() (e.g. to include a destination address).
2544 sendmsg_to_server_defaults = ()
2545
2546 def sendmsgToServer(self, *args):
2547 # Call sendmsg() on self.cli_sock with the given arguments,
2548 # filling in any arguments which are not supplied with the
2549 # corresponding items of self.sendmsg_to_server_defaults, if
2550 # any.
2551 return self.cli_sock.sendmsg(
2552 *(args + self.sendmsg_to_server_defaults[len(args):]))
2553
2554 def doRecvmsg(self, sock, bufsize, *args):
2555 # Call recvmsg() on sock with given arguments and return its
2556 # result. Should be used for tests which can use either
2557 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2558 # this method with one which emulates it using recvmsg_into(),
2559 # thus allowing the same test to be used for both methods.
2560 result = sock.recvmsg(bufsize, *args)
2561 self.registerRecvmsgResult(result)
2562 return result
2563
2564 def registerRecvmsgResult(self, result):
2565 # Called by doRecvmsg() with the return value of recvmsg() or
2566 # recvmsg_into(). Can be overridden to arrange cleanup based
2567 # on the returned ancillary data, for instance.
2568 pass
2569
2570 def checkRecvmsgAddress(self, addr1, addr2):
2571 # Called to compare the received address with the address of
2572 # the peer.
2573 self.assertEqual(addr1, addr2)
2574
2575 # Flags that are normally unset in msg_flags
2576 msg_flags_common_unset = 0
2577 for name in ("MSG_CTRUNC", "MSG_OOB"):
2578 msg_flags_common_unset |= getattr(socket, name, 0)
2579
2580 # Flags that are normally set
2581 msg_flags_common_set = 0
2582
2583 # Flags set when a complete record has been received (e.g. MSG_EOR
2584 # for SCTP)
2585 msg_flags_eor_indicator = 0
2586
2587 # Flags set when a complete record has not been received
2588 # (e.g. MSG_TRUNC for datagram sockets)
2589 msg_flags_non_eor_indicator = 0
2590
2591 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2592 # Method to check the value of msg_flags returned by recvmsg[_into]().
2593 #
2594 # Checks that all bits in msg_flags_common_set attribute are
2595 # set in "flags" and all bits in msg_flags_common_unset are
2596 # unset.
2597 #
2598 # The "eor" argument specifies whether the flags should
2599 # indicate that a full record (or datagram) has been received.
2600 # If "eor" is None, no checks are done; otherwise, checks
2601 # that:
2602 #
2603 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2604 # set and all bits in msg_flags_non_eor_indicator are unset
2605 #
2606 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2607 # are set and all bits in msg_flags_eor_indicator are unset
2608 #
2609 # If "checkset" and/or "checkunset" are supplied, they require
2610 # the given bits to be set or unset respectively, overriding
2611 # what the attributes require for those bits.
2612 #
2613 # If any bits are set in "ignore", they will not be checked,
2614 # regardless of the other inputs.
2615 #
2616 # Will raise Exception if the inputs require a bit to be both
2617 # set and unset, and it is not ignored.
2618
2619 defaultset = self.msg_flags_common_set
2620 defaultunset = self.msg_flags_common_unset
2621
2622 if eor:
2623 defaultset |= self.msg_flags_eor_indicator
2624 defaultunset |= self.msg_flags_non_eor_indicator
2625 elif eor is not None:
2626 defaultset |= self.msg_flags_non_eor_indicator
2627 defaultunset |= self.msg_flags_eor_indicator
2628
2629 # Function arguments override defaults
2630 defaultset &= ~checkunset
2631 defaultunset &= ~checkset
2632
2633 # Merge arguments with remaining defaults, and check for conflicts
2634 checkset |= defaultset
2635 checkunset |= defaultunset
2636 inboth = checkset & checkunset & ~ignore
2637 if inboth:
2638 raise Exception("contradictory set, unset requirements for flags "
2639 "{0:#x}".format(inboth))
2640
2641 # Compare with given msg_flags value
2642 mask = (checkset | checkunset) & ~ignore
2643 self.assertEqual(flags & mask, checkset & mask)
2644
2645
2646class RecvmsgIntoMixin(SendrecvmsgBase):
2647 # Mixin to implement doRecvmsg() using recvmsg_into().
2648
2649 def doRecvmsg(self, sock, bufsize, *args):
2650 buf = bytearray(bufsize)
2651 result = sock.recvmsg_into([buf], *args)
2652 self.registerRecvmsgResult(result)
2653 self.assertGreaterEqual(result[0], 0)
2654 self.assertLessEqual(result[0], bufsize)
2655 return (bytes(buf[:result[0]]),) + result[1:]
2656
2657
2658class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2659 # Defines flags to be checked in msg_flags for datagram sockets.
2660
2661 @property
2662 def msg_flags_non_eor_indicator(self):
2663 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2664
2665
2666class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2667 # Defines flags to be checked in msg_flags for SCTP sockets.
2668
2669 @property
2670 def msg_flags_eor_indicator(self):
2671 return super().msg_flags_eor_indicator | socket.MSG_EOR
2672
2673
2674class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2675 # Base class for tests on connectionless-mode sockets. Users must
2676 # supply sockets on attributes cli and serv to be mapped to
2677 # cli_sock and serv_sock respectively.
2678
2679 @property
2680 def serv_sock(self):
2681 return self.serv
2682
2683 @property
2684 def cli_sock(self):
2685 return self.cli
2686
2687 @property
2688 def sendmsg_to_server_defaults(self):
2689 return ([], [], 0, self.serv_addr)
2690
2691 def sendToServer(self, msg):
2692 return self.cli_sock.sendto(msg, self.serv_addr)
2693
2694
2695class SendrecvmsgConnectedBase(SendrecvmsgBase):
2696 # Base class for tests on connected sockets. Users must supply
2697 # sockets on attributes serv_conn and cli_conn (representing the
2698 # connections *to* the server and the client), to be mapped to
2699 # cli_sock and serv_sock respectively.
2700
2701 @property
2702 def serv_sock(self):
2703 return self.cli_conn
2704
2705 @property
2706 def cli_sock(self):
2707 return self.serv_conn
2708
2709 def checkRecvmsgAddress(self, addr1, addr2):
2710 # Address is currently "unspecified" for a connected socket,
2711 # so we don't examine it
2712 pass
2713
2714
2715class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2716 # Base class to set a timeout on server's socket.
2717
2718 def setUp(self):
2719 super().setUp()
2720 self.serv_sock.settimeout(self.fail_timeout)
2721
2722
2723class SendmsgTests(SendrecvmsgServerTimeoutBase):
2724 # Tests for sendmsg() which can use any socket type and do not
2725 # involve recvmsg() or recvmsg_into().
2726
2727 def testSendmsg(self):
2728 # Send a simple message with sendmsg().
2729 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2730
2731 def _testSendmsg(self):
2732 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2733
2734 def testSendmsgDataGenerator(self):
2735 # Send from buffer obtained from a generator (not a sequence).
2736 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2737
2738 def _testSendmsgDataGenerator(self):
2739 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2740 len(MSG))
2741
2742 def testSendmsgAncillaryGenerator(self):
2743 # Gather (empty) ancillary data from a generator.
2744 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2745
2746 def _testSendmsgAncillaryGenerator(self):
2747 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2748 len(MSG))
2749
2750 def testSendmsgArray(self):
2751 # Send data from an array instead of the usual bytes object.
2752 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2753
2754 def _testSendmsgArray(self):
2755 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2756 len(MSG))
2757
2758 def testSendmsgGather(self):
2759 # Send message data from more than one buffer (gather write).
2760 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2761
2762 def _testSendmsgGather(self):
2763 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2764
2765 def testSendmsgBadArgs(self):
2766 # Check that sendmsg() rejects invalid arguments.
2767 self.assertEqual(self.serv_sock.recv(1000), b"done")
2768
2769 def _testSendmsgBadArgs(self):
2770 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2771 self.assertRaises(TypeError, self.sendmsgToServer,
2772 b"not in an iterable")
2773 self.assertRaises(TypeError, self.sendmsgToServer,
2774 object())
2775 self.assertRaises(TypeError, self.sendmsgToServer,
2776 [object()])
2777 self.assertRaises(TypeError, self.sendmsgToServer,
2778 [MSG, object()])
2779 self.assertRaises(TypeError, self.sendmsgToServer,
2780 [MSG], object())
2781 self.assertRaises(TypeError, self.sendmsgToServer,
2782 [MSG], [], object())
2783 self.assertRaises(TypeError, self.sendmsgToServer,
2784 [MSG], [], 0, object())
2785 self.sendToServer(b"done")
2786
2787 def testSendmsgBadCmsg(self):
2788 # Check that invalid ancillary data items are rejected.
2789 self.assertEqual(self.serv_sock.recv(1000), b"done")
2790
2791 def _testSendmsgBadCmsg(self):
2792 self.assertRaises(TypeError, self.sendmsgToServer,
2793 [MSG], [object()])
2794 self.assertRaises(TypeError, self.sendmsgToServer,
2795 [MSG], [(object(), 0, b"data")])
2796 self.assertRaises(TypeError, self.sendmsgToServer,
2797 [MSG], [(0, object(), b"data")])
2798 self.assertRaises(TypeError, self.sendmsgToServer,
2799 [MSG], [(0, 0, object())])
2800 self.assertRaises(TypeError, self.sendmsgToServer,
2801 [MSG], [(0, 0)])
2802 self.assertRaises(TypeError, self.sendmsgToServer,
2803 [MSG], [(0, 0, b"data", 42)])
2804 self.sendToServer(b"done")
2805
2806 @requireAttrs(socket, "CMSG_SPACE")
2807 def testSendmsgBadMultiCmsg(self):
2808 # Check that invalid ancillary data items are rejected when
2809 # more than one item is present.
2810 self.assertEqual(self.serv_sock.recv(1000), b"done")
2811
2812 @testSendmsgBadMultiCmsg.client_skip
2813 def _testSendmsgBadMultiCmsg(self):
2814 self.assertRaises(TypeError, self.sendmsgToServer,
2815 [MSG], [0, 0, b""])
2816 self.assertRaises(TypeError, self.sendmsgToServer,
2817 [MSG], [(0, 0, b""), object()])
2818 self.sendToServer(b"done")
2819
2820 def testSendmsgExcessCmsgReject(self):
2821 # Check that sendmsg() rejects excess ancillary data items
2822 # when the number that can be sent is limited.
2823 self.assertEqual(self.serv_sock.recv(1000), b"done")
2824
2825 def _testSendmsgExcessCmsgReject(self):
2826 if not hasattr(socket, "CMSG_SPACE"):
2827 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002828 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002829 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2830 self.assertIsNone(cm.exception.errno)
2831 self.sendToServer(b"done")
2832
2833 def testSendmsgAfterClose(self):
2834 # Check that sendmsg() fails on a closed socket.
2835 pass
2836
2837 def _testSendmsgAfterClose(self):
2838 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002839 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002840
2841
2842class SendmsgStreamTests(SendmsgTests):
2843 # Tests for sendmsg() which require a stream socket and do not
2844 # involve recvmsg() or recvmsg_into().
2845
2846 def testSendmsgExplicitNoneAddr(self):
2847 # Check that peer address can be specified as None.
2848 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2849
2850 def _testSendmsgExplicitNoneAddr(self):
2851 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2852
2853 def testSendmsgTimeout(self):
2854 # Check that timeout works with sendmsg().
2855 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2856 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2857
2858 def _testSendmsgTimeout(self):
2859 try:
2860 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002861 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002862 while True:
2863 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002864 except socket.timeout:
2865 pass
2866 except OSError as exc:
2867 if exc.errno != errno.ENOMEM:
2868 raise
2869 # bpo-33937 the test randomly fails on Travis CI with
2870 # "OSError: [Errno 12] Cannot allocate memory"
2871 else:
2872 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002873 finally:
2874 self.misc_event.set()
2875
2876 # XXX: would be nice to have more tests for sendmsg flags argument.
2877
2878 # Linux supports MSG_DONTWAIT when sending, but in general, it
2879 # only works when receiving. Could add other platforms if they
2880 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002881 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002882 "MSG_DONTWAIT not known to work on this platform when "
2883 "sending")
2884 def testSendmsgDontWait(self):
2885 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2886 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2887 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2888
2889 @testSendmsgDontWait.client_skip
2890 def _testSendmsgDontWait(self):
2891 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002892 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002893 while True:
2894 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002895 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2896 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002897 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07002898 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002899 finally:
2900 self.misc_event.set()
2901
2902
2903class SendmsgConnectionlessTests(SendmsgTests):
2904 # Tests for sendmsg() which require a connectionless-mode
2905 # (e.g. datagram) socket, and do not involve recvmsg() or
2906 # recvmsg_into().
2907
2908 def testSendmsgNoDestAddr(self):
2909 # Check that sendmsg() fails when no destination address is
2910 # given for unconnected socket.
2911 pass
2912
2913 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002914 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002915 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002916 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002917 [MSG], [], 0, None)
2918
2919
2920class RecvmsgGenericTests(SendrecvmsgBase):
2921 # Tests for recvmsg() which can also be emulated using
2922 # recvmsg_into(), and can use any socket type.
2923
2924 def testRecvmsg(self):
2925 # Receive a simple message with recvmsg[_into]().
2926 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2927 self.assertEqual(msg, MSG)
2928 self.checkRecvmsgAddress(addr, self.cli_addr)
2929 self.assertEqual(ancdata, [])
2930 self.checkFlags(flags, eor=True)
2931
2932 def _testRecvmsg(self):
2933 self.sendToServer(MSG)
2934
2935 def testRecvmsgExplicitDefaults(self):
2936 # Test recvmsg[_into]() with default arguments provided explicitly.
2937 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2938 len(MSG), 0, 0)
2939 self.assertEqual(msg, MSG)
2940 self.checkRecvmsgAddress(addr, self.cli_addr)
2941 self.assertEqual(ancdata, [])
2942 self.checkFlags(flags, eor=True)
2943
2944 def _testRecvmsgExplicitDefaults(self):
2945 self.sendToServer(MSG)
2946
2947 def testRecvmsgShorter(self):
2948 # Receive a message smaller than buffer.
2949 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2950 len(MSG) + 42)
2951 self.assertEqual(msg, MSG)
2952 self.checkRecvmsgAddress(addr, self.cli_addr)
2953 self.assertEqual(ancdata, [])
2954 self.checkFlags(flags, eor=True)
2955
2956 def _testRecvmsgShorter(self):
2957 self.sendToServer(MSG)
2958
2959 def testRecvmsgTrunc(self):
2960 # Receive part of message, check for truncation indicators.
2961 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2962 len(MSG) - 3)
2963 self.assertEqual(msg, MSG[:-3])
2964 self.checkRecvmsgAddress(addr, self.cli_addr)
2965 self.assertEqual(ancdata, [])
2966 self.checkFlags(flags, eor=False)
2967
2968 def _testRecvmsgTrunc(self):
2969 self.sendToServer(MSG)
2970
2971 def testRecvmsgShortAncillaryBuf(self):
2972 # Test ancillary data buffer too small to hold any ancillary data.
2973 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2974 len(MSG), 1)
2975 self.assertEqual(msg, MSG)
2976 self.checkRecvmsgAddress(addr, self.cli_addr)
2977 self.assertEqual(ancdata, [])
2978 self.checkFlags(flags, eor=True)
2979
2980 def _testRecvmsgShortAncillaryBuf(self):
2981 self.sendToServer(MSG)
2982
2983 def testRecvmsgLongAncillaryBuf(self):
2984 # Test large ancillary data buffer.
2985 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2986 len(MSG), 10240)
2987 self.assertEqual(msg, MSG)
2988 self.checkRecvmsgAddress(addr, self.cli_addr)
2989 self.assertEqual(ancdata, [])
2990 self.checkFlags(flags, eor=True)
2991
2992 def _testRecvmsgLongAncillaryBuf(self):
2993 self.sendToServer(MSG)
2994
2995 def testRecvmsgAfterClose(self):
2996 # Check that recvmsg[_into]() fails on a closed socket.
2997 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002998 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002999
3000 def _testRecvmsgAfterClose(self):
3001 pass
3002
3003 def testRecvmsgTimeout(self):
3004 # Check that timeout works.
3005 try:
3006 self.serv_sock.settimeout(0.03)
3007 self.assertRaises(socket.timeout,
3008 self.doRecvmsg, self.serv_sock, len(MSG))
3009 finally:
3010 self.misc_event.set()
3011
3012 def _testRecvmsgTimeout(self):
3013 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3014
3015 @requireAttrs(socket, "MSG_PEEK")
3016 def testRecvmsgPeek(self):
3017 # Check that MSG_PEEK in flags enables examination of pending
3018 # data without consuming it.
3019
3020 # Receive part of data with MSG_PEEK.
3021 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3022 len(MSG) - 3, 0,
3023 socket.MSG_PEEK)
3024 self.assertEqual(msg, MSG[:-3])
3025 self.checkRecvmsgAddress(addr, self.cli_addr)
3026 self.assertEqual(ancdata, [])
3027 # Ignoring MSG_TRUNC here (so this test is the same for stream
3028 # and datagram sockets). Some wording in POSIX seems to
3029 # suggest that it needn't be set when peeking, but that may
3030 # just be a slip.
3031 self.checkFlags(flags, eor=False,
3032 ignore=getattr(socket, "MSG_TRUNC", 0))
3033
3034 # Receive all data with MSG_PEEK.
3035 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3036 len(MSG), 0,
3037 socket.MSG_PEEK)
3038 self.assertEqual(msg, MSG)
3039 self.checkRecvmsgAddress(addr, self.cli_addr)
3040 self.assertEqual(ancdata, [])
3041 self.checkFlags(flags, eor=True)
3042
3043 # Check that the same data can still be received normally.
3044 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3045 self.assertEqual(msg, MSG)
3046 self.checkRecvmsgAddress(addr, self.cli_addr)
3047 self.assertEqual(ancdata, [])
3048 self.checkFlags(flags, eor=True)
3049
3050 @testRecvmsgPeek.client_skip
3051 def _testRecvmsgPeek(self):
3052 self.sendToServer(MSG)
3053
3054 @requireAttrs(socket.socket, "sendmsg")
3055 def testRecvmsgFromSendmsg(self):
3056 # Test receiving with recvmsg[_into]() when message is sent
3057 # using sendmsg().
3058 self.serv_sock.settimeout(self.fail_timeout)
3059 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3060 self.assertEqual(msg, MSG)
3061 self.checkRecvmsgAddress(addr, self.cli_addr)
3062 self.assertEqual(ancdata, [])
3063 self.checkFlags(flags, eor=True)
3064
3065 @testRecvmsgFromSendmsg.client_skip
3066 def _testRecvmsgFromSendmsg(self):
3067 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
3068
3069
3070class RecvmsgGenericStreamTests(RecvmsgGenericTests):
3071 # Tests which require a stream socket and can use either recvmsg()
3072 # or recvmsg_into().
3073
3074 def testRecvmsgEOF(self):
3075 # Receive end-of-stream indicator (b"", peer socket closed).
3076 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3077 self.assertEqual(msg, b"")
3078 self.checkRecvmsgAddress(addr, self.cli_addr)
3079 self.assertEqual(ancdata, [])
3080 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
3081
3082 def _testRecvmsgEOF(self):
3083 self.cli_sock.close()
3084
3085 def testRecvmsgOverflow(self):
3086 # Receive a message in more than one chunk.
3087 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3088 len(MSG) - 3)
3089 self.checkRecvmsgAddress(addr, self.cli_addr)
3090 self.assertEqual(ancdata, [])
3091 self.checkFlags(flags, eor=False)
3092
3093 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3094 self.checkRecvmsgAddress(addr, self.cli_addr)
3095 self.assertEqual(ancdata, [])
3096 self.checkFlags(flags, eor=True)
3097
3098 msg = seg1 + seg2
3099 self.assertEqual(msg, MSG)
3100
3101 def _testRecvmsgOverflow(self):
3102 self.sendToServer(MSG)
3103
3104
3105class RecvmsgTests(RecvmsgGenericTests):
3106 # Tests for recvmsg() which can use any socket type.
3107
3108 def testRecvmsgBadArgs(self):
3109 # Check that recvmsg() rejects invalid arguments.
3110 self.assertRaises(TypeError, self.serv_sock.recvmsg)
3111 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3112 -1, 0, 0)
3113 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3114 len(MSG), -1, 0)
3115 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3116 [bytearray(10)], 0, 0)
3117 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3118 object(), 0, 0)
3119 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3120 len(MSG), object(), 0)
3121 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3122 len(MSG), 0, object())
3123
3124 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3125 self.assertEqual(msg, MSG)
3126 self.checkRecvmsgAddress(addr, self.cli_addr)
3127 self.assertEqual(ancdata, [])
3128 self.checkFlags(flags, eor=True)
3129
3130 def _testRecvmsgBadArgs(self):
3131 self.sendToServer(MSG)
3132
3133
3134class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3135 # Tests for recvmsg_into() which can use any socket type.
3136
3137 def testRecvmsgIntoBadArgs(self):
3138 # Check that recvmsg_into() rejects invalid arguments.
3139 buf = bytearray(len(MSG))
3140 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3141 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3142 len(MSG), 0, 0)
3143 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3144 buf, 0, 0)
3145 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3146 [object()], 0, 0)
3147 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3148 [b"I'm not writable"], 0, 0)
3149 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3150 [buf, object()], 0, 0)
3151 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3152 [buf], -1, 0)
3153 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3154 [buf], object(), 0)
3155 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3156 [buf], 0, object())
3157
3158 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3159 self.assertEqual(nbytes, len(MSG))
3160 self.assertEqual(buf, bytearray(MSG))
3161 self.checkRecvmsgAddress(addr, self.cli_addr)
3162 self.assertEqual(ancdata, [])
3163 self.checkFlags(flags, eor=True)
3164
3165 def _testRecvmsgIntoBadArgs(self):
3166 self.sendToServer(MSG)
3167
3168 def testRecvmsgIntoGenerator(self):
3169 # Receive into buffer obtained from a generator (not a sequence).
3170 buf = bytearray(len(MSG))
3171 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3172 (o for o in [buf]))
3173 self.assertEqual(nbytes, len(MSG))
3174 self.assertEqual(buf, bytearray(MSG))
3175 self.checkRecvmsgAddress(addr, self.cli_addr)
3176 self.assertEqual(ancdata, [])
3177 self.checkFlags(flags, eor=True)
3178
3179 def _testRecvmsgIntoGenerator(self):
3180 self.sendToServer(MSG)
3181
3182 def testRecvmsgIntoArray(self):
3183 # Receive into an array rather than the usual bytearray.
3184 buf = array.array("B", [0] * len(MSG))
3185 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3186 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003187 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003188 self.checkRecvmsgAddress(addr, self.cli_addr)
3189 self.assertEqual(ancdata, [])
3190 self.checkFlags(flags, eor=True)
3191
3192 def _testRecvmsgIntoArray(self):
3193 self.sendToServer(MSG)
3194
3195 def testRecvmsgIntoScatter(self):
3196 # Receive into multiple buffers (scatter write).
3197 b1 = bytearray(b"----")
3198 b2 = bytearray(b"0123456789")
3199 b3 = bytearray(b"--------------")
3200 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3201 [b1, memoryview(b2)[2:9], b3])
3202 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3203 self.assertEqual(b1, bytearray(b"Mary"))
3204 self.assertEqual(b2, bytearray(b"01 had a 9"))
3205 self.assertEqual(b3, bytearray(b"little lamb---"))
3206 self.checkRecvmsgAddress(addr, self.cli_addr)
3207 self.assertEqual(ancdata, [])
3208 self.checkFlags(flags, eor=True)
3209
3210 def _testRecvmsgIntoScatter(self):
3211 self.sendToServer(b"Mary had a little lamb")
3212
3213
3214class CmsgMacroTests(unittest.TestCase):
3215 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3216 # assumptions used by sendmsg() and recvmsg[_into](), which share
3217 # code with these functions.
3218
3219 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003220 try:
3221 import _testcapi
3222 except ImportError:
3223 socklen_t_limit = 0x7fffffff
3224 else:
3225 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003226
3227 @requireAttrs(socket, "CMSG_LEN")
3228 def testCMSG_LEN(self):
3229 # Test CMSG_LEN() with various valid and invalid values,
3230 # checking the assumptions used by recvmsg() and sendmsg().
3231 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3232 values = list(range(257)) + list(range(toobig - 257, toobig))
3233
3234 # struct cmsghdr has at least three members, two of which are ints
3235 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3236 for n in values:
3237 ret = socket.CMSG_LEN(n)
3238 # This is how recvmsg() calculates the data size
3239 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3240 self.assertLessEqual(ret, self.socklen_t_limit)
3241
3242 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3243 # sendmsg() shares code with these functions, and requires
3244 # that it reject values over the limit.
3245 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3246 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3247
3248 @requireAttrs(socket, "CMSG_SPACE")
3249 def testCMSG_SPACE(self):
3250 # Test CMSG_SPACE() with various valid and invalid values,
3251 # checking the assumptions used by sendmsg().
3252 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3253 values = list(range(257)) + list(range(toobig - 257, toobig))
3254
3255 last = socket.CMSG_SPACE(0)
3256 # struct cmsghdr has at least three members, two of which are ints
3257 self.assertGreater(last, array.array("i").itemsize * 2)
3258 for n in values:
3259 ret = socket.CMSG_SPACE(n)
3260 self.assertGreaterEqual(ret, last)
3261 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3262 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3263 self.assertLessEqual(ret, self.socklen_t_limit)
3264 last = ret
3265
3266 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3267 # sendmsg() shares code with these functions, and requires
3268 # that it reject values over the limit.
3269 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3270 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3271
3272
3273class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3274 # Tests for file descriptor passing on Unix-domain sockets.
3275
3276 # Invalid file descriptor value that's unlikely to evaluate to a
3277 # real FD even if one of its bytes is replaced with a different
3278 # value (which shouldn't actually happen).
3279 badfd = -0x5555
3280
3281 def newFDs(self, n):
3282 # Return a list of n file descriptors for newly-created files
3283 # containing their list indices as ASCII numbers.
3284 fds = []
3285 for i in range(n):
3286 fd, path = tempfile.mkstemp()
3287 self.addCleanup(os.unlink, path)
3288 self.addCleanup(os.close, fd)
3289 os.write(fd, str(i).encode())
3290 fds.append(fd)
3291 return fds
3292
3293 def checkFDs(self, fds):
3294 # Check that the file descriptors in the given list contain
3295 # their correct list indices as ASCII numbers.
3296 for n, fd in enumerate(fds):
3297 os.lseek(fd, 0, os.SEEK_SET)
3298 self.assertEqual(os.read(fd, 1024), str(n).encode())
3299
3300 def registerRecvmsgResult(self, result):
3301 self.addCleanup(self.closeRecvmsgFDs, result)
3302
3303 def closeRecvmsgFDs(self, recvmsg_result):
3304 # Close all file descriptors specified in the ancillary data
3305 # of the given return value from recvmsg() or recvmsg_into().
3306 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3307 if (cmsg_level == socket.SOL_SOCKET and
3308 cmsg_type == socket.SCM_RIGHTS):
3309 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003310 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003311 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3312 for fd in fds:
3313 os.close(fd)
3314
3315 def createAndSendFDs(self, n):
3316 # Send n new file descriptors created by newFDs() to the
3317 # server, with the constant MSG as the non-ancillary data.
3318 self.assertEqual(
3319 self.sendmsgToServer([MSG],
3320 [(socket.SOL_SOCKET,
3321 socket.SCM_RIGHTS,
3322 array.array("i", self.newFDs(n)))]),
3323 len(MSG))
3324
3325 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3326 # Check that constant MSG was received with numfds file
3327 # descriptors in a maximum of maxcmsgs control messages (which
3328 # must contain only complete integers). By default, check
3329 # that MSG_CTRUNC is unset, but ignore any flags in
3330 # ignoreflags.
3331 msg, ancdata, flags, addr = result
3332 self.assertEqual(msg, MSG)
3333 self.checkRecvmsgAddress(addr, self.cli_addr)
3334 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3335 ignore=ignoreflags)
3336
3337 self.assertIsInstance(ancdata, list)
3338 self.assertLessEqual(len(ancdata), maxcmsgs)
3339 fds = array.array("i")
3340 for item in ancdata:
3341 self.assertIsInstance(item, tuple)
3342 cmsg_level, cmsg_type, cmsg_data = item
3343 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3344 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3345 self.assertIsInstance(cmsg_data, bytes)
3346 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003347 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003348
3349 self.assertEqual(len(fds), numfds)
3350 self.checkFDs(fds)
3351
3352 def testFDPassSimple(self):
3353 # Pass a single FD (array read from bytes object).
3354 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3355 len(MSG), 10240))
3356
3357 def _testFDPassSimple(self):
3358 self.assertEqual(
3359 self.sendmsgToServer(
3360 [MSG],
3361 [(socket.SOL_SOCKET,
3362 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003363 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003364 len(MSG))
3365
3366 def testMultipleFDPass(self):
3367 # Pass multiple FDs in a single array.
3368 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3369 len(MSG), 10240))
3370
3371 def _testMultipleFDPass(self):
3372 self.createAndSendFDs(4)
3373
3374 @requireAttrs(socket, "CMSG_SPACE")
3375 def testFDPassCMSG_SPACE(self):
3376 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3377 self.checkRecvmsgFDs(
3378 4, self.doRecvmsg(self.serv_sock, len(MSG),
3379 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3380
3381 @testFDPassCMSG_SPACE.client_skip
3382 def _testFDPassCMSG_SPACE(self):
3383 self.createAndSendFDs(4)
3384
3385 def testFDPassCMSG_LEN(self):
3386 # Test using CMSG_LEN() to calculate ancillary buffer size.
3387 self.checkRecvmsgFDs(1,
3388 self.doRecvmsg(self.serv_sock, len(MSG),
3389 socket.CMSG_LEN(4 * SIZEOF_INT)),
3390 # RFC 3542 says implementations may set
3391 # MSG_CTRUNC if there isn't enough space
3392 # for trailing padding.
3393 ignoreflags=socket.MSG_CTRUNC)
3394
3395 def _testFDPassCMSG_LEN(self):
3396 self.createAndSendFDs(1)
3397
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003398 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003399 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003400 @requireAttrs(socket, "CMSG_SPACE")
3401 def testFDPassSeparate(self):
3402 # Pass two FDs in two separate arrays. Arrays may be combined
3403 # into a single control message by the OS.
3404 self.checkRecvmsgFDs(2,
3405 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3406 maxcmsgs=2)
3407
3408 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003409 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003410 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003411 def _testFDPassSeparate(self):
3412 fd0, fd1 = self.newFDs(2)
3413 self.assertEqual(
3414 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3415 socket.SCM_RIGHTS,
3416 array.array("i", [fd0])),
3417 (socket.SOL_SOCKET,
3418 socket.SCM_RIGHTS,
3419 array.array("i", [fd1]))]),
3420 len(MSG))
3421
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003422 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003423 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003424 @requireAttrs(socket, "CMSG_SPACE")
3425 def testFDPassSeparateMinSpace(self):
3426 # Pass two FDs in two separate arrays, receiving them into the
3427 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003428 num_fds = 2
3429 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003430 self.doRecvmsg(self.serv_sock, len(MSG),
3431 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003432 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003433 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3434
3435 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003436 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003437 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003438 def _testFDPassSeparateMinSpace(self):
3439 fd0, fd1 = self.newFDs(2)
3440 self.assertEqual(
3441 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3442 socket.SCM_RIGHTS,
3443 array.array("i", [fd0])),
3444 (socket.SOL_SOCKET,
3445 socket.SCM_RIGHTS,
3446 array.array("i", [fd1]))]),
3447 len(MSG))
3448
3449 def sendAncillaryIfPossible(self, msg, ancdata):
3450 # Try to send msg and ancdata to server, but if the system
3451 # call fails, just send msg with no ancillary data.
3452 try:
3453 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003454 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003455 # Check that it was the system call that failed
3456 self.assertIsInstance(e.errno, int)
3457 nbytes = self.sendmsgToServer([msg])
3458 self.assertEqual(nbytes, len(msg))
3459
Brett Cannon3bbad122015-12-28 17:21:44 -08003460 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003461 def testFDPassEmpty(self):
3462 # Try to pass an empty FD array. Can receive either no array
3463 # or an empty array.
3464 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3465 len(MSG), 10240),
3466 ignoreflags=socket.MSG_CTRUNC)
3467
3468 def _testFDPassEmpty(self):
3469 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3470 socket.SCM_RIGHTS,
3471 b"")])
3472
3473 def testFDPassPartialInt(self):
3474 # Try to pass a truncated FD array.
3475 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3476 len(MSG), 10240)
3477 self.assertEqual(msg, MSG)
3478 self.checkRecvmsgAddress(addr, self.cli_addr)
3479 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3480 self.assertLessEqual(len(ancdata), 1)
3481 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3482 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3483 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3484 self.assertLess(len(cmsg_data), SIZEOF_INT)
3485
3486 def _testFDPassPartialInt(self):
3487 self.sendAncillaryIfPossible(
3488 MSG,
3489 [(socket.SOL_SOCKET,
3490 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003491 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003492
3493 @requireAttrs(socket, "CMSG_SPACE")
3494 def testFDPassPartialIntInMiddle(self):
3495 # Try to pass two FD arrays, the first of which is truncated.
3496 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3497 len(MSG), 10240)
3498 self.assertEqual(msg, MSG)
3499 self.checkRecvmsgAddress(addr, self.cli_addr)
3500 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3501 self.assertLessEqual(len(ancdata), 2)
3502 fds = array.array("i")
3503 # Arrays may have been combined in a single control message
3504 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3505 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3506 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003507 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003508 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3509 self.assertLessEqual(len(fds), 2)
3510 self.checkFDs(fds)
3511
3512 @testFDPassPartialIntInMiddle.client_skip
3513 def _testFDPassPartialIntInMiddle(self):
3514 fd0, fd1 = self.newFDs(2)
3515 self.sendAncillaryIfPossible(
3516 MSG,
3517 [(socket.SOL_SOCKET,
3518 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003519 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003520 (socket.SOL_SOCKET,
3521 socket.SCM_RIGHTS,
3522 array.array("i", [fd1]))])
3523
3524 def checkTruncatedHeader(self, result, ignoreflags=0):
3525 # Check that no ancillary data items are returned when data is
3526 # truncated inside the cmsghdr structure.
3527 msg, ancdata, flags, addr = result
3528 self.assertEqual(msg, MSG)
3529 self.checkRecvmsgAddress(addr, self.cli_addr)
3530 self.assertEqual(ancdata, [])
3531 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3532 ignore=ignoreflags)
3533
3534 def testCmsgTruncNoBufSize(self):
3535 # Check that no ancillary data is received when no buffer size
3536 # is specified.
3537 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3538 # BSD seems to set MSG_CTRUNC only
3539 # if an item has been partially
3540 # received.
3541 ignoreflags=socket.MSG_CTRUNC)
3542
3543 def _testCmsgTruncNoBufSize(self):
3544 self.createAndSendFDs(1)
3545
3546 def testCmsgTrunc0(self):
3547 # Check that no ancillary data is received when buffer size is 0.
3548 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3549 ignoreflags=socket.MSG_CTRUNC)
3550
3551 def _testCmsgTrunc0(self):
3552 self.createAndSendFDs(1)
3553
3554 # Check that no ancillary data is returned for various non-zero
3555 # (but still too small) buffer sizes.
3556
3557 def testCmsgTrunc1(self):
3558 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3559
3560 def _testCmsgTrunc1(self):
3561 self.createAndSendFDs(1)
3562
3563 def testCmsgTrunc2Int(self):
3564 # The cmsghdr structure has at least three members, two of
3565 # which are ints, so we still shouldn't see any ancillary
3566 # data.
3567 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3568 SIZEOF_INT * 2))
3569
3570 def _testCmsgTrunc2Int(self):
3571 self.createAndSendFDs(1)
3572
3573 def testCmsgTruncLen0Minus1(self):
3574 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3575 socket.CMSG_LEN(0) - 1))
3576
3577 def _testCmsgTruncLen0Minus1(self):
3578 self.createAndSendFDs(1)
3579
3580 # The following tests try to truncate the control message in the
3581 # middle of the FD array.
3582
3583 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3584 # Check that file descriptor data is truncated to between
3585 # mindata and maxdata bytes when received with buffer size
3586 # ancbuf, and that any complete file descriptor numbers are
3587 # valid.
3588 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3589 len(MSG), ancbuf)
3590 self.assertEqual(msg, MSG)
3591 self.checkRecvmsgAddress(addr, self.cli_addr)
3592 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3593
3594 if mindata == 0 and ancdata == []:
3595 return
3596 self.assertEqual(len(ancdata), 1)
3597 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3598 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3599 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3600 self.assertGreaterEqual(len(cmsg_data), mindata)
3601 self.assertLessEqual(len(cmsg_data), maxdata)
3602 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003603 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003604 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3605 self.checkFDs(fds)
3606
3607 def testCmsgTruncLen0(self):
3608 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3609
3610 def _testCmsgTruncLen0(self):
3611 self.createAndSendFDs(1)
3612
3613 def testCmsgTruncLen0Plus1(self):
3614 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3615
3616 def _testCmsgTruncLen0Plus1(self):
3617 self.createAndSendFDs(2)
3618
3619 def testCmsgTruncLen1(self):
3620 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3621 maxdata=SIZEOF_INT)
3622
3623 def _testCmsgTruncLen1(self):
3624 self.createAndSendFDs(2)
3625
3626 def testCmsgTruncLen2Minus1(self):
3627 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3628 maxdata=(2 * SIZEOF_INT) - 1)
3629
3630 def _testCmsgTruncLen2Minus1(self):
3631 self.createAndSendFDs(2)
3632
3633
3634class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3635 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3636 # features of the RFC 3542 Advanced Sockets API for IPv6.
3637 # Currently we can only handle certain data items (e.g. traffic
3638 # class, hop limit, MTU discovery and fragmentation settings)
3639 # without resorting to unportable means such as the struct module,
3640 # but the tests here are aimed at testing the ancillary data
3641 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3642 # itself.
3643
3644 # Test value to use when setting hop limit of packet
3645 hop_limit = 2
3646
3647 # Test value to use when setting traffic class of packet.
3648 # -1 means "use kernel default".
3649 traffic_class = -1
3650
3651 def ancillaryMapping(self, ancdata):
3652 # Given ancillary data list ancdata, return a mapping from
3653 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3654 # Check that no (level, type) pair appears more than once.
3655 d = {}
3656 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3657 self.assertNotIn((cmsg_level, cmsg_type), d)
3658 d[(cmsg_level, cmsg_type)] = cmsg_data
3659 return d
3660
3661 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3662 # Receive hop limit into ancbufsize bytes of ancillary data
3663 # space. Check that data is MSG, ancillary data is not
3664 # truncated (but ignore any flags in ignoreflags), and hop
3665 # limit is between 0 and maxhop inclusive.
3666 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3667 socket.IPV6_RECVHOPLIMIT, 1)
3668 self.misc_event.set()
3669 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3670 len(MSG), ancbufsize)
3671
3672 self.assertEqual(msg, MSG)
3673 self.checkRecvmsgAddress(addr, self.cli_addr)
3674 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3675 ignore=ignoreflags)
3676
3677 self.assertEqual(len(ancdata), 1)
3678 self.assertIsInstance(ancdata[0], tuple)
3679 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3680 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3681 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3682 self.assertIsInstance(cmsg_data, bytes)
3683 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3684 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003685 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003686 self.assertGreaterEqual(a[0], 0)
3687 self.assertLessEqual(a[0], maxhop)
3688
3689 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3690 def testRecvHopLimit(self):
3691 # Test receiving the packet hop limit as ancillary data.
3692 self.checkHopLimit(ancbufsize=10240)
3693
3694 @testRecvHopLimit.client_skip
3695 def _testRecvHopLimit(self):
3696 # Need to wait until server has asked to receive ancillary
3697 # data, as implementations are not required to buffer it
3698 # otherwise.
3699 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3700 self.sendToServer(MSG)
3701
3702 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3703 def testRecvHopLimitCMSG_SPACE(self):
3704 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3705 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3706
3707 @testRecvHopLimitCMSG_SPACE.client_skip
3708 def _testRecvHopLimitCMSG_SPACE(self):
3709 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3710 self.sendToServer(MSG)
3711
3712 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3713 # 3542 says portable applications must provide space for trailing
3714 # padding. Implementations may set MSG_CTRUNC if there isn't
3715 # enough space for the padding.
3716
3717 @requireAttrs(socket.socket, "sendmsg")
3718 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3719 def testSetHopLimit(self):
3720 # Test setting hop limit on outgoing packet and receiving it
3721 # at the other end.
3722 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3723
3724 @testSetHopLimit.client_skip
3725 def _testSetHopLimit(self):
3726 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3727 self.assertEqual(
3728 self.sendmsgToServer([MSG],
3729 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3730 array.array("i", [self.hop_limit]))]),
3731 len(MSG))
3732
3733 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3734 ignoreflags=0):
3735 # Receive traffic class and hop limit into ancbufsize bytes of
3736 # ancillary data space. Check that data is MSG, ancillary
3737 # data is not truncated (but ignore any flags in ignoreflags),
3738 # and traffic class and hop limit are in range (hop limit no
3739 # more than maxhop).
3740 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3741 socket.IPV6_RECVHOPLIMIT, 1)
3742 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3743 socket.IPV6_RECVTCLASS, 1)
3744 self.misc_event.set()
3745 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3746 len(MSG), ancbufsize)
3747
3748 self.assertEqual(msg, MSG)
3749 self.checkRecvmsgAddress(addr, self.cli_addr)
3750 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3751 ignore=ignoreflags)
3752 self.assertEqual(len(ancdata), 2)
3753 ancmap = self.ancillaryMapping(ancdata)
3754
3755 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3756 self.assertEqual(len(tcdata), SIZEOF_INT)
3757 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003758 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003759 self.assertGreaterEqual(a[0], 0)
3760 self.assertLessEqual(a[0], 255)
3761
3762 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3763 self.assertEqual(len(hldata), SIZEOF_INT)
3764 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003765 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003766 self.assertGreaterEqual(a[0], 0)
3767 self.assertLessEqual(a[0], maxhop)
3768
3769 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3770 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3771 def testRecvTrafficClassAndHopLimit(self):
3772 # Test receiving traffic class and hop limit as ancillary data.
3773 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3774
3775 @testRecvTrafficClassAndHopLimit.client_skip
3776 def _testRecvTrafficClassAndHopLimit(self):
3777 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3778 self.sendToServer(MSG)
3779
3780 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3781 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3782 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3783 # Test receiving traffic class and hop limit, using
3784 # CMSG_SPACE() to calculate buffer size.
3785 self.checkTrafficClassAndHopLimit(
3786 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3787
3788 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3789 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3790 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3791 self.sendToServer(MSG)
3792
3793 @requireAttrs(socket.socket, "sendmsg")
3794 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3795 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3796 def testSetTrafficClassAndHopLimit(self):
3797 # Test setting traffic class and hop limit on outgoing packet,
3798 # and receiving them at the other end.
3799 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3800 maxhop=self.hop_limit)
3801
3802 @testSetTrafficClassAndHopLimit.client_skip
3803 def _testSetTrafficClassAndHopLimit(self):
3804 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3805 self.assertEqual(
3806 self.sendmsgToServer([MSG],
3807 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3808 array.array("i", [self.traffic_class])),
3809 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3810 array.array("i", [self.hop_limit]))]),
3811 len(MSG))
3812
3813 @requireAttrs(socket.socket, "sendmsg")
3814 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3815 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3816 def testOddCmsgSize(self):
3817 # Try to send ancillary data with first item one byte too
3818 # long. Fall back to sending with correct size if this fails,
3819 # and check that second item was handled correctly.
3820 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3821 maxhop=self.hop_limit)
3822
3823 @testOddCmsgSize.client_skip
3824 def _testOddCmsgSize(self):
3825 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3826 try:
3827 nbytes = self.sendmsgToServer(
3828 [MSG],
3829 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003830 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003831 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3832 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003833 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003834 self.assertIsInstance(e.errno, int)
3835 nbytes = self.sendmsgToServer(
3836 [MSG],
3837 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3838 array.array("i", [self.traffic_class])),
3839 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3840 array.array("i", [self.hop_limit]))])
3841 self.assertEqual(nbytes, len(MSG))
3842
3843 # Tests for proper handling of truncated ancillary data
3844
3845 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3846 # Receive hop limit into ancbufsize bytes of ancillary data
3847 # space, which should be too small to contain the ancillary
3848 # data header (if ancbufsize is None, pass no second argument
3849 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3850 # (unless included in ignoreflags), and no ancillary data is
3851 # returned.
3852 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3853 socket.IPV6_RECVHOPLIMIT, 1)
3854 self.misc_event.set()
3855 args = () if ancbufsize is None else (ancbufsize,)
3856 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3857 len(MSG), *args)
3858
3859 self.assertEqual(msg, MSG)
3860 self.checkRecvmsgAddress(addr, self.cli_addr)
3861 self.assertEqual(ancdata, [])
3862 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3863 ignore=ignoreflags)
3864
3865 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3866 def testCmsgTruncNoBufSize(self):
3867 # Check that no ancillary data is received when no ancillary
3868 # buffer size is provided.
3869 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3870 # BSD seems to set
3871 # MSG_CTRUNC only if an item
3872 # has been partially
3873 # received.
3874 ignoreflags=socket.MSG_CTRUNC)
3875
3876 @testCmsgTruncNoBufSize.client_skip
3877 def _testCmsgTruncNoBufSize(self):
3878 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3879 self.sendToServer(MSG)
3880
3881 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3882 def testSingleCmsgTrunc0(self):
3883 # Check that no ancillary data is received when ancillary
3884 # buffer size is zero.
3885 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3886 ignoreflags=socket.MSG_CTRUNC)
3887
3888 @testSingleCmsgTrunc0.client_skip
3889 def _testSingleCmsgTrunc0(self):
3890 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3891 self.sendToServer(MSG)
3892
3893 # Check that no ancillary data is returned for various non-zero
3894 # (but still too small) buffer sizes.
3895
3896 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3897 def testSingleCmsgTrunc1(self):
3898 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3899
3900 @testSingleCmsgTrunc1.client_skip
3901 def _testSingleCmsgTrunc1(self):
3902 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3903 self.sendToServer(MSG)
3904
3905 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3906 def testSingleCmsgTrunc2Int(self):
3907 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3908
3909 @testSingleCmsgTrunc2Int.client_skip
3910 def _testSingleCmsgTrunc2Int(self):
3911 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3912 self.sendToServer(MSG)
3913
3914 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3915 def testSingleCmsgTruncLen0Minus1(self):
3916 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3917
3918 @testSingleCmsgTruncLen0Minus1.client_skip
3919 def _testSingleCmsgTruncLen0Minus1(self):
3920 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3921 self.sendToServer(MSG)
3922
3923 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3924 def testSingleCmsgTruncInData(self):
3925 # Test truncation of a control message inside its associated
3926 # data. The message may be returned with its data truncated,
3927 # or not returned at all.
3928 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3929 socket.IPV6_RECVHOPLIMIT, 1)
3930 self.misc_event.set()
3931 msg, ancdata, flags, addr = self.doRecvmsg(
3932 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3933
3934 self.assertEqual(msg, MSG)
3935 self.checkRecvmsgAddress(addr, self.cli_addr)
3936 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3937
3938 self.assertLessEqual(len(ancdata), 1)
3939 if ancdata:
3940 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3941 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3942 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3943 self.assertLess(len(cmsg_data), SIZEOF_INT)
3944
3945 @testSingleCmsgTruncInData.client_skip
3946 def _testSingleCmsgTruncInData(self):
3947 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3948 self.sendToServer(MSG)
3949
3950 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3951 # Receive traffic class and hop limit into ancbufsize bytes of
3952 # ancillary data space, which should be large enough to
3953 # contain the first item, but too small to contain the header
3954 # of the second. Check that data is MSG, MSG_CTRUNC is set
3955 # (unless included in ignoreflags), and only one ancillary
3956 # data item is returned.
3957 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3958 socket.IPV6_RECVHOPLIMIT, 1)
3959 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3960 socket.IPV6_RECVTCLASS, 1)
3961 self.misc_event.set()
3962 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3963 len(MSG), ancbufsize)
3964
3965 self.assertEqual(msg, MSG)
3966 self.checkRecvmsgAddress(addr, self.cli_addr)
3967 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3968 ignore=ignoreflags)
3969
3970 self.assertEqual(len(ancdata), 1)
3971 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3972 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3973 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3974 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3975 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003976 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003977 self.assertGreaterEqual(a[0], 0)
3978 self.assertLessEqual(a[0], 255)
3979
3980 # Try the above test with various buffer sizes.
3981
3982 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3983 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3984 def testSecondCmsgTrunc0(self):
3985 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3986 ignoreflags=socket.MSG_CTRUNC)
3987
3988 @testSecondCmsgTrunc0.client_skip
3989 def _testSecondCmsgTrunc0(self):
3990 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3991 self.sendToServer(MSG)
3992
3993 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3994 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3995 def testSecondCmsgTrunc1(self):
3996 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3997
3998 @testSecondCmsgTrunc1.client_skip
3999 def _testSecondCmsgTrunc1(self):
4000 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4001 self.sendToServer(MSG)
4002
4003 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4004 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4005 def testSecondCmsgTrunc2Int(self):
4006 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4007 2 * SIZEOF_INT)
4008
4009 @testSecondCmsgTrunc2Int.client_skip
4010 def _testSecondCmsgTrunc2Int(self):
4011 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4012 self.sendToServer(MSG)
4013
4014 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4015 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4016 def testSecondCmsgTruncLen0Minus1(self):
4017 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4018 socket.CMSG_LEN(0) - 1)
4019
4020 @testSecondCmsgTruncLen0Minus1.client_skip
4021 def _testSecondCmsgTruncLen0Minus1(self):
4022 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4023 self.sendToServer(MSG)
4024
4025 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4026 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4027 def testSecomdCmsgTruncInData(self):
4028 # Test truncation of the second of two control messages inside
4029 # its associated data.
4030 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4031 socket.IPV6_RECVHOPLIMIT, 1)
4032 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4033 socket.IPV6_RECVTCLASS, 1)
4034 self.misc_event.set()
4035 msg, ancdata, flags, addr = self.doRecvmsg(
4036 self.serv_sock, len(MSG),
4037 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
4038
4039 self.assertEqual(msg, MSG)
4040 self.checkRecvmsgAddress(addr, self.cli_addr)
4041 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4042
4043 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
4044
4045 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4046 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4047 cmsg_types.remove(cmsg_type)
4048 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4049 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004050 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004051 self.assertGreaterEqual(a[0], 0)
4052 self.assertLessEqual(a[0], 255)
4053
4054 if ancdata:
4055 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4056 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4057 cmsg_types.remove(cmsg_type)
4058 self.assertLess(len(cmsg_data), SIZEOF_INT)
4059
4060 self.assertEqual(ancdata, [])
4061
4062 @testSecomdCmsgTruncInData.client_skip
4063 def _testSecomdCmsgTruncInData(self):
4064 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4065 self.sendToServer(MSG)
4066
4067
4068# Derive concrete test classes for different socket types.
4069
4070class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
4071 SendrecvmsgConnectionlessBase,
4072 ThreadedSocketTestMixin, UDPTestBase):
4073 pass
4074
4075@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004076class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
4077 pass
4078
4079@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004080class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
4081 pass
4082
4083@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004084class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
4085 pass
4086
4087
4088class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
4089 SendrecvmsgConnectionlessBase,
4090 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02004091
4092 def checkRecvmsgAddress(self, addr1, addr2):
4093 # Called to compare the received address with the address of
4094 # the peer, ignoring scope ID
4095 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004096
4097@requireAttrs(socket.socket, "sendmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004098@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004099@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004100class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
4101 pass
4102
4103@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004104@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004105@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004106class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
4107 pass
4108
4109@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004110@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004111@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004112class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
4113 pass
4114
4115@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004116@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004117@requireAttrs(socket, "IPPROTO_IPV6")
4118@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004119class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
4120 SendrecvmsgUDP6TestBase):
4121 pass
4122
4123@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004124@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004125@requireAttrs(socket, "IPPROTO_IPV6")
4126@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004127class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4128 RFC3542AncillaryTest,
4129 SendrecvmsgUDP6TestBase):
4130 pass
4131
4132
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004133@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4134 'UDPLITE sockets required for this test.')
4135class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
4136 SendrecvmsgConnectionlessBase,
4137 ThreadedSocketTestMixin, UDPLITETestBase):
4138 pass
4139
4140@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4141 'UDPLITE sockets required for this test.')
4142@requireAttrs(socket.socket, "sendmsg")
4143class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
4144 pass
4145
4146@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4147 'UDPLITE sockets required for this test.')
4148@requireAttrs(socket.socket, "recvmsg")
4149class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
4150 pass
4151
4152@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4153 'UDPLITE sockets required for this test.')
4154@requireAttrs(socket.socket, "recvmsg_into")
4155class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
4156 pass
4157
4158
4159@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4160 'UDPLITE sockets required for this test.')
4161class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
4162 SendrecvmsgConnectionlessBase,
4163 ThreadedSocketTestMixin, UDPLITE6TestBase):
4164
4165 def checkRecvmsgAddress(self, addr1, addr2):
4166 # Called to compare the received address with the address of
4167 # the peer, ignoring scope ID
4168 self.assertEqual(addr1[:-1], addr2[:-1])
4169
4170@requireAttrs(socket.socket, "sendmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004171@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004172@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4173 'UDPLITE sockets required for this test.')
4174@requireSocket("AF_INET6", "SOCK_DGRAM")
4175class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
4176 pass
4177
4178@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004179@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004180@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4181 'UDPLITE sockets required for this test.')
4182@requireSocket("AF_INET6", "SOCK_DGRAM")
4183class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
4184 pass
4185
4186@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004187@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004188@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4189 'UDPLITE sockets required for this test.')
4190@requireSocket("AF_INET6", "SOCK_DGRAM")
4191class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
4192 pass
4193
4194@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004195@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004196@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4197 'UDPLITE sockets required for this test.')
4198@requireAttrs(socket, "IPPROTO_IPV6")
4199@requireSocket("AF_INET6", "SOCK_DGRAM")
4200class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
4201 SendrecvmsgUDPLITE6TestBase):
4202 pass
4203
4204@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004205@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004206@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4207 'UDPLITE sockets required for this test.')
4208@requireAttrs(socket, "IPPROTO_IPV6")
4209@requireSocket("AF_INET6", "SOCK_DGRAM")
4210class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
4211 RFC3542AncillaryTest,
4212 SendrecvmsgUDPLITE6TestBase):
4213 pass
4214
4215
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004216class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4217 ConnectedStreamTestMixin, TCPTestBase):
4218 pass
4219
4220@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004221class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4222 pass
4223
4224@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004225class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4226 SendrecvmsgTCPTestBase):
4227 pass
4228
4229@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004230class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4231 SendrecvmsgTCPTestBase):
4232 pass
4233
4234
4235class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4236 SendrecvmsgConnectedBase,
4237 ConnectedStreamTestMixin, SCTPStreamBase):
4238 pass
4239
4240@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004241@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004242@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004243class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4244 pass
4245
4246@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004247@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004248@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004249class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4250 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004251
4252 def testRecvmsgEOF(self):
4253 try:
4254 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4255 except OSError as e:
4256 if e.errno != errno.ENOTCONN:
4257 raise
4258 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004259
4260@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004261@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004262@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004263class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4264 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004265
4266 def testRecvmsgEOF(self):
4267 try:
4268 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4269 except OSError as e:
4270 if e.errno != errno.ENOTCONN:
4271 raise
4272 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004273
4274
4275class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4276 ConnectedStreamTestMixin, UnixStreamBase):
4277 pass
4278
4279@requireAttrs(socket.socket, "sendmsg")
4280@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004281class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4282 pass
4283
4284@requireAttrs(socket.socket, "recvmsg")
4285@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004286class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4287 SendrecvmsgUnixStreamTestBase):
4288 pass
4289
4290@requireAttrs(socket.socket, "recvmsg_into")
4291@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004292class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4293 SendrecvmsgUnixStreamTestBase):
4294 pass
4295
4296@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4297@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004298class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4299 pass
4300
4301@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4302@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004303class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4304 SendrecvmsgUnixStreamTestBase):
4305 pass
4306
4307
4308# Test interrupting the interruptible send/receive methods with a
4309# signal when a timeout is set. These tests avoid having multiple
4310# threads alive during the test so that the OS cannot deliver the
4311# signal to the wrong one.
4312
4313class InterruptedTimeoutBase(unittest.TestCase):
4314 # Base class for interrupted send/receive tests. Installs an
4315 # empty handler for SIGALRM and removes it on teardown, along with
4316 # any scheduled alarms.
4317
4318 def setUp(self):
4319 super().setUp()
4320 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004321 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004322 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004323
4324 # Timeout for socket operations
Victor Stinner24c62582019-10-30 12:41:43 +01004325 timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004326
4327 # Provide setAlarm() method to schedule delivery of SIGALRM after
4328 # given number of seconds, or cancel it if zero, and an
4329 # appropriate time value to use. Use setitimer() if available.
4330 if hasattr(signal, "setitimer"):
4331 alarm_time = 0.05
4332
4333 def setAlarm(self, seconds):
4334 signal.setitimer(signal.ITIMER_REAL, seconds)
4335 else:
4336 # Old systems may deliver the alarm up to one second early
4337 alarm_time = 2
4338
4339 def setAlarm(self, seconds):
4340 signal.alarm(seconds)
4341
4342
4343# Require siginterrupt() in order to ensure that system calls are
4344# interrupted by default.
4345@requireAttrs(signal, "siginterrupt")
4346@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4347 "Don't have signal.alarm or signal.setitimer")
4348class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4349 # Test interrupting the recv*() methods with signals when a
4350 # timeout is set.
4351
4352 def setUp(self):
4353 super().setUp()
4354 self.serv.settimeout(self.timeout)
4355
4356 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004357 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004358 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004359 try:
4360 self.setAlarm(self.alarm_time)
4361 with self.assertRaises(ZeroDivisionError) as cm:
4362 func(*args, **kwargs)
4363 finally:
4364 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004365
4366 def testInterruptedRecvTimeout(self):
4367 self.checkInterruptedRecv(self.serv.recv, 1024)
4368
4369 def testInterruptedRecvIntoTimeout(self):
4370 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4371
4372 def testInterruptedRecvfromTimeout(self):
4373 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4374
4375 def testInterruptedRecvfromIntoTimeout(self):
4376 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4377
4378 @requireAttrs(socket.socket, "recvmsg")
4379 def testInterruptedRecvmsgTimeout(self):
4380 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4381
4382 @requireAttrs(socket.socket, "recvmsg_into")
4383 def testInterruptedRecvmsgIntoTimeout(self):
4384 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4385
4386
4387# Require siginterrupt() in order to ensure that system calls are
4388# interrupted by default.
4389@requireAttrs(signal, "siginterrupt")
4390@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4391 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004392class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4393 ThreadSafeCleanupTestCase,
4394 SocketListeningTestMixin, TCPTestBase):
4395 # Test interrupting the interruptible send*() methods with signals
4396 # when a timeout is set.
4397
4398 def setUp(self):
4399 super().setUp()
4400 self.serv_conn = self.newSocket()
4401 self.addCleanup(self.serv_conn.close)
4402 # Use a thread to complete the connection, but wait for it to
4403 # terminate before running the test, so that there is only one
4404 # thread to accept the signal.
4405 cli_thread = threading.Thread(target=self.doConnect)
4406 cli_thread.start()
4407 self.cli_conn, addr = self.serv.accept()
4408 self.addCleanup(self.cli_conn.close)
4409 cli_thread.join()
4410 self.serv_conn.settimeout(self.timeout)
4411
4412 def doConnect(self):
4413 self.serv_conn.connect(self.serv_addr)
4414
4415 def checkInterruptedSend(self, func, *args, **kwargs):
4416 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004417 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004418 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004419 try:
4420 with self.assertRaises(ZeroDivisionError) as cm:
4421 while True:
4422 self.setAlarm(self.alarm_time)
4423 func(*args, **kwargs)
4424 finally:
4425 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004426
Ned Deilyc5640382014-02-03 13:58:31 -08004427 # Issue #12958: The following tests have problems on OS X prior to 10.7
4428 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004429 def testInterruptedSendTimeout(self):
4430 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4431
Ned Deilyc5640382014-02-03 13:58:31 -08004432 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004433 def testInterruptedSendtoTimeout(self):
4434 # Passing an actual address here as Python's wrapper for
4435 # sendto() doesn't allow passing a zero-length one; POSIX
4436 # requires that the address is ignored since the socket is
4437 # connection-mode, however.
4438 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4439 self.serv_addr)
4440
Ned Deilyc5640382014-02-03 13:58:31 -08004441 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004442 @requireAttrs(socket.socket, "sendmsg")
4443 def testInterruptedSendmsgTimeout(self):
4444 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4445
4446
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004447class TCPCloserTest(ThreadedTCPSocketTest):
4448
4449 def testClose(self):
4450 conn, addr = self.serv.accept()
4451 conn.close()
4452
4453 sd = self.cli
4454 read, write, err = select.select([sd], [], [], 1.0)
4455 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004456 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004457
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004458 # Calling close() many times should be safe.
4459 conn.close()
4460 conn.close()
4461
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004462 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004463 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004464 time.sleep(1.0)
4465
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004466
Dave Cole331708b2004-08-09 04:51:41 +00004467class BasicSocketPairTest(SocketPairTest):
4468
4469 def __init__(self, methodName='runTest'):
4470 SocketPairTest.__init__(self, methodName=methodName)
4471
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004472 def _check_defaults(self, sock):
4473 self.assertIsInstance(sock, socket.socket)
4474 if hasattr(socket, 'AF_UNIX'):
4475 self.assertEqual(sock.family, socket.AF_UNIX)
4476 else:
4477 self.assertEqual(sock.family, socket.AF_INET)
4478 self.assertEqual(sock.type, socket.SOCK_STREAM)
4479 self.assertEqual(sock.proto, 0)
4480
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004481 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004482 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004483
4484 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004485 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004486
Dave Cole331708b2004-08-09 04:51:41 +00004487 def testRecv(self):
4488 msg = self.serv.recv(1024)
4489 self.assertEqual(msg, MSG)
4490
4491 def _testRecv(self):
4492 self.cli.send(MSG)
4493
4494 def testSend(self):
4495 self.serv.send(MSG)
4496
4497 def _testSend(self):
4498 msg = self.cli.recv(1024)
4499 self.assertEqual(msg, MSG)
4500
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004501
Guido van Rossum24e4af82002-06-12 19:18:08 +00004502class NonBlockingTCPTests(ThreadedTCPSocketTest):
4503
4504 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004505 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004506 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4507
Victor Stinner304315d2018-11-30 13:22:44 +01004508 def assert_sock_timeout(self, sock, timeout):
4509 self.assertEqual(self.serv.gettimeout(), timeout)
4510
4511 blocking = (timeout != 0.0)
4512 self.assertEqual(sock.getblocking(), blocking)
4513
4514 if fcntl is not None:
4515 # When a Python socket has a non-zero timeout, it's switched
4516 # internally to a non-blocking mode. Later, sock.sendall(),
4517 # sock.recv(), and other socket operations use a select() call and
4518 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4519 # timeouts are enforced.
4520 fd_blocking = (timeout is None)
4521
4522 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4523 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4524
Guido van Rossum24e4af82002-06-12 19:18:08 +00004525 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004526 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004527 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004528 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004529
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004530 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004531 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004532
4533 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004534 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004535
4536 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004537 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004538
4539 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004540 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004541
4542 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004543 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004544
4545 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004546 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004547
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004548 @support.cpython_only
4549 def testSetBlocking_overflow(self):
4550 # Issue 15989
4551 import _testcapi
4552 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4553 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004554
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004555 self.serv.setblocking(False)
4556 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004557
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004558 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4559 self.assertIsNone(self.serv.gettimeout())
4560
4561 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4562
Serhiy Storchaka43767632013-11-03 21:31:38 +02004563 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4564 'test needs socket.SOCK_NONBLOCK')
4565 @support.requires_linux_version(2, 6, 28)
4566 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004567 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004568 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004569 self.serv = socket.socket(socket.AF_INET,
4570 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4571 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004572
4573 def _testInitNonBlocking(self):
4574 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004575
Victor Stinner304315d2018-11-30 13:22:44 +01004576 def testInheritFlagsBlocking(self):
4577 # bpo-7995: accept() on a listening socket with a timeout and the
4578 # default timeout is None, the resulting socket must be blocking.
4579 with socket_setdefaulttimeout(None):
4580 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004581 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004582 self.addCleanup(conn.close)
4583 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004584
Victor Stinner304315d2018-11-30 13:22:44 +01004585 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004586 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004587
4588 def testInheritFlagsTimeout(self):
4589 # bpo-7995: accept() on a listening socket with a timeout and the
4590 # default timeout is None, the resulting socket must inherit
4591 # the default timeout.
4592 default_timeout = 20.0
4593 with socket_setdefaulttimeout(default_timeout):
4594 self.serv.settimeout(10)
4595 conn, addr = self.serv.accept()
4596 self.addCleanup(conn.close)
4597 self.assertEqual(conn.gettimeout(), default_timeout)
4598
4599 def _testInheritFlagsTimeout(self):
4600 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004601
Guido van Rossum24e4af82002-06-12 19:18:08 +00004602 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004603 # Testing non-blocking accept
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004604 self.serv.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004605
4606 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004607 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004608 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004609 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004610 dt = time.monotonic() - start_time
4611 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004612
4613 self.event.set()
4614
Victor Stinner24c62582019-10-30 12:41:43 +01004615 read, write, err = select.select([self.serv], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004616 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004617 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004618
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004619 # connect() completed: non-blocking accept() doesn't block
4620 conn, addr = self.serv.accept()
4621 self.addCleanup(conn.close)
4622 self.assertIsNone(conn.gettimeout())
4623
Guido van Rossum24e4af82002-06-12 19:18:08 +00004624 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004625 # don't connect before event is set to check
4626 # that non-blocking accept() raises BlockingIOError
4627 self.event.wait()
4628
Christian Heimes5e696852008-04-09 08:37:03 +00004629 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004630
Guido van Rossum24e4af82002-06-12 19:18:08 +00004631 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004632 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004633 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004634 self.addCleanup(conn.close)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004635 conn.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004636
4637 # the server didn't send data yet: non-blocking recv() fails
4638 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004639 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004640
4641 self.event.set()
4642
Victor Stinner24c62582019-10-30 12:41:43 +01004643 read, write, err = select.select([conn], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004644 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004645 self.fail("Error during select call to non-blocking socket.")
4646
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004647 # the server sent data yet: non-blocking recv() doesn't block
4648 msg = conn.recv(len(MSG))
4649 self.assertEqual(msg, MSG)
4650
Guido van Rossum24e4af82002-06-12 19:18:08 +00004651 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004652 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004653
4654 # don't send anything before event is set to check
4655 # that non-blocking recv() raises BlockingIOError
4656 self.event.wait()
4657
4658 # send data: recv() will no longer block
4659 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004660
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004661
Guido van Rossum24e4af82002-06-12 19:18:08 +00004662class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004663 """Unit tests for the object returned by socket.makefile()
4664
Antoine Pitrou834bd812010-10-13 16:17:14 +00004665 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004666 the client connection. You can read from this file to
4667 get output from the server.
4668
Antoine Pitrou834bd812010-10-13 16:17:14 +00004669 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004670 server connection. You can write to this file to send output
4671 to the client.
4672 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004673
Guido van Rossume9f66142002-08-07 15:46:19 +00004674 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004675 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004676 errors = 'strict'
4677 newline = None
4678
4679 read_mode = 'rb'
4680 read_msg = MSG
4681 write_mode = 'wb'
4682 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004683
Guido van Rossum24e4af82002-06-12 19:18:08 +00004684 def __init__(self, methodName='runTest'):
4685 SocketConnectedTest.__init__(self, methodName=methodName)
4686
4687 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004688 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4689 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004690 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004691 self.read_file = self.cli_conn.makefile(
4692 self.read_mode, self.bufsize,
4693 encoding = self.encoding,
4694 errors = self.errors,
4695 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004696
4697 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004698 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004699 self.read_file.close()
4700 self.assertTrue(self.read_file.closed)
4701 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004702 SocketConnectedTest.tearDown(self)
4703
4704 def clientSetUp(self):
4705 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004706 self.write_file = self.serv_conn.makefile(
4707 self.write_mode, self.bufsize,
4708 encoding = self.encoding,
4709 errors = self.errors,
4710 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004711
4712 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004713 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004714 self.write_file.close()
4715 self.assertTrue(self.write_file.closed)
4716 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004717 SocketConnectedTest.clientTearDown(self)
4718
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004719 def testReadAfterTimeout(self):
4720 # Issue #7322: A file object must disallow further reads
4721 # after a timeout has occurred.
4722 self.cli_conn.settimeout(1)
4723 self.read_file.read(3)
4724 # First read raises a timeout
4725 self.assertRaises(socket.timeout, self.read_file.read, 1)
4726 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004727 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004728 self.read_file.read(1)
4729 self.assertIn("cannot read from timed out object", str(ctx.exception))
4730
4731 def _testReadAfterTimeout(self):
4732 self.write_file.write(self.write_msg[0:3])
4733 self.write_file.flush()
4734 self.serv_finished.wait()
4735
Guido van Rossum24e4af82002-06-12 19:18:08 +00004736 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004737 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004738 first_seg = self.read_file.read(len(self.read_msg)-3)
4739 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004740 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004741 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004742
4743 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004744 self.write_file.write(self.write_msg)
4745 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004746
Guido van Rossum8c943832002-08-08 01:00:28 +00004747 def testFullRead(self):
4748 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004749 msg = self.read_file.read()
4750 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004751
4752 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004753 self.write_file.write(self.write_msg)
4754 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004755
Guido van Rossum24e4af82002-06-12 19:18:08 +00004756 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004757 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004758 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004759 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004760 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004761 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004762 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004763 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004764 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004765
4766 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004767 self.write_file.write(self.write_msg)
4768 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004769
4770 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004771 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004772 line = self.read_file.readline()
4773 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004774
4775 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004776 self.write_file.write(self.write_msg)
4777 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004778
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004779 def testCloseAfterMakefile(self):
4780 # The file returned by makefile should keep the socket open.
4781 self.cli_conn.close()
4782 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004783 msg = self.read_file.read()
4784 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004785
4786 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004787 self.write_file.write(self.write_msg)
4788 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004789
4790 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004791 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004792 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004793 if isinstance(self.read_msg, str):
4794 msg = msg.decode()
4795 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004796
4797 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004798 self.write_file.write(self.write_msg)
4799 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004800
Tim Peters116d83c2004-03-28 02:20:45 +00004801 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004802 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004803
4804 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004805 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004806
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004807 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004808 self.assertEqual(self.read_file.mode, self.read_mode)
4809 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004810
4811 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004812 self.assertEqual(self.write_file.mode, self.write_mode)
4813 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004814
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004815 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004816 self.read_file.close()
4817 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004818 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004819 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004820
4821 def _testRealClose(self):
4822 pass
4823
4824
Guido van Rossume9f66142002-08-07 15:46:19 +00004825class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4826
4827 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004828
Guido van Rossume9f66142002-08-07 15:46:19 +00004829 In this case (and in this case only), it should be possible to
4830 create a file object, read a line from it, create another file
4831 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004832 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004833 when reading multiple requests from the same socket."""
4834
4835 bufsize = 0 # Use unbuffered mode
4836
4837 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004838 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004839 line = self.read_file.readline() # first line
4840 self.assertEqual(line, b"A. " + self.write_msg) # first line
4841 self.read_file = self.cli_conn.makefile('rb', 0)
4842 line = self.read_file.readline() # second line
4843 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004844
4845 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004846 self.write_file.write(b"A. " + self.write_msg)
4847 self.write_file.write(b"B. " + self.write_msg)
4848 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004849
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004850 def testMakefileClose(self):
4851 # The file returned by makefile should keep the socket open...
4852 self.cli_conn.close()
4853 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004854 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004855 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004856 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004857 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004858
4859 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004860 self.write_file.write(self.write_msg)
4861 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004862
4863 def testMakefileCloseSocketDestroy(self):
4864 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004865 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004866 refcount_after = sys.getrefcount(self.cli_conn)
4867 self.assertEqual(refcount_before - 1, refcount_after)
4868
4869 def _testMakefileCloseSocketDestroy(self):
4870 pass
4871
Antoine Pitrou98b46702010-09-18 22:59:00 +00004872 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004873 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004874 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4875
4876 def testSmallReadNonBlocking(self):
4877 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004878 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4879 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004880 self.evt1.set()
4881 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004882 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004883 if first_seg is None:
4884 # Data not arrived (can happen under Windows), wait a bit
4885 time.sleep(0.5)
4886 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004887 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004888 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004889 self.assertEqual(n, 3)
4890 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004891 self.assertEqual(msg, self.read_msg)
4892 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4893 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004894
4895 def _testSmallReadNonBlocking(self):
4896 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004897 self.write_file.write(self.write_msg)
4898 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004899 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004900 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004901 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4902 self.serv_finished.wait(5.0)
4903
4904 def testWriteNonBlocking(self):
4905 self.cli_finished.wait(5.0)
4906 # The client thread can't skip directly - the SkipTest exception
4907 # would appear as a failure.
4908 if self.serv_skipped:
4909 self.skipTest(self.serv_skipped)
4910
4911 def _testWriteNonBlocking(self):
4912 self.serv_skipped = None
4913 self.serv_conn.setblocking(False)
4914 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004915 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004916 LIMIT = 10
4917 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004918 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004919 self.assertGreater(n, 0)
4920 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004921 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004922 if n is None:
4923 # Succeeded
4924 break
4925 self.assertGreater(n, 0)
4926 else:
4927 # Let us know that this test didn't manage to establish
4928 # the expected conditions. This is not a failure in itself but,
4929 # if it happens repeatedly, the test should be fixed.
4930 self.serv_skipped = "failed to saturate the socket buffer"
4931
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004932
Guido van Rossum8c943832002-08-08 01:00:28 +00004933class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4934
4935 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4936
4937
4938class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4939
4940 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004941
Thomas Woutersb2137042007-02-01 18:02:27 +00004942
Antoine Pitrou834bd812010-10-13 16:17:14 +00004943class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4944 """Tests for socket.makefile() in text mode (rather than binary)"""
4945
4946 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004947 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004948 write_mode = 'wb'
4949 write_msg = MSG
4950 newline = ''
4951
4952
4953class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4954 """Tests for socket.makefile() in text mode (rather than binary)"""
4955
4956 read_mode = 'rb'
4957 read_msg = MSG
4958 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004959 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004960 newline = ''
4961
4962
4963class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4964 """Tests for socket.makefile() in text mode (rather than binary)"""
4965
4966 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004967 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004968 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004969 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004970 newline = ''
4971
4972
Guido van Rossumd8faa362007-04-27 19:54:29 +00004973class NetworkConnectionTest(object):
4974 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004975
Guido van Rossumd8faa362007-04-27 19:54:29 +00004976 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004977 # We're inherited below by BasicTCPTest2, which also inherits
4978 # BasicTCPTest, which defines self.port referenced below.
4979 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004980 self.serv_conn = self.cli
4981
4982class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4983 """Tests that NetworkConnection does not break existing TCP functionality.
4984 """
4985
4986class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004987
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004988 class MockSocket(socket.socket):
4989 def connect(self, *args):
4990 raise socket.timeout('timed out')
4991
4992 @contextlib.contextmanager
4993 def mocked_socket_module(self):
4994 """Return a socket which times out on connect"""
4995 old_socket = socket.socket
4996 socket.socket = self.MockSocket
4997 try:
4998 yield
4999 finally:
5000 socket.socket = old_socket
5001
5002 def test_connect(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005003 port = socket_helper.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005004 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005005 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005006 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005007 cli.connect((HOST, port))
5008 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
5009
5010 def test_create_connection(self):
5011 # Issue #9792: errors raised by create_connection() should have
5012 # a proper errno attribute.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005013 port = socket_helper.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02005014 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005015 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04005016
5017 # Issue #16257: create_connection() calls getaddrinfo() against
5018 # 'localhost'. This may result in an IPV6 addr being returned
5019 # as well as an IPV4 one:
5020 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
5021 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
5022 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
5023 #
5024 # create_connection() enumerates through all the addresses returned
5025 # and if it doesn't successfully bind to any of them, it propagates
5026 # the last exception it encountered.
5027 #
5028 # On Solaris, ENETUNREACH is returned in this circumstance instead
5029 # of ECONNREFUSED. So, if that errno exists, add it to our list of
5030 # expected errnos.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005031 expected_errnos = socket_helper.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04005032 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005033
5034 def test_create_connection_timeout(self):
5035 # Issue #9792: create_connection() should not recast timeout errors
5036 # as generic socket errors.
5037 with self.mocked_socket_module():
Zackery Spytzc2cda632019-06-30 09:24:43 -06005038 try:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005039 socket.create_connection((HOST, 1234))
Zackery Spytzc2cda632019-06-30 09:24:43 -06005040 except socket.timeout:
5041 pass
5042 except OSError as exc:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005043 if socket_helper.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
Zackery Spytzc2cda632019-06-30 09:24:43 -06005044 raise
5045 else:
5046 self.fail('socket.timeout not raised')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005047
Guido van Rossumd8faa362007-04-27 19:54:29 +00005048
5049class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
5050
5051 def __init__(self, methodName='runTest'):
5052 SocketTCPTest.__init__(self, methodName=methodName)
5053 ThreadableTest.__init__(self)
5054
5055 def clientSetUp(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005056 self.source_port = socket_helper.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005057
5058 def clientTearDown(self):
5059 self.cli.close()
5060 self.cli = None
5061 ThreadableTest.clientTearDown(self)
5062
5063 def _justAccept(self):
5064 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005065 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005066
5067 testFamily = _justAccept
5068 def _testFamily(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005069 self.cli = socket.create_connection((HOST, self.port),
5070 timeout=support.LOOPBACK_TIMEOUT)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005071 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005072 self.assertEqual(self.cli.family, 2)
5073
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005074 testSourceAddress = _justAccept
5075 def _testSourceAddress(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005076 self.cli = socket.create_connection((HOST, self.port),
5077 timeout=support.LOOPBACK_TIMEOUT,
5078 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005079 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00005080 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005081 # The port number being used is sufficient to show that the bind()
5082 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00005083
Guido van Rossumd8faa362007-04-27 19:54:29 +00005084 testTimeoutDefault = _justAccept
5085 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00005086 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005087 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005088 socket.setdefaulttimeout(42)
5089 try:
5090 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005091 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005092 finally:
5093 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00005094 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005095
5096 testTimeoutNone = _justAccept
5097 def _testTimeoutNone(self):
5098 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005099 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005100 socket.setdefaulttimeout(30)
5101 try:
5102 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005103 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005104 finally:
5105 socket.setdefaulttimeout(None)
5106 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005107
5108 testTimeoutValueNamed = _justAccept
5109 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005110 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005111 self.assertEqual(self.cli.gettimeout(), 30)
5112
5113 testTimeoutValueNonamed = _justAccept
5114 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005115 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005116 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005117 self.assertEqual(self.cli.gettimeout(), 30)
5118
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005119
Guido van Rossumd8faa362007-04-27 19:54:29 +00005120class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
5121
5122 def __init__(self, methodName='runTest'):
5123 SocketTCPTest.__init__(self, methodName=methodName)
5124 ThreadableTest.__init__(self)
5125
5126 def clientSetUp(self):
5127 pass
5128
5129 def clientTearDown(self):
5130 self.cli.close()
5131 self.cli = None
5132 ThreadableTest.clientTearDown(self)
5133
5134 def testInsideTimeout(self):
5135 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005136 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005137 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005138 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005139 testOutsideTimeout = testInsideTimeout
5140
5141 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005142 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005143 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005144 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005145
5146 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005147 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005148 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005149
5150
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005151class TCPTimeoutTest(SocketTCPTest):
5152
5153 def testTCPTimeout(self):
5154 def raise_timeout(*args, **kwargs):
5155 self.serv.settimeout(1.0)
5156 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005157 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005158 "Error generating a timeout exception (TCP)")
5159
5160 def testTimeoutZero(self):
5161 ok = False
5162 try:
5163 self.serv.settimeout(0.0)
5164 foo = self.serv.accept()
5165 except socket.timeout:
5166 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005167 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005168 ok = True
5169 except:
5170 self.fail("caught unexpected exception (TCP)")
5171 if not ok:
5172 self.fail("accept() returned success when we did not expect it")
5173
Serhiy Storchaka43767632013-11-03 21:31:38 +02005174 @unittest.skipUnless(hasattr(signal, 'alarm'),
5175 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005176 def testInterruptedTimeout(self):
5177 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06005178 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005179 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005180 self.serv.settimeout(5.0) # must be longer than alarm
5181 class Alarm(Exception):
5182 pass
5183 def alarm_handler(signal, frame):
5184 raise Alarm
5185 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
5186 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005187 try:
Victor Stinner9abee722017-09-19 09:36:54 -07005188 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005189 foo = self.serv.accept()
5190 except socket.timeout:
5191 self.fail("caught timeout instead of Alarm")
5192 except Alarm:
5193 pass
5194 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00005195 self.fail("caught other exception instead of Alarm:"
5196 " %s(%s):\n%s" %
5197 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005198 else:
5199 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00005200 finally:
5201 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005202 except Alarm:
5203 self.fail("got Alarm in wrong place")
5204 finally:
5205 # no alarm can be pending. Safe to restore old handler.
5206 signal.signal(signal.SIGALRM, old_alarm)
5207
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02005208class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005209
5210 def testUDPTimeout(self):
5211 def raise_timeout(*args, **kwargs):
5212 self.serv.settimeout(1.0)
5213 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005214 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005215 "Error generating a timeout exception (UDP)")
5216
5217 def testTimeoutZero(self):
5218 ok = False
5219 try:
5220 self.serv.settimeout(0.0)
5221 foo = self.serv.recv(1024)
5222 except socket.timeout:
5223 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005224 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005225 ok = True
5226 except:
5227 self.fail("caught unexpected exception (UDP)")
5228 if not ok:
5229 self.fail("recv() returned success when we did not expect it")
5230
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005231@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
5232 'UDPLITE sockets required for this test.')
5233class UDPLITETimeoutTest(SocketUDPLITETest):
5234
5235 def testUDPLITETimeout(self):
5236 def raise_timeout(*args, **kwargs):
5237 self.serv.settimeout(1.0)
5238 self.serv.recv(1024)
5239 self.assertRaises(socket.timeout, raise_timeout,
5240 "Error generating a timeout exception (UDPLITE)")
5241
5242 def testTimeoutZero(self):
5243 ok = False
5244 try:
5245 self.serv.settimeout(0.0)
5246 foo = self.serv.recv(1024)
5247 except socket.timeout:
5248 self.fail("caught timeout instead of error (UDPLITE)")
5249 except OSError:
5250 ok = True
5251 except:
5252 self.fail("caught unexpected exception (UDPLITE)")
5253 if not ok:
5254 self.fail("recv() returned success when we did not expect it")
5255
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005256class TestExceptions(unittest.TestCase):
5257
5258 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005259 self.assertTrue(issubclass(OSError, Exception))
5260 self.assertTrue(issubclass(socket.herror, OSError))
5261 self.assertTrue(issubclass(socket.gaierror, OSError))
5262 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005263
Yury Selivanovfa22b292016-10-18 16:03:52 -04005264 def test_setblocking_invalidfd(self):
5265 # Regression test for issue #28471
5266
5267 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5268 sock = socket.socket(
5269 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5270 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005271 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005272
5273 with self.assertRaises(OSError):
5274 sock.setblocking(False)
5275
5276
Serhiy Storchaka43767632013-11-03 21:31:38 +02005277@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005278class TestLinuxAbstractNamespace(unittest.TestCase):
5279
5280 UNIX_PATH_MAX = 108
5281
5282 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005283 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005284 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5285 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005286 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005287 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5288 s2.connect(s1.getsockname())
5289 with s1.accept()[0] as s3:
5290 self.assertEqual(s1.getsockname(), address)
5291 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005292
5293 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005294 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005295 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5296 s.bind(address)
5297 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005298
5299 def testNameOverflow(self):
5300 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005301 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005302 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005303
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005304 def testStrName(self):
5305 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005306 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5307 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005308 s.bind("\x00python\x00test\x00")
5309 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005310 finally:
5311 s.close()
5312
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005313 def testBytearrayName(self):
5314 # Check that an abstract name can be passed as a bytearray.
5315 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5316 s.bind(bytearray(b"\x00python\x00test\x00"))
5317 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5318
Serhiy Storchaka43767632013-11-03 21:31:38 +02005319@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005320class TestUnixDomain(unittest.TestCase):
5321
5322 def setUp(self):
5323 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5324
5325 def tearDown(self):
5326 self.sock.close()
5327
5328 def encoded(self, path):
5329 # Return the given path encoded in the file system encoding,
5330 # or skip the test if this is not possible.
5331 try:
5332 return os.fsencode(path)
5333 except UnicodeEncodeError:
5334 self.skipTest(
5335 "Pathname {0!a} cannot be represented in file "
5336 "system encoding {1!r}".format(
5337 path, sys.getfilesystemencoding()))
5338
Antoine Pitrou16374872011-12-16 15:04:12 +01005339 def bind(self, sock, path):
5340 # Bind the socket
5341 try:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005342 socket_helper.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005343 except OSError as e:
5344 if str(e) == "AF_UNIX path too long":
5345 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005346 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005347 .format(path))
5348 else:
5349 raise
5350
Antoine Pitrou495b5022017-05-02 17:20:00 +02005351 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005352 # Issue #30205 (note getsockname() can return None on OS X)
5353 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005354
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005355 def testStrAddr(self):
5356 # Test binding to and retrieving a normal string pathname.
5357 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005358 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005359 self.addCleanup(support.unlink, path)
5360 self.assertEqual(self.sock.getsockname(), path)
5361
5362 def testBytesAddr(self):
5363 # Test binding to a bytes pathname.
5364 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005365 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005366 self.addCleanup(support.unlink, path)
5367 self.assertEqual(self.sock.getsockname(), path)
5368
5369 def testSurrogateescapeBind(self):
5370 # Test binding to a valid non-ASCII pathname, with the
5371 # non-ASCII bytes supplied using surrogateescape encoding.
5372 path = os.path.abspath(support.TESTFN_UNICODE)
5373 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005374 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005375 self.addCleanup(support.unlink, path)
5376 self.assertEqual(self.sock.getsockname(), path)
5377
5378 def testUnencodableAddr(self):
5379 # Test binding to a pathname that cannot be encoded in the
5380 # file system encoding.
5381 if support.TESTFN_UNENCODABLE is None:
5382 self.skipTest("No unencodable filename available")
5383 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005384 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005385 self.addCleanup(support.unlink, path)
5386 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005387
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005388
Thomas Wouters477c8d52006-05-27 19:21:47 +00005389class BufferIOTest(SocketConnectedTest):
5390 """
5391 Test the buffer versions of socket.recv() and socket.send().
5392 """
5393 def __init__(self, methodName='runTest'):
5394 SocketConnectedTest.__init__(self, methodName=methodName)
5395
Antoine Pitrou25480782010-03-17 22:50:28 +00005396 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005397 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005398 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005399 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005400 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005401 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005402 self.assertEqual(msg, MSG)
5403
Antoine Pitrou25480782010-03-17 22:50:28 +00005404 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005405 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005406 self.serv_conn.send(buf)
5407
Antoine Pitrou25480782010-03-17 22:50:28 +00005408 def testRecvIntoBytearray(self):
5409 buf = bytearray(1024)
5410 nbytes = self.cli_conn.recv_into(buf)
5411 self.assertEqual(nbytes, len(MSG))
5412 msg = buf[:len(MSG)]
5413 self.assertEqual(msg, MSG)
5414
5415 _testRecvIntoBytearray = _testRecvIntoArray
5416
5417 def testRecvIntoMemoryview(self):
5418 buf = bytearray(1024)
5419 nbytes = self.cli_conn.recv_into(memoryview(buf))
5420 self.assertEqual(nbytes, len(MSG))
5421 msg = buf[:len(MSG)]
5422 self.assertEqual(msg, MSG)
5423
5424 _testRecvIntoMemoryview = _testRecvIntoArray
5425
5426 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005427 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005428 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005429 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005430 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005431 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005432 self.assertEqual(msg, MSG)
5433
Antoine Pitrou25480782010-03-17 22:50:28 +00005434 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005435 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005436 self.serv_conn.send(buf)
5437
Antoine Pitrou25480782010-03-17 22:50:28 +00005438 def testRecvFromIntoBytearray(self):
5439 buf = bytearray(1024)
5440 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5441 self.assertEqual(nbytes, len(MSG))
5442 msg = buf[:len(MSG)]
5443 self.assertEqual(msg, MSG)
5444
5445 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5446
5447 def testRecvFromIntoMemoryview(self):
5448 buf = bytearray(1024)
5449 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5450 self.assertEqual(nbytes, len(MSG))
5451 msg = buf[:len(MSG)]
5452 self.assertEqual(msg, MSG)
5453
5454 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5455
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005456 def testRecvFromIntoSmallBuffer(self):
5457 # See issue #20246.
5458 buf = bytearray(8)
5459 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5460
5461 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005462 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005463
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005464 def testRecvFromIntoEmptyBuffer(self):
5465 buf = bytearray()
5466 self.cli_conn.recvfrom_into(buf)
5467 self.cli_conn.recvfrom_into(buf, 0)
5468
5469 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5470
Christian Heimes043d6f62008-01-07 17:19:16 +00005471
5472TIPC_STYPE = 2000
5473TIPC_LOWER = 200
5474TIPC_UPPER = 210
5475
5476def isTipcAvailable():
5477 """Check if the TIPC module is loaded
5478
5479 The TIPC module is not loaded automatically on Ubuntu and probably
5480 other Linux distros.
5481 """
5482 if not hasattr(socket, "AF_TIPC"):
5483 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005484 try:
5485 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005486 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005487 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005488 # have not the permission to read it.
5489 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005490 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005491 for line in f:
5492 if line.startswith("tipc "):
5493 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005494 return False
5495
Serhiy Storchaka43767632013-11-03 21:31:38 +02005496@unittest.skipUnless(isTipcAvailable(),
5497 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005498class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005499 def testRDM(self):
5500 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5501 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005502 self.addCleanup(srv.close)
5503 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005504
5505 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5506 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5507 TIPC_LOWER, TIPC_UPPER)
5508 srv.bind(srvaddr)
5509
5510 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5511 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5512 cli.sendto(MSG, sendaddr)
5513
5514 msg, recvaddr = srv.recvfrom(1024)
5515
5516 self.assertEqual(cli.getsockname(), recvaddr)
5517 self.assertEqual(msg, MSG)
5518
5519
Serhiy Storchaka43767632013-11-03 21:31:38 +02005520@unittest.skipUnless(isTipcAvailable(),
5521 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005522class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005523 def __init__(self, methodName = 'runTest'):
5524 unittest.TestCase.__init__(self, methodName = methodName)
5525 ThreadableTest.__init__(self)
5526
5527 def setUp(self):
5528 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005529 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005530 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5531 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5532 TIPC_LOWER, TIPC_UPPER)
5533 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005534 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005535 self.serverExplicitReady()
5536 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005537 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005538
5539 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005540 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005541 # accept() call; sleep a little while to avoid it, otherwise
5542 # we could get an exception
5543 time.sleep(0.1)
5544 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005545 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005546 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5547 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5548 self.cli.connect(addr)
5549 self.cliaddr = self.cli.getsockname()
5550
5551 def testStream(self):
5552 msg = self.conn.recv(1024)
5553 self.assertEqual(msg, MSG)
5554 self.assertEqual(self.cliaddr, self.connaddr)
5555
5556 def _testStream(self):
5557 self.cli.send(MSG)
5558 self.cli.close()
5559
5560
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005561class ContextManagersTest(ThreadedTCPSocketTest):
5562
5563 def _testSocketClass(self):
5564 # base test
5565 with socket.socket() as sock:
5566 self.assertFalse(sock._closed)
5567 self.assertTrue(sock._closed)
5568 # close inside with block
5569 with socket.socket() as sock:
5570 sock.close()
5571 self.assertTrue(sock._closed)
5572 # exception inside with block
5573 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005574 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005575 self.assertTrue(sock._closed)
5576
5577 def testCreateConnectionBase(self):
5578 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005579 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005580 data = conn.recv(1024)
5581 conn.sendall(data)
5582
5583 def _testCreateConnectionBase(self):
5584 address = self.serv.getsockname()
5585 with socket.create_connection(address) as sock:
5586 self.assertFalse(sock._closed)
5587 sock.sendall(b'foo')
5588 self.assertEqual(sock.recv(1024), b'foo')
5589 self.assertTrue(sock._closed)
5590
5591 def testCreateConnectionClose(self):
5592 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005593 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005594 data = conn.recv(1024)
5595 conn.sendall(data)
5596
5597 def _testCreateConnectionClose(self):
5598 address = self.serv.getsockname()
5599 with socket.create_connection(address) as sock:
5600 sock.close()
5601 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005602 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005603
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005604
Victor Stinnerdaf45552013-08-28 00:53:59 +02005605class InheritanceTest(unittest.TestCase):
5606 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5607 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005608 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005609 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005610 with socket.socket(socket.AF_INET,
5611 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005612 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005613 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005614
5615 def test_default_inheritable(self):
5616 sock = socket.socket()
5617 with sock:
5618 self.assertEqual(sock.get_inheritable(), False)
5619
5620 def test_dup(self):
5621 sock = socket.socket()
5622 with sock:
5623 newsock = sock.dup()
5624 sock.close()
5625 with newsock:
5626 self.assertEqual(newsock.get_inheritable(), False)
5627
5628 def test_set_inheritable(self):
5629 sock = socket.socket()
5630 with sock:
5631 sock.set_inheritable(True)
5632 self.assertEqual(sock.get_inheritable(), True)
5633
5634 sock.set_inheritable(False)
5635 self.assertEqual(sock.get_inheritable(), False)
5636
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005637 @unittest.skipIf(fcntl is None, "need fcntl")
5638 def test_get_inheritable_cloexec(self):
5639 sock = socket.socket()
5640 with sock:
5641 fd = sock.fileno()
5642 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005643
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005644 # clear FD_CLOEXEC flag
5645 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5646 flags &= ~fcntl.FD_CLOEXEC
5647 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005648
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005649 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005650
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005651 @unittest.skipIf(fcntl is None, "need fcntl")
5652 def test_set_inheritable_cloexec(self):
5653 sock = socket.socket()
5654 with sock:
5655 fd = sock.fileno()
5656 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5657 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005658
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005659 sock.set_inheritable(True)
5660 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5661 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005662
5663
Victor Stinnerdaf45552013-08-28 00:53:59 +02005664 def test_socketpair(self):
5665 s1, s2 = socket.socketpair()
5666 self.addCleanup(s1.close)
5667 self.addCleanup(s2.close)
5668 self.assertEqual(s1.get_inheritable(), False)
5669 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005670
5671
5672@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5673 "SOCK_NONBLOCK not defined")
5674class NonblockConstantTest(unittest.TestCase):
5675 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5676 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005677 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005678 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005679 self.assertTrue(
5680 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005681 if timeout == 0:
5682 # timeout == 0: means that getblocking() must be False.
5683 self.assertFalse(s.getblocking())
5684 else:
5685 # If timeout > 0, the socket will be in a "blocking" mode
5686 # from the standpoint of the Python API. For Python socket
5687 # object, "blocking" means that operations like 'sock.recv()'
5688 # will block. Internally, file descriptors for
5689 # "blocking" Python sockets *with timeouts* are in a
5690 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5691 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5692 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005693 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005694 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005695 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005696 self.assertFalse(
5697 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005698 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005699
Charles-François Natali239bb962011-06-03 12:55:15 +02005700 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005701 def test_SOCK_NONBLOCK(self):
5702 # a lot of it seems silly and redundant, but I wanted to test that
5703 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005704 with socket.socket(socket.AF_INET,
5705 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5706 self.checkNonblock(s)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005707 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005708 self.checkNonblock(s, nonblock=False)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005709 s.setblocking(False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005710 self.checkNonblock(s)
5711 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005712 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005713 s.settimeout(2.0)
5714 self.checkNonblock(s, timeout=2.0)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005715 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005716 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005717 # defaulttimeout
5718 t = socket.getdefaulttimeout()
5719 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005720 with socket.socket() as s:
5721 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005722 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005723 with socket.socket() as s:
5724 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005725 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005726 with socket.socket() as s:
5727 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005728 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005729 with socket.socket() as s:
5730 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005731 socket.setdefaulttimeout(t)
5732
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005733
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005734@unittest.skipUnless(os.name == "nt", "Windows specific")
5735@unittest.skipUnless(multiprocessing, "need multiprocessing")
5736class TestSocketSharing(SocketTCPTest):
5737 # This must be classmethod and not staticmethod or multiprocessing
5738 # won't be able to bootstrap it.
5739 @classmethod
5740 def remoteProcessServer(cls, q):
5741 # Recreate socket from shared data
5742 sdata = q.get()
5743 message = q.get()
5744
5745 s = socket.fromshare(sdata)
5746 s2, c = s.accept()
5747
5748 # Send the message
5749 s2.sendall(message)
5750 s2.close()
5751 s.close()
5752
5753 def testShare(self):
5754 # Transfer the listening server socket to another process
5755 # and service it from there.
5756
5757 # Create process:
5758 q = multiprocessing.Queue()
5759 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5760 p.start()
5761
5762 # Get the shared socket data
5763 data = self.serv.share(p.pid)
5764
5765 # Pass the shared socket to the other process
5766 addr = self.serv.getsockname()
5767 self.serv.close()
5768 q.put(data)
5769
5770 # The data that the server will send us
5771 message = b"slapmahfro"
5772 q.put(message)
5773
5774 # Connect
5775 s = socket.create_connection(addr)
5776 # listen for the data
5777 m = []
5778 while True:
5779 data = s.recv(100)
5780 if not data:
5781 break
5782 m.append(data)
5783 s.close()
5784 received = b"".join(m)
5785 self.assertEqual(received, message)
5786 p.join()
5787
5788 def testShareLength(self):
5789 data = self.serv.share(os.getpid())
5790 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5791 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5792
5793 def compareSockets(self, org, other):
5794 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005795 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005796 self.assertEqual(org.gettimeout(), None)
5797 self.assertEqual(org.gettimeout(), other.gettimeout())
5798
5799 self.assertEqual(org.family, other.family)
5800 self.assertEqual(org.type, other.type)
5801 # If the user specified "0" for proto, then
5802 # internally windows will have picked the correct value.
5803 # Python introspection on the socket however will still return
5804 # 0. For the shared socket, the python value is recreated
5805 # from the actual value, so it may not compare correctly.
5806 if org.proto != 0:
5807 self.assertEqual(org.proto, other.proto)
5808
5809 def testShareLocal(self):
5810 data = self.serv.share(os.getpid())
5811 s = socket.fromshare(data)
5812 try:
5813 self.compareSockets(self.serv, s)
5814 finally:
5815 s.close()
5816
5817 def testTypes(self):
5818 families = [socket.AF_INET, socket.AF_INET6]
5819 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5820 for f in families:
5821 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005822 try:
5823 source = socket.socket(f, t)
5824 except OSError:
5825 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005826 try:
5827 data = source.share(os.getpid())
5828 shared = socket.fromshare(data)
5829 try:
5830 self.compareSockets(source, shared)
5831 finally:
5832 shared.close()
5833 finally:
5834 source.close()
5835
5836
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005837class SendfileUsingSendTest(ThreadedTCPSocketTest):
5838 """
5839 Test the send() implementation of socket.sendfile().
5840 """
5841
Victor Stinner8c663fd2017-11-08 14:44:44 -08005842 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005843 BUFSIZE = 8192
5844 FILEDATA = b""
Victor Stinner24c62582019-10-30 12:41:43 +01005845 TIMEOUT = support.LOOPBACK_TIMEOUT
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005846
5847 @classmethod
5848 def setUpClass(cls):
5849 def chunks(total, step):
5850 assert total >= step
5851 while total > step:
5852 yield step
5853 total -= step
5854 if total:
5855 yield total
5856
5857 chunk = b"".join([random.choice(string.ascii_letters).encode()
5858 for i in range(cls.BUFSIZE)])
5859 with open(support.TESTFN, 'wb') as f:
5860 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5861 f.write(chunk)
5862 with open(support.TESTFN, 'rb') as f:
5863 cls.FILEDATA = f.read()
5864 assert len(cls.FILEDATA) == cls.FILESIZE
5865
5866 @classmethod
5867 def tearDownClass(cls):
5868 support.unlink(support.TESTFN)
5869
5870 def accept_conn(self):
Victor Stinner24c62582019-10-30 12:41:43 +01005871 self.serv.settimeout(support.LONG_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005872 conn, addr = self.serv.accept()
5873 conn.settimeout(self.TIMEOUT)
5874 self.addCleanup(conn.close)
5875 return conn
5876
5877 def recv_data(self, conn):
5878 received = []
5879 while True:
5880 chunk = conn.recv(self.BUFSIZE)
5881 if not chunk:
5882 break
5883 received.append(chunk)
5884 return b''.join(received)
5885
5886 def meth_from_sock(self, sock):
5887 # Depending on the mixin class being run return either send()
5888 # or sendfile() method implementation.
5889 return getattr(sock, "_sendfile_use_send")
5890
5891 # regular file
5892
5893 def _testRegularFile(self):
5894 address = self.serv.getsockname()
5895 file = open(support.TESTFN, 'rb')
5896 with socket.create_connection(address) as sock, file as file:
5897 meth = self.meth_from_sock(sock)
5898 sent = meth(file)
5899 self.assertEqual(sent, self.FILESIZE)
5900 self.assertEqual(file.tell(), self.FILESIZE)
5901
5902 def testRegularFile(self):
5903 conn = self.accept_conn()
5904 data = self.recv_data(conn)
5905 self.assertEqual(len(data), self.FILESIZE)
5906 self.assertEqual(data, self.FILEDATA)
5907
5908 # non regular file
5909
5910 def _testNonRegularFile(self):
5911 address = self.serv.getsockname()
5912 file = io.BytesIO(self.FILEDATA)
5913 with socket.create_connection(address) as sock, file as file:
5914 sent = sock.sendfile(file)
5915 self.assertEqual(sent, self.FILESIZE)
5916 self.assertEqual(file.tell(), self.FILESIZE)
5917 self.assertRaises(socket._GiveupOnSendfile,
5918 sock._sendfile_use_sendfile, file)
5919
5920 def testNonRegularFile(self):
5921 conn = self.accept_conn()
5922 data = self.recv_data(conn)
5923 self.assertEqual(len(data), self.FILESIZE)
5924 self.assertEqual(data, self.FILEDATA)
5925
5926 # empty file
5927
5928 def _testEmptyFileSend(self):
5929 address = self.serv.getsockname()
5930 filename = support.TESTFN + "2"
5931 with open(filename, 'wb'):
5932 self.addCleanup(support.unlink, filename)
5933 file = open(filename, 'rb')
5934 with socket.create_connection(address) as sock, file as file:
5935 meth = self.meth_from_sock(sock)
5936 sent = meth(file)
5937 self.assertEqual(sent, 0)
5938 self.assertEqual(file.tell(), 0)
5939
5940 def testEmptyFileSend(self):
5941 conn = self.accept_conn()
5942 data = self.recv_data(conn)
5943 self.assertEqual(data, b"")
5944
5945 # offset
5946
5947 def _testOffset(self):
5948 address = self.serv.getsockname()
5949 file = open(support.TESTFN, 'rb')
5950 with socket.create_connection(address) as sock, file as file:
5951 meth = self.meth_from_sock(sock)
5952 sent = meth(file, offset=5000)
5953 self.assertEqual(sent, self.FILESIZE - 5000)
5954 self.assertEqual(file.tell(), self.FILESIZE)
5955
5956 def testOffset(self):
5957 conn = self.accept_conn()
5958 data = self.recv_data(conn)
5959 self.assertEqual(len(data), self.FILESIZE - 5000)
5960 self.assertEqual(data, self.FILEDATA[5000:])
5961
5962 # count
5963
5964 def _testCount(self):
5965 address = self.serv.getsockname()
5966 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01005967 sock = socket.create_connection(address,
5968 timeout=support.LOOPBACK_TIMEOUT)
5969 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005970 count = 5000007
5971 meth = self.meth_from_sock(sock)
5972 sent = meth(file, count=count)
5973 self.assertEqual(sent, count)
5974 self.assertEqual(file.tell(), count)
5975
5976 def testCount(self):
5977 count = 5000007
5978 conn = self.accept_conn()
5979 data = self.recv_data(conn)
5980 self.assertEqual(len(data), count)
5981 self.assertEqual(data, self.FILEDATA[:count])
5982
5983 # count small
5984
5985 def _testCountSmall(self):
5986 address = self.serv.getsockname()
5987 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01005988 sock = socket.create_connection(address,
5989 timeout=support.LOOPBACK_TIMEOUT)
5990 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005991 count = 1
5992 meth = self.meth_from_sock(sock)
5993 sent = meth(file, count=count)
5994 self.assertEqual(sent, count)
5995 self.assertEqual(file.tell(), count)
5996
5997 def testCountSmall(self):
5998 count = 1
5999 conn = self.accept_conn()
6000 data = self.recv_data(conn)
6001 self.assertEqual(len(data), count)
6002 self.assertEqual(data, self.FILEDATA[:count])
6003
6004 # count + offset
6005
6006 def _testCountWithOffset(self):
6007 address = self.serv.getsockname()
6008 file = open(support.TESTFN, 'rb')
6009 with socket.create_connection(address, timeout=2) as sock, file as file:
6010 count = 100007
6011 meth = self.meth_from_sock(sock)
6012 sent = meth(file, offset=2007, count=count)
6013 self.assertEqual(sent, count)
6014 self.assertEqual(file.tell(), count + 2007)
6015
6016 def testCountWithOffset(self):
6017 count = 100007
6018 conn = self.accept_conn()
6019 data = self.recv_data(conn)
6020 self.assertEqual(len(data), count)
6021 self.assertEqual(data, self.FILEDATA[2007:count+2007])
6022
6023 # non blocking sockets are not supposed to work
6024
6025 def _testNonBlocking(self):
6026 address = self.serv.getsockname()
6027 file = open(support.TESTFN, 'rb')
6028 with socket.create_connection(address) as sock, file as file:
6029 sock.setblocking(False)
6030 meth = self.meth_from_sock(sock)
6031 self.assertRaises(ValueError, meth, file)
6032 self.assertRaises(ValueError, sock.sendfile, file)
6033
6034 def testNonBlocking(self):
6035 conn = self.accept_conn()
6036 if conn.recv(8192):
6037 self.fail('was not supposed to receive any data')
6038
6039 # timeout (non-triggered)
6040
6041 def _testWithTimeout(self):
6042 address = self.serv.getsockname()
6043 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006044 sock = socket.create_connection(address,
6045 timeout=support.LOOPBACK_TIMEOUT)
6046 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006047 meth = self.meth_from_sock(sock)
6048 sent = meth(file)
6049 self.assertEqual(sent, self.FILESIZE)
6050
6051 def testWithTimeout(self):
6052 conn = self.accept_conn()
6053 data = self.recv_data(conn)
6054 self.assertEqual(len(data), self.FILESIZE)
6055 self.assertEqual(data, self.FILEDATA)
6056
6057 # timeout (triggered)
6058
6059 def _testWithTimeoutTriggeredSend(self):
6060 address = self.serv.getsockname()
Pablo Galindo1f511e12018-12-29 01:42:16 +00006061 with open(support.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03006062 with socket.create_connection(address) as sock:
6063 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00006064 meth = self.meth_from_sock(sock)
6065 self.assertRaises(socket.timeout, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006066
6067 def testWithTimeoutTriggeredSend(self):
6068 conn = self.accept_conn()
6069 conn.recv(88192)
6070
6071 # errors
6072
6073 def _test_errors(self):
6074 pass
6075
6076 def test_errors(self):
6077 with open(support.TESTFN, 'rb') as file:
6078 with socket.socket(type=socket.SOCK_DGRAM) as s:
6079 meth = self.meth_from_sock(s)
6080 self.assertRaisesRegex(
6081 ValueError, "SOCK_STREAM", meth, file)
6082 with open(support.TESTFN, 'rt') as file:
6083 with socket.socket() as s:
6084 meth = self.meth_from_sock(s)
6085 self.assertRaisesRegex(
6086 ValueError, "binary mode", meth, file)
6087 with open(support.TESTFN, 'rb') as file:
6088 with socket.socket() as s:
6089 meth = self.meth_from_sock(s)
6090 self.assertRaisesRegex(TypeError, "positive integer",
6091 meth, file, count='2')
6092 self.assertRaisesRegex(TypeError, "positive integer",
6093 meth, file, count=0.1)
6094 self.assertRaisesRegex(ValueError, "positive integer",
6095 meth, file, count=0)
6096 self.assertRaisesRegex(ValueError, "positive integer",
6097 meth, file, count=-1)
6098
6099
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006100@unittest.skipUnless(hasattr(os, "sendfile"),
6101 'os.sendfile() required for this test.')
6102class SendfileUsingSendfileTest(SendfileUsingSendTest):
6103 """
6104 Test the sendfile() implementation of socket.sendfile().
6105 """
6106 def meth_from_sock(self, sock):
6107 return getattr(sock, "_sendfile_use_sendfile")
6108
Christian Heimes48371412016-09-06 00:37:46 +02006109
6110@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02006111class LinuxKernelCryptoAPI(unittest.TestCase):
6112 # tests for AF_ALG
6113 def create_alg(self, typ, name):
6114 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02006115 try:
6116 sock.bind((typ, name))
6117 except FileNotFoundError as e:
6118 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02006119 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02006120 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02006121 else:
Christian Heimes02b30352016-09-11 19:49:56 +02006122 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02006123
Victor Stinner86afc1f2017-11-30 13:58:43 +01006124 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
6125 # at least on ppc64le architecture
6126 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02006127 def test_sha256(self):
6128 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
6129 "177a9cb410ff61f20015ad")
6130 with self.create_alg('hash', 'sha256') as algo:
6131 op, _ = algo.accept()
6132 with op:
6133 op.sendall(b"abc")
6134 self.assertEqual(op.recv(512), expected)
6135
6136 op, _ = algo.accept()
6137 with op:
6138 op.send(b'a', socket.MSG_MORE)
6139 op.send(b'b', socket.MSG_MORE)
6140 op.send(b'c', socket.MSG_MORE)
6141 op.send(b'')
6142 self.assertEqual(op.recv(512), expected)
6143
6144 def test_hmac_sha1(self):
6145 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
6146 with self.create_alg('hash', 'hmac(sha1)') as algo:
6147 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
6148 op, _ = algo.accept()
6149 with op:
6150 op.sendall(b"what do ya want for nothing?")
6151 self.assertEqual(op.recv(512), expected)
6152
Christian Heimese084f842016-09-11 20:11:30 +02006153 # Although it should work with 3.19 and newer the test blocks on
6154 # Ubuntu 15.10 with Kernel 4.2.0-19.
6155 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02006156 def test_aes_cbc(self):
6157 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
6158 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
6159 msg = b"Single block msg"
6160 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
6161 msglen = len(msg)
6162 with self.create_alg('skcipher', 'cbc(aes)') as algo:
6163 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6164 op, _ = algo.accept()
6165 with op:
6166 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6167 flags=socket.MSG_MORE)
6168 op.sendall(msg)
6169 self.assertEqual(op.recv(msglen), ciphertext)
6170
6171 op, _ = algo.accept()
6172 with op:
6173 op.sendmsg_afalg([ciphertext],
6174 op=socket.ALG_OP_DECRYPT, iv=iv)
6175 self.assertEqual(op.recv(msglen), msg)
6176
6177 # long message
6178 multiplier = 1024
6179 longmsg = [msg] * multiplier
6180 op, _ = algo.accept()
6181 with op:
6182 op.sendmsg_afalg(longmsg,
6183 op=socket.ALG_OP_ENCRYPT, iv=iv)
6184 enc = op.recv(msglen * multiplier)
6185 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05006186 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02006187
6188 op, _ = algo.accept()
6189 with op:
6190 op.sendmsg_afalg([enc],
6191 op=socket.ALG_OP_DECRYPT, iv=iv)
6192 dec = op.recv(msglen * multiplier)
6193 self.assertEqual(len(dec), msglen * multiplier)
6194 self.assertEqual(dec, msg * multiplier)
6195
matejcik9764c152017-02-16 14:41:31 +01006196 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02006197 def test_aead_aes_gcm(self):
6198 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
6199 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
6200 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
6201 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
6202 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
6203 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
6204
6205 taglen = len(expected_tag)
6206 assoclen = len(assoc)
6207
6208 with self.create_alg('aead', 'gcm(aes)') as algo:
6209 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6210 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
6211 None, taglen)
6212
6213 # send assoc, plain and tag buffer in separate steps
6214 op, _ = algo.accept()
6215 with op:
6216 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6217 assoclen=assoclen, flags=socket.MSG_MORE)
6218 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01006219 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02006220 res = op.recv(assoclen + len(plain) + taglen)
6221 self.assertEqual(expected_ct, res[assoclen:-taglen])
6222 self.assertEqual(expected_tag, res[-taglen:])
6223
6224 # now with msg
6225 op, _ = algo.accept()
6226 with op:
matejcik9764c152017-02-16 14:41:31 +01006227 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006228 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
6229 assoclen=assoclen)
6230 res = op.recv(assoclen + len(plain) + taglen)
6231 self.assertEqual(expected_ct, res[assoclen:-taglen])
6232 self.assertEqual(expected_tag, res[-taglen:])
6233
6234 # create anc data manually
6235 pack_uint32 = struct.Struct('I').pack
6236 op, _ = algo.accept()
6237 with op:
matejcik9764c152017-02-16 14:41:31 +01006238 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006239 op.sendmsg(
6240 [msg],
6241 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6242 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6243 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6244 )
6245 )
matejcik9764c152017-02-16 14:41:31 +01006246 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006247 self.assertEqual(expected_ct, res[assoclen:-taglen])
6248 self.assertEqual(expected_tag, res[-taglen:])
6249
6250 # decrypt and verify
6251 op, _ = algo.accept()
6252 with op:
6253 msg = assoc + expected_ct + expected_tag
6254 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6255 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006256 res = op.recv(len(msg) - taglen)
6257 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006258
Christian Heimese084f842016-09-11 20:11:30 +02006259 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006260 def test_drbg_pr_sha256(self):
6261 # deterministic random bit generator, prediction resistance, sha256
6262 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6263 extra_seed = os.urandom(32)
6264 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6265 op, _ = algo.accept()
6266 with op:
6267 rn = op.recv(32)
6268 self.assertEqual(len(rn), 32)
6269
6270 def test_sendmsg_afalg_args(self):
6271 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006272 with sock:
6273 with self.assertRaises(TypeError):
6274 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006275
Christian Heimes02b30352016-09-11 19:49:56 +02006276 with self.assertRaises(TypeError):
6277 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006278
Christian Heimes02b30352016-09-11 19:49:56 +02006279 with self.assertRaises(TypeError):
6280 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006281
Christian Heimes02b30352016-09-11 19:49:56 +02006282 with self.assertRaises(TypeError):
6283 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006284
Christian Heimes02b30352016-09-11 19:49:56 +02006285 with self.assertRaises(TypeError):
6286 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6287
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006288 def test_length_restriction(self):
6289 # bpo-35050, off-by-one error in length check
6290 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6291 self.addCleanup(sock.close)
6292
6293 # salg_type[14]
6294 with self.assertRaises(FileNotFoundError):
6295 sock.bind(("t" * 13, "name"))
6296 with self.assertRaisesRegex(ValueError, "type too long"):
6297 sock.bind(("t" * 14, "name"))
6298
6299 # salg_name[64]
6300 with self.assertRaises(FileNotFoundError):
6301 sock.bind(("type", "n" * 63))
6302 with self.assertRaisesRegex(ValueError, "name too long"):
6303 sock.bind(("type", "n" * 64))
6304
6305
animalize19e7d482018-02-27 02:10:36 +08006306@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6307class TestMSWindowsTCPFlags(unittest.TestCase):
6308 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006309 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006310 'TCP_MAXSEG',
6311 'TCP_NODELAY',
6312 # available starting with Windows 10 1607
6313 'TCP_FASTOPEN',
6314 # available starting with Windows 10 1703
6315 'TCP_KEEPCNT',
6316 # available starting with Windows 10 1709
6317 'TCP_KEEPIDLE',
6318 'TCP_KEEPINTVL'
6319 }
6320
6321 def test_new_tcp_flags(self):
6322 provided = [s for s in dir(socket) if s.startswith('TCP')]
6323 unknown = [s for s in provided if s not in self.knownTCPFlags]
6324
6325 self.assertEqual([], unknown,
6326 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006327
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006328
6329class CreateServerTest(unittest.TestCase):
6330
6331 def test_address(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006332 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006333 with socket.create_server(("127.0.0.1", port)) as sock:
6334 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6335 self.assertEqual(sock.getsockname()[1], port)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006336 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006337 with socket.create_server(("::1", port),
6338 family=socket.AF_INET6) as sock:
6339 self.assertEqual(sock.getsockname()[0], "::1")
6340 self.assertEqual(sock.getsockname()[1], port)
6341
6342 def test_family_and_type(self):
6343 with socket.create_server(("127.0.0.1", 0)) as sock:
6344 self.assertEqual(sock.family, socket.AF_INET)
6345 self.assertEqual(sock.type, socket.SOCK_STREAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006346 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006347 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6348 self.assertEqual(s.family, socket.AF_INET6)
6349 self.assertEqual(sock.type, socket.SOCK_STREAM)
6350
6351 def test_reuse_port(self):
6352 if not hasattr(socket, "SO_REUSEPORT"):
6353 with self.assertRaises(ValueError):
6354 socket.create_server(("localhost", 0), reuse_port=True)
6355 else:
6356 with socket.create_server(("localhost", 0)) as sock:
6357 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6358 self.assertEqual(opt, 0)
6359 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6360 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6361 self.assertNotEqual(opt, 0)
6362
6363 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6364 not hasattr(_socket, 'IPV6_V6ONLY'),
6365 "IPV6_V6ONLY option not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006366 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006367 def test_ipv6_only_default(self):
6368 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6369 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6370
6371 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6372 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006373 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006374 def test_dualstack_ipv6_family(self):
6375 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6376 dualstack_ipv6=True) as sock:
6377 self.assertEqual(sock.family, socket.AF_INET6)
6378
6379
6380class CreateServerFunctionalTest(unittest.TestCase):
Victor Stinner24c62582019-10-30 12:41:43 +01006381 timeout = support.LOOPBACK_TIMEOUT
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006382
6383 def setUp(self):
6384 self.thread = None
6385
6386 def tearDown(self):
6387 if self.thread is not None:
6388 self.thread.join(self.timeout)
6389
6390 def echo_server(self, sock):
6391 def run(sock):
6392 with sock:
6393 conn, _ = sock.accept()
6394 with conn:
6395 event.wait(self.timeout)
6396 msg = conn.recv(1024)
6397 if not msg:
6398 return
6399 conn.sendall(msg)
6400
6401 event = threading.Event()
6402 sock.settimeout(self.timeout)
6403 self.thread = threading.Thread(target=run, args=(sock, ))
6404 self.thread.start()
6405 event.set()
6406
6407 def echo_client(self, addr, family):
6408 with socket.socket(family=family) as sock:
6409 sock.settimeout(self.timeout)
6410 sock.connect(addr)
6411 sock.sendall(b'foo')
6412 self.assertEqual(sock.recv(1024), b'foo')
6413
6414 def test_tcp4(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006415 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006416 with socket.create_server(("", port)) as sock:
6417 self.echo_server(sock)
6418 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6419
Serhiy Storchaka16994912020-04-25 10:06:29 +03006420 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006421 def test_tcp6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006422 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006423 with socket.create_server(("", port),
6424 family=socket.AF_INET6) as sock:
6425 self.echo_server(sock)
6426 self.echo_client(("::1", port), socket.AF_INET6)
6427
6428 # --- dual stack tests
6429
6430 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6431 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006432 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006433 def test_dual_stack_client_v4(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006434 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006435 with socket.create_server(("", port), family=socket.AF_INET6,
6436 dualstack_ipv6=True) as sock:
6437 self.echo_server(sock)
6438 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6439
6440 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6441 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006442 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006443 def test_dual_stack_client_v6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006444 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006445 with socket.create_server(("", port), family=socket.AF_INET6,
6446 dualstack_ipv6=True) as sock:
6447 self.echo_server(sock)
6448 self.echo_client(("::1", port), socket.AF_INET6)
6449
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006450@requireAttrs(socket, "send_fds")
6451@requireAttrs(socket, "recv_fds")
6452@requireAttrs(socket, "AF_UNIX")
6453class SendRecvFdsTests(unittest.TestCase):
6454 def testSendAndRecvFds(self):
6455 def close_pipes(pipes):
6456 for fd1, fd2 in pipes:
6457 os.close(fd1)
6458 os.close(fd2)
6459
6460 def close_fds(fds):
6461 for fd in fds:
6462 os.close(fd)
6463
6464 # send 10 file descriptors
6465 pipes = [os.pipe() for _ in range(10)]
6466 self.addCleanup(close_pipes, pipes)
6467 fds = [rfd for rfd, wfd in pipes]
6468
6469 # use a UNIX socket pair to exchange file descriptors locally
6470 sock1, sock2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
6471 with sock1, sock2:
6472 socket.send_fds(sock1, [MSG], fds)
6473 # request more data and file descriptors than expected
6474 msg, fds2, flags, addr = socket.recv_fds(sock2, len(MSG) * 2, len(fds) * 2)
6475 self.addCleanup(close_fds, fds2)
6476
6477 self.assertEqual(msg, MSG)
6478 self.assertEqual(len(fds2), len(fds))
6479 self.assertEqual(flags, 0)
6480 # don't test addr
6481
6482 # test that file descriptors are connected
6483 for index, fds in enumerate(pipes):
6484 rfd, wfd = fds
6485 os.write(wfd, str(index).encode())
6486
6487 for index, rfd in enumerate(fds2):
6488 data = os.read(rfd, 100)
6489 self.assertEqual(data, str(index).encode())
6490
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006491
Guido van Rossumb995eb72002-07-31 16:08:40 +00006492def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006493 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006494 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006495 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest,
6496 SendRecvFdsTests]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006497
6498 tests.extend([
6499 NonBlockingTCPTests,
6500 FileObjectClassTestCase,
6501 UnbufferedFileObjectClassTestCase,
6502 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006503 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006504 UnicodeReadFileObjectClassTestCase,
6505 UnicodeWriteFileObjectClassTestCase,
6506 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006507 NetworkConnectionNoServer,
6508 NetworkConnectionAttributesTest,
6509 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006510 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006511 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006512 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006513 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006514 tests.append(BasicSocketPairTest)
6515 tests.append(TestUnixDomain)
6516 tests.append(TestLinuxAbstractNamespace)
6517 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006518 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006519 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006520 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006521 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006522 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006523 BasicVSOCKTest,
6524 ThreadedVSOCKSocketStreamTest,
6525 ])
Greg Bowser8fbece12019-08-02 16:29:52 -04006526 tests.append(BasicBluetoothTest)
caaveryeffc12f2017-09-06 18:18:10 -04006527 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006528 CmsgMacroTests,
6529 SendmsgUDPTest,
6530 RecvmsgUDPTest,
6531 RecvmsgIntoUDPTest,
6532 SendmsgUDP6Test,
6533 RecvmsgUDP6Test,
6534 RecvmsgRFC3542AncillaryUDP6Test,
6535 RecvmsgIntoRFC3542AncillaryUDP6Test,
6536 RecvmsgIntoUDP6Test,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07006537 SendmsgUDPLITETest,
6538 RecvmsgUDPLITETest,
6539 RecvmsgIntoUDPLITETest,
6540 SendmsgUDPLITE6Test,
6541 RecvmsgUDPLITE6Test,
6542 RecvmsgRFC3542AncillaryUDPLITE6Test,
6543 RecvmsgIntoRFC3542AncillaryUDPLITE6Test,
6544 RecvmsgIntoUDPLITE6Test,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006545 SendmsgTCPTest,
6546 RecvmsgTCPTest,
6547 RecvmsgIntoTCPTest,
6548 SendmsgSCTPStreamTest,
6549 RecvmsgSCTPStreamTest,
6550 RecvmsgIntoSCTPStreamTest,
6551 SendmsgUnixStreamTest,
6552 RecvmsgUnixStreamTest,
6553 RecvmsgIntoUnixStreamTest,
6554 RecvmsgSCMRightsStreamTest,
6555 RecvmsgIntoSCMRightsStreamTest,
6556 # These are slow when setitimer() is not available
6557 InterruptedRecvTimeoutTest,
6558 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006559 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006560 SendfileUsingSendTest,
6561 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006562 ])
animalize19e7d482018-02-27 02:10:36 +08006563 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006564
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006565 thread_info = support.threading_setup()
6566 support.run_unittest(*tests)
6567 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006568
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006569
Guido van Rossum24e4af82002-06-12 19:18:08 +00006570if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006571 test_main()