blob: bd4fad1f638043234d8ae6c0cb337c5fd4156f64 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003
Christian Heimes5e696852008-04-09 08:37:03 +00004import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005import io
Charles-François Natali65708cf2014-07-25 18:44:30 +01006import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +00007import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +10009import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000016import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000017from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000018import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000019import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010020import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020021import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020022import random
Christian Heimesb6e43af2018-01-29 22:37:58 +010023import shutil
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020024import string
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020025import _thread as thread
26import threading
Antoine Pitroub1c54962010-10-14 15:05:38 +000027try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000028 import multiprocessing
29except ImportError:
30 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020031try:
32 import fcntl
33except ImportError:
34 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000035
Benjamin Petersonee8712c2008-05-20 21:35:26 +000036HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000037MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000038
caaveryeffc12f2017-09-06 18:18:10 -040039VSOCKPORT = 1234
40
Victor Stinner45df8202010-04-28 22:31:17 +000041try:
Victor Stinnere254e532014-07-26 14:36:55 +020042 import _socket
43except ImportError:
44 _socket = None
45
caaveryeffc12f2017-09-06 18:18:10 -040046def get_cid():
47 if fcntl is None:
48 return None
49 try:
50 with open("/dev/vsock", "rb") as f:
51 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
52 except OSError:
53 return None
54 else:
55 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000056
Charles-François Natali47413c12011-10-06 19:47:44 +020057def _have_socket_can():
58 """Check whether CAN sockets are supported on this host."""
59 try:
60 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020061 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020062 return False
63 else:
64 s.close()
65 return True
66
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040067def _have_socket_can_isotp():
68 """Check whether CAN ISOTP sockets are supported on this host."""
69 try:
70 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
71 except (AttributeError, OSError):
72 return False
73 else:
74 s.close()
75 return True
76
Charles-François Natali10b8cf42011-11-10 19:21:37 +010077def _have_socket_rds():
78 """Check whether RDS sockets are supported on this host."""
79 try:
80 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
81 except (AttributeError, OSError):
82 return False
83 else:
84 s.close()
85 return True
86
Christian Heimes48371412016-09-06 00:37:46 +020087def _have_socket_alg():
88 """Check whether AF_ALG sockets are supported on this host."""
89 try:
90 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
91 except (AttributeError, OSError):
92 return False
93 else:
94 s.close()
95 return True
96
caaveryeffc12f2017-09-06 18:18:10 -040097def _have_socket_vsock():
98 """Check whether AF_VSOCK sockets are supported on this host."""
99 ret = get_cid() is not None
100 return ret
101
Yury Selivanovf11b4602018-01-28 17:27:38 -0500102
103def _is_fd_in_blocking_mode(sock):
104 return not bool(
105 fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
106
107
Charles-François Natali47413c12011-10-06 19:47:44 +0200108HAVE_SOCKET_CAN = _have_socket_can()
109
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400110HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
111
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100112HAVE_SOCKET_RDS = _have_socket_rds()
113
Christian Heimes48371412016-09-06 00:37:46 +0200114HAVE_SOCKET_ALG = _have_socket_alg()
115
caaveryeffc12f2017-09-06 18:18:10 -0400116HAVE_SOCKET_VSOCK = _have_socket_vsock()
117
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000118# Size in bytes of the int type
119SIZEOF_INT = array.array("i").itemsize
120
Guido van Rossum24e4af82002-06-12 19:18:08 +0000121class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000122
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123 def setUp(self):
124 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000125 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100126 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000127
Guido van Rossum24e4af82002-06-12 19:18:08 +0000128 def tearDown(self):
129 self.serv.close()
130 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000131
Guido van Rossum24e4af82002-06-12 19:18:08 +0000132class SocketUDPTest(unittest.TestCase):
133
134 def setUp(self):
135 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000136 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000137
138 def tearDown(self):
139 self.serv.close()
140 self.serv = None
141
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000142class ThreadSafeCleanupTestCase(unittest.TestCase):
143 """Subclass of unittest.TestCase with thread-safe cleanup methods.
144
145 This subclass protects the addCleanup() and doCleanups() methods
146 with a recursive lock.
147 """
148
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200149 def __init__(self, *args, **kwargs):
150 super().__init__(*args, **kwargs)
151 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000152
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200153 def addCleanup(self, *args, **kwargs):
154 with self._cleanup_lock:
155 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000156
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200157 def doCleanups(self, *args, **kwargs):
158 with self._cleanup_lock:
159 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000160
Charles-François Natali47413c12011-10-06 19:47:44 +0200161class SocketCANTest(unittest.TestCase):
162
163 """To be able to run this test, a `vcan0` CAN interface can be created with
164 the following commands:
165 # modprobe vcan
166 # ip link add dev vcan0 type vcan
167 # ifconfig vcan0 up
168 """
169 interface = 'vcan0'
170 bufsize = 128
171
Charles-François Natali773e42d2013-02-05 19:42:01 +0100172 """The CAN frame structure is defined in <linux/can.h>:
173
174 struct can_frame {
175 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
176 __u8 can_dlc; /* data length code: 0 .. 8 */
177 __u8 data[8] __attribute__((aligned(8)));
178 };
179 """
180 can_frame_fmt = "=IB3x8s"
181 can_frame_size = struct.calcsize(can_frame_fmt)
182
183 """The Broadcast Management Command frame structure is defined
184 in <linux/can/bcm.h>:
185
186 struct bcm_msg_head {
187 __u32 opcode;
188 __u32 flags;
189 __u32 count;
190 struct timeval ival1, ival2;
191 canid_t can_id;
192 __u32 nframes;
193 struct can_frame frames[0];
194 }
195
196 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
197 `struct can_frame` definition). Must use native not standard types for packing.
198 """
199 bcm_cmd_msg_fmt = "@3I4l2I"
200 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
201
Charles-François Natali47413c12011-10-06 19:47:44 +0200202 def setUp(self):
203 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200204 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200205 try:
206 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200207 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200208 self.skipTest('network interface `%s` does not exist' %
209 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200210
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100211
212class SocketRDSTest(unittest.TestCase):
213
214 """To be able to run this test, the `rds` kernel module must be loaded:
215 # modprobe rds
216 """
217 bufsize = 8192
218
219 def setUp(self):
220 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
221 self.addCleanup(self.serv.close)
222 try:
223 self.port = support.bind_port(self.serv)
224 except OSError:
225 self.skipTest('unable to bind RDS socket')
226
227
Guido van Rossum24e4af82002-06-12 19:18:08 +0000228class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000229 """Threadable Test class
230
231 The ThreadableTest class makes it easy to create a threaded
232 client/server pair from an existing unit test. To create a
233 new threaded class from an existing unit test, use multiple
234 inheritance:
235
236 class NewClass (OldClass, ThreadableTest):
237 pass
238
239 This class defines two new fixture functions with obvious
240 purposes for overriding:
241
242 clientSetUp ()
243 clientTearDown ()
244
245 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000246 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000247 '_' to indicate the client portion of the test. Ex:
248
249 def testFoo(self):
250 # Server portion
251
252 def _testFoo(self):
253 # Client portion
254
255 Any exceptions raised by the clients during their tests
256 are caught and transferred to the main thread to alert
257 the testing framework.
258
259 Note, the server setup function cannot call any blocking
260 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000261 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000262 the blocking call (such as in setting up a client/server
263 connection and performing the accept() in setUp().
264 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000265
266 def __init__(self):
267 # Swap the true setup function
268 self.__setUp = self.setUp
269 self.__tearDown = self.tearDown
270 self.setUp = self._setUp
271 self.tearDown = self._tearDown
272
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000273 def serverExplicitReady(self):
274 """This method allows the server to explicitly indicate that
275 it wants the client thread to proceed. This is useful if the
276 server is about to execute a blocking routine that is
277 dependent upon the client thread during its setup routine."""
278 self.server_ready.set()
279
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280 def _setUp(self):
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700281 self.wait_threads = support.wait_threads_exit()
282 self.wait_threads.__enter__()
283
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000284 self.server_ready = threading.Event()
285 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000286 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000287 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200288 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000289
290 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000291 methodname = self.id()
292 i = methodname.rfind('.')
293 methodname = methodname[i+1:]
294 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000295 self.client_thread = thread.start_new_thread(
296 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000297
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200298 try:
299 self.__setUp()
300 except:
301 self.server_crashed = True
302 raise
303 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000304 self.server_ready.set()
305 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000306
307 def _tearDown(self):
308 self.__tearDown()
309 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700310 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000311
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000312 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000313 exc = self.queue.get()
314 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000315
316 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000317 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100318 try:
319 self.clientSetUp()
320 except BaseException as e:
321 self.queue.put(e)
322 self.clientTearDown()
323 return
324 finally:
325 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200326 if self.server_crashed:
327 self.clientTearDown()
328 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000329 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000330 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000331 try:
332 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000333 except BaseException as e:
334 self.queue.put(e)
335 finally:
336 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000337
338 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000339 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000340
341 def clientTearDown(self):
342 self.done.set()
343 thread.exit()
344
345class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
346
347 def __init__(self, methodName='runTest'):
348 SocketTCPTest.__init__(self, methodName=methodName)
349 ThreadableTest.__init__(self)
350
351 def clientSetUp(self):
352 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
353
354 def clientTearDown(self):
355 self.cli.close()
356 self.cli = None
357 ThreadableTest.clientTearDown(self)
358
359class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
360
361 def __init__(self, methodName='runTest'):
362 SocketUDPTest.__init__(self, methodName=methodName)
363 ThreadableTest.__init__(self)
364
365 def clientSetUp(self):
366 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
367
Brian Curtin3beb38f2010-11-04 03:41:43 +0000368 def clientTearDown(self):
369 self.cli.close()
370 self.cli = None
371 ThreadableTest.clientTearDown(self)
372
Charles-François Natali47413c12011-10-06 19:47:44 +0200373class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
374
375 def __init__(self, methodName='runTest'):
376 SocketCANTest.__init__(self, methodName=methodName)
377 ThreadableTest.__init__(self)
378
379 def clientSetUp(self):
380 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
381 try:
382 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200383 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200384 # skipTest should not be called here, and will be called in the
385 # server instead
386 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200387
388 def clientTearDown(self):
389 self.cli.close()
390 self.cli = None
391 ThreadableTest.clientTearDown(self)
392
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100393class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
394
395 def __init__(self, methodName='runTest'):
396 SocketRDSTest.__init__(self, methodName=methodName)
397 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100398
399 def clientSetUp(self):
400 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
401 try:
402 # RDS sockets must be bound explicitly to send or receive data
403 self.cli.bind((HOST, 0))
404 self.cli_addr = self.cli.getsockname()
405 except OSError:
406 # skipTest should not be called here, and will be called in the
407 # server instead
408 pass
409
410 def clientTearDown(self):
411 self.cli.close()
412 self.cli = None
413 ThreadableTest.clientTearDown(self)
414
caaveryeffc12f2017-09-06 18:18:10 -0400415@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400416@unittest.skipUnless(HAVE_SOCKET_VSOCK,
417 'VSOCK sockets required for this test.')
418@unittest.skipUnless(get_cid() != 2,
419 "This test can only be run on a virtual guest.")
420class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
421
422 def __init__(self, methodName='runTest'):
423 unittest.TestCase.__init__(self, methodName=methodName)
424 ThreadableTest.__init__(self)
425
426 def setUp(self):
427 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
428 self.addCleanup(self.serv.close)
429 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
430 self.serv.listen()
431 self.serverExplicitReady()
432 self.conn, self.connaddr = self.serv.accept()
433 self.addCleanup(self.conn.close)
434
435 def clientSetUp(self):
436 time.sleep(0.1)
437 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
438 self.addCleanup(self.cli.close)
439 cid = get_cid()
440 self.cli.connect((cid, VSOCKPORT))
441
442 def testStream(self):
443 msg = self.conn.recv(1024)
444 self.assertEqual(msg, MSG)
445
446 def _testStream(self):
447 self.cli.send(MSG)
448 self.cli.close()
449
Guido van Rossum24e4af82002-06-12 19:18:08 +0000450class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000451 """Socket tests for client-server connection.
452
453 self.cli_conn is a client socket connected to the server. The
454 setUp() method guarantees that it is connected to the server.
455 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000456
457 def __init__(self, methodName='runTest'):
458 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
459
460 def setUp(self):
461 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000462 # Indicate explicitly we're ready for the client thread to
463 # proceed and then perform the blocking call to accept
464 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000465 conn, addr = self.serv.accept()
466 self.cli_conn = conn
467
468 def tearDown(self):
469 self.cli_conn.close()
470 self.cli_conn = None
471 ThreadedTCPSocketTest.tearDown(self)
472
473 def clientSetUp(self):
474 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000475 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000476 self.serv_conn = self.cli
477
478 def clientTearDown(self):
479 self.serv_conn.close()
480 self.serv_conn = None
481 ThreadedTCPSocketTest.clientTearDown(self)
482
Dave Cole331708b2004-08-09 04:51:41 +0000483class SocketPairTest(unittest.TestCase, ThreadableTest):
484
485 def __init__(self, methodName='runTest'):
486 unittest.TestCase.__init__(self, methodName=methodName)
487 ThreadableTest.__init__(self)
488
489 def setUp(self):
490 self.serv, self.cli = socket.socketpair()
491
492 def tearDown(self):
493 self.serv.close()
494 self.serv = None
495
496 def clientSetUp(self):
497 pass
498
499 def clientTearDown(self):
500 self.cli.close()
501 self.cli = None
502 ThreadableTest.clientTearDown(self)
503
Tim Peters494aaee2004-08-09 18:54:11 +0000504
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000505# The following classes are used by the sendmsg()/recvmsg() tests.
506# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
507# gives a drop-in replacement for SocketConnectedTest, but different
508# address families can be used, and the attributes serv_addr and
509# cli_addr will be set to the addresses of the endpoints.
510
511class SocketTestBase(unittest.TestCase):
512 """A base class for socket tests.
513
514 Subclasses must provide methods newSocket() to return a new socket
515 and bindSock(sock) to bind it to an unused address.
516
517 Creates a socket self.serv and sets self.serv_addr to its address.
518 """
519
520 def setUp(self):
521 self.serv = self.newSocket()
522 self.bindServer()
523
524 def bindServer(self):
525 """Bind server socket and set self.serv_addr to its address."""
526 self.bindSock(self.serv)
527 self.serv_addr = self.serv.getsockname()
528
529 def tearDown(self):
530 self.serv.close()
531 self.serv = None
532
533
534class SocketListeningTestMixin(SocketTestBase):
535 """Mixin to listen on the server socket."""
536
537 def setUp(self):
538 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100539 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000540
541
542class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
543 ThreadableTest):
544 """Mixin to add client socket and allow client/server tests.
545
546 Client socket is self.cli and its address is self.cli_addr. See
547 ThreadableTest for usage information.
548 """
549
550 def __init__(self, *args, **kwargs):
551 super().__init__(*args, **kwargs)
552 ThreadableTest.__init__(self)
553
554 def clientSetUp(self):
555 self.cli = self.newClientSocket()
556 self.bindClient()
557
558 def newClientSocket(self):
559 """Return a new socket for use as client."""
560 return self.newSocket()
561
562 def bindClient(self):
563 """Bind client socket and set self.cli_addr to its address."""
564 self.bindSock(self.cli)
565 self.cli_addr = self.cli.getsockname()
566
567 def clientTearDown(self):
568 self.cli.close()
569 self.cli = None
570 ThreadableTest.clientTearDown(self)
571
572
573class ConnectedStreamTestMixin(SocketListeningTestMixin,
574 ThreadedSocketTestMixin):
575 """Mixin to allow client/server stream tests with connected client.
576
577 Server's socket representing connection to client is self.cli_conn
578 and client's connection to server is self.serv_conn. (Based on
579 SocketConnectedTest.)
580 """
581
582 def setUp(self):
583 super().setUp()
584 # Indicate explicitly we're ready for the client thread to
585 # proceed and then perform the blocking call to accept
586 self.serverExplicitReady()
587 conn, addr = self.serv.accept()
588 self.cli_conn = conn
589
590 def tearDown(self):
591 self.cli_conn.close()
592 self.cli_conn = None
593 super().tearDown()
594
595 def clientSetUp(self):
596 super().clientSetUp()
597 self.cli.connect(self.serv_addr)
598 self.serv_conn = self.cli
599
600 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100601 try:
602 self.serv_conn.close()
603 self.serv_conn = None
604 except AttributeError:
605 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000606 super().clientTearDown()
607
608
609class UnixSocketTestBase(SocketTestBase):
610 """Base class for Unix-domain socket tests."""
611
612 # This class is used for file descriptor passing tests, so we
613 # create the sockets in a private directory so that other users
614 # can't send anything that might be problematic for a privileged
615 # user running the tests.
616
617 def setUp(self):
618 self.dir_path = tempfile.mkdtemp()
619 self.addCleanup(os.rmdir, self.dir_path)
620 super().setUp()
621
622 def bindSock(self, sock):
623 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100624 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000625 self.addCleanup(support.unlink, path)
626
627class UnixStreamBase(UnixSocketTestBase):
628 """Base class for Unix-domain SOCK_STREAM tests."""
629
630 def newSocket(self):
631 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
632
633
634class InetTestBase(SocketTestBase):
635 """Base class for IPv4 socket tests."""
636
637 host = HOST
638
639 def setUp(self):
640 super().setUp()
641 self.port = self.serv_addr[1]
642
643 def bindSock(self, sock):
644 support.bind_port(sock, host=self.host)
645
646class TCPTestBase(InetTestBase):
647 """Base class for TCP-over-IPv4 tests."""
648
649 def newSocket(self):
650 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
651
652class UDPTestBase(InetTestBase):
653 """Base class for UDP-over-IPv4 tests."""
654
655 def newSocket(self):
656 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
657
658class SCTPStreamBase(InetTestBase):
659 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
660
661 def newSocket(self):
662 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
663 socket.IPPROTO_SCTP)
664
665
666class Inet6TestBase(InetTestBase):
667 """Base class for IPv6 socket tests."""
668
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200669 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000670
671class UDP6TestBase(Inet6TestBase):
672 """Base class for UDP-over-IPv6 tests."""
673
674 def newSocket(self):
675 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
676
677
678# Test-skipping decorators for use with ThreadableTest.
679
680def skipWithClientIf(condition, reason):
681 """Skip decorated test if condition is true, add client_skip decorator.
682
683 If the decorated object is not a class, sets its attribute
684 "client_skip" to a decorator which will return an empty function
685 if the test is to be skipped, or the original function if it is
686 not. This can be used to avoid running the client part of a
687 skipped test when using ThreadableTest.
688 """
689 def client_pass(*args, **kwargs):
690 pass
691 def skipdec(obj):
692 retval = unittest.skip(reason)(obj)
693 if not isinstance(obj, type):
694 retval.client_skip = lambda f: client_pass
695 return retval
696 def noskipdec(obj):
697 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
698 obj.client_skip = lambda f: f
699 return obj
700 return skipdec if condition else noskipdec
701
702
703def requireAttrs(obj, *attributes):
704 """Skip decorated test if obj is missing any of the given attributes.
705
706 Sets client_skip attribute as skipWithClientIf() does.
707 """
708 missing = [name for name in attributes if not hasattr(obj, name)]
709 return skipWithClientIf(
710 missing, "don't have " + ", ".join(name for name in missing))
711
712
713def requireSocket(*args):
714 """Skip decorated test if a socket cannot be created with given arguments.
715
716 When an argument is given as a string, will use the value of that
717 attribute of the socket module, or skip the test if it doesn't
718 exist. Sets client_skip attribute as skipWithClientIf() does.
719 """
720 err = None
721 missing = [obj for obj in args if
722 isinstance(obj, str) and not hasattr(socket, obj)]
723 if missing:
724 err = "don't have " + ", ".join(name for name in missing)
725 else:
726 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
727 for obj in args]
728 try:
729 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200730 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000731 # XXX: check errno?
732 err = str(e)
733 else:
734 s.close()
735 return skipWithClientIf(
736 err is not None,
737 "can't create socket({0}): {1}".format(
738 ", ".join(str(o) for o in args), err))
739
740
Guido van Rossum24e4af82002-06-12 19:18:08 +0000741#######################################################################
742## Begin Tests
743
744class GeneralModuleTests(unittest.TestCase):
745
Ethan Furman7184bac2014-10-14 18:56:53 -0700746 def test_SocketType_is_socketobject(self):
747 import _socket
748 self.assertTrue(socket.SocketType is _socket.socket)
749 s = socket.socket()
750 self.assertIsInstance(s, socket.SocketType)
751 s.close()
752
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000753 def test_repr(self):
754 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200755 with s:
756 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000757 self.assertIn('family=%s' % socket.AF_INET, repr(s))
758 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200759 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200760 self.assertNotIn('raddr', repr(s))
761 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200762 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200763 self.assertIn(str(s.getsockname()), repr(s))
764 self.assertIn('[closed]', repr(s))
765 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000766
Victor Stinnere254e532014-07-26 14:36:55 +0200767 @unittest.skipUnless(_socket is not None, 'need _socket module')
768 def test_csocket_repr(self):
769 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
770 try:
771 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
772 % (s.fileno(), s.family, s.type, s.proto))
773 self.assertEqual(repr(s), expected)
774 finally:
775 s.close()
776 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
777 % (s.family, s.type, s.proto))
778 self.assertEqual(repr(s), expected)
779
Raymond Hettinger027bb632004-05-31 03:09:25 +0000780 def test_weakref(self):
781 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
782 p = proxy(s)
783 self.assertEqual(p.fileno(), s.fileno())
784 s.close()
785 s = None
786 try:
787 p.fileno()
788 except ReferenceError:
789 pass
790 else:
791 self.fail('Socket proxy still exists')
792
Guido van Rossum24e4af82002-06-12 19:18:08 +0000793 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000794 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300795 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200796 with self.assertRaises(OSError, msg=msg % 'OSError'):
797 raise OSError
798 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000799 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200800 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000801 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000802
Ezio Melotti63e42302011-05-07 19:47:48 +0300803 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000804 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300805 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
806 self.addCleanup(s.close)
807 s.bind(('', 0))
808 sockname = s.getsockname()
809 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300810 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300811 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300812 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400813 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300814 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300815 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300816 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400817 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300818 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300819 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300820 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300821 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300822 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300823 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300824 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400825 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300826 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300827 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300828 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400829 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300830 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300831 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300832 self.assertIn('not NoneType', str(cm.exception))
833 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300834 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300835 self.assertIn('an integer is required', str(cm.exception))
836 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300837 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300838 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300839 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300840 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300841 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300842 self.assertIn('(1 given)', str(cm.exception))
843 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300844 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300845 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300846
Guido van Rossum24e4af82002-06-12 19:18:08 +0000847 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000848 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000849 socket.AF_INET
850 socket.SOCK_STREAM
851 socket.SOCK_DGRAM
852 socket.SOCK_RAW
853 socket.SOCK_RDM
854 socket.SOCK_SEQPACKET
855 socket.SOL_SOCKET
856 socket.SO_REUSEADDR
857
Guido van Rossum654c11e2002-06-13 20:24:17 +0000858 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000859 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000860 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000861 try:
862 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200863 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000864 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600865 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000866 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000867 try:
868 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200869 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000870 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600871 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000872 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000873 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000874 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000875 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000876
Charles-François Natali0cc86852013-09-13 19:53:08 +0200877 def test_host_resolution(self):
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700878 for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200879 self.assertEqual(socket.gethostbyname(addr), addr)
880
881 # we don't test support.HOSTv6 because there's a chance it doesn't have
882 # a matching name entry (e.g. 'ip6-localhost')
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700883 for host in [support.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200884 self.assertIn(host, socket.gethostbyaddr(host)[2])
885
Xiang Zhangd36a7162017-03-07 11:06:09 +0800886 def test_host_resolution_bad_address(self):
887 # These are all malformed IP addresses and expected not to resolve to
888 # any result. But some ISPs, e.g. AWS, may successfully resolve these
889 # IPs.
890 explanation = (
891 "resolving an invalid IP address did not raise OSError; "
892 "can be caused by a broken DNS server"
893 )
894 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
895 '1:1:1:1:1:1:1:1:1']:
Miss Islington (bot)56882db2018-05-17 09:53:24 -0700896 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +0800897 socket.gethostbyname(addr)
898 with self.assertRaises(OSError, msg=explanation):
899 socket.gethostbyaddr(addr)
900
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000901 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
902 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
903 def test_sethostname(self):
904 oldhn = socket.gethostname()
905 try:
906 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200907 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000908 if e.errno == errno.EPERM:
909 self.skipTest("test should be run as root")
910 else:
911 raise
912 try:
913 # running test as root!
914 self.assertEqual(socket.gethostname(), 'new')
915 # Should work with bytes objects too
916 socket.sethostname(b'bar')
917 self.assertEqual(socket.gethostname(), 'bar')
918 finally:
919 socket.sethostname(oldhn)
920
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700921 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
922 'socket.if_nameindex() not available.')
923 def testInterfaceNameIndex(self):
924 interfaces = socket.if_nameindex()
925 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200926 self.assertIsInstance(index, int)
927 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700928 # interface indices are non-zero integers
929 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200930 _index = socket.if_nametoindex(name)
931 self.assertIsInstance(_index, int)
932 self.assertEqual(index, _index)
933 _name = socket.if_indextoname(index)
934 self.assertIsInstance(_name, str)
935 self.assertEqual(name, _name)
936
937 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
938 'socket.if_nameindex() not available.')
939 def testInvalidInterfaceNameIndex(self):
940 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200941 self.assertRaises(OSError, socket.if_indextoname, 0)
942 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200943 # test with invalid values
944 self.assertRaises(TypeError, socket.if_nametoindex, 0)
945 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700946
Serhiy Storchaka43767632013-11-03 21:31:38 +0200947 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
948 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000949 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000950 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200951 try:
952 # On some versions, this loses a reference
953 orig = sys.getrefcount(__name__)
954 socket.getnameinfo(__name__,0)
955 except TypeError:
956 if sys.getrefcount(__name__) != orig:
957 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000958
Guido van Rossum24e4af82002-06-12 19:18:08 +0000959 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000960 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000961 try:
962 # On some versions, this crashes the interpreter.
963 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200964 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000965 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000966
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000967 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000968 # This just checks that htons etc. are their own inverse,
969 # when looking at the lower 16 or 32 bits.
970 sizes = {socket.htonl: 32, socket.ntohl: 32,
971 socket.htons: 16, socket.ntohs: 16}
972 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000973 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000974 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
975 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000976
Guido van Rossuma2627af2002-09-14 00:58:46 +0000977 swapped = func(mask)
978 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000979 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000980
Serhiy Storchaka24c738a2017-03-19 20:20:10 +0200981 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +0000982 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300983 import _testcapi
984 s_good_values = [0, 1, 2, 0xffff]
985 l_good_values = s_good_values + [0xffffffff]
986 l_bad_values = [-1, -2, 1<<32, 1<<1000]
987 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
988 _testcapi.INT_MAX + 1]
989 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
990 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000991 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000992 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300993 for k in l_good_values:
994 socket.ntohl(k)
995 socket.htonl(k)
996 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000997 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000998 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300999 for k in l_bad_values:
1000 self.assertRaises(OverflowError, socket.ntohl, k)
1001 self.assertRaises(OverflowError, socket.htonl, k)
1002 for k in s_deprecated_values:
1003 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1004 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001005
Barry Warsaw11b91a02004-06-28 00:50:43 +00001006 def testGetServBy(self):
1007 eq = self.assertEqual
1008 # Find one service that exists, then check all the related interfaces.
1009 # I've ordered this by protocols that have both a tcp and udp
1010 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001011 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001012 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001013 # avoid the 'echo' service on this platform, as there is an
1014 # assumption breaking non-standard port/protocol entry
1015 services = ('daytime', 'qotd', 'domain')
1016 else:
1017 services = ('echo', 'daytime', 'domain')
1018 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001019 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001020 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001021 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001022 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001023 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001024 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001025 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001026 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001027 # Issue #26936: Android getservbyname() was broken before API 23.
1028 if (not hasattr(sys, 'getandroidapilevel') or
1029 sys.getandroidapilevel() >= 23):
1030 port2 = socket.getservbyname(service)
1031 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001032 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001033 try:
1034 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001035 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001036 udpport = None
1037 else:
1038 eq(udpport, port)
1039 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001040 # Issue #26936: Android getservbyport() is broken.
1041 if not support.is_android:
1042 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001043 eq(socket.getservbyport(port, 'tcp'), service)
1044 if udpport is not None:
1045 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001046 # Make sure getservbyport does not accept out of range ports.
1047 self.assertRaises(OverflowError, socket.getservbyport, -1)
1048 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001049
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001050 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001051 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001052 # The default timeout should initially be None
1053 self.assertEqual(socket.getdefaulttimeout(), None)
1054 s = socket.socket()
1055 self.assertEqual(s.gettimeout(), None)
1056 s.close()
1057
1058 # Set the default timeout to 10, and see if it propagates
1059 socket.setdefaulttimeout(10)
1060 self.assertEqual(socket.getdefaulttimeout(), 10)
1061 s = socket.socket()
1062 self.assertEqual(s.gettimeout(), 10)
1063 s.close()
1064
1065 # Reset the default timeout to None, and see if it propagates
1066 socket.setdefaulttimeout(None)
1067 self.assertEqual(socket.getdefaulttimeout(), None)
1068 s = socket.socket()
1069 self.assertEqual(s.gettimeout(), None)
1070 s.close()
1071
1072 # Check that setting it to an invalid value raises ValueError
1073 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1074
1075 # Check that setting it to an invalid type raises TypeError
1076 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1077
Serhiy Storchaka43767632013-11-03 21:31:38 +02001078 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1079 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001080 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001081 # Test that issue1008086 and issue767150 are fixed.
1082 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001083 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1084 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001085
Serhiy Storchaka43767632013-11-03 21:31:38 +02001086 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1087 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001088 def testIPv4toString(self):
1089 from socket import inet_aton as f, inet_pton, AF_INET
1090 g = lambda a: inet_pton(AF_INET, a)
1091
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001092 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001093 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001094 )
1095
Ezio Melottib3aedd42010-11-20 19:04:17 +00001096 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1097 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1098 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1099 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1100 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001101 # bpo-29972: inet_pton() doesn't fail on AIX
1102 if not sys.platform.startswith('aix'):
1103 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001104 assertInvalid(f, '300.0.0.0')
1105 assertInvalid(f, 'a.0.0.0')
1106 assertInvalid(f, '1.2.3.4.5')
1107 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001108
Ezio Melottib3aedd42010-11-20 19:04:17 +00001109 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1110 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1111 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1112 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001113 assertInvalid(g, '0.0.0.')
1114 assertInvalid(g, '300.0.0.0')
1115 assertInvalid(g, 'a.0.0.0')
1116 assertInvalid(g, '1.2.3.4.5')
1117 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001118
Serhiy Storchaka43767632013-11-03 21:31:38 +02001119 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1120 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001121 def testIPv6toString(self):
1122 try:
1123 from socket import inet_pton, AF_INET6, has_ipv6
1124 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001125 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001126 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001127 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001128
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001129 if sys.platform == "win32":
1130 try:
1131 inet_pton(AF_INET6, '::')
1132 except OSError as e:
1133 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001134 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001135
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001136 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001137 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001138 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001139 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001140
Ezio Melottib3aedd42010-11-20 19:04:17 +00001141 self.assertEqual(b'\x00' * 16, f('::'))
1142 self.assertEqual(b'\x00' * 16, f('0::0'))
1143 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1144 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001145 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001146 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1147 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001148 self.assertEqual(
1149 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1150 f('ad42:abc::127:0:254:2')
1151 )
1152 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1153 assertInvalid('0x20::')
1154 assertInvalid(':::')
1155 assertInvalid('::0::')
1156 assertInvalid('1::abc::')
1157 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001158 assertInvalid('1:2:3:4:5:6')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001159 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001160 # bpo-29972: inet_pton() doesn't fail on AIX
1161 if not sys.platform.startswith('aix'):
1162 assertInvalid('1:2:3:4:5:6:')
1163 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001164
1165 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1166 f('::254.42.23.64')
1167 )
1168 self.assertEqual(
1169 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1170 f('42::a29b:254.42.23.64')
1171 )
1172 self.assertEqual(
1173 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1174 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1175 )
1176 assertInvalid('255.254.253.252')
1177 assertInvalid('1::260.2.3.0')
1178 assertInvalid('1::0.be.e.0')
1179 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1180 assertInvalid('::1.2.3.4:0')
1181 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001182
Serhiy Storchaka43767632013-11-03 21:31:38 +02001183 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1184 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001185 def testStringToIPv4(self):
1186 from socket import inet_ntoa as f, inet_ntop, AF_INET
1187 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001188 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001189 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001190 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001191
Ezio Melottib3aedd42010-11-20 19:04:17 +00001192 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1193 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1194 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1195 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001196 assertInvalid(f, b'\x00' * 3)
1197 assertInvalid(f, b'\x00' * 5)
1198 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001199 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001200
Ezio Melottib3aedd42010-11-20 19:04:17 +00001201 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1202 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1203 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001204 assertInvalid(g, b'\x00' * 3)
1205 assertInvalid(g, b'\x00' * 5)
1206 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001207 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001208
Serhiy Storchaka43767632013-11-03 21:31:38 +02001209 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1210 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001211 def testStringToIPv6(self):
1212 try:
1213 from socket import inet_ntop, AF_INET6, has_ipv6
1214 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001215 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001216 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001217 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001218
1219 if sys.platform == "win32":
1220 try:
1221 inet_ntop(AF_INET6, b'\x00' * 16)
1222 except OSError as e:
1223 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001224 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001225
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001226 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001227 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001228 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001229 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001230
Ezio Melottib3aedd42010-11-20 19:04:17 +00001231 self.assertEqual('::', f(b'\x00' * 16))
1232 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1233 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001234 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001235 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001236 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001237 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001238
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001239 assertInvalid(b'\x12' * 15)
1240 assertInvalid(b'\x12' * 17)
1241 assertInvalid(b'\x12' * 4)
1242
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001243 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001244
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001245 def testSockName(self):
1246 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001247 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001248 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001249 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001250 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001251 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001252 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1253 # it reasonable to get the host's addr in addition to 0.0.0.0.
1254 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001255 try:
1256 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001257 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001258 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001259 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001260 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001261 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001262
1263 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001264 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001265 # We know a socket should start without reuse==0
1266 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001267 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001268 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001269 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001270
1271 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001272 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001273 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001274 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001275 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1276 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001277 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001278
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001279 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001280 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001281 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1282 sock.settimeout(1)
1283 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001284 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001285
Martin Panter50ab1a32016-04-11 00:38:12 +00001286 def testCloseException(self):
1287 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001288 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001289 socket.socket(fileno=sock.fileno()).close()
1290 try:
1291 sock.close()
1292 except OSError as err:
1293 # Winsock apparently raises ENOTSOCK
1294 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1295 else:
1296 self.fail("close() should raise EBADF/ENOTSOCK")
1297
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001298 def testNewAttributes(self):
1299 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001300
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001301 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1302 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001303 if hasattr(socket, 'SOCK_CLOEXEC'):
1304 self.assertIn(sock.type,
1305 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1306 socket.SOCK_STREAM))
1307 else:
1308 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001309 self.assertEqual(sock.proto, 0)
1310 sock.close()
1311
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001312 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001313 sock = socket.socket()
1314 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001315 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001316 big_port = port + 65536
1317 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001318 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1319 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1320 # Since find_unused_port() is inherently subject to race conditions, we
1321 # call it a couple times if necessary.
1322 for i in itertools.count():
1323 port = support.find_unused_port()
1324 try:
1325 sock.bind((HOST, port))
1326 except OSError as e:
1327 if e.errno != errno.EADDRINUSE or i == 5:
1328 raise
1329 else:
1330 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001331
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001332 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001333 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001334 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1335 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1336 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1337 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001338 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1339 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001340 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001341 self.assertRaises(ValueError, s.ioctl, -1, None)
1342 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001343
Steve Dowerea93ac02016-06-17 12:52:18 -07001344 @unittest.skipUnless(os.name == "nt", "Windows specific")
1345 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1346 'Loopback fast path support required for this test')
1347 def test_sio_loopback_fast_path(self):
1348 s = socket.socket()
1349 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001350 try:
1351 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1352 except OSError as exc:
1353 WSAEOPNOTSUPP = 10045
1354 if exc.winerror == WSAEOPNOTSUPP:
1355 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1356 "doesn't implemented in this Windows version")
1357 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001358 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1359
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001360 def testGetaddrinfo(self):
1361 try:
1362 socket.getaddrinfo('localhost', 80)
1363 except socket.gaierror as err:
1364 if err.errno == socket.EAI_SERVICE:
1365 # see http://bugs.python.org/issue1282647
1366 self.skipTest("buggy libc version")
1367 raise
1368 # len of every sequence is supposed to be == 5
1369 for info in socket.getaddrinfo(HOST, None):
1370 self.assertEqual(len(info), 5)
1371 # host can be a domain name, a string representation of an
1372 # IPv4/v6 address or None
1373 socket.getaddrinfo('localhost', 80)
1374 socket.getaddrinfo('127.0.0.1', 80)
1375 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001376 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001377 socket.getaddrinfo('::1', 80)
1378 # port can be a string service name such as "http", a numeric
1379 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001380 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1381 if (not hasattr(sys, 'getandroidapilevel') or
1382 sys.getandroidapilevel() >= 23):
1383 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001384 socket.getaddrinfo(HOST, 80)
1385 socket.getaddrinfo(HOST, None)
1386 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001387 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1388 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001389 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001390 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1391 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001392 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001393 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1394 for _, socktype, _, _, _ in infos:
1395 self.assertEqual(socktype, socket.SOCK_STREAM)
1396 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001397 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001398 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1399 # a server willing to support both IPv4 and IPv6 will
1400 # usually do this
1401 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1402 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001403 # test keyword arguments
1404 a = socket.getaddrinfo(HOST, None)
1405 b = socket.getaddrinfo(host=HOST, port=None)
1406 self.assertEqual(a, b)
1407 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1408 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1409 self.assertEqual(a, b)
1410 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1411 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1412 self.assertEqual(a, b)
1413 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1414 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1415 self.assertEqual(a, b)
1416 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1417 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1418 self.assertEqual(a, b)
1419 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1420 socket.AI_PASSIVE)
1421 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1422 type=socket.SOCK_STREAM, proto=0,
1423 flags=socket.AI_PASSIVE)
1424 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001425 # Issue #6697.
1426 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001427
Ned Deilyb24f4812014-02-13 22:50:42 -08001428 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001429 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001430 try:
1431 # The arguments here are undefined and the call may succeed
1432 # or fail. All we care here is that it doesn't segfault.
1433 socket.getaddrinfo("localhost", None, 0, 0, 0,
1434 socket.AI_NUMERICSERV)
1435 except socket.gaierror:
1436 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001437
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001438 def test_getnameinfo(self):
1439 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001440 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001441
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001442 @unittest.skipUnless(support.is_resource_enabled('network'),
1443 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001444 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001445 # Check for internet access before running test
1446 # (issue #12804, issue #25138).
1447 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001448 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001449
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001450 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001451 domain = 'испытание.pythontest.net'
1452 socket.gethostbyname(domain)
1453 socket.gethostbyname_ex(domain)
1454 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001455 # this may not work if the forward lookup chooses the IPv6 address, as that doesn't
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001456 # have a reverse entry yet
1457 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001458
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001459 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001460 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001461 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1462 self.skipTest("signal.alarm and socket.socketpair required for this test")
1463 # Our signal handlers clobber the C errno by calling a math function
1464 # with an invalid domain value.
1465 def ok_handler(*args):
1466 self.assertRaises(ValueError, math.acosh, 0)
1467 def raising_handler(*args):
1468 self.assertRaises(ValueError, math.acosh, 0)
1469 1 // 0
1470 c, s = socket.socketpair()
1471 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1472 try:
1473 if with_timeout:
1474 # Just above the one second minimum for signal.alarm
1475 c.settimeout(1.5)
1476 with self.assertRaises(ZeroDivisionError):
1477 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001478 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001479 if with_timeout:
1480 signal.signal(signal.SIGALRM, ok_handler)
1481 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001482 self.assertRaises(socket.timeout, c.sendall,
1483 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001484 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001485 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001486 signal.signal(signal.SIGALRM, old_alarm)
1487 c.close()
1488 s.close()
1489
1490 def test_sendall_interrupted(self):
1491 self.check_sendall_interrupted(False)
1492
1493 def test_sendall_interrupted_with_timeout(self):
1494 self.check_sendall_interrupted(True)
1495
Antoine Pitroue033e062010-10-29 10:38:18 +00001496 def test_dealloc_warn(self):
1497 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1498 r = repr(sock)
1499 with self.assertWarns(ResourceWarning) as cm:
1500 sock = None
1501 support.gc_collect()
1502 self.assertIn(r, str(cm.warning.args[0]))
1503 # An open socket file object gets dereferenced after the socket
1504 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1505 f = sock.makefile('rb')
1506 r = repr(sock)
1507 sock = None
1508 support.gc_collect()
1509 with self.assertWarns(ResourceWarning):
1510 f = None
1511 support.gc_collect()
1512
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001513 def test_name_closed_socketio(self):
1514 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1515 fp = sock.makefile("rb")
1516 fp.close()
1517 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1518
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001519 def test_unusable_closed_socketio(self):
1520 with socket.socket() as sock:
1521 fp = sock.makefile("rb", buffering=0)
1522 self.assertTrue(fp.readable())
1523 self.assertFalse(fp.writable())
1524 self.assertFalse(fp.seekable())
1525 fp.close()
1526 self.assertRaises(ValueError, fp.readable)
1527 self.assertRaises(ValueError, fp.writable)
1528 self.assertRaises(ValueError, fp.seekable)
1529
Christian Heimesd0e31b92018-01-27 09:54:13 +01001530 def test_socket_close(self):
1531 sock = socket.socket()
1532 try:
1533 sock.bind((HOST, 0))
1534 socket.close(sock.fileno())
1535 with self.assertRaises(OSError):
1536 sock.listen(1)
1537 finally:
1538 with self.assertRaises(OSError):
1539 # sock.close() fails with EBADF
1540 sock.close()
1541 with self.assertRaises(TypeError):
1542 socket.close(None)
1543 with self.assertRaises(OSError):
1544 socket.close(-1)
1545
Berker Peksag3fe64d02016-02-18 17:34:00 +02001546 def test_makefile_mode(self):
1547 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1548 with self.subTest(mode=mode):
1549 with socket.socket() as sock:
1550 with sock.makefile(mode) as fp:
1551 self.assertEqual(fp.mode, mode)
1552
1553 def test_makefile_invalid_mode(self):
1554 for mode in 'rt', 'x', '+', 'a':
1555 with self.subTest(mode=mode):
1556 with socket.socket() as sock:
1557 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1558 sock.makefile(mode)
1559
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001560 def test_pickle(self):
1561 sock = socket.socket()
1562 with sock:
1563 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1564 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001565 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1566 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1567 self.assertEqual(family, socket.AF_INET)
1568 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1569 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001570
Serhiy Storchaka78980432013-01-15 01:12:17 +02001571 def test_listen_backlog(self):
1572 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001573 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1574 srv.bind((HOST, 0))
1575 srv.listen(backlog)
1576
1577 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001578 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001579 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001580
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001581 @support.cpython_only
1582 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001583 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001584 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001585 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1586 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001587 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001588 srv.close()
1589
Charles-François Natali42663332012-01-02 15:57:30 +01001590 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001591 def test_flowinfo(self):
1592 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001593 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001594 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001595 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001596
Miss Islington (bot)04425992018-02-12 12:12:24 -08001597 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1598 def test_getaddrinfo_ipv6_basic(self):
1599 ((*_, sockaddr),) = socket.getaddrinfo(
1600 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1601 1234, socket.AF_INET6,
1602 socket.SOCK_DGRAM,
1603 socket.IPPROTO_UDP
1604 )
1605 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1606
1607 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1608 @unittest.skipUnless(
1609 hasattr(socket, 'if_nameindex'),
1610 'if_nameindex is not supported')
1611 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1612 # Just pick up any network interface (Linux, Mac OS X)
1613 (ifindex, test_interface) = socket.if_nameindex()[0]
1614 ((*_, sockaddr),) = socket.getaddrinfo(
1615 'ff02::1de:c0:face:8D%' + test_interface,
1616 1234, socket.AF_INET6,
1617 socket.SOCK_DGRAM,
1618 socket.IPPROTO_UDP
1619 )
1620 # Note missing interface name part in IPv6 address
1621 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1622
1623 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1624 @unittest.skipUnless(
1625 sys.platform == 'win32',
1626 'Numeric scope id does not work or undocumented')
1627 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1628 # Also works on Linux and Mac OS X, but is not documented (?)
1629 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1630 ifindex = 42
1631 ((*_, sockaddr),) = socket.getaddrinfo(
1632 'ff02::1de:c0:face:8D%' + str(ifindex),
1633 1234, socket.AF_INET6,
1634 socket.SOCK_DGRAM,
1635 socket.IPPROTO_UDP
1636 )
1637 # Note missing interface name part in IPv6 address
1638 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1639
1640 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1641 @unittest.skipUnless(
1642 hasattr(socket, 'if_nameindex'),
1643 'if_nameindex is not supported')
1644 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1645 # Just pick up any network interface.
1646 (ifindex, test_interface) = socket.if_nameindex()[0]
1647 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1648 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1649 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1650
1651 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1652 @unittest.skipUnless(
1653 sys.platform == 'win32',
1654 'Numeric scope id does not work or undocumented')
1655 def test_getnameinfo_ipv6_scopeid_numeric(self):
1656 # Also works on Linux (undocumented), but does not work on Mac OS X
1657 # Windows and Linux allow nonexistent interface numbers here.
1658 ifindex = 42
1659 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1660 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1661 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1662
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001663 def test_str_for_enums(self):
1664 # Make sure that the AF_* and SOCK_* constants have enum-like string
1665 # reprs.
1666 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1667 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001668 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001669
Yury Selivanov98181422017-12-18 20:02:54 -05001670 def test_socket_consistent_sock_type(self):
1671 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1672 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1673 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1674
1675 with socket.socket(socket.AF_INET, sock_type) as s:
1676 self.assertEqual(s.type, socket.SOCK_STREAM)
1677 s.settimeout(1)
1678 self.assertEqual(s.type, socket.SOCK_STREAM)
1679 s.settimeout(0)
1680 self.assertEqual(s.type, socket.SOCK_STREAM)
1681 s.setblocking(True)
1682 self.assertEqual(s.type, socket.SOCK_STREAM)
1683 s.setblocking(False)
1684 self.assertEqual(s.type, socket.SOCK_STREAM)
1685
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001686 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001687 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001688 # Test that when created with a family that's not one of the known
1689 # AF_*/SOCK_* constants, socket.family just returns the number.
1690 #
1691 # To do this we fool socket.socket into believing it already has an
1692 # open fd because on this path it doesn't actually verify the family and
1693 # type and populates the socket object.
1694 #
1695 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001696 fd, path = tempfile.mkstemp()
1697 self.addCleanup(os.unlink, path)
Yury Selivanov98181422017-12-18 20:02:54 -05001698 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1699
1700 unknown_type = max(
1701 kind
1702 for name, kind in socket.SocketKind.__members__.items()
1703 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1704 ) + 1
1705
1706 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001707 family=unknown_family, type=unknown_type, proto=23,
1708 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001709 self.assertEqual(s.family, unknown_family)
1710 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001711 # some OS like macOS ignore proto
1712 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001713
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001714 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1715 def test__sendfile_use_sendfile(self):
1716 class File:
1717 def __init__(self, fd):
1718 self.fd = fd
1719
1720 def fileno(self):
1721 return self.fd
1722 with socket.socket() as sock:
1723 fd = os.open(os.curdir, os.O_RDONLY)
1724 os.close(fd)
1725 with self.assertRaises(socket._GiveupOnSendfile):
1726 sock._sendfile_use_sendfile(File(fd))
1727 with self.assertRaises(OverflowError):
1728 sock._sendfile_use_sendfile(File(2**1000))
1729 with self.assertRaises(TypeError):
1730 sock._sendfile_use_sendfile(File(None))
1731
Christian Heimesb6e43af2018-01-29 22:37:58 +01001732 def _test_socket_fileno(self, s, family, stype):
1733 self.assertEqual(s.family, family)
1734 self.assertEqual(s.type, stype)
1735
1736 fd = s.fileno()
1737 s2 = socket.socket(fileno=fd)
1738 self.addCleanup(s2.close)
1739 # detach old fd to avoid double close
1740 s.detach()
1741 self.assertEqual(s2.family, family)
1742 self.assertEqual(s2.type, stype)
1743 self.assertEqual(s2.fileno(), fd)
1744
1745 def test_socket_fileno(self):
1746 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1747 self.addCleanup(s.close)
1748 s.bind((support.HOST, 0))
1749 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1750
1751 if hasattr(socket, "SOCK_DGRAM"):
1752 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1753 self.addCleanup(s.close)
1754 s.bind((support.HOST, 0))
1755 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1756
1757 if support.IPV6_ENABLED:
1758 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1759 self.addCleanup(s.close)
1760 s.bind((support.HOSTv6, 0, 0, 0))
1761 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1762
1763 if hasattr(socket, "AF_UNIX"):
1764 tmpdir = tempfile.mkdtemp()
1765 self.addCleanup(shutil.rmtree, tmpdir)
1766 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1767 self.addCleanup(s.close)
1768 s.bind(os.path.join(tmpdir, 'socket'))
1769 self._test_socket_fileno(s, socket.AF_UNIX, socket.SOCK_STREAM)
1770
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001771
Charles-François Natali47413c12011-10-06 19:47:44 +02001772@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1773class BasicCANTest(unittest.TestCase):
1774
1775 def testCrucialConstants(self):
1776 socket.AF_CAN
1777 socket.PF_CAN
1778 socket.CAN_RAW
1779
Charles-François Natali773e42d2013-02-05 19:42:01 +01001780 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1781 'socket.CAN_BCM required for this test.')
1782 def testBCMConstants(self):
1783 socket.CAN_BCM
1784
1785 # opcodes
1786 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1787 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1788 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1789 socket.CAN_BCM_TX_SEND # send one CAN frame
1790 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1791 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1792 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1793 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1794 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1795 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1796 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1797 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1798
Charles-François Natali47413c12011-10-06 19:47:44 +02001799 def testCreateSocket(self):
1800 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1801 pass
1802
Charles-François Natali773e42d2013-02-05 19:42:01 +01001803 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1804 'socket.CAN_BCM required for this test.')
1805 def testCreateBCMSocket(self):
1806 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1807 pass
1808
Charles-François Natali47413c12011-10-06 19:47:44 +02001809 def testBindAny(self):
1810 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1811 s.bind(('', ))
1812
1813 def testTooLongInterfaceName(self):
1814 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1815 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001816 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001817 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001818
1819 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1820 'socket.CAN_RAW_LOOPBACK required for this test.')
1821 def testLoopback(self):
1822 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1823 for loopback in (0, 1):
1824 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1825 loopback)
1826 self.assertEqual(loopback,
1827 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1828
1829 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1830 'socket.CAN_RAW_FILTER required for this test.')
1831 def testFilter(self):
1832 can_id, can_mask = 0x200, 0x700
1833 can_filter = struct.pack("=II", can_id, can_mask)
1834 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1835 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1836 self.assertEqual(can_filter,
1837 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001838 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001839
1840
1841@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001842class CANTest(ThreadedCANSocketTest):
1843
Charles-François Natali47413c12011-10-06 19:47:44 +02001844 def __init__(self, methodName='runTest'):
1845 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1846
1847 @classmethod
1848 def build_can_frame(cls, can_id, data):
1849 """Build a CAN frame."""
1850 can_dlc = len(data)
1851 data = data.ljust(8, b'\x00')
1852 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1853
1854 @classmethod
1855 def dissect_can_frame(cls, frame):
1856 """Dissect a CAN frame."""
1857 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1858 return (can_id, can_dlc, data[:can_dlc])
1859
1860 def testSendFrame(self):
1861 cf, addr = self.s.recvfrom(self.bufsize)
1862 self.assertEqual(self.cf, cf)
1863 self.assertEqual(addr[0], self.interface)
1864 self.assertEqual(addr[1], socket.AF_CAN)
1865
1866 def _testSendFrame(self):
1867 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1868 self.cli.send(self.cf)
1869
1870 def testSendMaxFrame(self):
1871 cf, addr = self.s.recvfrom(self.bufsize)
1872 self.assertEqual(self.cf, cf)
1873
1874 def _testSendMaxFrame(self):
1875 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1876 self.cli.send(self.cf)
1877
1878 def testSendMultiFrames(self):
1879 cf, addr = self.s.recvfrom(self.bufsize)
1880 self.assertEqual(self.cf1, cf)
1881
1882 cf, addr = self.s.recvfrom(self.bufsize)
1883 self.assertEqual(self.cf2, cf)
1884
1885 def _testSendMultiFrames(self):
1886 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1887 self.cli.send(self.cf1)
1888
1889 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1890 self.cli.send(self.cf2)
1891
Charles-François Natali773e42d2013-02-05 19:42:01 +01001892 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1893 'socket.CAN_BCM required for this test.')
1894 def _testBCM(self):
1895 cf, addr = self.cli.recvfrom(self.bufsize)
1896 self.assertEqual(self.cf, cf)
1897 can_id, can_dlc, data = self.dissect_can_frame(cf)
1898 self.assertEqual(self.can_id, can_id)
1899 self.assertEqual(self.data, data)
1900
1901 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1902 'socket.CAN_BCM required for this test.')
1903 def testBCM(self):
1904 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1905 self.addCleanup(bcm.close)
1906 bcm.connect((self.interface,))
1907 self.can_id = 0x123
1908 self.data = bytes([0xc0, 0xff, 0xee])
1909 self.cf = self.build_can_frame(self.can_id, self.data)
1910 opcode = socket.CAN_BCM_TX_SEND
1911 flags = 0
1912 count = 0
1913 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1914 bcm_can_id = 0x0222
1915 nframes = 1
1916 assert len(self.cf) == 16
1917 header = struct.pack(self.bcm_cmd_msg_fmt,
1918 opcode,
1919 flags,
1920 count,
1921 ival1_seconds,
1922 ival1_usec,
1923 ival2_seconds,
1924 ival2_usec,
1925 bcm_can_id,
1926 nframes,
1927 )
1928 header_plus_frame = header + self.cf
1929 bytes_sent = bcm.send(header_plus_frame)
1930 self.assertEqual(bytes_sent, len(header_plus_frame))
1931
Charles-François Natali47413c12011-10-06 19:47:44 +02001932
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001933@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
1934class ISOTPTest(unittest.TestCase):
1935
1936 def __init__(self, *args, **kwargs):
1937 super().__init__(*args, **kwargs)
1938 self.interface = "vcan0"
1939
1940 def testCrucialConstants(self):
1941 socket.AF_CAN
1942 socket.PF_CAN
1943 socket.CAN_ISOTP
1944 socket.SOCK_DGRAM
1945
1946 def testCreateSocket(self):
1947 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1948 pass
1949
1950 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
1951 'socket.CAN_ISOTP required for this test.')
1952 def testCreateISOTPSocket(self):
1953 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1954 pass
1955
1956 def testTooLongInterfaceName(self):
1957 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1958 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1959 with self.assertRaisesRegex(OSError, 'interface name too long'):
1960 s.bind(('x' * 1024, 1, 2))
1961
1962 def testBind(self):
1963 try:
1964 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1965 addr = self.interface, 0x123, 0x456
1966 s.bind(addr)
1967 self.assertEqual(s.getsockname(), addr)
1968 except OSError as e:
1969 if e.errno == errno.ENODEV:
1970 self.skipTest('network interface `%s` does not exist' %
1971 self.interface)
1972 else:
1973 raise
1974
1975
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001976@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1977class BasicRDSTest(unittest.TestCase):
1978
1979 def testCrucialConstants(self):
1980 socket.AF_RDS
1981 socket.PF_RDS
1982
1983 def testCreateSocket(self):
1984 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1985 pass
1986
1987 def testSocketBufferSize(self):
1988 bufsize = 16384
1989 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1990 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1991 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1992
1993
1994@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001995class RDSTest(ThreadedRDSSocketTest):
1996
1997 def __init__(self, methodName='runTest'):
1998 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1999
Charles-François Natali240c55f2011-11-10 20:33:36 +01002000 def setUp(self):
2001 super().setUp()
2002 self.evt = threading.Event()
2003
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002004 def testSendAndRecv(self):
2005 data, addr = self.serv.recvfrom(self.bufsize)
2006 self.assertEqual(self.data, data)
2007 self.assertEqual(self.cli_addr, addr)
2008
2009 def _testSendAndRecv(self):
2010 self.data = b'spam'
2011 self.cli.sendto(self.data, 0, (HOST, self.port))
2012
2013 def testPeek(self):
2014 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2015 self.assertEqual(self.data, data)
2016 data, addr = self.serv.recvfrom(self.bufsize)
2017 self.assertEqual(self.data, data)
2018
2019 def _testPeek(self):
2020 self.data = b'spam'
2021 self.cli.sendto(self.data, 0, (HOST, self.port))
2022
2023 @requireAttrs(socket.socket, 'recvmsg')
2024 def testSendAndRecvMsg(self):
2025 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2026 self.assertEqual(self.data, data)
2027
2028 @requireAttrs(socket.socket, 'sendmsg')
2029 def _testSendAndRecvMsg(self):
2030 self.data = b'hello ' * 10
2031 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2032
2033 def testSendAndRecvMulti(self):
2034 data, addr = self.serv.recvfrom(self.bufsize)
2035 self.assertEqual(self.data1, data)
2036
2037 data, addr = self.serv.recvfrom(self.bufsize)
2038 self.assertEqual(self.data2, data)
2039
2040 def _testSendAndRecvMulti(self):
2041 self.data1 = b'bacon'
2042 self.cli.sendto(self.data1, 0, (HOST, self.port))
2043
2044 self.data2 = b'egg'
2045 self.cli.sendto(self.data2, 0, (HOST, self.port))
2046
2047 def testSelect(self):
2048 r, w, x = select.select([self.serv], [], [], 3.0)
2049 self.assertIn(self.serv, r)
2050 data, addr = self.serv.recvfrom(self.bufsize)
2051 self.assertEqual(self.data, data)
2052
2053 def _testSelect(self):
2054 self.data = b'select'
2055 self.cli.sendto(self.data, 0, (HOST, self.port))
2056
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002057
caaveryeffc12f2017-09-06 18:18:10 -04002058@unittest.skipIf(fcntl is None, "need fcntl")
2059@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2060 'VSOCK sockets required for this test.')
2061class BasicVSOCKTest(unittest.TestCase):
2062
2063 def testCrucialConstants(self):
2064 socket.AF_VSOCK
2065
2066 def testVSOCKConstants(self):
2067 socket.SO_VM_SOCKETS_BUFFER_SIZE
2068 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2069 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2070 socket.VMADDR_CID_ANY
2071 socket.VMADDR_PORT_ANY
2072 socket.VMADDR_CID_HOST
2073 socket.VM_SOCKETS_INVALID_VERSION
2074 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2075
2076 def testCreateSocket(self):
2077 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2078 pass
2079
2080 def testSocketBufferSize(self):
2081 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2082 orig_max = s.getsockopt(socket.AF_VSOCK,
2083 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2084 orig = s.getsockopt(socket.AF_VSOCK,
2085 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2086 orig_min = s.getsockopt(socket.AF_VSOCK,
2087 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2088
2089 s.setsockopt(socket.AF_VSOCK,
2090 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2091 s.setsockopt(socket.AF_VSOCK,
2092 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2093 s.setsockopt(socket.AF_VSOCK,
2094 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2095
2096 self.assertEqual(orig_max * 2,
2097 s.getsockopt(socket.AF_VSOCK,
2098 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2099 self.assertEqual(orig * 2,
2100 s.getsockopt(socket.AF_VSOCK,
2101 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2102 self.assertEqual(orig_min * 2,
2103 s.getsockopt(socket.AF_VSOCK,
2104 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2105
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002106
Guido van Rossum24e4af82002-06-12 19:18:08 +00002107class BasicTCPTest(SocketConnectedTest):
2108
2109 def __init__(self, methodName='runTest'):
2110 SocketConnectedTest.__init__(self, methodName=methodName)
2111
2112 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002113 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002114 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002115 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002116
2117 def _testRecv(self):
2118 self.serv_conn.send(MSG)
2119
2120 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002121 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002122 seg1 = self.cli_conn.recv(len(MSG) - 3)
2123 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002124 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002125 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002126
2127 def _testOverFlowRecv(self):
2128 self.serv_conn.send(MSG)
2129
2130 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002131 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002132 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002133 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002134
2135 def _testRecvFrom(self):
2136 self.serv_conn.send(MSG)
2137
2138 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002139 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002140 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2141 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002142 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002143 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002144
2145 def _testOverFlowRecvFrom(self):
2146 self.serv_conn.send(MSG)
2147
2148 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002149 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002150 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002151 while 1:
2152 read = self.cli_conn.recv(1024)
2153 if not read:
2154 break
Guido van Rossume531e292002-08-08 20:28:34 +00002155 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002156 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002157
2158 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002159 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002160 self.serv_conn.sendall(big_chunk)
2161
2162 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002163 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002164 fd = self.cli_conn.fileno()
2165 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002166 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002167 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002168 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002169 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002170
2171 def _testFromFd(self):
2172 self.serv_conn.send(MSG)
2173
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002174 def testDup(self):
2175 # Testing dup()
2176 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002177 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002178 msg = sock.recv(1024)
2179 self.assertEqual(msg, MSG)
2180
2181 def _testDup(self):
2182 self.serv_conn.send(MSG)
2183
Guido van Rossum24e4af82002-06-12 19:18:08 +00002184 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002185 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002186 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002187 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002188 # wait for _testShutdown to finish: on OS X, when the server
2189 # closes the connection the client also becomes disconnected,
2190 # and the client's shutdown call will fail. (Issue #4397.)
2191 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002192
2193 def _testShutdown(self):
2194 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002195 self.serv_conn.shutdown(2)
2196
2197 testShutdown_overflow = support.cpython_only(testShutdown)
2198
2199 @support.cpython_only
2200 def _testShutdown_overflow(self):
2201 import _testcapi
2202 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002203 # Issue 15989
2204 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2205 _testcapi.INT_MAX + 1)
2206 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2207 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002208 self.serv_conn.shutdown(2)
2209
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002210 def testDetach(self):
2211 # Testing detach()
2212 fileno = self.cli_conn.fileno()
2213 f = self.cli_conn.detach()
2214 self.assertEqual(f, fileno)
2215 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002216 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002217 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002218 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002219 # ...but we can create another socket using the (still open)
2220 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002221 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002222 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002223 msg = sock.recv(1024)
2224 self.assertEqual(msg, MSG)
2225
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002226 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002227 self.serv_conn.send(MSG)
2228
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002229
Guido van Rossum24e4af82002-06-12 19:18:08 +00002230class BasicUDPTest(ThreadedUDPSocketTest):
2231
2232 def __init__(self, methodName='runTest'):
2233 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2234
2235 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002236 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002237 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002238 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002239
2240 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002241 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002242
Guido van Rossum1c938012002-06-12 21:17:20 +00002243 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002244 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002245 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002246 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002247
Guido van Rossum1c938012002-06-12 21:17:20 +00002248 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002249 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002250
Guido van Rossumd8faa362007-04-27 19:54:29 +00002251 def testRecvFromNegative(self):
2252 # Negative lengths passed to recvfrom should give ValueError.
2253 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2254
2255 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002256 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002257
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002258# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2259# same test code is used with different families and types of socket
2260# (e.g. stream, datagram), and tests using recvmsg() are repeated
2261# using recvmsg_into().
2262#
2263# The generic test classes such as SendmsgTests and
2264# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2265# supplied with sockets cli_sock and serv_sock representing the
2266# client's and the server's end of the connection respectively, and
2267# attributes cli_addr and serv_addr holding their (numeric where
2268# appropriate) addresses.
2269#
2270# The final concrete test classes combine these with subclasses of
2271# SocketTestBase which set up client and server sockets of a specific
2272# type, and with subclasses of SendrecvmsgBase such as
2273# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2274# sockets to cli_sock and serv_sock and override the methods and
2275# attributes of SendrecvmsgBase to fill in destination addresses if
2276# needed when sending, check for specific flags in msg_flags, etc.
2277#
2278# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2279# recvmsg_into().
2280
2281# XXX: like the other datagram (UDP) tests in this module, the code
2282# here assumes that datagram delivery on the local machine will be
2283# reliable.
2284
2285class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2286 # Base class for sendmsg()/recvmsg() tests.
2287
2288 # Time in seconds to wait before considering a test failed, or
2289 # None for no timeout. Not all tests actually set a timeout.
2290 fail_timeout = 3.0
2291
2292 def setUp(self):
2293 self.misc_event = threading.Event()
2294 super().setUp()
2295
2296 def sendToServer(self, msg):
2297 # Send msg to the server.
2298 return self.cli_sock.send(msg)
2299
2300 # Tuple of alternative default arguments for sendmsg() when called
2301 # via sendmsgToServer() (e.g. to include a destination address).
2302 sendmsg_to_server_defaults = ()
2303
2304 def sendmsgToServer(self, *args):
2305 # Call sendmsg() on self.cli_sock with the given arguments,
2306 # filling in any arguments which are not supplied with the
2307 # corresponding items of self.sendmsg_to_server_defaults, if
2308 # any.
2309 return self.cli_sock.sendmsg(
2310 *(args + self.sendmsg_to_server_defaults[len(args):]))
2311
2312 def doRecvmsg(self, sock, bufsize, *args):
2313 # Call recvmsg() on sock with given arguments and return its
2314 # result. Should be used for tests which can use either
2315 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2316 # this method with one which emulates it using recvmsg_into(),
2317 # thus allowing the same test to be used for both methods.
2318 result = sock.recvmsg(bufsize, *args)
2319 self.registerRecvmsgResult(result)
2320 return result
2321
2322 def registerRecvmsgResult(self, result):
2323 # Called by doRecvmsg() with the return value of recvmsg() or
2324 # recvmsg_into(). Can be overridden to arrange cleanup based
2325 # on the returned ancillary data, for instance.
2326 pass
2327
2328 def checkRecvmsgAddress(self, addr1, addr2):
2329 # Called to compare the received address with the address of
2330 # the peer.
2331 self.assertEqual(addr1, addr2)
2332
2333 # Flags that are normally unset in msg_flags
2334 msg_flags_common_unset = 0
2335 for name in ("MSG_CTRUNC", "MSG_OOB"):
2336 msg_flags_common_unset |= getattr(socket, name, 0)
2337
2338 # Flags that are normally set
2339 msg_flags_common_set = 0
2340
2341 # Flags set when a complete record has been received (e.g. MSG_EOR
2342 # for SCTP)
2343 msg_flags_eor_indicator = 0
2344
2345 # Flags set when a complete record has not been received
2346 # (e.g. MSG_TRUNC for datagram sockets)
2347 msg_flags_non_eor_indicator = 0
2348
2349 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2350 # Method to check the value of msg_flags returned by recvmsg[_into]().
2351 #
2352 # Checks that all bits in msg_flags_common_set attribute are
2353 # set in "flags" and all bits in msg_flags_common_unset are
2354 # unset.
2355 #
2356 # The "eor" argument specifies whether the flags should
2357 # indicate that a full record (or datagram) has been received.
2358 # If "eor" is None, no checks are done; otherwise, checks
2359 # that:
2360 #
2361 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2362 # set and all bits in msg_flags_non_eor_indicator are unset
2363 #
2364 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2365 # are set and all bits in msg_flags_eor_indicator are unset
2366 #
2367 # If "checkset" and/or "checkunset" are supplied, they require
2368 # the given bits to be set or unset respectively, overriding
2369 # what the attributes require for those bits.
2370 #
2371 # If any bits are set in "ignore", they will not be checked,
2372 # regardless of the other inputs.
2373 #
2374 # Will raise Exception if the inputs require a bit to be both
2375 # set and unset, and it is not ignored.
2376
2377 defaultset = self.msg_flags_common_set
2378 defaultunset = self.msg_flags_common_unset
2379
2380 if eor:
2381 defaultset |= self.msg_flags_eor_indicator
2382 defaultunset |= self.msg_flags_non_eor_indicator
2383 elif eor is not None:
2384 defaultset |= self.msg_flags_non_eor_indicator
2385 defaultunset |= self.msg_flags_eor_indicator
2386
2387 # Function arguments override defaults
2388 defaultset &= ~checkunset
2389 defaultunset &= ~checkset
2390
2391 # Merge arguments with remaining defaults, and check for conflicts
2392 checkset |= defaultset
2393 checkunset |= defaultunset
2394 inboth = checkset & checkunset & ~ignore
2395 if inboth:
2396 raise Exception("contradictory set, unset requirements for flags "
2397 "{0:#x}".format(inboth))
2398
2399 # Compare with given msg_flags value
2400 mask = (checkset | checkunset) & ~ignore
2401 self.assertEqual(flags & mask, checkset & mask)
2402
2403
2404class RecvmsgIntoMixin(SendrecvmsgBase):
2405 # Mixin to implement doRecvmsg() using recvmsg_into().
2406
2407 def doRecvmsg(self, sock, bufsize, *args):
2408 buf = bytearray(bufsize)
2409 result = sock.recvmsg_into([buf], *args)
2410 self.registerRecvmsgResult(result)
2411 self.assertGreaterEqual(result[0], 0)
2412 self.assertLessEqual(result[0], bufsize)
2413 return (bytes(buf[:result[0]]),) + result[1:]
2414
2415
2416class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2417 # Defines flags to be checked in msg_flags for datagram sockets.
2418
2419 @property
2420 def msg_flags_non_eor_indicator(self):
2421 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2422
2423
2424class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2425 # Defines flags to be checked in msg_flags for SCTP sockets.
2426
2427 @property
2428 def msg_flags_eor_indicator(self):
2429 return super().msg_flags_eor_indicator | socket.MSG_EOR
2430
2431
2432class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2433 # Base class for tests on connectionless-mode sockets. Users must
2434 # supply sockets on attributes cli and serv to be mapped to
2435 # cli_sock and serv_sock respectively.
2436
2437 @property
2438 def serv_sock(self):
2439 return self.serv
2440
2441 @property
2442 def cli_sock(self):
2443 return self.cli
2444
2445 @property
2446 def sendmsg_to_server_defaults(self):
2447 return ([], [], 0, self.serv_addr)
2448
2449 def sendToServer(self, msg):
2450 return self.cli_sock.sendto(msg, self.serv_addr)
2451
2452
2453class SendrecvmsgConnectedBase(SendrecvmsgBase):
2454 # Base class for tests on connected sockets. Users must supply
2455 # sockets on attributes serv_conn and cli_conn (representing the
2456 # connections *to* the server and the client), to be mapped to
2457 # cli_sock and serv_sock respectively.
2458
2459 @property
2460 def serv_sock(self):
2461 return self.cli_conn
2462
2463 @property
2464 def cli_sock(self):
2465 return self.serv_conn
2466
2467 def checkRecvmsgAddress(self, addr1, addr2):
2468 # Address is currently "unspecified" for a connected socket,
2469 # so we don't examine it
2470 pass
2471
2472
2473class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2474 # Base class to set a timeout on server's socket.
2475
2476 def setUp(self):
2477 super().setUp()
2478 self.serv_sock.settimeout(self.fail_timeout)
2479
2480
2481class SendmsgTests(SendrecvmsgServerTimeoutBase):
2482 # Tests for sendmsg() which can use any socket type and do not
2483 # involve recvmsg() or recvmsg_into().
2484
2485 def testSendmsg(self):
2486 # Send a simple message with sendmsg().
2487 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2488
2489 def _testSendmsg(self):
2490 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2491
2492 def testSendmsgDataGenerator(self):
2493 # Send from buffer obtained from a generator (not a sequence).
2494 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2495
2496 def _testSendmsgDataGenerator(self):
2497 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2498 len(MSG))
2499
2500 def testSendmsgAncillaryGenerator(self):
2501 # Gather (empty) ancillary data from a generator.
2502 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2503
2504 def _testSendmsgAncillaryGenerator(self):
2505 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2506 len(MSG))
2507
2508 def testSendmsgArray(self):
2509 # Send data from an array instead of the usual bytes object.
2510 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2511
2512 def _testSendmsgArray(self):
2513 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2514 len(MSG))
2515
2516 def testSendmsgGather(self):
2517 # Send message data from more than one buffer (gather write).
2518 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2519
2520 def _testSendmsgGather(self):
2521 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2522
2523 def testSendmsgBadArgs(self):
2524 # Check that sendmsg() rejects invalid arguments.
2525 self.assertEqual(self.serv_sock.recv(1000), b"done")
2526
2527 def _testSendmsgBadArgs(self):
2528 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2529 self.assertRaises(TypeError, self.sendmsgToServer,
2530 b"not in an iterable")
2531 self.assertRaises(TypeError, self.sendmsgToServer,
2532 object())
2533 self.assertRaises(TypeError, self.sendmsgToServer,
2534 [object()])
2535 self.assertRaises(TypeError, self.sendmsgToServer,
2536 [MSG, object()])
2537 self.assertRaises(TypeError, self.sendmsgToServer,
2538 [MSG], object())
2539 self.assertRaises(TypeError, self.sendmsgToServer,
2540 [MSG], [], object())
2541 self.assertRaises(TypeError, self.sendmsgToServer,
2542 [MSG], [], 0, object())
2543 self.sendToServer(b"done")
2544
2545 def testSendmsgBadCmsg(self):
2546 # Check that invalid ancillary data items are rejected.
2547 self.assertEqual(self.serv_sock.recv(1000), b"done")
2548
2549 def _testSendmsgBadCmsg(self):
2550 self.assertRaises(TypeError, self.sendmsgToServer,
2551 [MSG], [object()])
2552 self.assertRaises(TypeError, self.sendmsgToServer,
2553 [MSG], [(object(), 0, b"data")])
2554 self.assertRaises(TypeError, self.sendmsgToServer,
2555 [MSG], [(0, object(), b"data")])
2556 self.assertRaises(TypeError, self.sendmsgToServer,
2557 [MSG], [(0, 0, object())])
2558 self.assertRaises(TypeError, self.sendmsgToServer,
2559 [MSG], [(0, 0)])
2560 self.assertRaises(TypeError, self.sendmsgToServer,
2561 [MSG], [(0, 0, b"data", 42)])
2562 self.sendToServer(b"done")
2563
2564 @requireAttrs(socket, "CMSG_SPACE")
2565 def testSendmsgBadMultiCmsg(self):
2566 # Check that invalid ancillary data items are rejected when
2567 # more than one item is present.
2568 self.assertEqual(self.serv_sock.recv(1000), b"done")
2569
2570 @testSendmsgBadMultiCmsg.client_skip
2571 def _testSendmsgBadMultiCmsg(self):
2572 self.assertRaises(TypeError, self.sendmsgToServer,
2573 [MSG], [0, 0, b""])
2574 self.assertRaises(TypeError, self.sendmsgToServer,
2575 [MSG], [(0, 0, b""), object()])
2576 self.sendToServer(b"done")
2577
2578 def testSendmsgExcessCmsgReject(self):
2579 # Check that sendmsg() rejects excess ancillary data items
2580 # when the number that can be sent is limited.
2581 self.assertEqual(self.serv_sock.recv(1000), b"done")
2582
2583 def _testSendmsgExcessCmsgReject(self):
2584 if not hasattr(socket, "CMSG_SPACE"):
2585 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002586 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002587 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2588 self.assertIsNone(cm.exception.errno)
2589 self.sendToServer(b"done")
2590
2591 def testSendmsgAfterClose(self):
2592 # Check that sendmsg() fails on a closed socket.
2593 pass
2594
2595 def _testSendmsgAfterClose(self):
2596 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002597 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002598
2599
2600class SendmsgStreamTests(SendmsgTests):
2601 # Tests for sendmsg() which require a stream socket and do not
2602 # involve recvmsg() or recvmsg_into().
2603
2604 def testSendmsgExplicitNoneAddr(self):
2605 # Check that peer address can be specified as None.
2606 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2607
2608 def _testSendmsgExplicitNoneAddr(self):
2609 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2610
2611 def testSendmsgTimeout(self):
2612 # Check that timeout works with sendmsg().
2613 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2614 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2615
2616 def _testSendmsgTimeout(self):
2617 try:
2618 self.cli_sock.settimeout(0.03)
Miss Islington (bot)ef1173a2018-09-25 08:49:28 -07002619 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002620 while True:
2621 self.sendmsgToServer([b"a"*512])
Miss Islington (bot)ef1173a2018-09-25 08:49:28 -07002622 except socket.timeout:
2623 pass
2624 except OSError as exc:
2625 if exc.errno != errno.ENOMEM:
2626 raise
2627 # bpo-33937 the test randomly fails on Travis CI with
2628 # "OSError: [Errno 12] Cannot allocate memory"
2629 else:
2630 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002631 finally:
2632 self.misc_event.set()
2633
2634 # XXX: would be nice to have more tests for sendmsg flags argument.
2635
2636 # Linux supports MSG_DONTWAIT when sending, but in general, it
2637 # only works when receiving. Could add other platforms if they
2638 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002639 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002640 "MSG_DONTWAIT not known to work on this platform when "
2641 "sending")
2642 def testSendmsgDontWait(self):
2643 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2644 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2645 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2646
2647 @testSendmsgDontWait.client_skip
2648 def _testSendmsgDontWait(self):
2649 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002650 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002651 while True:
2652 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Miss Islington (bot)ef1173a2018-09-25 08:49:28 -07002653 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2654 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002655 self.assertIn(cm.exception.errno,
Miss Islington (bot)ef1173a2018-09-25 08:49:28 -07002656 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002657 finally:
2658 self.misc_event.set()
2659
2660
2661class SendmsgConnectionlessTests(SendmsgTests):
2662 # Tests for sendmsg() which require a connectionless-mode
2663 # (e.g. datagram) socket, and do not involve recvmsg() or
2664 # recvmsg_into().
2665
2666 def testSendmsgNoDestAddr(self):
2667 # Check that sendmsg() fails when no destination address is
2668 # given for unconnected socket.
2669 pass
2670
2671 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002672 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002673 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002674 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002675 [MSG], [], 0, None)
2676
2677
2678class RecvmsgGenericTests(SendrecvmsgBase):
2679 # Tests for recvmsg() which can also be emulated using
2680 # recvmsg_into(), and can use any socket type.
2681
2682 def testRecvmsg(self):
2683 # Receive a simple message with recvmsg[_into]().
2684 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2685 self.assertEqual(msg, MSG)
2686 self.checkRecvmsgAddress(addr, self.cli_addr)
2687 self.assertEqual(ancdata, [])
2688 self.checkFlags(flags, eor=True)
2689
2690 def _testRecvmsg(self):
2691 self.sendToServer(MSG)
2692
2693 def testRecvmsgExplicitDefaults(self):
2694 # Test recvmsg[_into]() with default arguments provided explicitly.
2695 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2696 len(MSG), 0, 0)
2697 self.assertEqual(msg, MSG)
2698 self.checkRecvmsgAddress(addr, self.cli_addr)
2699 self.assertEqual(ancdata, [])
2700 self.checkFlags(flags, eor=True)
2701
2702 def _testRecvmsgExplicitDefaults(self):
2703 self.sendToServer(MSG)
2704
2705 def testRecvmsgShorter(self):
2706 # Receive a message smaller than buffer.
2707 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2708 len(MSG) + 42)
2709 self.assertEqual(msg, MSG)
2710 self.checkRecvmsgAddress(addr, self.cli_addr)
2711 self.assertEqual(ancdata, [])
2712 self.checkFlags(flags, eor=True)
2713
2714 def _testRecvmsgShorter(self):
2715 self.sendToServer(MSG)
2716
2717 def testRecvmsgTrunc(self):
2718 # Receive part of message, check for truncation indicators.
2719 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2720 len(MSG) - 3)
2721 self.assertEqual(msg, MSG[:-3])
2722 self.checkRecvmsgAddress(addr, self.cli_addr)
2723 self.assertEqual(ancdata, [])
2724 self.checkFlags(flags, eor=False)
2725
2726 def _testRecvmsgTrunc(self):
2727 self.sendToServer(MSG)
2728
2729 def testRecvmsgShortAncillaryBuf(self):
2730 # Test ancillary data buffer too small to hold any ancillary data.
2731 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2732 len(MSG), 1)
2733 self.assertEqual(msg, MSG)
2734 self.checkRecvmsgAddress(addr, self.cli_addr)
2735 self.assertEqual(ancdata, [])
2736 self.checkFlags(flags, eor=True)
2737
2738 def _testRecvmsgShortAncillaryBuf(self):
2739 self.sendToServer(MSG)
2740
2741 def testRecvmsgLongAncillaryBuf(self):
2742 # Test large ancillary data buffer.
2743 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2744 len(MSG), 10240)
2745 self.assertEqual(msg, MSG)
2746 self.checkRecvmsgAddress(addr, self.cli_addr)
2747 self.assertEqual(ancdata, [])
2748 self.checkFlags(flags, eor=True)
2749
2750 def _testRecvmsgLongAncillaryBuf(self):
2751 self.sendToServer(MSG)
2752
2753 def testRecvmsgAfterClose(self):
2754 # Check that recvmsg[_into]() fails on a closed socket.
2755 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002756 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002757
2758 def _testRecvmsgAfterClose(self):
2759 pass
2760
2761 def testRecvmsgTimeout(self):
2762 # Check that timeout works.
2763 try:
2764 self.serv_sock.settimeout(0.03)
2765 self.assertRaises(socket.timeout,
2766 self.doRecvmsg, self.serv_sock, len(MSG))
2767 finally:
2768 self.misc_event.set()
2769
2770 def _testRecvmsgTimeout(self):
2771 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2772
2773 @requireAttrs(socket, "MSG_PEEK")
2774 def testRecvmsgPeek(self):
2775 # Check that MSG_PEEK in flags enables examination of pending
2776 # data without consuming it.
2777
2778 # Receive part of data with MSG_PEEK.
2779 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2780 len(MSG) - 3, 0,
2781 socket.MSG_PEEK)
2782 self.assertEqual(msg, MSG[:-3])
2783 self.checkRecvmsgAddress(addr, self.cli_addr)
2784 self.assertEqual(ancdata, [])
2785 # Ignoring MSG_TRUNC here (so this test is the same for stream
2786 # and datagram sockets). Some wording in POSIX seems to
2787 # suggest that it needn't be set when peeking, but that may
2788 # just be a slip.
2789 self.checkFlags(flags, eor=False,
2790 ignore=getattr(socket, "MSG_TRUNC", 0))
2791
2792 # Receive all data with MSG_PEEK.
2793 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2794 len(MSG), 0,
2795 socket.MSG_PEEK)
2796 self.assertEqual(msg, MSG)
2797 self.checkRecvmsgAddress(addr, self.cli_addr)
2798 self.assertEqual(ancdata, [])
2799 self.checkFlags(flags, eor=True)
2800
2801 # Check that the same data can still be received normally.
2802 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2803 self.assertEqual(msg, MSG)
2804 self.checkRecvmsgAddress(addr, self.cli_addr)
2805 self.assertEqual(ancdata, [])
2806 self.checkFlags(flags, eor=True)
2807
2808 @testRecvmsgPeek.client_skip
2809 def _testRecvmsgPeek(self):
2810 self.sendToServer(MSG)
2811
2812 @requireAttrs(socket.socket, "sendmsg")
2813 def testRecvmsgFromSendmsg(self):
2814 # Test receiving with recvmsg[_into]() when message is sent
2815 # using sendmsg().
2816 self.serv_sock.settimeout(self.fail_timeout)
2817 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2818 self.assertEqual(msg, MSG)
2819 self.checkRecvmsgAddress(addr, self.cli_addr)
2820 self.assertEqual(ancdata, [])
2821 self.checkFlags(flags, eor=True)
2822
2823 @testRecvmsgFromSendmsg.client_skip
2824 def _testRecvmsgFromSendmsg(self):
2825 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2826
2827
2828class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2829 # Tests which require a stream socket and can use either recvmsg()
2830 # or recvmsg_into().
2831
2832 def testRecvmsgEOF(self):
2833 # Receive end-of-stream indicator (b"", peer socket closed).
2834 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2835 self.assertEqual(msg, b"")
2836 self.checkRecvmsgAddress(addr, self.cli_addr)
2837 self.assertEqual(ancdata, [])
2838 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2839
2840 def _testRecvmsgEOF(self):
2841 self.cli_sock.close()
2842
2843 def testRecvmsgOverflow(self):
2844 # Receive a message in more than one chunk.
2845 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2846 len(MSG) - 3)
2847 self.checkRecvmsgAddress(addr, self.cli_addr)
2848 self.assertEqual(ancdata, [])
2849 self.checkFlags(flags, eor=False)
2850
2851 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2852 self.checkRecvmsgAddress(addr, self.cli_addr)
2853 self.assertEqual(ancdata, [])
2854 self.checkFlags(flags, eor=True)
2855
2856 msg = seg1 + seg2
2857 self.assertEqual(msg, MSG)
2858
2859 def _testRecvmsgOverflow(self):
2860 self.sendToServer(MSG)
2861
2862
2863class RecvmsgTests(RecvmsgGenericTests):
2864 # Tests for recvmsg() which can use any socket type.
2865
2866 def testRecvmsgBadArgs(self):
2867 # Check that recvmsg() rejects invalid arguments.
2868 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2869 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2870 -1, 0, 0)
2871 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2872 len(MSG), -1, 0)
2873 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2874 [bytearray(10)], 0, 0)
2875 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2876 object(), 0, 0)
2877 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2878 len(MSG), object(), 0)
2879 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2880 len(MSG), 0, object())
2881
2882 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2883 self.assertEqual(msg, MSG)
2884 self.checkRecvmsgAddress(addr, self.cli_addr)
2885 self.assertEqual(ancdata, [])
2886 self.checkFlags(flags, eor=True)
2887
2888 def _testRecvmsgBadArgs(self):
2889 self.sendToServer(MSG)
2890
2891
2892class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2893 # Tests for recvmsg_into() which can use any socket type.
2894
2895 def testRecvmsgIntoBadArgs(self):
2896 # Check that recvmsg_into() rejects invalid arguments.
2897 buf = bytearray(len(MSG))
2898 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2899 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2900 len(MSG), 0, 0)
2901 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2902 buf, 0, 0)
2903 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2904 [object()], 0, 0)
2905 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2906 [b"I'm not writable"], 0, 0)
2907 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2908 [buf, object()], 0, 0)
2909 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2910 [buf], -1, 0)
2911 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2912 [buf], object(), 0)
2913 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2914 [buf], 0, object())
2915
2916 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2917 self.assertEqual(nbytes, len(MSG))
2918 self.assertEqual(buf, bytearray(MSG))
2919 self.checkRecvmsgAddress(addr, self.cli_addr)
2920 self.assertEqual(ancdata, [])
2921 self.checkFlags(flags, eor=True)
2922
2923 def _testRecvmsgIntoBadArgs(self):
2924 self.sendToServer(MSG)
2925
2926 def testRecvmsgIntoGenerator(self):
2927 # Receive into buffer obtained from a generator (not a sequence).
2928 buf = bytearray(len(MSG))
2929 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2930 (o for o in [buf]))
2931 self.assertEqual(nbytes, len(MSG))
2932 self.assertEqual(buf, bytearray(MSG))
2933 self.checkRecvmsgAddress(addr, self.cli_addr)
2934 self.assertEqual(ancdata, [])
2935 self.checkFlags(flags, eor=True)
2936
2937 def _testRecvmsgIntoGenerator(self):
2938 self.sendToServer(MSG)
2939
2940 def testRecvmsgIntoArray(self):
2941 # Receive into an array rather than the usual bytearray.
2942 buf = array.array("B", [0] * len(MSG))
2943 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2944 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002945 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002946 self.checkRecvmsgAddress(addr, self.cli_addr)
2947 self.assertEqual(ancdata, [])
2948 self.checkFlags(flags, eor=True)
2949
2950 def _testRecvmsgIntoArray(self):
2951 self.sendToServer(MSG)
2952
2953 def testRecvmsgIntoScatter(self):
2954 # Receive into multiple buffers (scatter write).
2955 b1 = bytearray(b"----")
2956 b2 = bytearray(b"0123456789")
2957 b3 = bytearray(b"--------------")
2958 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2959 [b1, memoryview(b2)[2:9], b3])
2960 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2961 self.assertEqual(b1, bytearray(b"Mary"))
2962 self.assertEqual(b2, bytearray(b"01 had a 9"))
2963 self.assertEqual(b3, bytearray(b"little lamb---"))
2964 self.checkRecvmsgAddress(addr, self.cli_addr)
2965 self.assertEqual(ancdata, [])
2966 self.checkFlags(flags, eor=True)
2967
2968 def _testRecvmsgIntoScatter(self):
2969 self.sendToServer(b"Mary had a little lamb")
2970
2971
2972class CmsgMacroTests(unittest.TestCase):
2973 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2974 # assumptions used by sendmsg() and recvmsg[_into](), which share
2975 # code with these functions.
2976
2977 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002978 try:
2979 import _testcapi
2980 except ImportError:
2981 socklen_t_limit = 0x7fffffff
2982 else:
2983 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002984
2985 @requireAttrs(socket, "CMSG_LEN")
2986 def testCMSG_LEN(self):
2987 # Test CMSG_LEN() with various valid and invalid values,
2988 # checking the assumptions used by recvmsg() and sendmsg().
2989 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2990 values = list(range(257)) + list(range(toobig - 257, toobig))
2991
2992 # struct cmsghdr has at least three members, two of which are ints
2993 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2994 for n in values:
2995 ret = socket.CMSG_LEN(n)
2996 # This is how recvmsg() calculates the data size
2997 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2998 self.assertLessEqual(ret, self.socklen_t_limit)
2999
3000 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3001 # sendmsg() shares code with these functions, and requires
3002 # that it reject values over the limit.
3003 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3004 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3005
3006 @requireAttrs(socket, "CMSG_SPACE")
3007 def testCMSG_SPACE(self):
3008 # Test CMSG_SPACE() with various valid and invalid values,
3009 # checking the assumptions used by sendmsg().
3010 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3011 values = list(range(257)) + list(range(toobig - 257, toobig))
3012
3013 last = socket.CMSG_SPACE(0)
3014 # struct cmsghdr has at least three members, two of which are ints
3015 self.assertGreater(last, array.array("i").itemsize * 2)
3016 for n in values:
3017 ret = socket.CMSG_SPACE(n)
3018 self.assertGreaterEqual(ret, last)
3019 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3020 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3021 self.assertLessEqual(ret, self.socklen_t_limit)
3022 last = ret
3023
3024 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3025 # sendmsg() shares code with these functions, and requires
3026 # that it reject values over the limit.
3027 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3028 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3029
3030
3031class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3032 # Tests for file descriptor passing on Unix-domain sockets.
3033
3034 # Invalid file descriptor value that's unlikely to evaluate to a
3035 # real FD even if one of its bytes is replaced with a different
3036 # value (which shouldn't actually happen).
3037 badfd = -0x5555
3038
3039 def newFDs(self, n):
3040 # Return a list of n file descriptors for newly-created files
3041 # containing their list indices as ASCII numbers.
3042 fds = []
3043 for i in range(n):
3044 fd, path = tempfile.mkstemp()
3045 self.addCleanup(os.unlink, path)
3046 self.addCleanup(os.close, fd)
3047 os.write(fd, str(i).encode())
3048 fds.append(fd)
3049 return fds
3050
3051 def checkFDs(self, fds):
3052 # Check that the file descriptors in the given list contain
3053 # their correct list indices as ASCII numbers.
3054 for n, fd in enumerate(fds):
3055 os.lseek(fd, 0, os.SEEK_SET)
3056 self.assertEqual(os.read(fd, 1024), str(n).encode())
3057
3058 def registerRecvmsgResult(self, result):
3059 self.addCleanup(self.closeRecvmsgFDs, result)
3060
3061 def closeRecvmsgFDs(self, recvmsg_result):
3062 # Close all file descriptors specified in the ancillary data
3063 # of the given return value from recvmsg() or recvmsg_into().
3064 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3065 if (cmsg_level == socket.SOL_SOCKET and
3066 cmsg_type == socket.SCM_RIGHTS):
3067 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003068 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003069 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3070 for fd in fds:
3071 os.close(fd)
3072
3073 def createAndSendFDs(self, n):
3074 # Send n new file descriptors created by newFDs() to the
3075 # server, with the constant MSG as the non-ancillary data.
3076 self.assertEqual(
3077 self.sendmsgToServer([MSG],
3078 [(socket.SOL_SOCKET,
3079 socket.SCM_RIGHTS,
3080 array.array("i", self.newFDs(n)))]),
3081 len(MSG))
3082
3083 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3084 # Check that constant MSG was received with numfds file
3085 # descriptors in a maximum of maxcmsgs control messages (which
3086 # must contain only complete integers). By default, check
3087 # that MSG_CTRUNC is unset, but ignore any flags in
3088 # ignoreflags.
3089 msg, ancdata, flags, addr = result
3090 self.assertEqual(msg, MSG)
3091 self.checkRecvmsgAddress(addr, self.cli_addr)
3092 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3093 ignore=ignoreflags)
3094
3095 self.assertIsInstance(ancdata, list)
3096 self.assertLessEqual(len(ancdata), maxcmsgs)
3097 fds = array.array("i")
3098 for item in ancdata:
3099 self.assertIsInstance(item, tuple)
3100 cmsg_level, cmsg_type, cmsg_data = item
3101 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3102 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3103 self.assertIsInstance(cmsg_data, bytes)
3104 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003105 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003106
3107 self.assertEqual(len(fds), numfds)
3108 self.checkFDs(fds)
3109
3110 def testFDPassSimple(self):
3111 # Pass a single FD (array read from bytes object).
3112 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3113 len(MSG), 10240))
3114
3115 def _testFDPassSimple(self):
3116 self.assertEqual(
3117 self.sendmsgToServer(
3118 [MSG],
3119 [(socket.SOL_SOCKET,
3120 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003121 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003122 len(MSG))
3123
3124 def testMultipleFDPass(self):
3125 # Pass multiple FDs in a single array.
3126 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3127 len(MSG), 10240))
3128
3129 def _testMultipleFDPass(self):
3130 self.createAndSendFDs(4)
3131
3132 @requireAttrs(socket, "CMSG_SPACE")
3133 def testFDPassCMSG_SPACE(self):
3134 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3135 self.checkRecvmsgFDs(
3136 4, self.doRecvmsg(self.serv_sock, len(MSG),
3137 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3138
3139 @testFDPassCMSG_SPACE.client_skip
3140 def _testFDPassCMSG_SPACE(self):
3141 self.createAndSendFDs(4)
3142
3143 def testFDPassCMSG_LEN(self):
3144 # Test using CMSG_LEN() to calculate ancillary buffer size.
3145 self.checkRecvmsgFDs(1,
3146 self.doRecvmsg(self.serv_sock, len(MSG),
3147 socket.CMSG_LEN(4 * SIZEOF_INT)),
3148 # RFC 3542 says implementations may set
3149 # MSG_CTRUNC if there isn't enough space
3150 # for trailing padding.
3151 ignoreflags=socket.MSG_CTRUNC)
3152
3153 def _testFDPassCMSG_LEN(self):
3154 self.createAndSendFDs(1)
3155
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003156 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003157 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003158 @requireAttrs(socket, "CMSG_SPACE")
3159 def testFDPassSeparate(self):
3160 # Pass two FDs in two separate arrays. Arrays may be combined
3161 # into a single control message by the OS.
3162 self.checkRecvmsgFDs(2,
3163 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3164 maxcmsgs=2)
3165
3166 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003167 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003168 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003169 def _testFDPassSeparate(self):
3170 fd0, fd1 = self.newFDs(2)
3171 self.assertEqual(
3172 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3173 socket.SCM_RIGHTS,
3174 array.array("i", [fd0])),
3175 (socket.SOL_SOCKET,
3176 socket.SCM_RIGHTS,
3177 array.array("i", [fd1]))]),
3178 len(MSG))
3179
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003180 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003181 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003182 @requireAttrs(socket, "CMSG_SPACE")
3183 def testFDPassSeparateMinSpace(self):
3184 # Pass two FDs in two separate arrays, receiving them into the
3185 # minimum space for two arrays.
3186 self.checkRecvmsgFDs(2,
3187 self.doRecvmsg(self.serv_sock, len(MSG),
3188 socket.CMSG_SPACE(SIZEOF_INT) +
3189 socket.CMSG_LEN(SIZEOF_INT)),
3190 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3191
3192 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003193 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003194 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003195 def _testFDPassSeparateMinSpace(self):
3196 fd0, fd1 = self.newFDs(2)
3197 self.assertEqual(
3198 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3199 socket.SCM_RIGHTS,
3200 array.array("i", [fd0])),
3201 (socket.SOL_SOCKET,
3202 socket.SCM_RIGHTS,
3203 array.array("i", [fd1]))]),
3204 len(MSG))
3205
3206 def sendAncillaryIfPossible(self, msg, ancdata):
3207 # Try to send msg and ancdata to server, but if the system
3208 # call fails, just send msg with no ancillary data.
3209 try:
3210 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003211 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003212 # Check that it was the system call that failed
3213 self.assertIsInstance(e.errno, int)
3214 nbytes = self.sendmsgToServer([msg])
3215 self.assertEqual(nbytes, len(msg))
3216
Brett Cannon3bbad122015-12-28 17:21:44 -08003217 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003218 def testFDPassEmpty(self):
3219 # Try to pass an empty FD array. Can receive either no array
3220 # or an empty array.
3221 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3222 len(MSG), 10240),
3223 ignoreflags=socket.MSG_CTRUNC)
3224
3225 def _testFDPassEmpty(self):
3226 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3227 socket.SCM_RIGHTS,
3228 b"")])
3229
3230 def testFDPassPartialInt(self):
3231 # Try to pass a truncated FD array.
3232 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3233 len(MSG), 10240)
3234 self.assertEqual(msg, MSG)
3235 self.checkRecvmsgAddress(addr, self.cli_addr)
3236 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3237 self.assertLessEqual(len(ancdata), 1)
3238 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3239 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3240 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3241 self.assertLess(len(cmsg_data), SIZEOF_INT)
3242
3243 def _testFDPassPartialInt(self):
3244 self.sendAncillaryIfPossible(
3245 MSG,
3246 [(socket.SOL_SOCKET,
3247 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003248 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003249
3250 @requireAttrs(socket, "CMSG_SPACE")
3251 def testFDPassPartialIntInMiddle(self):
3252 # Try to pass two FD arrays, the first of which is truncated.
3253 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3254 len(MSG), 10240)
3255 self.assertEqual(msg, MSG)
3256 self.checkRecvmsgAddress(addr, self.cli_addr)
3257 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3258 self.assertLessEqual(len(ancdata), 2)
3259 fds = array.array("i")
3260 # Arrays may have been combined in a single control message
3261 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3262 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3263 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003264 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003265 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3266 self.assertLessEqual(len(fds), 2)
3267 self.checkFDs(fds)
3268
3269 @testFDPassPartialIntInMiddle.client_skip
3270 def _testFDPassPartialIntInMiddle(self):
3271 fd0, fd1 = self.newFDs(2)
3272 self.sendAncillaryIfPossible(
3273 MSG,
3274 [(socket.SOL_SOCKET,
3275 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003276 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003277 (socket.SOL_SOCKET,
3278 socket.SCM_RIGHTS,
3279 array.array("i", [fd1]))])
3280
3281 def checkTruncatedHeader(self, result, ignoreflags=0):
3282 # Check that no ancillary data items are returned when data is
3283 # truncated inside the cmsghdr structure.
3284 msg, ancdata, flags, addr = result
3285 self.assertEqual(msg, MSG)
3286 self.checkRecvmsgAddress(addr, self.cli_addr)
3287 self.assertEqual(ancdata, [])
3288 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3289 ignore=ignoreflags)
3290
3291 def testCmsgTruncNoBufSize(self):
3292 # Check that no ancillary data is received when no buffer size
3293 # is specified.
3294 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3295 # BSD seems to set MSG_CTRUNC only
3296 # if an item has been partially
3297 # received.
3298 ignoreflags=socket.MSG_CTRUNC)
3299
3300 def _testCmsgTruncNoBufSize(self):
3301 self.createAndSendFDs(1)
3302
3303 def testCmsgTrunc0(self):
3304 # Check that no ancillary data is received when buffer size is 0.
3305 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3306 ignoreflags=socket.MSG_CTRUNC)
3307
3308 def _testCmsgTrunc0(self):
3309 self.createAndSendFDs(1)
3310
3311 # Check that no ancillary data is returned for various non-zero
3312 # (but still too small) buffer sizes.
3313
3314 def testCmsgTrunc1(self):
3315 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3316
3317 def _testCmsgTrunc1(self):
3318 self.createAndSendFDs(1)
3319
3320 def testCmsgTrunc2Int(self):
3321 # The cmsghdr structure has at least three members, two of
3322 # which are ints, so we still shouldn't see any ancillary
3323 # data.
3324 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3325 SIZEOF_INT * 2))
3326
3327 def _testCmsgTrunc2Int(self):
3328 self.createAndSendFDs(1)
3329
3330 def testCmsgTruncLen0Minus1(self):
3331 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3332 socket.CMSG_LEN(0) - 1))
3333
3334 def _testCmsgTruncLen0Minus1(self):
3335 self.createAndSendFDs(1)
3336
3337 # The following tests try to truncate the control message in the
3338 # middle of the FD array.
3339
3340 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3341 # Check that file descriptor data is truncated to between
3342 # mindata and maxdata bytes when received with buffer size
3343 # ancbuf, and that any complete file descriptor numbers are
3344 # valid.
3345 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3346 len(MSG), ancbuf)
3347 self.assertEqual(msg, MSG)
3348 self.checkRecvmsgAddress(addr, self.cli_addr)
3349 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3350
3351 if mindata == 0 and ancdata == []:
3352 return
3353 self.assertEqual(len(ancdata), 1)
3354 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3355 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3356 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3357 self.assertGreaterEqual(len(cmsg_data), mindata)
3358 self.assertLessEqual(len(cmsg_data), maxdata)
3359 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003360 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003361 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3362 self.checkFDs(fds)
3363
3364 def testCmsgTruncLen0(self):
3365 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3366
3367 def _testCmsgTruncLen0(self):
3368 self.createAndSendFDs(1)
3369
3370 def testCmsgTruncLen0Plus1(self):
3371 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3372
3373 def _testCmsgTruncLen0Plus1(self):
3374 self.createAndSendFDs(2)
3375
3376 def testCmsgTruncLen1(self):
3377 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3378 maxdata=SIZEOF_INT)
3379
3380 def _testCmsgTruncLen1(self):
3381 self.createAndSendFDs(2)
3382
3383 def testCmsgTruncLen2Minus1(self):
3384 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3385 maxdata=(2 * SIZEOF_INT) - 1)
3386
3387 def _testCmsgTruncLen2Minus1(self):
3388 self.createAndSendFDs(2)
3389
3390
3391class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3392 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3393 # features of the RFC 3542 Advanced Sockets API for IPv6.
3394 # Currently we can only handle certain data items (e.g. traffic
3395 # class, hop limit, MTU discovery and fragmentation settings)
3396 # without resorting to unportable means such as the struct module,
3397 # but the tests here are aimed at testing the ancillary data
3398 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3399 # itself.
3400
3401 # Test value to use when setting hop limit of packet
3402 hop_limit = 2
3403
3404 # Test value to use when setting traffic class of packet.
3405 # -1 means "use kernel default".
3406 traffic_class = -1
3407
3408 def ancillaryMapping(self, ancdata):
3409 # Given ancillary data list ancdata, return a mapping from
3410 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3411 # Check that no (level, type) pair appears more than once.
3412 d = {}
3413 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3414 self.assertNotIn((cmsg_level, cmsg_type), d)
3415 d[(cmsg_level, cmsg_type)] = cmsg_data
3416 return d
3417
3418 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3419 # Receive hop limit into ancbufsize bytes of ancillary data
3420 # space. Check that data is MSG, ancillary data is not
3421 # truncated (but ignore any flags in ignoreflags), and hop
3422 # limit is between 0 and maxhop inclusive.
3423 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3424 socket.IPV6_RECVHOPLIMIT, 1)
3425 self.misc_event.set()
3426 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3427 len(MSG), ancbufsize)
3428
3429 self.assertEqual(msg, MSG)
3430 self.checkRecvmsgAddress(addr, self.cli_addr)
3431 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3432 ignore=ignoreflags)
3433
3434 self.assertEqual(len(ancdata), 1)
3435 self.assertIsInstance(ancdata[0], tuple)
3436 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3437 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3438 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3439 self.assertIsInstance(cmsg_data, bytes)
3440 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3441 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003442 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003443 self.assertGreaterEqual(a[0], 0)
3444 self.assertLessEqual(a[0], maxhop)
3445
3446 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3447 def testRecvHopLimit(self):
3448 # Test receiving the packet hop limit as ancillary data.
3449 self.checkHopLimit(ancbufsize=10240)
3450
3451 @testRecvHopLimit.client_skip
3452 def _testRecvHopLimit(self):
3453 # Need to wait until server has asked to receive ancillary
3454 # data, as implementations are not required to buffer it
3455 # otherwise.
3456 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3457 self.sendToServer(MSG)
3458
3459 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3460 def testRecvHopLimitCMSG_SPACE(self):
3461 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3462 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3463
3464 @testRecvHopLimitCMSG_SPACE.client_skip
3465 def _testRecvHopLimitCMSG_SPACE(self):
3466 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3467 self.sendToServer(MSG)
3468
3469 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3470 # 3542 says portable applications must provide space for trailing
3471 # padding. Implementations may set MSG_CTRUNC if there isn't
3472 # enough space for the padding.
3473
3474 @requireAttrs(socket.socket, "sendmsg")
3475 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3476 def testSetHopLimit(self):
3477 # Test setting hop limit on outgoing packet and receiving it
3478 # at the other end.
3479 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3480
3481 @testSetHopLimit.client_skip
3482 def _testSetHopLimit(self):
3483 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3484 self.assertEqual(
3485 self.sendmsgToServer([MSG],
3486 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3487 array.array("i", [self.hop_limit]))]),
3488 len(MSG))
3489
3490 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3491 ignoreflags=0):
3492 # Receive traffic class and hop limit into ancbufsize bytes of
3493 # ancillary data space. Check that data is MSG, ancillary
3494 # data is not truncated (but ignore any flags in ignoreflags),
3495 # and traffic class and hop limit are in range (hop limit no
3496 # more than maxhop).
3497 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3498 socket.IPV6_RECVHOPLIMIT, 1)
3499 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3500 socket.IPV6_RECVTCLASS, 1)
3501 self.misc_event.set()
3502 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3503 len(MSG), ancbufsize)
3504
3505 self.assertEqual(msg, MSG)
3506 self.checkRecvmsgAddress(addr, self.cli_addr)
3507 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3508 ignore=ignoreflags)
3509 self.assertEqual(len(ancdata), 2)
3510 ancmap = self.ancillaryMapping(ancdata)
3511
3512 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3513 self.assertEqual(len(tcdata), SIZEOF_INT)
3514 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003515 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003516 self.assertGreaterEqual(a[0], 0)
3517 self.assertLessEqual(a[0], 255)
3518
3519 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3520 self.assertEqual(len(hldata), SIZEOF_INT)
3521 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003522 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003523 self.assertGreaterEqual(a[0], 0)
3524 self.assertLessEqual(a[0], maxhop)
3525
3526 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3527 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3528 def testRecvTrafficClassAndHopLimit(self):
3529 # Test receiving traffic class and hop limit as ancillary data.
3530 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3531
3532 @testRecvTrafficClassAndHopLimit.client_skip
3533 def _testRecvTrafficClassAndHopLimit(self):
3534 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3535 self.sendToServer(MSG)
3536
3537 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3538 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3539 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3540 # Test receiving traffic class and hop limit, using
3541 # CMSG_SPACE() to calculate buffer size.
3542 self.checkTrafficClassAndHopLimit(
3543 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3544
3545 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3546 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3547 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3548 self.sendToServer(MSG)
3549
3550 @requireAttrs(socket.socket, "sendmsg")
3551 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3552 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3553 def testSetTrafficClassAndHopLimit(self):
3554 # Test setting traffic class and hop limit on outgoing packet,
3555 # and receiving them at the other end.
3556 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3557 maxhop=self.hop_limit)
3558
3559 @testSetTrafficClassAndHopLimit.client_skip
3560 def _testSetTrafficClassAndHopLimit(self):
3561 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3562 self.assertEqual(
3563 self.sendmsgToServer([MSG],
3564 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3565 array.array("i", [self.traffic_class])),
3566 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3567 array.array("i", [self.hop_limit]))]),
3568 len(MSG))
3569
3570 @requireAttrs(socket.socket, "sendmsg")
3571 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3572 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3573 def testOddCmsgSize(self):
3574 # Try to send ancillary data with first item one byte too
3575 # long. Fall back to sending with correct size if this fails,
3576 # and check that second item was handled correctly.
3577 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3578 maxhop=self.hop_limit)
3579
3580 @testOddCmsgSize.client_skip
3581 def _testOddCmsgSize(self):
3582 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3583 try:
3584 nbytes = self.sendmsgToServer(
3585 [MSG],
3586 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003587 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003588 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3589 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003590 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003591 self.assertIsInstance(e.errno, int)
3592 nbytes = self.sendmsgToServer(
3593 [MSG],
3594 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3595 array.array("i", [self.traffic_class])),
3596 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3597 array.array("i", [self.hop_limit]))])
3598 self.assertEqual(nbytes, len(MSG))
3599
3600 # Tests for proper handling of truncated ancillary data
3601
3602 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3603 # Receive hop limit into ancbufsize bytes of ancillary data
3604 # space, which should be too small to contain the ancillary
3605 # data header (if ancbufsize is None, pass no second argument
3606 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3607 # (unless included in ignoreflags), and no ancillary data is
3608 # returned.
3609 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3610 socket.IPV6_RECVHOPLIMIT, 1)
3611 self.misc_event.set()
3612 args = () if ancbufsize is None else (ancbufsize,)
3613 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3614 len(MSG), *args)
3615
3616 self.assertEqual(msg, MSG)
3617 self.checkRecvmsgAddress(addr, self.cli_addr)
3618 self.assertEqual(ancdata, [])
3619 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3620 ignore=ignoreflags)
3621
3622 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3623 def testCmsgTruncNoBufSize(self):
3624 # Check that no ancillary data is received when no ancillary
3625 # buffer size is provided.
3626 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3627 # BSD seems to set
3628 # MSG_CTRUNC only if an item
3629 # has been partially
3630 # received.
3631 ignoreflags=socket.MSG_CTRUNC)
3632
3633 @testCmsgTruncNoBufSize.client_skip
3634 def _testCmsgTruncNoBufSize(self):
3635 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3636 self.sendToServer(MSG)
3637
3638 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3639 def testSingleCmsgTrunc0(self):
3640 # Check that no ancillary data is received when ancillary
3641 # buffer size is zero.
3642 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3643 ignoreflags=socket.MSG_CTRUNC)
3644
3645 @testSingleCmsgTrunc0.client_skip
3646 def _testSingleCmsgTrunc0(self):
3647 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3648 self.sendToServer(MSG)
3649
3650 # Check that no ancillary data is returned for various non-zero
3651 # (but still too small) buffer sizes.
3652
3653 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3654 def testSingleCmsgTrunc1(self):
3655 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3656
3657 @testSingleCmsgTrunc1.client_skip
3658 def _testSingleCmsgTrunc1(self):
3659 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3660 self.sendToServer(MSG)
3661
3662 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3663 def testSingleCmsgTrunc2Int(self):
3664 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3665
3666 @testSingleCmsgTrunc2Int.client_skip
3667 def _testSingleCmsgTrunc2Int(self):
3668 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3669 self.sendToServer(MSG)
3670
3671 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3672 def testSingleCmsgTruncLen0Minus1(self):
3673 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3674
3675 @testSingleCmsgTruncLen0Minus1.client_skip
3676 def _testSingleCmsgTruncLen0Minus1(self):
3677 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3678 self.sendToServer(MSG)
3679
3680 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3681 def testSingleCmsgTruncInData(self):
3682 # Test truncation of a control message inside its associated
3683 # data. The message may be returned with its data truncated,
3684 # or not returned at all.
3685 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3686 socket.IPV6_RECVHOPLIMIT, 1)
3687 self.misc_event.set()
3688 msg, ancdata, flags, addr = self.doRecvmsg(
3689 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3690
3691 self.assertEqual(msg, MSG)
3692 self.checkRecvmsgAddress(addr, self.cli_addr)
3693 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3694
3695 self.assertLessEqual(len(ancdata), 1)
3696 if ancdata:
3697 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3698 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3699 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3700 self.assertLess(len(cmsg_data), SIZEOF_INT)
3701
3702 @testSingleCmsgTruncInData.client_skip
3703 def _testSingleCmsgTruncInData(self):
3704 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3705 self.sendToServer(MSG)
3706
3707 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3708 # Receive traffic class and hop limit into ancbufsize bytes of
3709 # ancillary data space, which should be large enough to
3710 # contain the first item, but too small to contain the header
3711 # of the second. Check that data is MSG, MSG_CTRUNC is set
3712 # (unless included in ignoreflags), and only one ancillary
3713 # data item is returned.
3714 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3715 socket.IPV6_RECVHOPLIMIT, 1)
3716 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3717 socket.IPV6_RECVTCLASS, 1)
3718 self.misc_event.set()
3719 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3720 len(MSG), ancbufsize)
3721
3722 self.assertEqual(msg, MSG)
3723 self.checkRecvmsgAddress(addr, self.cli_addr)
3724 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3725 ignore=ignoreflags)
3726
3727 self.assertEqual(len(ancdata), 1)
3728 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3729 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3730 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3731 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3732 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003733 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003734 self.assertGreaterEqual(a[0], 0)
3735 self.assertLessEqual(a[0], 255)
3736
3737 # Try the above test with various buffer sizes.
3738
3739 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3740 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3741 def testSecondCmsgTrunc0(self):
3742 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3743 ignoreflags=socket.MSG_CTRUNC)
3744
3745 @testSecondCmsgTrunc0.client_skip
3746 def _testSecondCmsgTrunc0(self):
3747 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3748 self.sendToServer(MSG)
3749
3750 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3751 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3752 def testSecondCmsgTrunc1(self):
3753 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3754
3755 @testSecondCmsgTrunc1.client_skip
3756 def _testSecondCmsgTrunc1(self):
3757 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3758 self.sendToServer(MSG)
3759
3760 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3761 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3762 def testSecondCmsgTrunc2Int(self):
3763 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3764 2 * SIZEOF_INT)
3765
3766 @testSecondCmsgTrunc2Int.client_skip
3767 def _testSecondCmsgTrunc2Int(self):
3768 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3769 self.sendToServer(MSG)
3770
3771 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3772 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3773 def testSecondCmsgTruncLen0Minus1(self):
3774 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3775 socket.CMSG_LEN(0) - 1)
3776
3777 @testSecondCmsgTruncLen0Minus1.client_skip
3778 def _testSecondCmsgTruncLen0Minus1(self):
3779 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3780 self.sendToServer(MSG)
3781
3782 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3783 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3784 def testSecomdCmsgTruncInData(self):
3785 # Test truncation of the second of two control messages inside
3786 # its associated data.
3787 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3788 socket.IPV6_RECVHOPLIMIT, 1)
3789 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3790 socket.IPV6_RECVTCLASS, 1)
3791 self.misc_event.set()
3792 msg, ancdata, flags, addr = self.doRecvmsg(
3793 self.serv_sock, len(MSG),
3794 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3795
3796 self.assertEqual(msg, MSG)
3797 self.checkRecvmsgAddress(addr, self.cli_addr)
3798 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3799
3800 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3801
3802 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3803 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3804 cmsg_types.remove(cmsg_type)
3805 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3806 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003807 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003808 self.assertGreaterEqual(a[0], 0)
3809 self.assertLessEqual(a[0], 255)
3810
3811 if ancdata:
3812 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3813 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3814 cmsg_types.remove(cmsg_type)
3815 self.assertLess(len(cmsg_data), SIZEOF_INT)
3816
3817 self.assertEqual(ancdata, [])
3818
3819 @testSecomdCmsgTruncInData.client_skip
3820 def _testSecomdCmsgTruncInData(self):
3821 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3822 self.sendToServer(MSG)
3823
3824
3825# Derive concrete test classes for different socket types.
3826
3827class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3828 SendrecvmsgConnectionlessBase,
3829 ThreadedSocketTestMixin, UDPTestBase):
3830 pass
3831
3832@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003833class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3834 pass
3835
3836@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003837class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3838 pass
3839
3840@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003841class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3842 pass
3843
3844
3845class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3846 SendrecvmsgConnectionlessBase,
3847 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003848
3849 def checkRecvmsgAddress(self, addr1, addr2):
3850 # Called to compare the received address with the address of
3851 # the peer, ignoring scope ID
3852 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003853
3854@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003855@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003856@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003857class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3858 pass
3859
3860@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003861@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003862@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003863class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3864 pass
3865
3866@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003867@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003868@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003869class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3870 pass
3871
3872@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003873@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003874@requireAttrs(socket, "IPPROTO_IPV6")
3875@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003876class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3877 SendrecvmsgUDP6TestBase):
3878 pass
3879
3880@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003881@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003882@requireAttrs(socket, "IPPROTO_IPV6")
3883@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003884class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3885 RFC3542AncillaryTest,
3886 SendrecvmsgUDP6TestBase):
3887 pass
3888
3889
3890class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3891 ConnectedStreamTestMixin, TCPTestBase):
3892 pass
3893
3894@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003895class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3896 pass
3897
3898@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003899class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3900 SendrecvmsgTCPTestBase):
3901 pass
3902
3903@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003904class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3905 SendrecvmsgTCPTestBase):
3906 pass
3907
3908
3909class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3910 SendrecvmsgConnectedBase,
3911 ConnectedStreamTestMixin, SCTPStreamBase):
3912 pass
3913
3914@requireAttrs(socket.socket, "sendmsg")
3915@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003916class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3917 pass
3918
3919@requireAttrs(socket.socket, "recvmsg")
3920@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003921class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3922 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003923
3924 def testRecvmsgEOF(self):
3925 try:
3926 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3927 except OSError as e:
3928 if e.errno != errno.ENOTCONN:
3929 raise
3930 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003931
3932@requireAttrs(socket.socket, "recvmsg_into")
3933@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003934class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3935 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003936
3937 def testRecvmsgEOF(self):
3938 try:
3939 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3940 except OSError as e:
3941 if e.errno != errno.ENOTCONN:
3942 raise
3943 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003944
3945
3946class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3947 ConnectedStreamTestMixin, UnixStreamBase):
3948 pass
3949
3950@requireAttrs(socket.socket, "sendmsg")
3951@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003952class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3953 pass
3954
3955@requireAttrs(socket.socket, "recvmsg")
3956@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003957class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3958 SendrecvmsgUnixStreamTestBase):
3959 pass
3960
3961@requireAttrs(socket.socket, "recvmsg_into")
3962@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003963class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3964 SendrecvmsgUnixStreamTestBase):
3965 pass
3966
3967@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3968@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003969class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3970 pass
3971
3972@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3973@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003974class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3975 SendrecvmsgUnixStreamTestBase):
3976 pass
3977
3978
3979# Test interrupting the interruptible send/receive methods with a
3980# signal when a timeout is set. These tests avoid having multiple
3981# threads alive during the test so that the OS cannot deliver the
3982# signal to the wrong one.
3983
3984class InterruptedTimeoutBase(unittest.TestCase):
3985 # Base class for interrupted send/receive tests. Installs an
3986 # empty handler for SIGALRM and removes it on teardown, along with
3987 # any scheduled alarms.
3988
3989 def setUp(self):
3990 super().setUp()
3991 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003992 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003993 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003994
3995 # Timeout for socket operations
3996 timeout = 4.0
3997
3998 # Provide setAlarm() method to schedule delivery of SIGALRM after
3999 # given number of seconds, or cancel it if zero, and an
4000 # appropriate time value to use. Use setitimer() if available.
4001 if hasattr(signal, "setitimer"):
4002 alarm_time = 0.05
4003
4004 def setAlarm(self, seconds):
4005 signal.setitimer(signal.ITIMER_REAL, seconds)
4006 else:
4007 # Old systems may deliver the alarm up to one second early
4008 alarm_time = 2
4009
4010 def setAlarm(self, seconds):
4011 signal.alarm(seconds)
4012
4013
4014# Require siginterrupt() in order to ensure that system calls are
4015# interrupted by default.
4016@requireAttrs(signal, "siginterrupt")
4017@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4018 "Don't have signal.alarm or signal.setitimer")
4019class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4020 # Test interrupting the recv*() methods with signals when a
4021 # timeout is set.
4022
4023 def setUp(self):
4024 super().setUp()
4025 self.serv.settimeout(self.timeout)
4026
4027 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004028 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004029 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004030 try:
4031 self.setAlarm(self.alarm_time)
4032 with self.assertRaises(ZeroDivisionError) as cm:
4033 func(*args, **kwargs)
4034 finally:
4035 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004036
4037 def testInterruptedRecvTimeout(self):
4038 self.checkInterruptedRecv(self.serv.recv, 1024)
4039
4040 def testInterruptedRecvIntoTimeout(self):
4041 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4042
4043 def testInterruptedRecvfromTimeout(self):
4044 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4045
4046 def testInterruptedRecvfromIntoTimeout(self):
4047 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4048
4049 @requireAttrs(socket.socket, "recvmsg")
4050 def testInterruptedRecvmsgTimeout(self):
4051 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4052
4053 @requireAttrs(socket.socket, "recvmsg_into")
4054 def testInterruptedRecvmsgIntoTimeout(self):
4055 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4056
4057
4058# Require siginterrupt() in order to ensure that system calls are
4059# interrupted by default.
4060@requireAttrs(signal, "siginterrupt")
4061@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4062 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004063class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4064 ThreadSafeCleanupTestCase,
4065 SocketListeningTestMixin, TCPTestBase):
4066 # Test interrupting the interruptible send*() methods with signals
4067 # when a timeout is set.
4068
4069 def setUp(self):
4070 super().setUp()
4071 self.serv_conn = self.newSocket()
4072 self.addCleanup(self.serv_conn.close)
4073 # Use a thread to complete the connection, but wait for it to
4074 # terminate before running the test, so that there is only one
4075 # thread to accept the signal.
4076 cli_thread = threading.Thread(target=self.doConnect)
4077 cli_thread.start()
4078 self.cli_conn, addr = self.serv.accept()
4079 self.addCleanup(self.cli_conn.close)
4080 cli_thread.join()
4081 self.serv_conn.settimeout(self.timeout)
4082
4083 def doConnect(self):
4084 self.serv_conn.connect(self.serv_addr)
4085
4086 def checkInterruptedSend(self, func, *args, **kwargs):
4087 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004088 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004089 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004090 try:
4091 with self.assertRaises(ZeroDivisionError) as cm:
4092 while True:
4093 self.setAlarm(self.alarm_time)
4094 func(*args, **kwargs)
4095 finally:
4096 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004097
Ned Deilyc5640382014-02-03 13:58:31 -08004098 # Issue #12958: The following tests have problems on OS X prior to 10.7
4099 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004100 def testInterruptedSendTimeout(self):
4101 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4102
Ned Deilyc5640382014-02-03 13:58:31 -08004103 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004104 def testInterruptedSendtoTimeout(self):
4105 # Passing an actual address here as Python's wrapper for
4106 # sendto() doesn't allow passing a zero-length one; POSIX
4107 # requires that the address is ignored since the socket is
4108 # connection-mode, however.
4109 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4110 self.serv_addr)
4111
Ned Deilyc5640382014-02-03 13:58:31 -08004112 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004113 @requireAttrs(socket.socket, "sendmsg")
4114 def testInterruptedSendmsgTimeout(self):
4115 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4116
4117
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004118class TCPCloserTest(ThreadedTCPSocketTest):
4119
4120 def testClose(self):
4121 conn, addr = self.serv.accept()
4122 conn.close()
4123
4124 sd = self.cli
4125 read, write, err = select.select([sd], [], [], 1.0)
4126 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004127 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004128
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004129 # Calling close() many times should be safe.
4130 conn.close()
4131 conn.close()
4132
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004133 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004134 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004135 time.sleep(1.0)
4136
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004137
Dave Cole331708b2004-08-09 04:51:41 +00004138class BasicSocketPairTest(SocketPairTest):
4139
4140 def __init__(self, methodName='runTest'):
4141 SocketPairTest.__init__(self, methodName=methodName)
4142
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004143 def _check_defaults(self, sock):
4144 self.assertIsInstance(sock, socket.socket)
4145 if hasattr(socket, 'AF_UNIX'):
4146 self.assertEqual(sock.family, socket.AF_UNIX)
4147 else:
4148 self.assertEqual(sock.family, socket.AF_INET)
4149 self.assertEqual(sock.type, socket.SOCK_STREAM)
4150 self.assertEqual(sock.proto, 0)
4151
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004152 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004153 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004154
4155 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004156 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004157
Dave Cole331708b2004-08-09 04:51:41 +00004158 def testRecv(self):
4159 msg = self.serv.recv(1024)
4160 self.assertEqual(msg, MSG)
4161
4162 def _testRecv(self):
4163 self.cli.send(MSG)
4164
4165 def testSend(self):
4166 self.serv.send(MSG)
4167
4168 def _testSend(self):
4169 msg = self.cli.recv(1024)
4170 self.assertEqual(msg, MSG)
4171
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004172
Guido van Rossum24e4af82002-06-12 19:18:08 +00004173class NonBlockingTCPTests(ThreadedTCPSocketTest):
4174
4175 def __init__(self, methodName='runTest'):
4176 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4177
4178 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004179 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004180 self.serv.setblocking(True)
4181 self.assertIsNone(self.serv.gettimeout())
Yury Selivanovf11b4602018-01-28 17:27:38 -05004182 self.assertTrue(self.serv.getblocking())
4183 if fcntl:
4184 self.assertTrue(_is_fd_in_blocking_mode(self.serv))
4185
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004186 self.serv.setblocking(False)
4187 self.assertEqual(self.serv.gettimeout(), 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004188 self.assertFalse(self.serv.getblocking())
4189 if fcntl:
4190 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4191
4192 self.serv.settimeout(None)
4193 self.assertTrue(self.serv.getblocking())
4194 if fcntl:
4195 self.assertTrue(_is_fd_in_blocking_mode(self.serv))
4196
4197 self.serv.settimeout(0)
4198 self.assertFalse(self.serv.getblocking())
4199 self.assertEqual(self.serv.gettimeout(), 0)
4200 if fcntl:
4201 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4202
4203 self.serv.settimeout(10)
4204 self.assertTrue(self.serv.getblocking())
4205 self.assertEqual(self.serv.gettimeout(), 10)
4206 if fcntl:
4207 # When a Python socket has a non-zero timeout, it's
4208 # switched internally to a non-blocking mode.
4209 # Later, sock.sendall(), sock.recv(), and other socket
4210 # operations use a `select()` call and handle EWOULDBLOCK/EGAIN
4211 # on all socket operations. That's how timeouts are
4212 # enforced.
4213 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4214
4215 self.serv.settimeout(0)
4216 self.assertFalse(self.serv.getblocking())
4217 if fcntl:
4218 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4219
Guido van Rossum24e4af82002-06-12 19:18:08 +00004220 start = time.time()
4221 try:
4222 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004223 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004224 pass
4225 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004226 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00004227
4228 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004229 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004230
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004231 @support.cpython_only
4232 def testSetBlocking_overflow(self):
4233 # Issue 15989
4234 import _testcapi
4235 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4236 self.skipTest('needs UINT_MAX < ULONG_MAX')
4237 self.serv.setblocking(False)
4238 self.assertEqual(self.serv.gettimeout(), 0.0)
4239 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4240 self.assertIsNone(self.serv.gettimeout())
4241
4242 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4243
Serhiy Storchaka43767632013-11-03 21:31:38 +02004244 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4245 'test needs socket.SOCK_NONBLOCK')
4246 @support.requires_linux_version(2, 6, 28)
4247 def testInitNonBlocking(self):
4248 # reinit server socket
4249 self.serv.close()
4250 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
4251 socket.SOCK_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004252 self.assertFalse(self.serv.getblocking())
4253 self.assertEqual(self.serv.gettimeout(), 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004254 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01004255 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02004256 # actual testing
4257 start = time.time()
4258 try:
4259 self.serv.accept()
4260 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00004261 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02004262 end = time.time()
4263 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
4264
4265 def _testInitNonBlocking(self):
4266 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004267
Antoine Pitrou600232b2011-01-05 21:03:42 +00004268 def testInheritFlags(self):
4269 # Issue #7995: when calling accept() on a listening socket with a
4270 # timeout, the resulting socket should not be non-blocking.
4271 self.serv.settimeout(10)
4272 try:
4273 conn, addr = self.serv.accept()
4274 message = conn.recv(len(MSG))
4275 finally:
4276 conn.close()
4277 self.serv.settimeout(None)
4278
4279 def _testInheritFlags(self):
4280 time.sleep(0.1)
4281 self.cli.connect((HOST, self.port))
4282 time.sleep(0.5)
4283 self.cli.send(MSG)
4284
Guido van Rossum24e4af82002-06-12 19:18:08 +00004285 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004286 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004287 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00004288 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004289 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004290 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004291 pass
4292 else:
4293 self.fail("Error trying to do non-blocking accept.")
4294 read, write, err = select.select([self.serv], [], [])
4295 if self.serv in read:
4296 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07004297 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00004298 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004299 else:
4300 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004301
Guido van Rossum24e4af82002-06-12 19:18:08 +00004302 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004303 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00004304 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004305
4306 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004307 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00004308 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004309 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004310
4311 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00004312 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00004313 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004314
4315 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004316 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004317 conn, addr = self.serv.accept()
4318 conn.setblocking(0)
4319 try:
4320 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02004321 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004322 pass
4323 else:
4324 self.fail("Error trying to do non-blocking recv.")
4325 read, write, err = select.select([conn], [], [])
4326 if conn in read:
4327 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004328 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00004329 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004330 else:
4331 self.fail("Error during select call to non-blocking socket.")
4332
4333 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004334 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004335 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004336 self.cli.send(MSG)
4337
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004338
Guido van Rossum24e4af82002-06-12 19:18:08 +00004339class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004340 """Unit tests for the object returned by socket.makefile()
4341
Antoine Pitrou834bd812010-10-13 16:17:14 +00004342 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004343 the client connection. You can read from this file to
4344 get output from the server.
4345
Antoine Pitrou834bd812010-10-13 16:17:14 +00004346 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004347 server connection. You can write to this file to send output
4348 to the client.
4349 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004350
Guido van Rossume9f66142002-08-07 15:46:19 +00004351 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004352 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004353 errors = 'strict'
4354 newline = None
4355
4356 read_mode = 'rb'
4357 read_msg = MSG
4358 write_mode = 'wb'
4359 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004360
Guido van Rossum24e4af82002-06-12 19:18:08 +00004361 def __init__(self, methodName='runTest'):
4362 SocketConnectedTest.__init__(self, methodName=methodName)
4363
4364 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004365 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4366 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004367 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004368 self.read_file = self.cli_conn.makefile(
4369 self.read_mode, self.bufsize,
4370 encoding = self.encoding,
4371 errors = self.errors,
4372 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004373
4374 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004375 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004376 self.read_file.close()
4377 self.assertTrue(self.read_file.closed)
4378 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004379 SocketConnectedTest.tearDown(self)
4380
4381 def clientSetUp(self):
4382 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004383 self.write_file = self.serv_conn.makefile(
4384 self.write_mode, self.bufsize,
4385 encoding = self.encoding,
4386 errors = self.errors,
4387 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004388
4389 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004390 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004391 self.write_file.close()
4392 self.assertTrue(self.write_file.closed)
4393 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004394 SocketConnectedTest.clientTearDown(self)
4395
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004396 def testReadAfterTimeout(self):
4397 # Issue #7322: A file object must disallow further reads
4398 # after a timeout has occurred.
4399 self.cli_conn.settimeout(1)
4400 self.read_file.read(3)
4401 # First read raises a timeout
4402 self.assertRaises(socket.timeout, self.read_file.read, 1)
4403 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004404 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004405 self.read_file.read(1)
4406 self.assertIn("cannot read from timed out object", str(ctx.exception))
4407
4408 def _testReadAfterTimeout(self):
4409 self.write_file.write(self.write_msg[0:3])
4410 self.write_file.flush()
4411 self.serv_finished.wait()
4412
Guido van Rossum24e4af82002-06-12 19:18:08 +00004413 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004414 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004415 first_seg = self.read_file.read(len(self.read_msg)-3)
4416 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004417 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004418 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004419
4420 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004421 self.write_file.write(self.write_msg)
4422 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004423
Guido van Rossum8c943832002-08-08 01:00:28 +00004424 def testFullRead(self):
4425 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004426 msg = self.read_file.read()
4427 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004428
4429 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004430 self.write_file.write(self.write_msg)
4431 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004432
Guido van Rossum24e4af82002-06-12 19:18:08 +00004433 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004434 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004435 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004436 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004437 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004438 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004439 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004440 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004441 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004442
4443 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004444 self.write_file.write(self.write_msg)
4445 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004446
4447 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004448 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004449 line = self.read_file.readline()
4450 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004451
4452 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004453 self.write_file.write(self.write_msg)
4454 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004455
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004456 def testCloseAfterMakefile(self):
4457 # The file returned by makefile should keep the socket open.
4458 self.cli_conn.close()
4459 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004460 msg = self.read_file.read()
4461 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004462
4463 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004464 self.write_file.write(self.write_msg)
4465 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004466
4467 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004468 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004469 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004470 if isinstance(self.read_msg, str):
4471 msg = msg.decode()
4472 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004473
4474 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004475 self.write_file.write(self.write_msg)
4476 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004477
Tim Peters116d83c2004-03-28 02:20:45 +00004478 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004479 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004480
4481 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004482 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004483
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004484 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004485 self.assertEqual(self.read_file.mode, self.read_mode)
4486 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004487
4488 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004489 self.assertEqual(self.write_file.mode, self.write_mode)
4490 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004491
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004492 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004493 self.read_file.close()
4494 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004495 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004496 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004497
4498 def _testRealClose(self):
4499 pass
4500
4501
Guido van Rossume9f66142002-08-07 15:46:19 +00004502class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4503
4504 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004505
Guido van Rossume9f66142002-08-07 15:46:19 +00004506 In this case (and in this case only), it should be possible to
4507 create a file object, read a line from it, create another file
4508 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004509 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004510 when reading multiple requests from the same socket."""
4511
4512 bufsize = 0 # Use unbuffered mode
4513
4514 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004515 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004516 line = self.read_file.readline() # first line
4517 self.assertEqual(line, b"A. " + self.write_msg) # first line
4518 self.read_file = self.cli_conn.makefile('rb', 0)
4519 line = self.read_file.readline() # second line
4520 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004521
4522 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004523 self.write_file.write(b"A. " + self.write_msg)
4524 self.write_file.write(b"B. " + self.write_msg)
4525 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004526
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004527 def testMakefileClose(self):
4528 # The file returned by makefile should keep the socket open...
4529 self.cli_conn.close()
4530 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004531 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004532 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004533 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004534 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004535
4536 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004537 self.write_file.write(self.write_msg)
4538 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004539
4540 def testMakefileCloseSocketDestroy(self):
4541 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004542 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004543 refcount_after = sys.getrefcount(self.cli_conn)
4544 self.assertEqual(refcount_before - 1, refcount_after)
4545
4546 def _testMakefileCloseSocketDestroy(self):
4547 pass
4548
Antoine Pitrou98b46702010-09-18 22:59:00 +00004549 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004550 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004551 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4552
4553 def testSmallReadNonBlocking(self):
4554 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004555 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4556 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004557 self.evt1.set()
4558 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004559 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004560 if first_seg is None:
4561 # Data not arrived (can happen under Windows), wait a bit
4562 time.sleep(0.5)
4563 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004564 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004565 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004566 self.assertEqual(n, 3)
4567 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004568 self.assertEqual(msg, self.read_msg)
4569 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4570 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004571
4572 def _testSmallReadNonBlocking(self):
4573 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004574 self.write_file.write(self.write_msg)
4575 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004576 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004577 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004578 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4579 self.serv_finished.wait(5.0)
4580
4581 def testWriteNonBlocking(self):
4582 self.cli_finished.wait(5.0)
4583 # The client thread can't skip directly - the SkipTest exception
4584 # would appear as a failure.
4585 if self.serv_skipped:
4586 self.skipTest(self.serv_skipped)
4587
4588 def _testWriteNonBlocking(self):
4589 self.serv_skipped = None
4590 self.serv_conn.setblocking(False)
4591 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004592 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004593 LIMIT = 10
4594 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004595 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004596 self.assertGreater(n, 0)
4597 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004598 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004599 if n is None:
4600 # Succeeded
4601 break
4602 self.assertGreater(n, 0)
4603 else:
4604 # Let us know that this test didn't manage to establish
4605 # the expected conditions. This is not a failure in itself but,
4606 # if it happens repeatedly, the test should be fixed.
4607 self.serv_skipped = "failed to saturate the socket buffer"
4608
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004609
Guido van Rossum8c943832002-08-08 01:00:28 +00004610class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4611
4612 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4613
4614
4615class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4616
4617 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004618
Thomas Woutersb2137042007-02-01 18:02:27 +00004619
Antoine Pitrou834bd812010-10-13 16:17:14 +00004620class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4621 """Tests for socket.makefile() in text mode (rather than binary)"""
4622
4623 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004624 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004625 write_mode = 'wb'
4626 write_msg = MSG
4627 newline = ''
4628
4629
4630class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4631 """Tests for socket.makefile() in text mode (rather than binary)"""
4632
4633 read_mode = 'rb'
4634 read_msg = MSG
4635 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004636 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004637 newline = ''
4638
4639
4640class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4641 """Tests for socket.makefile() in text mode (rather than binary)"""
4642
4643 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004644 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004645 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004646 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004647 newline = ''
4648
4649
Guido van Rossumd8faa362007-04-27 19:54:29 +00004650class NetworkConnectionTest(object):
4651 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004652
Guido van Rossumd8faa362007-04-27 19:54:29 +00004653 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004654 # We're inherited below by BasicTCPTest2, which also inherits
4655 # BasicTCPTest, which defines self.port referenced below.
4656 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004657 self.serv_conn = self.cli
4658
4659class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4660 """Tests that NetworkConnection does not break existing TCP functionality.
4661 """
4662
4663class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004664
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004665 class MockSocket(socket.socket):
4666 def connect(self, *args):
4667 raise socket.timeout('timed out')
4668
4669 @contextlib.contextmanager
4670 def mocked_socket_module(self):
4671 """Return a socket which times out on connect"""
4672 old_socket = socket.socket
4673 socket.socket = self.MockSocket
4674 try:
4675 yield
4676 finally:
4677 socket.socket = old_socket
4678
4679 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004680 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004681 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004682 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004683 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004684 cli.connect((HOST, port))
4685 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4686
4687 def test_create_connection(self):
4688 # Issue #9792: errors raised by create_connection() should have
4689 # a proper errno attribute.
4690 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004691 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004692 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004693
4694 # Issue #16257: create_connection() calls getaddrinfo() against
4695 # 'localhost'. This may result in an IPV6 addr being returned
4696 # as well as an IPV4 one:
4697 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4698 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4699 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4700 #
4701 # create_connection() enumerates through all the addresses returned
4702 # and if it doesn't successfully bind to any of them, it propagates
4703 # the last exception it encountered.
4704 #
4705 # On Solaris, ENETUNREACH is returned in this circumstance instead
4706 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4707 # expected errnos.
4708 expected_errnos = [ errno.ECONNREFUSED, ]
4709 if hasattr(errno, 'ENETUNREACH'):
4710 expected_errnos.append(errno.ENETUNREACH)
Victor Stinner280c22a2017-10-31 19:48:14 -07004711 if hasattr(errno, 'EADDRNOTAVAIL'):
4712 # bpo-31910: socket.create_connection() fails randomly
4713 # with EADDRNOTAVAIL on Travis CI
4714 expected_errnos.append(errno.EADDRNOTAVAIL)
Trent Nelson45bb6132012-10-17 06:15:15 -04004715
4716 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004717
4718 def test_create_connection_timeout(self):
4719 # Issue #9792: create_connection() should not recast timeout errors
4720 # as generic socket errors.
4721 with self.mocked_socket_module():
4722 with self.assertRaises(socket.timeout):
4723 socket.create_connection((HOST, 1234))
4724
Guido van Rossumd8faa362007-04-27 19:54:29 +00004725
4726class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4727
4728 def __init__(self, methodName='runTest'):
4729 SocketTCPTest.__init__(self, methodName=methodName)
4730 ThreadableTest.__init__(self)
4731
4732 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004733 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004734
4735 def clientTearDown(self):
4736 self.cli.close()
4737 self.cli = None
4738 ThreadableTest.clientTearDown(self)
4739
4740 def _justAccept(self):
4741 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004742 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004743
4744 testFamily = _justAccept
4745 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004746 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004747 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004748 self.assertEqual(self.cli.family, 2)
4749
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004750 testSourceAddress = _justAccept
4751 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004752 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4753 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004754 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004755 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004756 # The port number being used is sufficient to show that the bind()
4757 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004758
Guido van Rossumd8faa362007-04-27 19:54:29 +00004759 testTimeoutDefault = _justAccept
4760 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004761 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004762 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004763 socket.setdefaulttimeout(42)
4764 try:
4765 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004766 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004767 finally:
4768 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004769 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004770
4771 testTimeoutNone = _justAccept
4772 def _testTimeoutNone(self):
4773 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004774 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004775 socket.setdefaulttimeout(30)
4776 try:
4777 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004778 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004779 finally:
4780 socket.setdefaulttimeout(None)
4781 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004782
4783 testTimeoutValueNamed = _justAccept
4784 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004785 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004786 self.assertEqual(self.cli.gettimeout(), 30)
4787
4788 testTimeoutValueNonamed = _justAccept
4789 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004790 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004791 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004792 self.assertEqual(self.cli.gettimeout(), 30)
4793
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004794
Guido van Rossumd8faa362007-04-27 19:54:29 +00004795class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4796
4797 def __init__(self, methodName='runTest'):
4798 SocketTCPTest.__init__(self, methodName=methodName)
4799 ThreadableTest.__init__(self)
4800
4801 def clientSetUp(self):
4802 pass
4803
4804 def clientTearDown(self):
4805 self.cli.close()
4806 self.cli = None
4807 ThreadableTest.clientTearDown(self)
4808
4809 def testInsideTimeout(self):
4810 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004811 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004812 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004813 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004814 testOutsideTimeout = testInsideTimeout
4815
4816 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004817 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004818 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004819 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004820
4821 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004822 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004823 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004824
4825
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004826class TCPTimeoutTest(SocketTCPTest):
4827
4828 def testTCPTimeout(self):
4829 def raise_timeout(*args, **kwargs):
4830 self.serv.settimeout(1.0)
4831 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004832 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004833 "Error generating a timeout exception (TCP)")
4834
4835 def testTimeoutZero(self):
4836 ok = False
4837 try:
4838 self.serv.settimeout(0.0)
4839 foo = self.serv.accept()
4840 except socket.timeout:
4841 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004842 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004843 ok = True
4844 except:
4845 self.fail("caught unexpected exception (TCP)")
4846 if not ok:
4847 self.fail("accept() returned success when we did not expect it")
4848
Serhiy Storchaka43767632013-11-03 21:31:38 +02004849 @unittest.skipUnless(hasattr(signal, 'alarm'),
4850 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004851 def testInterruptedTimeout(self):
4852 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06004853 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004854 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004855 self.serv.settimeout(5.0) # must be longer than alarm
4856 class Alarm(Exception):
4857 pass
4858 def alarm_handler(signal, frame):
4859 raise Alarm
4860 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4861 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004862 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004863 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004864 foo = self.serv.accept()
4865 except socket.timeout:
4866 self.fail("caught timeout instead of Alarm")
4867 except Alarm:
4868 pass
4869 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004870 self.fail("caught other exception instead of Alarm:"
4871 " %s(%s):\n%s" %
4872 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004873 else:
4874 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004875 finally:
4876 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004877 except Alarm:
4878 self.fail("got Alarm in wrong place")
4879 finally:
4880 # no alarm can be pending. Safe to restore old handler.
4881 signal.signal(signal.SIGALRM, old_alarm)
4882
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004883class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004884
4885 def testUDPTimeout(self):
4886 def raise_timeout(*args, **kwargs):
4887 self.serv.settimeout(1.0)
4888 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004889 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004890 "Error generating a timeout exception (UDP)")
4891
4892 def testTimeoutZero(self):
4893 ok = False
4894 try:
4895 self.serv.settimeout(0.0)
4896 foo = self.serv.recv(1024)
4897 except socket.timeout:
4898 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004899 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004900 ok = True
4901 except:
4902 self.fail("caught unexpected exception (UDP)")
4903 if not ok:
4904 self.fail("recv() returned success when we did not expect it")
4905
4906class TestExceptions(unittest.TestCase):
4907
4908 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004909 self.assertTrue(issubclass(OSError, Exception))
4910 self.assertTrue(issubclass(socket.herror, OSError))
4911 self.assertTrue(issubclass(socket.gaierror, OSError))
4912 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004913
Yury Selivanovfa22b292016-10-18 16:03:52 -04004914 def test_setblocking_invalidfd(self):
4915 # Regression test for issue #28471
4916
4917 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4918 sock = socket.socket(
4919 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4920 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004921 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004922
4923 with self.assertRaises(OSError):
4924 sock.setblocking(False)
4925
4926
Serhiy Storchaka43767632013-11-03 21:31:38 +02004927@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004928class TestLinuxAbstractNamespace(unittest.TestCase):
4929
4930 UNIX_PATH_MAX = 108
4931
4932 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004933 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004934 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4935 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004936 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004937 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4938 s2.connect(s1.getsockname())
4939 with s1.accept()[0] as s3:
4940 self.assertEqual(s1.getsockname(), address)
4941 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004942
4943 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004944 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004945 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4946 s.bind(address)
4947 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004948
4949 def testNameOverflow(self):
4950 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004951 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004952 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004953
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004954 def testStrName(self):
4955 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004956 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4957 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004958 s.bind("\x00python\x00test\x00")
4959 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004960 finally:
4961 s.close()
4962
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004963 def testBytearrayName(self):
4964 # Check that an abstract name can be passed as a bytearray.
4965 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4966 s.bind(bytearray(b"\x00python\x00test\x00"))
4967 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4968
Serhiy Storchaka43767632013-11-03 21:31:38 +02004969@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004970class TestUnixDomain(unittest.TestCase):
4971
4972 def setUp(self):
4973 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4974
4975 def tearDown(self):
4976 self.sock.close()
4977
4978 def encoded(self, path):
4979 # Return the given path encoded in the file system encoding,
4980 # or skip the test if this is not possible.
4981 try:
4982 return os.fsencode(path)
4983 except UnicodeEncodeError:
4984 self.skipTest(
4985 "Pathname {0!a} cannot be represented in file "
4986 "system encoding {1!r}".format(
4987 path, sys.getfilesystemencoding()))
4988
Antoine Pitrou16374872011-12-16 15:04:12 +01004989 def bind(self, sock, path):
4990 # Bind the socket
4991 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004992 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004993 except OSError as e:
4994 if str(e) == "AF_UNIX path too long":
4995 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004996 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004997 .format(path))
4998 else:
4999 raise
5000
Antoine Pitrou495b5022017-05-02 17:20:00 +02005001 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005002 # Issue #30205 (note getsockname() can return None on OS X)
5003 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005004
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005005 def testStrAddr(self):
5006 # Test binding to and retrieving a normal string pathname.
5007 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005008 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005009 self.addCleanup(support.unlink, path)
5010 self.assertEqual(self.sock.getsockname(), path)
5011
5012 def testBytesAddr(self):
5013 # Test binding to a bytes pathname.
5014 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005015 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005016 self.addCleanup(support.unlink, path)
5017 self.assertEqual(self.sock.getsockname(), path)
5018
5019 def testSurrogateescapeBind(self):
5020 # Test binding to a valid non-ASCII pathname, with the
5021 # non-ASCII bytes supplied using surrogateescape encoding.
5022 path = os.path.abspath(support.TESTFN_UNICODE)
5023 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005024 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005025 self.addCleanup(support.unlink, path)
5026 self.assertEqual(self.sock.getsockname(), path)
5027
5028 def testUnencodableAddr(self):
5029 # Test binding to a pathname that cannot be encoded in the
5030 # file system encoding.
5031 if support.TESTFN_UNENCODABLE is None:
5032 self.skipTest("No unencodable filename available")
5033 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005034 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005035 self.addCleanup(support.unlink, path)
5036 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005037
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005038
Thomas Wouters477c8d52006-05-27 19:21:47 +00005039class BufferIOTest(SocketConnectedTest):
5040 """
5041 Test the buffer versions of socket.recv() and socket.send().
5042 """
5043 def __init__(self, methodName='runTest'):
5044 SocketConnectedTest.__init__(self, methodName=methodName)
5045
Antoine Pitrou25480782010-03-17 22:50:28 +00005046 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005047 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005048 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005049 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005050 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005051 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005052 self.assertEqual(msg, MSG)
5053
Antoine Pitrou25480782010-03-17 22:50:28 +00005054 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005055 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005056 self.serv_conn.send(buf)
5057
Antoine Pitrou25480782010-03-17 22:50:28 +00005058 def testRecvIntoBytearray(self):
5059 buf = bytearray(1024)
5060 nbytes = self.cli_conn.recv_into(buf)
5061 self.assertEqual(nbytes, len(MSG))
5062 msg = buf[:len(MSG)]
5063 self.assertEqual(msg, MSG)
5064
5065 _testRecvIntoBytearray = _testRecvIntoArray
5066
5067 def testRecvIntoMemoryview(self):
5068 buf = bytearray(1024)
5069 nbytes = self.cli_conn.recv_into(memoryview(buf))
5070 self.assertEqual(nbytes, len(MSG))
5071 msg = buf[:len(MSG)]
5072 self.assertEqual(msg, MSG)
5073
5074 _testRecvIntoMemoryview = _testRecvIntoArray
5075
5076 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005077 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005078 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005079 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005080 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005081 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005082 self.assertEqual(msg, MSG)
5083
Antoine Pitrou25480782010-03-17 22:50:28 +00005084 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005085 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005086 self.serv_conn.send(buf)
5087
Antoine Pitrou25480782010-03-17 22:50:28 +00005088 def testRecvFromIntoBytearray(self):
5089 buf = bytearray(1024)
5090 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5091 self.assertEqual(nbytes, len(MSG))
5092 msg = buf[:len(MSG)]
5093 self.assertEqual(msg, MSG)
5094
5095 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5096
5097 def testRecvFromIntoMemoryview(self):
5098 buf = bytearray(1024)
5099 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5100 self.assertEqual(nbytes, len(MSG))
5101 msg = buf[:len(MSG)]
5102 self.assertEqual(msg, MSG)
5103
5104 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5105
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005106 def testRecvFromIntoSmallBuffer(self):
5107 # See issue #20246.
5108 buf = bytearray(8)
5109 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5110
5111 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005112 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005113
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005114 def testRecvFromIntoEmptyBuffer(self):
5115 buf = bytearray()
5116 self.cli_conn.recvfrom_into(buf)
5117 self.cli_conn.recvfrom_into(buf, 0)
5118
5119 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5120
Christian Heimes043d6f62008-01-07 17:19:16 +00005121
5122TIPC_STYPE = 2000
5123TIPC_LOWER = 200
5124TIPC_UPPER = 210
5125
5126def isTipcAvailable():
5127 """Check if the TIPC module is loaded
5128
5129 The TIPC module is not loaded automatically on Ubuntu and probably
5130 other Linux distros.
5131 """
5132 if not hasattr(socket, "AF_TIPC"):
5133 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005134 try:
5135 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005136 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005137 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005138 # have not the permission to read it.
5139 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005140 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005141 for line in f:
5142 if line.startswith("tipc "):
5143 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005144 return False
5145
Serhiy Storchaka43767632013-11-03 21:31:38 +02005146@unittest.skipUnless(isTipcAvailable(),
5147 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005148class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005149 def testRDM(self):
5150 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5151 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005152 self.addCleanup(srv.close)
5153 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005154
5155 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5156 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5157 TIPC_LOWER, TIPC_UPPER)
5158 srv.bind(srvaddr)
5159
5160 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5161 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5162 cli.sendto(MSG, sendaddr)
5163
5164 msg, recvaddr = srv.recvfrom(1024)
5165
5166 self.assertEqual(cli.getsockname(), recvaddr)
5167 self.assertEqual(msg, MSG)
5168
5169
Serhiy Storchaka43767632013-11-03 21:31:38 +02005170@unittest.skipUnless(isTipcAvailable(),
5171 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005172class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005173 def __init__(self, methodName = 'runTest'):
5174 unittest.TestCase.__init__(self, methodName = methodName)
5175 ThreadableTest.__init__(self)
5176
5177 def setUp(self):
5178 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005179 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005180 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5181 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5182 TIPC_LOWER, TIPC_UPPER)
5183 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005184 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005185 self.serverExplicitReady()
5186 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005187 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005188
5189 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005190 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005191 # accept() call; sleep a little while to avoid it, otherwise
5192 # we could get an exception
5193 time.sleep(0.1)
5194 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005195 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005196 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5197 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5198 self.cli.connect(addr)
5199 self.cliaddr = self.cli.getsockname()
5200
5201 def testStream(self):
5202 msg = self.conn.recv(1024)
5203 self.assertEqual(msg, MSG)
5204 self.assertEqual(self.cliaddr, self.connaddr)
5205
5206 def _testStream(self):
5207 self.cli.send(MSG)
5208 self.cli.close()
5209
5210
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005211class ContextManagersTest(ThreadedTCPSocketTest):
5212
5213 def _testSocketClass(self):
5214 # base test
5215 with socket.socket() as sock:
5216 self.assertFalse(sock._closed)
5217 self.assertTrue(sock._closed)
5218 # close inside with block
5219 with socket.socket() as sock:
5220 sock.close()
5221 self.assertTrue(sock._closed)
5222 # exception inside with block
5223 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005224 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005225 self.assertTrue(sock._closed)
5226
5227 def testCreateConnectionBase(self):
5228 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005229 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005230 data = conn.recv(1024)
5231 conn.sendall(data)
5232
5233 def _testCreateConnectionBase(self):
5234 address = self.serv.getsockname()
5235 with socket.create_connection(address) as sock:
5236 self.assertFalse(sock._closed)
5237 sock.sendall(b'foo')
5238 self.assertEqual(sock.recv(1024), b'foo')
5239 self.assertTrue(sock._closed)
5240
5241 def testCreateConnectionClose(self):
5242 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005243 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005244 data = conn.recv(1024)
5245 conn.sendall(data)
5246
5247 def _testCreateConnectionClose(self):
5248 address = self.serv.getsockname()
5249 with socket.create_connection(address) as sock:
5250 sock.close()
5251 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005252 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005253
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005254
Victor Stinnerdaf45552013-08-28 00:53:59 +02005255class InheritanceTest(unittest.TestCase):
5256 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5257 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005258 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005259 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005260 with socket.socket(socket.AF_INET,
5261 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005262 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005263 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005264
5265 def test_default_inheritable(self):
5266 sock = socket.socket()
5267 with sock:
5268 self.assertEqual(sock.get_inheritable(), False)
5269
5270 def test_dup(self):
5271 sock = socket.socket()
5272 with sock:
5273 newsock = sock.dup()
5274 sock.close()
5275 with newsock:
5276 self.assertEqual(newsock.get_inheritable(), False)
5277
5278 def test_set_inheritable(self):
5279 sock = socket.socket()
5280 with sock:
5281 sock.set_inheritable(True)
5282 self.assertEqual(sock.get_inheritable(), True)
5283
5284 sock.set_inheritable(False)
5285 self.assertEqual(sock.get_inheritable(), False)
5286
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005287 @unittest.skipIf(fcntl is None, "need fcntl")
5288 def test_get_inheritable_cloexec(self):
5289 sock = socket.socket()
5290 with sock:
5291 fd = sock.fileno()
5292 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005293
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005294 # clear FD_CLOEXEC flag
5295 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5296 flags &= ~fcntl.FD_CLOEXEC
5297 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005298
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005299 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005300
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005301 @unittest.skipIf(fcntl is None, "need fcntl")
5302 def test_set_inheritable_cloexec(self):
5303 sock = socket.socket()
5304 with sock:
5305 fd = sock.fileno()
5306 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5307 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005308
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005309 sock.set_inheritable(True)
5310 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5311 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005312
5313
Victor Stinnerdaf45552013-08-28 00:53:59 +02005314 def test_socketpair(self):
5315 s1, s2 = socket.socketpair()
5316 self.addCleanup(s1.close)
5317 self.addCleanup(s2.close)
5318 self.assertEqual(s1.get_inheritable(), False)
5319 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005320
5321
5322@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5323 "SOCK_NONBLOCK not defined")
5324class NonblockConstantTest(unittest.TestCase):
5325 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5326 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005327 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005328 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005329 self.assertTrue(
5330 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005331 if timeout == 0:
5332 # timeout == 0: means that getblocking() must be False.
5333 self.assertFalse(s.getblocking())
5334 else:
5335 # If timeout > 0, the socket will be in a "blocking" mode
5336 # from the standpoint of the Python API. For Python socket
5337 # object, "blocking" means that operations like 'sock.recv()'
5338 # will block. Internally, file descriptors for
5339 # "blocking" Python sockets *with timeouts* are in a
5340 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5341 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5342 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005343 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005344 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005345 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005346 self.assertFalse(
5347 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005348 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005349
Charles-François Natali239bb962011-06-03 12:55:15 +02005350 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005351 def test_SOCK_NONBLOCK(self):
5352 # a lot of it seems silly and redundant, but I wanted to test that
5353 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005354 with socket.socket(socket.AF_INET,
5355 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5356 self.checkNonblock(s)
5357 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005358 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005359 s.setblocking(0)
5360 self.checkNonblock(s)
5361 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005362 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005363 s.settimeout(2.0)
5364 self.checkNonblock(s, timeout=2.0)
5365 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005366 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005367 # defaulttimeout
5368 t = socket.getdefaulttimeout()
5369 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005370 with socket.socket() as s:
5371 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005372 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005373 with socket.socket() as s:
5374 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005375 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005376 with socket.socket() as s:
5377 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005378 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005379 with socket.socket() as s:
5380 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005381 socket.setdefaulttimeout(t)
5382
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005383
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005384@unittest.skipUnless(os.name == "nt", "Windows specific")
5385@unittest.skipUnless(multiprocessing, "need multiprocessing")
5386class TestSocketSharing(SocketTCPTest):
5387 # This must be classmethod and not staticmethod or multiprocessing
5388 # won't be able to bootstrap it.
5389 @classmethod
5390 def remoteProcessServer(cls, q):
5391 # Recreate socket from shared data
5392 sdata = q.get()
5393 message = q.get()
5394
5395 s = socket.fromshare(sdata)
5396 s2, c = s.accept()
5397
5398 # Send the message
5399 s2.sendall(message)
5400 s2.close()
5401 s.close()
5402
5403 def testShare(self):
5404 # Transfer the listening server socket to another process
5405 # and service it from there.
5406
5407 # Create process:
5408 q = multiprocessing.Queue()
5409 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5410 p.start()
5411
5412 # Get the shared socket data
5413 data = self.serv.share(p.pid)
5414
5415 # Pass the shared socket to the other process
5416 addr = self.serv.getsockname()
5417 self.serv.close()
5418 q.put(data)
5419
5420 # The data that the server will send us
5421 message = b"slapmahfro"
5422 q.put(message)
5423
5424 # Connect
5425 s = socket.create_connection(addr)
5426 # listen for the data
5427 m = []
5428 while True:
5429 data = s.recv(100)
5430 if not data:
5431 break
5432 m.append(data)
5433 s.close()
5434 received = b"".join(m)
5435 self.assertEqual(received, message)
5436 p.join()
5437
5438 def testShareLength(self):
5439 data = self.serv.share(os.getpid())
5440 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5441 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5442
5443 def compareSockets(self, org, other):
5444 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005445 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005446 self.assertEqual(org.gettimeout(), None)
5447 self.assertEqual(org.gettimeout(), other.gettimeout())
5448
5449 self.assertEqual(org.family, other.family)
5450 self.assertEqual(org.type, other.type)
5451 # If the user specified "0" for proto, then
5452 # internally windows will have picked the correct value.
5453 # Python introspection on the socket however will still return
5454 # 0. For the shared socket, the python value is recreated
5455 # from the actual value, so it may not compare correctly.
5456 if org.proto != 0:
5457 self.assertEqual(org.proto, other.proto)
5458
5459 def testShareLocal(self):
5460 data = self.serv.share(os.getpid())
5461 s = socket.fromshare(data)
5462 try:
5463 self.compareSockets(self.serv, s)
5464 finally:
5465 s.close()
5466
5467 def testTypes(self):
5468 families = [socket.AF_INET, socket.AF_INET6]
5469 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5470 for f in families:
5471 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005472 try:
5473 source = socket.socket(f, t)
5474 except OSError:
5475 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005476 try:
5477 data = source.share(os.getpid())
5478 shared = socket.fromshare(data)
5479 try:
5480 self.compareSockets(source, shared)
5481 finally:
5482 shared.close()
5483 finally:
5484 source.close()
5485
5486
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005487class SendfileUsingSendTest(ThreadedTCPSocketTest):
5488 """
5489 Test the send() implementation of socket.sendfile().
5490 """
5491
Victor Stinner8c663fd2017-11-08 14:44:44 -08005492 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005493 BUFSIZE = 8192
5494 FILEDATA = b""
5495 TIMEOUT = 2
5496
5497 @classmethod
5498 def setUpClass(cls):
5499 def chunks(total, step):
5500 assert total >= step
5501 while total > step:
5502 yield step
5503 total -= step
5504 if total:
5505 yield total
5506
5507 chunk = b"".join([random.choice(string.ascii_letters).encode()
5508 for i in range(cls.BUFSIZE)])
5509 with open(support.TESTFN, 'wb') as f:
5510 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5511 f.write(chunk)
5512 with open(support.TESTFN, 'rb') as f:
5513 cls.FILEDATA = f.read()
5514 assert len(cls.FILEDATA) == cls.FILESIZE
5515
5516 @classmethod
5517 def tearDownClass(cls):
5518 support.unlink(support.TESTFN)
5519
5520 def accept_conn(self):
5521 self.serv.settimeout(self.TIMEOUT)
5522 conn, addr = self.serv.accept()
5523 conn.settimeout(self.TIMEOUT)
5524 self.addCleanup(conn.close)
5525 return conn
5526
5527 def recv_data(self, conn):
5528 received = []
5529 while True:
5530 chunk = conn.recv(self.BUFSIZE)
5531 if not chunk:
5532 break
5533 received.append(chunk)
5534 return b''.join(received)
5535
5536 def meth_from_sock(self, sock):
5537 # Depending on the mixin class being run return either send()
5538 # or sendfile() method implementation.
5539 return getattr(sock, "_sendfile_use_send")
5540
5541 # regular file
5542
5543 def _testRegularFile(self):
5544 address = self.serv.getsockname()
5545 file = open(support.TESTFN, 'rb')
5546 with socket.create_connection(address) as sock, file as file:
5547 meth = self.meth_from_sock(sock)
5548 sent = meth(file)
5549 self.assertEqual(sent, self.FILESIZE)
5550 self.assertEqual(file.tell(), self.FILESIZE)
5551
5552 def testRegularFile(self):
5553 conn = self.accept_conn()
5554 data = self.recv_data(conn)
5555 self.assertEqual(len(data), self.FILESIZE)
5556 self.assertEqual(data, self.FILEDATA)
5557
5558 # non regular file
5559
5560 def _testNonRegularFile(self):
5561 address = self.serv.getsockname()
5562 file = io.BytesIO(self.FILEDATA)
5563 with socket.create_connection(address) as sock, file as file:
5564 sent = sock.sendfile(file)
5565 self.assertEqual(sent, self.FILESIZE)
5566 self.assertEqual(file.tell(), self.FILESIZE)
5567 self.assertRaises(socket._GiveupOnSendfile,
5568 sock._sendfile_use_sendfile, file)
5569
5570 def testNonRegularFile(self):
5571 conn = self.accept_conn()
5572 data = self.recv_data(conn)
5573 self.assertEqual(len(data), self.FILESIZE)
5574 self.assertEqual(data, self.FILEDATA)
5575
5576 # empty file
5577
5578 def _testEmptyFileSend(self):
5579 address = self.serv.getsockname()
5580 filename = support.TESTFN + "2"
5581 with open(filename, 'wb'):
5582 self.addCleanup(support.unlink, filename)
5583 file = open(filename, 'rb')
5584 with socket.create_connection(address) as sock, file as file:
5585 meth = self.meth_from_sock(sock)
5586 sent = meth(file)
5587 self.assertEqual(sent, 0)
5588 self.assertEqual(file.tell(), 0)
5589
5590 def testEmptyFileSend(self):
5591 conn = self.accept_conn()
5592 data = self.recv_data(conn)
5593 self.assertEqual(data, b"")
5594
5595 # offset
5596
5597 def _testOffset(self):
5598 address = self.serv.getsockname()
5599 file = open(support.TESTFN, 'rb')
5600 with socket.create_connection(address) as sock, file as file:
5601 meth = self.meth_from_sock(sock)
5602 sent = meth(file, offset=5000)
5603 self.assertEqual(sent, self.FILESIZE - 5000)
5604 self.assertEqual(file.tell(), self.FILESIZE)
5605
5606 def testOffset(self):
5607 conn = self.accept_conn()
5608 data = self.recv_data(conn)
5609 self.assertEqual(len(data), self.FILESIZE - 5000)
5610 self.assertEqual(data, self.FILEDATA[5000:])
5611
5612 # count
5613
5614 def _testCount(self):
5615 address = self.serv.getsockname()
5616 file = open(support.TESTFN, 'rb')
5617 with socket.create_connection(address, timeout=2) as sock, file as file:
5618 count = 5000007
5619 meth = self.meth_from_sock(sock)
5620 sent = meth(file, count=count)
5621 self.assertEqual(sent, count)
5622 self.assertEqual(file.tell(), count)
5623
5624 def testCount(self):
5625 count = 5000007
5626 conn = self.accept_conn()
5627 data = self.recv_data(conn)
5628 self.assertEqual(len(data), count)
5629 self.assertEqual(data, self.FILEDATA[:count])
5630
5631 # count small
5632
5633 def _testCountSmall(self):
5634 address = self.serv.getsockname()
5635 file = open(support.TESTFN, 'rb')
5636 with socket.create_connection(address, timeout=2) as sock, file as file:
5637 count = 1
5638 meth = self.meth_from_sock(sock)
5639 sent = meth(file, count=count)
5640 self.assertEqual(sent, count)
5641 self.assertEqual(file.tell(), count)
5642
5643 def testCountSmall(self):
5644 count = 1
5645 conn = self.accept_conn()
5646 data = self.recv_data(conn)
5647 self.assertEqual(len(data), count)
5648 self.assertEqual(data, self.FILEDATA[:count])
5649
5650 # count + offset
5651
5652 def _testCountWithOffset(self):
5653 address = self.serv.getsockname()
5654 file = open(support.TESTFN, 'rb')
5655 with socket.create_connection(address, timeout=2) as sock, file as file:
5656 count = 100007
5657 meth = self.meth_from_sock(sock)
5658 sent = meth(file, offset=2007, count=count)
5659 self.assertEqual(sent, count)
5660 self.assertEqual(file.tell(), count + 2007)
5661
5662 def testCountWithOffset(self):
5663 count = 100007
5664 conn = self.accept_conn()
5665 data = self.recv_data(conn)
5666 self.assertEqual(len(data), count)
5667 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5668
5669 # non blocking sockets are not supposed to work
5670
5671 def _testNonBlocking(self):
5672 address = self.serv.getsockname()
5673 file = open(support.TESTFN, 'rb')
5674 with socket.create_connection(address) as sock, file as file:
5675 sock.setblocking(False)
5676 meth = self.meth_from_sock(sock)
5677 self.assertRaises(ValueError, meth, file)
5678 self.assertRaises(ValueError, sock.sendfile, file)
5679
5680 def testNonBlocking(self):
5681 conn = self.accept_conn()
5682 if conn.recv(8192):
5683 self.fail('was not supposed to receive any data')
5684
5685 # timeout (non-triggered)
5686
5687 def _testWithTimeout(self):
5688 address = self.serv.getsockname()
5689 file = open(support.TESTFN, 'rb')
5690 with socket.create_connection(address, timeout=2) as sock, file as file:
5691 meth = self.meth_from_sock(sock)
5692 sent = meth(file)
5693 self.assertEqual(sent, self.FILESIZE)
5694
5695 def testWithTimeout(self):
5696 conn = self.accept_conn()
5697 data = self.recv_data(conn)
5698 self.assertEqual(len(data), self.FILESIZE)
5699 self.assertEqual(data, self.FILEDATA)
5700
5701 # timeout (triggered)
5702
5703 def _testWithTimeoutTriggeredSend(self):
5704 address = self.serv.getsockname()
5705 file = open(support.TESTFN, 'rb')
5706 with socket.create_connection(address, timeout=0.01) as sock, \
5707 file as file:
5708 meth = self.meth_from_sock(sock)
5709 self.assertRaises(socket.timeout, meth, file)
5710
5711 def testWithTimeoutTriggeredSend(self):
5712 conn = self.accept_conn()
5713 conn.recv(88192)
5714
5715 # errors
5716
5717 def _test_errors(self):
5718 pass
5719
5720 def test_errors(self):
5721 with open(support.TESTFN, 'rb') as file:
5722 with socket.socket(type=socket.SOCK_DGRAM) as s:
5723 meth = self.meth_from_sock(s)
5724 self.assertRaisesRegex(
5725 ValueError, "SOCK_STREAM", meth, file)
5726 with open(support.TESTFN, 'rt') as file:
5727 with socket.socket() as s:
5728 meth = self.meth_from_sock(s)
5729 self.assertRaisesRegex(
5730 ValueError, "binary mode", meth, file)
5731 with open(support.TESTFN, 'rb') as file:
5732 with socket.socket() as s:
5733 meth = self.meth_from_sock(s)
5734 self.assertRaisesRegex(TypeError, "positive integer",
5735 meth, file, count='2')
5736 self.assertRaisesRegex(TypeError, "positive integer",
5737 meth, file, count=0.1)
5738 self.assertRaisesRegex(ValueError, "positive integer",
5739 meth, file, count=0)
5740 self.assertRaisesRegex(ValueError, "positive integer",
5741 meth, file, count=-1)
5742
5743
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005744@unittest.skipUnless(hasattr(os, "sendfile"),
5745 'os.sendfile() required for this test.')
5746class SendfileUsingSendfileTest(SendfileUsingSendTest):
5747 """
5748 Test the sendfile() implementation of socket.sendfile().
5749 """
5750 def meth_from_sock(self, sock):
5751 return getattr(sock, "_sendfile_use_sendfile")
5752
Christian Heimes48371412016-09-06 00:37:46 +02005753
5754@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005755class LinuxKernelCryptoAPI(unittest.TestCase):
5756 # tests for AF_ALG
5757 def create_alg(self, typ, name):
5758 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005759 try:
5760 sock.bind((typ, name))
5761 except FileNotFoundError as e:
5762 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005763 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005764 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005765 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005766 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005767
Victor Stinner86afc1f2017-11-30 13:58:43 +01005768 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
5769 # at least on ppc64le architecture
5770 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02005771 def test_sha256(self):
5772 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5773 "177a9cb410ff61f20015ad")
5774 with self.create_alg('hash', 'sha256') as algo:
5775 op, _ = algo.accept()
5776 with op:
5777 op.sendall(b"abc")
5778 self.assertEqual(op.recv(512), expected)
5779
5780 op, _ = algo.accept()
5781 with op:
5782 op.send(b'a', socket.MSG_MORE)
5783 op.send(b'b', socket.MSG_MORE)
5784 op.send(b'c', socket.MSG_MORE)
5785 op.send(b'')
5786 self.assertEqual(op.recv(512), expected)
5787
5788 def test_hmac_sha1(self):
5789 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5790 with self.create_alg('hash', 'hmac(sha1)') as algo:
5791 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5792 op, _ = algo.accept()
5793 with op:
5794 op.sendall(b"what do ya want for nothing?")
5795 self.assertEqual(op.recv(512), expected)
5796
Christian Heimese084f842016-09-11 20:11:30 +02005797 # Although it should work with 3.19 and newer the test blocks on
5798 # Ubuntu 15.10 with Kernel 4.2.0-19.
5799 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005800 def test_aes_cbc(self):
5801 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5802 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5803 msg = b"Single block msg"
5804 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5805 msglen = len(msg)
5806 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5807 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5808 op, _ = algo.accept()
5809 with op:
5810 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5811 flags=socket.MSG_MORE)
5812 op.sendall(msg)
5813 self.assertEqual(op.recv(msglen), ciphertext)
5814
5815 op, _ = algo.accept()
5816 with op:
5817 op.sendmsg_afalg([ciphertext],
5818 op=socket.ALG_OP_DECRYPT, iv=iv)
5819 self.assertEqual(op.recv(msglen), msg)
5820
5821 # long message
5822 multiplier = 1024
5823 longmsg = [msg] * multiplier
5824 op, _ = algo.accept()
5825 with op:
5826 op.sendmsg_afalg(longmsg,
5827 op=socket.ALG_OP_ENCRYPT, iv=iv)
5828 enc = op.recv(msglen * multiplier)
5829 self.assertEqual(len(enc), msglen * multiplier)
Miss Islington (bot)958a25e2018-07-09 08:47:14 -07005830 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02005831
5832 op, _ = algo.accept()
5833 with op:
5834 op.sendmsg_afalg([enc],
5835 op=socket.ALG_OP_DECRYPT, iv=iv)
5836 dec = op.recv(msglen * multiplier)
5837 self.assertEqual(len(dec), msglen * multiplier)
5838 self.assertEqual(dec, msg * multiplier)
5839
matejcik9764c152017-02-16 14:41:31 +01005840 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005841 def test_aead_aes_gcm(self):
5842 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5843 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5844 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5845 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5846 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5847 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5848
5849 taglen = len(expected_tag)
5850 assoclen = len(assoc)
5851
5852 with self.create_alg('aead', 'gcm(aes)') as algo:
5853 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5854 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5855 None, taglen)
5856
5857 # send assoc, plain and tag buffer in separate steps
5858 op, _ = algo.accept()
5859 with op:
5860 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5861 assoclen=assoclen, flags=socket.MSG_MORE)
5862 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005863 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005864 res = op.recv(assoclen + len(plain) + taglen)
5865 self.assertEqual(expected_ct, res[assoclen:-taglen])
5866 self.assertEqual(expected_tag, res[-taglen:])
5867
5868 # now with msg
5869 op, _ = algo.accept()
5870 with op:
matejcik9764c152017-02-16 14:41:31 +01005871 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005872 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5873 assoclen=assoclen)
5874 res = op.recv(assoclen + len(plain) + taglen)
5875 self.assertEqual(expected_ct, res[assoclen:-taglen])
5876 self.assertEqual(expected_tag, res[-taglen:])
5877
5878 # create anc data manually
5879 pack_uint32 = struct.Struct('I').pack
5880 op, _ = algo.accept()
5881 with op:
matejcik9764c152017-02-16 14:41:31 +01005882 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005883 op.sendmsg(
5884 [msg],
5885 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5886 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5887 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5888 )
5889 )
matejcik9764c152017-02-16 14:41:31 +01005890 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005891 self.assertEqual(expected_ct, res[assoclen:-taglen])
5892 self.assertEqual(expected_tag, res[-taglen:])
5893
5894 # decrypt and verify
5895 op, _ = algo.accept()
5896 with op:
5897 msg = assoc + expected_ct + expected_tag
5898 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5899 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005900 res = op.recv(len(msg) - taglen)
5901 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005902
Christian Heimese084f842016-09-11 20:11:30 +02005903 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005904 def test_drbg_pr_sha256(self):
5905 # deterministic random bit generator, prediction resistance, sha256
5906 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5907 extra_seed = os.urandom(32)
5908 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5909 op, _ = algo.accept()
5910 with op:
5911 rn = op.recv(32)
5912 self.assertEqual(len(rn), 32)
5913
5914 def test_sendmsg_afalg_args(self):
5915 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005916 with sock:
5917 with self.assertRaises(TypeError):
5918 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005919
Christian Heimes02b30352016-09-11 19:49:56 +02005920 with self.assertRaises(TypeError):
5921 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005922
Christian Heimes02b30352016-09-11 19:49:56 +02005923 with self.assertRaises(TypeError):
5924 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005925
Christian Heimes02b30352016-09-11 19:49:56 +02005926 with self.assertRaises(TypeError):
5927 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005928
Christian Heimes02b30352016-09-11 19:49:56 +02005929 with self.assertRaises(TypeError):
5930 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5931
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08005932@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
5933class TestMSWindowsTCPFlags(unittest.TestCase):
5934 knownTCPFlags = {
Miss Islington (bot)32955292018-04-20 14:00:41 -07005935 # available since long time ago
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08005936 'TCP_MAXSEG',
5937 'TCP_NODELAY',
5938 # available starting with Windows 10 1607
5939 'TCP_FASTOPEN',
5940 # available starting with Windows 10 1703
5941 'TCP_KEEPCNT',
5942 # available starting with Windows 10 1709
5943 'TCP_KEEPIDLE',
5944 'TCP_KEEPINTVL'
5945 }
5946
5947 def test_new_tcp_flags(self):
5948 provided = [s for s in dir(socket) if s.startswith('TCP')]
5949 unknown = [s for s in provided if s not in self.knownTCPFlags]
5950
5951 self.assertEqual([], unknown,
5952 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005953
Guido van Rossumb995eb72002-07-31 16:08:40 +00005954def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005955 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005956 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005957
5958 tests.extend([
5959 NonBlockingTCPTests,
5960 FileObjectClassTestCase,
5961 UnbufferedFileObjectClassTestCase,
5962 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005963 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005964 UnicodeReadFileObjectClassTestCase,
5965 UnicodeWriteFileObjectClassTestCase,
5966 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005967 NetworkConnectionNoServer,
5968 NetworkConnectionAttributesTest,
5969 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005970 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005971 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005972 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005973 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005974 tests.append(BasicSocketPairTest)
5975 tests.append(TestUnixDomain)
5976 tests.append(TestLinuxAbstractNamespace)
5977 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005978 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005979 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005980 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005981 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04005982 BasicVSOCKTest,
5983 ThreadedVSOCKSocketStreamTest,
5984 ])
5985 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005986 CmsgMacroTests,
5987 SendmsgUDPTest,
5988 RecvmsgUDPTest,
5989 RecvmsgIntoUDPTest,
5990 SendmsgUDP6Test,
5991 RecvmsgUDP6Test,
5992 RecvmsgRFC3542AncillaryUDP6Test,
5993 RecvmsgIntoRFC3542AncillaryUDP6Test,
5994 RecvmsgIntoUDP6Test,
5995 SendmsgTCPTest,
5996 RecvmsgTCPTest,
5997 RecvmsgIntoTCPTest,
5998 SendmsgSCTPStreamTest,
5999 RecvmsgSCTPStreamTest,
6000 RecvmsgIntoSCTPStreamTest,
6001 SendmsgUnixStreamTest,
6002 RecvmsgUnixStreamTest,
6003 RecvmsgIntoUnixStreamTest,
6004 RecvmsgSCMRightsStreamTest,
6005 RecvmsgIntoSCMRightsStreamTest,
6006 # These are slow when setitimer() is not available
6007 InterruptedRecvTimeoutTest,
6008 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006009 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006010 SendfileUsingSendTest,
6011 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006012 ])
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08006013 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006014
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006015 thread_info = support.threading_setup()
6016 support.run_unittest(*tests)
6017 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006018
6019if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006020 test_main()