blob: 80dfc405c7180929d2734a59a2217e37a9970a13 [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()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100281 try:
282 self.clientSetUp()
283 except BaseException as e:
284 self.queue.put(e)
285 self.clientTearDown()
286 return
287 finally:
288 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200289 if self.server_crashed:
290 self.clientTearDown()
291 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000292 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000293 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000294 try:
295 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000296 except BaseException as e:
297 self.queue.put(e)
298 finally:
299 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000300
301 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000302 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000303
304 def clientTearDown(self):
305 self.done.set()
306 thread.exit()
307
308class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
309
310 def __init__(self, methodName='runTest'):
311 SocketTCPTest.__init__(self, methodName=methodName)
312 ThreadableTest.__init__(self)
313
314 def clientSetUp(self):
315 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
316
317 def clientTearDown(self):
318 self.cli.close()
319 self.cli = None
320 ThreadableTest.clientTearDown(self)
321
322class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
323
324 def __init__(self, methodName='runTest'):
325 SocketUDPTest.__init__(self, methodName=methodName)
326 ThreadableTest.__init__(self)
327
328 def clientSetUp(self):
329 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
330
Brian Curtin3beb38f2010-11-04 03:41:43 +0000331 def clientTearDown(self):
332 self.cli.close()
333 self.cli = None
334 ThreadableTest.clientTearDown(self)
335
Charles-François Natali47413c12011-10-06 19:47:44 +0200336class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
337
338 def __init__(self, methodName='runTest'):
339 SocketCANTest.__init__(self, methodName=methodName)
340 ThreadableTest.__init__(self)
341
342 def clientSetUp(self):
343 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
344 try:
345 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200346 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200347 # skipTest should not be called here, and will be called in the
348 # server instead
349 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200350
351 def clientTearDown(self):
352 self.cli.close()
353 self.cli = None
354 ThreadableTest.clientTearDown(self)
355
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100356class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
357
358 def __init__(self, methodName='runTest'):
359 SocketRDSTest.__init__(self, methodName=methodName)
360 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100361
362 def clientSetUp(self):
363 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
364 try:
365 # RDS sockets must be bound explicitly to send or receive data
366 self.cli.bind((HOST, 0))
367 self.cli_addr = self.cli.getsockname()
368 except OSError:
369 # skipTest should not be called here, and will be called in the
370 # server instead
371 pass
372
373 def clientTearDown(self):
374 self.cli.close()
375 self.cli = None
376 ThreadableTest.clientTearDown(self)
377
Guido van Rossum24e4af82002-06-12 19:18:08 +0000378class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000379 """Socket tests for client-server connection.
380
381 self.cli_conn is a client socket connected to the server. The
382 setUp() method guarantees that it is connected to the server.
383 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000384
385 def __init__(self, methodName='runTest'):
386 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
387
388 def setUp(self):
389 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000390 # Indicate explicitly we're ready for the client thread to
391 # proceed and then perform the blocking call to accept
392 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000393 conn, addr = self.serv.accept()
394 self.cli_conn = conn
395
396 def tearDown(self):
397 self.cli_conn.close()
398 self.cli_conn = None
399 ThreadedTCPSocketTest.tearDown(self)
400
401 def clientSetUp(self):
402 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000403 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000404 self.serv_conn = self.cli
405
406 def clientTearDown(self):
407 self.serv_conn.close()
408 self.serv_conn = None
409 ThreadedTCPSocketTest.clientTearDown(self)
410
Dave Cole331708b2004-08-09 04:51:41 +0000411class SocketPairTest(unittest.TestCase, ThreadableTest):
412
413 def __init__(self, methodName='runTest'):
414 unittest.TestCase.__init__(self, methodName=methodName)
415 ThreadableTest.__init__(self)
416
417 def setUp(self):
418 self.serv, self.cli = socket.socketpair()
419
420 def tearDown(self):
421 self.serv.close()
422 self.serv = None
423
424 def clientSetUp(self):
425 pass
426
427 def clientTearDown(self):
428 self.cli.close()
429 self.cli = None
430 ThreadableTest.clientTearDown(self)
431
Tim Peters494aaee2004-08-09 18:54:11 +0000432
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000433# The following classes are used by the sendmsg()/recvmsg() tests.
434# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
435# gives a drop-in replacement for SocketConnectedTest, but different
436# address families can be used, and the attributes serv_addr and
437# cli_addr will be set to the addresses of the endpoints.
438
439class SocketTestBase(unittest.TestCase):
440 """A base class for socket tests.
441
442 Subclasses must provide methods newSocket() to return a new socket
443 and bindSock(sock) to bind it to an unused address.
444
445 Creates a socket self.serv and sets self.serv_addr to its address.
446 """
447
448 def setUp(self):
449 self.serv = self.newSocket()
450 self.bindServer()
451
452 def bindServer(self):
453 """Bind server socket and set self.serv_addr to its address."""
454 self.bindSock(self.serv)
455 self.serv_addr = self.serv.getsockname()
456
457 def tearDown(self):
458 self.serv.close()
459 self.serv = None
460
461
462class SocketListeningTestMixin(SocketTestBase):
463 """Mixin to listen on the server socket."""
464
465 def setUp(self):
466 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100467 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000468
469
470class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
471 ThreadableTest):
472 """Mixin to add client socket and allow client/server tests.
473
474 Client socket is self.cli and its address is self.cli_addr. See
475 ThreadableTest for usage information.
476 """
477
478 def __init__(self, *args, **kwargs):
479 super().__init__(*args, **kwargs)
480 ThreadableTest.__init__(self)
481
482 def clientSetUp(self):
483 self.cli = self.newClientSocket()
484 self.bindClient()
485
486 def newClientSocket(self):
487 """Return a new socket for use as client."""
488 return self.newSocket()
489
490 def bindClient(self):
491 """Bind client socket and set self.cli_addr to its address."""
492 self.bindSock(self.cli)
493 self.cli_addr = self.cli.getsockname()
494
495 def clientTearDown(self):
496 self.cli.close()
497 self.cli = None
498 ThreadableTest.clientTearDown(self)
499
500
501class ConnectedStreamTestMixin(SocketListeningTestMixin,
502 ThreadedSocketTestMixin):
503 """Mixin to allow client/server stream tests with connected client.
504
505 Server's socket representing connection to client is self.cli_conn
506 and client's connection to server is self.serv_conn. (Based on
507 SocketConnectedTest.)
508 """
509
510 def setUp(self):
511 super().setUp()
512 # Indicate explicitly we're ready for the client thread to
513 # proceed and then perform the blocking call to accept
514 self.serverExplicitReady()
515 conn, addr = self.serv.accept()
516 self.cli_conn = conn
517
518 def tearDown(self):
519 self.cli_conn.close()
520 self.cli_conn = None
521 super().tearDown()
522
523 def clientSetUp(self):
524 super().clientSetUp()
525 self.cli.connect(self.serv_addr)
526 self.serv_conn = self.cli
527
528 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100529 try:
530 self.serv_conn.close()
531 self.serv_conn = None
532 except AttributeError:
533 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000534 super().clientTearDown()
535
536
537class UnixSocketTestBase(SocketTestBase):
538 """Base class for Unix-domain socket tests."""
539
540 # This class is used for file descriptor passing tests, so we
541 # create the sockets in a private directory so that other users
542 # can't send anything that might be problematic for a privileged
543 # user running the tests.
544
545 def setUp(self):
546 self.dir_path = tempfile.mkdtemp()
547 self.addCleanup(os.rmdir, self.dir_path)
548 super().setUp()
549
550 def bindSock(self, sock):
551 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100552 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000553 self.addCleanup(support.unlink, path)
554
555class UnixStreamBase(UnixSocketTestBase):
556 """Base class for Unix-domain SOCK_STREAM tests."""
557
558 def newSocket(self):
559 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
560
561
562class InetTestBase(SocketTestBase):
563 """Base class for IPv4 socket tests."""
564
565 host = HOST
566
567 def setUp(self):
568 super().setUp()
569 self.port = self.serv_addr[1]
570
571 def bindSock(self, sock):
572 support.bind_port(sock, host=self.host)
573
574class TCPTestBase(InetTestBase):
575 """Base class for TCP-over-IPv4 tests."""
576
577 def newSocket(self):
578 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
579
580class UDPTestBase(InetTestBase):
581 """Base class for UDP-over-IPv4 tests."""
582
583 def newSocket(self):
584 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
585
586class SCTPStreamBase(InetTestBase):
587 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
588
589 def newSocket(self):
590 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
591 socket.IPPROTO_SCTP)
592
593
594class Inet6TestBase(InetTestBase):
595 """Base class for IPv6 socket tests."""
596
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200597 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000598
599class UDP6TestBase(Inet6TestBase):
600 """Base class for UDP-over-IPv6 tests."""
601
602 def newSocket(self):
603 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
604
605
606# Test-skipping decorators for use with ThreadableTest.
607
608def skipWithClientIf(condition, reason):
609 """Skip decorated test if condition is true, add client_skip decorator.
610
611 If the decorated object is not a class, sets its attribute
612 "client_skip" to a decorator which will return an empty function
613 if the test is to be skipped, or the original function if it is
614 not. This can be used to avoid running the client part of a
615 skipped test when using ThreadableTest.
616 """
617 def client_pass(*args, **kwargs):
618 pass
619 def skipdec(obj):
620 retval = unittest.skip(reason)(obj)
621 if not isinstance(obj, type):
622 retval.client_skip = lambda f: client_pass
623 return retval
624 def noskipdec(obj):
625 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
626 obj.client_skip = lambda f: f
627 return obj
628 return skipdec if condition else noskipdec
629
630
631def requireAttrs(obj, *attributes):
632 """Skip decorated test if obj is missing any of the given attributes.
633
634 Sets client_skip attribute as skipWithClientIf() does.
635 """
636 missing = [name for name in attributes if not hasattr(obj, name)]
637 return skipWithClientIf(
638 missing, "don't have " + ", ".join(name for name in missing))
639
640
641def requireSocket(*args):
642 """Skip decorated test if a socket cannot be created with given arguments.
643
644 When an argument is given as a string, will use the value of that
645 attribute of the socket module, or skip the test if it doesn't
646 exist. Sets client_skip attribute as skipWithClientIf() does.
647 """
648 err = None
649 missing = [obj for obj in args if
650 isinstance(obj, str) and not hasattr(socket, obj)]
651 if missing:
652 err = "don't have " + ", ".join(name for name in missing)
653 else:
654 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
655 for obj in args]
656 try:
657 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200658 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000659 # XXX: check errno?
660 err = str(e)
661 else:
662 s.close()
663 return skipWithClientIf(
664 err is not None,
665 "can't create socket({0}): {1}".format(
666 ", ".join(str(o) for o in args), err))
667
668
Guido van Rossum24e4af82002-06-12 19:18:08 +0000669#######################################################################
670## Begin Tests
671
672class GeneralModuleTests(unittest.TestCase):
673
Ethan Furman7184bac2014-10-14 18:56:53 -0700674 def test_SocketType_is_socketobject(self):
675 import _socket
676 self.assertTrue(socket.SocketType is _socket.socket)
677 s = socket.socket()
678 self.assertIsInstance(s, socket.SocketType)
679 s.close()
680
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000681 def test_repr(self):
682 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200683 with s:
684 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000685 self.assertIn('family=%s' % socket.AF_INET, repr(s))
686 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200687 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200688 self.assertNotIn('raddr', repr(s))
689 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200690 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200691 self.assertIn(str(s.getsockname()), repr(s))
692 self.assertIn('[closed]', repr(s))
693 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000694
Victor Stinnere254e532014-07-26 14:36:55 +0200695 @unittest.skipUnless(_socket is not None, 'need _socket module')
696 def test_csocket_repr(self):
697 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
698 try:
699 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
700 % (s.fileno(), s.family, s.type, s.proto))
701 self.assertEqual(repr(s), expected)
702 finally:
703 s.close()
704 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
705 % (s.family, s.type, s.proto))
706 self.assertEqual(repr(s), expected)
707
Raymond Hettinger027bb632004-05-31 03:09:25 +0000708 def test_weakref(self):
709 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
710 p = proxy(s)
711 self.assertEqual(p.fileno(), s.fileno())
712 s.close()
713 s = None
714 try:
715 p.fileno()
716 except ReferenceError:
717 pass
718 else:
719 self.fail('Socket proxy still exists')
720
Guido van Rossum24e4af82002-06-12 19:18:08 +0000721 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000722 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300723 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200724 with self.assertRaises(OSError, msg=msg % 'OSError'):
725 raise OSError
726 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000727 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200728 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000729 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000730
Ezio Melotti63e42302011-05-07 19:47:48 +0300731 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000732 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300733 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
734 self.addCleanup(s.close)
735 s.bind(('', 0))
736 sockname = s.getsockname()
737 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300738 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300739 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300740 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400741 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300742 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300743 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300744 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400745 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300746 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300747 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300748 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300749 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300750 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300751 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300752 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400753 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300754 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300755 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300756 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400757 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300758 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300759 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300760 self.assertIn('not NoneType', str(cm.exception))
761 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300762 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300763 self.assertIn('an integer is required', str(cm.exception))
764 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300765 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300766 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300767 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300768 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300769 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300770 self.assertIn('(1 given)', str(cm.exception))
771 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300772 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300773 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300774
Guido van Rossum24e4af82002-06-12 19:18:08 +0000775 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000776 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000777 socket.AF_INET
778 socket.SOCK_STREAM
779 socket.SOCK_DGRAM
780 socket.SOCK_RAW
781 socket.SOCK_RDM
782 socket.SOCK_SEQPACKET
783 socket.SOL_SOCKET
784 socket.SO_REUSEADDR
785
Guido van Rossum654c11e2002-06-13 20:24:17 +0000786 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000787 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000788 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000789 try:
790 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200791 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000792 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600793 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000794 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000795 try:
796 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200797 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000798 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600799 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000800 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000801 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000802 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000803 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000804
Charles-François Natali0cc86852013-09-13 19:53:08 +0200805 def test_host_resolution(self):
Charles-François Natali0cc86852013-09-13 19:53:08 +0200806 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
807 self.assertEqual(socket.gethostbyname(addr), addr)
808
809 # we don't test support.HOSTv6 because there's a chance it doesn't have
810 # a matching name entry (e.g. 'ip6-localhost')
811 for host in [support.HOST]:
812 self.assertIn(host, socket.gethostbyaddr(host)[2])
813
Xiang Zhang284a2ba2017-03-07 11:53:29 +0800814 def test_host_resolution_bad_address(self):
815 # These are all malformed IP addresses and expected not to resolve to
816 # any result. But some ISPs, e.g. AWS, may successfully resolve these
817 # IPs.
818 explanation = (
819 "resolving an invalid IP address did not raise OSError; "
820 "can be caused by a broken DNS server"
821 )
822 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
823 '1:1:1:1:1:1:1:1:1']:
824 with self.assertRaises(OSError):
825 socket.gethostbyname(addr)
826 with self.assertRaises(OSError, msg=explanation):
827 socket.gethostbyaddr(addr)
828
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000829 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
830 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
831 def test_sethostname(self):
832 oldhn = socket.gethostname()
833 try:
834 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200835 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000836 if e.errno == errno.EPERM:
837 self.skipTest("test should be run as root")
838 else:
839 raise
840 try:
841 # running test as root!
842 self.assertEqual(socket.gethostname(), 'new')
843 # Should work with bytes objects too
844 socket.sethostname(b'bar')
845 self.assertEqual(socket.gethostname(), 'bar')
846 finally:
847 socket.sethostname(oldhn)
848
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700849 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
850 'socket.if_nameindex() not available.')
851 def testInterfaceNameIndex(self):
852 interfaces = socket.if_nameindex()
853 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200854 self.assertIsInstance(index, int)
855 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700856 # interface indices are non-zero integers
857 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200858 _index = socket.if_nametoindex(name)
859 self.assertIsInstance(_index, int)
860 self.assertEqual(index, _index)
861 _name = socket.if_indextoname(index)
862 self.assertIsInstance(_name, str)
863 self.assertEqual(name, _name)
864
865 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
866 'socket.if_nameindex() not available.')
867 def testInvalidInterfaceNameIndex(self):
868 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200869 self.assertRaises(OSError, socket.if_indextoname, 0)
870 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200871 # test with invalid values
872 self.assertRaises(TypeError, socket.if_nametoindex, 0)
873 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700874
Serhiy Storchaka43767632013-11-03 21:31:38 +0200875 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
876 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000877 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000878 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200879 try:
880 # On some versions, this loses a reference
881 orig = sys.getrefcount(__name__)
882 socket.getnameinfo(__name__,0)
883 except TypeError:
884 if sys.getrefcount(__name__) != orig:
885 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000886
Guido van Rossum24e4af82002-06-12 19:18:08 +0000887 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000888 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000889 try:
890 # On some versions, this crashes the interpreter.
891 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200892 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000893 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000894
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000895 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000896 # This just checks that htons etc. are their own inverse,
897 # when looking at the lower 16 or 32 bits.
898 sizes = {socket.htonl: 32, socket.ntohl: 32,
899 socket.htons: 16, socket.ntohs: 16}
900 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000901 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000902 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
903 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000904
Guido van Rossuma2627af2002-09-14 00:58:46 +0000905 swapped = func(mask)
906 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000907 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000908
Serhiy Storchakada885962017-03-19 20:53:42 +0200909 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +0000910 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000911 good_values = [ 1, 2, 3, 1, 2, 3 ]
912 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000913 for k in good_values:
914 socket.ntohl(k)
915 socket.ntohs(k)
916 socket.htonl(k)
917 socket.htons(k)
918 for k in bad_values:
919 self.assertRaises(OverflowError, socket.ntohl, k)
920 self.assertRaises(OverflowError, socket.ntohs, k)
921 self.assertRaises(OverflowError, socket.htonl, k)
922 self.assertRaises(OverflowError, socket.htons, k)
923
Barry Warsaw11b91a02004-06-28 00:50:43 +0000924 def testGetServBy(self):
925 eq = self.assertEqual
926 # Find one service that exists, then check all the related interfaces.
927 # I've ordered this by protocols that have both a tcp and udp
928 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200929 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200930 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000931 # avoid the 'echo' service on this platform, as there is an
932 # assumption breaking non-standard port/protocol entry
933 services = ('daytime', 'qotd', 'domain')
934 else:
935 services = ('echo', 'daytime', 'domain')
936 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000937 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000938 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000939 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200940 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000941 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000942 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200943 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000944 # Try same call with optional protocol omitted
945 port2 = socket.getservbyname(service)
946 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400947 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000948 try:
949 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200950 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000951 udpport = None
952 else:
953 eq(udpport, port)
954 # Now make sure the lookup by port returns the same service name
955 eq(socket.getservbyport(port2), service)
956 eq(socket.getservbyport(port, 'tcp'), service)
957 if udpport is not None:
958 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000959 # Make sure getservbyport does not accept out of range ports.
960 self.assertRaises(OverflowError, socket.getservbyport, -1)
961 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000962
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000963 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000964 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000965 # The default timeout should initially be None
966 self.assertEqual(socket.getdefaulttimeout(), None)
967 s = socket.socket()
968 self.assertEqual(s.gettimeout(), None)
969 s.close()
970
971 # Set the default timeout to 10, and see if it propagates
972 socket.setdefaulttimeout(10)
973 self.assertEqual(socket.getdefaulttimeout(), 10)
974 s = socket.socket()
975 self.assertEqual(s.gettimeout(), 10)
976 s.close()
977
978 # Reset the default timeout to None, and see if it propagates
979 socket.setdefaulttimeout(None)
980 self.assertEqual(socket.getdefaulttimeout(), None)
981 s = socket.socket()
982 self.assertEqual(s.gettimeout(), None)
983 s.close()
984
985 # Check that setting it to an invalid value raises ValueError
986 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
987
988 # Check that setting it to an invalid type raises TypeError
989 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
990
Serhiy Storchaka43767632013-11-03 21:31:38 +0200991 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
992 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000993 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000994 # Test that issue1008086 and issue767150 are fixed.
995 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000996 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
997 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000998
Serhiy Storchaka43767632013-11-03 21:31:38 +0200999 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1000 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001001 def testIPv4toString(self):
1002 from socket import inet_aton as f, inet_pton, AF_INET
1003 g = lambda a: inet_pton(AF_INET, a)
1004
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001005 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001006 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001007 )
1008
Ezio Melottib3aedd42010-11-20 19:04:17 +00001009 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1010 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1011 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1012 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1013 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001014 assertInvalid(f, '0.0.0.')
1015 assertInvalid(f, '300.0.0.0')
1016 assertInvalid(f, 'a.0.0.0')
1017 assertInvalid(f, '1.2.3.4.5')
1018 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001019
Ezio Melottib3aedd42010-11-20 19:04:17 +00001020 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1021 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1022 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1023 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001024 assertInvalid(g, '0.0.0.')
1025 assertInvalid(g, '300.0.0.0')
1026 assertInvalid(g, 'a.0.0.0')
1027 assertInvalid(g, '1.2.3.4.5')
1028 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001029
Serhiy Storchaka43767632013-11-03 21:31:38 +02001030 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1031 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001032 def testIPv6toString(self):
1033 try:
1034 from socket import inet_pton, AF_INET6, has_ipv6
1035 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001036 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001037 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001038 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001039
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001040 if sys.platform == "win32":
1041 try:
1042 inet_pton(AF_INET6, '::')
1043 except OSError as e:
1044 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001045 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001046
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001047 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001048 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001049 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001050 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001051
Ezio Melottib3aedd42010-11-20 19:04:17 +00001052 self.assertEqual(b'\x00' * 16, f('::'))
1053 self.assertEqual(b'\x00' * 16, f('0::0'))
1054 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1055 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001056 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 +00001057 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1058 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001059 self.assertEqual(
1060 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1061 f('ad42:abc::127:0:254:2')
1062 )
1063 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1064 assertInvalid('0x20::')
1065 assertInvalid(':::')
1066 assertInvalid('::0::')
1067 assertInvalid('1::abc::')
1068 assertInvalid('1::abc::def')
1069 assertInvalid('1:2:3:4:5:6:')
1070 assertInvalid('1:2:3:4:5:6')
1071 assertInvalid('1:2:3:4:5:6:7:8:')
1072 assertInvalid('1:2:3:4:5:6:7:8:0')
1073
1074 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1075 f('::254.42.23.64')
1076 )
1077 self.assertEqual(
1078 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1079 f('42::a29b:254.42.23.64')
1080 )
1081 self.assertEqual(
1082 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1083 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1084 )
1085 assertInvalid('255.254.253.252')
1086 assertInvalid('1::260.2.3.0')
1087 assertInvalid('1::0.be.e.0')
1088 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1089 assertInvalid('::1.2.3.4:0')
1090 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001091
Serhiy Storchaka43767632013-11-03 21:31:38 +02001092 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1093 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001094 def testStringToIPv4(self):
1095 from socket import inet_ntoa as f, inet_ntop, AF_INET
1096 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001097 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001098 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001099 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001100
Ezio Melottib3aedd42010-11-20 19:04:17 +00001101 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1102 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1103 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1104 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001105 assertInvalid(f, b'\x00' * 3)
1106 assertInvalid(f, b'\x00' * 5)
1107 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001108 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001109
Ezio Melottib3aedd42010-11-20 19:04:17 +00001110 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1111 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1112 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001113 assertInvalid(g, b'\x00' * 3)
1114 assertInvalid(g, b'\x00' * 5)
1115 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001116 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001117
Serhiy Storchaka43767632013-11-03 21:31:38 +02001118 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1119 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001120 def testStringToIPv6(self):
1121 try:
1122 from socket import inet_ntop, AF_INET6, has_ipv6
1123 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001124 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001125 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001126 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001127
1128 if sys.platform == "win32":
1129 try:
1130 inet_ntop(AF_INET6, b'\x00' * 16)
1131 except OSError as e:
1132 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001133 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001134
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001135 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001136 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001137 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001138 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001139
Ezio Melottib3aedd42010-11-20 19:04:17 +00001140 self.assertEqual('::', f(b'\x00' * 16))
1141 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1142 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001143 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001144 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 +00001145 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001146 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001147
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001148 assertInvalid(b'\x12' * 15)
1149 assertInvalid(b'\x12' * 17)
1150 assertInvalid(b'\x12' * 4)
1151
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001152 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001153
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001154 def testSockName(self):
1155 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001156 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001157 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001158 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001159 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001160 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001161 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1162 # it reasonable to get the host's addr in addition to 0.0.0.0.
1163 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001164 try:
1165 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001166 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001167 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001168 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001169 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001170 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001171
1172 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001173 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001174 # We know a socket should start without reuse==0
1175 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001176 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001177 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001178 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001179
1180 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001181 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001182 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001183 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001184 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1185 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001186 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001187
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001188 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001189 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001190 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1191 sock.settimeout(1)
1192 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001193 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001194
Martin Panter50ab1a32016-04-11 00:38:12 +00001195 def testCloseException(self):
1196 sock = socket.socket()
1197 socket.socket(fileno=sock.fileno()).close()
1198 try:
1199 sock.close()
1200 except OSError as err:
1201 # Winsock apparently raises ENOTSOCK
1202 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1203 else:
1204 self.fail("close() should raise EBADF/ENOTSOCK")
1205
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001206 def testNewAttributes(self):
1207 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001208
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001209 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1210 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001211 if hasattr(socket, 'SOCK_CLOEXEC'):
1212 self.assertIn(sock.type,
1213 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1214 socket.SOCK_STREAM))
1215 else:
1216 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001217 self.assertEqual(sock.proto, 0)
1218 sock.close()
1219
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001220 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001221 sock = socket.socket()
1222 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001223 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001224 big_port = port + 65536
1225 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001226 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1227 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1228 # Since find_unused_port() is inherently subject to race conditions, we
1229 # call it a couple times if necessary.
1230 for i in itertools.count():
1231 port = support.find_unused_port()
1232 try:
1233 sock.bind((HOST, port))
1234 except OSError as e:
1235 if e.errno != errno.EADDRINUSE or i == 5:
1236 raise
1237 else:
1238 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001239
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001240 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001241 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001242 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1243 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1244 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1245 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001246 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1247 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001248 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001249 self.assertRaises(ValueError, s.ioctl, -1, None)
1250 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001251
Steve Dowerea93ac02016-06-17 12:52:18 -07001252 @unittest.skipUnless(os.name == "nt", "Windows specific")
1253 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1254 'Loopback fast path support required for this test')
1255 def test_sio_loopback_fast_path(self):
1256 s = socket.socket()
1257 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001258 try:
1259 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1260 except OSError as exc:
1261 WSAEOPNOTSUPP = 10045
1262 if exc.winerror == WSAEOPNOTSUPP:
1263 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1264 "doesn't implemented in this Windows version")
1265 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001266 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1267
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001268 def testGetaddrinfo(self):
1269 try:
1270 socket.getaddrinfo('localhost', 80)
1271 except socket.gaierror as err:
1272 if err.errno == socket.EAI_SERVICE:
1273 # see http://bugs.python.org/issue1282647
1274 self.skipTest("buggy libc version")
1275 raise
1276 # len of every sequence is supposed to be == 5
1277 for info in socket.getaddrinfo(HOST, None):
1278 self.assertEqual(len(info), 5)
1279 # host can be a domain name, a string representation of an
1280 # IPv4/v6 address or None
1281 socket.getaddrinfo('localhost', 80)
1282 socket.getaddrinfo('127.0.0.1', 80)
1283 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001284 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001285 socket.getaddrinfo('::1', 80)
1286 # port can be a string service name such as "http", a numeric
1287 # port number or None
1288 socket.getaddrinfo(HOST, "http")
1289 socket.getaddrinfo(HOST, 80)
1290 socket.getaddrinfo(HOST, None)
1291 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001292 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1293 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001294 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001295 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1296 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001297 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001298 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1299 for _, socktype, _, _, _ in infos:
1300 self.assertEqual(socktype, socket.SOCK_STREAM)
1301 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001302 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001303 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1304 # a server willing to support both IPv4 and IPv6 will
1305 # usually do this
1306 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1307 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001308 # test keyword arguments
1309 a = socket.getaddrinfo(HOST, None)
1310 b = socket.getaddrinfo(host=HOST, port=None)
1311 self.assertEqual(a, b)
1312 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1313 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1314 self.assertEqual(a, b)
1315 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1316 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1317 self.assertEqual(a, b)
1318 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1319 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1320 self.assertEqual(a, b)
1321 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1322 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1323 self.assertEqual(a, b)
1324 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1325 socket.AI_PASSIVE)
1326 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1327 type=socket.SOCK_STREAM, proto=0,
1328 flags=socket.AI_PASSIVE)
1329 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001330 # Issue #6697.
1331 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001332
Ned Deilyb24f4812014-02-13 22:50:42 -08001333 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001334 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001335 try:
1336 # The arguments here are undefined and the call may succeed
1337 # or fail. All we care here is that it doesn't segfault.
1338 socket.getaddrinfo("localhost", None, 0, 0, 0,
1339 socket.AI_NUMERICSERV)
1340 except socket.gaierror:
1341 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001342
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001343 def test_getnameinfo(self):
1344 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001345 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001346
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001347 @unittest.skipUnless(support.is_resource_enabled('network'),
1348 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001349 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001350 # Check for internet access before running test
1351 # (issue #12804, issue #25138).
1352 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001353 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001354
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001355 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001356 domain = 'испытание.pythontest.net'
1357 socket.gethostbyname(domain)
1358 socket.gethostbyname_ex(domain)
1359 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001360 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1361 # have a reverse entry yet
1362 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001363
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001364 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001365 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001366 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1367 self.skipTest("signal.alarm and socket.socketpair required for this test")
1368 # Our signal handlers clobber the C errno by calling a math function
1369 # with an invalid domain value.
1370 def ok_handler(*args):
1371 self.assertRaises(ValueError, math.acosh, 0)
1372 def raising_handler(*args):
1373 self.assertRaises(ValueError, math.acosh, 0)
1374 1 // 0
1375 c, s = socket.socketpair()
1376 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1377 try:
1378 if with_timeout:
1379 # Just above the one second minimum for signal.alarm
1380 c.settimeout(1.5)
1381 with self.assertRaises(ZeroDivisionError):
1382 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001383 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001384 if with_timeout:
1385 signal.signal(signal.SIGALRM, ok_handler)
1386 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001387 self.assertRaises(socket.timeout, c.sendall,
1388 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001389 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001390 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001391 signal.signal(signal.SIGALRM, old_alarm)
1392 c.close()
1393 s.close()
1394
1395 def test_sendall_interrupted(self):
1396 self.check_sendall_interrupted(False)
1397
1398 def test_sendall_interrupted_with_timeout(self):
1399 self.check_sendall_interrupted(True)
1400
Antoine Pitroue033e062010-10-29 10:38:18 +00001401 def test_dealloc_warn(self):
1402 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1403 r = repr(sock)
1404 with self.assertWarns(ResourceWarning) as cm:
1405 sock = None
1406 support.gc_collect()
1407 self.assertIn(r, str(cm.warning.args[0]))
1408 # An open socket file object gets dereferenced after the socket
1409 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1410 f = sock.makefile('rb')
1411 r = repr(sock)
1412 sock = None
1413 support.gc_collect()
1414 with self.assertWarns(ResourceWarning):
1415 f = None
1416 support.gc_collect()
1417
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001418 def test_name_closed_socketio(self):
1419 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1420 fp = sock.makefile("rb")
1421 fp.close()
1422 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1423
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001424 def test_unusable_closed_socketio(self):
1425 with socket.socket() as sock:
1426 fp = sock.makefile("rb", buffering=0)
1427 self.assertTrue(fp.readable())
1428 self.assertFalse(fp.writable())
1429 self.assertFalse(fp.seekable())
1430 fp.close()
1431 self.assertRaises(ValueError, fp.readable)
1432 self.assertRaises(ValueError, fp.writable)
1433 self.assertRaises(ValueError, fp.seekable)
1434
Berker Peksag3fe64d02016-02-18 17:34:00 +02001435 def test_makefile_mode(self):
1436 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1437 with self.subTest(mode=mode):
1438 with socket.socket() as sock:
1439 with sock.makefile(mode) as fp:
1440 self.assertEqual(fp.mode, mode)
1441
1442 def test_makefile_invalid_mode(self):
1443 for mode in 'rt', 'x', '+', 'a':
1444 with self.subTest(mode=mode):
1445 with socket.socket() as sock:
1446 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1447 sock.makefile(mode)
1448
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001449 def test_pickle(self):
1450 sock = socket.socket()
1451 with sock:
1452 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1453 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001454 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1455 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1456 self.assertEqual(family, socket.AF_INET)
1457 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1458 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001459
Serhiy Storchaka78980432013-01-15 01:12:17 +02001460 def test_listen_backlog(self):
1461 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001462 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1463 srv.bind((HOST, 0))
1464 srv.listen(backlog)
1465
1466 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001467 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001468 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001469
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001470 @support.cpython_only
1471 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001472 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001473 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001474 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1475 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001476 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001477 srv.close()
1478
Charles-François Natali42663332012-01-02 15:57:30 +01001479 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001480 def test_flowinfo(self):
1481 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001482 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001483 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001484 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001485
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001486 def test_str_for_enums(self):
1487 # Make sure that the AF_* and SOCK_* constants have enum-like string
1488 # reprs.
1489 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1490 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001491 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001492
1493 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1494 def test_uknown_socket_family_repr(self):
1495 # Test that when created with a family that's not one of the known
1496 # AF_*/SOCK_* constants, socket.family just returns the number.
1497 #
1498 # To do this we fool socket.socket into believing it already has an
1499 # open fd because on this path it doesn't actually verify the family and
1500 # type and populates the socket object.
1501 #
1502 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001503 fd, path = tempfile.mkstemp()
1504 self.addCleanup(os.unlink, path)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001505 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1506 self.assertEqual(s.family, 42424)
1507 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001508
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001509 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1510 def test__sendfile_use_sendfile(self):
1511 class File:
1512 def __init__(self, fd):
1513 self.fd = fd
1514
1515 def fileno(self):
1516 return self.fd
1517 with socket.socket() as sock:
1518 fd = os.open(os.curdir, os.O_RDONLY)
1519 os.close(fd)
1520 with self.assertRaises(socket._GiveupOnSendfile):
1521 sock._sendfile_use_sendfile(File(fd))
1522 with self.assertRaises(OverflowError):
1523 sock._sendfile_use_sendfile(File(2**1000))
1524 with self.assertRaises(TypeError):
1525 sock._sendfile_use_sendfile(File(None))
1526
1527
Charles-François Natali47413c12011-10-06 19:47:44 +02001528@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1529class BasicCANTest(unittest.TestCase):
1530
1531 def testCrucialConstants(self):
1532 socket.AF_CAN
1533 socket.PF_CAN
1534 socket.CAN_RAW
1535
Charles-François Natali773e42d2013-02-05 19:42:01 +01001536 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1537 'socket.CAN_BCM required for this test.')
1538 def testBCMConstants(self):
1539 socket.CAN_BCM
1540
1541 # opcodes
1542 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1543 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1544 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1545 socket.CAN_BCM_TX_SEND # send one CAN frame
1546 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1547 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1548 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1549 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1550 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1551 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1552 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1553 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1554
Charles-François Natali47413c12011-10-06 19:47:44 +02001555 def testCreateSocket(self):
1556 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1557 pass
1558
Charles-François Natali773e42d2013-02-05 19:42:01 +01001559 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1560 'socket.CAN_BCM required for this test.')
1561 def testCreateBCMSocket(self):
1562 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1563 pass
1564
Charles-François Natali47413c12011-10-06 19:47:44 +02001565 def testBindAny(self):
1566 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1567 s.bind(('', ))
1568
1569 def testTooLongInterfaceName(self):
1570 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1571 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001572 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001573 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001574
1575 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1576 'socket.CAN_RAW_LOOPBACK required for this test.')
1577 def testLoopback(self):
1578 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1579 for loopback in (0, 1):
1580 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1581 loopback)
1582 self.assertEqual(loopback,
1583 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1584
1585 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1586 'socket.CAN_RAW_FILTER required for this test.')
1587 def testFilter(self):
1588 can_id, can_mask = 0x200, 0x700
1589 can_filter = struct.pack("=II", can_id, can_mask)
1590 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1591 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1592 self.assertEqual(can_filter,
1593 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001594 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001595
1596
1597@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001598@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001599class CANTest(ThreadedCANSocketTest):
1600
Charles-François Natali47413c12011-10-06 19:47:44 +02001601 def __init__(self, methodName='runTest'):
1602 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1603
1604 @classmethod
1605 def build_can_frame(cls, can_id, data):
1606 """Build a CAN frame."""
1607 can_dlc = len(data)
1608 data = data.ljust(8, b'\x00')
1609 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1610
1611 @classmethod
1612 def dissect_can_frame(cls, frame):
1613 """Dissect a CAN frame."""
1614 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1615 return (can_id, can_dlc, data[:can_dlc])
1616
1617 def testSendFrame(self):
1618 cf, addr = self.s.recvfrom(self.bufsize)
1619 self.assertEqual(self.cf, cf)
1620 self.assertEqual(addr[0], self.interface)
1621 self.assertEqual(addr[1], socket.AF_CAN)
1622
1623 def _testSendFrame(self):
1624 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1625 self.cli.send(self.cf)
1626
1627 def testSendMaxFrame(self):
1628 cf, addr = self.s.recvfrom(self.bufsize)
1629 self.assertEqual(self.cf, cf)
1630
1631 def _testSendMaxFrame(self):
1632 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1633 self.cli.send(self.cf)
1634
1635 def testSendMultiFrames(self):
1636 cf, addr = self.s.recvfrom(self.bufsize)
1637 self.assertEqual(self.cf1, cf)
1638
1639 cf, addr = self.s.recvfrom(self.bufsize)
1640 self.assertEqual(self.cf2, cf)
1641
1642 def _testSendMultiFrames(self):
1643 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1644 self.cli.send(self.cf1)
1645
1646 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1647 self.cli.send(self.cf2)
1648
Charles-François Natali773e42d2013-02-05 19:42:01 +01001649 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1650 'socket.CAN_BCM required for this test.')
1651 def _testBCM(self):
1652 cf, addr = self.cli.recvfrom(self.bufsize)
1653 self.assertEqual(self.cf, cf)
1654 can_id, can_dlc, data = self.dissect_can_frame(cf)
1655 self.assertEqual(self.can_id, can_id)
1656 self.assertEqual(self.data, data)
1657
1658 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1659 'socket.CAN_BCM required for this test.')
1660 def testBCM(self):
1661 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1662 self.addCleanup(bcm.close)
1663 bcm.connect((self.interface,))
1664 self.can_id = 0x123
1665 self.data = bytes([0xc0, 0xff, 0xee])
1666 self.cf = self.build_can_frame(self.can_id, self.data)
1667 opcode = socket.CAN_BCM_TX_SEND
1668 flags = 0
1669 count = 0
1670 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1671 bcm_can_id = 0x0222
1672 nframes = 1
1673 assert len(self.cf) == 16
1674 header = struct.pack(self.bcm_cmd_msg_fmt,
1675 opcode,
1676 flags,
1677 count,
1678 ival1_seconds,
1679 ival1_usec,
1680 ival2_seconds,
1681 ival2_usec,
1682 bcm_can_id,
1683 nframes,
1684 )
1685 header_plus_frame = header + self.cf
1686 bytes_sent = bcm.send(header_plus_frame)
1687 self.assertEqual(bytes_sent, len(header_plus_frame))
1688
Charles-François Natali47413c12011-10-06 19:47:44 +02001689
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001690@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1691class BasicRDSTest(unittest.TestCase):
1692
1693 def testCrucialConstants(self):
1694 socket.AF_RDS
1695 socket.PF_RDS
1696
1697 def testCreateSocket(self):
1698 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1699 pass
1700
1701 def testSocketBufferSize(self):
1702 bufsize = 16384
1703 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1704 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1705 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1706
1707
1708@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1709@unittest.skipUnless(thread, 'Threading required for this test.')
1710class RDSTest(ThreadedRDSSocketTest):
1711
1712 def __init__(self, methodName='runTest'):
1713 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1714
Charles-François Natali240c55f2011-11-10 20:33:36 +01001715 def setUp(self):
1716 super().setUp()
1717 self.evt = threading.Event()
1718
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001719 def testSendAndRecv(self):
1720 data, addr = self.serv.recvfrom(self.bufsize)
1721 self.assertEqual(self.data, data)
1722 self.assertEqual(self.cli_addr, addr)
1723
1724 def _testSendAndRecv(self):
1725 self.data = b'spam'
1726 self.cli.sendto(self.data, 0, (HOST, self.port))
1727
1728 def testPeek(self):
1729 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1730 self.assertEqual(self.data, data)
1731 data, addr = self.serv.recvfrom(self.bufsize)
1732 self.assertEqual(self.data, data)
1733
1734 def _testPeek(self):
1735 self.data = b'spam'
1736 self.cli.sendto(self.data, 0, (HOST, self.port))
1737
1738 @requireAttrs(socket.socket, 'recvmsg')
1739 def testSendAndRecvMsg(self):
1740 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1741 self.assertEqual(self.data, data)
1742
1743 @requireAttrs(socket.socket, 'sendmsg')
1744 def _testSendAndRecvMsg(self):
1745 self.data = b'hello ' * 10
1746 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1747
1748 def testSendAndRecvMulti(self):
1749 data, addr = self.serv.recvfrom(self.bufsize)
1750 self.assertEqual(self.data1, data)
1751
1752 data, addr = self.serv.recvfrom(self.bufsize)
1753 self.assertEqual(self.data2, data)
1754
1755 def _testSendAndRecvMulti(self):
1756 self.data1 = b'bacon'
1757 self.cli.sendto(self.data1, 0, (HOST, self.port))
1758
1759 self.data2 = b'egg'
1760 self.cli.sendto(self.data2, 0, (HOST, self.port))
1761
1762 def testSelect(self):
1763 r, w, x = select.select([self.serv], [], [], 3.0)
1764 self.assertIn(self.serv, r)
1765 data, addr = self.serv.recvfrom(self.bufsize)
1766 self.assertEqual(self.data, data)
1767
1768 def _testSelect(self):
1769 self.data = b'select'
1770 self.cli.sendto(self.data, 0, (HOST, self.port))
1771
1772 def testCongestion(self):
1773 # wait until the sender is done
1774 self.evt.wait()
1775
1776 def _testCongestion(self):
1777 # test the behavior in case of congestion
1778 self.data = b'fill'
1779 self.cli.setblocking(False)
1780 try:
1781 # try to lower the receiver's socket buffer size
1782 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1783 except OSError:
1784 pass
1785 with self.assertRaises(OSError) as cm:
1786 try:
1787 # fill the receiver's socket buffer
1788 while True:
1789 self.cli.sendto(self.data, 0, (HOST, self.port))
1790 finally:
1791 # signal the receiver we're done
1792 self.evt.set()
1793 # sendto() should have failed with ENOBUFS
1794 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1795 # and we should have received a congestion notification through poll
1796 r, w, x = select.select([self.serv], [], [], 3.0)
1797 self.assertIn(self.serv, r)
1798
1799
Victor Stinner45df8202010-04-28 22:31:17 +00001800@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001801class BasicTCPTest(SocketConnectedTest):
1802
1803 def __init__(self, methodName='runTest'):
1804 SocketConnectedTest.__init__(self, methodName=methodName)
1805
1806 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001807 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001808 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001809 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001810
1811 def _testRecv(self):
1812 self.serv_conn.send(MSG)
1813
1814 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001815 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001816 seg1 = self.cli_conn.recv(len(MSG) - 3)
1817 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001818 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001819 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001820
1821 def _testOverFlowRecv(self):
1822 self.serv_conn.send(MSG)
1823
1824 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001825 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001826 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001827 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001828
1829 def _testRecvFrom(self):
1830 self.serv_conn.send(MSG)
1831
1832 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001833 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001834 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1835 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001836 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001837 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001838
1839 def _testOverFlowRecvFrom(self):
1840 self.serv_conn.send(MSG)
1841
1842 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001843 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001844 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001845 while 1:
1846 read = self.cli_conn.recv(1024)
1847 if not read:
1848 break
Guido van Rossume531e292002-08-08 20:28:34 +00001849 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001850 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001851
1852 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001853 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001854 self.serv_conn.sendall(big_chunk)
1855
1856 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001857 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001858 fd = self.cli_conn.fileno()
1859 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001860 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001861 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001862 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001863 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001864
1865 def _testFromFd(self):
1866 self.serv_conn.send(MSG)
1867
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001868 def testDup(self):
1869 # Testing dup()
1870 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001871 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001872 msg = sock.recv(1024)
1873 self.assertEqual(msg, MSG)
1874
1875 def _testDup(self):
1876 self.serv_conn.send(MSG)
1877
Guido van Rossum24e4af82002-06-12 19:18:08 +00001878 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001879 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001880 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001881 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001882 # wait for _testShutdown to finish: on OS X, when the server
1883 # closes the connection the client also becomes disconnected,
1884 # and the client's shutdown call will fail. (Issue #4397.)
1885 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001886
1887 def _testShutdown(self):
1888 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001889 self.serv_conn.shutdown(2)
1890
1891 testShutdown_overflow = support.cpython_only(testShutdown)
1892
1893 @support.cpython_only
1894 def _testShutdown_overflow(self):
1895 import _testcapi
1896 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001897 # Issue 15989
1898 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1899 _testcapi.INT_MAX + 1)
1900 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1901 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001902 self.serv_conn.shutdown(2)
1903
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001904 def testDetach(self):
1905 # Testing detach()
1906 fileno = self.cli_conn.fileno()
1907 f = self.cli_conn.detach()
1908 self.assertEqual(f, fileno)
1909 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001910 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001911 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001912 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001913 # ...but we can create another socket using the (still open)
1914 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001915 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001916 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001917 msg = sock.recv(1024)
1918 self.assertEqual(msg, MSG)
1919
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001920 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001921 self.serv_conn.send(MSG)
1922
Victor Stinner45df8202010-04-28 22:31:17 +00001923@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001924class BasicUDPTest(ThreadedUDPSocketTest):
1925
1926 def __init__(self, methodName='runTest'):
1927 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1928
1929 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001930 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001931 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001932 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001933
1934 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001935 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001936
Guido van Rossum1c938012002-06-12 21:17:20 +00001937 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001938 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001939 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001940 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001941
Guido van Rossum1c938012002-06-12 21:17:20 +00001942 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001943 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001944
Guido van Rossumd8faa362007-04-27 19:54:29 +00001945 def testRecvFromNegative(self):
1946 # Negative lengths passed to recvfrom should give ValueError.
1947 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1948
1949 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001950 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001951
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001952# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1953# same test code is used with different families and types of socket
1954# (e.g. stream, datagram), and tests using recvmsg() are repeated
1955# using recvmsg_into().
1956#
1957# The generic test classes such as SendmsgTests and
1958# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1959# supplied with sockets cli_sock and serv_sock representing the
1960# client's and the server's end of the connection respectively, and
1961# attributes cli_addr and serv_addr holding their (numeric where
1962# appropriate) addresses.
1963#
1964# The final concrete test classes combine these with subclasses of
1965# SocketTestBase which set up client and server sockets of a specific
1966# type, and with subclasses of SendrecvmsgBase such as
1967# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1968# sockets to cli_sock and serv_sock and override the methods and
1969# attributes of SendrecvmsgBase to fill in destination addresses if
1970# needed when sending, check for specific flags in msg_flags, etc.
1971#
1972# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1973# recvmsg_into().
1974
1975# XXX: like the other datagram (UDP) tests in this module, the code
1976# here assumes that datagram delivery on the local machine will be
1977# reliable.
1978
1979class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1980 # Base class for sendmsg()/recvmsg() tests.
1981
1982 # Time in seconds to wait before considering a test failed, or
1983 # None for no timeout. Not all tests actually set a timeout.
1984 fail_timeout = 3.0
1985
1986 def setUp(self):
1987 self.misc_event = threading.Event()
1988 super().setUp()
1989
1990 def sendToServer(self, msg):
1991 # Send msg to the server.
1992 return self.cli_sock.send(msg)
1993
1994 # Tuple of alternative default arguments for sendmsg() when called
1995 # via sendmsgToServer() (e.g. to include a destination address).
1996 sendmsg_to_server_defaults = ()
1997
1998 def sendmsgToServer(self, *args):
1999 # Call sendmsg() on self.cli_sock with the given arguments,
2000 # filling in any arguments which are not supplied with the
2001 # corresponding items of self.sendmsg_to_server_defaults, if
2002 # any.
2003 return self.cli_sock.sendmsg(
2004 *(args + self.sendmsg_to_server_defaults[len(args):]))
2005
2006 def doRecvmsg(self, sock, bufsize, *args):
2007 # Call recvmsg() on sock with given arguments and return its
2008 # result. Should be used for tests which can use either
2009 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2010 # this method with one which emulates it using recvmsg_into(),
2011 # thus allowing the same test to be used for both methods.
2012 result = sock.recvmsg(bufsize, *args)
2013 self.registerRecvmsgResult(result)
2014 return result
2015
2016 def registerRecvmsgResult(self, result):
2017 # Called by doRecvmsg() with the return value of recvmsg() or
2018 # recvmsg_into(). Can be overridden to arrange cleanup based
2019 # on the returned ancillary data, for instance.
2020 pass
2021
2022 def checkRecvmsgAddress(self, addr1, addr2):
2023 # Called to compare the received address with the address of
2024 # the peer.
2025 self.assertEqual(addr1, addr2)
2026
2027 # Flags that are normally unset in msg_flags
2028 msg_flags_common_unset = 0
2029 for name in ("MSG_CTRUNC", "MSG_OOB"):
2030 msg_flags_common_unset |= getattr(socket, name, 0)
2031
2032 # Flags that are normally set
2033 msg_flags_common_set = 0
2034
2035 # Flags set when a complete record has been received (e.g. MSG_EOR
2036 # for SCTP)
2037 msg_flags_eor_indicator = 0
2038
2039 # Flags set when a complete record has not been received
2040 # (e.g. MSG_TRUNC for datagram sockets)
2041 msg_flags_non_eor_indicator = 0
2042
2043 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2044 # Method to check the value of msg_flags returned by recvmsg[_into]().
2045 #
2046 # Checks that all bits in msg_flags_common_set attribute are
2047 # set in "flags" and all bits in msg_flags_common_unset are
2048 # unset.
2049 #
2050 # The "eor" argument specifies whether the flags should
2051 # indicate that a full record (or datagram) has been received.
2052 # If "eor" is None, no checks are done; otherwise, checks
2053 # that:
2054 #
2055 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2056 # set and all bits in msg_flags_non_eor_indicator are unset
2057 #
2058 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2059 # are set and all bits in msg_flags_eor_indicator are unset
2060 #
2061 # If "checkset" and/or "checkunset" are supplied, they require
2062 # the given bits to be set or unset respectively, overriding
2063 # what the attributes require for those bits.
2064 #
2065 # If any bits are set in "ignore", they will not be checked,
2066 # regardless of the other inputs.
2067 #
2068 # Will raise Exception if the inputs require a bit to be both
2069 # set and unset, and it is not ignored.
2070
2071 defaultset = self.msg_flags_common_set
2072 defaultunset = self.msg_flags_common_unset
2073
2074 if eor:
2075 defaultset |= self.msg_flags_eor_indicator
2076 defaultunset |= self.msg_flags_non_eor_indicator
2077 elif eor is not None:
2078 defaultset |= self.msg_flags_non_eor_indicator
2079 defaultunset |= self.msg_flags_eor_indicator
2080
2081 # Function arguments override defaults
2082 defaultset &= ~checkunset
2083 defaultunset &= ~checkset
2084
2085 # Merge arguments with remaining defaults, and check for conflicts
2086 checkset |= defaultset
2087 checkunset |= defaultunset
2088 inboth = checkset & checkunset & ~ignore
2089 if inboth:
2090 raise Exception("contradictory set, unset requirements for flags "
2091 "{0:#x}".format(inboth))
2092
2093 # Compare with given msg_flags value
2094 mask = (checkset | checkunset) & ~ignore
2095 self.assertEqual(flags & mask, checkset & mask)
2096
2097
2098class RecvmsgIntoMixin(SendrecvmsgBase):
2099 # Mixin to implement doRecvmsg() using recvmsg_into().
2100
2101 def doRecvmsg(self, sock, bufsize, *args):
2102 buf = bytearray(bufsize)
2103 result = sock.recvmsg_into([buf], *args)
2104 self.registerRecvmsgResult(result)
2105 self.assertGreaterEqual(result[0], 0)
2106 self.assertLessEqual(result[0], bufsize)
2107 return (bytes(buf[:result[0]]),) + result[1:]
2108
2109
2110class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2111 # Defines flags to be checked in msg_flags for datagram sockets.
2112
2113 @property
2114 def msg_flags_non_eor_indicator(self):
2115 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2116
2117
2118class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2119 # Defines flags to be checked in msg_flags for SCTP sockets.
2120
2121 @property
2122 def msg_flags_eor_indicator(self):
2123 return super().msg_flags_eor_indicator | socket.MSG_EOR
2124
2125
2126class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2127 # Base class for tests on connectionless-mode sockets. Users must
2128 # supply sockets on attributes cli and serv to be mapped to
2129 # cli_sock and serv_sock respectively.
2130
2131 @property
2132 def serv_sock(self):
2133 return self.serv
2134
2135 @property
2136 def cli_sock(self):
2137 return self.cli
2138
2139 @property
2140 def sendmsg_to_server_defaults(self):
2141 return ([], [], 0, self.serv_addr)
2142
2143 def sendToServer(self, msg):
2144 return self.cli_sock.sendto(msg, self.serv_addr)
2145
2146
2147class SendrecvmsgConnectedBase(SendrecvmsgBase):
2148 # Base class for tests on connected sockets. Users must supply
2149 # sockets on attributes serv_conn and cli_conn (representing the
2150 # connections *to* the server and the client), to be mapped to
2151 # cli_sock and serv_sock respectively.
2152
2153 @property
2154 def serv_sock(self):
2155 return self.cli_conn
2156
2157 @property
2158 def cli_sock(self):
2159 return self.serv_conn
2160
2161 def checkRecvmsgAddress(self, addr1, addr2):
2162 # Address is currently "unspecified" for a connected socket,
2163 # so we don't examine it
2164 pass
2165
2166
2167class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2168 # Base class to set a timeout on server's socket.
2169
2170 def setUp(self):
2171 super().setUp()
2172 self.serv_sock.settimeout(self.fail_timeout)
2173
2174
2175class SendmsgTests(SendrecvmsgServerTimeoutBase):
2176 # Tests for sendmsg() which can use any socket type and do not
2177 # involve recvmsg() or recvmsg_into().
2178
2179 def testSendmsg(self):
2180 # Send a simple message with sendmsg().
2181 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2182
2183 def _testSendmsg(self):
2184 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2185
2186 def testSendmsgDataGenerator(self):
2187 # Send from buffer obtained from a generator (not a sequence).
2188 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2189
2190 def _testSendmsgDataGenerator(self):
2191 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2192 len(MSG))
2193
2194 def testSendmsgAncillaryGenerator(self):
2195 # Gather (empty) ancillary data from a generator.
2196 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2197
2198 def _testSendmsgAncillaryGenerator(self):
2199 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2200 len(MSG))
2201
2202 def testSendmsgArray(self):
2203 # Send data from an array instead of the usual bytes object.
2204 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2205
2206 def _testSendmsgArray(self):
2207 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2208 len(MSG))
2209
2210 def testSendmsgGather(self):
2211 # Send message data from more than one buffer (gather write).
2212 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2213
2214 def _testSendmsgGather(self):
2215 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2216
2217 def testSendmsgBadArgs(self):
2218 # Check that sendmsg() rejects invalid arguments.
2219 self.assertEqual(self.serv_sock.recv(1000), b"done")
2220
2221 def _testSendmsgBadArgs(self):
2222 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2223 self.assertRaises(TypeError, self.sendmsgToServer,
2224 b"not in an iterable")
2225 self.assertRaises(TypeError, self.sendmsgToServer,
2226 object())
2227 self.assertRaises(TypeError, self.sendmsgToServer,
2228 [object()])
2229 self.assertRaises(TypeError, self.sendmsgToServer,
2230 [MSG, object()])
2231 self.assertRaises(TypeError, self.sendmsgToServer,
2232 [MSG], object())
2233 self.assertRaises(TypeError, self.sendmsgToServer,
2234 [MSG], [], object())
2235 self.assertRaises(TypeError, self.sendmsgToServer,
2236 [MSG], [], 0, object())
2237 self.sendToServer(b"done")
2238
2239 def testSendmsgBadCmsg(self):
2240 # Check that invalid ancillary data items are rejected.
2241 self.assertEqual(self.serv_sock.recv(1000), b"done")
2242
2243 def _testSendmsgBadCmsg(self):
2244 self.assertRaises(TypeError, self.sendmsgToServer,
2245 [MSG], [object()])
2246 self.assertRaises(TypeError, self.sendmsgToServer,
2247 [MSG], [(object(), 0, b"data")])
2248 self.assertRaises(TypeError, self.sendmsgToServer,
2249 [MSG], [(0, object(), b"data")])
2250 self.assertRaises(TypeError, self.sendmsgToServer,
2251 [MSG], [(0, 0, object())])
2252 self.assertRaises(TypeError, self.sendmsgToServer,
2253 [MSG], [(0, 0)])
2254 self.assertRaises(TypeError, self.sendmsgToServer,
2255 [MSG], [(0, 0, b"data", 42)])
2256 self.sendToServer(b"done")
2257
2258 @requireAttrs(socket, "CMSG_SPACE")
2259 def testSendmsgBadMultiCmsg(self):
2260 # Check that invalid ancillary data items are rejected when
2261 # more than one item is present.
2262 self.assertEqual(self.serv_sock.recv(1000), b"done")
2263
2264 @testSendmsgBadMultiCmsg.client_skip
2265 def _testSendmsgBadMultiCmsg(self):
2266 self.assertRaises(TypeError, self.sendmsgToServer,
2267 [MSG], [0, 0, b""])
2268 self.assertRaises(TypeError, self.sendmsgToServer,
2269 [MSG], [(0, 0, b""), object()])
2270 self.sendToServer(b"done")
2271
2272 def testSendmsgExcessCmsgReject(self):
2273 # Check that sendmsg() rejects excess ancillary data items
2274 # when the number that can be sent is limited.
2275 self.assertEqual(self.serv_sock.recv(1000), b"done")
2276
2277 def _testSendmsgExcessCmsgReject(self):
2278 if not hasattr(socket, "CMSG_SPACE"):
2279 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002280 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002281 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2282 self.assertIsNone(cm.exception.errno)
2283 self.sendToServer(b"done")
2284
2285 def testSendmsgAfterClose(self):
2286 # Check that sendmsg() fails on a closed socket.
2287 pass
2288
2289 def _testSendmsgAfterClose(self):
2290 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002291 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002292
2293
2294class SendmsgStreamTests(SendmsgTests):
2295 # Tests for sendmsg() which require a stream socket and do not
2296 # involve recvmsg() or recvmsg_into().
2297
2298 def testSendmsgExplicitNoneAddr(self):
2299 # Check that peer address can be specified as None.
2300 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2301
2302 def _testSendmsgExplicitNoneAddr(self):
2303 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2304
2305 def testSendmsgTimeout(self):
2306 # Check that timeout works with sendmsg().
2307 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2308 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2309
2310 def _testSendmsgTimeout(self):
2311 try:
2312 self.cli_sock.settimeout(0.03)
2313 with self.assertRaises(socket.timeout):
2314 while True:
2315 self.sendmsgToServer([b"a"*512])
2316 finally:
2317 self.misc_event.set()
2318
2319 # XXX: would be nice to have more tests for sendmsg flags argument.
2320
2321 # Linux supports MSG_DONTWAIT when sending, but in general, it
2322 # only works when receiving. Could add other platforms if they
2323 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002324 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002325 "MSG_DONTWAIT not known to work on this platform when "
2326 "sending")
2327 def testSendmsgDontWait(self):
2328 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2329 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2330 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2331
2332 @testSendmsgDontWait.client_skip
2333 def _testSendmsgDontWait(self):
2334 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002335 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002336 while True:
2337 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2338 self.assertIn(cm.exception.errno,
2339 (errno.EAGAIN, errno.EWOULDBLOCK))
2340 finally:
2341 self.misc_event.set()
2342
2343
2344class SendmsgConnectionlessTests(SendmsgTests):
2345 # Tests for sendmsg() which require a connectionless-mode
2346 # (e.g. datagram) socket, and do not involve recvmsg() or
2347 # recvmsg_into().
2348
2349 def testSendmsgNoDestAddr(self):
2350 # Check that sendmsg() fails when no destination address is
2351 # given for unconnected socket.
2352 pass
2353
2354 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002355 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002356 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002357 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002358 [MSG], [], 0, None)
2359
2360
2361class RecvmsgGenericTests(SendrecvmsgBase):
2362 # Tests for recvmsg() which can also be emulated using
2363 # recvmsg_into(), and can use any socket type.
2364
2365 def testRecvmsg(self):
2366 # Receive a simple message with recvmsg[_into]().
2367 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2368 self.assertEqual(msg, MSG)
2369 self.checkRecvmsgAddress(addr, self.cli_addr)
2370 self.assertEqual(ancdata, [])
2371 self.checkFlags(flags, eor=True)
2372
2373 def _testRecvmsg(self):
2374 self.sendToServer(MSG)
2375
2376 def testRecvmsgExplicitDefaults(self):
2377 # Test recvmsg[_into]() with default arguments provided explicitly.
2378 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2379 len(MSG), 0, 0)
2380 self.assertEqual(msg, MSG)
2381 self.checkRecvmsgAddress(addr, self.cli_addr)
2382 self.assertEqual(ancdata, [])
2383 self.checkFlags(flags, eor=True)
2384
2385 def _testRecvmsgExplicitDefaults(self):
2386 self.sendToServer(MSG)
2387
2388 def testRecvmsgShorter(self):
2389 # Receive a message smaller than buffer.
2390 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2391 len(MSG) + 42)
2392 self.assertEqual(msg, MSG)
2393 self.checkRecvmsgAddress(addr, self.cli_addr)
2394 self.assertEqual(ancdata, [])
2395 self.checkFlags(flags, eor=True)
2396
2397 def _testRecvmsgShorter(self):
2398 self.sendToServer(MSG)
2399
Charles-François Natali8619cd72011-10-03 19:43:15 +02002400 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2401 # datagram is received (issue #13001).
2402 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002403 def testRecvmsgTrunc(self):
2404 # Receive part of message, check for truncation indicators.
2405 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2406 len(MSG) - 3)
2407 self.assertEqual(msg, MSG[:-3])
2408 self.checkRecvmsgAddress(addr, self.cli_addr)
2409 self.assertEqual(ancdata, [])
2410 self.checkFlags(flags, eor=False)
2411
Charles-François Natali8619cd72011-10-03 19:43:15 +02002412 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002413 def _testRecvmsgTrunc(self):
2414 self.sendToServer(MSG)
2415
2416 def testRecvmsgShortAncillaryBuf(self):
2417 # Test ancillary data buffer too small to hold any ancillary data.
2418 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2419 len(MSG), 1)
2420 self.assertEqual(msg, MSG)
2421 self.checkRecvmsgAddress(addr, self.cli_addr)
2422 self.assertEqual(ancdata, [])
2423 self.checkFlags(flags, eor=True)
2424
2425 def _testRecvmsgShortAncillaryBuf(self):
2426 self.sendToServer(MSG)
2427
2428 def testRecvmsgLongAncillaryBuf(self):
2429 # Test large ancillary data buffer.
2430 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2431 len(MSG), 10240)
2432 self.assertEqual(msg, MSG)
2433 self.checkRecvmsgAddress(addr, self.cli_addr)
2434 self.assertEqual(ancdata, [])
2435 self.checkFlags(flags, eor=True)
2436
2437 def _testRecvmsgLongAncillaryBuf(self):
2438 self.sendToServer(MSG)
2439
2440 def testRecvmsgAfterClose(self):
2441 # Check that recvmsg[_into]() fails on a closed socket.
2442 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002443 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002444
2445 def _testRecvmsgAfterClose(self):
2446 pass
2447
2448 def testRecvmsgTimeout(self):
2449 # Check that timeout works.
2450 try:
2451 self.serv_sock.settimeout(0.03)
2452 self.assertRaises(socket.timeout,
2453 self.doRecvmsg, self.serv_sock, len(MSG))
2454 finally:
2455 self.misc_event.set()
2456
2457 def _testRecvmsgTimeout(self):
2458 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2459
2460 @requireAttrs(socket, "MSG_PEEK")
2461 def testRecvmsgPeek(self):
2462 # Check that MSG_PEEK in flags enables examination of pending
2463 # data without consuming it.
2464
2465 # Receive part of data with MSG_PEEK.
2466 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2467 len(MSG) - 3, 0,
2468 socket.MSG_PEEK)
2469 self.assertEqual(msg, MSG[:-3])
2470 self.checkRecvmsgAddress(addr, self.cli_addr)
2471 self.assertEqual(ancdata, [])
2472 # Ignoring MSG_TRUNC here (so this test is the same for stream
2473 # and datagram sockets). Some wording in POSIX seems to
2474 # suggest that it needn't be set when peeking, but that may
2475 # just be a slip.
2476 self.checkFlags(flags, eor=False,
2477 ignore=getattr(socket, "MSG_TRUNC", 0))
2478
2479 # Receive all data with MSG_PEEK.
2480 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2481 len(MSG), 0,
2482 socket.MSG_PEEK)
2483 self.assertEqual(msg, MSG)
2484 self.checkRecvmsgAddress(addr, self.cli_addr)
2485 self.assertEqual(ancdata, [])
2486 self.checkFlags(flags, eor=True)
2487
2488 # Check that the same data can still be received normally.
2489 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2490 self.assertEqual(msg, MSG)
2491 self.checkRecvmsgAddress(addr, self.cli_addr)
2492 self.assertEqual(ancdata, [])
2493 self.checkFlags(flags, eor=True)
2494
2495 @testRecvmsgPeek.client_skip
2496 def _testRecvmsgPeek(self):
2497 self.sendToServer(MSG)
2498
2499 @requireAttrs(socket.socket, "sendmsg")
2500 def testRecvmsgFromSendmsg(self):
2501 # Test receiving with recvmsg[_into]() when message is sent
2502 # using sendmsg().
2503 self.serv_sock.settimeout(self.fail_timeout)
2504 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2505 self.assertEqual(msg, MSG)
2506 self.checkRecvmsgAddress(addr, self.cli_addr)
2507 self.assertEqual(ancdata, [])
2508 self.checkFlags(flags, eor=True)
2509
2510 @testRecvmsgFromSendmsg.client_skip
2511 def _testRecvmsgFromSendmsg(self):
2512 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2513
2514
2515class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2516 # Tests which require a stream socket and can use either recvmsg()
2517 # or recvmsg_into().
2518
2519 def testRecvmsgEOF(self):
2520 # Receive end-of-stream indicator (b"", peer socket closed).
2521 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2522 self.assertEqual(msg, b"")
2523 self.checkRecvmsgAddress(addr, self.cli_addr)
2524 self.assertEqual(ancdata, [])
2525 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2526
2527 def _testRecvmsgEOF(self):
2528 self.cli_sock.close()
2529
2530 def testRecvmsgOverflow(self):
2531 # Receive a message in more than one chunk.
2532 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2533 len(MSG) - 3)
2534 self.checkRecvmsgAddress(addr, self.cli_addr)
2535 self.assertEqual(ancdata, [])
2536 self.checkFlags(flags, eor=False)
2537
2538 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2539 self.checkRecvmsgAddress(addr, self.cli_addr)
2540 self.assertEqual(ancdata, [])
2541 self.checkFlags(flags, eor=True)
2542
2543 msg = seg1 + seg2
2544 self.assertEqual(msg, MSG)
2545
2546 def _testRecvmsgOverflow(self):
2547 self.sendToServer(MSG)
2548
2549
2550class RecvmsgTests(RecvmsgGenericTests):
2551 # Tests for recvmsg() which can use any socket type.
2552
2553 def testRecvmsgBadArgs(self):
2554 # Check that recvmsg() rejects invalid arguments.
2555 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2556 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2557 -1, 0, 0)
2558 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2559 len(MSG), -1, 0)
2560 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2561 [bytearray(10)], 0, 0)
2562 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2563 object(), 0, 0)
2564 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2565 len(MSG), object(), 0)
2566 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2567 len(MSG), 0, object())
2568
2569 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2570 self.assertEqual(msg, MSG)
2571 self.checkRecvmsgAddress(addr, self.cli_addr)
2572 self.assertEqual(ancdata, [])
2573 self.checkFlags(flags, eor=True)
2574
2575 def _testRecvmsgBadArgs(self):
2576 self.sendToServer(MSG)
2577
2578
2579class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2580 # Tests for recvmsg_into() which can use any socket type.
2581
2582 def testRecvmsgIntoBadArgs(self):
2583 # Check that recvmsg_into() rejects invalid arguments.
2584 buf = bytearray(len(MSG))
2585 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2586 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2587 len(MSG), 0, 0)
2588 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2589 buf, 0, 0)
2590 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2591 [object()], 0, 0)
2592 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2593 [b"I'm not writable"], 0, 0)
2594 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2595 [buf, object()], 0, 0)
2596 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2597 [buf], -1, 0)
2598 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2599 [buf], object(), 0)
2600 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2601 [buf], 0, object())
2602
2603 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2604 self.assertEqual(nbytes, len(MSG))
2605 self.assertEqual(buf, bytearray(MSG))
2606 self.checkRecvmsgAddress(addr, self.cli_addr)
2607 self.assertEqual(ancdata, [])
2608 self.checkFlags(flags, eor=True)
2609
2610 def _testRecvmsgIntoBadArgs(self):
2611 self.sendToServer(MSG)
2612
2613 def testRecvmsgIntoGenerator(self):
2614 # Receive into buffer obtained from a generator (not a sequence).
2615 buf = bytearray(len(MSG))
2616 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2617 (o for o in [buf]))
2618 self.assertEqual(nbytes, len(MSG))
2619 self.assertEqual(buf, bytearray(MSG))
2620 self.checkRecvmsgAddress(addr, self.cli_addr)
2621 self.assertEqual(ancdata, [])
2622 self.checkFlags(flags, eor=True)
2623
2624 def _testRecvmsgIntoGenerator(self):
2625 self.sendToServer(MSG)
2626
2627 def testRecvmsgIntoArray(self):
2628 # Receive into an array rather than the usual bytearray.
2629 buf = array.array("B", [0] * len(MSG))
2630 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2631 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002632 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002633 self.checkRecvmsgAddress(addr, self.cli_addr)
2634 self.assertEqual(ancdata, [])
2635 self.checkFlags(flags, eor=True)
2636
2637 def _testRecvmsgIntoArray(self):
2638 self.sendToServer(MSG)
2639
2640 def testRecvmsgIntoScatter(self):
2641 # Receive into multiple buffers (scatter write).
2642 b1 = bytearray(b"----")
2643 b2 = bytearray(b"0123456789")
2644 b3 = bytearray(b"--------------")
2645 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2646 [b1, memoryview(b2)[2:9], b3])
2647 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2648 self.assertEqual(b1, bytearray(b"Mary"))
2649 self.assertEqual(b2, bytearray(b"01 had a 9"))
2650 self.assertEqual(b3, bytearray(b"little lamb---"))
2651 self.checkRecvmsgAddress(addr, self.cli_addr)
2652 self.assertEqual(ancdata, [])
2653 self.checkFlags(flags, eor=True)
2654
2655 def _testRecvmsgIntoScatter(self):
2656 self.sendToServer(b"Mary had a little lamb")
2657
2658
2659class CmsgMacroTests(unittest.TestCase):
2660 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2661 # assumptions used by sendmsg() and recvmsg[_into](), which share
2662 # code with these functions.
2663
2664 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002665 try:
2666 import _testcapi
2667 except ImportError:
2668 socklen_t_limit = 0x7fffffff
2669 else:
2670 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002671
2672 @requireAttrs(socket, "CMSG_LEN")
2673 def testCMSG_LEN(self):
2674 # Test CMSG_LEN() with various valid and invalid values,
2675 # checking the assumptions used by recvmsg() and sendmsg().
2676 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2677 values = list(range(257)) + list(range(toobig - 257, toobig))
2678
2679 # struct cmsghdr has at least three members, two of which are ints
2680 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2681 for n in values:
2682 ret = socket.CMSG_LEN(n)
2683 # This is how recvmsg() calculates the data size
2684 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2685 self.assertLessEqual(ret, self.socklen_t_limit)
2686
2687 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2688 # sendmsg() shares code with these functions, and requires
2689 # that it reject values over the limit.
2690 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2691 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2692
2693 @requireAttrs(socket, "CMSG_SPACE")
2694 def testCMSG_SPACE(self):
2695 # Test CMSG_SPACE() with various valid and invalid values,
2696 # checking the assumptions used by sendmsg().
2697 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2698 values = list(range(257)) + list(range(toobig - 257, toobig))
2699
2700 last = socket.CMSG_SPACE(0)
2701 # struct cmsghdr has at least three members, two of which are ints
2702 self.assertGreater(last, array.array("i").itemsize * 2)
2703 for n in values:
2704 ret = socket.CMSG_SPACE(n)
2705 self.assertGreaterEqual(ret, last)
2706 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2707 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2708 self.assertLessEqual(ret, self.socklen_t_limit)
2709 last = ret
2710
2711 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2712 # sendmsg() shares code with these functions, and requires
2713 # that it reject values over the limit.
2714 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2715 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2716
2717
2718class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2719 # Tests for file descriptor passing on Unix-domain sockets.
2720
2721 # Invalid file descriptor value that's unlikely to evaluate to a
2722 # real FD even if one of its bytes is replaced with a different
2723 # value (which shouldn't actually happen).
2724 badfd = -0x5555
2725
2726 def newFDs(self, n):
2727 # Return a list of n file descriptors for newly-created files
2728 # containing their list indices as ASCII numbers.
2729 fds = []
2730 for i in range(n):
2731 fd, path = tempfile.mkstemp()
2732 self.addCleanup(os.unlink, path)
2733 self.addCleanup(os.close, fd)
2734 os.write(fd, str(i).encode())
2735 fds.append(fd)
2736 return fds
2737
2738 def checkFDs(self, fds):
2739 # Check that the file descriptors in the given list contain
2740 # their correct list indices as ASCII numbers.
2741 for n, fd in enumerate(fds):
2742 os.lseek(fd, 0, os.SEEK_SET)
2743 self.assertEqual(os.read(fd, 1024), str(n).encode())
2744
2745 def registerRecvmsgResult(self, result):
2746 self.addCleanup(self.closeRecvmsgFDs, result)
2747
2748 def closeRecvmsgFDs(self, recvmsg_result):
2749 # Close all file descriptors specified in the ancillary data
2750 # of the given return value from recvmsg() or recvmsg_into().
2751 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2752 if (cmsg_level == socket.SOL_SOCKET and
2753 cmsg_type == socket.SCM_RIGHTS):
2754 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002755 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002756 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2757 for fd in fds:
2758 os.close(fd)
2759
2760 def createAndSendFDs(self, n):
2761 # Send n new file descriptors created by newFDs() to the
2762 # server, with the constant MSG as the non-ancillary data.
2763 self.assertEqual(
2764 self.sendmsgToServer([MSG],
2765 [(socket.SOL_SOCKET,
2766 socket.SCM_RIGHTS,
2767 array.array("i", self.newFDs(n)))]),
2768 len(MSG))
2769
2770 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2771 # Check that constant MSG was received with numfds file
2772 # descriptors in a maximum of maxcmsgs control messages (which
2773 # must contain only complete integers). By default, check
2774 # that MSG_CTRUNC is unset, but ignore any flags in
2775 # ignoreflags.
2776 msg, ancdata, flags, addr = result
2777 self.assertEqual(msg, MSG)
2778 self.checkRecvmsgAddress(addr, self.cli_addr)
2779 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2780 ignore=ignoreflags)
2781
2782 self.assertIsInstance(ancdata, list)
2783 self.assertLessEqual(len(ancdata), maxcmsgs)
2784 fds = array.array("i")
2785 for item in ancdata:
2786 self.assertIsInstance(item, tuple)
2787 cmsg_level, cmsg_type, cmsg_data = item
2788 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2789 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2790 self.assertIsInstance(cmsg_data, bytes)
2791 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002792 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002793
2794 self.assertEqual(len(fds), numfds)
2795 self.checkFDs(fds)
2796
2797 def testFDPassSimple(self):
2798 # Pass a single FD (array read from bytes object).
2799 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2800 len(MSG), 10240))
2801
2802 def _testFDPassSimple(self):
2803 self.assertEqual(
2804 self.sendmsgToServer(
2805 [MSG],
2806 [(socket.SOL_SOCKET,
2807 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002808 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002809 len(MSG))
2810
2811 def testMultipleFDPass(self):
2812 # Pass multiple FDs in a single array.
2813 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2814 len(MSG), 10240))
2815
2816 def _testMultipleFDPass(self):
2817 self.createAndSendFDs(4)
2818
2819 @requireAttrs(socket, "CMSG_SPACE")
2820 def testFDPassCMSG_SPACE(self):
2821 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2822 self.checkRecvmsgFDs(
2823 4, self.doRecvmsg(self.serv_sock, len(MSG),
2824 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2825
2826 @testFDPassCMSG_SPACE.client_skip
2827 def _testFDPassCMSG_SPACE(self):
2828 self.createAndSendFDs(4)
2829
2830 def testFDPassCMSG_LEN(self):
2831 # Test using CMSG_LEN() to calculate ancillary buffer size.
2832 self.checkRecvmsgFDs(1,
2833 self.doRecvmsg(self.serv_sock, len(MSG),
2834 socket.CMSG_LEN(4 * SIZEOF_INT)),
2835 # RFC 3542 says implementations may set
2836 # MSG_CTRUNC if there isn't enough space
2837 # for trailing padding.
2838 ignoreflags=socket.MSG_CTRUNC)
2839
2840 def _testFDPassCMSG_LEN(self):
2841 self.createAndSendFDs(1)
2842
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002843 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002844 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002845 @requireAttrs(socket, "CMSG_SPACE")
2846 def testFDPassSeparate(self):
2847 # Pass two FDs in two separate arrays. Arrays may be combined
2848 # into a single control message by the OS.
2849 self.checkRecvmsgFDs(2,
2850 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2851 maxcmsgs=2)
2852
2853 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002854 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002855 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002856 def _testFDPassSeparate(self):
2857 fd0, fd1 = self.newFDs(2)
2858 self.assertEqual(
2859 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2860 socket.SCM_RIGHTS,
2861 array.array("i", [fd0])),
2862 (socket.SOL_SOCKET,
2863 socket.SCM_RIGHTS,
2864 array.array("i", [fd1]))]),
2865 len(MSG))
2866
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002867 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002868 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002869 @requireAttrs(socket, "CMSG_SPACE")
2870 def testFDPassSeparateMinSpace(self):
2871 # Pass two FDs in two separate arrays, receiving them into the
2872 # minimum space for two arrays.
2873 self.checkRecvmsgFDs(2,
2874 self.doRecvmsg(self.serv_sock, len(MSG),
2875 socket.CMSG_SPACE(SIZEOF_INT) +
2876 socket.CMSG_LEN(SIZEOF_INT)),
2877 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2878
2879 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002880 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002881 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002882 def _testFDPassSeparateMinSpace(self):
2883 fd0, fd1 = self.newFDs(2)
2884 self.assertEqual(
2885 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2886 socket.SCM_RIGHTS,
2887 array.array("i", [fd0])),
2888 (socket.SOL_SOCKET,
2889 socket.SCM_RIGHTS,
2890 array.array("i", [fd1]))]),
2891 len(MSG))
2892
2893 def sendAncillaryIfPossible(self, msg, ancdata):
2894 # Try to send msg and ancdata to server, but if the system
2895 # call fails, just send msg with no ancillary data.
2896 try:
2897 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002898 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002899 # Check that it was the system call that failed
2900 self.assertIsInstance(e.errno, int)
2901 nbytes = self.sendmsgToServer([msg])
2902 self.assertEqual(nbytes, len(msg))
2903
Brett Cannon3bbad122015-12-28 17:21:44 -08002904 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002905 def testFDPassEmpty(self):
2906 # Try to pass an empty FD array. Can receive either no array
2907 # or an empty array.
2908 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2909 len(MSG), 10240),
2910 ignoreflags=socket.MSG_CTRUNC)
2911
2912 def _testFDPassEmpty(self):
2913 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2914 socket.SCM_RIGHTS,
2915 b"")])
2916
2917 def testFDPassPartialInt(self):
2918 # Try to pass a truncated FD array.
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), 1)
2925 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2926 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2927 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2928 self.assertLess(len(cmsg_data), SIZEOF_INT)
2929
2930 def _testFDPassPartialInt(self):
2931 self.sendAncillaryIfPossible(
2932 MSG,
2933 [(socket.SOL_SOCKET,
2934 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002935 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002936
2937 @requireAttrs(socket, "CMSG_SPACE")
2938 def testFDPassPartialIntInMiddle(self):
2939 # Try to pass two FD arrays, the first of which is truncated.
2940 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2941 len(MSG), 10240)
2942 self.assertEqual(msg, MSG)
2943 self.checkRecvmsgAddress(addr, self.cli_addr)
2944 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2945 self.assertLessEqual(len(ancdata), 2)
2946 fds = array.array("i")
2947 # Arrays may have been combined in a single control message
2948 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2949 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2950 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002951 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002952 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2953 self.assertLessEqual(len(fds), 2)
2954 self.checkFDs(fds)
2955
2956 @testFDPassPartialIntInMiddle.client_skip
2957 def _testFDPassPartialIntInMiddle(self):
2958 fd0, fd1 = self.newFDs(2)
2959 self.sendAncillaryIfPossible(
2960 MSG,
2961 [(socket.SOL_SOCKET,
2962 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002963 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002964 (socket.SOL_SOCKET,
2965 socket.SCM_RIGHTS,
2966 array.array("i", [fd1]))])
2967
2968 def checkTruncatedHeader(self, result, ignoreflags=0):
2969 # Check that no ancillary data items are returned when data is
2970 # truncated inside the cmsghdr structure.
2971 msg, ancdata, flags, addr = result
2972 self.assertEqual(msg, MSG)
2973 self.checkRecvmsgAddress(addr, self.cli_addr)
2974 self.assertEqual(ancdata, [])
2975 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2976 ignore=ignoreflags)
2977
2978 def testCmsgTruncNoBufSize(self):
2979 # Check that no ancillary data is received when no buffer size
2980 # is specified.
2981 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2982 # BSD seems to set MSG_CTRUNC only
2983 # if an item has been partially
2984 # received.
2985 ignoreflags=socket.MSG_CTRUNC)
2986
2987 def _testCmsgTruncNoBufSize(self):
2988 self.createAndSendFDs(1)
2989
2990 def testCmsgTrunc0(self):
2991 # Check that no ancillary data is received when buffer size is 0.
2992 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2993 ignoreflags=socket.MSG_CTRUNC)
2994
2995 def _testCmsgTrunc0(self):
2996 self.createAndSendFDs(1)
2997
2998 # Check that no ancillary data is returned for various non-zero
2999 # (but still too small) buffer sizes.
3000
3001 def testCmsgTrunc1(self):
3002 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3003
3004 def _testCmsgTrunc1(self):
3005 self.createAndSendFDs(1)
3006
3007 def testCmsgTrunc2Int(self):
3008 # The cmsghdr structure has at least three members, two of
3009 # which are ints, so we still shouldn't see any ancillary
3010 # data.
3011 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3012 SIZEOF_INT * 2))
3013
3014 def _testCmsgTrunc2Int(self):
3015 self.createAndSendFDs(1)
3016
3017 def testCmsgTruncLen0Minus1(self):
3018 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3019 socket.CMSG_LEN(0) - 1))
3020
3021 def _testCmsgTruncLen0Minus1(self):
3022 self.createAndSendFDs(1)
3023
3024 # The following tests try to truncate the control message in the
3025 # middle of the FD array.
3026
3027 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3028 # Check that file descriptor data is truncated to between
3029 # mindata and maxdata bytes when received with buffer size
3030 # ancbuf, and that any complete file descriptor numbers are
3031 # valid.
3032 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3033 len(MSG), ancbuf)
3034 self.assertEqual(msg, MSG)
3035 self.checkRecvmsgAddress(addr, self.cli_addr)
3036 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3037
3038 if mindata == 0 and ancdata == []:
3039 return
3040 self.assertEqual(len(ancdata), 1)
3041 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3042 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3043 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3044 self.assertGreaterEqual(len(cmsg_data), mindata)
3045 self.assertLessEqual(len(cmsg_data), maxdata)
3046 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003047 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003048 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3049 self.checkFDs(fds)
3050
3051 def testCmsgTruncLen0(self):
3052 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3053
3054 def _testCmsgTruncLen0(self):
3055 self.createAndSendFDs(1)
3056
3057 def testCmsgTruncLen0Plus1(self):
3058 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3059
3060 def _testCmsgTruncLen0Plus1(self):
3061 self.createAndSendFDs(2)
3062
3063 def testCmsgTruncLen1(self):
3064 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3065 maxdata=SIZEOF_INT)
3066
3067 def _testCmsgTruncLen1(self):
3068 self.createAndSendFDs(2)
3069
3070 def testCmsgTruncLen2Minus1(self):
3071 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3072 maxdata=(2 * SIZEOF_INT) - 1)
3073
3074 def _testCmsgTruncLen2Minus1(self):
3075 self.createAndSendFDs(2)
3076
3077
3078class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3079 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3080 # features of the RFC 3542 Advanced Sockets API for IPv6.
3081 # Currently we can only handle certain data items (e.g. traffic
3082 # class, hop limit, MTU discovery and fragmentation settings)
3083 # without resorting to unportable means such as the struct module,
3084 # but the tests here are aimed at testing the ancillary data
3085 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3086 # itself.
3087
3088 # Test value to use when setting hop limit of packet
3089 hop_limit = 2
3090
3091 # Test value to use when setting traffic class of packet.
3092 # -1 means "use kernel default".
3093 traffic_class = -1
3094
3095 def ancillaryMapping(self, ancdata):
3096 # Given ancillary data list ancdata, return a mapping from
3097 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3098 # Check that no (level, type) pair appears more than once.
3099 d = {}
3100 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3101 self.assertNotIn((cmsg_level, cmsg_type), d)
3102 d[(cmsg_level, cmsg_type)] = cmsg_data
3103 return d
3104
3105 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3106 # Receive hop limit into ancbufsize bytes of ancillary data
3107 # space. Check that data is MSG, ancillary data is not
3108 # truncated (but ignore any flags in ignoreflags), and hop
3109 # limit is between 0 and maxhop inclusive.
3110 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3111 socket.IPV6_RECVHOPLIMIT, 1)
3112 self.misc_event.set()
3113 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3114 len(MSG), ancbufsize)
3115
3116 self.assertEqual(msg, MSG)
3117 self.checkRecvmsgAddress(addr, self.cli_addr)
3118 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3119 ignore=ignoreflags)
3120
3121 self.assertEqual(len(ancdata), 1)
3122 self.assertIsInstance(ancdata[0], tuple)
3123 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3124 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3125 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3126 self.assertIsInstance(cmsg_data, bytes)
3127 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3128 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003129 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003130 self.assertGreaterEqual(a[0], 0)
3131 self.assertLessEqual(a[0], maxhop)
3132
3133 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3134 def testRecvHopLimit(self):
3135 # Test receiving the packet hop limit as ancillary data.
3136 self.checkHopLimit(ancbufsize=10240)
3137
3138 @testRecvHopLimit.client_skip
3139 def _testRecvHopLimit(self):
3140 # Need to wait until server has asked to receive ancillary
3141 # data, as implementations are not required to buffer it
3142 # otherwise.
3143 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3144 self.sendToServer(MSG)
3145
3146 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3147 def testRecvHopLimitCMSG_SPACE(self):
3148 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3149 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3150
3151 @testRecvHopLimitCMSG_SPACE.client_skip
3152 def _testRecvHopLimitCMSG_SPACE(self):
3153 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3154 self.sendToServer(MSG)
3155
3156 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3157 # 3542 says portable applications must provide space for trailing
3158 # padding. Implementations may set MSG_CTRUNC if there isn't
3159 # enough space for the padding.
3160
3161 @requireAttrs(socket.socket, "sendmsg")
3162 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3163 def testSetHopLimit(self):
3164 # Test setting hop limit on outgoing packet and receiving it
3165 # at the other end.
3166 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3167
3168 @testSetHopLimit.client_skip
3169 def _testSetHopLimit(self):
3170 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3171 self.assertEqual(
3172 self.sendmsgToServer([MSG],
3173 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3174 array.array("i", [self.hop_limit]))]),
3175 len(MSG))
3176
3177 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3178 ignoreflags=0):
3179 # Receive traffic class and hop limit into ancbufsize bytes of
3180 # ancillary data space. Check that data is MSG, ancillary
3181 # data is not truncated (but ignore any flags in ignoreflags),
3182 # and traffic class and hop limit are in range (hop limit no
3183 # more than maxhop).
3184 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3185 socket.IPV6_RECVHOPLIMIT, 1)
3186 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3187 socket.IPV6_RECVTCLASS, 1)
3188 self.misc_event.set()
3189 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3190 len(MSG), ancbufsize)
3191
3192 self.assertEqual(msg, MSG)
3193 self.checkRecvmsgAddress(addr, self.cli_addr)
3194 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3195 ignore=ignoreflags)
3196 self.assertEqual(len(ancdata), 2)
3197 ancmap = self.ancillaryMapping(ancdata)
3198
3199 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3200 self.assertEqual(len(tcdata), SIZEOF_INT)
3201 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003202 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003203 self.assertGreaterEqual(a[0], 0)
3204 self.assertLessEqual(a[0], 255)
3205
3206 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3207 self.assertEqual(len(hldata), SIZEOF_INT)
3208 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003209 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003210 self.assertGreaterEqual(a[0], 0)
3211 self.assertLessEqual(a[0], maxhop)
3212
3213 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3214 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3215 def testRecvTrafficClassAndHopLimit(self):
3216 # Test receiving traffic class and hop limit as ancillary data.
3217 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3218
3219 @testRecvTrafficClassAndHopLimit.client_skip
3220 def _testRecvTrafficClassAndHopLimit(self):
3221 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3222 self.sendToServer(MSG)
3223
3224 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3225 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3226 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3227 # Test receiving traffic class and hop limit, using
3228 # CMSG_SPACE() to calculate buffer size.
3229 self.checkTrafficClassAndHopLimit(
3230 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3231
3232 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3233 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3234 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3235 self.sendToServer(MSG)
3236
3237 @requireAttrs(socket.socket, "sendmsg")
3238 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3239 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3240 def testSetTrafficClassAndHopLimit(self):
3241 # Test setting traffic class and hop limit on outgoing packet,
3242 # and receiving them at the other end.
3243 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3244 maxhop=self.hop_limit)
3245
3246 @testSetTrafficClassAndHopLimit.client_skip
3247 def _testSetTrafficClassAndHopLimit(self):
3248 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3249 self.assertEqual(
3250 self.sendmsgToServer([MSG],
3251 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3252 array.array("i", [self.traffic_class])),
3253 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3254 array.array("i", [self.hop_limit]))]),
3255 len(MSG))
3256
3257 @requireAttrs(socket.socket, "sendmsg")
3258 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3259 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3260 def testOddCmsgSize(self):
3261 # Try to send ancillary data with first item one byte too
3262 # long. Fall back to sending with correct size if this fails,
3263 # and check that second item was handled correctly.
3264 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3265 maxhop=self.hop_limit)
3266
3267 @testOddCmsgSize.client_skip
3268 def _testOddCmsgSize(self):
3269 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3270 try:
3271 nbytes = self.sendmsgToServer(
3272 [MSG],
3273 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003274 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003275 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3276 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003277 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003278 self.assertIsInstance(e.errno, int)
3279 nbytes = self.sendmsgToServer(
3280 [MSG],
3281 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3282 array.array("i", [self.traffic_class])),
3283 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3284 array.array("i", [self.hop_limit]))])
3285 self.assertEqual(nbytes, len(MSG))
3286
3287 # Tests for proper handling of truncated ancillary data
3288
3289 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3290 # Receive hop limit into ancbufsize bytes of ancillary data
3291 # space, which should be too small to contain the ancillary
3292 # data header (if ancbufsize is None, pass no second argument
3293 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3294 # (unless included in ignoreflags), and no ancillary data is
3295 # returned.
3296 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3297 socket.IPV6_RECVHOPLIMIT, 1)
3298 self.misc_event.set()
3299 args = () if ancbufsize is None else (ancbufsize,)
3300 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3301 len(MSG), *args)
3302
3303 self.assertEqual(msg, MSG)
3304 self.checkRecvmsgAddress(addr, self.cli_addr)
3305 self.assertEqual(ancdata, [])
3306 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3307 ignore=ignoreflags)
3308
3309 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3310 def testCmsgTruncNoBufSize(self):
3311 # Check that no ancillary data is received when no ancillary
3312 # buffer size is provided.
3313 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3314 # BSD seems to set
3315 # MSG_CTRUNC only if an item
3316 # has been partially
3317 # received.
3318 ignoreflags=socket.MSG_CTRUNC)
3319
3320 @testCmsgTruncNoBufSize.client_skip
3321 def _testCmsgTruncNoBufSize(self):
3322 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3323 self.sendToServer(MSG)
3324
3325 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3326 def testSingleCmsgTrunc0(self):
3327 # Check that no ancillary data is received when ancillary
3328 # buffer size is zero.
3329 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3330 ignoreflags=socket.MSG_CTRUNC)
3331
3332 @testSingleCmsgTrunc0.client_skip
3333 def _testSingleCmsgTrunc0(self):
3334 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3335 self.sendToServer(MSG)
3336
3337 # Check that no ancillary data is returned for various non-zero
3338 # (but still too small) buffer sizes.
3339
3340 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3341 def testSingleCmsgTrunc1(self):
3342 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3343
3344 @testSingleCmsgTrunc1.client_skip
3345 def _testSingleCmsgTrunc1(self):
3346 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3347 self.sendToServer(MSG)
3348
3349 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3350 def testSingleCmsgTrunc2Int(self):
3351 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3352
3353 @testSingleCmsgTrunc2Int.client_skip
3354 def _testSingleCmsgTrunc2Int(self):
3355 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3356 self.sendToServer(MSG)
3357
3358 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3359 def testSingleCmsgTruncLen0Minus1(self):
3360 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3361
3362 @testSingleCmsgTruncLen0Minus1.client_skip
3363 def _testSingleCmsgTruncLen0Minus1(self):
3364 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3365 self.sendToServer(MSG)
3366
3367 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3368 def testSingleCmsgTruncInData(self):
3369 # Test truncation of a control message inside its associated
3370 # data. The message may be returned with its data truncated,
3371 # or not returned at all.
3372 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3373 socket.IPV6_RECVHOPLIMIT, 1)
3374 self.misc_event.set()
3375 msg, ancdata, flags, addr = self.doRecvmsg(
3376 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3377
3378 self.assertEqual(msg, MSG)
3379 self.checkRecvmsgAddress(addr, self.cli_addr)
3380 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3381
3382 self.assertLessEqual(len(ancdata), 1)
3383 if ancdata:
3384 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3385 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3386 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3387 self.assertLess(len(cmsg_data), SIZEOF_INT)
3388
3389 @testSingleCmsgTruncInData.client_skip
3390 def _testSingleCmsgTruncInData(self):
3391 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3392 self.sendToServer(MSG)
3393
3394 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3395 # Receive traffic class and hop limit into ancbufsize bytes of
3396 # ancillary data space, which should be large enough to
3397 # contain the first item, but too small to contain the header
3398 # of the second. Check that data is MSG, MSG_CTRUNC is set
3399 # (unless included in ignoreflags), and only one ancillary
3400 # data item is returned.
3401 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3402 socket.IPV6_RECVHOPLIMIT, 1)
3403 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3404 socket.IPV6_RECVTCLASS, 1)
3405 self.misc_event.set()
3406 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3407 len(MSG), ancbufsize)
3408
3409 self.assertEqual(msg, MSG)
3410 self.checkRecvmsgAddress(addr, self.cli_addr)
3411 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3412 ignore=ignoreflags)
3413
3414 self.assertEqual(len(ancdata), 1)
3415 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3416 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3417 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3418 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3419 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003420 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003421 self.assertGreaterEqual(a[0], 0)
3422 self.assertLessEqual(a[0], 255)
3423
3424 # Try the above test with various buffer sizes.
3425
3426 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3427 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3428 def testSecondCmsgTrunc0(self):
3429 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3430 ignoreflags=socket.MSG_CTRUNC)
3431
3432 @testSecondCmsgTrunc0.client_skip
3433 def _testSecondCmsgTrunc0(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 testSecondCmsgTrunc1(self):
3440 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3441
3442 @testSecondCmsgTrunc1.client_skip
3443 def _testSecondCmsgTrunc1(self):
3444 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3445 self.sendToServer(MSG)
3446
3447 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3448 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3449 def testSecondCmsgTrunc2Int(self):
3450 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3451 2 * SIZEOF_INT)
3452
3453 @testSecondCmsgTrunc2Int.client_skip
3454 def _testSecondCmsgTrunc2Int(self):
3455 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3456 self.sendToServer(MSG)
3457
3458 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3459 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3460 def testSecondCmsgTruncLen0Minus1(self):
3461 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3462 socket.CMSG_LEN(0) - 1)
3463
3464 @testSecondCmsgTruncLen0Minus1.client_skip
3465 def _testSecondCmsgTruncLen0Minus1(self):
3466 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3467 self.sendToServer(MSG)
3468
3469 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3470 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3471 def testSecomdCmsgTruncInData(self):
3472 # Test truncation of the second of two control messages inside
3473 # its associated data.
3474 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3475 socket.IPV6_RECVHOPLIMIT, 1)
3476 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3477 socket.IPV6_RECVTCLASS, 1)
3478 self.misc_event.set()
3479 msg, ancdata, flags, addr = self.doRecvmsg(
3480 self.serv_sock, len(MSG),
3481 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3482
3483 self.assertEqual(msg, MSG)
3484 self.checkRecvmsgAddress(addr, self.cli_addr)
3485 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3486
3487 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3488
3489 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3490 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3491 cmsg_types.remove(cmsg_type)
3492 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3493 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003494 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003495 self.assertGreaterEqual(a[0], 0)
3496 self.assertLessEqual(a[0], 255)
3497
3498 if ancdata:
3499 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3500 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3501 cmsg_types.remove(cmsg_type)
3502 self.assertLess(len(cmsg_data), SIZEOF_INT)
3503
3504 self.assertEqual(ancdata, [])
3505
3506 @testSecomdCmsgTruncInData.client_skip
3507 def _testSecomdCmsgTruncInData(self):
3508 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3509 self.sendToServer(MSG)
3510
3511
3512# Derive concrete test classes for different socket types.
3513
3514class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3515 SendrecvmsgConnectionlessBase,
3516 ThreadedSocketTestMixin, UDPTestBase):
3517 pass
3518
3519@requireAttrs(socket.socket, "sendmsg")
3520@unittest.skipUnless(thread, 'Threading required for this test.')
3521class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3522 pass
3523
3524@requireAttrs(socket.socket, "recvmsg")
3525@unittest.skipUnless(thread, 'Threading required for this test.')
3526class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3527 pass
3528
3529@requireAttrs(socket.socket, "recvmsg_into")
3530@unittest.skipUnless(thread, 'Threading required for this test.')
3531class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3532 pass
3533
3534
3535class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3536 SendrecvmsgConnectionlessBase,
3537 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003538
3539 def checkRecvmsgAddress(self, addr1, addr2):
3540 # Called to compare the received address with the address of
3541 # the peer, ignoring scope ID
3542 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003543
3544@requireAttrs(socket.socket, "sendmsg")
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@requireSocket("AF_INET6", "SOCK_DGRAM")
3547@unittest.skipUnless(thread, 'Threading required for this test.')
3548class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3549 pass
3550
3551@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003552@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003553@requireSocket("AF_INET6", "SOCK_DGRAM")
3554@unittest.skipUnless(thread, 'Threading required for this test.')
3555class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3556 pass
3557
3558@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003559@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003560@requireSocket("AF_INET6", "SOCK_DGRAM")
3561@unittest.skipUnless(thread, 'Threading required for this test.')
3562class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3563 pass
3564
3565@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003566@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003567@requireAttrs(socket, "IPPROTO_IPV6")
3568@requireSocket("AF_INET6", "SOCK_DGRAM")
3569@unittest.skipUnless(thread, 'Threading required for this test.')
3570class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3571 SendrecvmsgUDP6TestBase):
3572 pass
3573
3574@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003575@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003576@requireAttrs(socket, "IPPROTO_IPV6")
3577@requireSocket("AF_INET6", "SOCK_DGRAM")
3578@unittest.skipUnless(thread, 'Threading required for this test.')
3579class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3580 RFC3542AncillaryTest,
3581 SendrecvmsgUDP6TestBase):
3582 pass
3583
3584
3585class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3586 ConnectedStreamTestMixin, TCPTestBase):
3587 pass
3588
3589@requireAttrs(socket.socket, "sendmsg")
3590@unittest.skipUnless(thread, 'Threading required for this test.')
3591class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3592 pass
3593
3594@requireAttrs(socket.socket, "recvmsg")
3595@unittest.skipUnless(thread, 'Threading required for this test.')
3596class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3597 SendrecvmsgTCPTestBase):
3598 pass
3599
3600@requireAttrs(socket.socket, "recvmsg_into")
3601@unittest.skipUnless(thread, 'Threading required for this test.')
3602class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3603 SendrecvmsgTCPTestBase):
3604 pass
3605
3606
3607class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3608 SendrecvmsgConnectedBase,
3609 ConnectedStreamTestMixin, SCTPStreamBase):
3610 pass
3611
3612@requireAttrs(socket.socket, "sendmsg")
3613@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3614@unittest.skipUnless(thread, 'Threading required for this test.')
3615class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3616 pass
3617
3618@requireAttrs(socket.socket, "recvmsg")
3619@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3620@unittest.skipUnless(thread, 'Threading required for this test.')
3621class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3622 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003623
3624 def testRecvmsgEOF(self):
3625 try:
3626 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3627 except OSError as e:
3628 if e.errno != errno.ENOTCONN:
3629 raise
3630 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003631
3632@requireAttrs(socket.socket, "recvmsg_into")
3633@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3634@unittest.skipUnless(thread, 'Threading required for this test.')
3635class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3636 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003637
3638 def testRecvmsgEOF(self):
3639 try:
3640 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3641 except OSError as e:
3642 if e.errno != errno.ENOTCONN:
3643 raise
3644 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003645
3646
3647class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3648 ConnectedStreamTestMixin, UnixStreamBase):
3649 pass
3650
3651@requireAttrs(socket.socket, "sendmsg")
3652@requireAttrs(socket, "AF_UNIX")
3653@unittest.skipUnless(thread, 'Threading required for this test.')
3654class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3655 pass
3656
3657@requireAttrs(socket.socket, "recvmsg")
3658@requireAttrs(socket, "AF_UNIX")
3659@unittest.skipUnless(thread, 'Threading required for this test.')
3660class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3661 SendrecvmsgUnixStreamTestBase):
3662 pass
3663
3664@requireAttrs(socket.socket, "recvmsg_into")
3665@requireAttrs(socket, "AF_UNIX")
3666@unittest.skipUnless(thread, 'Threading required for this test.')
3667class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3668 SendrecvmsgUnixStreamTestBase):
3669 pass
3670
3671@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3672@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3673@unittest.skipUnless(thread, 'Threading required for this test.')
3674class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3675 pass
3676
3677@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3678@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3679@unittest.skipUnless(thread, 'Threading required for this test.')
3680class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3681 SendrecvmsgUnixStreamTestBase):
3682 pass
3683
3684
3685# Test interrupting the interruptible send/receive methods with a
3686# signal when a timeout is set. These tests avoid having multiple
3687# threads alive during the test so that the OS cannot deliver the
3688# signal to the wrong one.
3689
3690class InterruptedTimeoutBase(unittest.TestCase):
3691 # Base class for interrupted send/receive tests. Installs an
3692 # empty handler for SIGALRM and removes it on teardown, along with
3693 # any scheduled alarms.
3694
3695 def setUp(self):
3696 super().setUp()
3697 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003698 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003699 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3700 self.addCleanup(self.setAlarm, 0)
3701
3702 # Timeout for socket operations
3703 timeout = 4.0
3704
3705 # Provide setAlarm() method to schedule delivery of SIGALRM after
3706 # given number of seconds, or cancel it if zero, and an
3707 # appropriate time value to use. Use setitimer() if available.
3708 if hasattr(signal, "setitimer"):
3709 alarm_time = 0.05
3710
3711 def setAlarm(self, seconds):
3712 signal.setitimer(signal.ITIMER_REAL, seconds)
3713 else:
3714 # Old systems may deliver the alarm up to one second early
3715 alarm_time = 2
3716
3717 def setAlarm(self, seconds):
3718 signal.alarm(seconds)
3719
3720
3721# Require siginterrupt() in order to ensure that system calls are
3722# interrupted by default.
3723@requireAttrs(signal, "siginterrupt")
3724@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3725 "Don't have signal.alarm or signal.setitimer")
3726class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3727 # Test interrupting the recv*() methods with signals when a
3728 # timeout is set.
3729
3730 def setUp(self):
3731 super().setUp()
3732 self.serv.settimeout(self.timeout)
3733
3734 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003735 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003736 # errno of EINTR when interrupted by a signal.
3737 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003738 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003739 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003740
3741 def testInterruptedRecvTimeout(self):
3742 self.checkInterruptedRecv(self.serv.recv, 1024)
3743
3744 def testInterruptedRecvIntoTimeout(self):
3745 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3746
3747 def testInterruptedRecvfromTimeout(self):
3748 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3749
3750 def testInterruptedRecvfromIntoTimeout(self):
3751 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3752
3753 @requireAttrs(socket.socket, "recvmsg")
3754 def testInterruptedRecvmsgTimeout(self):
3755 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3756
3757 @requireAttrs(socket.socket, "recvmsg_into")
3758 def testInterruptedRecvmsgIntoTimeout(self):
3759 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3760
3761
3762# Require siginterrupt() in order to ensure that system calls are
3763# interrupted by default.
3764@requireAttrs(signal, "siginterrupt")
3765@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3766 "Don't have signal.alarm or signal.setitimer")
3767@unittest.skipUnless(thread, 'Threading required for this test.')
3768class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3769 ThreadSafeCleanupTestCase,
3770 SocketListeningTestMixin, TCPTestBase):
3771 # Test interrupting the interruptible send*() methods with signals
3772 # when a timeout is set.
3773
3774 def setUp(self):
3775 super().setUp()
3776 self.serv_conn = self.newSocket()
3777 self.addCleanup(self.serv_conn.close)
3778 # Use a thread to complete the connection, but wait for it to
3779 # terminate before running the test, so that there is only one
3780 # thread to accept the signal.
3781 cli_thread = threading.Thread(target=self.doConnect)
3782 cli_thread.start()
3783 self.cli_conn, addr = self.serv.accept()
3784 self.addCleanup(self.cli_conn.close)
3785 cli_thread.join()
3786 self.serv_conn.settimeout(self.timeout)
3787
3788 def doConnect(self):
3789 self.serv_conn.connect(self.serv_addr)
3790
3791 def checkInterruptedSend(self, func, *args, **kwargs):
3792 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003793 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003794 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003795 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003796 while True:
3797 self.setAlarm(self.alarm_time)
3798 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003799
Ned Deilyc5640382014-02-03 13:58:31 -08003800 # Issue #12958: The following tests have problems on OS X prior to 10.7
3801 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003802 def testInterruptedSendTimeout(self):
3803 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3804
Ned Deilyc5640382014-02-03 13:58:31 -08003805 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003806 def testInterruptedSendtoTimeout(self):
3807 # Passing an actual address here as Python's wrapper for
3808 # sendto() doesn't allow passing a zero-length one; POSIX
3809 # requires that the address is ignored since the socket is
3810 # connection-mode, however.
3811 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3812 self.serv_addr)
3813
Ned Deilyc5640382014-02-03 13:58:31 -08003814 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003815 @requireAttrs(socket.socket, "sendmsg")
3816 def testInterruptedSendmsgTimeout(self):
3817 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3818
3819
Victor Stinner45df8202010-04-28 22:31:17 +00003820@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003821class TCPCloserTest(ThreadedTCPSocketTest):
3822
3823 def testClose(self):
3824 conn, addr = self.serv.accept()
3825 conn.close()
3826
3827 sd = self.cli
3828 read, write, err = select.select([sd], [], [], 1.0)
3829 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003830 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003831
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003832 # Calling close() many times should be safe.
3833 conn.close()
3834 conn.close()
3835
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003836 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003837 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003838 time.sleep(1.0)
3839
Victor Stinner45df8202010-04-28 22:31:17 +00003840@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003841class BasicSocketPairTest(SocketPairTest):
3842
3843 def __init__(self, methodName='runTest'):
3844 SocketPairTest.__init__(self, methodName=methodName)
3845
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003846 def _check_defaults(self, sock):
3847 self.assertIsInstance(sock, socket.socket)
3848 if hasattr(socket, 'AF_UNIX'):
3849 self.assertEqual(sock.family, socket.AF_UNIX)
3850 else:
3851 self.assertEqual(sock.family, socket.AF_INET)
3852 self.assertEqual(sock.type, socket.SOCK_STREAM)
3853 self.assertEqual(sock.proto, 0)
3854
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003855 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003856 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003857
3858 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003859 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003860
Dave Cole331708b2004-08-09 04:51:41 +00003861 def testRecv(self):
3862 msg = self.serv.recv(1024)
3863 self.assertEqual(msg, MSG)
3864
3865 def _testRecv(self):
3866 self.cli.send(MSG)
3867
3868 def testSend(self):
3869 self.serv.send(MSG)
3870
3871 def _testSend(self):
3872 msg = self.cli.recv(1024)
3873 self.assertEqual(msg, MSG)
3874
Victor Stinner45df8202010-04-28 22:31:17 +00003875@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003876class NonBlockingTCPTests(ThreadedTCPSocketTest):
3877
3878 def __init__(self, methodName='runTest'):
3879 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3880
3881 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003882 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003883 self.serv.setblocking(True)
3884 self.assertIsNone(self.serv.gettimeout())
3885 self.serv.setblocking(False)
3886 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003887 start = time.time()
3888 try:
3889 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003890 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003891 pass
3892 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003893 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003894
3895 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003896 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003897
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003898 @support.cpython_only
3899 def testSetBlocking_overflow(self):
3900 # Issue 15989
3901 import _testcapi
3902 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3903 self.skipTest('needs UINT_MAX < ULONG_MAX')
3904 self.serv.setblocking(False)
3905 self.assertEqual(self.serv.gettimeout(), 0.0)
3906 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3907 self.assertIsNone(self.serv.gettimeout())
3908
3909 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3910
Serhiy Storchaka43767632013-11-03 21:31:38 +02003911 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3912 'test needs socket.SOCK_NONBLOCK')
3913 @support.requires_linux_version(2, 6, 28)
3914 def testInitNonBlocking(self):
3915 # reinit server socket
3916 self.serv.close()
3917 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3918 socket.SOCK_NONBLOCK)
3919 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003920 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003921 # actual testing
3922 start = time.time()
3923 try:
3924 self.serv.accept()
3925 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003926 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003927 end = time.time()
3928 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3929
3930 def _testInitNonBlocking(self):
3931 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003932
Antoine Pitrou600232b2011-01-05 21:03:42 +00003933 def testInheritFlags(self):
3934 # Issue #7995: when calling accept() on a listening socket with a
3935 # timeout, the resulting socket should not be non-blocking.
3936 self.serv.settimeout(10)
3937 try:
3938 conn, addr = self.serv.accept()
3939 message = conn.recv(len(MSG))
3940 finally:
3941 conn.close()
3942 self.serv.settimeout(None)
3943
3944 def _testInheritFlags(self):
3945 time.sleep(0.1)
3946 self.cli.connect((HOST, self.port))
3947 time.sleep(0.5)
3948 self.cli.send(MSG)
3949
Guido van Rossum24e4af82002-06-12 19:18:08 +00003950 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003951 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003952 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003953 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003954 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003955 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003956 pass
3957 else:
3958 self.fail("Error trying to do non-blocking accept.")
3959 read, write, err = select.select([self.serv], [], [])
3960 if self.serv in read:
3961 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07003962 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00003963 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003964 else:
3965 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003966
Guido van Rossum24e4af82002-06-12 19:18:08 +00003967 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003968 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003969 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003970
3971 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003972 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003973 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003974 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003975
3976 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003977 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003978 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003979
3980 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003981 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003982 conn, addr = self.serv.accept()
3983 conn.setblocking(0)
3984 try:
3985 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003986 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003987 pass
3988 else:
3989 self.fail("Error trying to do non-blocking recv.")
3990 read, write, err = select.select([conn], [], [])
3991 if conn in read:
3992 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003993 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003994 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003995 else:
3996 self.fail("Error during select call to non-blocking socket.")
3997
3998 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003999 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004000 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004001 self.cli.send(MSG)
4002
Victor Stinner45df8202010-04-28 22:31:17 +00004003@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00004004class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004005 """Unit tests for the object returned by socket.makefile()
4006
Antoine Pitrou834bd812010-10-13 16:17:14 +00004007 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004008 the client connection. You can read from this file to
4009 get output from the server.
4010
Antoine Pitrou834bd812010-10-13 16:17:14 +00004011 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004012 server connection. You can write to this file to send output
4013 to the client.
4014 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004015
Guido van Rossume9f66142002-08-07 15:46:19 +00004016 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004017 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004018 errors = 'strict'
4019 newline = None
4020
4021 read_mode = 'rb'
4022 read_msg = MSG
4023 write_mode = 'wb'
4024 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004025
Guido van Rossum24e4af82002-06-12 19:18:08 +00004026 def __init__(self, methodName='runTest'):
4027 SocketConnectedTest.__init__(self, methodName=methodName)
4028
4029 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004030 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4031 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004032 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004033 self.read_file = self.cli_conn.makefile(
4034 self.read_mode, self.bufsize,
4035 encoding = self.encoding,
4036 errors = self.errors,
4037 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004038
4039 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004040 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004041 self.read_file.close()
4042 self.assertTrue(self.read_file.closed)
4043 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004044 SocketConnectedTest.tearDown(self)
4045
4046 def clientSetUp(self):
4047 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004048 self.write_file = self.serv_conn.makefile(
4049 self.write_mode, self.bufsize,
4050 encoding = self.encoding,
4051 errors = self.errors,
4052 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004053
4054 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004055 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004056 self.write_file.close()
4057 self.assertTrue(self.write_file.closed)
4058 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004059 SocketConnectedTest.clientTearDown(self)
4060
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004061 def testReadAfterTimeout(self):
4062 # Issue #7322: A file object must disallow further reads
4063 # after a timeout has occurred.
4064 self.cli_conn.settimeout(1)
4065 self.read_file.read(3)
4066 # First read raises a timeout
4067 self.assertRaises(socket.timeout, self.read_file.read, 1)
4068 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004069 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004070 self.read_file.read(1)
4071 self.assertIn("cannot read from timed out object", str(ctx.exception))
4072
4073 def _testReadAfterTimeout(self):
4074 self.write_file.write(self.write_msg[0:3])
4075 self.write_file.flush()
4076 self.serv_finished.wait()
4077
Guido van Rossum24e4af82002-06-12 19:18:08 +00004078 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004079 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004080 first_seg = self.read_file.read(len(self.read_msg)-3)
4081 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004082 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004083 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004084
4085 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004086 self.write_file.write(self.write_msg)
4087 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004088
Guido van Rossum8c943832002-08-08 01:00:28 +00004089 def testFullRead(self):
4090 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004091 msg = self.read_file.read()
4092 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004093
4094 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004095 self.write_file.write(self.write_msg)
4096 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004097
Guido van Rossum24e4af82002-06-12 19:18:08 +00004098 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004099 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004100 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004101 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004102 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004103 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004104 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004105 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004106 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004107
4108 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004109 self.write_file.write(self.write_msg)
4110 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004111
4112 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004113 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004114 line = self.read_file.readline()
4115 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004116
4117 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004118 self.write_file.write(self.write_msg)
4119 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004120
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004121 def testCloseAfterMakefile(self):
4122 # The file returned by makefile should keep the socket open.
4123 self.cli_conn.close()
4124 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004125 msg = self.read_file.read()
4126 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004127
4128 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004129 self.write_file.write(self.write_msg)
4130 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004131
4132 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004133 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004134 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004135 if isinstance(self.read_msg, str):
4136 msg = msg.decode()
4137 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004138
4139 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004140 self.write_file.write(self.write_msg)
4141 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004142
Tim Peters116d83c2004-03-28 02:20:45 +00004143 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004144 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004145
4146 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004147 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004148
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004149 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004150 self.assertEqual(self.read_file.mode, self.read_mode)
4151 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004152
4153 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004154 self.assertEqual(self.write_file.mode, self.write_mode)
4155 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004156
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004157 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004158 self.read_file.close()
4159 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004160 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004161 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004162
4163 def _testRealClose(self):
4164 pass
4165
4166
Guido van Rossume9f66142002-08-07 15:46:19 +00004167class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4168
4169 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004170
Guido van Rossume9f66142002-08-07 15:46:19 +00004171 In this case (and in this case only), it should be possible to
4172 create a file object, read a line from it, create another file
4173 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004174 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004175 when reading multiple requests from the same socket."""
4176
4177 bufsize = 0 # Use unbuffered mode
4178
4179 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004180 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004181 line = self.read_file.readline() # first line
4182 self.assertEqual(line, b"A. " + self.write_msg) # first line
4183 self.read_file = self.cli_conn.makefile('rb', 0)
4184 line = self.read_file.readline() # second line
4185 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004186
4187 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004188 self.write_file.write(b"A. " + self.write_msg)
4189 self.write_file.write(b"B. " + self.write_msg)
4190 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004191
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004192 def testMakefileClose(self):
4193 # The file returned by makefile should keep the socket open...
4194 self.cli_conn.close()
4195 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004196 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004197 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004198 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004199 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004200
4201 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004202 self.write_file.write(self.write_msg)
4203 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004204
4205 def testMakefileCloseSocketDestroy(self):
4206 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004207 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004208 refcount_after = sys.getrefcount(self.cli_conn)
4209 self.assertEqual(refcount_before - 1, refcount_after)
4210
4211 def _testMakefileCloseSocketDestroy(self):
4212 pass
4213
Antoine Pitrou98b46702010-09-18 22:59:00 +00004214 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004215 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004216 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4217
4218 def testSmallReadNonBlocking(self):
4219 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004220 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4221 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004222 self.evt1.set()
4223 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004224 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004225 if first_seg is None:
4226 # Data not arrived (can happen under Windows), wait a bit
4227 time.sleep(0.5)
4228 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004229 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004230 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004231 self.assertEqual(n, 3)
4232 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004233 self.assertEqual(msg, self.read_msg)
4234 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4235 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004236
4237 def _testSmallReadNonBlocking(self):
4238 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004239 self.write_file.write(self.write_msg)
4240 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004241 self.evt2.set()
4242 # Avoid cloding the socket before the server test has finished,
4243 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4244 self.serv_finished.wait(5.0)
4245
4246 def testWriteNonBlocking(self):
4247 self.cli_finished.wait(5.0)
4248 # The client thread can't skip directly - the SkipTest exception
4249 # would appear as a failure.
4250 if self.serv_skipped:
4251 self.skipTest(self.serv_skipped)
4252
4253 def _testWriteNonBlocking(self):
4254 self.serv_skipped = None
4255 self.serv_conn.setblocking(False)
4256 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004257 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004258 LIMIT = 10
4259 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004260 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004261 self.assertGreater(n, 0)
4262 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004263 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004264 if n is None:
4265 # Succeeded
4266 break
4267 self.assertGreater(n, 0)
4268 else:
4269 # Let us know that this test didn't manage to establish
4270 # the expected conditions. This is not a failure in itself but,
4271 # if it happens repeatedly, the test should be fixed.
4272 self.serv_skipped = "failed to saturate the socket buffer"
4273
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004274
Guido van Rossum8c943832002-08-08 01:00:28 +00004275class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4276
4277 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4278
4279
4280class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4281
4282 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004283
Thomas Woutersb2137042007-02-01 18:02:27 +00004284
Antoine Pitrou834bd812010-10-13 16:17:14 +00004285class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4286 """Tests for socket.makefile() in text mode (rather than binary)"""
4287
4288 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004289 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004290 write_mode = 'wb'
4291 write_msg = MSG
4292 newline = ''
4293
4294
4295class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4296 """Tests for socket.makefile() in text mode (rather than binary)"""
4297
4298 read_mode = 'rb'
4299 read_msg = MSG
4300 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004301 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004302 newline = ''
4303
4304
4305class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4306 """Tests for socket.makefile() in text mode (rather than binary)"""
4307
4308 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004309 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004310 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004311 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004312 newline = ''
4313
4314
Guido van Rossumd8faa362007-04-27 19:54:29 +00004315class NetworkConnectionTest(object):
4316 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004317
Guido van Rossumd8faa362007-04-27 19:54:29 +00004318 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004319 # We're inherited below by BasicTCPTest2, which also inherits
4320 # BasicTCPTest, which defines self.port referenced below.
4321 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004322 self.serv_conn = self.cli
4323
4324class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4325 """Tests that NetworkConnection does not break existing TCP functionality.
4326 """
4327
4328class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004329
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004330 class MockSocket(socket.socket):
4331 def connect(self, *args):
4332 raise socket.timeout('timed out')
4333
4334 @contextlib.contextmanager
4335 def mocked_socket_module(self):
4336 """Return a socket which times out on connect"""
4337 old_socket = socket.socket
4338 socket.socket = self.MockSocket
4339 try:
4340 yield
4341 finally:
4342 socket.socket = old_socket
4343
4344 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004345 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004346 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004347 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004348 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004349 cli.connect((HOST, port))
4350 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4351
4352 def test_create_connection(self):
4353 # Issue #9792: errors raised by create_connection() should have
4354 # a proper errno attribute.
4355 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004356 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004357 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004358
4359 # Issue #16257: create_connection() calls getaddrinfo() against
4360 # 'localhost'. This may result in an IPV6 addr being returned
4361 # as well as an IPV4 one:
4362 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4363 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4364 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4365 #
4366 # create_connection() enumerates through all the addresses returned
4367 # and if it doesn't successfully bind to any of them, it propagates
4368 # the last exception it encountered.
4369 #
4370 # On Solaris, ENETUNREACH is returned in this circumstance instead
4371 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4372 # expected errnos.
4373 expected_errnos = [ errno.ECONNREFUSED, ]
4374 if hasattr(errno, 'ENETUNREACH'):
4375 expected_errnos.append(errno.ENETUNREACH)
4376
4377 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004378
4379 def test_create_connection_timeout(self):
4380 # Issue #9792: create_connection() should not recast timeout errors
4381 # as generic socket errors.
4382 with self.mocked_socket_module():
4383 with self.assertRaises(socket.timeout):
4384 socket.create_connection((HOST, 1234))
4385
Guido van Rossumd8faa362007-04-27 19:54:29 +00004386
Victor Stinner45df8202010-04-28 22:31:17 +00004387@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004388class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4389
4390 def __init__(self, methodName='runTest'):
4391 SocketTCPTest.__init__(self, methodName=methodName)
4392 ThreadableTest.__init__(self)
4393
4394 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004395 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004396
4397 def clientTearDown(self):
4398 self.cli.close()
4399 self.cli = None
4400 ThreadableTest.clientTearDown(self)
4401
4402 def _justAccept(self):
4403 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004404 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004405
4406 testFamily = _justAccept
4407 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004408 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004409 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004410 self.assertEqual(self.cli.family, 2)
4411
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004412 testSourceAddress = _justAccept
4413 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004414 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4415 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004416 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004417 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004418 # The port number being used is sufficient to show that the bind()
4419 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004420
Guido van Rossumd8faa362007-04-27 19:54:29 +00004421 testTimeoutDefault = _justAccept
4422 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004423 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004424 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004425 socket.setdefaulttimeout(42)
4426 try:
4427 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004428 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004429 finally:
4430 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004431 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004432
4433 testTimeoutNone = _justAccept
4434 def _testTimeoutNone(self):
4435 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004436 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004437 socket.setdefaulttimeout(30)
4438 try:
4439 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004440 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004441 finally:
4442 socket.setdefaulttimeout(None)
4443 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004444
4445 testTimeoutValueNamed = _justAccept
4446 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004447 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004448 self.assertEqual(self.cli.gettimeout(), 30)
4449
4450 testTimeoutValueNonamed = _justAccept
4451 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004452 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004453 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004454 self.assertEqual(self.cli.gettimeout(), 30)
4455
Victor Stinner45df8202010-04-28 22:31:17 +00004456@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004457class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4458
4459 def __init__(self, methodName='runTest'):
4460 SocketTCPTest.__init__(self, methodName=methodName)
4461 ThreadableTest.__init__(self)
4462
4463 def clientSetUp(self):
4464 pass
4465
4466 def clientTearDown(self):
4467 self.cli.close()
4468 self.cli = None
4469 ThreadableTest.clientTearDown(self)
4470
4471 def testInsideTimeout(self):
4472 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004473 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004474 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004475 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004476 testOutsideTimeout = testInsideTimeout
4477
4478 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004479 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004480 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004481 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004482
4483 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004484 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004485 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004486
4487
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004488class TCPTimeoutTest(SocketTCPTest):
4489
4490 def testTCPTimeout(self):
4491 def raise_timeout(*args, **kwargs):
4492 self.serv.settimeout(1.0)
4493 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004494 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004495 "Error generating a timeout exception (TCP)")
4496
4497 def testTimeoutZero(self):
4498 ok = False
4499 try:
4500 self.serv.settimeout(0.0)
4501 foo = self.serv.accept()
4502 except socket.timeout:
4503 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004504 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004505 ok = True
4506 except:
4507 self.fail("caught unexpected exception (TCP)")
4508 if not ok:
4509 self.fail("accept() returned success when we did not expect it")
4510
Serhiy Storchaka43767632013-11-03 21:31:38 +02004511 @unittest.skipUnless(hasattr(signal, 'alarm'),
4512 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004513 def testInterruptedTimeout(self):
4514 # XXX I don't know how to do this test on MSWindows or any other
4515 # plaform that doesn't support signal.alarm() or os.kill(), though
4516 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004517 self.serv.settimeout(5.0) # must be longer than alarm
4518 class Alarm(Exception):
4519 pass
4520 def alarm_handler(signal, frame):
4521 raise Alarm
4522 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4523 try:
4524 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4525 try:
4526 foo = self.serv.accept()
4527 except socket.timeout:
4528 self.fail("caught timeout instead of Alarm")
4529 except Alarm:
4530 pass
4531 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004532 self.fail("caught other exception instead of Alarm:"
4533 " %s(%s):\n%s" %
4534 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004535 else:
4536 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004537 finally:
4538 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004539 except Alarm:
4540 self.fail("got Alarm in wrong place")
4541 finally:
4542 # no alarm can be pending. Safe to restore old handler.
4543 signal.signal(signal.SIGALRM, old_alarm)
4544
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004545class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004546
4547 def testUDPTimeout(self):
4548 def raise_timeout(*args, **kwargs):
4549 self.serv.settimeout(1.0)
4550 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004551 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004552 "Error generating a timeout exception (UDP)")
4553
4554 def testTimeoutZero(self):
4555 ok = False
4556 try:
4557 self.serv.settimeout(0.0)
4558 foo = self.serv.recv(1024)
4559 except socket.timeout:
4560 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004561 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004562 ok = True
4563 except:
4564 self.fail("caught unexpected exception (UDP)")
4565 if not ok:
4566 self.fail("recv() returned success when we did not expect it")
4567
4568class TestExceptions(unittest.TestCase):
4569
4570 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004571 self.assertTrue(issubclass(OSError, Exception))
4572 self.assertTrue(issubclass(socket.herror, OSError))
4573 self.assertTrue(issubclass(socket.gaierror, OSError))
4574 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004575
Yury Selivanovfa22b292016-10-18 16:03:52 -04004576 def test_setblocking_invalidfd(self):
4577 # Regression test for issue #28471
4578
4579 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4580 sock = socket.socket(
4581 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4582 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004583 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004584
4585 with self.assertRaises(OSError):
4586 sock.setblocking(False)
4587
4588
Serhiy Storchaka43767632013-11-03 21:31:38 +02004589@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004590class TestLinuxAbstractNamespace(unittest.TestCase):
4591
4592 UNIX_PATH_MAX = 108
4593
4594 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004595 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004596 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4597 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004598 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004599 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4600 s2.connect(s1.getsockname())
4601 with s1.accept()[0] as s3:
4602 self.assertEqual(s1.getsockname(), address)
4603 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004604
4605 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004606 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004607 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4608 s.bind(address)
4609 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004610
4611 def testNameOverflow(self):
4612 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004613 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004614 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004615
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004616 def testStrName(self):
4617 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004618 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4619 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004620 s.bind("\x00python\x00test\x00")
4621 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004622 finally:
4623 s.close()
4624
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004625 def testBytearrayName(self):
4626 # Check that an abstract name can be passed as a bytearray.
4627 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4628 s.bind(bytearray(b"\x00python\x00test\x00"))
4629 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4630
Serhiy Storchaka43767632013-11-03 21:31:38 +02004631@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004632class TestUnixDomain(unittest.TestCase):
4633
4634 def setUp(self):
4635 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4636
4637 def tearDown(self):
4638 self.sock.close()
4639
4640 def encoded(self, path):
4641 # Return the given path encoded in the file system encoding,
4642 # or skip the test if this is not possible.
4643 try:
4644 return os.fsencode(path)
4645 except UnicodeEncodeError:
4646 self.skipTest(
4647 "Pathname {0!a} cannot be represented in file "
4648 "system encoding {1!r}".format(
4649 path, sys.getfilesystemencoding()))
4650
Antoine Pitrou16374872011-12-16 15:04:12 +01004651 def bind(self, sock, path):
4652 # Bind the socket
4653 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004654 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004655 except OSError as e:
4656 if str(e) == "AF_UNIX path too long":
4657 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004658 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004659 .format(path))
4660 else:
4661 raise
4662
Antoine Pitrou0c2ff082017-05-03 00:14:29 +02004663 def testUnbound(self):
4664 # Issue #30205
4665 self.assertIn(self.sock.getsockname(), ('', None))
4666
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004667 def testStrAddr(self):
4668 # Test binding to and retrieving a normal string pathname.
4669 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004670 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004671 self.addCleanup(support.unlink, path)
4672 self.assertEqual(self.sock.getsockname(), path)
4673
4674 def testBytesAddr(self):
4675 # Test binding to a bytes pathname.
4676 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004677 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004678 self.addCleanup(support.unlink, path)
4679 self.assertEqual(self.sock.getsockname(), path)
4680
4681 def testSurrogateescapeBind(self):
4682 # Test binding to a valid non-ASCII pathname, with the
4683 # non-ASCII bytes supplied using surrogateescape encoding.
4684 path = os.path.abspath(support.TESTFN_UNICODE)
4685 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004686 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004687 self.addCleanup(support.unlink, path)
4688 self.assertEqual(self.sock.getsockname(), path)
4689
4690 def testUnencodableAddr(self):
4691 # Test binding to a pathname that cannot be encoded in the
4692 # file system encoding.
4693 if support.TESTFN_UNENCODABLE is None:
4694 self.skipTest("No unencodable filename available")
4695 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004696 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004697 self.addCleanup(support.unlink, path)
4698 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004699
Victor Stinner45df8202010-04-28 22:31:17 +00004700@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004701class BufferIOTest(SocketConnectedTest):
4702 """
4703 Test the buffer versions of socket.recv() and socket.send().
4704 """
4705 def __init__(self, methodName='runTest'):
4706 SocketConnectedTest.__init__(self, methodName=methodName)
4707
Antoine Pitrou25480782010-03-17 22:50:28 +00004708 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004709 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004710 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004711 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004712 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004713 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004714 self.assertEqual(msg, MSG)
4715
Antoine Pitrou25480782010-03-17 22:50:28 +00004716 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004717 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004718 self.serv_conn.send(buf)
4719
Antoine Pitrou25480782010-03-17 22:50:28 +00004720 def testRecvIntoBytearray(self):
4721 buf = bytearray(1024)
4722 nbytes = self.cli_conn.recv_into(buf)
4723 self.assertEqual(nbytes, len(MSG))
4724 msg = buf[:len(MSG)]
4725 self.assertEqual(msg, MSG)
4726
4727 _testRecvIntoBytearray = _testRecvIntoArray
4728
4729 def testRecvIntoMemoryview(self):
4730 buf = bytearray(1024)
4731 nbytes = self.cli_conn.recv_into(memoryview(buf))
4732 self.assertEqual(nbytes, len(MSG))
4733 msg = buf[:len(MSG)]
4734 self.assertEqual(msg, MSG)
4735
4736 _testRecvIntoMemoryview = _testRecvIntoArray
4737
4738 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004739 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004740 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004741 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004742 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004743 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004744 self.assertEqual(msg, MSG)
4745
Antoine Pitrou25480782010-03-17 22:50:28 +00004746 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004747 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004748 self.serv_conn.send(buf)
4749
Antoine Pitrou25480782010-03-17 22:50:28 +00004750 def testRecvFromIntoBytearray(self):
4751 buf = bytearray(1024)
4752 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4753 self.assertEqual(nbytes, len(MSG))
4754 msg = buf[:len(MSG)]
4755 self.assertEqual(msg, MSG)
4756
4757 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4758
4759 def testRecvFromIntoMemoryview(self):
4760 buf = bytearray(1024)
4761 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4762 self.assertEqual(nbytes, len(MSG))
4763 msg = buf[:len(MSG)]
4764 self.assertEqual(msg, MSG)
4765
4766 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4767
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004768 def testRecvFromIntoSmallBuffer(self):
4769 # See issue #20246.
4770 buf = bytearray(8)
4771 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4772
4773 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004774 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004775
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004776 def testRecvFromIntoEmptyBuffer(self):
4777 buf = bytearray()
4778 self.cli_conn.recvfrom_into(buf)
4779 self.cli_conn.recvfrom_into(buf, 0)
4780
4781 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4782
Christian Heimes043d6f62008-01-07 17:19:16 +00004783
4784TIPC_STYPE = 2000
4785TIPC_LOWER = 200
4786TIPC_UPPER = 210
4787
4788def isTipcAvailable():
4789 """Check if the TIPC module is loaded
4790
4791 The TIPC module is not loaded automatically on Ubuntu and probably
4792 other Linux distros.
4793 """
4794 if not hasattr(socket, "AF_TIPC"):
4795 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004796 try:
4797 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00004798 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00004799 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00004800 # have not the permission to read it.
4801 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004802 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00004803 for line in f:
4804 if line.startswith("tipc "):
4805 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004806 return False
4807
Serhiy Storchaka43767632013-11-03 21:31:38 +02004808@unittest.skipUnless(isTipcAvailable(),
4809 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004810class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004811 def testRDM(self):
4812 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4813 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004814 self.addCleanup(srv.close)
4815 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004816
4817 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4818 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4819 TIPC_LOWER, TIPC_UPPER)
4820 srv.bind(srvaddr)
4821
4822 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4823 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4824 cli.sendto(MSG, sendaddr)
4825
4826 msg, recvaddr = srv.recvfrom(1024)
4827
4828 self.assertEqual(cli.getsockname(), recvaddr)
4829 self.assertEqual(msg, MSG)
4830
4831
Serhiy Storchaka43767632013-11-03 21:31:38 +02004832@unittest.skipUnless(isTipcAvailable(),
4833 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004834class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004835 def __init__(self, methodName = 'runTest'):
4836 unittest.TestCase.__init__(self, methodName = methodName)
4837 ThreadableTest.__init__(self)
4838
4839 def setUp(self):
4840 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004841 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004842 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4843 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4844 TIPC_LOWER, TIPC_UPPER)
4845 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004846 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004847 self.serverExplicitReady()
4848 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004849 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004850
4851 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00004852 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00004853 # accept() call; sleep a little while to avoid it, otherwise
4854 # we could get an exception
4855 time.sleep(0.1)
4856 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004857 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004858 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4859 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4860 self.cli.connect(addr)
4861 self.cliaddr = self.cli.getsockname()
4862
4863 def testStream(self):
4864 msg = self.conn.recv(1024)
4865 self.assertEqual(msg, MSG)
4866 self.assertEqual(self.cliaddr, self.connaddr)
4867
4868 def _testStream(self):
4869 self.cli.send(MSG)
4870 self.cli.close()
4871
4872
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004873@unittest.skipUnless(thread, 'Threading required for this test.')
4874class ContextManagersTest(ThreadedTCPSocketTest):
4875
4876 def _testSocketClass(self):
4877 # base test
4878 with socket.socket() as sock:
4879 self.assertFalse(sock._closed)
4880 self.assertTrue(sock._closed)
4881 # close inside with block
4882 with socket.socket() as sock:
4883 sock.close()
4884 self.assertTrue(sock._closed)
4885 # exception inside with block
4886 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004887 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004888 self.assertTrue(sock._closed)
4889
4890 def testCreateConnectionBase(self):
4891 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004892 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004893 data = conn.recv(1024)
4894 conn.sendall(data)
4895
4896 def _testCreateConnectionBase(self):
4897 address = self.serv.getsockname()
4898 with socket.create_connection(address) as sock:
4899 self.assertFalse(sock._closed)
4900 sock.sendall(b'foo')
4901 self.assertEqual(sock.recv(1024), b'foo')
4902 self.assertTrue(sock._closed)
4903
4904 def testCreateConnectionClose(self):
4905 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004906 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004907 data = conn.recv(1024)
4908 conn.sendall(data)
4909
4910 def _testCreateConnectionClose(self):
4911 address = self.serv.getsockname()
4912 with socket.create_connection(address) as sock:
4913 sock.close()
4914 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004915 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004916
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004917
Victor Stinnerdaf45552013-08-28 00:53:59 +02004918class InheritanceTest(unittest.TestCase):
4919 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4920 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004921 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004922 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004923 with socket.socket(socket.AF_INET,
4924 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4925 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004926 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004927
4928 def test_default_inheritable(self):
4929 sock = socket.socket()
4930 with sock:
4931 self.assertEqual(sock.get_inheritable(), False)
4932
4933 def test_dup(self):
4934 sock = socket.socket()
4935 with sock:
4936 newsock = sock.dup()
4937 sock.close()
4938 with newsock:
4939 self.assertEqual(newsock.get_inheritable(), False)
4940
4941 def test_set_inheritable(self):
4942 sock = socket.socket()
4943 with sock:
4944 sock.set_inheritable(True)
4945 self.assertEqual(sock.get_inheritable(), True)
4946
4947 sock.set_inheritable(False)
4948 self.assertEqual(sock.get_inheritable(), False)
4949
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004950 @unittest.skipIf(fcntl is None, "need fcntl")
4951 def test_get_inheritable_cloexec(self):
4952 sock = socket.socket()
4953 with sock:
4954 fd = sock.fileno()
4955 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004956
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004957 # clear FD_CLOEXEC flag
4958 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4959 flags &= ~fcntl.FD_CLOEXEC
4960 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004961
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004962 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004963
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004964 @unittest.skipIf(fcntl is None, "need fcntl")
4965 def test_set_inheritable_cloexec(self):
4966 sock = socket.socket()
4967 with sock:
4968 fd = sock.fileno()
4969 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4970 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004971
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004972 sock.set_inheritable(True)
4973 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4974 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004975
4976
Victor Stinnerdaf45552013-08-28 00:53:59 +02004977 @unittest.skipUnless(hasattr(socket, "socketpair"),
4978 "need socket.socketpair()")
4979 def test_socketpair(self):
4980 s1, s2 = socket.socketpair()
4981 self.addCleanup(s1.close)
4982 self.addCleanup(s2.close)
4983 self.assertEqual(s1.get_inheritable(), False)
4984 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004985
4986
4987@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4988 "SOCK_NONBLOCK not defined")
4989class NonblockConstantTest(unittest.TestCase):
4990 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4991 if nonblock:
4992 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4993 self.assertEqual(s.gettimeout(), timeout)
4994 else:
4995 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4996 self.assertEqual(s.gettimeout(), None)
4997
Charles-François Natali239bb962011-06-03 12:55:15 +02004998 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004999 def test_SOCK_NONBLOCK(self):
5000 # a lot of it seems silly and redundant, but I wanted to test that
5001 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005002 with socket.socket(socket.AF_INET,
5003 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5004 self.checkNonblock(s)
5005 s.setblocking(1)
5006 self.checkNonblock(s, False)
5007 s.setblocking(0)
5008 self.checkNonblock(s)
5009 s.settimeout(None)
5010 self.checkNonblock(s, False)
5011 s.settimeout(2.0)
5012 self.checkNonblock(s, timeout=2.0)
5013 s.setblocking(1)
5014 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005015 # defaulttimeout
5016 t = socket.getdefaulttimeout()
5017 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005018 with socket.socket() as s:
5019 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005020 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005021 with socket.socket() as s:
5022 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005023 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005024 with socket.socket() as s:
5025 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005026 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005027 with socket.socket() as s:
5028 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005029 socket.setdefaulttimeout(t)
5030
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005031
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005032@unittest.skipUnless(os.name == "nt", "Windows specific")
5033@unittest.skipUnless(multiprocessing, "need multiprocessing")
5034class TestSocketSharing(SocketTCPTest):
5035 # This must be classmethod and not staticmethod or multiprocessing
5036 # won't be able to bootstrap it.
5037 @classmethod
5038 def remoteProcessServer(cls, q):
5039 # Recreate socket from shared data
5040 sdata = q.get()
5041 message = q.get()
5042
5043 s = socket.fromshare(sdata)
5044 s2, c = s.accept()
5045
5046 # Send the message
5047 s2.sendall(message)
5048 s2.close()
5049 s.close()
5050
5051 def testShare(self):
5052 # Transfer the listening server socket to another process
5053 # and service it from there.
5054
5055 # Create process:
5056 q = multiprocessing.Queue()
5057 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5058 p.start()
5059
5060 # Get the shared socket data
5061 data = self.serv.share(p.pid)
5062
5063 # Pass the shared socket to the other process
5064 addr = self.serv.getsockname()
5065 self.serv.close()
5066 q.put(data)
5067
5068 # The data that the server will send us
5069 message = b"slapmahfro"
5070 q.put(message)
5071
5072 # Connect
5073 s = socket.create_connection(addr)
5074 # listen for the data
5075 m = []
5076 while True:
5077 data = s.recv(100)
5078 if not data:
5079 break
5080 m.append(data)
5081 s.close()
5082 received = b"".join(m)
5083 self.assertEqual(received, message)
5084 p.join()
5085
5086 def testShareLength(self):
5087 data = self.serv.share(os.getpid())
5088 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5089 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5090
5091 def compareSockets(self, org, other):
5092 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005093 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005094 self.assertEqual(org.gettimeout(), None)
5095 self.assertEqual(org.gettimeout(), other.gettimeout())
5096
5097 self.assertEqual(org.family, other.family)
5098 self.assertEqual(org.type, other.type)
5099 # If the user specified "0" for proto, then
5100 # internally windows will have picked the correct value.
5101 # Python introspection on the socket however will still return
5102 # 0. For the shared socket, the python value is recreated
5103 # from the actual value, so it may not compare correctly.
5104 if org.proto != 0:
5105 self.assertEqual(org.proto, other.proto)
5106
5107 def testShareLocal(self):
5108 data = self.serv.share(os.getpid())
5109 s = socket.fromshare(data)
5110 try:
5111 self.compareSockets(self.serv, s)
5112 finally:
5113 s.close()
5114
5115 def testTypes(self):
5116 families = [socket.AF_INET, socket.AF_INET6]
5117 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5118 for f in families:
5119 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005120 try:
5121 source = socket.socket(f, t)
5122 except OSError:
5123 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005124 try:
5125 data = source.share(os.getpid())
5126 shared = socket.fromshare(data)
5127 try:
5128 self.compareSockets(source, shared)
5129 finally:
5130 shared.close()
5131 finally:
5132 source.close()
5133
5134
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005135@unittest.skipUnless(thread, 'Threading required for this test.')
5136class SendfileUsingSendTest(ThreadedTCPSocketTest):
5137 """
5138 Test the send() implementation of socket.sendfile().
5139 """
5140
5141 FILESIZE = (10 * 1024 * 1024) # 10MB
5142 BUFSIZE = 8192
5143 FILEDATA = b""
5144 TIMEOUT = 2
5145
5146 @classmethod
5147 def setUpClass(cls):
5148 def chunks(total, step):
5149 assert total >= step
5150 while total > step:
5151 yield step
5152 total -= step
5153 if total:
5154 yield total
5155
5156 chunk = b"".join([random.choice(string.ascii_letters).encode()
5157 for i in range(cls.BUFSIZE)])
5158 with open(support.TESTFN, 'wb') as f:
5159 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5160 f.write(chunk)
5161 with open(support.TESTFN, 'rb') as f:
5162 cls.FILEDATA = f.read()
5163 assert len(cls.FILEDATA) == cls.FILESIZE
5164
5165 @classmethod
5166 def tearDownClass(cls):
5167 support.unlink(support.TESTFN)
5168
5169 def accept_conn(self):
5170 self.serv.settimeout(self.TIMEOUT)
5171 conn, addr = self.serv.accept()
5172 conn.settimeout(self.TIMEOUT)
5173 self.addCleanup(conn.close)
5174 return conn
5175
5176 def recv_data(self, conn):
5177 received = []
5178 while True:
5179 chunk = conn.recv(self.BUFSIZE)
5180 if not chunk:
5181 break
5182 received.append(chunk)
5183 return b''.join(received)
5184
5185 def meth_from_sock(self, sock):
5186 # Depending on the mixin class being run return either send()
5187 # or sendfile() method implementation.
5188 return getattr(sock, "_sendfile_use_send")
5189
5190 # regular file
5191
5192 def _testRegularFile(self):
5193 address = self.serv.getsockname()
5194 file = open(support.TESTFN, 'rb')
5195 with socket.create_connection(address) as sock, file as file:
5196 meth = self.meth_from_sock(sock)
5197 sent = meth(file)
5198 self.assertEqual(sent, self.FILESIZE)
5199 self.assertEqual(file.tell(), self.FILESIZE)
5200
5201 def testRegularFile(self):
5202 conn = self.accept_conn()
5203 data = self.recv_data(conn)
5204 self.assertEqual(len(data), self.FILESIZE)
5205 self.assertEqual(data, self.FILEDATA)
5206
5207 # non regular file
5208
5209 def _testNonRegularFile(self):
5210 address = self.serv.getsockname()
5211 file = io.BytesIO(self.FILEDATA)
5212 with socket.create_connection(address) as sock, file as file:
5213 sent = sock.sendfile(file)
5214 self.assertEqual(sent, self.FILESIZE)
5215 self.assertEqual(file.tell(), self.FILESIZE)
5216 self.assertRaises(socket._GiveupOnSendfile,
5217 sock._sendfile_use_sendfile, file)
5218
5219 def testNonRegularFile(self):
5220 conn = self.accept_conn()
5221 data = self.recv_data(conn)
5222 self.assertEqual(len(data), self.FILESIZE)
5223 self.assertEqual(data, self.FILEDATA)
5224
5225 # empty file
5226
5227 def _testEmptyFileSend(self):
5228 address = self.serv.getsockname()
5229 filename = support.TESTFN + "2"
5230 with open(filename, 'wb'):
5231 self.addCleanup(support.unlink, filename)
5232 file = open(filename, 'rb')
5233 with socket.create_connection(address) as sock, file as file:
5234 meth = self.meth_from_sock(sock)
5235 sent = meth(file)
5236 self.assertEqual(sent, 0)
5237 self.assertEqual(file.tell(), 0)
5238
5239 def testEmptyFileSend(self):
5240 conn = self.accept_conn()
5241 data = self.recv_data(conn)
5242 self.assertEqual(data, b"")
5243
5244 # offset
5245
5246 def _testOffset(self):
5247 address = self.serv.getsockname()
5248 file = open(support.TESTFN, 'rb')
5249 with socket.create_connection(address) as sock, file as file:
5250 meth = self.meth_from_sock(sock)
5251 sent = meth(file, offset=5000)
5252 self.assertEqual(sent, self.FILESIZE - 5000)
5253 self.assertEqual(file.tell(), self.FILESIZE)
5254
5255 def testOffset(self):
5256 conn = self.accept_conn()
5257 data = self.recv_data(conn)
5258 self.assertEqual(len(data), self.FILESIZE - 5000)
5259 self.assertEqual(data, self.FILEDATA[5000:])
5260
5261 # count
5262
5263 def _testCount(self):
5264 address = self.serv.getsockname()
5265 file = open(support.TESTFN, 'rb')
5266 with socket.create_connection(address, timeout=2) as sock, file as file:
5267 count = 5000007
5268 meth = self.meth_from_sock(sock)
5269 sent = meth(file, count=count)
5270 self.assertEqual(sent, count)
5271 self.assertEqual(file.tell(), count)
5272
5273 def testCount(self):
5274 count = 5000007
5275 conn = self.accept_conn()
5276 data = self.recv_data(conn)
5277 self.assertEqual(len(data), count)
5278 self.assertEqual(data, self.FILEDATA[:count])
5279
5280 # count small
5281
5282 def _testCountSmall(self):
5283 address = self.serv.getsockname()
5284 file = open(support.TESTFN, 'rb')
5285 with socket.create_connection(address, timeout=2) as sock, file as file:
5286 count = 1
5287 meth = self.meth_from_sock(sock)
5288 sent = meth(file, count=count)
5289 self.assertEqual(sent, count)
5290 self.assertEqual(file.tell(), count)
5291
5292 def testCountSmall(self):
5293 count = 1
5294 conn = self.accept_conn()
5295 data = self.recv_data(conn)
5296 self.assertEqual(len(data), count)
5297 self.assertEqual(data, self.FILEDATA[:count])
5298
5299 # count + offset
5300
5301 def _testCountWithOffset(self):
5302 address = self.serv.getsockname()
5303 file = open(support.TESTFN, 'rb')
5304 with socket.create_connection(address, timeout=2) as sock, file as file:
5305 count = 100007
5306 meth = self.meth_from_sock(sock)
5307 sent = meth(file, offset=2007, count=count)
5308 self.assertEqual(sent, count)
5309 self.assertEqual(file.tell(), count + 2007)
5310
5311 def testCountWithOffset(self):
5312 count = 100007
5313 conn = self.accept_conn()
5314 data = self.recv_data(conn)
5315 self.assertEqual(len(data), count)
5316 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5317
5318 # non blocking sockets are not supposed to work
5319
5320 def _testNonBlocking(self):
5321 address = self.serv.getsockname()
5322 file = open(support.TESTFN, 'rb')
5323 with socket.create_connection(address) as sock, file as file:
5324 sock.setblocking(False)
5325 meth = self.meth_from_sock(sock)
5326 self.assertRaises(ValueError, meth, file)
5327 self.assertRaises(ValueError, sock.sendfile, file)
5328
5329 def testNonBlocking(self):
5330 conn = self.accept_conn()
5331 if conn.recv(8192):
5332 self.fail('was not supposed to receive any data')
5333
5334 # timeout (non-triggered)
5335
5336 def _testWithTimeout(self):
5337 address = self.serv.getsockname()
5338 file = open(support.TESTFN, 'rb')
5339 with socket.create_connection(address, timeout=2) as sock, file as file:
5340 meth = self.meth_from_sock(sock)
5341 sent = meth(file)
5342 self.assertEqual(sent, self.FILESIZE)
5343
5344 def testWithTimeout(self):
5345 conn = self.accept_conn()
5346 data = self.recv_data(conn)
5347 self.assertEqual(len(data), self.FILESIZE)
5348 self.assertEqual(data, self.FILEDATA)
5349
5350 # timeout (triggered)
5351
5352 def _testWithTimeoutTriggeredSend(self):
5353 address = self.serv.getsockname()
5354 file = open(support.TESTFN, 'rb')
5355 with socket.create_connection(address, timeout=0.01) as sock, \
5356 file as file:
5357 meth = self.meth_from_sock(sock)
5358 self.assertRaises(socket.timeout, meth, file)
5359
5360 def testWithTimeoutTriggeredSend(self):
5361 conn = self.accept_conn()
5362 conn.recv(88192)
5363
5364 # errors
5365
5366 def _test_errors(self):
5367 pass
5368
5369 def test_errors(self):
5370 with open(support.TESTFN, 'rb') as file:
5371 with socket.socket(type=socket.SOCK_DGRAM) as s:
5372 meth = self.meth_from_sock(s)
5373 self.assertRaisesRegex(
5374 ValueError, "SOCK_STREAM", meth, file)
5375 with open(support.TESTFN, 'rt') as file:
5376 with socket.socket() as s:
5377 meth = self.meth_from_sock(s)
5378 self.assertRaisesRegex(
5379 ValueError, "binary mode", meth, file)
5380 with open(support.TESTFN, 'rb') as file:
5381 with socket.socket() as s:
5382 meth = self.meth_from_sock(s)
5383 self.assertRaisesRegex(TypeError, "positive integer",
5384 meth, file, count='2')
5385 self.assertRaisesRegex(TypeError, "positive integer",
5386 meth, file, count=0.1)
5387 self.assertRaisesRegex(ValueError, "positive integer",
5388 meth, file, count=0)
5389 self.assertRaisesRegex(ValueError, "positive integer",
5390 meth, file, count=-1)
5391
5392
5393@unittest.skipUnless(thread, 'Threading required for this test.')
5394@unittest.skipUnless(hasattr(os, "sendfile"),
5395 'os.sendfile() required for this test.')
5396class SendfileUsingSendfileTest(SendfileUsingSendTest):
5397 """
5398 Test the sendfile() implementation of socket.sendfile().
5399 """
5400 def meth_from_sock(self, sock):
5401 return getattr(sock, "_sendfile_use_sendfile")
5402
Christian Heimes48371412016-09-06 00:37:46 +02005403
5404@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005405class LinuxKernelCryptoAPI(unittest.TestCase):
5406 # tests for AF_ALG
5407 def create_alg(self, typ, name):
5408 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005409 try:
5410 sock.bind((typ, name))
5411 except FileNotFoundError as e:
5412 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005413 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005414 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005415 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005416 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005417
5418 def test_sha256(self):
5419 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5420 "177a9cb410ff61f20015ad")
5421 with self.create_alg('hash', 'sha256') as algo:
5422 op, _ = algo.accept()
5423 with op:
5424 op.sendall(b"abc")
5425 self.assertEqual(op.recv(512), expected)
5426
5427 op, _ = algo.accept()
5428 with op:
5429 op.send(b'a', socket.MSG_MORE)
5430 op.send(b'b', socket.MSG_MORE)
5431 op.send(b'c', socket.MSG_MORE)
5432 op.send(b'')
5433 self.assertEqual(op.recv(512), expected)
5434
5435 def test_hmac_sha1(self):
5436 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5437 with self.create_alg('hash', 'hmac(sha1)') as algo:
5438 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5439 op, _ = algo.accept()
5440 with op:
5441 op.sendall(b"what do ya want for nothing?")
5442 self.assertEqual(op.recv(512), expected)
5443
Christian Heimese084f842016-09-11 20:11:30 +02005444 # Although it should work with 3.19 and newer the test blocks on
5445 # Ubuntu 15.10 with Kernel 4.2.0-19.
5446 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005447 def test_aes_cbc(self):
5448 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5449 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5450 msg = b"Single block msg"
5451 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5452 msglen = len(msg)
5453 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5454 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5455 op, _ = algo.accept()
5456 with op:
5457 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5458 flags=socket.MSG_MORE)
5459 op.sendall(msg)
5460 self.assertEqual(op.recv(msglen), ciphertext)
5461
5462 op, _ = algo.accept()
5463 with op:
5464 op.sendmsg_afalg([ciphertext],
5465 op=socket.ALG_OP_DECRYPT, iv=iv)
5466 self.assertEqual(op.recv(msglen), msg)
5467
5468 # long message
5469 multiplier = 1024
5470 longmsg = [msg] * multiplier
5471 op, _ = algo.accept()
5472 with op:
5473 op.sendmsg_afalg(longmsg,
5474 op=socket.ALG_OP_ENCRYPT, iv=iv)
5475 enc = op.recv(msglen * multiplier)
5476 self.assertEqual(len(enc), msglen * multiplier)
5477 self.assertTrue(enc[:msglen], ciphertext)
5478
5479 op, _ = algo.accept()
5480 with op:
5481 op.sendmsg_afalg([enc],
5482 op=socket.ALG_OP_DECRYPT, iv=iv)
5483 dec = op.recv(msglen * multiplier)
5484 self.assertEqual(len(dec), msglen * multiplier)
5485 self.assertEqual(dec, msg * multiplier)
5486
Mariatta4ac01f02017-03-16 20:58:42 -07005487 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005488 def test_aead_aes_gcm(self):
5489 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5490 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5491 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5492 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5493 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5494 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5495
5496 taglen = len(expected_tag)
5497 assoclen = len(assoc)
5498
5499 with self.create_alg('aead', 'gcm(aes)') as algo:
5500 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5501 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5502 None, taglen)
5503
5504 # send assoc, plain and tag buffer in separate steps
5505 op, _ = algo.accept()
5506 with op:
5507 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5508 assoclen=assoclen, flags=socket.MSG_MORE)
5509 op.sendall(assoc, socket.MSG_MORE)
Mariatta4ac01f02017-03-16 20:58:42 -07005510 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005511 res = op.recv(assoclen + len(plain) + taglen)
5512 self.assertEqual(expected_ct, res[assoclen:-taglen])
5513 self.assertEqual(expected_tag, res[-taglen:])
5514
5515 # now with msg
5516 op, _ = algo.accept()
5517 with op:
Mariatta4ac01f02017-03-16 20:58:42 -07005518 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005519 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5520 assoclen=assoclen)
5521 res = op.recv(assoclen + len(plain) + taglen)
5522 self.assertEqual(expected_ct, res[assoclen:-taglen])
5523 self.assertEqual(expected_tag, res[-taglen:])
5524
5525 # create anc data manually
5526 pack_uint32 = struct.Struct('I').pack
5527 op, _ = algo.accept()
5528 with op:
Mariatta4ac01f02017-03-16 20:58:42 -07005529 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005530 op.sendmsg(
5531 [msg],
5532 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5533 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5534 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5535 )
5536 )
Mariatta4ac01f02017-03-16 20:58:42 -07005537 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005538 self.assertEqual(expected_ct, res[assoclen:-taglen])
5539 self.assertEqual(expected_tag, res[-taglen:])
5540
5541 # decrypt and verify
5542 op, _ = algo.accept()
5543 with op:
5544 msg = assoc + expected_ct + expected_tag
5545 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5546 assoclen=assoclen)
Mariatta4ac01f02017-03-16 20:58:42 -07005547 res = op.recv(len(msg) - taglen)
5548 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005549
Christian Heimese084f842016-09-11 20:11:30 +02005550 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005551 def test_drbg_pr_sha256(self):
5552 # deterministic random bit generator, prediction resistance, sha256
5553 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5554 extra_seed = os.urandom(32)
5555 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5556 op, _ = algo.accept()
5557 with op:
5558 rn = op.recv(32)
5559 self.assertEqual(len(rn), 32)
5560
5561 def test_sendmsg_afalg_args(self):
5562 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005563 with sock:
5564 with self.assertRaises(TypeError):
5565 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005566
Christian Heimes02b30352016-09-11 19:49:56 +02005567 with self.assertRaises(TypeError):
5568 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005569
Christian Heimes02b30352016-09-11 19:49:56 +02005570 with self.assertRaises(TypeError):
5571 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005572
Christian Heimes02b30352016-09-11 19:49:56 +02005573 with self.assertRaises(TypeError):
5574 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005575
Christian Heimes02b30352016-09-11 19:49:56 +02005576 with self.assertRaises(TypeError):
5577 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5578
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005579
Guido van Rossumb995eb72002-07-31 16:08:40 +00005580def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005581 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005582 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005583
5584 tests.extend([
5585 NonBlockingTCPTests,
5586 FileObjectClassTestCase,
5587 UnbufferedFileObjectClassTestCase,
5588 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005589 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005590 UnicodeReadFileObjectClassTestCase,
5591 UnicodeWriteFileObjectClassTestCase,
5592 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005593 NetworkConnectionNoServer,
5594 NetworkConnectionAttributesTest,
5595 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005596 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005597 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005598 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005599 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005600 tests.append(BasicSocketPairTest)
5601 tests.append(TestUnixDomain)
5602 tests.append(TestLinuxAbstractNamespace)
5603 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005604 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005605 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005606 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005607 tests.extend([
5608 CmsgMacroTests,
5609 SendmsgUDPTest,
5610 RecvmsgUDPTest,
5611 RecvmsgIntoUDPTest,
5612 SendmsgUDP6Test,
5613 RecvmsgUDP6Test,
5614 RecvmsgRFC3542AncillaryUDP6Test,
5615 RecvmsgIntoRFC3542AncillaryUDP6Test,
5616 RecvmsgIntoUDP6Test,
5617 SendmsgTCPTest,
5618 RecvmsgTCPTest,
5619 RecvmsgIntoTCPTest,
5620 SendmsgSCTPStreamTest,
5621 RecvmsgSCTPStreamTest,
5622 RecvmsgIntoSCTPStreamTest,
5623 SendmsgUnixStreamTest,
5624 RecvmsgUnixStreamTest,
5625 RecvmsgIntoUnixStreamTest,
5626 RecvmsgSCMRightsStreamTest,
5627 RecvmsgIntoSCMRightsStreamTest,
5628 # These are slow when setitimer() is not available
5629 InterruptedRecvTimeoutTest,
5630 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005631 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005632 SendfileUsingSendTest,
5633 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005634 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005635
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005636 thread_info = support.threading_setup()
5637 support.run_unittest(*tests)
5638 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005639
5640if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005641 test_main()