blob: c9add6cc98cb1b72bf8144876a2e1e84f80520a2 [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
23import string
Antoine Pitroub1c54962010-10-14 15:05:38 +000024try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000025 import multiprocessing
26except ImportError:
27 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020028try:
29 import fcntl
30except ImportError:
31 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000032
Benjamin Petersonee8712c2008-05-20 21:35:26 +000033HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000034MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000035
Victor Stinner45df8202010-04-28 22:31:17 +000036try:
37 import _thread as thread
38 import threading
39except ImportError:
40 thread = None
41 threading = None
Victor Stinnere254e532014-07-26 14:36:55 +020042try:
43 import _socket
44except ImportError:
45 _socket = None
46
Victor Stinner45df8202010-04-28 22:31:17 +000047
Charles-François Natali47413c12011-10-06 19:47:44 +020048def _have_socket_can():
49 """Check whether CAN sockets are supported on this host."""
50 try:
51 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020052 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020053 return False
54 else:
55 s.close()
56 return True
57
Charles-François Natali10b8cf42011-11-10 19:21:37 +010058def _have_socket_rds():
59 """Check whether RDS sockets are supported on this host."""
60 try:
61 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
62 except (AttributeError, OSError):
63 return False
64 else:
65 s.close()
66 return True
67
Christian Heimes48371412016-09-06 00:37:46 +020068def _have_socket_alg():
69 """Check whether AF_ALG sockets are supported on this host."""
70 try:
71 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
72 except (AttributeError, OSError):
73 return False
74 else:
75 s.close()
76 return True
77
Charles-François Natali47413c12011-10-06 19:47:44 +020078HAVE_SOCKET_CAN = _have_socket_can()
79
Charles-François Natali10b8cf42011-11-10 19:21:37 +010080HAVE_SOCKET_RDS = _have_socket_rds()
81
Christian Heimes48371412016-09-06 00:37:46 +020082HAVE_SOCKET_ALG = _have_socket_alg()
83
Nick Coghlan96fe56a2011-08-22 11:55:57 +100084# Size in bytes of the int type
85SIZEOF_INT = array.array("i").itemsize
86
Guido van Rossum24e4af82002-06-12 19:18:08 +000087class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000088
Guido van Rossum24e4af82002-06-12 19:18:08 +000089 def setUp(self):
90 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000091 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +010092 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +000093
Guido van Rossum24e4af82002-06-12 19:18:08 +000094 def tearDown(self):
95 self.serv.close()
96 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000097
Guido van Rossum24e4af82002-06-12 19:18:08 +000098class SocketUDPTest(unittest.TestCase):
99
100 def setUp(self):
101 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000102 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000103
104 def tearDown(self):
105 self.serv.close()
106 self.serv = None
107
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000108class ThreadSafeCleanupTestCase(unittest.TestCase):
109 """Subclass of unittest.TestCase with thread-safe cleanup methods.
110
111 This subclass protects the addCleanup() and doCleanups() methods
112 with a recursive lock.
113 """
114
115 if threading:
116 def __init__(self, *args, **kwargs):
117 super().__init__(*args, **kwargs)
118 self._cleanup_lock = threading.RLock()
119
120 def addCleanup(self, *args, **kwargs):
121 with self._cleanup_lock:
122 return super().addCleanup(*args, **kwargs)
123
124 def doCleanups(self, *args, **kwargs):
125 with self._cleanup_lock:
126 return super().doCleanups(*args, **kwargs)
127
Charles-François Natali47413c12011-10-06 19:47:44 +0200128class SocketCANTest(unittest.TestCase):
129
130 """To be able to run this test, a `vcan0` CAN interface can be created with
131 the following commands:
132 # modprobe vcan
133 # ip link add dev vcan0 type vcan
134 # ifconfig vcan0 up
135 """
136 interface = 'vcan0'
137 bufsize = 128
138
Charles-François Natali773e42d2013-02-05 19:42:01 +0100139 """The CAN frame structure is defined in <linux/can.h>:
140
141 struct can_frame {
142 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
143 __u8 can_dlc; /* data length code: 0 .. 8 */
144 __u8 data[8] __attribute__((aligned(8)));
145 };
146 """
147 can_frame_fmt = "=IB3x8s"
148 can_frame_size = struct.calcsize(can_frame_fmt)
149
150 """The Broadcast Management Command frame structure is defined
151 in <linux/can/bcm.h>:
152
153 struct bcm_msg_head {
154 __u32 opcode;
155 __u32 flags;
156 __u32 count;
157 struct timeval ival1, ival2;
158 canid_t can_id;
159 __u32 nframes;
160 struct can_frame frames[0];
161 }
162
163 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
164 `struct can_frame` definition). Must use native not standard types for packing.
165 """
166 bcm_cmd_msg_fmt = "@3I4l2I"
167 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
168
Charles-François Natali47413c12011-10-06 19:47:44 +0200169 def setUp(self):
170 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200171 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200172 try:
173 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200174 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200175 self.skipTest('network interface `%s` does not exist' %
176 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200177
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100178
179class SocketRDSTest(unittest.TestCase):
180
181 """To be able to run this test, the `rds` kernel module must be loaded:
182 # modprobe rds
183 """
184 bufsize = 8192
185
186 def setUp(self):
187 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
188 self.addCleanup(self.serv.close)
189 try:
190 self.port = support.bind_port(self.serv)
191 except OSError:
192 self.skipTest('unable to bind RDS socket')
193
194
Guido van Rossum24e4af82002-06-12 19:18:08 +0000195class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000196 """Threadable Test class
197
198 The ThreadableTest class makes it easy to create a threaded
199 client/server pair from an existing unit test. To create a
200 new threaded class from an existing unit test, use multiple
201 inheritance:
202
203 class NewClass (OldClass, ThreadableTest):
204 pass
205
206 This class defines two new fixture functions with obvious
207 purposes for overriding:
208
209 clientSetUp ()
210 clientTearDown ()
211
212 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000213 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000214 '_' to indicate the client portion of the test. Ex:
215
216 def testFoo(self):
217 # Server portion
218
219 def _testFoo(self):
220 # Client portion
221
222 Any exceptions raised by the clients during their tests
223 are caught and transferred to the main thread to alert
224 the testing framework.
225
226 Note, the server setup function cannot call any blocking
227 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000228 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000229 the blocking call (such as in setting up a client/server
230 connection and performing the accept() in setUp().
231 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000232
233 def __init__(self):
234 # Swap the true setup function
235 self.__setUp = self.setUp
236 self.__tearDown = self.tearDown
237 self.setUp = self._setUp
238 self.tearDown = self._tearDown
239
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000240 def serverExplicitReady(self):
241 """This method allows the server to explicitly indicate that
242 it wants the client thread to proceed. This is useful if the
243 server is about to execute a blocking routine that is
244 dependent upon the client thread during its setup routine."""
245 self.server_ready.set()
246
Guido van Rossum24e4af82002-06-12 19:18:08 +0000247 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000248 self.server_ready = threading.Event()
249 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000251 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200252 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000253
254 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000255 methodname = self.id()
256 i = methodname.rfind('.')
257 methodname = methodname[i+1:]
258 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000259 self.client_thread = thread.start_new_thread(
260 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000261
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200262 try:
263 self.__setUp()
264 except:
265 self.server_crashed = True
266 raise
267 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000268 self.server_ready.set()
269 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000270
271 def _tearDown(self):
272 self.__tearDown()
273 self.done.wait()
274
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000275 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000276 exc = self.queue.get()
277 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000278
279 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000280 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000281 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200282 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200283 if self.server_crashed:
284 self.clientTearDown()
285 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000286 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000287 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000288 try:
289 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000290 except BaseException as e:
291 self.queue.put(e)
292 finally:
293 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000294
295 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000296 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000297
298 def clientTearDown(self):
299 self.done.set()
300 thread.exit()
301
302class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
303
304 def __init__(self, methodName='runTest'):
305 SocketTCPTest.__init__(self, methodName=methodName)
306 ThreadableTest.__init__(self)
307
308 def clientSetUp(self):
309 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
310
311 def clientTearDown(self):
312 self.cli.close()
313 self.cli = None
314 ThreadableTest.clientTearDown(self)
315
316class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
317
318 def __init__(self, methodName='runTest'):
319 SocketUDPTest.__init__(self, methodName=methodName)
320 ThreadableTest.__init__(self)
321
322 def clientSetUp(self):
323 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
324
Brian Curtin3beb38f2010-11-04 03:41:43 +0000325 def clientTearDown(self):
326 self.cli.close()
327 self.cli = None
328 ThreadableTest.clientTearDown(self)
329
Charles-François Natali47413c12011-10-06 19:47:44 +0200330class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
331
332 def __init__(self, methodName='runTest'):
333 SocketCANTest.__init__(self, methodName=methodName)
334 ThreadableTest.__init__(self)
335
336 def clientSetUp(self):
337 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
338 try:
339 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200340 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200341 # skipTest should not be called here, and will be called in the
342 # server instead
343 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200344
345 def clientTearDown(self):
346 self.cli.close()
347 self.cli = None
348 ThreadableTest.clientTearDown(self)
349
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100350class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
351
352 def __init__(self, methodName='runTest'):
353 SocketRDSTest.__init__(self, methodName=methodName)
354 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100355
356 def clientSetUp(self):
357 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
358 try:
359 # RDS sockets must be bound explicitly to send or receive data
360 self.cli.bind((HOST, 0))
361 self.cli_addr = self.cli.getsockname()
362 except OSError:
363 # skipTest should not be called here, and will be called in the
364 # server instead
365 pass
366
367 def clientTearDown(self):
368 self.cli.close()
369 self.cli = None
370 ThreadableTest.clientTearDown(self)
371
Guido van Rossum24e4af82002-06-12 19:18:08 +0000372class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000373 """Socket tests for client-server connection.
374
375 self.cli_conn is a client socket connected to the server. The
376 setUp() method guarantees that it is connected to the server.
377 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000378
379 def __init__(self, methodName='runTest'):
380 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
381
382 def setUp(self):
383 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000384 # Indicate explicitly we're ready for the client thread to
385 # proceed and then perform the blocking call to accept
386 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000387 conn, addr = self.serv.accept()
388 self.cli_conn = conn
389
390 def tearDown(self):
391 self.cli_conn.close()
392 self.cli_conn = None
393 ThreadedTCPSocketTest.tearDown(self)
394
395 def clientSetUp(self):
396 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000397 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000398 self.serv_conn = self.cli
399
400 def clientTearDown(self):
401 self.serv_conn.close()
402 self.serv_conn = None
403 ThreadedTCPSocketTest.clientTearDown(self)
404
Dave Cole331708b2004-08-09 04:51:41 +0000405class SocketPairTest(unittest.TestCase, ThreadableTest):
406
407 def __init__(self, methodName='runTest'):
408 unittest.TestCase.__init__(self, methodName=methodName)
409 ThreadableTest.__init__(self)
410
411 def setUp(self):
412 self.serv, self.cli = socket.socketpair()
413
414 def tearDown(self):
415 self.serv.close()
416 self.serv = None
417
418 def clientSetUp(self):
419 pass
420
421 def clientTearDown(self):
422 self.cli.close()
423 self.cli = None
424 ThreadableTest.clientTearDown(self)
425
Tim Peters494aaee2004-08-09 18:54:11 +0000426
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000427# The following classes are used by the sendmsg()/recvmsg() tests.
428# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
429# gives a drop-in replacement for SocketConnectedTest, but different
430# address families can be used, and the attributes serv_addr and
431# cli_addr will be set to the addresses of the endpoints.
432
433class SocketTestBase(unittest.TestCase):
434 """A base class for socket tests.
435
436 Subclasses must provide methods newSocket() to return a new socket
437 and bindSock(sock) to bind it to an unused address.
438
439 Creates a socket self.serv and sets self.serv_addr to its address.
440 """
441
442 def setUp(self):
443 self.serv = self.newSocket()
444 self.bindServer()
445
446 def bindServer(self):
447 """Bind server socket and set self.serv_addr to its address."""
448 self.bindSock(self.serv)
449 self.serv_addr = self.serv.getsockname()
450
451 def tearDown(self):
452 self.serv.close()
453 self.serv = None
454
455
456class SocketListeningTestMixin(SocketTestBase):
457 """Mixin to listen on the server socket."""
458
459 def setUp(self):
460 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100461 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000462
463
464class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
465 ThreadableTest):
466 """Mixin to add client socket and allow client/server tests.
467
468 Client socket is self.cli and its address is self.cli_addr. See
469 ThreadableTest for usage information.
470 """
471
472 def __init__(self, *args, **kwargs):
473 super().__init__(*args, **kwargs)
474 ThreadableTest.__init__(self)
475
476 def clientSetUp(self):
477 self.cli = self.newClientSocket()
478 self.bindClient()
479
480 def newClientSocket(self):
481 """Return a new socket for use as client."""
482 return self.newSocket()
483
484 def bindClient(self):
485 """Bind client socket and set self.cli_addr to its address."""
486 self.bindSock(self.cli)
487 self.cli_addr = self.cli.getsockname()
488
489 def clientTearDown(self):
490 self.cli.close()
491 self.cli = None
492 ThreadableTest.clientTearDown(self)
493
494
495class ConnectedStreamTestMixin(SocketListeningTestMixin,
496 ThreadedSocketTestMixin):
497 """Mixin to allow client/server stream tests with connected client.
498
499 Server's socket representing connection to client is self.cli_conn
500 and client's connection to server is self.serv_conn. (Based on
501 SocketConnectedTest.)
502 """
503
504 def setUp(self):
505 super().setUp()
506 # Indicate explicitly we're ready for the client thread to
507 # proceed and then perform the blocking call to accept
508 self.serverExplicitReady()
509 conn, addr = self.serv.accept()
510 self.cli_conn = conn
511
512 def tearDown(self):
513 self.cli_conn.close()
514 self.cli_conn = None
515 super().tearDown()
516
517 def clientSetUp(self):
518 super().clientSetUp()
519 self.cli.connect(self.serv_addr)
520 self.serv_conn = self.cli
521
522 def clientTearDown(self):
523 self.serv_conn.close()
524 self.serv_conn = None
525 super().clientTearDown()
526
527
528class UnixSocketTestBase(SocketTestBase):
529 """Base class for Unix-domain socket tests."""
530
531 # This class is used for file descriptor passing tests, so we
532 # create the sockets in a private directory so that other users
533 # can't send anything that might be problematic for a privileged
534 # user running the tests.
535
536 def setUp(self):
537 self.dir_path = tempfile.mkdtemp()
538 self.addCleanup(os.rmdir, self.dir_path)
539 super().setUp()
540
541 def bindSock(self, sock):
542 path = tempfile.mktemp(dir=self.dir_path)
543 sock.bind(path)
544 self.addCleanup(support.unlink, path)
545
546class UnixStreamBase(UnixSocketTestBase):
547 """Base class for Unix-domain SOCK_STREAM tests."""
548
549 def newSocket(self):
550 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
551
552
553class InetTestBase(SocketTestBase):
554 """Base class for IPv4 socket tests."""
555
556 host = HOST
557
558 def setUp(self):
559 super().setUp()
560 self.port = self.serv_addr[1]
561
562 def bindSock(self, sock):
563 support.bind_port(sock, host=self.host)
564
565class TCPTestBase(InetTestBase):
566 """Base class for TCP-over-IPv4 tests."""
567
568 def newSocket(self):
569 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
570
571class UDPTestBase(InetTestBase):
572 """Base class for UDP-over-IPv4 tests."""
573
574 def newSocket(self):
575 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
576
577class SCTPStreamBase(InetTestBase):
578 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
579
580 def newSocket(self):
581 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
582 socket.IPPROTO_SCTP)
583
584
585class Inet6TestBase(InetTestBase):
586 """Base class for IPv6 socket tests."""
587
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200588 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000589
590class UDP6TestBase(Inet6TestBase):
591 """Base class for UDP-over-IPv6 tests."""
592
593 def newSocket(self):
594 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
595
596
597# Test-skipping decorators for use with ThreadableTest.
598
599def skipWithClientIf(condition, reason):
600 """Skip decorated test if condition is true, add client_skip decorator.
601
602 If the decorated object is not a class, sets its attribute
603 "client_skip" to a decorator which will return an empty function
604 if the test is to be skipped, or the original function if it is
605 not. This can be used to avoid running the client part of a
606 skipped test when using ThreadableTest.
607 """
608 def client_pass(*args, **kwargs):
609 pass
610 def skipdec(obj):
611 retval = unittest.skip(reason)(obj)
612 if not isinstance(obj, type):
613 retval.client_skip = lambda f: client_pass
614 return retval
615 def noskipdec(obj):
616 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
617 obj.client_skip = lambda f: f
618 return obj
619 return skipdec if condition else noskipdec
620
621
622def requireAttrs(obj, *attributes):
623 """Skip decorated test if obj is missing any of the given attributes.
624
625 Sets client_skip attribute as skipWithClientIf() does.
626 """
627 missing = [name for name in attributes if not hasattr(obj, name)]
628 return skipWithClientIf(
629 missing, "don't have " + ", ".join(name for name in missing))
630
631
632def requireSocket(*args):
633 """Skip decorated test if a socket cannot be created with given arguments.
634
635 When an argument is given as a string, will use the value of that
636 attribute of the socket module, or skip the test if it doesn't
637 exist. Sets client_skip attribute as skipWithClientIf() does.
638 """
639 err = None
640 missing = [obj for obj in args if
641 isinstance(obj, str) and not hasattr(socket, obj)]
642 if missing:
643 err = "don't have " + ", ".join(name for name in missing)
644 else:
645 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
646 for obj in args]
647 try:
648 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200649 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000650 # XXX: check errno?
651 err = str(e)
652 else:
653 s.close()
654 return skipWithClientIf(
655 err is not None,
656 "can't create socket({0}): {1}".format(
657 ", ".join(str(o) for o in args), err))
658
659
Guido van Rossum24e4af82002-06-12 19:18:08 +0000660#######################################################################
661## Begin Tests
662
663class GeneralModuleTests(unittest.TestCase):
664
Ethan Furman7184bac2014-10-14 18:56:53 -0700665 def test_SocketType_is_socketobject(self):
666 import _socket
667 self.assertTrue(socket.SocketType is _socket.socket)
668 s = socket.socket()
669 self.assertIsInstance(s, socket.SocketType)
670 s.close()
671
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000672 def test_repr(self):
673 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200674 with s:
675 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000676 self.assertIn('family=%s' % socket.AF_INET, repr(s))
677 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200678 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200679 self.assertNotIn('raddr', repr(s))
680 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200681 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200682 self.assertIn(str(s.getsockname()), repr(s))
683 self.assertIn('[closed]', repr(s))
684 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000685
Victor Stinnere254e532014-07-26 14:36:55 +0200686 @unittest.skipUnless(_socket is not None, 'need _socket module')
687 def test_csocket_repr(self):
688 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
689 try:
690 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
691 % (s.fileno(), s.family, s.type, s.proto))
692 self.assertEqual(repr(s), expected)
693 finally:
694 s.close()
695 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
696 % (s.family, s.type, s.proto))
697 self.assertEqual(repr(s), expected)
698
Raymond Hettinger027bb632004-05-31 03:09:25 +0000699 def test_weakref(self):
700 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
701 p = proxy(s)
702 self.assertEqual(p.fileno(), s.fileno())
703 s.close()
704 s = None
705 try:
706 p.fileno()
707 except ReferenceError:
708 pass
709 else:
710 self.fail('Socket proxy still exists')
711
Guido van Rossum24e4af82002-06-12 19:18:08 +0000712 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000713 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300714 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200715 with self.assertRaises(OSError, msg=msg % 'OSError'):
716 raise OSError
717 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000718 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200719 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000720 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000721
Ezio Melotti63e42302011-05-07 19:47:48 +0300722 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000723 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300724 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
725 self.addCleanup(s.close)
726 s.bind(('', 0))
727 sockname = s.getsockname()
728 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300729 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300730 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300731 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400732 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300733 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300734 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300735 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400736 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300737 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300738 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300739 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300740 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300741 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300742 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300743 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400744 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300745 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300746 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300747 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400748 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300749 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300750 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300751 self.assertIn('not NoneType', str(cm.exception))
752 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300753 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300754 self.assertIn('an integer is required', str(cm.exception))
755 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300756 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300757 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300758 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300759 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300760 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300761 self.assertIn('(1 given)', str(cm.exception))
762 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300763 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300764 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300765
Guido van Rossum24e4af82002-06-12 19:18:08 +0000766 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000767 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000768 socket.AF_INET
769 socket.SOCK_STREAM
770 socket.SOCK_DGRAM
771 socket.SOCK_RAW
772 socket.SOCK_RDM
773 socket.SOCK_SEQPACKET
774 socket.SOL_SOCKET
775 socket.SO_REUSEADDR
776
Guido van Rossum654c11e2002-06-13 20:24:17 +0000777 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000778 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000779 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000780 try:
781 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200782 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000783 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600784 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000785 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000786 try:
787 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200788 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000789 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600790 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000791 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000792 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000793 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000794 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000795
Charles-François Natali0cc86852013-09-13 19:53:08 +0200796 def test_host_resolution(self):
797 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
798 '1:1:1:1:1:1:1:1:1']:
799 self.assertRaises(OSError, socket.gethostbyname, addr)
800 self.assertRaises(OSError, socket.gethostbyaddr, addr)
801
802 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
803 self.assertEqual(socket.gethostbyname(addr), addr)
804
805 # we don't test support.HOSTv6 because there's a chance it doesn't have
806 # a matching name entry (e.g. 'ip6-localhost')
807 for host in [support.HOST]:
808 self.assertIn(host, socket.gethostbyaddr(host)[2])
809
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000810 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
811 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
812 def test_sethostname(self):
813 oldhn = socket.gethostname()
814 try:
815 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200816 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000817 if e.errno == errno.EPERM:
818 self.skipTest("test should be run as root")
819 else:
820 raise
821 try:
822 # running test as root!
823 self.assertEqual(socket.gethostname(), 'new')
824 # Should work with bytes objects too
825 socket.sethostname(b'bar')
826 self.assertEqual(socket.gethostname(), 'bar')
827 finally:
828 socket.sethostname(oldhn)
829
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700830 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
831 'socket.if_nameindex() not available.')
832 def testInterfaceNameIndex(self):
833 interfaces = socket.if_nameindex()
834 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200835 self.assertIsInstance(index, int)
836 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700837 # interface indices are non-zero integers
838 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200839 _index = socket.if_nametoindex(name)
840 self.assertIsInstance(_index, int)
841 self.assertEqual(index, _index)
842 _name = socket.if_indextoname(index)
843 self.assertIsInstance(_name, str)
844 self.assertEqual(name, _name)
845
846 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
847 'socket.if_nameindex() not available.')
848 def testInvalidInterfaceNameIndex(self):
849 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200850 self.assertRaises(OSError, socket.if_indextoname, 0)
851 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200852 # test with invalid values
853 self.assertRaises(TypeError, socket.if_nametoindex, 0)
854 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700855
Serhiy Storchaka43767632013-11-03 21:31:38 +0200856 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
857 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000858 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000859 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200860 try:
861 # On some versions, this loses a reference
862 orig = sys.getrefcount(__name__)
863 socket.getnameinfo(__name__,0)
864 except TypeError:
865 if sys.getrefcount(__name__) != orig:
866 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000867
Guido van Rossum24e4af82002-06-12 19:18:08 +0000868 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000869 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870 try:
871 # On some versions, this crashes the interpreter.
872 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200873 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000874 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000875
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000876 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000877 # This just checks that htons etc. are their own inverse,
878 # when looking at the lower 16 or 32 bits.
879 sizes = {socket.htonl: 32, socket.ntohl: 32,
880 socket.htons: 16, socket.ntohs: 16}
881 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000882 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000883 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
884 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000885
Guido van Rossuma2627af2002-09-14 00:58:46 +0000886 swapped = func(mask)
887 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000888 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000889
Guido van Rossum018919a2007-01-15 00:07:32 +0000890 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000891 good_values = [ 1, 2, 3, 1, 2, 3 ]
892 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000893 for k in good_values:
894 socket.ntohl(k)
895 socket.ntohs(k)
896 socket.htonl(k)
897 socket.htons(k)
898 for k in bad_values:
899 self.assertRaises(OverflowError, socket.ntohl, k)
900 self.assertRaises(OverflowError, socket.ntohs, k)
901 self.assertRaises(OverflowError, socket.htonl, k)
902 self.assertRaises(OverflowError, socket.htons, k)
903
Barry Warsaw11b91a02004-06-28 00:50:43 +0000904 def testGetServBy(self):
905 eq = self.assertEqual
906 # Find one service that exists, then check all the related interfaces.
907 # I've ordered this by protocols that have both a tcp and udp
908 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200909 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200910 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000911 # avoid the 'echo' service on this platform, as there is an
912 # assumption breaking non-standard port/protocol entry
913 services = ('daytime', 'qotd', 'domain')
914 else:
915 services = ('echo', 'daytime', 'domain')
916 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000917 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000918 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000919 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200920 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000921 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000922 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200923 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000924 # Try same call with optional protocol omitted
925 port2 = socket.getservbyname(service)
926 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400927 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000928 try:
929 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200930 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000931 udpport = None
932 else:
933 eq(udpport, port)
934 # Now make sure the lookup by port returns the same service name
935 eq(socket.getservbyport(port2), service)
936 eq(socket.getservbyport(port, 'tcp'), service)
937 if udpport is not None:
938 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000939 # Make sure getservbyport does not accept out of range ports.
940 self.assertRaises(OverflowError, socket.getservbyport, -1)
941 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000942
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000943 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000944 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000945 # The default timeout should initially be None
946 self.assertEqual(socket.getdefaulttimeout(), None)
947 s = socket.socket()
948 self.assertEqual(s.gettimeout(), None)
949 s.close()
950
951 # Set the default timeout to 10, and see if it propagates
952 socket.setdefaulttimeout(10)
953 self.assertEqual(socket.getdefaulttimeout(), 10)
954 s = socket.socket()
955 self.assertEqual(s.gettimeout(), 10)
956 s.close()
957
958 # Reset the default timeout to None, and see if it propagates
959 socket.setdefaulttimeout(None)
960 self.assertEqual(socket.getdefaulttimeout(), None)
961 s = socket.socket()
962 self.assertEqual(s.gettimeout(), None)
963 s.close()
964
965 # Check that setting it to an invalid value raises ValueError
966 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
967
968 # Check that setting it to an invalid type raises TypeError
969 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
970
Serhiy Storchaka43767632013-11-03 21:31:38 +0200971 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
972 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000973 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000974 # Test that issue1008086 and issue767150 are fixed.
975 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000976 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
977 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000978
Serhiy Storchaka43767632013-11-03 21:31:38 +0200979 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
980 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000981 def testIPv4toString(self):
982 from socket import inet_aton as f, inet_pton, AF_INET
983 g = lambda a: inet_pton(AF_INET, a)
984
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100985 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200986 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100987 )
988
Ezio Melottib3aedd42010-11-20 19:04:17 +0000989 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
990 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
991 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
992 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
993 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100994 assertInvalid(f, '0.0.0.')
995 assertInvalid(f, '300.0.0.0')
996 assertInvalid(f, 'a.0.0.0')
997 assertInvalid(f, '1.2.3.4.5')
998 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000999
Ezio Melottib3aedd42010-11-20 19:04:17 +00001000 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1001 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1002 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1003 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001004 assertInvalid(g, '0.0.0.')
1005 assertInvalid(g, '300.0.0.0')
1006 assertInvalid(g, 'a.0.0.0')
1007 assertInvalid(g, '1.2.3.4.5')
1008 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001009
Serhiy Storchaka43767632013-11-03 21:31:38 +02001010 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1011 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001012 def testIPv6toString(self):
1013 try:
1014 from socket import inet_pton, AF_INET6, has_ipv6
1015 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001016 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001017 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001018 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001019
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001020 if sys.platform == "win32":
1021 try:
1022 inet_pton(AF_INET6, '::')
1023 except OSError as e:
1024 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001025 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001026
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001027 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001028 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001029 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001030 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001031
Ezio Melottib3aedd42010-11-20 19:04:17 +00001032 self.assertEqual(b'\x00' * 16, f('::'))
1033 self.assertEqual(b'\x00' * 16, f('0::0'))
1034 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1035 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001036 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 +00001037 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1038 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001039 self.assertEqual(
1040 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1041 f('ad42:abc::127:0:254:2')
1042 )
1043 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1044 assertInvalid('0x20::')
1045 assertInvalid(':::')
1046 assertInvalid('::0::')
1047 assertInvalid('1::abc::')
1048 assertInvalid('1::abc::def')
1049 assertInvalid('1:2:3:4:5:6:')
1050 assertInvalid('1:2:3:4:5:6')
1051 assertInvalid('1:2:3:4:5:6:7:8:')
1052 assertInvalid('1:2:3:4:5:6:7:8:0')
1053
1054 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1055 f('::254.42.23.64')
1056 )
1057 self.assertEqual(
1058 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1059 f('42::a29b:254.42.23.64')
1060 )
1061 self.assertEqual(
1062 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1063 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1064 )
1065 assertInvalid('255.254.253.252')
1066 assertInvalid('1::260.2.3.0')
1067 assertInvalid('1::0.be.e.0')
1068 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1069 assertInvalid('::1.2.3.4:0')
1070 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001071
Serhiy Storchaka43767632013-11-03 21:31:38 +02001072 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1073 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001074 def testStringToIPv4(self):
1075 from socket import inet_ntoa as f, inet_ntop, AF_INET
1076 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001077 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001078 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001079 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001080
Ezio Melottib3aedd42010-11-20 19:04:17 +00001081 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1082 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1083 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1084 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001085 assertInvalid(f, b'\x00' * 3)
1086 assertInvalid(f, b'\x00' * 5)
1087 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001088 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001089
Ezio Melottib3aedd42010-11-20 19:04:17 +00001090 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1091 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1092 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001093 assertInvalid(g, b'\x00' * 3)
1094 assertInvalid(g, b'\x00' * 5)
1095 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001096 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001097
Serhiy Storchaka43767632013-11-03 21:31:38 +02001098 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1099 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001100 def testStringToIPv6(self):
1101 try:
1102 from socket import inet_ntop, AF_INET6, has_ipv6
1103 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001104 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001105 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001106 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001107
1108 if sys.platform == "win32":
1109 try:
1110 inet_ntop(AF_INET6, b'\x00' * 16)
1111 except OSError as e:
1112 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001113 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001114
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001115 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001116 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001117 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001118 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001119
Ezio Melottib3aedd42010-11-20 19:04:17 +00001120 self.assertEqual('::', f(b'\x00' * 16))
1121 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1122 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001123 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001124 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 +00001125 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001126 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001127
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001128 assertInvalid(b'\x12' * 15)
1129 assertInvalid(b'\x12' * 17)
1130 assertInvalid(b'\x12' * 4)
1131
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001132 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001133
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001134 def testSockName(self):
1135 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001136 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001137 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001138 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001139 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001140 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001141 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1142 # it reasonable to get the host's addr in addition to 0.0.0.0.
1143 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001144 try:
1145 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001146 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001147 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001148 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001149 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001150 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001151
1152 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001153 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001154 # We know a socket should start without reuse==0
1155 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001156 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001157 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001158 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001159
1160 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001161 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001162 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001163 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001164 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1165 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001166 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001167
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001168 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001169 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001170 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1171 sock.settimeout(1)
1172 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001173 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001174
Martin Panter50ab1a32016-04-11 00:38:12 +00001175 def testCloseException(self):
1176 sock = socket.socket()
1177 socket.socket(fileno=sock.fileno()).close()
1178 try:
1179 sock.close()
1180 except OSError as err:
1181 # Winsock apparently raises ENOTSOCK
1182 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1183 else:
1184 self.fail("close() should raise EBADF/ENOTSOCK")
1185
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001186 def testNewAttributes(self):
1187 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001188
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001189 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1190 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001191 if hasattr(socket, 'SOCK_CLOEXEC'):
1192 self.assertIn(sock.type,
1193 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1194 socket.SOCK_STREAM))
1195 else:
1196 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001197 self.assertEqual(sock.proto, 0)
1198 sock.close()
1199
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001200 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001201 sock = socket.socket()
1202 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001203 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001204 big_port = port + 65536
1205 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001206 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1207 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1208 # Since find_unused_port() is inherently subject to race conditions, we
1209 # call it a couple times if necessary.
1210 for i in itertools.count():
1211 port = support.find_unused_port()
1212 try:
1213 sock.bind((HOST, port))
1214 except OSError as e:
1215 if e.errno != errno.EADDRINUSE or i == 5:
1216 raise
1217 else:
1218 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001219
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001220 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001221 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001222 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1223 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1224 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1225 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001226 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1227 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001228 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001229 self.assertRaises(ValueError, s.ioctl, -1, None)
1230 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001231
Steve Dowerea93ac02016-06-17 12:52:18 -07001232 @unittest.skipUnless(os.name == "nt", "Windows specific")
1233 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1234 'Loopback fast path support required for this test')
1235 def test_sio_loopback_fast_path(self):
1236 s = socket.socket()
1237 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001238 try:
1239 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1240 except OSError as exc:
1241 WSAEOPNOTSUPP = 10045
1242 if exc.winerror == WSAEOPNOTSUPP:
1243 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1244 "doesn't implemented in this Windows version")
1245 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001246 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1247
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001248 def testGetaddrinfo(self):
1249 try:
1250 socket.getaddrinfo('localhost', 80)
1251 except socket.gaierror as err:
1252 if err.errno == socket.EAI_SERVICE:
1253 # see http://bugs.python.org/issue1282647
1254 self.skipTest("buggy libc version")
1255 raise
1256 # len of every sequence is supposed to be == 5
1257 for info in socket.getaddrinfo(HOST, None):
1258 self.assertEqual(len(info), 5)
1259 # host can be a domain name, a string representation of an
1260 # IPv4/v6 address or None
1261 socket.getaddrinfo('localhost', 80)
1262 socket.getaddrinfo('127.0.0.1', 80)
1263 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001264 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001265 socket.getaddrinfo('::1', 80)
1266 # port can be a string service name such as "http", a numeric
1267 # port number or None
1268 socket.getaddrinfo(HOST, "http")
1269 socket.getaddrinfo(HOST, 80)
1270 socket.getaddrinfo(HOST, None)
1271 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001272 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1273 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001274 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001275 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1276 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001277 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001278 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1279 for _, socktype, _, _, _ in infos:
1280 self.assertEqual(socktype, socket.SOCK_STREAM)
1281 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001282 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001283 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1284 # a server willing to support both IPv4 and IPv6 will
1285 # usually do this
1286 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1287 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001288 # test keyword arguments
1289 a = socket.getaddrinfo(HOST, None)
1290 b = socket.getaddrinfo(host=HOST, port=None)
1291 self.assertEqual(a, b)
1292 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1293 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1294 self.assertEqual(a, b)
1295 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1296 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1297 self.assertEqual(a, b)
1298 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1299 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1300 self.assertEqual(a, b)
1301 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1302 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1303 self.assertEqual(a, b)
1304 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1305 socket.AI_PASSIVE)
1306 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1307 type=socket.SOCK_STREAM, proto=0,
1308 flags=socket.AI_PASSIVE)
1309 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001310 # Issue #6697.
1311 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001312
Ned Deilyb24f4812014-02-13 22:50:42 -08001313 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001314 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001315 try:
1316 # The arguments here are undefined and the call may succeed
1317 # or fail. All we care here is that it doesn't segfault.
1318 socket.getaddrinfo("localhost", None, 0, 0, 0,
1319 socket.AI_NUMERICSERV)
1320 except socket.gaierror:
1321 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001322
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001323 def test_getnameinfo(self):
1324 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001325 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001326
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001327 @unittest.skipUnless(support.is_resource_enabled('network'),
1328 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001329 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001330 # Check for internet access before running test
1331 # (issue #12804, issue #25138).
1332 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001333 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001334
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001335 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001336 domain = 'испытание.pythontest.net'
1337 socket.gethostbyname(domain)
1338 socket.gethostbyname_ex(domain)
1339 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001340 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1341 # have a reverse entry yet
1342 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001343
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001344 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001345 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001346 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1347 self.skipTest("signal.alarm and socket.socketpair required for this test")
1348 # Our signal handlers clobber the C errno by calling a math function
1349 # with an invalid domain value.
1350 def ok_handler(*args):
1351 self.assertRaises(ValueError, math.acosh, 0)
1352 def raising_handler(*args):
1353 self.assertRaises(ValueError, math.acosh, 0)
1354 1 // 0
1355 c, s = socket.socketpair()
1356 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1357 try:
1358 if with_timeout:
1359 # Just above the one second minimum for signal.alarm
1360 c.settimeout(1.5)
1361 with self.assertRaises(ZeroDivisionError):
1362 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001363 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001364 if with_timeout:
1365 signal.signal(signal.SIGALRM, ok_handler)
1366 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001367 self.assertRaises(socket.timeout, c.sendall,
1368 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001369 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001370 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001371 signal.signal(signal.SIGALRM, old_alarm)
1372 c.close()
1373 s.close()
1374
1375 def test_sendall_interrupted(self):
1376 self.check_sendall_interrupted(False)
1377
1378 def test_sendall_interrupted_with_timeout(self):
1379 self.check_sendall_interrupted(True)
1380
Antoine Pitroue033e062010-10-29 10:38:18 +00001381 def test_dealloc_warn(self):
1382 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1383 r = repr(sock)
1384 with self.assertWarns(ResourceWarning) as cm:
1385 sock = None
1386 support.gc_collect()
1387 self.assertIn(r, str(cm.warning.args[0]))
1388 # An open socket file object gets dereferenced after the socket
1389 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1390 f = sock.makefile('rb')
1391 r = repr(sock)
1392 sock = None
1393 support.gc_collect()
1394 with self.assertWarns(ResourceWarning):
1395 f = None
1396 support.gc_collect()
1397
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001398 def test_name_closed_socketio(self):
1399 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1400 fp = sock.makefile("rb")
1401 fp.close()
1402 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1403
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001404 def test_unusable_closed_socketio(self):
1405 with socket.socket() as sock:
1406 fp = sock.makefile("rb", buffering=0)
1407 self.assertTrue(fp.readable())
1408 self.assertFalse(fp.writable())
1409 self.assertFalse(fp.seekable())
1410 fp.close()
1411 self.assertRaises(ValueError, fp.readable)
1412 self.assertRaises(ValueError, fp.writable)
1413 self.assertRaises(ValueError, fp.seekable)
1414
Berker Peksag3fe64d02016-02-18 17:34:00 +02001415 def test_makefile_mode(self):
1416 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1417 with self.subTest(mode=mode):
1418 with socket.socket() as sock:
1419 with sock.makefile(mode) as fp:
1420 self.assertEqual(fp.mode, mode)
1421
1422 def test_makefile_invalid_mode(self):
1423 for mode in 'rt', 'x', '+', 'a':
1424 with self.subTest(mode=mode):
1425 with socket.socket() as sock:
1426 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1427 sock.makefile(mode)
1428
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001429 def test_pickle(self):
1430 sock = socket.socket()
1431 with sock:
1432 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1433 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001434 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1435 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1436 self.assertEqual(family, socket.AF_INET)
1437 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1438 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001439
Serhiy Storchaka78980432013-01-15 01:12:17 +02001440 def test_listen_backlog(self):
1441 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001442 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1443 srv.bind((HOST, 0))
1444 srv.listen(backlog)
1445
1446 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001447 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001448 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001449
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001450 @support.cpython_only
1451 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001452 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001453 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001454 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1455 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001456 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001457 srv.close()
1458
Charles-François Natali42663332012-01-02 15:57:30 +01001459 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001460 def test_flowinfo(self):
1461 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001462 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001463 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001464 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001465
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001466 def test_str_for_enums(self):
1467 # Make sure that the AF_* and SOCK_* constants have enum-like string
1468 # reprs.
1469 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1470 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001471 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001472
1473 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1474 def test_uknown_socket_family_repr(self):
1475 # Test that when created with a family that's not one of the known
1476 # AF_*/SOCK_* constants, socket.family just returns the number.
1477 #
1478 # To do this we fool socket.socket into believing it already has an
1479 # open fd because on this path it doesn't actually verify the family and
1480 # type and populates the socket object.
1481 #
1482 # On Windows this trick won't work, so the test is skipped.
1483 fd, _ = tempfile.mkstemp()
1484 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1485 self.assertEqual(s.family, 42424)
1486 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001487
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001488 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1489 def test__sendfile_use_sendfile(self):
1490 class File:
1491 def __init__(self, fd):
1492 self.fd = fd
1493
1494 def fileno(self):
1495 return self.fd
1496 with socket.socket() as sock:
1497 fd = os.open(os.curdir, os.O_RDONLY)
1498 os.close(fd)
1499 with self.assertRaises(socket._GiveupOnSendfile):
1500 sock._sendfile_use_sendfile(File(fd))
1501 with self.assertRaises(OverflowError):
1502 sock._sendfile_use_sendfile(File(2**1000))
1503 with self.assertRaises(TypeError):
1504 sock._sendfile_use_sendfile(File(None))
1505
1506
Charles-François Natali47413c12011-10-06 19:47:44 +02001507@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1508class BasicCANTest(unittest.TestCase):
1509
1510 def testCrucialConstants(self):
1511 socket.AF_CAN
1512 socket.PF_CAN
1513 socket.CAN_RAW
1514
Charles-François Natali773e42d2013-02-05 19:42:01 +01001515 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1516 'socket.CAN_BCM required for this test.')
1517 def testBCMConstants(self):
1518 socket.CAN_BCM
1519
1520 # opcodes
1521 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1522 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1523 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1524 socket.CAN_BCM_TX_SEND # send one CAN frame
1525 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1526 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1527 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1528 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1529 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1530 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1531 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1532 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1533
Charles-François Natali47413c12011-10-06 19:47:44 +02001534 def testCreateSocket(self):
1535 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1536 pass
1537
Charles-François Natali773e42d2013-02-05 19:42:01 +01001538 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1539 'socket.CAN_BCM required for this test.')
1540 def testCreateBCMSocket(self):
1541 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1542 pass
1543
Charles-François Natali47413c12011-10-06 19:47:44 +02001544 def testBindAny(self):
1545 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1546 s.bind(('', ))
1547
1548 def testTooLongInterfaceName(self):
1549 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1550 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001551 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001552 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001553
1554 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1555 'socket.CAN_RAW_LOOPBACK required for this test.')
1556 def testLoopback(self):
1557 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1558 for loopback in (0, 1):
1559 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1560 loopback)
1561 self.assertEqual(loopback,
1562 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1563
1564 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1565 'socket.CAN_RAW_FILTER required for this test.')
1566 def testFilter(self):
1567 can_id, can_mask = 0x200, 0x700
1568 can_filter = struct.pack("=II", can_id, can_mask)
1569 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1570 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1571 self.assertEqual(can_filter,
1572 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001573 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001574
1575
1576@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001577@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001578class CANTest(ThreadedCANSocketTest):
1579
Charles-François Natali47413c12011-10-06 19:47:44 +02001580 def __init__(self, methodName='runTest'):
1581 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1582
1583 @classmethod
1584 def build_can_frame(cls, can_id, data):
1585 """Build a CAN frame."""
1586 can_dlc = len(data)
1587 data = data.ljust(8, b'\x00')
1588 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1589
1590 @classmethod
1591 def dissect_can_frame(cls, frame):
1592 """Dissect a CAN frame."""
1593 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1594 return (can_id, can_dlc, data[:can_dlc])
1595
1596 def testSendFrame(self):
1597 cf, addr = self.s.recvfrom(self.bufsize)
1598 self.assertEqual(self.cf, cf)
1599 self.assertEqual(addr[0], self.interface)
1600 self.assertEqual(addr[1], socket.AF_CAN)
1601
1602 def _testSendFrame(self):
1603 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1604 self.cli.send(self.cf)
1605
1606 def testSendMaxFrame(self):
1607 cf, addr = self.s.recvfrom(self.bufsize)
1608 self.assertEqual(self.cf, cf)
1609
1610 def _testSendMaxFrame(self):
1611 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1612 self.cli.send(self.cf)
1613
1614 def testSendMultiFrames(self):
1615 cf, addr = self.s.recvfrom(self.bufsize)
1616 self.assertEqual(self.cf1, cf)
1617
1618 cf, addr = self.s.recvfrom(self.bufsize)
1619 self.assertEqual(self.cf2, cf)
1620
1621 def _testSendMultiFrames(self):
1622 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1623 self.cli.send(self.cf1)
1624
1625 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1626 self.cli.send(self.cf2)
1627
Charles-François Natali773e42d2013-02-05 19:42:01 +01001628 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1629 'socket.CAN_BCM required for this test.')
1630 def _testBCM(self):
1631 cf, addr = self.cli.recvfrom(self.bufsize)
1632 self.assertEqual(self.cf, cf)
1633 can_id, can_dlc, data = self.dissect_can_frame(cf)
1634 self.assertEqual(self.can_id, can_id)
1635 self.assertEqual(self.data, data)
1636
1637 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1638 'socket.CAN_BCM required for this test.')
1639 def testBCM(self):
1640 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1641 self.addCleanup(bcm.close)
1642 bcm.connect((self.interface,))
1643 self.can_id = 0x123
1644 self.data = bytes([0xc0, 0xff, 0xee])
1645 self.cf = self.build_can_frame(self.can_id, self.data)
1646 opcode = socket.CAN_BCM_TX_SEND
1647 flags = 0
1648 count = 0
1649 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1650 bcm_can_id = 0x0222
1651 nframes = 1
1652 assert len(self.cf) == 16
1653 header = struct.pack(self.bcm_cmd_msg_fmt,
1654 opcode,
1655 flags,
1656 count,
1657 ival1_seconds,
1658 ival1_usec,
1659 ival2_seconds,
1660 ival2_usec,
1661 bcm_can_id,
1662 nframes,
1663 )
1664 header_plus_frame = header + self.cf
1665 bytes_sent = bcm.send(header_plus_frame)
1666 self.assertEqual(bytes_sent, len(header_plus_frame))
1667
Charles-François Natali47413c12011-10-06 19:47:44 +02001668
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001669@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1670class BasicRDSTest(unittest.TestCase):
1671
1672 def testCrucialConstants(self):
1673 socket.AF_RDS
1674 socket.PF_RDS
1675
1676 def testCreateSocket(self):
1677 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1678 pass
1679
1680 def testSocketBufferSize(self):
1681 bufsize = 16384
1682 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1683 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1684 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1685
1686
1687@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1688@unittest.skipUnless(thread, 'Threading required for this test.')
1689class RDSTest(ThreadedRDSSocketTest):
1690
1691 def __init__(self, methodName='runTest'):
1692 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1693
Charles-François Natali240c55f2011-11-10 20:33:36 +01001694 def setUp(self):
1695 super().setUp()
1696 self.evt = threading.Event()
1697
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001698 def testSendAndRecv(self):
1699 data, addr = self.serv.recvfrom(self.bufsize)
1700 self.assertEqual(self.data, data)
1701 self.assertEqual(self.cli_addr, addr)
1702
1703 def _testSendAndRecv(self):
1704 self.data = b'spam'
1705 self.cli.sendto(self.data, 0, (HOST, self.port))
1706
1707 def testPeek(self):
1708 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1709 self.assertEqual(self.data, data)
1710 data, addr = self.serv.recvfrom(self.bufsize)
1711 self.assertEqual(self.data, data)
1712
1713 def _testPeek(self):
1714 self.data = b'spam'
1715 self.cli.sendto(self.data, 0, (HOST, self.port))
1716
1717 @requireAttrs(socket.socket, 'recvmsg')
1718 def testSendAndRecvMsg(self):
1719 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1720 self.assertEqual(self.data, data)
1721
1722 @requireAttrs(socket.socket, 'sendmsg')
1723 def _testSendAndRecvMsg(self):
1724 self.data = b'hello ' * 10
1725 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1726
1727 def testSendAndRecvMulti(self):
1728 data, addr = self.serv.recvfrom(self.bufsize)
1729 self.assertEqual(self.data1, data)
1730
1731 data, addr = self.serv.recvfrom(self.bufsize)
1732 self.assertEqual(self.data2, data)
1733
1734 def _testSendAndRecvMulti(self):
1735 self.data1 = b'bacon'
1736 self.cli.sendto(self.data1, 0, (HOST, self.port))
1737
1738 self.data2 = b'egg'
1739 self.cli.sendto(self.data2, 0, (HOST, self.port))
1740
1741 def testSelect(self):
1742 r, w, x = select.select([self.serv], [], [], 3.0)
1743 self.assertIn(self.serv, r)
1744 data, addr = self.serv.recvfrom(self.bufsize)
1745 self.assertEqual(self.data, data)
1746
1747 def _testSelect(self):
1748 self.data = b'select'
1749 self.cli.sendto(self.data, 0, (HOST, self.port))
1750
1751 def testCongestion(self):
1752 # wait until the sender is done
1753 self.evt.wait()
1754
1755 def _testCongestion(self):
1756 # test the behavior in case of congestion
1757 self.data = b'fill'
1758 self.cli.setblocking(False)
1759 try:
1760 # try to lower the receiver's socket buffer size
1761 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1762 except OSError:
1763 pass
1764 with self.assertRaises(OSError) as cm:
1765 try:
1766 # fill the receiver's socket buffer
1767 while True:
1768 self.cli.sendto(self.data, 0, (HOST, self.port))
1769 finally:
1770 # signal the receiver we're done
1771 self.evt.set()
1772 # sendto() should have failed with ENOBUFS
1773 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1774 # and we should have received a congestion notification through poll
1775 r, w, x = select.select([self.serv], [], [], 3.0)
1776 self.assertIn(self.serv, r)
1777
1778
Victor Stinner45df8202010-04-28 22:31:17 +00001779@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001780class BasicTCPTest(SocketConnectedTest):
1781
1782 def __init__(self, methodName='runTest'):
1783 SocketConnectedTest.__init__(self, methodName=methodName)
1784
1785 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001786 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001787 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001788 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001789
1790 def _testRecv(self):
1791 self.serv_conn.send(MSG)
1792
1793 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001794 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001795 seg1 = self.cli_conn.recv(len(MSG) - 3)
1796 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001797 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001798 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001799
1800 def _testOverFlowRecv(self):
1801 self.serv_conn.send(MSG)
1802
1803 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001804 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001805 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001806 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001807
1808 def _testRecvFrom(self):
1809 self.serv_conn.send(MSG)
1810
1811 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001812 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001813 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1814 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001815 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001816 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001817
1818 def _testOverFlowRecvFrom(self):
1819 self.serv_conn.send(MSG)
1820
1821 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001822 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001823 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001824 while 1:
1825 read = self.cli_conn.recv(1024)
1826 if not read:
1827 break
Guido van Rossume531e292002-08-08 20:28:34 +00001828 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001829 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001830
1831 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001832 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001833 self.serv_conn.sendall(big_chunk)
1834
1835 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001836 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001837 fd = self.cli_conn.fileno()
1838 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001839 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001840 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001841 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001842 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001843
1844 def _testFromFd(self):
1845 self.serv_conn.send(MSG)
1846
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001847 def testDup(self):
1848 # Testing dup()
1849 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001850 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001851 msg = sock.recv(1024)
1852 self.assertEqual(msg, MSG)
1853
1854 def _testDup(self):
1855 self.serv_conn.send(MSG)
1856
Guido van Rossum24e4af82002-06-12 19:18:08 +00001857 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001858 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001859 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001860 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001861 # wait for _testShutdown to finish: on OS X, when the server
1862 # closes the connection the client also becomes disconnected,
1863 # and the client's shutdown call will fail. (Issue #4397.)
1864 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001865
1866 def _testShutdown(self):
1867 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001868 self.serv_conn.shutdown(2)
1869
1870 testShutdown_overflow = support.cpython_only(testShutdown)
1871
1872 @support.cpython_only
1873 def _testShutdown_overflow(self):
1874 import _testcapi
1875 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001876 # Issue 15989
1877 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1878 _testcapi.INT_MAX + 1)
1879 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1880 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001881 self.serv_conn.shutdown(2)
1882
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001883 def testDetach(self):
1884 # Testing detach()
1885 fileno = self.cli_conn.fileno()
1886 f = self.cli_conn.detach()
1887 self.assertEqual(f, fileno)
1888 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001889 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001890 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001891 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001892 # ...but we can create another socket using the (still open)
1893 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001894 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001895 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001896 msg = sock.recv(1024)
1897 self.assertEqual(msg, MSG)
1898
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001899 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001900 self.serv_conn.send(MSG)
1901
Victor Stinner45df8202010-04-28 22:31:17 +00001902@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001903class BasicUDPTest(ThreadedUDPSocketTest):
1904
1905 def __init__(self, methodName='runTest'):
1906 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1907
1908 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001909 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001910 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001911 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001912
1913 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001914 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001915
Guido van Rossum1c938012002-06-12 21:17:20 +00001916 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001917 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001918 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001919 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001920
Guido van Rossum1c938012002-06-12 21:17:20 +00001921 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001922 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001923
Guido van Rossumd8faa362007-04-27 19:54:29 +00001924 def testRecvFromNegative(self):
1925 # Negative lengths passed to recvfrom should give ValueError.
1926 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1927
1928 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001929 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001930
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001931# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1932# same test code is used with different families and types of socket
1933# (e.g. stream, datagram), and tests using recvmsg() are repeated
1934# using recvmsg_into().
1935#
1936# The generic test classes such as SendmsgTests and
1937# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1938# supplied with sockets cli_sock and serv_sock representing the
1939# client's and the server's end of the connection respectively, and
1940# attributes cli_addr and serv_addr holding their (numeric where
1941# appropriate) addresses.
1942#
1943# The final concrete test classes combine these with subclasses of
1944# SocketTestBase which set up client and server sockets of a specific
1945# type, and with subclasses of SendrecvmsgBase such as
1946# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1947# sockets to cli_sock and serv_sock and override the methods and
1948# attributes of SendrecvmsgBase to fill in destination addresses if
1949# needed when sending, check for specific flags in msg_flags, etc.
1950#
1951# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1952# recvmsg_into().
1953
1954# XXX: like the other datagram (UDP) tests in this module, the code
1955# here assumes that datagram delivery on the local machine will be
1956# reliable.
1957
1958class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1959 # Base class for sendmsg()/recvmsg() tests.
1960
1961 # Time in seconds to wait before considering a test failed, or
1962 # None for no timeout. Not all tests actually set a timeout.
1963 fail_timeout = 3.0
1964
1965 def setUp(self):
1966 self.misc_event = threading.Event()
1967 super().setUp()
1968
1969 def sendToServer(self, msg):
1970 # Send msg to the server.
1971 return self.cli_sock.send(msg)
1972
1973 # Tuple of alternative default arguments for sendmsg() when called
1974 # via sendmsgToServer() (e.g. to include a destination address).
1975 sendmsg_to_server_defaults = ()
1976
1977 def sendmsgToServer(self, *args):
1978 # Call sendmsg() on self.cli_sock with the given arguments,
1979 # filling in any arguments which are not supplied with the
1980 # corresponding items of self.sendmsg_to_server_defaults, if
1981 # any.
1982 return self.cli_sock.sendmsg(
1983 *(args + self.sendmsg_to_server_defaults[len(args):]))
1984
1985 def doRecvmsg(self, sock, bufsize, *args):
1986 # Call recvmsg() on sock with given arguments and return its
1987 # result. Should be used for tests which can use either
1988 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1989 # this method with one which emulates it using recvmsg_into(),
1990 # thus allowing the same test to be used for both methods.
1991 result = sock.recvmsg(bufsize, *args)
1992 self.registerRecvmsgResult(result)
1993 return result
1994
1995 def registerRecvmsgResult(self, result):
1996 # Called by doRecvmsg() with the return value of recvmsg() or
1997 # recvmsg_into(). Can be overridden to arrange cleanup based
1998 # on the returned ancillary data, for instance.
1999 pass
2000
2001 def checkRecvmsgAddress(self, addr1, addr2):
2002 # Called to compare the received address with the address of
2003 # the peer.
2004 self.assertEqual(addr1, addr2)
2005
2006 # Flags that are normally unset in msg_flags
2007 msg_flags_common_unset = 0
2008 for name in ("MSG_CTRUNC", "MSG_OOB"):
2009 msg_flags_common_unset |= getattr(socket, name, 0)
2010
2011 # Flags that are normally set
2012 msg_flags_common_set = 0
2013
2014 # Flags set when a complete record has been received (e.g. MSG_EOR
2015 # for SCTP)
2016 msg_flags_eor_indicator = 0
2017
2018 # Flags set when a complete record has not been received
2019 # (e.g. MSG_TRUNC for datagram sockets)
2020 msg_flags_non_eor_indicator = 0
2021
2022 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2023 # Method to check the value of msg_flags returned by recvmsg[_into]().
2024 #
2025 # Checks that all bits in msg_flags_common_set attribute are
2026 # set in "flags" and all bits in msg_flags_common_unset are
2027 # unset.
2028 #
2029 # The "eor" argument specifies whether the flags should
2030 # indicate that a full record (or datagram) has been received.
2031 # If "eor" is None, no checks are done; otherwise, checks
2032 # that:
2033 #
2034 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2035 # set and all bits in msg_flags_non_eor_indicator are unset
2036 #
2037 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2038 # are set and all bits in msg_flags_eor_indicator are unset
2039 #
2040 # If "checkset" and/or "checkunset" are supplied, they require
2041 # the given bits to be set or unset respectively, overriding
2042 # what the attributes require for those bits.
2043 #
2044 # If any bits are set in "ignore", they will not be checked,
2045 # regardless of the other inputs.
2046 #
2047 # Will raise Exception if the inputs require a bit to be both
2048 # set and unset, and it is not ignored.
2049
2050 defaultset = self.msg_flags_common_set
2051 defaultunset = self.msg_flags_common_unset
2052
2053 if eor:
2054 defaultset |= self.msg_flags_eor_indicator
2055 defaultunset |= self.msg_flags_non_eor_indicator
2056 elif eor is not None:
2057 defaultset |= self.msg_flags_non_eor_indicator
2058 defaultunset |= self.msg_flags_eor_indicator
2059
2060 # Function arguments override defaults
2061 defaultset &= ~checkunset
2062 defaultunset &= ~checkset
2063
2064 # Merge arguments with remaining defaults, and check for conflicts
2065 checkset |= defaultset
2066 checkunset |= defaultunset
2067 inboth = checkset & checkunset & ~ignore
2068 if inboth:
2069 raise Exception("contradictory set, unset requirements for flags "
2070 "{0:#x}".format(inboth))
2071
2072 # Compare with given msg_flags value
2073 mask = (checkset | checkunset) & ~ignore
2074 self.assertEqual(flags & mask, checkset & mask)
2075
2076
2077class RecvmsgIntoMixin(SendrecvmsgBase):
2078 # Mixin to implement doRecvmsg() using recvmsg_into().
2079
2080 def doRecvmsg(self, sock, bufsize, *args):
2081 buf = bytearray(bufsize)
2082 result = sock.recvmsg_into([buf], *args)
2083 self.registerRecvmsgResult(result)
2084 self.assertGreaterEqual(result[0], 0)
2085 self.assertLessEqual(result[0], bufsize)
2086 return (bytes(buf[:result[0]]),) + result[1:]
2087
2088
2089class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2090 # Defines flags to be checked in msg_flags for datagram sockets.
2091
2092 @property
2093 def msg_flags_non_eor_indicator(self):
2094 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2095
2096
2097class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2098 # Defines flags to be checked in msg_flags for SCTP sockets.
2099
2100 @property
2101 def msg_flags_eor_indicator(self):
2102 return super().msg_flags_eor_indicator | socket.MSG_EOR
2103
2104
2105class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2106 # Base class for tests on connectionless-mode sockets. Users must
2107 # supply sockets on attributes cli and serv to be mapped to
2108 # cli_sock and serv_sock respectively.
2109
2110 @property
2111 def serv_sock(self):
2112 return self.serv
2113
2114 @property
2115 def cli_sock(self):
2116 return self.cli
2117
2118 @property
2119 def sendmsg_to_server_defaults(self):
2120 return ([], [], 0, self.serv_addr)
2121
2122 def sendToServer(self, msg):
2123 return self.cli_sock.sendto(msg, self.serv_addr)
2124
2125
2126class SendrecvmsgConnectedBase(SendrecvmsgBase):
2127 # Base class for tests on connected sockets. Users must supply
2128 # sockets on attributes serv_conn and cli_conn (representing the
2129 # connections *to* the server and the client), to be mapped to
2130 # cli_sock and serv_sock respectively.
2131
2132 @property
2133 def serv_sock(self):
2134 return self.cli_conn
2135
2136 @property
2137 def cli_sock(self):
2138 return self.serv_conn
2139
2140 def checkRecvmsgAddress(self, addr1, addr2):
2141 # Address is currently "unspecified" for a connected socket,
2142 # so we don't examine it
2143 pass
2144
2145
2146class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2147 # Base class to set a timeout on server's socket.
2148
2149 def setUp(self):
2150 super().setUp()
2151 self.serv_sock.settimeout(self.fail_timeout)
2152
2153
2154class SendmsgTests(SendrecvmsgServerTimeoutBase):
2155 # Tests for sendmsg() which can use any socket type and do not
2156 # involve recvmsg() or recvmsg_into().
2157
2158 def testSendmsg(self):
2159 # Send a simple message with sendmsg().
2160 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2161
2162 def _testSendmsg(self):
2163 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2164
2165 def testSendmsgDataGenerator(self):
2166 # Send from buffer obtained from a generator (not a sequence).
2167 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2168
2169 def _testSendmsgDataGenerator(self):
2170 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2171 len(MSG))
2172
2173 def testSendmsgAncillaryGenerator(self):
2174 # Gather (empty) ancillary data from a generator.
2175 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2176
2177 def _testSendmsgAncillaryGenerator(self):
2178 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2179 len(MSG))
2180
2181 def testSendmsgArray(self):
2182 # Send data from an array instead of the usual bytes object.
2183 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2184
2185 def _testSendmsgArray(self):
2186 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2187 len(MSG))
2188
2189 def testSendmsgGather(self):
2190 # Send message data from more than one buffer (gather write).
2191 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2192
2193 def _testSendmsgGather(self):
2194 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2195
2196 def testSendmsgBadArgs(self):
2197 # Check that sendmsg() rejects invalid arguments.
2198 self.assertEqual(self.serv_sock.recv(1000), b"done")
2199
2200 def _testSendmsgBadArgs(self):
2201 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2202 self.assertRaises(TypeError, self.sendmsgToServer,
2203 b"not in an iterable")
2204 self.assertRaises(TypeError, self.sendmsgToServer,
2205 object())
2206 self.assertRaises(TypeError, self.sendmsgToServer,
2207 [object()])
2208 self.assertRaises(TypeError, self.sendmsgToServer,
2209 [MSG, object()])
2210 self.assertRaises(TypeError, self.sendmsgToServer,
2211 [MSG], object())
2212 self.assertRaises(TypeError, self.sendmsgToServer,
2213 [MSG], [], object())
2214 self.assertRaises(TypeError, self.sendmsgToServer,
2215 [MSG], [], 0, object())
2216 self.sendToServer(b"done")
2217
2218 def testSendmsgBadCmsg(self):
2219 # Check that invalid ancillary data items are rejected.
2220 self.assertEqual(self.serv_sock.recv(1000), b"done")
2221
2222 def _testSendmsgBadCmsg(self):
2223 self.assertRaises(TypeError, self.sendmsgToServer,
2224 [MSG], [object()])
2225 self.assertRaises(TypeError, self.sendmsgToServer,
2226 [MSG], [(object(), 0, b"data")])
2227 self.assertRaises(TypeError, self.sendmsgToServer,
2228 [MSG], [(0, object(), b"data")])
2229 self.assertRaises(TypeError, self.sendmsgToServer,
2230 [MSG], [(0, 0, object())])
2231 self.assertRaises(TypeError, self.sendmsgToServer,
2232 [MSG], [(0, 0)])
2233 self.assertRaises(TypeError, self.sendmsgToServer,
2234 [MSG], [(0, 0, b"data", 42)])
2235 self.sendToServer(b"done")
2236
2237 @requireAttrs(socket, "CMSG_SPACE")
2238 def testSendmsgBadMultiCmsg(self):
2239 # Check that invalid ancillary data items are rejected when
2240 # more than one item is present.
2241 self.assertEqual(self.serv_sock.recv(1000), b"done")
2242
2243 @testSendmsgBadMultiCmsg.client_skip
2244 def _testSendmsgBadMultiCmsg(self):
2245 self.assertRaises(TypeError, self.sendmsgToServer,
2246 [MSG], [0, 0, b""])
2247 self.assertRaises(TypeError, self.sendmsgToServer,
2248 [MSG], [(0, 0, b""), object()])
2249 self.sendToServer(b"done")
2250
2251 def testSendmsgExcessCmsgReject(self):
2252 # Check that sendmsg() rejects excess ancillary data items
2253 # when the number that can be sent is limited.
2254 self.assertEqual(self.serv_sock.recv(1000), b"done")
2255
2256 def _testSendmsgExcessCmsgReject(self):
2257 if not hasattr(socket, "CMSG_SPACE"):
2258 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002259 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002260 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2261 self.assertIsNone(cm.exception.errno)
2262 self.sendToServer(b"done")
2263
2264 def testSendmsgAfterClose(self):
2265 # Check that sendmsg() fails on a closed socket.
2266 pass
2267
2268 def _testSendmsgAfterClose(self):
2269 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002270 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002271
2272
2273class SendmsgStreamTests(SendmsgTests):
2274 # Tests for sendmsg() which require a stream socket and do not
2275 # involve recvmsg() or recvmsg_into().
2276
2277 def testSendmsgExplicitNoneAddr(self):
2278 # Check that peer address can be specified as None.
2279 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2280
2281 def _testSendmsgExplicitNoneAddr(self):
2282 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2283
2284 def testSendmsgTimeout(self):
2285 # Check that timeout works with sendmsg().
2286 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2287 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2288
2289 def _testSendmsgTimeout(self):
2290 try:
2291 self.cli_sock.settimeout(0.03)
2292 with self.assertRaises(socket.timeout):
2293 while True:
2294 self.sendmsgToServer([b"a"*512])
2295 finally:
2296 self.misc_event.set()
2297
2298 # XXX: would be nice to have more tests for sendmsg flags argument.
2299
2300 # Linux supports MSG_DONTWAIT when sending, but in general, it
2301 # only works when receiving. Could add other platforms if they
2302 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002303 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002304 "MSG_DONTWAIT not known to work on this platform when "
2305 "sending")
2306 def testSendmsgDontWait(self):
2307 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2308 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2309 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2310
2311 @testSendmsgDontWait.client_skip
2312 def _testSendmsgDontWait(self):
2313 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002314 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002315 while True:
2316 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2317 self.assertIn(cm.exception.errno,
2318 (errno.EAGAIN, errno.EWOULDBLOCK))
2319 finally:
2320 self.misc_event.set()
2321
2322
2323class SendmsgConnectionlessTests(SendmsgTests):
2324 # Tests for sendmsg() which require a connectionless-mode
2325 # (e.g. datagram) socket, and do not involve recvmsg() or
2326 # recvmsg_into().
2327
2328 def testSendmsgNoDestAddr(self):
2329 # Check that sendmsg() fails when no destination address is
2330 # given for unconnected socket.
2331 pass
2332
2333 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002334 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002335 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002336 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002337 [MSG], [], 0, None)
2338
2339
2340class RecvmsgGenericTests(SendrecvmsgBase):
2341 # Tests for recvmsg() which can also be emulated using
2342 # recvmsg_into(), and can use any socket type.
2343
2344 def testRecvmsg(self):
2345 # Receive a simple message with recvmsg[_into]().
2346 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2347 self.assertEqual(msg, MSG)
2348 self.checkRecvmsgAddress(addr, self.cli_addr)
2349 self.assertEqual(ancdata, [])
2350 self.checkFlags(flags, eor=True)
2351
2352 def _testRecvmsg(self):
2353 self.sendToServer(MSG)
2354
2355 def testRecvmsgExplicitDefaults(self):
2356 # Test recvmsg[_into]() with default arguments provided explicitly.
2357 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2358 len(MSG), 0, 0)
2359 self.assertEqual(msg, MSG)
2360 self.checkRecvmsgAddress(addr, self.cli_addr)
2361 self.assertEqual(ancdata, [])
2362 self.checkFlags(flags, eor=True)
2363
2364 def _testRecvmsgExplicitDefaults(self):
2365 self.sendToServer(MSG)
2366
2367 def testRecvmsgShorter(self):
2368 # Receive a message smaller than buffer.
2369 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2370 len(MSG) + 42)
2371 self.assertEqual(msg, MSG)
2372 self.checkRecvmsgAddress(addr, self.cli_addr)
2373 self.assertEqual(ancdata, [])
2374 self.checkFlags(flags, eor=True)
2375
2376 def _testRecvmsgShorter(self):
2377 self.sendToServer(MSG)
2378
Charles-François Natali8619cd72011-10-03 19:43:15 +02002379 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2380 # datagram is received (issue #13001).
2381 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002382 def testRecvmsgTrunc(self):
2383 # Receive part of message, check for truncation indicators.
2384 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2385 len(MSG) - 3)
2386 self.assertEqual(msg, MSG[:-3])
2387 self.checkRecvmsgAddress(addr, self.cli_addr)
2388 self.assertEqual(ancdata, [])
2389 self.checkFlags(flags, eor=False)
2390
Charles-François Natali8619cd72011-10-03 19:43:15 +02002391 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002392 def _testRecvmsgTrunc(self):
2393 self.sendToServer(MSG)
2394
2395 def testRecvmsgShortAncillaryBuf(self):
2396 # Test ancillary data buffer too small to hold any ancillary data.
2397 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2398 len(MSG), 1)
2399 self.assertEqual(msg, MSG)
2400 self.checkRecvmsgAddress(addr, self.cli_addr)
2401 self.assertEqual(ancdata, [])
2402 self.checkFlags(flags, eor=True)
2403
2404 def _testRecvmsgShortAncillaryBuf(self):
2405 self.sendToServer(MSG)
2406
2407 def testRecvmsgLongAncillaryBuf(self):
2408 # Test large ancillary data buffer.
2409 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2410 len(MSG), 10240)
2411 self.assertEqual(msg, MSG)
2412 self.checkRecvmsgAddress(addr, self.cli_addr)
2413 self.assertEqual(ancdata, [])
2414 self.checkFlags(flags, eor=True)
2415
2416 def _testRecvmsgLongAncillaryBuf(self):
2417 self.sendToServer(MSG)
2418
2419 def testRecvmsgAfterClose(self):
2420 # Check that recvmsg[_into]() fails on a closed socket.
2421 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002422 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002423
2424 def _testRecvmsgAfterClose(self):
2425 pass
2426
2427 def testRecvmsgTimeout(self):
2428 # Check that timeout works.
2429 try:
2430 self.serv_sock.settimeout(0.03)
2431 self.assertRaises(socket.timeout,
2432 self.doRecvmsg, self.serv_sock, len(MSG))
2433 finally:
2434 self.misc_event.set()
2435
2436 def _testRecvmsgTimeout(self):
2437 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2438
2439 @requireAttrs(socket, "MSG_PEEK")
2440 def testRecvmsgPeek(self):
2441 # Check that MSG_PEEK in flags enables examination of pending
2442 # data without consuming it.
2443
2444 # Receive part of data with MSG_PEEK.
2445 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2446 len(MSG) - 3, 0,
2447 socket.MSG_PEEK)
2448 self.assertEqual(msg, MSG[:-3])
2449 self.checkRecvmsgAddress(addr, self.cli_addr)
2450 self.assertEqual(ancdata, [])
2451 # Ignoring MSG_TRUNC here (so this test is the same for stream
2452 # and datagram sockets). Some wording in POSIX seems to
2453 # suggest that it needn't be set when peeking, but that may
2454 # just be a slip.
2455 self.checkFlags(flags, eor=False,
2456 ignore=getattr(socket, "MSG_TRUNC", 0))
2457
2458 # Receive all data with MSG_PEEK.
2459 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2460 len(MSG), 0,
2461 socket.MSG_PEEK)
2462 self.assertEqual(msg, MSG)
2463 self.checkRecvmsgAddress(addr, self.cli_addr)
2464 self.assertEqual(ancdata, [])
2465 self.checkFlags(flags, eor=True)
2466
2467 # Check that the same data can still be received normally.
2468 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2469 self.assertEqual(msg, MSG)
2470 self.checkRecvmsgAddress(addr, self.cli_addr)
2471 self.assertEqual(ancdata, [])
2472 self.checkFlags(flags, eor=True)
2473
2474 @testRecvmsgPeek.client_skip
2475 def _testRecvmsgPeek(self):
2476 self.sendToServer(MSG)
2477
2478 @requireAttrs(socket.socket, "sendmsg")
2479 def testRecvmsgFromSendmsg(self):
2480 # Test receiving with recvmsg[_into]() when message is sent
2481 # using sendmsg().
2482 self.serv_sock.settimeout(self.fail_timeout)
2483 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2484 self.assertEqual(msg, MSG)
2485 self.checkRecvmsgAddress(addr, self.cli_addr)
2486 self.assertEqual(ancdata, [])
2487 self.checkFlags(flags, eor=True)
2488
2489 @testRecvmsgFromSendmsg.client_skip
2490 def _testRecvmsgFromSendmsg(self):
2491 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2492
2493
2494class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2495 # Tests which require a stream socket and can use either recvmsg()
2496 # or recvmsg_into().
2497
2498 def testRecvmsgEOF(self):
2499 # Receive end-of-stream indicator (b"", peer socket closed).
2500 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2501 self.assertEqual(msg, b"")
2502 self.checkRecvmsgAddress(addr, self.cli_addr)
2503 self.assertEqual(ancdata, [])
2504 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2505
2506 def _testRecvmsgEOF(self):
2507 self.cli_sock.close()
2508
2509 def testRecvmsgOverflow(self):
2510 # Receive a message in more than one chunk.
2511 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2512 len(MSG) - 3)
2513 self.checkRecvmsgAddress(addr, self.cli_addr)
2514 self.assertEqual(ancdata, [])
2515 self.checkFlags(flags, eor=False)
2516
2517 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2518 self.checkRecvmsgAddress(addr, self.cli_addr)
2519 self.assertEqual(ancdata, [])
2520 self.checkFlags(flags, eor=True)
2521
2522 msg = seg1 + seg2
2523 self.assertEqual(msg, MSG)
2524
2525 def _testRecvmsgOverflow(self):
2526 self.sendToServer(MSG)
2527
2528
2529class RecvmsgTests(RecvmsgGenericTests):
2530 # Tests for recvmsg() which can use any socket type.
2531
2532 def testRecvmsgBadArgs(self):
2533 # Check that recvmsg() rejects invalid arguments.
2534 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2535 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2536 -1, 0, 0)
2537 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2538 len(MSG), -1, 0)
2539 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2540 [bytearray(10)], 0, 0)
2541 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2542 object(), 0, 0)
2543 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2544 len(MSG), object(), 0)
2545 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2546 len(MSG), 0, object())
2547
2548 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2549 self.assertEqual(msg, MSG)
2550 self.checkRecvmsgAddress(addr, self.cli_addr)
2551 self.assertEqual(ancdata, [])
2552 self.checkFlags(flags, eor=True)
2553
2554 def _testRecvmsgBadArgs(self):
2555 self.sendToServer(MSG)
2556
2557
2558class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2559 # Tests for recvmsg_into() which can use any socket type.
2560
2561 def testRecvmsgIntoBadArgs(self):
2562 # Check that recvmsg_into() rejects invalid arguments.
2563 buf = bytearray(len(MSG))
2564 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2565 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2566 len(MSG), 0, 0)
2567 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2568 buf, 0, 0)
2569 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2570 [object()], 0, 0)
2571 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2572 [b"I'm not writable"], 0, 0)
2573 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2574 [buf, object()], 0, 0)
2575 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2576 [buf], -1, 0)
2577 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2578 [buf], object(), 0)
2579 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2580 [buf], 0, object())
2581
2582 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2583 self.assertEqual(nbytes, len(MSG))
2584 self.assertEqual(buf, bytearray(MSG))
2585 self.checkRecvmsgAddress(addr, self.cli_addr)
2586 self.assertEqual(ancdata, [])
2587 self.checkFlags(flags, eor=True)
2588
2589 def _testRecvmsgIntoBadArgs(self):
2590 self.sendToServer(MSG)
2591
2592 def testRecvmsgIntoGenerator(self):
2593 # Receive into buffer obtained from a generator (not a sequence).
2594 buf = bytearray(len(MSG))
2595 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2596 (o for o in [buf]))
2597 self.assertEqual(nbytes, len(MSG))
2598 self.assertEqual(buf, bytearray(MSG))
2599 self.checkRecvmsgAddress(addr, self.cli_addr)
2600 self.assertEqual(ancdata, [])
2601 self.checkFlags(flags, eor=True)
2602
2603 def _testRecvmsgIntoGenerator(self):
2604 self.sendToServer(MSG)
2605
2606 def testRecvmsgIntoArray(self):
2607 # Receive into an array rather than the usual bytearray.
2608 buf = array.array("B", [0] * len(MSG))
2609 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2610 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002611 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002612 self.checkRecvmsgAddress(addr, self.cli_addr)
2613 self.assertEqual(ancdata, [])
2614 self.checkFlags(flags, eor=True)
2615
2616 def _testRecvmsgIntoArray(self):
2617 self.sendToServer(MSG)
2618
2619 def testRecvmsgIntoScatter(self):
2620 # Receive into multiple buffers (scatter write).
2621 b1 = bytearray(b"----")
2622 b2 = bytearray(b"0123456789")
2623 b3 = bytearray(b"--------------")
2624 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2625 [b1, memoryview(b2)[2:9], b3])
2626 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2627 self.assertEqual(b1, bytearray(b"Mary"))
2628 self.assertEqual(b2, bytearray(b"01 had a 9"))
2629 self.assertEqual(b3, bytearray(b"little lamb---"))
2630 self.checkRecvmsgAddress(addr, self.cli_addr)
2631 self.assertEqual(ancdata, [])
2632 self.checkFlags(flags, eor=True)
2633
2634 def _testRecvmsgIntoScatter(self):
2635 self.sendToServer(b"Mary had a little lamb")
2636
2637
2638class CmsgMacroTests(unittest.TestCase):
2639 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2640 # assumptions used by sendmsg() and recvmsg[_into](), which share
2641 # code with these functions.
2642
2643 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002644 try:
2645 import _testcapi
2646 except ImportError:
2647 socklen_t_limit = 0x7fffffff
2648 else:
2649 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002650
2651 @requireAttrs(socket, "CMSG_LEN")
2652 def testCMSG_LEN(self):
2653 # Test CMSG_LEN() with various valid and invalid values,
2654 # checking the assumptions used by recvmsg() and sendmsg().
2655 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2656 values = list(range(257)) + list(range(toobig - 257, toobig))
2657
2658 # struct cmsghdr has at least three members, two of which are ints
2659 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2660 for n in values:
2661 ret = socket.CMSG_LEN(n)
2662 # This is how recvmsg() calculates the data size
2663 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2664 self.assertLessEqual(ret, self.socklen_t_limit)
2665
2666 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2667 # sendmsg() shares code with these functions, and requires
2668 # that it reject values over the limit.
2669 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2670 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2671
2672 @requireAttrs(socket, "CMSG_SPACE")
2673 def testCMSG_SPACE(self):
2674 # Test CMSG_SPACE() with various valid and invalid values,
2675 # checking the assumptions used by sendmsg().
2676 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2677 values = list(range(257)) + list(range(toobig - 257, toobig))
2678
2679 last = socket.CMSG_SPACE(0)
2680 # struct cmsghdr has at least three members, two of which are ints
2681 self.assertGreater(last, array.array("i").itemsize * 2)
2682 for n in values:
2683 ret = socket.CMSG_SPACE(n)
2684 self.assertGreaterEqual(ret, last)
2685 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2686 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2687 self.assertLessEqual(ret, self.socklen_t_limit)
2688 last = ret
2689
2690 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2691 # sendmsg() shares code with these functions, and requires
2692 # that it reject values over the limit.
2693 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2694 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2695
2696
2697class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2698 # Tests for file descriptor passing on Unix-domain sockets.
2699
2700 # Invalid file descriptor value that's unlikely to evaluate to a
2701 # real FD even if one of its bytes is replaced with a different
2702 # value (which shouldn't actually happen).
2703 badfd = -0x5555
2704
2705 def newFDs(self, n):
2706 # Return a list of n file descriptors for newly-created files
2707 # containing their list indices as ASCII numbers.
2708 fds = []
2709 for i in range(n):
2710 fd, path = tempfile.mkstemp()
2711 self.addCleanup(os.unlink, path)
2712 self.addCleanup(os.close, fd)
2713 os.write(fd, str(i).encode())
2714 fds.append(fd)
2715 return fds
2716
2717 def checkFDs(self, fds):
2718 # Check that the file descriptors in the given list contain
2719 # their correct list indices as ASCII numbers.
2720 for n, fd in enumerate(fds):
2721 os.lseek(fd, 0, os.SEEK_SET)
2722 self.assertEqual(os.read(fd, 1024), str(n).encode())
2723
2724 def registerRecvmsgResult(self, result):
2725 self.addCleanup(self.closeRecvmsgFDs, result)
2726
2727 def closeRecvmsgFDs(self, recvmsg_result):
2728 # Close all file descriptors specified in the ancillary data
2729 # of the given return value from recvmsg() or recvmsg_into().
2730 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2731 if (cmsg_level == socket.SOL_SOCKET and
2732 cmsg_type == socket.SCM_RIGHTS):
2733 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002734 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002735 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2736 for fd in fds:
2737 os.close(fd)
2738
2739 def createAndSendFDs(self, n):
2740 # Send n new file descriptors created by newFDs() to the
2741 # server, with the constant MSG as the non-ancillary data.
2742 self.assertEqual(
2743 self.sendmsgToServer([MSG],
2744 [(socket.SOL_SOCKET,
2745 socket.SCM_RIGHTS,
2746 array.array("i", self.newFDs(n)))]),
2747 len(MSG))
2748
2749 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2750 # Check that constant MSG was received with numfds file
2751 # descriptors in a maximum of maxcmsgs control messages (which
2752 # must contain only complete integers). By default, check
2753 # that MSG_CTRUNC is unset, but ignore any flags in
2754 # ignoreflags.
2755 msg, ancdata, flags, addr = result
2756 self.assertEqual(msg, MSG)
2757 self.checkRecvmsgAddress(addr, self.cli_addr)
2758 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2759 ignore=ignoreflags)
2760
2761 self.assertIsInstance(ancdata, list)
2762 self.assertLessEqual(len(ancdata), maxcmsgs)
2763 fds = array.array("i")
2764 for item in ancdata:
2765 self.assertIsInstance(item, tuple)
2766 cmsg_level, cmsg_type, cmsg_data = item
2767 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2768 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2769 self.assertIsInstance(cmsg_data, bytes)
2770 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002771 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002772
2773 self.assertEqual(len(fds), numfds)
2774 self.checkFDs(fds)
2775
2776 def testFDPassSimple(self):
2777 # Pass a single FD (array read from bytes object).
2778 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2779 len(MSG), 10240))
2780
2781 def _testFDPassSimple(self):
2782 self.assertEqual(
2783 self.sendmsgToServer(
2784 [MSG],
2785 [(socket.SOL_SOCKET,
2786 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002787 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002788 len(MSG))
2789
2790 def testMultipleFDPass(self):
2791 # Pass multiple FDs in a single array.
2792 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2793 len(MSG), 10240))
2794
2795 def _testMultipleFDPass(self):
2796 self.createAndSendFDs(4)
2797
2798 @requireAttrs(socket, "CMSG_SPACE")
2799 def testFDPassCMSG_SPACE(self):
2800 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2801 self.checkRecvmsgFDs(
2802 4, self.doRecvmsg(self.serv_sock, len(MSG),
2803 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2804
2805 @testFDPassCMSG_SPACE.client_skip
2806 def _testFDPassCMSG_SPACE(self):
2807 self.createAndSendFDs(4)
2808
2809 def testFDPassCMSG_LEN(self):
2810 # Test using CMSG_LEN() to calculate ancillary buffer size.
2811 self.checkRecvmsgFDs(1,
2812 self.doRecvmsg(self.serv_sock, len(MSG),
2813 socket.CMSG_LEN(4 * SIZEOF_INT)),
2814 # RFC 3542 says implementations may set
2815 # MSG_CTRUNC if there isn't enough space
2816 # for trailing padding.
2817 ignoreflags=socket.MSG_CTRUNC)
2818
2819 def _testFDPassCMSG_LEN(self):
2820 self.createAndSendFDs(1)
2821
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002822 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002823 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002824 @requireAttrs(socket, "CMSG_SPACE")
2825 def testFDPassSeparate(self):
2826 # Pass two FDs in two separate arrays. Arrays may be combined
2827 # into a single control message by the OS.
2828 self.checkRecvmsgFDs(2,
2829 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2830 maxcmsgs=2)
2831
2832 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002833 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002834 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002835 def _testFDPassSeparate(self):
2836 fd0, fd1 = self.newFDs(2)
2837 self.assertEqual(
2838 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2839 socket.SCM_RIGHTS,
2840 array.array("i", [fd0])),
2841 (socket.SOL_SOCKET,
2842 socket.SCM_RIGHTS,
2843 array.array("i", [fd1]))]),
2844 len(MSG))
2845
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002846 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002847 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002848 @requireAttrs(socket, "CMSG_SPACE")
2849 def testFDPassSeparateMinSpace(self):
2850 # Pass two FDs in two separate arrays, receiving them into the
2851 # minimum space for two arrays.
2852 self.checkRecvmsgFDs(2,
2853 self.doRecvmsg(self.serv_sock, len(MSG),
2854 socket.CMSG_SPACE(SIZEOF_INT) +
2855 socket.CMSG_LEN(SIZEOF_INT)),
2856 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2857
2858 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002859 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002860 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002861 def _testFDPassSeparateMinSpace(self):
2862 fd0, fd1 = self.newFDs(2)
2863 self.assertEqual(
2864 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2865 socket.SCM_RIGHTS,
2866 array.array("i", [fd0])),
2867 (socket.SOL_SOCKET,
2868 socket.SCM_RIGHTS,
2869 array.array("i", [fd1]))]),
2870 len(MSG))
2871
2872 def sendAncillaryIfPossible(self, msg, ancdata):
2873 # Try to send msg and ancdata to server, but if the system
2874 # call fails, just send msg with no ancillary data.
2875 try:
2876 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002877 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002878 # Check that it was the system call that failed
2879 self.assertIsInstance(e.errno, int)
2880 nbytes = self.sendmsgToServer([msg])
2881 self.assertEqual(nbytes, len(msg))
2882
Brett Cannon3bbad122015-12-28 17:21:44 -08002883 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002884 def testFDPassEmpty(self):
2885 # Try to pass an empty FD array. Can receive either no array
2886 # or an empty array.
2887 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2888 len(MSG), 10240),
2889 ignoreflags=socket.MSG_CTRUNC)
2890
2891 def _testFDPassEmpty(self):
2892 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2893 socket.SCM_RIGHTS,
2894 b"")])
2895
2896 def testFDPassPartialInt(self):
2897 # Try to pass a truncated FD array.
2898 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2899 len(MSG), 10240)
2900 self.assertEqual(msg, MSG)
2901 self.checkRecvmsgAddress(addr, self.cli_addr)
2902 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2903 self.assertLessEqual(len(ancdata), 1)
2904 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2905 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2906 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2907 self.assertLess(len(cmsg_data), SIZEOF_INT)
2908
2909 def _testFDPassPartialInt(self):
2910 self.sendAncillaryIfPossible(
2911 MSG,
2912 [(socket.SOL_SOCKET,
2913 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002914 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002915
2916 @requireAttrs(socket, "CMSG_SPACE")
2917 def testFDPassPartialIntInMiddle(self):
2918 # Try to pass two FD arrays, the first of which is truncated.
2919 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2920 len(MSG), 10240)
2921 self.assertEqual(msg, MSG)
2922 self.checkRecvmsgAddress(addr, self.cli_addr)
2923 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2924 self.assertLessEqual(len(ancdata), 2)
2925 fds = array.array("i")
2926 # Arrays may have been combined in a single control message
2927 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2928 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2929 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002930 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002931 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2932 self.assertLessEqual(len(fds), 2)
2933 self.checkFDs(fds)
2934
2935 @testFDPassPartialIntInMiddle.client_skip
2936 def _testFDPassPartialIntInMiddle(self):
2937 fd0, fd1 = self.newFDs(2)
2938 self.sendAncillaryIfPossible(
2939 MSG,
2940 [(socket.SOL_SOCKET,
2941 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002942 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002943 (socket.SOL_SOCKET,
2944 socket.SCM_RIGHTS,
2945 array.array("i", [fd1]))])
2946
2947 def checkTruncatedHeader(self, result, ignoreflags=0):
2948 # Check that no ancillary data items are returned when data is
2949 # truncated inside the cmsghdr structure.
2950 msg, ancdata, flags, addr = result
2951 self.assertEqual(msg, MSG)
2952 self.checkRecvmsgAddress(addr, self.cli_addr)
2953 self.assertEqual(ancdata, [])
2954 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2955 ignore=ignoreflags)
2956
2957 def testCmsgTruncNoBufSize(self):
2958 # Check that no ancillary data is received when no buffer size
2959 # is specified.
2960 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2961 # BSD seems to set MSG_CTRUNC only
2962 # if an item has been partially
2963 # received.
2964 ignoreflags=socket.MSG_CTRUNC)
2965
2966 def _testCmsgTruncNoBufSize(self):
2967 self.createAndSendFDs(1)
2968
2969 def testCmsgTrunc0(self):
2970 # Check that no ancillary data is received when buffer size is 0.
2971 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2972 ignoreflags=socket.MSG_CTRUNC)
2973
2974 def _testCmsgTrunc0(self):
2975 self.createAndSendFDs(1)
2976
2977 # Check that no ancillary data is returned for various non-zero
2978 # (but still too small) buffer sizes.
2979
2980 def testCmsgTrunc1(self):
2981 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2982
2983 def _testCmsgTrunc1(self):
2984 self.createAndSendFDs(1)
2985
2986 def testCmsgTrunc2Int(self):
2987 # The cmsghdr structure has at least three members, two of
2988 # which are ints, so we still shouldn't see any ancillary
2989 # data.
2990 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2991 SIZEOF_INT * 2))
2992
2993 def _testCmsgTrunc2Int(self):
2994 self.createAndSendFDs(1)
2995
2996 def testCmsgTruncLen0Minus1(self):
2997 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2998 socket.CMSG_LEN(0) - 1))
2999
3000 def _testCmsgTruncLen0Minus1(self):
3001 self.createAndSendFDs(1)
3002
3003 # The following tests try to truncate the control message in the
3004 # middle of the FD array.
3005
3006 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3007 # Check that file descriptor data is truncated to between
3008 # mindata and maxdata bytes when received with buffer size
3009 # ancbuf, and that any complete file descriptor numbers are
3010 # valid.
3011 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3012 len(MSG), ancbuf)
3013 self.assertEqual(msg, MSG)
3014 self.checkRecvmsgAddress(addr, self.cli_addr)
3015 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3016
3017 if mindata == 0 and ancdata == []:
3018 return
3019 self.assertEqual(len(ancdata), 1)
3020 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3021 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3022 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3023 self.assertGreaterEqual(len(cmsg_data), mindata)
3024 self.assertLessEqual(len(cmsg_data), maxdata)
3025 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003026 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003027 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3028 self.checkFDs(fds)
3029
3030 def testCmsgTruncLen0(self):
3031 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3032
3033 def _testCmsgTruncLen0(self):
3034 self.createAndSendFDs(1)
3035
3036 def testCmsgTruncLen0Plus1(self):
3037 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3038
3039 def _testCmsgTruncLen0Plus1(self):
3040 self.createAndSendFDs(2)
3041
3042 def testCmsgTruncLen1(self):
3043 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3044 maxdata=SIZEOF_INT)
3045
3046 def _testCmsgTruncLen1(self):
3047 self.createAndSendFDs(2)
3048
3049 def testCmsgTruncLen2Minus1(self):
3050 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3051 maxdata=(2 * SIZEOF_INT) - 1)
3052
3053 def _testCmsgTruncLen2Minus1(self):
3054 self.createAndSendFDs(2)
3055
3056
3057class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3058 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3059 # features of the RFC 3542 Advanced Sockets API for IPv6.
3060 # Currently we can only handle certain data items (e.g. traffic
3061 # class, hop limit, MTU discovery and fragmentation settings)
3062 # without resorting to unportable means such as the struct module,
3063 # but the tests here are aimed at testing the ancillary data
3064 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3065 # itself.
3066
3067 # Test value to use when setting hop limit of packet
3068 hop_limit = 2
3069
3070 # Test value to use when setting traffic class of packet.
3071 # -1 means "use kernel default".
3072 traffic_class = -1
3073
3074 def ancillaryMapping(self, ancdata):
3075 # Given ancillary data list ancdata, return a mapping from
3076 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3077 # Check that no (level, type) pair appears more than once.
3078 d = {}
3079 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3080 self.assertNotIn((cmsg_level, cmsg_type), d)
3081 d[(cmsg_level, cmsg_type)] = cmsg_data
3082 return d
3083
3084 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3085 # Receive hop limit into ancbufsize bytes of ancillary data
3086 # space. Check that data is MSG, ancillary data is not
3087 # truncated (but ignore any flags in ignoreflags), and hop
3088 # limit is between 0 and maxhop inclusive.
3089 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3090 socket.IPV6_RECVHOPLIMIT, 1)
3091 self.misc_event.set()
3092 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3093 len(MSG), ancbufsize)
3094
3095 self.assertEqual(msg, MSG)
3096 self.checkRecvmsgAddress(addr, self.cli_addr)
3097 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3098 ignore=ignoreflags)
3099
3100 self.assertEqual(len(ancdata), 1)
3101 self.assertIsInstance(ancdata[0], tuple)
3102 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3103 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3104 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3105 self.assertIsInstance(cmsg_data, bytes)
3106 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3107 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003108 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003109 self.assertGreaterEqual(a[0], 0)
3110 self.assertLessEqual(a[0], maxhop)
3111
3112 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3113 def testRecvHopLimit(self):
3114 # Test receiving the packet hop limit as ancillary data.
3115 self.checkHopLimit(ancbufsize=10240)
3116
3117 @testRecvHopLimit.client_skip
3118 def _testRecvHopLimit(self):
3119 # Need to wait until server has asked to receive ancillary
3120 # data, as implementations are not required to buffer it
3121 # otherwise.
3122 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3123 self.sendToServer(MSG)
3124
3125 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3126 def testRecvHopLimitCMSG_SPACE(self):
3127 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3128 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3129
3130 @testRecvHopLimitCMSG_SPACE.client_skip
3131 def _testRecvHopLimitCMSG_SPACE(self):
3132 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3133 self.sendToServer(MSG)
3134
3135 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3136 # 3542 says portable applications must provide space for trailing
3137 # padding. Implementations may set MSG_CTRUNC if there isn't
3138 # enough space for the padding.
3139
3140 @requireAttrs(socket.socket, "sendmsg")
3141 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3142 def testSetHopLimit(self):
3143 # Test setting hop limit on outgoing packet and receiving it
3144 # at the other end.
3145 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3146
3147 @testSetHopLimit.client_skip
3148 def _testSetHopLimit(self):
3149 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3150 self.assertEqual(
3151 self.sendmsgToServer([MSG],
3152 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3153 array.array("i", [self.hop_limit]))]),
3154 len(MSG))
3155
3156 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3157 ignoreflags=0):
3158 # Receive traffic class and hop limit into ancbufsize bytes of
3159 # ancillary data space. Check that data is MSG, ancillary
3160 # data is not truncated (but ignore any flags in ignoreflags),
3161 # and traffic class and hop limit are in range (hop limit no
3162 # more than maxhop).
3163 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3164 socket.IPV6_RECVHOPLIMIT, 1)
3165 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3166 socket.IPV6_RECVTCLASS, 1)
3167 self.misc_event.set()
3168 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3169 len(MSG), ancbufsize)
3170
3171 self.assertEqual(msg, MSG)
3172 self.checkRecvmsgAddress(addr, self.cli_addr)
3173 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3174 ignore=ignoreflags)
3175 self.assertEqual(len(ancdata), 2)
3176 ancmap = self.ancillaryMapping(ancdata)
3177
3178 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3179 self.assertEqual(len(tcdata), SIZEOF_INT)
3180 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003181 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003182 self.assertGreaterEqual(a[0], 0)
3183 self.assertLessEqual(a[0], 255)
3184
3185 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3186 self.assertEqual(len(hldata), SIZEOF_INT)
3187 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003188 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003189 self.assertGreaterEqual(a[0], 0)
3190 self.assertLessEqual(a[0], maxhop)
3191
3192 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3193 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3194 def testRecvTrafficClassAndHopLimit(self):
3195 # Test receiving traffic class and hop limit as ancillary data.
3196 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3197
3198 @testRecvTrafficClassAndHopLimit.client_skip
3199 def _testRecvTrafficClassAndHopLimit(self):
3200 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3201 self.sendToServer(MSG)
3202
3203 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3204 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3205 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3206 # Test receiving traffic class and hop limit, using
3207 # CMSG_SPACE() to calculate buffer size.
3208 self.checkTrafficClassAndHopLimit(
3209 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3210
3211 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3212 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3213 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3214 self.sendToServer(MSG)
3215
3216 @requireAttrs(socket.socket, "sendmsg")
3217 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3218 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3219 def testSetTrafficClassAndHopLimit(self):
3220 # Test setting traffic class and hop limit on outgoing packet,
3221 # and receiving them at the other end.
3222 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3223 maxhop=self.hop_limit)
3224
3225 @testSetTrafficClassAndHopLimit.client_skip
3226 def _testSetTrafficClassAndHopLimit(self):
3227 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3228 self.assertEqual(
3229 self.sendmsgToServer([MSG],
3230 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3231 array.array("i", [self.traffic_class])),
3232 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3233 array.array("i", [self.hop_limit]))]),
3234 len(MSG))
3235
3236 @requireAttrs(socket.socket, "sendmsg")
3237 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3238 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3239 def testOddCmsgSize(self):
3240 # Try to send ancillary data with first item one byte too
3241 # long. Fall back to sending with correct size if this fails,
3242 # and check that second item was handled correctly.
3243 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3244 maxhop=self.hop_limit)
3245
3246 @testOddCmsgSize.client_skip
3247 def _testOddCmsgSize(self):
3248 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3249 try:
3250 nbytes = self.sendmsgToServer(
3251 [MSG],
3252 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003253 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003254 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3255 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003256 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003257 self.assertIsInstance(e.errno, int)
3258 nbytes = self.sendmsgToServer(
3259 [MSG],
3260 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3261 array.array("i", [self.traffic_class])),
3262 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3263 array.array("i", [self.hop_limit]))])
3264 self.assertEqual(nbytes, len(MSG))
3265
3266 # Tests for proper handling of truncated ancillary data
3267
3268 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3269 # Receive hop limit into ancbufsize bytes of ancillary data
3270 # space, which should be too small to contain the ancillary
3271 # data header (if ancbufsize is None, pass no second argument
3272 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3273 # (unless included in ignoreflags), and no ancillary data is
3274 # returned.
3275 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3276 socket.IPV6_RECVHOPLIMIT, 1)
3277 self.misc_event.set()
3278 args = () if ancbufsize is None else (ancbufsize,)
3279 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3280 len(MSG), *args)
3281
3282 self.assertEqual(msg, MSG)
3283 self.checkRecvmsgAddress(addr, self.cli_addr)
3284 self.assertEqual(ancdata, [])
3285 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3286 ignore=ignoreflags)
3287
3288 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3289 def testCmsgTruncNoBufSize(self):
3290 # Check that no ancillary data is received when no ancillary
3291 # buffer size is provided.
3292 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3293 # BSD seems to set
3294 # MSG_CTRUNC only if an item
3295 # has been partially
3296 # received.
3297 ignoreflags=socket.MSG_CTRUNC)
3298
3299 @testCmsgTruncNoBufSize.client_skip
3300 def _testCmsgTruncNoBufSize(self):
3301 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3302 self.sendToServer(MSG)
3303
3304 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3305 def testSingleCmsgTrunc0(self):
3306 # Check that no ancillary data is received when ancillary
3307 # buffer size is zero.
3308 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3309 ignoreflags=socket.MSG_CTRUNC)
3310
3311 @testSingleCmsgTrunc0.client_skip
3312 def _testSingleCmsgTrunc0(self):
3313 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3314 self.sendToServer(MSG)
3315
3316 # Check that no ancillary data is returned for various non-zero
3317 # (but still too small) buffer sizes.
3318
3319 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3320 def testSingleCmsgTrunc1(self):
3321 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3322
3323 @testSingleCmsgTrunc1.client_skip
3324 def _testSingleCmsgTrunc1(self):
3325 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3326 self.sendToServer(MSG)
3327
3328 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3329 def testSingleCmsgTrunc2Int(self):
3330 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3331
3332 @testSingleCmsgTrunc2Int.client_skip
3333 def _testSingleCmsgTrunc2Int(self):
3334 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3335 self.sendToServer(MSG)
3336
3337 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3338 def testSingleCmsgTruncLen0Minus1(self):
3339 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3340
3341 @testSingleCmsgTruncLen0Minus1.client_skip
3342 def _testSingleCmsgTruncLen0Minus1(self):
3343 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3344 self.sendToServer(MSG)
3345
3346 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3347 def testSingleCmsgTruncInData(self):
3348 # Test truncation of a control message inside its associated
3349 # data. The message may be returned with its data truncated,
3350 # or not returned at all.
3351 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3352 socket.IPV6_RECVHOPLIMIT, 1)
3353 self.misc_event.set()
3354 msg, ancdata, flags, addr = self.doRecvmsg(
3355 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3356
3357 self.assertEqual(msg, MSG)
3358 self.checkRecvmsgAddress(addr, self.cli_addr)
3359 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3360
3361 self.assertLessEqual(len(ancdata), 1)
3362 if ancdata:
3363 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3364 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3365 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3366 self.assertLess(len(cmsg_data), SIZEOF_INT)
3367
3368 @testSingleCmsgTruncInData.client_skip
3369 def _testSingleCmsgTruncInData(self):
3370 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3371 self.sendToServer(MSG)
3372
3373 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3374 # Receive traffic class and hop limit into ancbufsize bytes of
3375 # ancillary data space, which should be large enough to
3376 # contain the first item, but too small to contain the header
3377 # of the second. Check that data is MSG, MSG_CTRUNC is set
3378 # (unless included in ignoreflags), and only one ancillary
3379 # data item is returned.
3380 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3381 socket.IPV6_RECVHOPLIMIT, 1)
3382 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3383 socket.IPV6_RECVTCLASS, 1)
3384 self.misc_event.set()
3385 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3386 len(MSG), ancbufsize)
3387
3388 self.assertEqual(msg, MSG)
3389 self.checkRecvmsgAddress(addr, self.cli_addr)
3390 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3391 ignore=ignoreflags)
3392
3393 self.assertEqual(len(ancdata), 1)
3394 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3395 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3396 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3397 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3398 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003399 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003400 self.assertGreaterEqual(a[0], 0)
3401 self.assertLessEqual(a[0], 255)
3402
3403 # Try the above test with various buffer sizes.
3404
3405 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3406 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3407 def testSecondCmsgTrunc0(self):
3408 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3409 ignoreflags=socket.MSG_CTRUNC)
3410
3411 @testSecondCmsgTrunc0.client_skip
3412 def _testSecondCmsgTrunc0(self):
3413 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3414 self.sendToServer(MSG)
3415
3416 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3417 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3418 def testSecondCmsgTrunc1(self):
3419 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3420
3421 @testSecondCmsgTrunc1.client_skip
3422 def _testSecondCmsgTrunc1(self):
3423 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3424 self.sendToServer(MSG)
3425
3426 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3427 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3428 def testSecondCmsgTrunc2Int(self):
3429 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3430 2 * SIZEOF_INT)
3431
3432 @testSecondCmsgTrunc2Int.client_skip
3433 def _testSecondCmsgTrunc2Int(self):
3434 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3435 self.sendToServer(MSG)
3436
3437 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3438 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3439 def testSecondCmsgTruncLen0Minus1(self):
3440 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3441 socket.CMSG_LEN(0) - 1)
3442
3443 @testSecondCmsgTruncLen0Minus1.client_skip
3444 def _testSecondCmsgTruncLen0Minus1(self):
3445 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3446 self.sendToServer(MSG)
3447
3448 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3449 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3450 def testSecomdCmsgTruncInData(self):
3451 # Test truncation of the second of two control messages inside
3452 # its associated data.
3453 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3454 socket.IPV6_RECVHOPLIMIT, 1)
3455 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3456 socket.IPV6_RECVTCLASS, 1)
3457 self.misc_event.set()
3458 msg, ancdata, flags, addr = self.doRecvmsg(
3459 self.serv_sock, len(MSG),
3460 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3461
3462 self.assertEqual(msg, MSG)
3463 self.checkRecvmsgAddress(addr, self.cli_addr)
3464 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3465
3466 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3467
3468 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3469 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3470 cmsg_types.remove(cmsg_type)
3471 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3472 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003473 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003474 self.assertGreaterEqual(a[0], 0)
3475 self.assertLessEqual(a[0], 255)
3476
3477 if ancdata:
3478 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3479 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3480 cmsg_types.remove(cmsg_type)
3481 self.assertLess(len(cmsg_data), SIZEOF_INT)
3482
3483 self.assertEqual(ancdata, [])
3484
3485 @testSecomdCmsgTruncInData.client_skip
3486 def _testSecomdCmsgTruncInData(self):
3487 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3488 self.sendToServer(MSG)
3489
3490
3491# Derive concrete test classes for different socket types.
3492
3493class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3494 SendrecvmsgConnectionlessBase,
3495 ThreadedSocketTestMixin, UDPTestBase):
3496 pass
3497
3498@requireAttrs(socket.socket, "sendmsg")
3499@unittest.skipUnless(thread, 'Threading required for this test.')
3500class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3501 pass
3502
3503@requireAttrs(socket.socket, "recvmsg")
3504@unittest.skipUnless(thread, 'Threading required for this test.')
3505class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3506 pass
3507
3508@requireAttrs(socket.socket, "recvmsg_into")
3509@unittest.skipUnless(thread, 'Threading required for this test.')
3510class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3511 pass
3512
3513
3514class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3515 SendrecvmsgConnectionlessBase,
3516 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003517
3518 def checkRecvmsgAddress(self, addr1, addr2):
3519 # Called to compare the received address with the address of
3520 # the peer, ignoring scope ID
3521 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003522
3523@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003524@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003525@requireSocket("AF_INET6", "SOCK_DGRAM")
3526@unittest.skipUnless(thread, 'Threading required for this test.')
3527class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3528 pass
3529
3530@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003531@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003532@requireSocket("AF_INET6", "SOCK_DGRAM")
3533@unittest.skipUnless(thread, 'Threading required for this test.')
3534class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3535 pass
3536
3537@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003538@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003539@requireSocket("AF_INET6", "SOCK_DGRAM")
3540@unittest.skipUnless(thread, 'Threading required for this test.')
3541class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3542 pass
3543
3544@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003545@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003546@requireAttrs(socket, "IPPROTO_IPV6")
3547@requireSocket("AF_INET6", "SOCK_DGRAM")
3548@unittest.skipUnless(thread, 'Threading required for this test.')
3549class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3550 SendrecvmsgUDP6TestBase):
3551 pass
3552
3553@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003554@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003555@requireAttrs(socket, "IPPROTO_IPV6")
3556@requireSocket("AF_INET6", "SOCK_DGRAM")
3557@unittest.skipUnless(thread, 'Threading required for this test.')
3558class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3559 RFC3542AncillaryTest,
3560 SendrecvmsgUDP6TestBase):
3561 pass
3562
3563
3564class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3565 ConnectedStreamTestMixin, TCPTestBase):
3566 pass
3567
3568@requireAttrs(socket.socket, "sendmsg")
3569@unittest.skipUnless(thread, 'Threading required for this test.')
3570class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3571 pass
3572
3573@requireAttrs(socket.socket, "recvmsg")
3574@unittest.skipUnless(thread, 'Threading required for this test.')
3575class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3576 SendrecvmsgTCPTestBase):
3577 pass
3578
3579@requireAttrs(socket.socket, "recvmsg_into")
3580@unittest.skipUnless(thread, 'Threading required for this test.')
3581class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3582 SendrecvmsgTCPTestBase):
3583 pass
3584
3585
3586class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3587 SendrecvmsgConnectedBase,
3588 ConnectedStreamTestMixin, SCTPStreamBase):
3589 pass
3590
3591@requireAttrs(socket.socket, "sendmsg")
3592@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3593@unittest.skipUnless(thread, 'Threading required for this test.')
3594class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3595 pass
3596
3597@requireAttrs(socket.socket, "recvmsg")
3598@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3599@unittest.skipUnless(thread, 'Threading required for this test.')
3600class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3601 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003602
3603 def testRecvmsgEOF(self):
3604 try:
3605 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3606 except OSError as e:
3607 if e.errno != errno.ENOTCONN:
3608 raise
3609 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003610
3611@requireAttrs(socket.socket, "recvmsg_into")
3612@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3613@unittest.skipUnless(thread, 'Threading required for this test.')
3614class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3615 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003616
3617 def testRecvmsgEOF(self):
3618 try:
3619 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3620 except OSError as e:
3621 if e.errno != errno.ENOTCONN:
3622 raise
3623 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003624
3625
3626class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3627 ConnectedStreamTestMixin, UnixStreamBase):
3628 pass
3629
3630@requireAttrs(socket.socket, "sendmsg")
3631@requireAttrs(socket, "AF_UNIX")
3632@unittest.skipUnless(thread, 'Threading required for this test.')
3633class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3634 pass
3635
3636@requireAttrs(socket.socket, "recvmsg")
3637@requireAttrs(socket, "AF_UNIX")
3638@unittest.skipUnless(thread, 'Threading required for this test.')
3639class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3640 SendrecvmsgUnixStreamTestBase):
3641 pass
3642
3643@requireAttrs(socket.socket, "recvmsg_into")
3644@requireAttrs(socket, "AF_UNIX")
3645@unittest.skipUnless(thread, 'Threading required for this test.')
3646class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3647 SendrecvmsgUnixStreamTestBase):
3648 pass
3649
3650@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3651@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3652@unittest.skipUnless(thread, 'Threading required for this test.')
3653class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3654 pass
3655
3656@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3657@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3658@unittest.skipUnless(thread, 'Threading required for this test.')
3659class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3660 SendrecvmsgUnixStreamTestBase):
3661 pass
3662
3663
3664# Test interrupting the interruptible send/receive methods with a
3665# signal when a timeout is set. These tests avoid having multiple
3666# threads alive during the test so that the OS cannot deliver the
3667# signal to the wrong one.
3668
3669class InterruptedTimeoutBase(unittest.TestCase):
3670 # Base class for interrupted send/receive tests. Installs an
3671 # empty handler for SIGALRM and removes it on teardown, along with
3672 # any scheduled alarms.
3673
3674 def setUp(self):
3675 super().setUp()
3676 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003677 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003678 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3679 self.addCleanup(self.setAlarm, 0)
3680
3681 # Timeout for socket operations
3682 timeout = 4.0
3683
3684 # Provide setAlarm() method to schedule delivery of SIGALRM after
3685 # given number of seconds, or cancel it if zero, and an
3686 # appropriate time value to use. Use setitimer() if available.
3687 if hasattr(signal, "setitimer"):
3688 alarm_time = 0.05
3689
3690 def setAlarm(self, seconds):
3691 signal.setitimer(signal.ITIMER_REAL, seconds)
3692 else:
3693 # Old systems may deliver the alarm up to one second early
3694 alarm_time = 2
3695
3696 def setAlarm(self, seconds):
3697 signal.alarm(seconds)
3698
3699
3700# Require siginterrupt() in order to ensure that system calls are
3701# interrupted by default.
3702@requireAttrs(signal, "siginterrupt")
3703@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3704 "Don't have signal.alarm or signal.setitimer")
3705class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3706 # Test interrupting the recv*() methods with signals when a
3707 # timeout is set.
3708
3709 def setUp(self):
3710 super().setUp()
3711 self.serv.settimeout(self.timeout)
3712
3713 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003714 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003715 # errno of EINTR when interrupted by a signal.
3716 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003717 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003718 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003719
3720 def testInterruptedRecvTimeout(self):
3721 self.checkInterruptedRecv(self.serv.recv, 1024)
3722
3723 def testInterruptedRecvIntoTimeout(self):
3724 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3725
3726 def testInterruptedRecvfromTimeout(self):
3727 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3728
3729 def testInterruptedRecvfromIntoTimeout(self):
3730 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3731
3732 @requireAttrs(socket.socket, "recvmsg")
3733 def testInterruptedRecvmsgTimeout(self):
3734 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3735
3736 @requireAttrs(socket.socket, "recvmsg_into")
3737 def testInterruptedRecvmsgIntoTimeout(self):
3738 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3739
3740
3741# Require siginterrupt() in order to ensure that system calls are
3742# interrupted by default.
3743@requireAttrs(signal, "siginterrupt")
3744@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3745 "Don't have signal.alarm or signal.setitimer")
3746@unittest.skipUnless(thread, 'Threading required for this test.')
3747class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3748 ThreadSafeCleanupTestCase,
3749 SocketListeningTestMixin, TCPTestBase):
3750 # Test interrupting the interruptible send*() methods with signals
3751 # when a timeout is set.
3752
3753 def setUp(self):
3754 super().setUp()
3755 self.serv_conn = self.newSocket()
3756 self.addCleanup(self.serv_conn.close)
3757 # Use a thread to complete the connection, but wait for it to
3758 # terminate before running the test, so that there is only one
3759 # thread to accept the signal.
3760 cli_thread = threading.Thread(target=self.doConnect)
3761 cli_thread.start()
3762 self.cli_conn, addr = self.serv.accept()
3763 self.addCleanup(self.cli_conn.close)
3764 cli_thread.join()
3765 self.serv_conn.settimeout(self.timeout)
3766
3767 def doConnect(self):
3768 self.serv_conn.connect(self.serv_addr)
3769
3770 def checkInterruptedSend(self, func, *args, **kwargs):
3771 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003772 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003773 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003774 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003775 while True:
3776 self.setAlarm(self.alarm_time)
3777 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003778
Ned Deilyc5640382014-02-03 13:58:31 -08003779 # Issue #12958: The following tests have problems on OS X prior to 10.7
3780 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003781 def testInterruptedSendTimeout(self):
3782 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3783
Ned Deilyc5640382014-02-03 13:58:31 -08003784 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003785 def testInterruptedSendtoTimeout(self):
3786 # Passing an actual address here as Python's wrapper for
3787 # sendto() doesn't allow passing a zero-length one; POSIX
3788 # requires that the address is ignored since the socket is
3789 # connection-mode, however.
3790 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3791 self.serv_addr)
3792
Ned Deilyc5640382014-02-03 13:58:31 -08003793 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003794 @requireAttrs(socket.socket, "sendmsg")
3795 def testInterruptedSendmsgTimeout(self):
3796 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3797
3798
Victor Stinner45df8202010-04-28 22:31:17 +00003799@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003800class TCPCloserTest(ThreadedTCPSocketTest):
3801
3802 def testClose(self):
3803 conn, addr = self.serv.accept()
3804 conn.close()
3805
3806 sd = self.cli
3807 read, write, err = select.select([sd], [], [], 1.0)
3808 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003809 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003810
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003811 # Calling close() many times should be safe.
3812 conn.close()
3813 conn.close()
3814
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003815 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003816 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003817 time.sleep(1.0)
3818
Victor Stinner45df8202010-04-28 22:31:17 +00003819@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003820class BasicSocketPairTest(SocketPairTest):
3821
3822 def __init__(self, methodName='runTest'):
3823 SocketPairTest.__init__(self, methodName=methodName)
3824
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003825 def _check_defaults(self, sock):
3826 self.assertIsInstance(sock, socket.socket)
3827 if hasattr(socket, 'AF_UNIX'):
3828 self.assertEqual(sock.family, socket.AF_UNIX)
3829 else:
3830 self.assertEqual(sock.family, socket.AF_INET)
3831 self.assertEqual(sock.type, socket.SOCK_STREAM)
3832 self.assertEqual(sock.proto, 0)
3833
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003834 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003835 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003836
3837 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003838 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003839
Dave Cole331708b2004-08-09 04:51:41 +00003840 def testRecv(self):
3841 msg = self.serv.recv(1024)
3842 self.assertEqual(msg, MSG)
3843
3844 def _testRecv(self):
3845 self.cli.send(MSG)
3846
3847 def testSend(self):
3848 self.serv.send(MSG)
3849
3850 def _testSend(self):
3851 msg = self.cli.recv(1024)
3852 self.assertEqual(msg, MSG)
3853
Victor Stinner45df8202010-04-28 22:31:17 +00003854@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003855class NonBlockingTCPTests(ThreadedTCPSocketTest):
3856
3857 def __init__(self, methodName='runTest'):
3858 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3859
3860 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003861 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003862 self.serv.setblocking(True)
3863 self.assertIsNone(self.serv.gettimeout())
3864 self.serv.setblocking(False)
3865 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003866 start = time.time()
3867 try:
3868 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003869 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003870 pass
3871 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003872 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003873
3874 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003875 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003876
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003877 @support.cpython_only
3878 def testSetBlocking_overflow(self):
3879 # Issue 15989
3880 import _testcapi
3881 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3882 self.skipTest('needs UINT_MAX < ULONG_MAX')
3883 self.serv.setblocking(False)
3884 self.assertEqual(self.serv.gettimeout(), 0.0)
3885 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3886 self.assertIsNone(self.serv.gettimeout())
3887
3888 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3889
Serhiy Storchaka43767632013-11-03 21:31:38 +02003890 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3891 'test needs socket.SOCK_NONBLOCK')
3892 @support.requires_linux_version(2, 6, 28)
3893 def testInitNonBlocking(self):
3894 # reinit server socket
3895 self.serv.close()
3896 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3897 socket.SOCK_NONBLOCK)
3898 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003899 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003900 # actual testing
3901 start = time.time()
3902 try:
3903 self.serv.accept()
3904 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003905 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003906 end = time.time()
3907 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3908
3909 def _testInitNonBlocking(self):
3910 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003911
Antoine Pitrou600232b2011-01-05 21:03:42 +00003912 def testInheritFlags(self):
3913 # Issue #7995: when calling accept() on a listening socket with a
3914 # timeout, the resulting socket should not be non-blocking.
3915 self.serv.settimeout(10)
3916 try:
3917 conn, addr = self.serv.accept()
3918 message = conn.recv(len(MSG))
3919 finally:
3920 conn.close()
3921 self.serv.settimeout(None)
3922
3923 def _testInheritFlags(self):
3924 time.sleep(0.1)
3925 self.cli.connect((HOST, self.port))
3926 time.sleep(0.5)
3927 self.cli.send(MSG)
3928
Guido van Rossum24e4af82002-06-12 19:18:08 +00003929 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003930 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003931 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003932 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003933 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003934 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003935 pass
3936 else:
3937 self.fail("Error trying to do non-blocking accept.")
3938 read, write, err = select.select([self.serv], [], [])
3939 if self.serv in read:
3940 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07003941 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00003942 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003943 else:
3944 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003945
Guido van Rossum24e4af82002-06-12 19:18:08 +00003946 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003947 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003948 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003949
3950 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003951 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003952 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003953 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003954
3955 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003956 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003957 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003958
3959 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003960 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003961 conn, addr = self.serv.accept()
3962 conn.setblocking(0)
3963 try:
3964 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003965 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003966 pass
3967 else:
3968 self.fail("Error trying to do non-blocking recv.")
3969 read, write, err = select.select([conn], [], [])
3970 if conn in read:
3971 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003972 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003973 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003974 else:
3975 self.fail("Error during select call to non-blocking socket.")
3976
3977 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003978 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003979 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003980 self.cli.send(MSG)
3981
Victor Stinner45df8202010-04-28 22:31:17 +00003982@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003983class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003984 """Unit tests for the object returned by socket.makefile()
3985
Antoine Pitrou834bd812010-10-13 16:17:14 +00003986 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003987 the client connection. You can read from this file to
3988 get output from the server.
3989
Antoine Pitrou834bd812010-10-13 16:17:14 +00003990 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003991 server connection. You can write to this file to send output
3992 to the client.
3993 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003994
Guido van Rossume9f66142002-08-07 15:46:19 +00003995 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003996 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003997 errors = 'strict'
3998 newline = None
3999
4000 read_mode = 'rb'
4001 read_msg = MSG
4002 write_mode = 'wb'
4003 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004004
Guido van Rossum24e4af82002-06-12 19:18:08 +00004005 def __init__(self, methodName='runTest'):
4006 SocketConnectedTest.__init__(self, methodName=methodName)
4007
4008 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004009 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4010 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004011 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004012 self.read_file = self.cli_conn.makefile(
4013 self.read_mode, self.bufsize,
4014 encoding = self.encoding,
4015 errors = self.errors,
4016 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004017
4018 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004019 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004020 self.read_file.close()
4021 self.assertTrue(self.read_file.closed)
4022 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004023 SocketConnectedTest.tearDown(self)
4024
4025 def clientSetUp(self):
4026 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004027 self.write_file = self.serv_conn.makefile(
4028 self.write_mode, self.bufsize,
4029 encoding = self.encoding,
4030 errors = self.errors,
4031 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004032
4033 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004034 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004035 self.write_file.close()
4036 self.assertTrue(self.write_file.closed)
4037 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004038 SocketConnectedTest.clientTearDown(self)
4039
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004040 def testReadAfterTimeout(self):
4041 # Issue #7322: A file object must disallow further reads
4042 # after a timeout has occurred.
4043 self.cli_conn.settimeout(1)
4044 self.read_file.read(3)
4045 # First read raises a timeout
4046 self.assertRaises(socket.timeout, self.read_file.read, 1)
4047 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004048 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004049 self.read_file.read(1)
4050 self.assertIn("cannot read from timed out object", str(ctx.exception))
4051
4052 def _testReadAfterTimeout(self):
4053 self.write_file.write(self.write_msg[0:3])
4054 self.write_file.flush()
4055 self.serv_finished.wait()
4056
Guido van Rossum24e4af82002-06-12 19:18:08 +00004057 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004058 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004059 first_seg = self.read_file.read(len(self.read_msg)-3)
4060 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004061 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004062 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004063
4064 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004065 self.write_file.write(self.write_msg)
4066 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004067
Guido van Rossum8c943832002-08-08 01:00:28 +00004068 def testFullRead(self):
4069 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004070 msg = self.read_file.read()
4071 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004072
4073 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004074 self.write_file.write(self.write_msg)
4075 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004076
Guido van Rossum24e4af82002-06-12 19:18:08 +00004077 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004078 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004079 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004080 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004081 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004082 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004083 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004084 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004085 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004086
4087 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004088 self.write_file.write(self.write_msg)
4089 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004090
4091 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004092 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004093 line = self.read_file.readline()
4094 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004095
4096 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004097 self.write_file.write(self.write_msg)
4098 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004099
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004100 def testCloseAfterMakefile(self):
4101 # The file returned by makefile should keep the socket open.
4102 self.cli_conn.close()
4103 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004104 msg = self.read_file.read()
4105 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004106
4107 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004108 self.write_file.write(self.write_msg)
4109 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004110
4111 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004112 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004113 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004114 if isinstance(self.read_msg, str):
4115 msg = msg.decode()
4116 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004117
4118 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004119 self.write_file.write(self.write_msg)
4120 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004121
Tim Peters116d83c2004-03-28 02:20:45 +00004122 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004123 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004124
4125 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004126 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004127
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004128 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004129 self.assertEqual(self.read_file.mode, self.read_mode)
4130 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004131
4132 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004133 self.assertEqual(self.write_file.mode, self.write_mode)
4134 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004135
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004136 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004137 self.read_file.close()
4138 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004139 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004140 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004141
4142 def _testRealClose(self):
4143 pass
4144
4145
Guido van Rossume9f66142002-08-07 15:46:19 +00004146class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4147
4148 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004149
Guido van Rossume9f66142002-08-07 15:46:19 +00004150 In this case (and in this case only), it should be possible to
4151 create a file object, read a line from it, create another file
4152 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004153 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004154 when reading multiple requests from the same socket."""
4155
4156 bufsize = 0 # Use unbuffered mode
4157
4158 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004159 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004160 line = self.read_file.readline() # first line
4161 self.assertEqual(line, b"A. " + self.write_msg) # first line
4162 self.read_file = self.cli_conn.makefile('rb', 0)
4163 line = self.read_file.readline() # second line
4164 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004165
4166 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004167 self.write_file.write(b"A. " + self.write_msg)
4168 self.write_file.write(b"B. " + self.write_msg)
4169 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004170
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004171 def testMakefileClose(self):
4172 # The file returned by makefile should keep the socket open...
4173 self.cli_conn.close()
4174 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004175 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004176 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004177 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004178 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004179
4180 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004181 self.write_file.write(self.write_msg)
4182 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004183
4184 def testMakefileCloseSocketDestroy(self):
4185 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004186 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004187 refcount_after = sys.getrefcount(self.cli_conn)
4188 self.assertEqual(refcount_before - 1, refcount_after)
4189
4190 def _testMakefileCloseSocketDestroy(self):
4191 pass
4192
Antoine Pitrou98b46702010-09-18 22:59:00 +00004193 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004194 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004195 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4196
4197 def testSmallReadNonBlocking(self):
4198 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004199 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4200 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004201 self.evt1.set()
4202 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004203 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004204 if first_seg is None:
4205 # Data not arrived (can happen under Windows), wait a bit
4206 time.sleep(0.5)
4207 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004208 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004209 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004210 self.assertEqual(n, 3)
4211 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004212 self.assertEqual(msg, self.read_msg)
4213 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4214 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004215
4216 def _testSmallReadNonBlocking(self):
4217 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004218 self.write_file.write(self.write_msg)
4219 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004220 self.evt2.set()
4221 # Avoid cloding the socket before the server test has finished,
4222 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4223 self.serv_finished.wait(5.0)
4224
4225 def testWriteNonBlocking(self):
4226 self.cli_finished.wait(5.0)
4227 # The client thread can't skip directly - the SkipTest exception
4228 # would appear as a failure.
4229 if self.serv_skipped:
4230 self.skipTest(self.serv_skipped)
4231
4232 def _testWriteNonBlocking(self):
4233 self.serv_skipped = None
4234 self.serv_conn.setblocking(False)
4235 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004236 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004237 LIMIT = 10
4238 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004239 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004240 self.assertGreater(n, 0)
4241 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004242 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004243 if n is None:
4244 # Succeeded
4245 break
4246 self.assertGreater(n, 0)
4247 else:
4248 # Let us know that this test didn't manage to establish
4249 # the expected conditions. This is not a failure in itself but,
4250 # if it happens repeatedly, the test should be fixed.
4251 self.serv_skipped = "failed to saturate the socket buffer"
4252
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004253
Guido van Rossum8c943832002-08-08 01:00:28 +00004254class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4255
4256 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4257
4258
4259class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4260
4261 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004262
Thomas Woutersb2137042007-02-01 18:02:27 +00004263
Antoine Pitrou834bd812010-10-13 16:17:14 +00004264class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4265 """Tests for socket.makefile() in text mode (rather than binary)"""
4266
4267 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004268 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004269 write_mode = 'wb'
4270 write_msg = MSG
4271 newline = ''
4272
4273
4274class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4275 """Tests for socket.makefile() in text mode (rather than binary)"""
4276
4277 read_mode = 'rb'
4278 read_msg = MSG
4279 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004280 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004281 newline = ''
4282
4283
4284class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4285 """Tests for socket.makefile() in text mode (rather than binary)"""
4286
4287 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004288 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004289 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004290 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004291 newline = ''
4292
4293
Guido van Rossumd8faa362007-04-27 19:54:29 +00004294class NetworkConnectionTest(object):
4295 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004296
Guido van Rossumd8faa362007-04-27 19:54:29 +00004297 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004298 # We're inherited below by BasicTCPTest2, which also inherits
4299 # BasicTCPTest, which defines self.port referenced below.
4300 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004301 self.serv_conn = self.cli
4302
4303class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4304 """Tests that NetworkConnection does not break existing TCP functionality.
4305 """
4306
4307class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004308
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004309 class MockSocket(socket.socket):
4310 def connect(self, *args):
4311 raise socket.timeout('timed out')
4312
4313 @contextlib.contextmanager
4314 def mocked_socket_module(self):
4315 """Return a socket which times out on connect"""
4316 old_socket = socket.socket
4317 socket.socket = self.MockSocket
4318 try:
4319 yield
4320 finally:
4321 socket.socket = old_socket
4322
4323 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004324 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004325 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004326 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004327 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004328 cli.connect((HOST, port))
4329 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4330
4331 def test_create_connection(self):
4332 # Issue #9792: errors raised by create_connection() should have
4333 # a proper errno attribute.
4334 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004335 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004336 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004337
4338 # Issue #16257: create_connection() calls getaddrinfo() against
4339 # 'localhost'. This may result in an IPV6 addr being returned
4340 # as well as an IPV4 one:
4341 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4342 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4343 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4344 #
4345 # create_connection() enumerates through all the addresses returned
4346 # and if it doesn't successfully bind to any of them, it propagates
4347 # the last exception it encountered.
4348 #
4349 # On Solaris, ENETUNREACH is returned in this circumstance instead
4350 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4351 # expected errnos.
4352 expected_errnos = [ errno.ECONNREFUSED, ]
4353 if hasattr(errno, 'ENETUNREACH'):
4354 expected_errnos.append(errno.ENETUNREACH)
4355
4356 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004357
4358 def test_create_connection_timeout(self):
4359 # Issue #9792: create_connection() should not recast timeout errors
4360 # as generic socket errors.
4361 with self.mocked_socket_module():
4362 with self.assertRaises(socket.timeout):
4363 socket.create_connection((HOST, 1234))
4364
Guido van Rossumd8faa362007-04-27 19:54:29 +00004365
Victor Stinner45df8202010-04-28 22:31:17 +00004366@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004367class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4368
4369 def __init__(self, methodName='runTest'):
4370 SocketTCPTest.__init__(self, methodName=methodName)
4371 ThreadableTest.__init__(self)
4372
4373 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004374 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004375
4376 def clientTearDown(self):
4377 self.cli.close()
4378 self.cli = None
4379 ThreadableTest.clientTearDown(self)
4380
4381 def _justAccept(self):
4382 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004383 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004384
4385 testFamily = _justAccept
4386 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004387 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004388 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004389 self.assertEqual(self.cli.family, 2)
4390
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004391 testSourceAddress = _justAccept
4392 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004393 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4394 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004395 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004396 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004397 # The port number being used is sufficient to show that the bind()
4398 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004399
Guido van Rossumd8faa362007-04-27 19:54:29 +00004400 testTimeoutDefault = _justAccept
4401 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004402 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004403 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004404 socket.setdefaulttimeout(42)
4405 try:
4406 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004407 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004408 finally:
4409 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004410 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004411
4412 testTimeoutNone = _justAccept
4413 def _testTimeoutNone(self):
4414 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004415 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004416 socket.setdefaulttimeout(30)
4417 try:
4418 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004419 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004420 finally:
4421 socket.setdefaulttimeout(None)
4422 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004423
4424 testTimeoutValueNamed = _justAccept
4425 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004426 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004427 self.assertEqual(self.cli.gettimeout(), 30)
4428
4429 testTimeoutValueNonamed = _justAccept
4430 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004431 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004432 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004433 self.assertEqual(self.cli.gettimeout(), 30)
4434
Victor Stinner45df8202010-04-28 22:31:17 +00004435@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004436class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4437
4438 def __init__(self, methodName='runTest'):
4439 SocketTCPTest.__init__(self, methodName=methodName)
4440 ThreadableTest.__init__(self)
4441
4442 def clientSetUp(self):
4443 pass
4444
4445 def clientTearDown(self):
4446 self.cli.close()
4447 self.cli = None
4448 ThreadableTest.clientTearDown(self)
4449
4450 def testInsideTimeout(self):
4451 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004452 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004453 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004454 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004455 testOutsideTimeout = testInsideTimeout
4456
4457 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004458 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004459 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004460 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004461
4462 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004463 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004464 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004465
4466
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004467class TCPTimeoutTest(SocketTCPTest):
4468
4469 def testTCPTimeout(self):
4470 def raise_timeout(*args, **kwargs):
4471 self.serv.settimeout(1.0)
4472 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004473 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004474 "Error generating a timeout exception (TCP)")
4475
4476 def testTimeoutZero(self):
4477 ok = False
4478 try:
4479 self.serv.settimeout(0.0)
4480 foo = self.serv.accept()
4481 except socket.timeout:
4482 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004483 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004484 ok = True
4485 except:
4486 self.fail("caught unexpected exception (TCP)")
4487 if not ok:
4488 self.fail("accept() returned success when we did not expect it")
4489
Serhiy Storchaka43767632013-11-03 21:31:38 +02004490 @unittest.skipUnless(hasattr(signal, 'alarm'),
4491 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004492 def testInterruptedTimeout(self):
4493 # XXX I don't know how to do this test on MSWindows or any other
4494 # plaform that doesn't support signal.alarm() or os.kill(), though
4495 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004496 self.serv.settimeout(5.0) # must be longer than alarm
4497 class Alarm(Exception):
4498 pass
4499 def alarm_handler(signal, frame):
4500 raise Alarm
4501 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4502 try:
4503 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4504 try:
4505 foo = self.serv.accept()
4506 except socket.timeout:
4507 self.fail("caught timeout instead of Alarm")
4508 except Alarm:
4509 pass
4510 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004511 self.fail("caught other exception instead of Alarm:"
4512 " %s(%s):\n%s" %
4513 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004514 else:
4515 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004516 finally:
4517 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004518 except Alarm:
4519 self.fail("got Alarm in wrong place")
4520 finally:
4521 # no alarm can be pending. Safe to restore old handler.
4522 signal.signal(signal.SIGALRM, old_alarm)
4523
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004524class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004525
4526 def testUDPTimeout(self):
4527 def raise_timeout(*args, **kwargs):
4528 self.serv.settimeout(1.0)
4529 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004530 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004531 "Error generating a timeout exception (UDP)")
4532
4533 def testTimeoutZero(self):
4534 ok = False
4535 try:
4536 self.serv.settimeout(0.0)
4537 foo = self.serv.recv(1024)
4538 except socket.timeout:
4539 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004540 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004541 ok = True
4542 except:
4543 self.fail("caught unexpected exception (UDP)")
4544 if not ok:
4545 self.fail("recv() returned success when we did not expect it")
4546
4547class TestExceptions(unittest.TestCase):
4548
4549 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004550 self.assertTrue(issubclass(OSError, Exception))
4551 self.assertTrue(issubclass(socket.herror, OSError))
4552 self.assertTrue(issubclass(socket.gaierror, OSError))
4553 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004554
Serhiy Storchaka43767632013-11-03 21:31:38 +02004555@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004556class TestLinuxAbstractNamespace(unittest.TestCase):
4557
4558 UNIX_PATH_MAX = 108
4559
4560 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004561 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004562 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4563 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004564 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004565 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4566 s2.connect(s1.getsockname())
4567 with s1.accept()[0] as s3:
4568 self.assertEqual(s1.getsockname(), address)
4569 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004570
4571 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004572 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004573 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4574 s.bind(address)
4575 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004576
4577 def testNameOverflow(self):
4578 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004579 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004580 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004581
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004582 def testStrName(self):
4583 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004584 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4585 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004586 s.bind("\x00python\x00test\x00")
4587 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004588 finally:
4589 s.close()
4590
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004591 def testBytearrayName(self):
4592 # Check that an abstract name can be passed as a bytearray.
4593 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4594 s.bind(bytearray(b"\x00python\x00test\x00"))
4595 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4596
Serhiy Storchaka43767632013-11-03 21:31:38 +02004597@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004598class TestUnixDomain(unittest.TestCase):
4599
4600 def setUp(self):
4601 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4602
4603 def tearDown(self):
4604 self.sock.close()
4605
4606 def encoded(self, path):
4607 # Return the given path encoded in the file system encoding,
4608 # or skip the test if this is not possible.
4609 try:
4610 return os.fsencode(path)
4611 except UnicodeEncodeError:
4612 self.skipTest(
4613 "Pathname {0!a} cannot be represented in file "
4614 "system encoding {1!r}".format(
4615 path, sys.getfilesystemencoding()))
4616
Antoine Pitrou16374872011-12-16 15:04:12 +01004617 def bind(self, sock, path):
4618 # Bind the socket
4619 try:
4620 sock.bind(path)
4621 except OSError as e:
4622 if str(e) == "AF_UNIX path too long":
4623 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004624 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004625 .format(path))
4626 else:
4627 raise
4628
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004629 def testStrAddr(self):
4630 # Test binding to and retrieving a normal string pathname.
4631 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004632 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004633 self.addCleanup(support.unlink, path)
4634 self.assertEqual(self.sock.getsockname(), path)
4635
4636 def testBytesAddr(self):
4637 # Test binding to a bytes pathname.
4638 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004639 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004640 self.addCleanup(support.unlink, path)
4641 self.assertEqual(self.sock.getsockname(), path)
4642
4643 def testSurrogateescapeBind(self):
4644 # Test binding to a valid non-ASCII pathname, with the
4645 # non-ASCII bytes supplied using surrogateescape encoding.
4646 path = os.path.abspath(support.TESTFN_UNICODE)
4647 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004648 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004649 self.addCleanup(support.unlink, path)
4650 self.assertEqual(self.sock.getsockname(), path)
4651
4652 def testUnencodableAddr(self):
4653 # Test binding to a pathname that cannot be encoded in the
4654 # file system encoding.
4655 if support.TESTFN_UNENCODABLE is None:
4656 self.skipTest("No unencodable filename available")
4657 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004658 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004659 self.addCleanup(support.unlink, path)
4660 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004661
Victor Stinner45df8202010-04-28 22:31:17 +00004662@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004663class BufferIOTest(SocketConnectedTest):
4664 """
4665 Test the buffer versions of socket.recv() and socket.send().
4666 """
4667 def __init__(self, methodName='runTest'):
4668 SocketConnectedTest.__init__(self, methodName=methodName)
4669
Antoine Pitrou25480782010-03-17 22:50:28 +00004670 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004671 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004672 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004673 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004674 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004675 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004676 self.assertEqual(msg, MSG)
4677
Antoine Pitrou25480782010-03-17 22:50:28 +00004678 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004679 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004680 self.serv_conn.send(buf)
4681
Antoine Pitrou25480782010-03-17 22:50:28 +00004682 def testRecvIntoBytearray(self):
4683 buf = bytearray(1024)
4684 nbytes = self.cli_conn.recv_into(buf)
4685 self.assertEqual(nbytes, len(MSG))
4686 msg = buf[:len(MSG)]
4687 self.assertEqual(msg, MSG)
4688
4689 _testRecvIntoBytearray = _testRecvIntoArray
4690
4691 def testRecvIntoMemoryview(self):
4692 buf = bytearray(1024)
4693 nbytes = self.cli_conn.recv_into(memoryview(buf))
4694 self.assertEqual(nbytes, len(MSG))
4695 msg = buf[:len(MSG)]
4696 self.assertEqual(msg, MSG)
4697
4698 _testRecvIntoMemoryview = _testRecvIntoArray
4699
4700 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004701 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004702 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004703 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004704 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004705 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004706 self.assertEqual(msg, MSG)
4707
Antoine Pitrou25480782010-03-17 22:50:28 +00004708 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004709 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004710 self.serv_conn.send(buf)
4711
Antoine Pitrou25480782010-03-17 22:50:28 +00004712 def testRecvFromIntoBytearray(self):
4713 buf = bytearray(1024)
4714 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4715 self.assertEqual(nbytes, len(MSG))
4716 msg = buf[:len(MSG)]
4717 self.assertEqual(msg, MSG)
4718
4719 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4720
4721 def testRecvFromIntoMemoryview(self):
4722 buf = bytearray(1024)
4723 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4724 self.assertEqual(nbytes, len(MSG))
4725 msg = buf[:len(MSG)]
4726 self.assertEqual(msg, MSG)
4727
4728 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4729
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004730 def testRecvFromIntoSmallBuffer(self):
4731 # See issue #20246.
4732 buf = bytearray(8)
4733 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4734
4735 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004736 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004737
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004738 def testRecvFromIntoEmptyBuffer(self):
4739 buf = bytearray()
4740 self.cli_conn.recvfrom_into(buf)
4741 self.cli_conn.recvfrom_into(buf, 0)
4742
4743 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4744
Christian Heimes043d6f62008-01-07 17:19:16 +00004745
4746TIPC_STYPE = 2000
4747TIPC_LOWER = 200
4748TIPC_UPPER = 210
4749
4750def isTipcAvailable():
4751 """Check if the TIPC module is loaded
4752
4753 The TIPC module is not loaded automatically on Ubuntu and probably
4754 other Linux distros.
4755 """
4756 if not hasattr(socket, "AF_TIPC"):
4757 return False
4758 if not os.path.isfile("/proc/modules"):
4759 return False
4760 with open("/proc/modules") as f:
4761 for line in f:
4762 if line.startswith("tipc "):
4763 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004764 return False
4765
Serhiy Storchaka43767632013-11-03 21:31:38 +02004766@unittest.skipUnless(isTipcAvailable(),
4767 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004768class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004769 def testRDM(self):
4770 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4771 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004772 self.addCleanup(srv.close)
4773 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004774
4775 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4776 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4777 TIPC_LOWER, TIPC_UPPER)
4778 srv.bind(srvaddr)
4779
4780 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4781 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4782 cli.sendto(MSG, sendaddr)
4783
4784 msg, recvaddr = srv.recvfrom(1024)
4785
4786 self.assertEqual(cli.getsockname(), recvaddr)
4787 self.assertEqual(msg, MSG)
4788
4789
Serhiy Storchaka43767632013-11-03 21:31:38 +02004790@unittest.skipUnless(isTipcAvailable(),
4791 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004792class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004793 def __init__(self, methodName = 'runTest'):
4794 unittest.TestCase.__init__(self, methodName = methodName)
4795 ThreadableTest.__init__(self)
4796
4797 def setUp(self):
4798 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004799 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004800 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4801 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4802 TIPC_LOWER, TIPC_UPPER)
4803 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004804 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004805 self.serverExplicitReady()
4806 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004807 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004808
4809 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00004810 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00004811 # accept() call; sleep a little while to avoid it, otherwise
4812 # we could get an exception
4813 time.sleep(0.1)
4814 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004815 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004816 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4817 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4818 self.cli.connect(addr)
4819 self.cliaddr = self.cli.getsockname()
4820
4821 def testStream(self):
4822 msg = self.conn.recv(1024)
4823 self.assertEqual(msg, MSG)
4824 self.assertEqual(self.cliaddr, self.connaddr)
4825
4826 def _testStream(self):
4827 self.cli.send(MSG)
4828 self.cli.close()
4829
4830
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004831@unittest.skipUnless(thread, 'Threading required for this test.')
4832class ContextManagersTest(ThreadedTCPSocketTest):
4833
4834 def _testSocketClass(self):
4835 # base test
4836 with socket.socket() as sock:
4837 self.assertFalse(sock._closed)
4838 self.assertTrue(sock._closed)
4839 # close inside with block
4840 with socket.socket() as sock:
4841 sock.close()
4842 self.assertTrue(sock._closed)
4843 # exception inside with block
4844 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004845 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004846 self.assertTrue(sock._closed)
4847
4848 def testCreateConnectionBase(self):
4849 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004850 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004851 data = conn.recv(1024)
4852 conn.sendall(data)
4853
4854 def _testCreateConnectionBase(self):
4855 address = self.serv.getsockname()
4856 with socket.create_connection(address) as sock:
4857 self.assertFalse(sock._closed)
4858 sock.sendall(b'foo')
4859 self.assertEqual(sock.recv(1024), b'foo')
4860 self.assertTrue(sock._closed)
4861
4862 def testCreateConnectionClose(self):
4863 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004864 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004865 data = conn.recv(1024)
4866 conn.sendall(data)
4867
4868 def _testCreateConnectionClose(self):
4869 address = self.serv.getsockname()
4870 with socket.create_connection(address) as sock:
4871 sock.close()
4872 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004873 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004874
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004875
Victor Stinnerdaf45552013-08-28 00:53:59 +02004876class InheritanceTest(unittest.TestCase):
4877 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4878 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004879 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004880 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004881 with socket.socket(socket.AF_INET,
4882 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4883 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004884 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004885
4886 def test_default_inheritable(self):
4887 sock = socket.socket()
4888 with sock:
4889 self.assertEqual(sock.get_inheritable(), False)
4890
4891 def test_dup(self):
4892 sock = socket.socket()
4893 with sock:
4894 newsock = sock.dup()
4895 sock.close()
4896 with newsock:
4897 self.assertEqual(newsock.get_inheritable(), False)
4898
4899 def test_set_inheritable(self):
4900 sock = socket.socket()
4901 with sock:
4902 sock.set_inheritable(True)
4903 self.assertEqual(sock.get_inheritable(), True)
4904
4905 sock.set_inheritable(False)
4906 self.assertEqual(sock.get_inheritable(), False)
4907
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004908 @unittest.skipIf(fcntl is None, "need fcntl")
4909 def test_get_inheritable_cloexec(self):
4910 sock = socket.socket()
4911 with sock:
4912 fd = sock.fileno()
4913 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004914
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004915 # clear FD_CLOEXEC flag
4916 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4917 flags &= ~fcntl.FD_CLOEXEC
4918 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004919
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004920 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004921
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004922 @unittest.skipIf(fcntl is None, "need fcntl")
4923 def test_set_inheritable_cloexec(self):
4924 sock = socket.socket()
4925 with sock:
4926 fd = sock.fileno()
4927 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4928 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004929
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004930 sock.set_inheritable(True)
4931 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4932 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004933
4934
Victor Stinnerdaf45552013-08-28 00:53:59 +02004935 @unittest.skipUnless(hasattr(socket, "socketpair"),
4936 "need socket.socketpair()")
4937 def test_socketpair(self):
4938 s1, s2 = socket.socketpair()
4939 self.addCleanup(s1.close)
4940 self.addCleanup(s2.close)
4941 self.assertEqual(s1.get_inheritable(), False)
4942 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004943
4944
4945@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4946 "SOCK_NONBLOCK not defined")
4947class NonblockConstantTest(unittest.TestCase):
4948 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4949 if nonblock:
4950 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4951 self.assertEqual(s.gettimeout(), timeout)
4952 else:
4953 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4954 self.assertEqual(s.gettimeout(), None)
4955
Charles-François Natali239bb962011-06-03 12:55:15 +02004956 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004957 def test_SOCK_NONBLOCK(self):
4958 # a lot of it seems silly and redundant, but I wanted to test that
4959 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004960 with socket.socket(socket.AF_INET,
4961 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4962 self.checkNonblock(s)
4963 s.setblocking(1)
4964 self.checkNonblock(s, False)
4965 s.setblocking(0)
4966 self.checkNonblock(s)
4967 s.settimeout(None)
4968 self.checkNonblock(s, False)
4969 s.settimeout(2.0)
4970 self.checkNonblock(s, timeout=2.0)
4971 s.setblocking(1)
4972 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004973 # defaulttimeout
4974 t = socket.getdefaulttimeout()
4975 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004976 with socket.socket() as s:
4977 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004978 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004979 with socket.socket() as s:
4980 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004981 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004982 with socket.socket() as s:
4983 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004984 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004985 with socket.socket() as s:
4986 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004987 socket.setdefaulttimeout(t)
4988
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004989
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004990@unittest.skipUnless(os.name == "nt", "Windows specific")
4991@unittest.skipUnless(multiprocessing, "need multiprocessing")
4992class TestSocketSharing(SocketTCPTest):
4993 # This must be classmethod and not staticmethod or multiprocessing
4994 # won't be able to bootstrap it.
4995 @classmethod
4996 def remoteProcessServer(cls, q):
4997 # Recreate socket from shared data
4998 sdata = q.get()
4999 message = q.get()
5000
5001 s = socket.fromshare(sdata)
5002 s2, c = s.accept()
5003
5004 # Send the message
5005 s2.sendall(message)
5006 s2.close()
5007 s.close()
5008
5009 def testShare(self):
5010 # Transfer the listening server socket to another process
5011 # and service it from there.
5012
5013 # Create process:
5014 q = multiprocessing.Queue()
5015 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5016 p.start()
5017
5018 # Get the shared socket data
5019 data = self.serv.share(p.pid)
5020
5021 # Pass the shared socket to the other process
5022 addr = self.serv.getsockname()
5023 self.serv.close()
5024 q.put(data)
5025
5026 # The data that the server will send us
5027 message = b"slapmahfro"
5028 q.put(message)
5029
5030 # Connect
5031 s = socket.create_connection(addr)
5032 # listen for the data
5033 m = []
5034 while True:
5035 data = s.recv(100)
5036 if not data:
5037 break
5038 m.append(data)
5039 s.close()
5040 received = b"".join(m)
5041 self.assertEqual(received, message)
5042 p.join()
5043
5044 def testShareLength(self):
5045 data = self.serv.share(os.getpid())
5046 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5047 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5048
5049 def compareSockets(self, org, other):
5050 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005051 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005052 self.assertEqual(org.gettimeout(), None)
5053 self.assertEqual(org.gettimeout(), other.gettimeout())
5054
5055 self.assertEqual(org.family, other.family)
5056 self.assertEqual(org.type, other.type)
5057 # If the user specified "0" for proto, then
5058 # internally windows will have picked the correct value.
5059 # Python introspection on the socket however will still return
5060 # 0. For the shared socket, the python value is recreated
5061 # from the actual value, so it may not compare correctly.
5062 if org.proto != 0:
5063 self.assertEqual(org.proto, other.proto)
5064
5065 def testShareLocal(self):
5066 data = self.serv.share(os.getpid())
5067 s = socket.fromshare(data)
5068 try:
5069 self.compareSockets(self.serv, s)
5070 finally:
5071 s.close()
5072
5073 def testTypes(self):
5074 families = [socket.AF_INET, socket.AF_INET6]
5075 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5076 for f in families:
5077 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005078 try:
5079 source = socket.socket(f, t)
5080 except OSError:
5081 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005082 try:
5083 data = source.share(os.getpid())
5084 shared = socket.fromshare(data)
5085 try:
5086 self.compareSockets(source, shared)
5087 finally:
5088 shared.close()
5089 finally:
5090 source.close()
5091
5092
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005093@unittest.skipUnless(thread, 'Threading required for this test.')
5094class SendfileUsingSendTest(ThreadedTCPSocketTest):
5095 """
5096 Test the send() implementation of socket.sendfile().
5097 """
5098
5099 FILESIZE = (10 * 1024 * 1024) # 10MB
5100 BUFSIZE = 8192
5101 FILEDATA = b""
5102 TIMEOUT = 2
5103
5104 @classmethod
5105 def setUpClass(cls):
5106 def chunks(total, step):
5107 assert total >= step
5108 while total > step:
5109 yield step
5110 total -= step
5111 if total:
5112 yield total
5113
5114 chunk = b"".join([random.choice(string.ascii_letters).encode()
5115 for i in range(cls.BUFSIZE)])
5116 with open(support.TESTFN, 'wb') as f:
5117 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5118 f.write(chunk)
5119 with open(support.TESTFN, 'rb') as f:
5120 cls.FILEDATA = f.read()
5121 assert len(cls.FILEDATA) == cls.FILESIZE
5122
5123 @classmethod
5124 def tearDownClass(cls):
5125 support.unlink(support.TESTFN)
5126
5127 def accept_conn(self):
5128 self.serv.settimeout(self.TIMEOUT)
5129 conn, addr = self.serv.accept()
5130 conn.settimeout(self.TIMEOUT)
5131 self.addCleanup(conn.close)
5132 return conn
5133
5134 def recv_data(self, conn):
5135 received = []
5136 while True:
5137 chunk = conn.recv(self.BUFSIZE)
5138 if not chunk:
5139 break
5140 received.append(chunk)
5141 return b''.join(received)
5142
5143 def meth_from_sock(self, sock):
5144 # Depending on the mixin class being run return either send()
5145 # or sendfile() method implementation.
5146 return getattr(sock, "_sendfile_use_send")
5147
5148 # regular file
5149
5150 def _testRegularFile(self):
5151 address = self.serv.getsockname()
5152 file = open(support.TESTFN, 'rb')
5153 with socket.create_connection(address) as sock, file as file:
5154 meth = self.meth_from_sock(sock)
5155 sent = meth(file)
5156 self.assertEqual(sent, self.FILESIZE)
5157 self.assertEqual(file.tell(), self.FILESIZE)
5158
5159 def testRegularFile(self):
5160 conn = self.accept_conn()
5161 data = self.recv_data(conn)
5162 self.assertEqual(len(data), self.FILESIZE)
5163 self.assertEqual(data, self.FILEDATA)
5164
5165 # non regular file
5166
5167 def _testNonRegularFile(self):
5168 address = self.serv.getsockname()
5169 file = io.BytesIO(self.FILEDATA)
5170 with socket.create_connection(address) as sock, file as file:
5171 sent = sock.sendfile(file)
5172 self.assertEqual(sent, self.FILESIZE)
5173 self.assertEqual(file.tell(), self.FILESIZE)
5174 self.assertRaises(socket._GiveupOnSendfile,
5175 sock._sendfile_use_sendfile, file)
5176
5177 def testNonRegularFile(self):
5178 conn = self.accept_conn()
5179 data = self.recv_data(conn)
5180 self.assertEqual(len(data), self.FILESIZE)
5181 self.assertEqual(data, self.FILEDATA)
5182
5183 # empty file
5184
5185 def _testEmptyFileSend(self):
5186 address = self.serv.getsockname()
5187 filename = support.TESTFN + "2"
5188 with open(filename, 'wb'):
5189 self.addCleanup(support.unlink, filename)
5190 file = open(filename, 'rb')
5191 with socket.create_connection(address) as sock, file as file:
5192 meth = self.meth_from_sock(sock)
5193 sent = meth(file)
5194 self.assertEqual(sent, 0)
5195 self.assertEqual(file.tell(), 0)
5196
5197 def testEmptyFileSend(self):
5198 conn = self.accept_conn()
5199 data = self.recv_data(conn)
5200 self.assertEqual(data, b"")
5201
5202 # offset
5203
5204 def _testOffset(self):
5205 address = self.serv.getsockname()
5206 file = open(support.TESTFN, 'rb')
5207 with socket.create_connection(address) as sock, file as file:
5208 meth = self.meth_from_sock(sock)
5209 sent = meth(file, offset=5000)
5210 self.assertEqual(sent, self.FILESIZE - 5000)
5211 self.assertEqual(file.tell(), self.FILESIZE)
5212
5213 def testOffset(self):
5214 conn = self.accept_conn()
5215 data = self.recv_data(conn)
5216 self.assertEqual(len(data), self.FILESIZE - 5000)
5217 self.assertEqual(data, self.FILEDATA[5000:])
5218
5219 # count
5220
5221 def _testCount(self):
5222 address = self.serv.getsockname()
5223 file = open(support.TESTFN, 'rb')
5224 with socket.create_connection(address, timeout=2) as sock, file as file:
5225 count = 5000007
5226 meth = self.meth_from_sock(sock)
5227 sent = meth(file, count=count)
5228 self.assertEqual(sent, count)
5229 self.assertEqual(file.tell(), count)
5230
5231 def testCount(self):
5232 count = 5000007
5233 conn = self.accept_conn()
5234 data = self.recv_data(conn)
5235 self.assertEqual(len(data), count)
5236 self.assertEqual(data, self.FILEDATA[:count])
5237
5238 # count small
5239
5240 def _testCountSmall(self):
5241 address = self.serv.getsockname()
5242 file = open(support.TESTFN, 'rb')
5243 with socket.create_connection(address, timeout=2) as sock, file as file:
5244 count = 1
5245 meth = self.meth_from_sock(sock)
5246 sent = meth(file, count=count)
5247 self.assertEqual(sent, count)
5248 self.assertEqual(file.tell(), count)
5249
5250 def testCountSmall(self):
5251 count = 1
5252 conn = self.accept_conn()
5253 data = self.recv_data(conn)
5254 self.assertEqual(len(data), count)
5255 self.assertEqual(data, self.FILEDATA[:count])
5256
5257 # count + offset
5258
5259 def _testCountWithOffset(self):
5260 address = self.serv.getsockname()
5261 file = open(support.TESTFN, 'rb')
5262 with socket.create_connection(address, timeout=2) as sock, file as file:
5263 count = 100007
5264 meth = self.meth_from_sock(sock)
5265 sent = meth(file, offset=2007, count=count)
5266 self.assertEqual(sent, count)
5267 self.assertEqual(file.tell(), count + 2007)
5268
5269 def testCountWithOffset(self):
5270 count = 100007
5271 conn = self.accept_conn()
5272 data = self.recv_data(conn)
5273 self.assertEqual(len(data), count)
5274 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5275
5276 # non blocking sockets are not supposed to work
5277
5278 def _testNonBlocking(self):
5279 address = self.serv.getsockname()
5280 file = open(support.TESTFN, 'rb')
5281 with socket.create_connection(address) as sock, file as file:
5282 sock.setblocking(False)
5283 meth = self.meth_from_sock(sock)
5284 self.assertRaises(ValueError, meth, file)
5285 self.assertRaises(ValueError, sock.sendfile, file)
5286
5287 def testNonBlocking(self):
5288 conn = self.accept_conn()
5289 if conn.recv(8192):
5290 self.fail('was not supposed to receive any data')
5291
5292 # timeout (non-triggered)
5293
5294 def _testWithTimeout(self):
5295 address = self.serv.getsockname()
5296 file = open(support.TESTFN, 'rb')
5297 with socket.create_connection(address, timeout=2) as sock, file as file:
5298 meth = self.meth_from_sock(sock)
5299 sent = meth(file)
5300 self.assertEqual(sent, self.FILESIZE)
5301
5302 def testWithTimeout(self):
5303 conn = self.accept_conn()
5304 data = self.recv_data(conn)
5305 self.assertEqual(len(data), self.FILESIZE)
5306 self.assertEqual(data, self.FILEDATA)
5307
5308 # timeout (triggered)
5309
5310 def _testWithTimeoutTriggeredSend(self):
5311 address = self.serv.getsockname()
5312 file = open(support.TESTFN, 'rb')
5313 with socket.create_connection(address, timeout=0.01) as sock, \
5314 file as file:
5315 meth = self.meth_from_sock(sock)
5316 self.assertRaises(socket.timeout, meth, file)
5317
5318 def testWithTimeoutTriggeredSend(self):
5319 conn = self.accept_conn()
5320 conn.recv(88192)
5321
5322 # errors
5323
5324 def _test_errors(self):
5325 pass
5326
5327 def test_errors(self):
5328 with open(support.TESTFN, 'rb') as file:
5329 with socket.socket(type=socket.SOCK_DGRAM) as s:
5330 meth = self.meth_from_sock(s)
5331 self.assertRaisesRegex(
5332 ValueError, "SOCK_STREAM", meth, file)
5333 with open(support.TESTFN, 'rt') as file:
5334 with socket.socket() as s:
5335 meth = self.meth_from_sock(s)
5336 self.assertRaisesRegex(
5337 ValueError, "binary mode", meth, file)
5338 with open(support.TESTFN, 'rb') as file:
5339 with socket.socket() as s:
5340 meth = self.meth_from_sock(s)
5341 self.assertRaisesRegex(TypeError, "positive integer",
5342 meth, file, count='2')
5343 self.assertRaisesRegex(TypeError, "positive integer",
5344 meth, file, count=0.1)
5345 self.assertRaisesRegex(ValueError, "positive integer",
5346 meth, file, count=0)
5347 self.assertRaisesRegex(ValueError, "positive integer",
5348 meth, file, count=-1)
5349
5350
5351@unittest.skipUnless(thread, 'Threading required for this test.')
5352@unittest.skipUnless(hasattr(os, "sendfile"),
5353 'os.sendfile() required for this test.')
5354class SendfileUsingSendfileTest(SendfileUsingSendTest):
5355 """
5356 Test the sendfile() implementation of socket.sendfile().
5357 """
5358 def meth_from_sock(self, sock):
5359 return getattr(sock, "_sendfile_use_sendfile")
5360
Christian Heimes48371412016-09-06 00:37:46 +02005361
5362@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005363class LinuxKernelCryptoAPI(unittest.TestCase):
5364 # tests for AF_ALG
5365 def create_alg(self, typ, name):
5366 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005367 try:
5368 sock.bind((typ, name))
5369 except FileNotFoundError as e:
5370 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005371 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005372 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005373 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005374 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005375
5376 def test_sha256(self):
5377 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5378 "177a9cb410ff61f20015ad")
5379 with self.create_alg('hash', 'sha256') as algo:
5380 op, _ = algo.accept()
5381 with op:
5382 op.sendall(b"abc")
5383 self.assertEqual(op.recv(512), expected)
5384
5385 op, _ = algo.accept()
5386 with op:
5387 op.send(b'a', socket.MSG_MORE)
5388 op.send(b'b', socket.MSG_MORE)
5389 op.send(b'c', socket.MSG_MORE)
5390 op.send(b'')
5391 self.assertEqual(op.recv(512), expected)
5392
5393 def test_hmac_sha1(self):
5394 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5395 with self.create_alg('hash', 'hmac(sha1)') as algo:
5396 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5397 op, _ = algo.accept()
5398 with op:
5399 op.sendall(b"what do ya want for nothing?")
5400 self.assertEqual(op.recv(512), expected)
5401
Christian Heimese084f842016-09-11 20:11:30 +02005402 # Although it should work with 3.19 and newer the test blocks on
5403 # Ubuntu 15.10 with Kernel 4.2.0-19.
5404 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005405 def test_aes_cbc(self):
5406 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5407 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5408 msg = b"Single block msg"
5409 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5410 msglen = len(msg)
5411 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5412 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5413 op, _ = algo.accept()
5414 with op:
5415 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5416 flags=socket.MSG_MORE)
5417 op.sendall(msg)
5418 self.assertEqual(op.recv(msglen), ciphertext)
5419
5420 op, _ = algo.accept()
5421 with op:
5422 op.sendmsg_afalg([ciphertext],
5423 op=socket.ALG_OP_DECRYPT, iv=iv)
5424 self.assertEqual(op.recv(msglen), msg)
5425
5426 # long message
5427 multiplier = 1024
5428 longmsg = [msg] * multiplier
5429 op, _ = algo.accept()
5430 with op:
5431 op.sendmsg_afalg(longmsg,
5432 op=socket.ALG_OP_ENCRYPT, iv=iv)
5433 enc = op.recv(msglen * multiplier)
5434 self.assertEqual(len(enc), msglen * multiplier)
5435 self.assertTrue(enc[:msglen], ciphertext)
5436
5437 op, _ = algo.accept()
5438 with op:
5439 op.sendmsg_afalg([enc],
5440 op=socket.ALG_OP_DECRYPT, iv=iv)
5441 dec = op.recv(msglen * multiplier)
5442 self.assertEqual(len(dec), msglen * multiplier)
5443 self.assertEqual(dec, msg * multiplier)
5444
Christian Heimese084f842016-09-11 20:11:30 +02005445 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005446 def test_aead_aes_gcm(self):
5447 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5448 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5449 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5450 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5451 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5452 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5453
5454 taglen = len(expected_tag)
5455 assoclen = len(assoc)
5456
5457 with self.create_alg('aead', 'gcm(aes)') as algo:
5458 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5459 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5460 None, taglen)
5461
5462 # send assoc, plain and tag buffer in separate steps
5463 op, _ = algo.accept()
5464 with op:
5465 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5466 assoclen=assoclen, flags=socket.MSG_MORE)
5467 op.sendall(assoc, socket.MSG_MORE)
5468 op.sendall(plain, socket.MSG_MORE)
5469 op.sendall(b'\x00' * taglen)
5470 res = op.recv(assoclen + len(plain) + taglen)
5471 self.assertEqual(expected_ct, res[assoclen:-taglen])
5472 self.assertEqual(expected_tag, res[-taglen:])
5473
5474 # now with msg
5475 op, _ = algo.accept()
5476 with op:
5477 msg = assoc + plain + b'\x00' * taglen
5478 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5479 assoclen=assoclen)
5480 res = op.recv(assoclen + len(plain) + taglen)
5481 self.assertEqual(expected_ct, res[assoclen:-taglen])
5482 self.assertEqual(expected_tag, res[-taglen:])
5483
5484 # create anc data manually
5485 pack_uint32 = struct.Struct('I').pack
5486 op, _ = algo.accept()
5487 with op:
5488 msg = assoc + plain + b'\x00' * taglen
5489 op.sendmsg(
5490 [msg],
5491 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5492 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5493 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5494 )
5495 )
5496 res = op.recv(len(msg))
5497 self.assertEqual(expected_ct, res[assoclen:-taglen])
5498 self.assertEqual(expected_tag, res[-taglen:])
5499
5500 # decrypt and verify
5501 op, _ = algo.accept()
5502 with op:
5503 msg = assoc + expected_ct + expected_tag
5504 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5505 assoclen=assoclen)
5506 res = op.recv(len(msg))
5507 self.assertEqual(plain, res[assoclen:-taglen])
5508
Christian Heimese084f842016-09-11 20:11:30 +02005509 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005510 def test_drbg_pr_sha256(self):
5511 # deterministic random bit generator, prediction resistance, sha256
5512 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5513 extra_seed = os.urandom(32)
5514 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5515 op, _ = algo.accept()
5516 with op:
5517 rn = op.recv(32)
5518 self.assertEqual(len(rn), 32)
5519
5520 def test_sendmsg_afalg_args(self):
5521 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005522 with sock:
5523 with self.assertRaises(TypeError):
5524 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005525
Christian Heimes02b30352016-09-11 19:49:56 +02005526 with self.assertRaises(TypeError):
5527 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005528
Christian Heimes02b30352016-09-11 19:49:56 +02005529 with self.assertRaises(TypeError):
5530 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005531
Christian Heimes02b30352016-09-11 19:49:56 +02005532 with self.assertRaises(TypeError):
5533 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005534
Christian Heimes02b30352016-09-11 19:49:56 +02005535 with self.assertRaises(TypeError):
5536 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5537
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005538
Guido van Rossumb995eb72002-07-31 16:08:40 +00005539def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005540 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005541 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005542
5543 tests.extend([
5544 NonBlockingTCPTests,
5545 FileObjectClassTestCase,
5546 UnbufferedFileObjectClassTestCase,
5547 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005548 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005549 UnicodeReadFileObjectClassTestCase,
5550 UnicodeWriteFileObjectClassTestCase,
5551 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005552 NetworkConnectionNoServer,
5553 NetworkConnectionAttributesTest,
5554 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005555 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005556 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005557 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005558 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005559 tests.append(BasicSocketPairTest)
5560 tests.append(TestUnixDomain)
5561 tests.append(TestLinuxAbstractNamespace)
5562 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005563 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005564 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005565 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005566 tests.extend([
5567 CmsgMacroTests,
5568 SendmsgUDPTest,
5569 RecvmsgUDPTest,
5570 RecvmsgIntoUDPTest,
5571 SendmsgUDP6Test,
5572 RecvmsgUDP6Test,
5573 RecvmsgRFC3542AncillaryUDP6Test,
5574 RecvmsgIntoRFC3542AncillaryUDP6Test,
5575 RecvmsgIntoUDP6Test,
5576 SendmsgTCPTest,
5577 RecvmsgTCPTest,
5578 RecvmsgIntoTCPTest,
5579 SendmsgSCTPStreamTest,
5580 RecvmsgSCTPStreamTest,
5581 RecvmsgIntoSCTPStreamTest,
5582 SendmsgUnixStreamTest,
5583 RecvmsgUnixStreamTest,
5584 RecvmsgIntoUnixStreamTest,
5585 RecvmsgSCMRightsStreamTest,
5586 RecvmsgIntoSCMRightsStreamTest,
5587 # These are slow when setitimer() is not available
5588 InterruptedRecvTimeoutTest,
5589 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005590 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005591 SendfileUsingSendTest,
5592 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005593 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005594
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005595 thread_info = support.threading_setup()
5596 support.run_unittest(*tests)
5597 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005598
5599if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005600 test_main()