blob: f28f7d6816e925315ae02f581faee3d882891feb [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 Zhangd36a7162017-03-07 11:06:09 +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 Storchaka24c738a2017-03-19 20:20:10 +0200909 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +0000910 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300911 import _testcapi
912 s_good_values = [0, 1, 2, 0xffff]
913 l_good_values = s_good_values + [0xffffffff]
914 l_bad_values = [-1, -2, 1<<32, 1<<1000]
915 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
916 _testcapi.INT_MAX + 1]
917 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
918 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000919 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000920 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300921 for k in l_good_values:
922 socket.ntohl(k)
923 socket.htonl(k)
924 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000925 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000926 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300927 for k in l_bad_values:
928 self.assertRaises(OverflowError, socket.ntohl, k)
929 self.assertRaises(OverflowError, socket.htonl, k)
930 for k in s_deprecated_values:
931 self.assertWarns(DeprecationWarning, socket.ntohs, k)
932 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000933
Barry Warsaw11b91a02004-06-28 00:50:43 +0000934 def testGetServBy(self):
935 eq = self.assertEqual
936 # Find one service that exists, then check all the related interfaces.
937 # I've ordered this by protocols that have both a tcp and udp
938 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200939 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200940 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000941 # avoid the 'echo' service on this platform, as there is an
942 # assumption breaking non-standard port/protocol entry
943 services = ('daytime', 'qotd', 'domain')
944 else:
945 services = ('echo', 'daytime', 'domain')
946 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000947 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000948 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000949 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200950 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000951 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000952 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200953 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000954 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +0100955 # Issue #26936: Android getservbyname() was broken before API 23.
956 if (not hasattr(sys, 'getandroidapilevel') or
957 sys.getandroidapilevel() >= 23):
958 port2 = socket.getservbyname(service)
959 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400960 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000961 try:
962 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200963 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000964 udpport = None
965 else:
966 eq(udpport, port)
967 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +0100968 # Issue #26936: Android getservbyport() is broken.
969 if not support.is_android:
970 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +0000971 eq(socket.getservbyport(port, 'tcp'), service)
972 if udpport is not None:
973 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000974 # Make sure getservbyport does not accept out of range ports.
975 self.assertRaises(OverflowError, socket.getservbyport, -1)
976 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000977
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000978 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000979 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000980 # The default timeout should initially be None
981 self.assertEqual(socket.getdefaulttimeout(), None)
982 s = socket.socket()
983 self.assertEqual(s.gettimeout(), None)
984 s.close()
985
986 # Set the default timeout to 10, and see if it propagates
987 socket.setdefaulttimeout(10)
988 self.assertEqual(socket.getdefaulttimeout(), 10)
989 s = socket.socket()
990 self.assertEqual(s.gettimeout(), 10)
991 s.close()
992
993 # Reset the default timeout to None, and see if it propagates
994 socket.setdefaulttimeout(None)
995 self.assertEqual(socket.getdefaulttimeout(), None)
996 s = socket.socket()
997 self.assertEqual(s.gettimeout(), None)
998 s.close()
999
1000 # Check that setting it to an invalid value raises ValueError
1001 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1002
1003 # Check that setting it to an invalid type raises TypeError
1004 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1005
Serhiy Storchaka43767632013-11-03 21:31:38 +02001006 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1007 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001008 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001009 # Test that issue1008086 and issue767150 are fixed.
1010 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001011 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1012 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001013
Serhiy Storchaka43767632013-11-03 21:31:38 +02001014 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1015 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001016 def testIPv4toString(self):
1017 from socket import inet_aton as f, inet_pton, AF_INET
1018 g = lambda a: inet_pton(AF_INET, a)
1019
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001020 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001021 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001022 )
1023
Ezio Melottib3aedd42010-11-20 19:04:17 +00001024 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1025 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1026 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1027 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1028 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001029 # bpo-29972: inet_pton() doesn't fail on AIX
1030 if not sys.platform.startswith('aix'):
1031 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001032 assertInvalid(f, '300.0.0.0')
1033 assertInvalid(f, 'a.0.0.0')
1034 assertInvalid(f, '1.2.3.4.5')
1035 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001036
Ezio Melottib3aedd42010-11-20 19:04:17 +00001037 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1038 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1039 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1040 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001041 assertInvalid(g, '0.0.0.')
1042 assertInvalid(g, '300.0.0.0')
1043 assertInvalid(g, 'a.0.0.0')
1044 assertInvalid(g, '1.2.3.4.5')
1045 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001046
Serhiy Storchaka43767632013-11-03 21:31:38 +02001047 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1048 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001049 def testIPv6toString(self):
1050 try:
1051 from socket import inet_pton, AF_INET6, has_ipv6
1052 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001053 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001054 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001055 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001056
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001057 if sys.platform == "win32":
1058 try:
1059 inet_pton(AF_INET6, '::')
1060 except OSError as e:
1061 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001062 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001063
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001064 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001065 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001066 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001067 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001068
Ezio Melottib3aedd42010-11-20 19:04:17 +00001069 self.assertEqual(b'\x00' * 16, f('::'))
1070 self.assertEqual(b'\x00' * 16, f('0::0'))
1071 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1072 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001073 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 +00001074 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1075 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001076 self.assertEqual(
1077 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1078 f('ad42:abc::127:0:254:2')
1079 )
1080 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1081 assertInvalid('0x20::')
1082 assertInvalid(':::')
1083 assertInvalid('::0::')
1084 assertInvalid('1::abc::')
1085 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001086 assertInvalid('1:2:3:4:5:6')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001087 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001088 # bpo-29972: inet_pton() doesn't fail on AIX
1089 if not sys.platform.startswith('aix'):
1090 assertInvalid('1:2:3:4:5:6:')
1091 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001092
1093 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1094 f('::254.42.23.64')
1095 )
1096 self.assertEqual(
1097 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1098 f('42::a29b:254.42.23.64')
1099 )
1100 self.assertEqual(
1101 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1102 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1103 )
1104 assertInvalid('255.254.253.252')
1105 assertInvalid('1::260.2.3.0')
1106 assertInvalid('1::0.be.e.0')
1107 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1108 assertInvalid('::1.2.3.4:0')
1109 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001110
Serhiy Storchaka43767632013-11-03 21:31:38 +02001111 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1112 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001113 def testStringToIPv4(self):
1114 from socket import inet_ntoa as f, inet_ntop, AF_INET
1115 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001116 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001117 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001118 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001119
Ezio Melottib3aedd42010-11-20 19:04:17 +00001120 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1121 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1122 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1123 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001124 assertInvalid(f, b'\x00' * 3)
1125 assertInvalid(f, b'\x00' * 5)
1126 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001127 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001128
Ezio Melottib3aedd42010-11-20 19:04:17 +00001129 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1130 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1131 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001132 assertInvalid(g, b'\x00' * 3)
1133 assertInvalid(g, b'\x00' * 5)
1134 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001135 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001136
Serhiy Storchaka43767632013-11-03 21:31:38 +02001137 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1138 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001139 def testStringToIPv6(self):
1140 try:
1141 from socket import inet_ntop, AF_INET6, has_ipv6
1142 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001143 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001144 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001145 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001146
1147 if sys.platform == "win32":
1148 try:
1149 inet_ntop(AF_INET6, b'\x00' * 16)
1150 except OSError as e:
1151 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001152 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001153
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001154 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001155 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001156 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001157 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001158
Ezio Melottib3aedd42010-11-20 19:04:17 +00001159 self.assertEqual('::', f(b'\x00' * 16))
1160 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1161 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001162 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001163 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 +00001164 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001165 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001166
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001167 assertInvalid(b'\x12' * 15)
1168 assertInvalid(b'\x12' * 17)
1169 assertInvalid(b'\x12' * 4)
1170
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001171 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001172
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001173 def testSockName(self):
1174 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001175 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001176 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001177 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001178 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001179 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001180 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1181 # it reasonable to get the host's addr in addition to 0.0.0.0.
1182 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001183 try:
1184 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001185 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001186 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001187 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001188 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001189 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001190
1191 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001192 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001193 # We know a socket should start without reuse==0
1194 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001195 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001196 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001197 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001198
1199 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001200 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001201 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001202 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001203 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1204 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001205 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001206
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001207 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001208 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001209 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1210 sock.settimeout(1)
1211 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001212 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001213
Martin Panter50ab1a32016-04-11 00:38:12 +00001214 def testCloseException(self):
1215 sock = socket.socket()
1216 socket.socket(fileno=sock.fileno()).close()
1217 try:
1218 sock.close()
1219 except OSError as err:
1220 # Winsock apparently raises ENOTSOCK
1221 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1222 else:
1223 self.fail("close() should raise EBADF/ENOTSOCK")
1224
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001225 def testNewAttributes(self):
1226 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001227
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001228 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1229 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001230 if hasattr(socket, 'SOCK_CLOEXEC'):
1231 self.assertIn(sock.type,
1232 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1233 socket.SOCK_STREAM))
1234 else:
1235 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001236 self.assertEqual(sock.proto, 0)
1237 sock.close()
1238
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001239 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001240 sock = socket.socket()
1241 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001242 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001243 big_port = port + 65536
1244 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001245 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1246 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1247 # Since find_unused_port() is inherently subject to race conditions, we
1248 # call it a couple times if necessary.
1249 for i in itertools.count():
1250 port = support.find_unused_port()
1251 try:
1252 sock.bind((HOST, port))
1253 except OSError as e:
1254 if e.errno != errno.EADDRINUSE or i == 5:
1255 raise
1256 else:
1257 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001258
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001259 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001260 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001261 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1262 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1263 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1264 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001265 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1266 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001267 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001268 self.assertRaises(ValueError, s.ioctl, -1, None)
1269 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001270
Steve Dowerea93ac02016-06-17 12:52:18 -07001271 @unittest.skipUnless(os.name == "nt", "Windows specific")
1272 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1273 'Loopback fast path support required for this test')
1274 def test_sio_loopback_fast_path(self):
1275 s = socket.socket()
1276 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001277 try:
1278 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1279 except OSError as exc:
1280 WSAEOPNOTSUPP = 10045
1281 if exc.winerror == WSAEOPNOTSUPP:
1282 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1283 "doesn't implemented in this Windows version")
1284 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001285 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1286
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001287 def testGetaddrinfo(self):
1288 try:
1289 socket.getaddrinfo('localhost', 80)
1290 except socket.gaierror as err:
1291 if err.errno == socket.EAI_SERVICE:
1292 # see http://bugs.python.org/issue1282647
1293 self.skipTest("buggy libc version")
1294 raise
1295 # len of every sequence is supposed to be == 5
1296 for info in socket.getaddrinfo(HOST, None):
1297 self.assertEqual(len(info), 5)
1298 # host can be a domain name, a string representation of an
1299 # IPv4/v6 address or None
1300 socket.getaddrinfo('localhost', 80)
1301 socket.getaddrinfo('127.0.0.1', 80)
1302 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001303 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001304 socket.getaddrinfo('::1', 80)
1305 # port can be a string service name such as "http", a numeric
1306 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001307 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1308 if (not hasattr(sys, 'getandroidapilevel') or
1309 sys.getandroidapilevel() >= 23):
1310 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001311 socket.getaddrinfo(HOST, 80)
1312 socket.getaddrinfo(HOST, None)
1313 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001314 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1315 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001316 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001317 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1318 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001319 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001320 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1321 for _, socktype, _, _, _ in infos:
1322 self.assertEqual(socktype, socket.SOCK_STREAM)
1323 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001324 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001325 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1326 # a server willing to support both IPv4 and IPv6 will
1327 # usually do this
1328 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1329 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001330 # test keyword arguments
1331 a = socket.getaddrinfo(HOST, None)
1332 b = socket.getaddrinfo(host=HOST, port=None)
1333 self.assertEqual(a, b)
1334 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1335 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1336 self.assertEqual(a, b)
1337 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1338 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1339 self.assertEqual(a, b)
1340 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1341 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1342 self.assertEqual(a, b)
1343 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1344 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1345 self.assertEqual(a, b)
1346 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1347 socket.AI_PASSIVE)
1348 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1349 type=socket.SOCK_STREAM, proto=0,
1350 flags=socket.AI_PASSIVE)
1351 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001352 # Issue #6697.
1353 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001354
Ned Deilyb24f4812014-02-13 22:50:42 -08001355 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001356 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001357 try:
1358 # The arguments here are undefined and the call may succeed
1359 # or fail. All we care here is that it doesn't segfault.
1360 socket.getaddrinfo("localhost", None, 0, 0, 0,
1361 socket.AI_NUMERICSERV)
1362 except socket.gaierror:
1363 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001364
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001365 def test_getnameinfo(self):
1366 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001367 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001368
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001369 @unittest.skipUnless(support.is_resource_enabled('network'),
1370 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001371 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001372 # Check for internet access before running test
1373 # (issue #12804, issue #25138).
1374 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001375 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001376
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001377 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001378 domain = 'испытание.pythontest.net'
1379 socket.gethostbyname(domain)
1380 socket.gethostbyname_ex(domain)
1381 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001382 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1383 # have a reverse entry yet
1384 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001385
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001386 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001387 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001388 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1389 self.skipTest("signal.alarm and socket.socketpair required for this test")
1390 # Our signal handlers clobber the C errno by calling a math function
1391 # with an invalid domain value.
1392 def ok_handler(*args):
1393 self.assertRaises(ValueError, math.acosh, 0)
1394 def raising_handler(*args):
1395 self.assertRaises(ValueError, math.acosh, 0)
1396 1 // 0
1397 c, s = socket.socketpair()
1398 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1399 try:
1400 if with_timeout:
1401 # Just above the one second minimum for signal.alarm
1402 c.settimeout(1.5)
1403 with self.assertRaises(ZeroDivisionError):
1404 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001405 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001406 if with_timeout:
1407 signal.signal(signal.SIGALRM, ok_handler)
1408 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001409 self.assertRaises(socket.timeout, c.sendall,
1410 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001411 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001412 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001413 signal.signal(signal.SIGALRM, old_alarm)
1414 c.close()
1415 s.close()
1416
1417 def test_sendall_interrupted(self):
1418 self.check_sendall_interrupted(False)
1419
1420 def test_sendall_interrupted_with_timeout(self):
1421 self.check_sendall_interrupted(True)
1422
Antoine Pitroue033e062010-10-29 10:38:18 +00001423 def test_dealloc_warn(self):
1424 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1425 r = repr(sock)
1426 with self.assertWarns(ResourceWarning) as cm:
1427 sock = None
1428 support.gc_collect()
1429 self.assertIn(r, str(cm.warning.args[0]))
1430 # An open socket file object gets dereferenced after the socket
1431 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1432 f = sock.makefile('rb')
1433 r = repr(sock)
1434 sock = None
1435 support.gc_collect()
1436 with self.assertWarns(ResourceWarning):
1437 f = None
1438 support.gc_collect()
1439
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001440 def test_name_closed_socketio(self):
1441 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1442 fp = sock.makefile("rb")
1443 fp.close()
1444 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1445
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001446 def test_unusable_closed_socketio(self):
1447 with socket.socket() as sock:
1448 fp = sock.makefile("rb", buffering=0)
1449 self.assertTrue(fp.readable())
1450 self.assertFalse(fp.writable())
1451 self.assertFalse(fp.seekable())
1452 fp.close()
1453 self.assertRaises(ValueError, fp.readable)
1454 self.assertRaises(ValueError, fp.writable)
1455 self.assertRaises(ValueError, fp.seekable)
1456
Berker Peksag3fe64d02016-02-18 17:34:00 +02001457 def test_makefile_mode(self):
1458 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1459 with self.subTest(mode=mode):
1460 with socket.socket() as sock:
1461 with sock.makefile(mode) as fp:
1462 self.assertEqual(fp.mode, mode)
1463
1464 def test_makefile_invalid_mode(self):
1465 for mode in 'rt', 'x', '+', 'a':
1466 with self.subTest(mode=mode):
1467 with socket.socket() as sock:
1468 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1469 sock.makefile(mode)
1470
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001471 def test_pickle(self):
1472 sock = socket.socket()
1473 with sock:
1474 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1475 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001476 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1477 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1478 self.assertEqual(family, socket.AF_INET)
1479 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1480 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001481
Serhiy Storchaka78980432013-01-15 01:12:17 +02001482 def test_listen_backlog(self):
1483 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001484 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1485 srv.bind((HOST, 0))
1486 srv.listen(backlog)
1487
1488 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001489 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001490 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001491
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001492 @support.cpython_only
1493 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001494 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001495 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001496 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1497 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001498 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001499 srv.close()
1500
Charles-François Natali42663332012-01-02 15:57:30 +01001501 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001502 def test_flowinfo(self):
1503 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001504 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001505 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001506 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001507
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001508 def test_str_for_enums(self):
1509 # Make sure that the AF_* and SOCK_* constants have enum-like string
1510 # reprs.
1511 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1512 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001513 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001514
1515 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1516 def test_uknown_socket_family_repr(self):
1517 # Test that when created with a family that's not one of the known
1518 # AF_*/SOCK_* constants, socket.family just returns the number.
1519 #
1520 # To do this we fool socket.socket into believing it already has an
1521 # open fd because on this path it doesn't actually verify the family and
1522 # type and populates the socket object.
1523 #
1524 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001525 fd, path = tempfile.mkstemp()
1526 self.addCleanup(os.unlink, path)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001527 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1528 self.assertEqual(s.family, 42424)
1529 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001530
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001531 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1532 def test__sendfile_use_sendfile(self):
1533 class File:
1534 def __init__(self, fd):
1535 self.fd = fd
1536
1537 def fileno(self):
1538 return self.fd
1539 with socket.socket() as sock:
1540 fd = os.open(os.curdir, os.O_RDONLY)
1541 os.close(fd)
1542 with self.assertRaises(socket._GiveupOnSendfile):
1543 sock._sendfile_use_sendfile(File(fd))
1544 with self.assertRaises(OverflowError):
1545 sock._sendfile_use_sendfile(File(2**1000))
1546 with self.assertRaises(TypeError):
1547 sock._sendfile_use_sendfile(File(None))
1548
1549
Charles-François Natali47413c12011-10-06 19:47:44 +02001550@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1551class BasicCANTest(unittest.TestCase):
1552
1553 def testCrucialConstants(self):
1554 socket.AF_CAN
1555 socket.PF_CAN
1556 socket.CAN_RAW
1557
Charles-François Natali773e42d2013-02-05 19:42:01 +01001558 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1559 'socket.CAN_BCM required for this test.')
1560 def testBCMConstants(self):
1561 socket.CAN_BCM
1562
1563 # opcodes
1564 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1565 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1566 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1567 socket.CAN_BCM_TX_SEND # send one CAN frame
1568 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1569 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1570 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1571 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1572 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1573 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1574 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1575 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1576
Charles-François Natali47413c12011-10-06 19:47:44 +02001577 def testCreateSocket(self):
1578 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1579 pass
1580
Charles-François Natali773e42d2013-02-05 19:42:01 +01001581 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1582 'socket.CAN_BCM required for this test.')
1583 def testCreateBCMSocket(self):
1584 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1585 pass
1586
Charles-François Natali47413c12011-10-06 19:47:44 +02001587 def testBindAny(self):
1588 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1589 s.bind(('', ))
1590
1591 def testTooLongInterfaceName(self):
1592 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1593 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001594 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001595 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001596
1597 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1598 'socket.CAN_RAW_LOOPBACK required for this test.')
1599 def testLoopback(self):
1600 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1601 for loopback in (0, 1):
1602 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1603 loopback)
1604 self.assertEqual(loopback,
1605 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1606
1607 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1608 'socket.CAN_RAW_FILTER required for this test.')
1609 def testFilter(self):
1610 can_id, can_mask = 0x200, 0x700
1611 can_filter = struct.pack("=II", can_id, can_mask)
1612 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1613 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1614 self.assertEqual(can_filter,
1615 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001616 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001617
1618
1619@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001620@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001621class CANTest(ThreadedCANSocketTest):
1622
Charles-François Natali47413c12011-10-06 19:47:44 +02001623 def __init__(self, methodName='runTest'):
1624 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1625
1626 @classmethod
1627 def build_can_frame(cls, can_id, data):
1628 """Build a CAN frame."""
1629 can_dlc = len(data)
1630 data = data.ljust(8, b'\x00')
1631 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1632
1633 @classmethod
1634 def dissect_can_frame(cls, frame):
1635 """Dissect a CAN frame."""
1636 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1637 return (can_id, can_dlc, data[:can_dlc])
1638
1639 def testSendFrame(self):
1640 cf, addr = self.s.recvfrom(self.bufsize)
1641 self.assertEqual(self.cf, cf)
1642 self.assertEqual(addr[0], self.interface)
1643 self.assertEqual(addr[1], socket.AF_CAN)
1644
1645 def _testSendFrame(self):
1646 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1647 self.cli.send(self.cf)
1648
1649 def testSendMaxFrame(self):
1650 cf, addr = self.s.recvfrom(self.bufsize)
1651 self.assertEqual(self.cf, cf)
1652
1653 def _testSendMaxFrame(self):
1654 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1655 self.cli.send(self.cf)
1656
1657 def testSendMultiFrames(self):
1658 cf, addr = self.s.recvfrom(self.bufsize)
1659 self.assertEqual(self.cf1, cf)
1660
1661 cf, addr = self.s.recvfrom(self.bufsize)
1662 self.assertEqual(self.cf2, cf)
1663
1664 def _testSendMultiFrames(self):
1665 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1666 self.cli.send(self.cf1)
1667
1668 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1669 self.cli.send(self.cf2)
1670
Charles-François Natali773e42d2013-02-05 19:42:01 +01001671 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1672 'socket.CAN_BCM required for this test.')
1673 def _testBCM(self):
1674 cf, addr = self.cli.recvfrom(self.bufsize)
1675 self.assertEqual(self.cf, cf)
1676 can_id, can_dlc, data = self.dissect_can_frame(cf)
1677 self.assertEqual(self.can_id, can_id)
1678 self.assertEqual(self.data, data)
1679
1680 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1681 'socket.CAN_BCM required for this test.')
1682 def testBCM(self):
1683 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1684 self.addCleanup(bcm.close)
1685 bcm.connect((self.interface,))
1686 self.can_id = 0x123
1687 self.data = bytes([0xc0, 0xff, 0xee])
1688 self.cf = self.build_can_frame(self.can_id, self.data)
1689 opcode = socket.CAN_BCM_TX_SEND
1690 flags = 0
1691 count = 0
1692 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1693 bcm_can_id = 0x0222
1694 nframes = 1
1695 assert len(self.cf) == 16
1696 header = struct.pack(self.bcm_cmd_msg_fmt,
1697 opcode,
1698 flags,
1699 count,
1700 ival1_seconds,
1701 ival1_usec,
1702 ival2_seconds,
1703 ival2_usec,
1704 bcm_can_id,
1705 nframes,
1706 )
1707 header_plus_frame = header + self.cf
1708 bytes_sent = bcm.send(header_plus_frame)
1709 self.assertEqual(bytes_sent, len(header_plus_frame))
1710
Charles-François Natali47413c12011-10-06 19:47:44 +02001711
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001712@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1713class BasicRDSTest(unittest.TestCase):
1714
1715 def testCrucialConstants(self):
1716 socket.AF_RDS
1717 socket.PF_RDS
1718
1719 def testCreateSocket(self):
1720 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1721 pass
1722
1723 def testSocketBufferSize(self):
1724 bufsize = 16384
1725 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1726 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1727 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1728
1729
1730@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1731@unittest.skipUnless(thread, 'Threading required for this test.')
1732class RDSTest(ThreadedRDSSocketTest):
1733
1734 def __init__(self, methodName='runTest'):
1735 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1736
Charles-François Natali240c55f2011-11-10 20:33:36 +01001737 def setUp(self):
1738 super().setUp()
1739 self.evt = threading.Event()
1740
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001741 def testSendAndRecv(self):
1742 data, addr = self.serv.recvfrom(self.bufsize)
1743 self.assertEqual(self.data, data)
1744 self.assertEqual(self.cli_addr, addr)
1745
1746 def _testSendAndRecv(self):
1747 self.data = b'spam'
1748 self.cli.sendto(self.data, 0, (HOST, self.port))
1749
1750 def testPeek(self):
1751 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1752 self.assertEqual(self.data, data)
1753 data, addr = self.serv.recvfrom(self.bufsize)
1754 self.assertEqual(self.data, data)
1755
1756 def _testPeek(self):
1757 self.data = b'spam'
1758 self.cli.sendto(self.data, 0, (HOST, self.port))
1759
1760 @requireAttrs(socket.socket, 'recvmsg')
1761 def testSendAndRecvMsg(self):
1762 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1763 self.assertEqual(self.data, data)
1764
1765 @requireAttrs(socket.socket, 'sendmsg')
1766 def _testSendAndRecvMsg(self):
1767 self.data = b'hello ' * 10
1768 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1769
1770 def testSendAndRecvMulti(self):
1771 data, addr = self.serv.recvfrom(self.bufsize)
1772 self.assertEqual(self.data1, data)
1773
1774 data, addr = self.serv.recvfrom(self.bufsize)
1775 self.assertEqual(self.data2, data)
1776
1777 def _testSendAndRecvMulti(self):
1778 self.data1 = b'bacon'
1779 self.cli.sendto(self.data1, 0, (HOST, self.port))
1780
1781 self.data2 = b'egg'
1782 self.cli.sendto(self.data2, 0, (HOST, self.port))
1783
1784 def testSelect(self):
1785 r, w, x = select.select([self.serv], [], [], 3.0)
1786 self.assertIn(self.serv, r)
1787 data, addr = self.serv.recvfrom(self.bufsize)
1788 self.assertEqual(self.data, data)
1789
1790 def _testSelect(self):
1791 self.data = b'select'
1792 self.cli.sendto(self.data, 0, (HOST, self.port))
1793
1794 def testCongestion(self):
1795 # wait until the sender is done
1796 self.evt.wait()
1797
1798 def _testCongestion(self):
1799 # test the behavior in case of congestion
1800 self.data = b'fill'
1801 self.cli.setblocking(False)
1802 try:
1803 # try to lower the receiver's socket buffer size
1804 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1805 except OSError:
1806 pass
1807 with self.assertRaises(OSError) as cm:
1808 try:
1809 # fill the receiver's socket buffer
1810 while True:
1811 self.cli.sendto(self.data, 0, (HOST, self.port))
1812 finally:
1813 # signal the receiver we're done
1814 self.evt.set()
1815 # sendto() should have failed with ENOBUFS
1816 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1817 # and we should have received a congestion notification through poll
1818 r, w, x = select.select([self.serv], [], [], 3.0)
1819 self.assertIn(self.serv, r)
1820
1821
Victor Stinner45df8202010-04-28 22:31:17 +00001822@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001823class BasicTCPTest(SocketConnectedTest):
1824
1825 def __init__(self, methodName='runTest'):
1826 SocketConnectedTest.__init__(self, methodName=methodName)
1827
1828 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001829 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001830 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001831 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001832
1833 def _testRecv(self):
1834 self.serv_conn.send(MSG)
1835
1836 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001837 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001838 seg1 = self.cli_conn.recv(len(MSG) - 3)
1839 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001840 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001841 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001842
1843 def _testOverFlowRecv(self):
1844 self.serv_conn.send(MSG)
1845
1846 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001847 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001848 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001849 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001850
1851 def _testRecvFrom(self):
1852 self.serv_conn.send(MSG)
1853
1854 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001855 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001856 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1857 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001858 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001859 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001860
1861 def _testOverFlowRecvFrom(self):
1862 self.serv_conn.send(MSG)
1863
1864 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001865 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001866 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001867 while 1:
1868 read = self.cli_conn.recv(1024)
1869 if not read:
1870 break
Guido van Rossume531e292002-08-08 20:28:34 +00001871 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001872 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001873
1874 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001875 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001876 self.serv_conn.sendall(big_chunk)
1877
1878 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001879 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001880 fd = self.cli_conn.fileno()
1881 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001882 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001883 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001884 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001885 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001886
1887 def _testFromFd(self):
1888 self.serv_conn.send(MSG)
1889
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001890 def testDup(self):
1891 # Testing dup()
1892 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001893 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001894 msg = sock.recv(1024)
1895 self.assertEqual(msg, MSG)
1896
1897 def _testDup(self):
1898 self.serv_conn.send(MSG)
1899
Guido van Rossum24e4af82002-06-12 19:18:08 +00001900 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001901 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001902 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001903 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001904 # wait for _testShutdown to finish: on OS X, when the server
1905 # closes the connection the client also becomes disconnected,
1906 # and the client's shutdown call will fail. (Issue #4397.)
1907 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001908
1909 def _testShutdown(self):
1910 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001911 self.serv_conn.shutdown(2)
1912
1913 testShutdown_overflow = support.cpython_only(testShutdown)
1914
1915 @support.cpython_only
1916 def _testShutdown_overflow(self):
1917 import _testcapi
1918 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001919 # Issue 15989
1920 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1921 _testcapi.INT_MAX + 1)
1922 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1923 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001924 self.serv_conn.shutdown(2)
1925
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001926 def testDetach(self):
1927 # Testing detach()
1928 fileno = self.cli_conn.fileno()
1929 f = self.cli_conn.detach()
1930 self.assertEqual(f, fileno)
1931 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001932 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001933 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001934 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001935 # ...but we can create another socket using the (still open)
1936 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001937 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001938 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001939 msg = sock.recv(1024)
1940 self.assertEqual(msg, MSG)
1941
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001942 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001943 self.serv_conn.send(MSG)
1944
Victor Stinner45df8202010-04-28 22:31:17 +00001945@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001946class BasicUDPTest(ThreadedUDPSocketTest):
1947
1948 def __init__(self, methodName='runTest'):
1949 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1950
1951 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001952 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001953 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001954 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001955
1956 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001957 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001958
Guido van Rossum1c938012002-06-12 21:17:20 +00001959 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001960 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001961 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001962 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001963
Guido van Rossum1c938012002-06-12 21:17:20 +00001964 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001965 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001966
Guido van Rossumd8faa362007-04-27 19:54:29 +00001967 def testRecvFromNegative(self):
1968 # Negative lengths passed to recvfrom should give ValueError.
1969 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1970
1971 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001972 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001973
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001974# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1975# same test code is used with different families and types of socket
1976# (e.g. stream, datagram), and tests using recvmsg() are repeated
1977# using recvmsg_into().
1978#
1979# The generic test classes such as SendmsgTests and
1980# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1981# supplied with sockets cli_sock and serv_sock representing the
1982# client's and the server's end of the connection respectively, and
1983# attributes cli_addr and serv_addr holding their (numeric where
1984# appropriate) addresses.
1985#
1986# The final concrete test classes combine these with subclasses of
1987# SocketTestBase which set up client and server sockets of a specific
1988# type, and with subclasses of SendrecvmsgBase such as
1989# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1990# sockets to cli_sock and serv_sock and override the methods and
1991# attributes of SendrecvmsgBase to fill in destination addresses if
1992# needed when sending, check for specific flags in msg_flags, etc.
1993#
1994# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1995# recvmsg_into().
1996
1997# XXX: like the other datagram (UDP) tests in this module, the code
1998# here assumes that datagram delivery on the local machine will be
1999# reliable.
2000
2001class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2002 # Base class for sendmsg()/recvmsg() tests.
2003
2004 # Time in seconds to wait before considering a test failed, or
2005 # None for no timeout. Not all tests actually set a timeout.
2006 fail_timeout = 3.0
2007
2008 def setUp(self):
2009 self.misc_event = threading.Event()
2010 super().setUp()
2011
2012 def sendToServer(self, msg):
2013 # Send msg to the server.
2014 return self.cli_sock.send(msg)
2015
2016 # Tuple of alternative default arguments for sendmsg() when called
2017 # via sendmsgToServer() (e.g. to include a destination address).
2018 sendmsg_to_server_defaults = ()
2019
2020 def sendmsgToServer(self, *args):
2021 # Call sendmsg() on self.cli_sock with the given arguments,
2022 # filling in any arguments which are not supplied with the
2023 # corresponding items of self.sendmsg_to_server_defaults, if
2024 # any.
2025 return self.cli_sock.sendmsg(
2026 *(args + self.sendmsg_to_server_defaults[len(args):]))
2027
2028 def doRecvmsg(self, sock, bufsize, *args):
2029 # Call recvmsg() on sock with given arguments and return its
2030 # result. Should be used for tests which can use either
2031 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2032 # this method with one which emulates it using recvmsg_into(),
2033 # thus allowing the same test to be used for both methods.
2034 result = sock.recvmsg(bufsize, *args)
2035 self.registerRecvmsgResult(result)
2036 return result
2037
2038 def registerRecvmsgResult(self, result):
2039 # Called by doRecvmsg() with the return value of recvmsg() or
2040 # recvmsg_into(). Can be overridden to arrange cleanup based
2041 # on the returned ancillary data, for instance.
2042 pass
2043
2044 def checkRecvmsgAddress(self, addr1, addr2):
2045 # Called to compare the received address with the address of
2046 # the peer.
2047 self.assertEqual(addr1, addr2)
2048
2049 # Flags that are normally unset in msg_flags
2050 msg_flags_common_unset = 0
2051 for name in ("MSG_CTRUNC", "MSG_OOB"):
2052 msg_flags_common_unset |= getattr(socket, name, 0)
2053
2054 # Flags that are normally set
2055 msg_flags_common_set = 0
2056
2057 # Flags set when a complete record has been received (e.g. MSG_EOR
2058 # for SCTP)
2059 msg_flags_eor_indicator = 0
2060
2061 # Flags set when a complete record has not been received
2062 # (e.g. MSG_TRUNC for datagram sockets)
2063 msg_flags_non_eor_indicator = 0
2064
2065 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2066 # Method to check the value of msg_flags returned by recvmsg[_into]().
2067 #
2068 # Checks that all bits in msg_flags_common_set attribute are
2069 # set in "flags" and all bits in msg_flags_common_unset are
2070 # unset.
2071 #
2072 # The "eor" argument specifies whether the flags should
2073 # indicate that a full record (or datagram) has been received.
2074 # If "eor" is None, no checks are done; otherwise, checks
2075 # that:
2076 #
2077 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2078 # set and all bits in msg_flags_non_eor_indicator are unset
2079 #
2080 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2081 # are set and all bits in msg_flags_eor_indicator are unset
2082 #
2083 # If "checkset" and/or "checkunset" are supplied, they require
2084 # the given bits to be set or unset respectively, overriding
2085 # what the attributes require for those bits.
2086 #
2087 # If any bits are set in "ignore", they will not be checked,
2088 # regardless of the other inputs.
2089 #
2090 # Will raise Exception if the inputs require a bit to be both
2091 # set and unset, and it is not ignored.
2092
2093 defaultset = self.msg_flags_common_set
2094 defaultunset = self.msg_flags_common_unset
2095
2096 if eor:
2097 defaultset |= self.msg_flags_eor_indicator
2098 defaultunset |= self.msg_flags_non_eor_indicator
2099 elif eor is not None:
2100 defaultset |= self.msg_flags_non_eor_indicator
2101 defaultunset |= self.msg_flags_eor_indicator
2102
2103 # Function arguments override defaults
2104 defaultset &= ~checkunset
2105 defaultunset &= ~checkset
2106
2107 # Merge arguments with remaining defaults, and check for conflicts
2108 checkset |= defaultset
2109 checkunset |= defaultunset
2110 inboth = checkset & checkunset & ~ignore
2111 if inboth:
2112 raise Exception("contradictory set, unset requirements for flags "
2113 "{0:#x}".format(inboth))
2114
2115 # Compare with given msg_flags value
2116 mask = (checkset | checkunset) & ~ignore
2117 self.assertEqual(flags & mask, checkset & mask)
2118
2119
2120class RecvmsgIntoMixin(SendrecvmsgBase):
2121 # Mixin to implement doRecvmsg() using recvmsg_into().
2122
2123 def doRecvmsg(self, sock, bufsize, *args):
2124 buf = bytearray(bufsize)
2125 result = sock.recvmsg_into([buf], *args)
2126 self.registerRecvmsgResult(result)
2127 self.assertGreaterEqual(result[0], 0)
2128 self.assertLessEqual(result[0], bufsize)
2129 return (bytes(buf[:result[0]]),) + result[1:]
2130
2131
2132class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2133 # Defines flags to be checked in msg_flags for datagram sockets.
2134
2135 @property
2136 def msg_flags_non_eor_indicator(self):
2137 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2138
2139
2140class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2141 # Defines flags to be checked in msg_flags for SCTP sockets.
2142
2143 @property
2144 def msg_flags_eor_indicator(self):
2145 return super().msg_flags_eor_indicator | socket.MSG_EOR
2146
2147
2148class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2149 # Base class for tests on connectionless-mode sockets. Users must
2150 # supply sockets on attributes cli and serv to be mapped to
2151 # cli_sock and serv_sock respectively.
2152
2153 @property
2154 def serv_sock(self):
2155 return self.serv
2156
2157 @property
2158 def cli_sock(self):
2159 return self.cli
2160
2161 @property
2162 def sendmsg_to_server_defaults(self):
2163 return ([], [], 0, self.serv_addr)
2164
2165 def sendToServer(self, msg):
2166 return self.cli_sock.sendto(msg, self.serv_addr)
2167
2168
2169class SendrecvmsgConnectedBase(SendrecvmsgBase):
2170 # Base class for tests on connected sockets. Users must supply
2171 # sockets on attributes serv_conn and cli_conn (representing the
2172 # connections *to* the server and the client), to be mapped to
2173 # cli_sock and serv_sock respectively.
2174
2175 @property
2176 def serv_sock(self):
2177 return self.cli_conn
2178
2179 @property
2180 def cli_sock(self):
2181 return self.serv_conn
2182
2183 def checkRecvmsgAddress(self, addr1, addr2):
2184 # Address is currently "unspecified" for a connected socket,
2185 # so we don't examine it
2186 pass
2187
2188
2189class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2190 # Base class to set a timeout on server's socket.
2191
2192 def setUp(self):
2193 super().setUp()
2194 self.serv_sock.settimeout(self.fail_timeout)
2195
2196
2197class SendmsgTests(SendrecvmsgServerTimeoutBase):
2198 # Tests for sendmsg() which can use any socket type and do not
2199 # involve recvmsg() or recvmsg_into().
2200
2201 def testSendmsg(self):
2202 # Send a simple message with sendmsg().
2203 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2204
2205 def _testSendmsg(self):
2206 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2207
2208 def testSendmsgDataGenerator(self):
2209 # Send from buffer obtained from a generator (not a sequence).
2210 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2211
2212 def _testSendmsgDataGenerator(self):
2213 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2214 len(MSG))
2215
2216 def testSendmsgAncillaryGenerator(self):
2217 # Gather (empty) ancillary data from a generator.
2218 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2219
2220 def _testSendmsgAncillaryGenerator(self):
2221 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2222 len(MSG))
2223
2224 def testSendmsgArray(self):
2225 # Send data from an array instead of the usual bytes object.
2226 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2227
2228 def _testSendmsgArray(self):
2229 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2230 len(MSG))
2231
2232 def testSendmsgGather(self):
2233 # Send message data from more than one buffer (gather write).
2234 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2235
2236 def _testSendmsgGather(self):
2237 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2238
2239 def testSendmsgBadArgs(self):
2240 # Check that sendmsg() rejects invalid arguments.
2241 self.assertEqual(self.serv_sock.recv(1000), b"done")
2242
2243 def _testSendmsgBadArgs(self):
2244 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2245 self.assertRaises(TypeError, self.sendmsgToServer,
2246 b"not in an iterable")
2247 self.assertRaises(TypeError, self.sendmsgToServer,
2248 object())
2249 self.assertRaises(TypeError, self.sendmsgToServer,
2250 [object()])
2251 self.assertRaises(TypeError, self.sendmsgToServer,
2252 [MSG, object()])
2253 self.assertRaises(TypeError, self.sendmsgToServer,
2254 [MSG], object())
2255 self.assertRaises(TypeError, self.sendmsgToServer,
2256 [MSG], [], object())
2257 self.assertRaises(TypeError, self.sendmsgToServer,
2258 [MSG], [], 0, object())
2259 self.sendToServer(b"done")
2260
2261 def testSendmsgBadCmsg(self):
2262 # Check that invalid ancillary data items are rejected.
2263 self.assertEqual(self.serv_sock.recv(1000), b"done")
2264
2265 def _testSendmsgBadCmsg(self):
2266 self.assertRaises(TypeError, self.sendmsgToServer,
2267 [MSG], [object()])
2268 self.assertRaises(TypeError, self.sendmsgToServer,
2269 [MSG], [(object(), 0, b"data")])
2270 self.assertRaises(TypeError, self.sendmsgToServer,
2271 [MSG], [(0, object(), b"data")])
2272 self.assertRaises(TypeError, self.sendmsgToServer,
2273 [MSG], [(0, 0, object())])
2274 self.assertRaises(TypeError, self.sendmsgToServer,
2275 [MSG], [(0, 0)])
2276 self.assertRaises(TypeError, self.sendmsgToServer,
2277 [MSG], [(0, 0, b"data", 42)])
2278 self.sendToServer(b"done")
2279
2280 @requireAttrs(socket, "CMSG_SPACE")
2281 def testSendmsgBadMultiCmsg(self):
2282 # Check that invalid ancillary data items are rejected when
2283 # more than one item is present.
2284 self.assertEqual(self.serv_sock.recv(1000), b"done")
2285
2286 @testSendmsgBadMultiCmsg.client_skip
2287 def _testSendmsgBadMultiCmsg(self):
2288 self.assertRaises(TypeError, self.sendmsgToServer,
2289 [MSG], [0, 0, b""])
2290 self.assertRaises(TypeError, self.sendmsgToServer,
2291 [MSG], [(0, 0, b""), object()])
2292 self.sendToServer(b"done")
2293
2294 def testSendmsgExcessCmsgReject(self):
2295 # Check that sendmsg() rejects excess ancillary data items
2296 # when the number that can be sent is limited.
2297 self.assertEqual(self.serv_sock.recv(1000), b"done")
2298
2299 def _testSendmsgExcessCmsgReject(self):
2300 if not hasattr(socket, "CMSG_SPACE"):
2301 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002302 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002303 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2304 self.assertIsNone(cm.exception.errno)
2305 self.sendToServer(b"done")
2306
2307 def testSendmsgAfterClose(self):
2308 # Check that sendmsg() fails on a closed socket.
2309 pass
2310
2311 def _testSendmsgAfterClose(self):
2312 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002313 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002314
2315
2316class SendmsgStreamTests(SendmsgTests):
2317 # Tests for sendmsg() which require a stream socket and do not
2318 # involve recvmsg() or recvmsg_into().
2319
2320 def testSendmsgExplicitNoneAddr(self):
2321 # Check that peer address can be specified as None.
2322 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2323
2324 def _testSendmsgExplicitNoneAddr(self):
2325 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2326
2327 def testSendmsgTimeout(self):
2328 # Check that timeout works with sendmsg().
2329 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2330 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2331
2332 def _testSendmsgTimeout(self):
2333 try:
2334 self.cli_sock.settimeout(0.03)
2335 with self.assertRaises(socket.timeout):
2336 while True:
2337 self.sendmsgToServer([b"a"*512])
2338 finally:
2339 self.misc_event.set()
2340
2341 # XXX: would be nice to have more tests for sendmsg flags argument.
2342
2343 # Linux supports MSG_DONTWAIT when sending, but in general, it
2344 # only works when receiving. Could add other platforms if they
2345 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002346 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002347 "MSG_DONTWAIT not known to work on this platform when "
2348 "sending")
2349 def testSendmsgDontWait(self):
2350 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2351 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2352 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2353
2354 @testSendmsgDontWait.client_skip
2355 def _testSendmsgDontWait(self):
2356 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002357 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002358 while True:
2359 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2360 self.assertIn(cm.exception.errno,
2361 (errno.EAGAIN, errno.EWOULDBLOCK))
2362 finally:
2363 self.misc_event.set()
2364
2365
2366class SendmsgConnectionlessTests(SendmsgTests):
2367 # Tests for sendmsg() which require a connectionless-mode
2368 # (e.g. datagram) socket, and do not involve recvmsg() or
2369 # recvmsg_into().
2370
2371 def testSendmsgNoDestAddr(self):
2372 # Check that sendmsg() fails when no destination address is
2373 # given for unconnected socket.
2374 pass
2375
2376 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002377 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002378 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002379 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002380 [MSG], [], 0, None)
2381
2382
2383class RecvmsgGenericTests(SendrecvmsgBase):
2384 # Tests for recvmsg() which can also be emulated using
2385 # recvmsg_into(), and can use any socket type.
2386
2387 def testRecvmsg(self):
2388 # Receive a simple message with recvmsg[_into]().
2389 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2390 self.assertEqual(msg, MSG)
2391 self.checkRecvmsgAddress(addr, self.cli_addr)
2392 self.assertEqual(ancdata, [])
2393 self.checkFlags(flags, eor=True)
2394
2395 def _testRecvmsg(self):
2396 self.sendToServer(MSG)
2397
2398 def testRecvmsgExplicitDefaults(self):
2399 # Test recvmsg[_into]() with default arguments provided explicitly.
2400 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2401 len(MSG), 0, 0)
2402 self.assertEqual(msg, MSG)
2403 self.checkRecvmsgAddress(addr, self.cli_addr)
2404 self.assertEqual(ancdata, [])
2405 self.checkFlags(flags, eor=True)
2406
2407 def _testRecvmsgExplicitDefaults(self):
2408 self.sendToServer(MSG)
2409
2410 def testRecvmsgShorter(self):
2411 # Receive a message smaller than buffer.
2412 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2413 len(MSG) + 42)
2414 self.assertEqual(msg, MSG)
2415 self.checkRecvmsgAddress(addr, self.cli_addr)
2416 self.assertEqual(ancdata, [])
2417 self.checkFlags(flags, eor=True)
2418
2419 def _testRecvmsgShorter(self):
2420 self.sendToServer(MSG)
2421
Charles-François Natali8619cd72011-10-03 19:43:15 +02002422 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2423 # datagram is received (issue #13001).
2424 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002425 def testRecvmsgTrunc(self):
2426 # Receive part of message, check for truncation indicators.
2427 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2428 len(MSG) - 3)
2429 self.assertEqual(msg, MSG[:-3])
2430 self.checkRecvmsgAddress(addr, self.cli_addr)
2431 self.assertEqual(ancdata, [])
2432 self.checkFlags(flags, eor=False)
2433
Charles-François Natali8619cd72011-10-03 19:43:15 +02002434 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002435 def _testRecvmsgTrunc(self):
2436 self.sendToServer(MSG)
2437
2438 def testRecvmsgShortAncillaryBuf(self):
2439 # Test ancillary data buffer too small to hold any ancillary data.
2440 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2441 len(MSG), 1)
2442 self.assertEqual(msg, MSG)
2443 self.checkRecvmsgAddress(addr, self.cli_addr)
2444 self.assertEqual(ancdata, [])
2445 self.checkFlags(flags, eor=True)
2446
2447 def _testRecvmsgShortAncillaryBuf(self):
2448 self.sendToServer(MSG)
2449
2450 def testRecvmsgLongAncillaryBuf(self):
2451 # Test large ancillary data buffer.
2452 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2453 len(MSG), 10240)
2454 self.assertEqual(msg, MSG)
2455 self.checkRecvmsgAddress(addr, self.cli_addr)
2456 self.assertEqual(ancdata, [])
2457 self.checkFlags(flags, eor=True)
2458
2459 def _testRecvmsgLongAncillaryBuf(self):
2460 self.sendToServer(MSG)
2461
2462 def testRecvmsgAfterClose(self):
2463 # Check that recvmsg[_into]() fails on a closed socket.
2464 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002465 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002466
2467 def _testRecvmsgAfterClose(self):
2468 pass
2469
2470 def testRecvmsgTimeout(self):
2471 # Check that timeout works.
2472 try:
2473 self.serv_sock.settimeout(0.03)
2474 self.assertRaises(socket.timeout,
2475 self.doRecvmsg, self.serv_sock, len(MSG))
2476 finally:
2477 self.misc_event.set()
2478
2479 def _testRecvmsgTimeout(self):
2480 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2481
2482 @requireAttrs(socket, "MSG_PEEK")
2483 def testRecvmsgPeek(self):
2484 # Check that MSG_PEEK in flags enables examination of pending
2485 # data without consuming it.
2486
2487 # Receive part of data with MSG_PEEK.
2488 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2489 len(MSG) - 3, 0,
2490 socket.MSG_PEEK)
2491 self.assertEqual(msg, MSG[:-3])
2492 self.checkRecvmsgAddress(addr, self.cli_addr)
2493 self.assertEqual(ancdata, [])
2494 # Ignoring MSG_TRUNC here (so this test is the same for stream
2495 # and datagram sockets). Some wording in POSIX seems to
2496 # suggest that it needn't be set when peeking, but that may
2497 # just be a slip.
2498 self.checkFlags(flags, eor=False,
2499 ignore=getattr(socket, "MSG_TRUNC", 0))
2500
2501 # Receive all data with MSG_PEEK.
2502 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2503 len(MSG), 0,
2504 socket.MSG_PEEK)
2505 self.assertEqual(msg, MSG)
2506 self.checkRecvmsgAddress(addr, self.cli_addr)
2507 self.assertEqual(ancdata, [])
2508 self.checkFlags(flags, eor=True)
2509
2510 # Check that the same data can still be received normally.
2511 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2512 self.assertEqual(msg, MSG)
2513 self.checkRecvmsgAddress(addr, self.cli_addr)
2514 self.assertEqual(ancdata, [])
2515 self.checkFlags(flags, eor=True)
2516
2517 @testRecvmsgPeek.client_skip
2518 def _testRecvmsgPeek(self):
2519 self.sendToServer(MSG)
2520
2521 @requireAttrs(socket.socket, "sendmsg")
2522 def testRecvmsgFromSendmsg(self):
2523 # Test receiving with recvmsg[_into]() when message is sent
2524 # using sendmsg().
2525 self.serv_sock.settimeout(self.fail_timeout)
2526 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2527 self.assertEqual(msg, MSG)
2528 self.checkRecvmsgAddress(addr, self.cli_addr)
2529 self.assertEqual(ancdata, [])
2530 self.checkFlags(flags, eor=True)
2531
2532 @testRecvmsgFromSendmsg.client_skip
2533 def _testRecvmsgFromSendmsg(self):
2534 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2535
2536
2537class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2538 # Tests which require a stream socket and can use either recvmsg()
2539 # or recvmsg_into().
2540
2541 def testRecvmsgEOF(self):
2542 # Receive end-of-stream indicator (b"", peer socket closed).
2543 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2544 self.assertEqual(msg, b"")
2545 self.checkRecvmsgAddress(addr, self.cli_addr)
2546 self.assertEqual(ancdata, [])
2547 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2548
2549 def _testRecvmsgEOF(self):
2550 self.cli_sock.close()
2551
2552 def testRecvmsgOverflow(self):
2553 # Receive a message in more than one chunk.
2554 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2555 len(MSG) - 3)
2556 self.checkRecvmsgAddress(addr, self.cli_addr)
2557 self.assertEqual(ancdata, [])
2558 self.checkFlags(flags, eor=False)
2559
2560 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2561 self.checkRecvmsgAddress(addr, self.cli_addr)
2562 self.assertEqual(ancdata, [])
2563 self.checkFlags(flags, eor=True)
2564
2565 msg = seg1 + seg2
2566 self.assertEqual(msg, MSG)
2567
2568 def _testRecvmsgOverflow(self):
2569 self.sendToServer(MSG)
2570
2571
2572class RecvmsgTests(RecvmsgGenericTests):
2573 # Tests for recvmsg() which can use any socket type.
2574
2575 def testRecvmsgBadArgs(self):
2576 # Check that recvmsg() rejects invalid arguments.
2577 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2578 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2579 -1, 0, 0)
2580 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2581 len(MSG), -1, 0)
2582 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2583 [bytearray(10)], 0, 0)
2584 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2585 object(), 0, 0)
2586 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2587 len(MSG), object(), 0)
2588 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2589 len(MSG), 0, object())
2590
2591 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2592 self.assertEqual(msg, MSG)
2593 self.checkRecvmsgAddress(addr, self.cli_addr)
2594 self.assertEqual(ancdata, [])
2595 self.checkFlags(flags, eor=True)
2596
2597 def _testRecvmsgBadArgs(self):
2598 self.sendToServer(MSG)
2599
2600
2601class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2602 # Tests for recvmsg_into() which can use any socket type.
2603
2604 def testRecvmsgIntoBadArgs(self):
2605 # Check that recvmsg_into() rejects invalid arguments.
2606 buf = bytearray(len(MSG))
2607 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2608 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2609 len(MSG), 0, 0)
2610 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2611 buf, 0, 0)
2612 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2613 [object()], 0, 0)
2614 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2615 [b"I'm not writable"], 0, 0)
2616 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2617 [buf, object()], 0, 0)
2618 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2619 [buf], -1, 0)
2620 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2621 [buf], object(), 0)
2622 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2623 [buf], 0, object())
2624
2625 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2626 self.assertEqual(nbytes, len(MSG))
2627 self.assertEqual(buf, bytearray(MSG))
2628 self.checkRecvmsgAddress(addr, self.cli_addr)
2629 self.assertEqual(ancdata, [])
2630 self.checkFlags(flags, eor=True)
2631
2632 def _testRecvmsgIntoBadArgs(self):
2633 self.sendToServer(MSG)
2634
2635 def testRecvmsgIntoGenerator(self):
2636 # Receive into buffer obtained from a generator (not a sequence).
2637 buf = bytearray(len(MSG))
2638 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2639 (o for o in [buf]))
2640 self.assertEqual(nbytes, len(MSG))
2641 self.assertEqual(buf, bytearray(MSG))
2642 self.checkRecvmsgAddress(addr, self.cli_addr)
2643 self.assertEqual(ancdata, [])
2644 self.checkFlags(flags, eor=True)
2645
2646 def _testRecvmsgIntoGenerator(self):
2647 self.sendToServer(MSG)
2648
2649 def testRecvmsgIntoArray(self):
2650 # Receive into an array rather than the usual bytearray.
2651 buf = array.array("B", [0] * len(MSG))
2652 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2653 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002654 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002655 self.checkRecvmsgAddress(addr, self.cli_addr)
2656 self.assertEqual(ancdata, [])
2657 self.checkFlags(flags, eor=True)
2658
2659 def _testRecvmsgIntoArray(self):
2660 self.sendToServer(MSG)
2661
2662 def testRecvmsgIntoScatter(self):
2663 # Receive into multiple buffers (scatter write).
2664 b1 = bytearray(b"----")
2665 b2 = bytearray(b"0123456789")
2666 b3 = bytearray(b"--------------")
2667 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2668 [b1, memoryview(b2)[2:9], b3])
2669 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2670 self.assertEqual(b1, bytearray(b"Mary"))
2671 self.assertEqual(b2, bytearray(b"01 had a 9"))
2672 self.assertEqual(b3, bytearray(b"little lamb---"))
2673 self.checkRecvmsgAddress(addr, self.cli_addr)
2674 self.assertEqual(ancdata, [])
2675 self.checkFlags(flags, eor=True)
2676
2677 def _testRecvmsgIntoScatter(self):
2678 self.sendToServer(b"Mary had a little lamb")
2679
2680
2681class CmsgMacroTests(unittest.TestCase):
2682 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2683 # assumptions used by sendmsg() and recvmsg[_into](), which share
2684 # code with these functions.
2685
2686 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002687 try:
2688 import _testcapi
2689 except ImportError:
2690 socklen_t_limit = 0x7fffffff
2691 else:
2692 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002693
2694 @requireAttrs(socket, "CMSG_LEN")
2695 def testCMSG_LEN(self):
2696 # Test CMSG_LEN() with various valid and invalid values,
2697 # checking the assumptions used by recvmsg() and sendmsg().
2698 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2699 values = list(range(257)) + list(range(toobig - 257, toobig))
2700
2701 # struct cmsghdr has at least three members, two of which are ints
2702 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2703 for n in values:
2704 ret = socket.CMSG_LEN(n)
2705 # This is how recvmsg() calculates the data size
2706 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2707 self.assertLessEqual(ret, self.socklen_t_limit)
2708
2709 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2710 # sendmsg() shares code with these functions, and requires
2711 # that it reject values over the limit.
2712 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2713 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2714
2715 @requireAttrs(socket, "CMSG_SPACE")
2716 def testCMSG_SPACE(self):
2717 # Test CMSG_SPACE() with various valid and invalid values,
2718 # checking the assumptions used by sendmsg().
2719 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2720 values = list(range(257)) + list(range(toobig - 257, toobig))
2721
2722 last = socket.CMSG_SPACE(0)
2723 # struct cmsghdr has at least three members, two of which are ints
2724 self.assertGreater(last, array.array("i").itemsize * 2)
2725 for n in values:
2726 ret = socket.CMSG_SPACE(n)
2727 self.assertGreaterEqual(ret, last)
2728 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2729 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2730 self.assertLessEqual(ret, self.socklen_t_limit)
2731 last = ret
2732
2733 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2734 # sendmsg() shares code with these functions, and requires
2735 # that it reject values over the limit.
2736 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2737 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2738
2739
2740class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2741 # Tests for file descriptor passing on Unix-domain sockets.
2742
2743 # Invalid file descriptor value that's unlikely to evaluate to a
2744 # real FD even if one of its bytes is replaced with a different
2745 # value (which shouldn't actually happen).
2746 badfd = -0x5555
2747
2748 def newFDs(self, n):
2749 # Return a list of n file descriptors for newly-created files
2750 # containing their list indices as ASCII numbers.
2751 fds = []
2752 for i in range(n):
2753 fd, path = tempfile.mkstemp()
2754 self.addCleanup(os.unlink, path)
2755 self.addCleanup(os.close, fd)
2756 os.write(fd, str(i).encode())
2757 fds.append(fd)
2758 return fds
2759
2760 def checkFDs(self, fds):
2761 # Check that the file descriptors in the given list contain
2762 # their correct list indices as ASCII numbers.
2763 for n, fd in enumerate(fds):
2764 os.lseek(fd, 0, os.SEEK_SET)
2765 self.assertEqual(os.read(fd, 1024), str(n).encode())
2766
2767 def registerRecvmsgResult(self, result):
2768 self.addCleanup(self.closeRecvmsgFDs, result)
2769
2770 def closeRecvmsgFDs(self, recvmsg_result):
2771 # Close all file descriptors specified in the ancillary data
2772 # of the given return value from recvmsg() or recvmsg_into().
2773 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2774 if (cmsg_level == socket.SOL_SOCKET and
2775 cmsg_type == socket.SCM_RIGHTS):
2776 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002777 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002778 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2779 for fd in fds:
2780 os.close(fd)
2781
2782 def createAndSendFDs(self, n):
2783 # Send n new file descriptors created by newFDs() to the
2784 # server, with the constant MSG as the non-ancillary data.
2785 self.assertEqual(
2786 self.sendmsgToServer([MSG],
2787 [(socket.SOL_SOCKET,
2788 socket.SCM_RIGHTS,
2789 array.array("i", self.newFDs(n)))]),
2790 len(MSG))
2791
2792 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2793 # Check that constant MSG was received with numfds file
2794 # descriptors in a maximum of maxcmsgs control messages (which
2795 # must contain only complete integers). By default, check
2796 # that MSG_CTRUNC is unset, but ignore any flags in
2797 # ignoreflags.
2798 msg, ancdata, flags, addr = result
2799 self.assertEqual(msg, MSG)
2800 self.checkRecvmsgAddress(addr, self.cli_addr)
2801 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2802 ignore=ignoreflags)
2803
2804 self.assertIsInstance(ancdata, list)
2805 self.assertLessEqual(len(ancdata), maxcmsgs)
2806 fds = array.array("i")
2807 for item in ancdata:
2808 self.assertIsInstance(item, tuple)
2809 cmsg_level, cmsg_type, cmsg_data = item
2810 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2811 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2812 self.assertIsInstance(cmsg_data, bytes)
2813 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002814 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002815
2816 self.assertEqual(len(fds), numfds)
2817 self.checkFDs(fds)
2818
2819 def testFDPassSimple(self):
2820 # Pass a single FD (array read from bytes object).
2821 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2822 len(MSG), 10240))
2823
2824 def _testFDPassSimple(self):
2825 self.assertEqual(
2826 self.sendmsgToServer(
2827 [MSG],
2828 [(socket.SOL_SOCKET,
2829 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002830 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002831 len(MSG))
2832
2833 def testMultipleFDPass(self):
2834 # Pass multiple FDs in a single array.
2835 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2836 len(MSG), 10240))
2837
2838 def _testMultipleFDPass(self):
2839 self.createAndSendFDs(4)
2840
2841 @requireAttrs(socket, "CMSG_SPACE")
2842 def testFDPassCMSG_SPACE(self):
2843 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2844 self.checkRecvmsgFDs(
2845 4, self.doRecvmsg(self.serv_sock, len(MSG),
2846 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2847
2848 @testFDPassCMSG_SPACE.client_skip
2849 def _testFDPassCMSG_SPACE(self):
2850 self.createAndSendFDs(4)
2851
2852 def testFDPassCMSG_LEN(self):
2853 # Test using CMSG_LEN() to calculate ancillary buffer size.
2854 self.checkRecvmsgFDs(1,
2855 self.doRecvmsg(self.serv_sock, len(MSG),
2856 socket.CMSG_LEN(4 * SIZEOF_INT)),
2857 # RFC 3542 says implementations may set
2858 # MSG_CTRUNC if there isn't enough space
2859 # for trailing padding.
2860 ignoreflags=socket.MSG_CTRUNC)
2861
2862 def _testFDPassCMSG_LEN(self):
2863 self.createAndSendFDs(1)
2864
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002865 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002866 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002867 @requireAttrs(socket, "CMSG_SPACE")
2868 def testFDPassSeparate(self):
2869 # Pass two FDs in two separate arrays. Arrays may be combined
2870 # into a single control message by the OS.
2871 self.checkRecvmsgFDs(2,
2872 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2873 maxcmsgs=2)
2874
2875 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002876 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002877 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002878 def _testFDPassSeparate(self):
2879 fd0, fd1 = self.newFDs(2)
2880 self.assertEqual(
2881 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2882 socket.SCM_RIGHTS,
2883 array.array("i", [fd0])),
2884 (socket.SOL_SOCKET,
2885 socket.SCM_RIGHTS,
2886 array.array("i", [fd1]))]),
2887 len(MSG))
2888
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002889 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002890 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002891 @requireAttrs(socket, "CMSG_SPACE")
2892 def testFDPassSeparateMinSpace(self):
2893 # Pass two FDs in two separate arrays, receiving them into the
2894 # minimum space for two arrays.
2895 self.checkRecvmsgFDs(2,
2896 self.doRecvmsg(self.serv_sock, len(MSG),
2897 socket.CMSG_SPACE(SIZEOF_INT) +
2898 socket.CMSG_LEN(SIZEOF_INT)),
2899 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2900
2901 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002902 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002903 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002904 def _testFDPassSeparateMinSpace(self):
2905 fd0, fd1 = self.newFDs(2)
2906 self.assertEqual(
2907 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2908 socket.SCM_RIGHTS,
2909 array.array("i", [fd0])),
2910 (socket.SOL_SOCKET,
2911 socket.SCM_RIGHTS,
2912 array.array("i", [fd1]))]),
2913 len(MSG))
2914
2915 def sendAncillaryIfPossible(self, msg, ancdata):
2916 # Try to send msg and ancdata to server, but if the system
2917 # call fails, just send msg with no ancillary data.
2918 try:
2919 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002920 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002921 # Check that it was the system call that failed
2922 self.assertIsInstance(e.errno, int)
2923 nbytes = self.sendmsgToServer([msg])
2924 self.assertEqual(nbytes, len(msg))
2925
Brett Cannon3bbad122015-12-28 17:21:44 -08002926 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002927 def testFDPassEmpty(self):
2928 # Try to pass an empty FD array. Can receive either no array
2929 # or an empty array.
2930 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2931 len(MSG), 10240),
2932 ignoreflags=socket.MSG_CTRUNC)
2933
2934 def _testFDPassEmpty(self):
2935 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2936 socket.SCM_RIGHTS,
2937 b"")])
2938
2939 def testFDPassPartialInt(self):
2940 # Try to pass a truncated FD array.
2941 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2942 len(MSG), 10240)
2943 self.assertEqual(msg, MSG)
2944 self.checkRecvmsgAddress(addr, self.cli_addr)
2945 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2946 self.assertLessEqual(len(ancdata), 1)
2947 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2948 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2949 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2950 self.assertLess(len(cmsg_data), SIZEOF_INT)
2951
2952 def _testFDPassPartialInt(self):
2953 self.sendAncillaryIfPossible(
2954 MSG,
2955 [(socket.SOL_SOCKET,
2956 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002957 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002958
2959 @requireAttrs(socket, "CMSG_SPACE")
2960 def testFDPassPartialIntInMiddle(self):
2961 # Try to pass two FD arrays, the first of which is truncated.
2962 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2963 len(MSG), 10240)
2964 self.assertEqual(msg, MSG)
2965 self.checkRecvmsgAddress(addr, self.cli_addr)
2966 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2967 self.assertLessEqual(len(ancdata), 2)
2968 fds = array.array("i")
2969 # Arrays may have been combined in a single control message
2970 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2971 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2972 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002973 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002974 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2975 self.assertLessEqual(len(fds), 2)
2976 self.checkFDs(fds)
2977
2978 @testFDPassPartialIntInMiddle.client_skip
2979 def _testFDPassPartialIntInMiddle(self):
2980 fd0, fd1 = self.newFDs(2)
2981 self.sendAncillaryIfPossible(
2982 MSG,
2983 [(socket.SOL_SOCKET,
2984 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002985 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002986 (socket.SOL_SOCKET,
2987 socket.SCM_RIGHTS,
2988 array.array("i", [fd1]))])
2989
2990 def checkTruncatedHeader(self, result, ignoreflags=0):
2991 # Check that no ancillary data items are returned when data is
2992 # truncated inside the cmsghdr structure.
2993 msg, ancdata, flags, addr = result
2994 self.assertEqual(msg, MSG)
2995 self.checkRecvmsgAddress(addr, self.cli_addr)
2996 self.assertEqual(ancdata, [])
2997 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2998 ignore=ignoreflags)
2999
3000 def testCmsgTruncNoBufSize(self):
3001 # Check that no ancillary data is received when no buffer size
3002 # is specified.
3003 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3004 # BSD seems to set MSG_CTRUNC only
3005 # if an item has been partially
3006 # received.
3007 ignoreflags=socket.MSG_CTRUNC)
3008
3009 def _testCmsgTruncNoBufSize(self):
3010 self.createAndSendFDs(1)
3011
3012 def testCmsgTrunc0(self):
3013 # Check that no ancillary data is received when buffer size is 0.
3014 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3015 ignoreflags=socket.MSG_CTRUNC)
3016
3017 def _testCmsgTrunc0(self):
3018 self.createAndSendFDs(1)
3019
3020 # Check that no ancillary data is returned for various non-zero
3021 # (but still too small) buffer sizes.
3022
3023 def testCmsgTrunc1(self):
3024 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3025
3026 def _testCmsgTrunc1(self):
3027 self.createAndSendFDs(1)
3028
3029 def testCmsgTrunc2Int(self):
3030 # The cmsghdr structure has at least three members, two of
3031 # which are ints, so we still shouldn't see any ancillary
3032 # data.
3033 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3034 SIZEOF_INT * 2))
3035
3036 def _testCmsgTrunc2Int(self):
3037 self.createAndSendFDs(1)
3038
3039 def testCmsgTruncLen0Minus1(self):
3040 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3041 socket.CMSG_LEN(0) - 1))
3042
3043 def _testCmsgTruncLen0Minus1(self):
3044 self.createAndSendFDs(1)
3045
3046 # The following tests try to truncate the control message in the
3047 # middle of the FD array.
3048
3049 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3050 # Check that file descriptor data is truncated to between
3051 # mindata and maxdata bytes when received with buffer size
3052 # ancbuf, and that any complete file descriptor numbers are
3053 # valid.
3054 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3055 len(MSG), ancbuf)
3056 self.assertEqual(msg, MSG)
3057 self.checkRecvmsgAddress(addr, self.cli_addr)
3058 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3059
3060 if mindata == 0 and ancdata == []:
3061 return
3062 self.assertEqual(len(ancdata), 1)
3063 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3064 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3065 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3066 self.assertGreaterEqual(len(cmsg_data), mindata)
3067 self.assertLessEqual(len(cmsg_data), maxdata)
3068 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003069 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003070 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3071 self.checkFDs(fds)
3072
3073 def testCmsgTruncLen0(self):
3074 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3075
3076 def _testCmsgTruncLen0(self):
3077 self.createAndSendFDs(1)
3078
3079 def testCmsgTruncLen0Plus1(self):
3080 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3081
3082 def _testCmsgTruncLen0Plus1(self):
3083 self.createAndSendFDs(2)
3084
3085 def testCmsgTruncLen1(self):
3086 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3087 maxdata=SIZEOF_INT)
3088
3089 def _testCmsgTruncLen1(self):
3090 self.createAndSendFDs(2)
3091
3092 def testCmsgTruncLen2Minus1(self):
3093 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3094 maxdata=(2 * SIZEOF_INT) - 1)
3095
3096 def _testCmsgTruncLen2Minus1(self):
3097 self.createAndSendFDs(2)
3098
3099
3100class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3101 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3102 # features of the RFC 3542 Advanced Sockets API for IPv6.
3103 # Currently we can only handle certain data items (e.g. traffic
3104 # class, hop limit, MTU discovery and fragmentation settings)
3105 # without resorting to unportable means such as the struct module,
3106 # but the tests here are aimed at testing the ancillary data
3107 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3108 # itself.
3109
3110 # Test value to use when setting hop limit of packet
3111 hop_limit = 2
3112
3113 # Test value to use when setting traffic class of packet.
3114 # -1 means "use kernel default".
3115 traffic_class = -1
3116
3117 def ancillaryMapping(self, ancdata):
3118 # Given ancillary data list ancdata, return a mapping from
3119 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3120 # Check that no (level, type) pair appears more than once.
3121 d = {}
3122 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3123 self.assertNotIn((cmsg_level, cmsg_type), d)
3124 d[(cmsg_level, cmsg_type)] = cmsg_data
3125 return d
3126
3127 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3128 # Receive hop limit into ancbufsize bytes of ancillary data
3129 # space. Check that data is MSG, ancillary data is not
3130 # truncated (but ignore any flags in ignoreflags), and hop
3131 # limit is between 0 and maxhop inclusive.
3132 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3133 socket.IPV6_RECVHOPLIMIT, 1)
3134 self.misc_event.set()
3135 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3136 len(MSG), ancbufsize)
3137
3138 self.assertEqual(msg, MSG)
3139 self.checkRecvmsgAddress(addr, self.cli_addr)
3140 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3141 ignore=ignoreflags)
3142
3143 self.assertEqual(len(ancdata), 1)
3144 self.assertIsInstance(ancdata[0], tuple)
3145 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3146 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3147 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3148 self.assertIsInstance(cmsg_data, bytes)
3149 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3150 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003151 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003152 self.assertGreaterEqual(a[0], 0)
3153 self.assertLessEqual(a[0], maxhop)
3154
3155 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3156 def testRecvHopLimit(self):
3157 # Test receiving the packet hop limit as ancillary data.
3158 self.checkHopLimit(ancbufsize=10240)
3159
3160 @testRecvHopLimit.client_skip
3161 def _testRecvHopLimit(self):
3162 # Need to wait until server has asked to receive ancillary
3163 # data, as implementations are not required to buffer it
3164 # otherwise.
3165 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3166 self.sendToServer(MSG)
3167
3168 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3169 def testRecvHopLimitCMSG_SPACE(self):
3170 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3171 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3172
3173 @testRecvHopLimitCMSG_SPACE.client_skip
3174 def _testRecvHopLimitCMSG_SPACE(self):
3175 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3176 self.sendToServer(MSG)
3177
3178 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3179 # 3542 says portable applications must provide space for trailing
3180 # padding. Implementations may set MSG_CTRUNC if there isn't
3181 # enough space for the padding.
3182
3183 @requireAttrs(socket.socket, "sendmsg")
3184 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3185 def testSetHopLimit(self):
3186 # Test setting hop limit on outgoing packet and receiving it
3187 # at the other end.
3188 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3189
3190 @testSetHopLimit.client_skip
3191 def _testSetHopLimit(self):
3192 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3193 self.assertEqual(
3194 self.sendmsgToServer([MSG],
3195 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3196 array.array("i", [self.hop_limit]))]),
3197 len(MSG))
3198
3199 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3200 ignoreflags=0):
3201 # Receive traffic class and hop limit into ancbufsize bytes of
3202 # ancillary data space. Check that data is MSG, ancillary
3203 # data is not truncated (but ignore any flags in ignoreflags),
3204 # and traffic class and hop limit are in range (hop limit no
3205 # more than maxhop).
3206 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3207 socket.IPV6_RECVHOPLIMIT, 1)
3208 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3209 socket.IPV6_RECVTCLASS, 1)
3210 self.misc_event.set()
3211 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3212 len(MSG), ancbufsize)
3213
3214 self.assertEqual(msg, MSG)
3215 self.checkRecvmsgAddress(addr, self.cli_addr)
3216 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3217 ignore=ignoreflags)
3218 self.assertEqual(len(ancdata), 2)
3219 ancmap = self.ancillaryMapping(ancdata)
3220
3221 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3222 self.assertEqual(len(tcdata), SIZEOF_INT)
3223 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003224 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003225 self.assertGreaterEqual(a[0], 0)
3226 self.assertLessEqual(a[0], 255)
3227
3228 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3229 self.assertEqual(len(hldata), SIZEOF_INT)
3230 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003231 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003232 self.assertGreaterEqual(a[0], 0)
3233 self.assertLessEqual(a[0], maxhop)
3234
3235 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3236 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3237 def testRecvTrafficClassAndHopLimit(self):
3238 # Test receiving traffic class and hop limit as ancillary data.
3239 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3240
3241 @testRecvTrafficClassAndHopLimit.client_skip
3242 def _testRecvTrafficClassAndHopLimit(self):
3243 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3244 self.sendToServer(MSG)
3245
3246 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3247 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3248 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3249 # Test receiving traffic class and hop limit, using
3250 # CMSG_SPACE() to calculate buffer size.
3251 self.checkTrafficClassAndHopLimit(
3252 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3253
3254 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3255 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3256 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3257 self.sendToServer(MSG)
3258
3259 @requireAttrs(socket.socket, "sendmsg")
3260 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3261 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3262 def testSetTrafficClassAndHopLimit(self):
3263 # Test setting traffic class and hop limit on outgoing packet,
3264 # and receiving them at the other end.
3265 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3266 maxhop=self.hop_limit)
3267
3268 @testSetTrafficClassAndHopLimit.client_skip
3269 def _testSetTrafficClassAndHopLimit(self):
3270 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3271 self.assertEqual(
3272 self.sendmsgToServer([MSG],
3273 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3274 array.array("i", [self.traffic_class])),
3275 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3276 array.array("i", [self.hop_limit]))]),
3277 len(MSG))
3278
3279 @requireAttrs(socket.socket, "sendmsg")
3280 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3281 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3282 def testOddCmsgSize(self):
3283 # Try to send ancillary data with first item one byte too
3284 # long. Fall back to sending with correct size if this fails,
3285 # and check that second item was handled correctly.
3286 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3287 maxhop=self.hop_limit)
3288
3289 @testOddCmsgSize.client_skip
3290 def _testOddCmsgSize(self):
3291 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3292 try:
3293 nbytes = self.sendmsgToServer(
3294 [MSG],
3295 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003296 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003297 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3298 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003299 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003300 self.assertIsInstance(e.errno, int)
3301 nbytes = self.sendmsgToServer(
3302 [MSG],
3303 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3304 array.array("i", [self.traffic_class])),
3305 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3306 array.array("i", [self.hop_limit]))])
3307 self.assertEqual(nbytes, len(MSG))
3308
3309 # Tests for proper handling of truncated ancillary data
3310
3311 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3312 # Receive hop limit into ancbufsize bytes of ancillary data
3313 # space, which should be too small to contain the ancillary
3314 # data header (if ancbufsize is None, pass no second argument
3315 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3316 # (unless included in ignoreflags), and no ancillary data is
3317 # returned.
3318 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3319 socket.IPV6_RECVHOPLIMIT, 1)
3320 self.misc_event.set()
3321 args = () if ancbufsize is None else (ancbufsize,)
3322 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3323 len(MSG), *args)
3324
3325 self.assertEqual(msg, MSG)
3326 self.checkRecvmsgAddress(addr, self.cli_addr)
3327 self.assertEqual(ancdata, [])
3328 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3329 ignore=ignoreflags)
3330
3331 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3332 def testCmsgTruncNoBufSize(self):
3333 # Check that no ancillary data is received when no ancillary
3334 # buffer size is provided.
3335 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3336 # BSD seems to set
3337 # MSG_CTRUNC only if an item
3338 # has been partially
3339 # received.
3340 ignoreflags=socket.MSG_CTRUNC)
3341
3342 @testCmsgTruncNoBufSize.client_skip
3343 def _testCmsgTruncNoBufSize(self):
3344 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3345 self.sendToServer(MSG)
3346
3347 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3348 def testSingleCmsgTrunc0(self):
3349 # Check that no ancillary data is received when ancillary
3350 # buffer size is zero.
3351 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3352 ignoreflags=socket.MSG_CTRUNC)
3353
3354 @testSingleCmsgTrunc0.client_skip
3355 def _testSingleCmsgTrunc0(self):
3356 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3357 self.sendToServer(MSG)
3358
3359 # Check that no ancillary data is returned for various non-zero
3360 # (but still too small) buffer sizes.
3361
3362 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3363 def testSingleCmsgTrunc1(self):
3364 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3365
3366 @testSingleCmsgTrunc1.client_skip
3367 def _testSingleCmsgTrunc1(self):
3368 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3369 self.sendToServer(MSG)
3370
3371 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3372 def testSingleCmsgTrunc2Int(self):
3373 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3374
3375 @testSingleCmsgTrunc2Int.client_skip
3376 def _testSingleCmsgTrunc2Int(self):
3377 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3378 self.sendToServer(MSG)
3379
3380 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3381 def testSingleCmsgTruncLen0Minus1(self):
3382 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3383
3384 @testSingleCmsgTruncLen0Minus1.client_skip
3385 def _testSingleCmsgTruncLen0Minus1(self):
3386 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3387 self.sendToServer(MSG)
3388
3389 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3390 def testSingleCmsgTruncInData(self):
3391 # Test truncation of a control message inside its associated
3392 # data. The message may be returned with its data truncated,
3393 # or not returned at all.
3394 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3395 socket.IPV6_RECVHOPLIMIT, 1)
3396 self.misc_event.set()
3397 msg, ancdata, flags, addr = self.doRecvmsg(
3398 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3399
3400 self.assertEqual(msg, MSG)
3401 self.checkRecvmsgAddress(addr, self.cli_addr)
3402 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3403
3404 self.assertLessEqual(len(ancdata), 1)
3405 if ancdata:
3406 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3407 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3408 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3409 self.assertLess(len(cmsg_data), SIZEOF_INT)
3410
3411 @testSingleCmsgTruncInData.client_skip
3412 def _testSingleCmsgTruncInData(self):
3413 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3414 self.sendToServer(MSG)
3415
3416 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3417 # Receive traffic class and hop limit into ancbufsize bytes of
3418 # ancillary data space, which should be large enough to
3419 # contain the first item, but too small to contain the header
3420 # of the second. Check that data is MSG, MSG_CTRUNC is set
3421 # (unless included in ignoreflags), and only one ancillary
3422 # data item is returned.
3423 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3424 socket.IPV6_RECVHOPLIMIT, 1)
3425 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3426 socket.IPV6_RECVTCLASS, 1)
3427 self.misc_event.set()
3428 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3429 len(MSG), ancbufsize)
3430
3431 self.assertEqual(msg, MSG)
3432 self.checkRecvmsgAddress(addr, self.cli_addr)
3433 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3434 ignore=ignoreflags)
3435
3436 self.assertEqual(len(ancdata), 1)
3437 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3438 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3439 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3440 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3441 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003442 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003443 self.assertGreaterEqual(a[0], 0)
3444 self.assertLessEqual(a[0], 255)
3445
3446 # Try the above test with various buffer sizes.
3447
3448 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3449 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3450 def testSecondCmsgTrunc0(self):
3451 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3452 ignoreflags=socket.MSG_CTRUNC)
3453
3454 @testSecondCmsgTrunc0.client_skip
3455 def _testSecondCmsgTrunc0(self):
3456 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3457 self.sendToServer(MSG)
3458
3459 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3460 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3461 def testSecondCmsgTrunc1(self):
3462 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3463
3464 @testSecondCmsgTrunc1.client_skip
3465 def _testSecondCmsgTrunc1(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 testSecondCmsgTrunc2Int(self):
3472 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3473 2 * SIZEOF_INT)
3474
3475 @testSecondCmsgTrunc2Int.client_skip
3476 def _testSecondCmsgTrunc2Int(self):
3477 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3478 self.sendToServer(MSG)
3479
3480 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3481 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3482 def testSecondCmsgTruncLen0Minus1(self):
3483 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3484 socket.CMSG_LEN(0) - 1)
3485
3486 @testSecondCmsgTruncLen0Minus1.client_skip
3487 def _testSecondCmsgTruncLen0Minus1(self):
3488 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3489 self.sendToServer(MSG)
3490
3491 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3492 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3493 def testSecomdCmsgTruncInData(self):
3494 # Test truncation of the second of two control messages inside
3495 # its associated data.
3496 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3497 socket.IPV6_RECVHOPLIMIT, 1)
3498 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3499 socket.IPV6_RECVTCLASS, 1)
3500 self.misc_event.set()
3501 msg, ancdata, flags, addr = self.doRecvmsg(
3502 self.serv_sock, len(MSG),
3503 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3504
3505 self.assertEqual(msg, MSG)
3506 self.checkRecvmsgAddress(addr, self.cli_addr)
3507 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3508
3509 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3510
3511 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3512 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3513 cmsg_types.remove(cmsg_type)
3514 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3515 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003516 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003517 self.assertGreaterEqual(a[0], 0)
3518 self.assertLessEqual(a[0], 255)
3519
3520 if ancdata:
3521 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3522 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3523 cmsg_types.remove(cmsg_type)
3524 self.assertLess(len(cmsg_data), SIZEOF_INT)
3525
3526 self.assertEqual(ancdata, [])
3527
3528 @testSecomdCmsgTruncInData.client_skip
3529 def _testSecomdCmsgTruncInData(self):
3530 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3531 self.sendToServer(MSG)
3532
3533
3534# Derive concrete test classes for different socket types.
3535
3536class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3537 SendrecvmsgConnectionlessBase,
3538 ThreadedSocketTestMixin, UDPTestBase):
3539 pass
3540
3541@requireAttrs(socket.socket, "sendmsg")
3542@unittest.skipUnless(thread, 'Threading required for this test.')
3543class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3544 pass
3545
3546@requireAttrs(socket.socket, "recvmsg")
3547@unittest.skipUnless(thread, 'Threading required for this test.')
3548class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3549 pass
3550
3551@requireAttrs(socket.socket, "recvmsg_into")
3552@unittest.skipUnless(thread, 'Threading required for this test.')
3553class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3554 pass
3555
3556
3557class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3558 SendrecvmsgConnectionlessBase,
3559 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003560
3561 def checkRecvmsgAddress(self, addr1, addr2):
3562 # Called to compare the received address with the address of
3563 # the peer, ignoring scope ID
3564 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003565
3566@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003567@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003568@requireSocket("AF_INET6", "SOCK_DGRAM")
3569@unittest.skipUnless(thread, 'Threading required for this test.')
3570class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3571 pass
3572
3573@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003574@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003575@requireSocket("AF_INET6", "SOCK_DGRAM")
3576@unittest.skipUnless(thread, 'Threading required for this test.')
3577class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3578 pass
3579
3580@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003581@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003582@requireSocket("AF_INET6", "SOCK_DGRAM")
3583@unittest.skipUnless(thread, 'Threading required for this test.')
3584class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3585 pass
3586
3587@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003588@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003589@requireAttrs(socket, "IPPROTO_IPV6")
3590@requireSocket("AF_INET6", "SOCK_DGRAM")
3591@unittest.skipUnless(thread, 'Threading required for this test.')
3592class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3593 SendrecvmsgUDP6TestBase):
3594 pass
3595
3596@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003597@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003598@requireAttrs(socket, "IPPROTO_IPV6")
3599@requireSocket("AF_INET6", "SOCK_DGRAM")
3600@unittest.skipUnless(thread, 'Threading required for this test.')
3601class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3602 RFC3542AncillaryTest,
3603 SendrecvmsgUDP6TestBase):
3604 pass
3605
3606
3607class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3608 ConnectedStreamTestMixin, TCPTestBase):
3609 pass
3610
3611@requireAttrs(socket.socket, "sendmsg")
3612@unittest.skipUnless(thread, 'Threading required for this test.')
3613class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3614 pass
3615
3616@requireAttrs(socket.socket, "recvmsg")
3617@unittest.skipUnless(thread, 'Threading required for this test.')
3618class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3619 SendrecvmsgTCPTestBase):
3620 pass
3621
3622@requireAttrs(socket.socket, "recvmsg_into")
3623@unittest.skipUnless(thread, 'Threading required for this test.')
3624class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3625 SendrecvmsgTCPTestBase):
3626 pass
3627
3628
3629class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3630 SendrecvmsgConnectedBase,
3631 ConnectedStreamTestMixin, SCTPStreamBase):
3632 pass
3633
3634@requireAttrs(socket.socket, "sendmsg")
3635@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3636@unittest.skipUnless(thread, 'Threading required for this test.')
3637class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3638 pass
3639
3640@requireAttrs(socket.socket, "recvmsg")
3641@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3642@unittest.skipUnless(thread, 'Threading required for this test.')
3643class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3644 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003645
3646 def testRecvmsgEOF(self):
3647 try:
3648 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3649 except OSError as e:
3650 if e.errno != errno.ENOTCONN:
3651 raise
3652 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003653
3654@requireAttrs(socket.socket, "recvmsg_into")
3655@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3656@unittest.skipUnless(thread, 'Threading required for this test.')
3657class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3658 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003659
3660 def testRecvmsgEOF(self):
3661 try:
3662 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3663 except OSError as e:
3664 if e.errno != errno.ENOTCONN:
3665 raise
3666 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003667
3668
3669class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3670 ConnectedStreamTestMixin, UnixStreamBase):
3671 pass
3672
3673@requireAttrs(socket.socket, "sendmsg")
3674@requireAttrs(socket, "AF_UNIX")
3675@unittest.skipUnless(thread, 'Threading required for this test.')
3676class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3677 pass
3678
3679@requireAttrs(socket.socket, "recvmsg")
3680@requireAttrs(socket, "AF_UNIX")
3681@unittest.skipUnless(thread, 'Threading required for this test.')
3682class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3683 SendrecvmsgUnixStreamTestBase):
3684 pass
3685
3686@requireAttrs(socket.socket, "recvmsg_into")
3687@requireAttrs(socket, "AF_UNIX")
3688@unittest.skipUnless(thread, 'Threading required for this test.')
3689class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3690 SendrecvmsgUnixStreamTestBase):
3691 pass
3692
3693@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3694@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3695@unittest.skipUnless(thread, 'Threading required for this test.')
3696class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3697 pass
3698
3699@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3700@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3701@unittest.skipUnless(thread, 'Threading required for this test.')
3702class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3703 SendrecvmsgUnixStreamTestBase):
3704 pass
3705
3706
3707# Test interrupting the interruptible send/receive methods with a
3708# signal when a timeout is set. These tests avoid having multiple
3709# threads alive during the test so that the OS cannot deliver the
3710# signal to the wrong one.
3711
3712class InterruptedTimeoutBase(unittest.TestCase):
3713 # Base class for interrupted send/receive tests. Installs an
3714 # empty handler for SIGALRM and removes it on teardown, along with
3715 # any scheduled alarms.
3716
3717 def setUp(self):
3718 super().setUp()
3719 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003720 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003721 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3722 self.addCleanup(self.setAlarm, 0)
3723
3724 # Timeout for socket operations
3725 timeout = 4.0
3726
3727 # Provide setAlarm() method to schedule delivery of SIGALRM after
3728 # given number of seconds, or cancel it if zero, and an
3729 # appropriate time value to use. Use setitimer() if available.
3730 if hasattr(signal, "setitimer"):
3731 alarm_time = 0.05
3732
3733 def setAlarm(self, seconds):
3734 signal.setitimer(signal.ITIMER_REAL, seconds)
3735 else:
3736 # Old systems may deliver the alarm up to one second early
3737 alarm_time = 2
3738
3739 def setAlarm(self, seconds):
3740 signal.alarm(seconds)
3741
3742
3743# Require siginterrupt() in order to ensure that system calls are
3744# interrupted by default.
3745@requireAttrs(signal, "siginterrupt")
3746@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3747 "Don't have signal.alarm or signal.setitimer")
3748class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3749 # Test interrupting the recv*() methods with signals when a
3750 # timeout is set.
3751
3752 def setUp(self):
3753 super().setUp()
3754 self.serv.settimeout(self.timeout)
3755
3756 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003757 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003758 # errno of EINTR when interrupted by a signal.
3759 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003760 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003761 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003762
3763 def testInterruptedRecvTimeout(self):
3764 self.checkInterruptedRecv(self.serv.recv, 1024)
3765
3766 def testInterruptedRecvIntoTimeout(self):
3767 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3768
3769 def testInterruptedRecvfromTimeout(self):
3770 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3771
3772 def testInterruptedRecvfromIntoTimeout(self):
3773 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3774
3775 @requireAttrs(socket.socket, "recvmsg")
3776 def testInterruptedRecvmsgTimeout(self):
3777 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3778
3779 @requireAttrs(socket.socket, "recvmsg_into")
3780 def testInterruptedRecvmsgIntoTimeout(self):
3781 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3782
3783
3784# Require siginterrupt() in order to ensure that system calls are
3785# interrupted by default.
3786@requireAttrs(signal, "siginterrupt")
3787@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3788 "Don't have signal.alarm or signal.setitimer")
3789@unittest.skipUnless(thread, 'Threading required for this test.')
3790class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3791 ThreadSafeCleanupTestCase,
3792 SocketListeningTestMixin, TCPTestBase):
3793 # Test interrupting the interruptible send*() methods with signals
3794 # when a timeout is set.
3795
3796 def setUp(self):
3797 super().setUp()
3798 self.serv_conn = self.newSocket()
3799 self.addCleanup(self.serv_conn.close)
3800 # Use a thread to complete the connection, but wait for it to
3801 # terminate before running the test, so that there is only one
3802 # thread to accept the signal.
3803 cli_thread = threading.Thread(target=self.doConnect)
3804 cli_thread.start()
3805 self.cli_conn, addr = self.serv.accept()
3806 self.addCleanup(self.cli_conn.close)
3807 cli_thread.join()
3808 self.serv_conn.settimeout(self.timeout)
3809
3810 def doConnect(self):
3811 self.serv_conn.connect(self.serv_addr)
3812
3813 def checkInterruptedSend(self, func, *args, **kwargs):
3814 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003815 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003816 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003817 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003818 while True:
3819 self.setAlarm(self.alarm_time)
3820 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003821
Ned Deilyc5640382014-02-03 13:58:31 -08003822 # Issue #12958: The following tests have problems on OS X prior to 10.7
3823 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003824 def testInterruptedSendTimeout(self):
3825 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3826
Ned Deilyc5640382014-02-03 13:58:31 -08003827 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003828 def testInterruptedSendtoTimeout(self):
3829 # Passing an actual address here as Python's wrapper for
3830 # sendto() doesn't allow passing a zero-length one; POSIX
3831 # requires that the address is ignored since the socket is
3832 # connection-mode, however.
3833 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3834 self.serv_addr)
3835
Ned Deilyc5640382014-02-03 13:58:31 -08003836 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003837 @requireAttrs(socket.socket, "sendmsg")
3838 def testInterruptedSendmsgTimeout(self):
3839 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3840
3841
Victor Stinner45df8202010-04-28 22:31:17 +00003842@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003843class TCPCloserTest(ThreadedTCPSocketTest):
3844
3845 def testClose(self):
3846 conn, addr = self.serv.accept()
3847 conn.close()
3848
3849 sd = self.cli
3850 read, write, err = select.select([sd], [], [], 1.0)
3851 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003852 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003853
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003854 # Calling close() many times should be safe.
3855 conn.close()
3856 conn.close()
3857
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003858 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003859 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003860 time.sleep(1.0)
3861
Victor Stinner45df8202010-04-28 22:31:17 +00003862@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003863class BasicSocketPairTest(SocketPairTest):
3864
3865 def __init__(self, methodName='runTest'):
3866 SocketPairTest.__init__(self, methodName=methodName)
3867
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003868 def _check_defaults(self, sock):
3869 self.assertIsInstance(sock, socket.socket)
3870 if hasattr(socket, 'AF_UNIX'):
3871 self.assertEqual(sock.family, socket.AF_UNIX)
3872 else:
3873 self.assertEqual(sock.family, socket.AF_INET)
3874 self.assertEqual(sock.type, socket.SOCK_STREAM)
3875 self.assertEqual(sock.proto, 0)
3876
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003877 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003878 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003879
3880 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003881 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003882
Dave Cole331708b2004-08-09 04:51:41 +00003883 def testRecv(self):
3884 msg = self.serv.recv(1024)
3885 self.assertEqual(msg, MSG)
3886
3887 def _testRecv(self):
3888 self.cli.send(MSG)
3889
3890 def testSend(self):
3891 self.serv.send(MSG)
3892
3893 def _testSend(self):
3894 msg = self.cli.recv(1024)
3895 self.assertEqual(msg, MSG)
3896
Victor Stinner45df8202010-04-28 22:31:17 +00003897@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003898class NonBlockingTCPTests(ThreadedTCPSocketTest):
3899
3900 def __init__(self, methodName='runTest'):
3901 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3902
3903 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003904 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003905 self.serv.setblocking(True)
3906 self.assertIsNone(self.serv.gettimeout())
3907 self.serv.setblocking(False)
3908 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003909 start = time.time()
3910 try:
3911 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003912 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003913 pass
3914 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003915 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003916
3917 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003918 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003919
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003920 @support.cpython_only
3921 def testSetBlocking_overflow(self):
3922 # Issue 15989
3923 import _testcapi
3924 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3925 self.skipTest('needs UINT_MAX < ULONG_MAX')
3926 self.serv.setblocking(False)
3927 self.assertEqual(self.serv.gettimeout(), 0.0)
3928 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3929 self.assertIsNone(self.serv.gettimeout())
3930
3931 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3932
Serhiy Storchaka43767632013-11-03 21:31:38 +02003933 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3934 'test needs socket.SOCK_NONBLOCK')
3935 @support.requires_linux_version(2, 6, 28)
3936 def testInitNonBlocking(self):
3937 # reinit server socket
3938 self.serv.close()
3939 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3940 socket.SOCK_NONBLOCK)
3941 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003942 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003943 # actual testing
3944 start = time.time()
3945 try:
3946 self.serv.accept()
3947 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003948 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003949 end = time.time()
3950 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3951
3952 def _testInitNonBlocking(self):
3953 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003954
Antoine Pitrou600232b2011-01-05 21:03:42 +00003955 def testInheritFlags(self):
3956 # Issue #7995: when calling accept() on a listening socket with a
3957 # timeout, the resulting socket should not be non-blocking.
3958 self.serv.settimeout(10)
3959 try:
3960 conn, addr = self.serv.accept()
3961 message = conn.recv(len(MSG))
3962 finally:
3963 conn.close()
3964 self.serv.settimeout(None)
3965
3966 def _testInheritFlags(self):
3967 time.sleep(0.1)
3968 self.cli.connect((HOST, self.port))
3969 time.sleep(0.5)
3970 self.cli.send(MSG)
3971
Guido van Rossum24e4af82002-06-12 19:18:08 +00003972 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003973 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003974 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003975 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003976 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003977 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003978 pass
3979 else:
3980 self.fail("Error trying to do non-blocking accept.")
3981 read, write, err = select.select([self.serv], [], [])
3982 if self.serv in read:
3983 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07003984 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00003985 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003986 else:
3987 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003988
Guido van Rossum24e4af82002-06-12 19:18:08 +00003989 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003990 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003991 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003992
3993 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003994 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003995 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003996 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003997
3998 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003999 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00004000 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004001
4002 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004003 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004004 conn, addr = self.serv.accept()
4005 conn.setblocking(0)
4006 try:
4007 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02004008 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004009 pass
4010 else:
4011 self.fail("Error trying to do non-blocking recv.")
4012 read, write, err = select.select([conn], [], [])
4013 if conn in read:
4014 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004015 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00004016 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004017 else:
4018 self.fail("Error during select call to non-blocking socket.")
4019
4020 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004021 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004022 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004023 self.cli.send(MSG)
4024
Victor Stinner45df8202010-04-28 22:31:17 +00004025@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00004026class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004027 """Unit tests for the object returned by socket.makefile()
4028
Antoine Pitrou834bd812010-10-13 16:17:14 +00004029 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004030 the client connection. You can read from this file to
4031 get output from the server.
4032
Antoine Pitrou834bd812010-10-13 16:17:14 +00004033 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004034 server connection. You can write to this file to send output
4035 to the client.
4036 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004037
Guido van Rossume9f66142002-08-07 15:46:19 +00004038 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004039 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004040 errors = 'strict'
4041 newline = None
4042
4043 read_mode = 'rb'
4044 read_msg = MSG
4045 write_mode = 'wb'
4046 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004047
Guido van Rossum24e4af82002-06-12 19:18:08 +00004048 def __init__(self, methodName='runTest'):
4049 SocketConnectedTest.__init__(self, methodName=methodName)
4050
4051 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004052 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4053 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004054 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004055 self.read_file = self.cli_conn.makefile(
4056 self.read_mode, self.bufsize,
4057 encoding = self.encoding,
4058 errors = self.errors,
4059 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004060
4061 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004062 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004063 self.read_file.close()
4064 self.assertTrue(self.read_file.closed)
4065 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004066 SocketConnectedTest.tearDown(self)
4067
4068 def clientSetUp(self):
4069 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004070 self.write_file = self.serv_conn.makefile(
4071 self.write_mode, self.bufsize,
4072 encoding = self.encoding,
4073 errors = self.errors,
4074 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004075
4076 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004077 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004078 self.write_file.close()
4079 self.assertTrue(self.write_file.closed)
4080 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004081 SocketConnectedTest.clientTearDown(self)
4082
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004083 def testReadAfterTimeout(self):
4084 # Issue #7322: A file object must disallow further reads
4085 # after a timeout has occurred.
4086 self.cli_conn.settimeout(1)
4087 self.read_file.read(3)
4088 # First read raises a timeout
4089 self.assertRaises(socket.timeout, self.read_file.read, 1)
4090 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004091 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004092 self.read_file.read(1)
4093 self.assertIn("cannot read from timed out object", str(ctx.exception))
4094
4095 def _testReadAfterTimeout(self):
4096 self.write_file.write(self.write_msg[0:3])
4097 self.write_file.flush()
4098 self.serv_finished.wait()
4099
Guido van Rossum24e4af82002-06-12 19:18:08 +00004100 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004101 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004102 first_seg = self.read_file.read(len(self.read_msg)-3)
4103 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004104 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004105 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004106
4107 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004108 self.write_file.write(self.write_msg)
4109 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004110
Guido van Rossum8c943832002-08-08 01:00:28 +00004111 def testFullRead(self):
4112 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004113 msg = self.read_file.read()
4114 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004115
4116 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004117 self.write_file.write(self.write_msg)
4118 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004119
Guido van Rossum24e4af82002-06-12 19:18:08 +00004120 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004121 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004122 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004123 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004124 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004125 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004126 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004127 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004128 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004129
4130 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004131 self.write_file.write(self.write_msg)
4132 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004133
4134 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004135 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004136 line = self.read_file.readline()
4137 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004138
4139 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004140 self.write_file.write(self.write_msg)
4141 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004142
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004143 def testCloseAfterMakefile(self):
4144 # The file returned by makefile should keep the socket open.
4145 self.cli_conn.close()
4146 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004147 msg = self.read_file.read()
4148 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004149
4150 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004151 self.write_file.write(self.write_msg)
4152 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004153
4154 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004155 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004156 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004157 if isinstance(self.read_msg, str):
4158 msg = msg.decode()
4159 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004160
4161 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004162 self.write_file.write(self.write_msg)
4163 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004164
Tim Peters116d83c2004-03-28 02:20:45 +00004165 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004166 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004167
4168 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004169 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004170
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004171 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004172 self.assertEqual(self.read_file.mode, self.read_mode)
4173 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004174
4175 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004176 self.assertEqual(self.write_file.mode, self.write_mode)
4177 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004178
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004179 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004180 self.read_file.close()
4181 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004182 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004183 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004184
4185 def _testRealClose(self):
4186 pass
4187
4188
Guido van Rossume9f66142002-08-07 15:46:19 +00004189class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4190
4191 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004192
Guido van Rossume9f66142002-08-07 15:46:19 +00004193 In this case (and in this case only), it should be possible to
4194 create a file object, read a line from it, create another file
4195 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004196 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004197 when reading multiple requests from the same socket."""
4198
4199 bufsize = 0 # Use unbuffered mode
4200
4201 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004202 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004203 line = self.read_file.readline() # first line
4204 self.assertEqual(line, b"A. " + self.write_msg) # first line
4205 self.read_file = self.cli_conn.makefile('rb', 0)
4206 line = self.read_file.readline() # second line
4207 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004208
4209 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004210 self.write_file.write(b"A. " + self.write_msg)
4211 self.write_file.write(b"B. " + self.write_msg)
4212 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004213
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004214 def testMakefileClose(self):
4215 # The file returned by makefile should keep the socket open...
4216 self.cli_conn.close()
4217 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004218 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004219 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004220 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004221 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004222
4223 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004224 self.write_file.write(self.write_msg)
4225 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004226
4227 def testMakefileCloseSocketDestroy(self):
4228 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004229 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004230 refcount_after = sys.getrefcount(self.cli_conn)
4231 self.assertEqual(refcount_before - 1, refcount_after)
4232
4233 def _testMakefileCloseSocketDestroy(self):
4234 pass
4235
Antoine Pitrou98b46702010-09-18 22:59:00 +00004236 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004237 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004238 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4239
4240 def testSmallReadNonBlocking(self):
4241 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004242 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4243 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004244 self.evt1.set()
4245 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004246 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004247 if first_seg is None:
4248 # Data not arrived (can happen under Windows), wait a bit
4249 time.sleep(0.5)
4250 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004251 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004252 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004253 self.assertEqual(n, 3)
4254 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004255 self.assertEqual(msg, self.read_msg)
4256 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4257 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004258
4259 def _testSmallReadNonBlocking(self):
4260 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004261 self.write_file.write(self.write_msg)
4262 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004263 self.evt2.set()
4264 # Avoid cloding the socket before the server test has finished,
4265 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4266 self.serv_finished.wait(5.0)
4267
4268 def testWriteNonBlocking(self):
4269 self.cli_finished.wait(5.0)
4270 # The client thread can't skip directly - the SkipTest exception
4271 # would appear as a failure.
4272 if self.serv_skipped:
4273 self.skipTest(self.serv_skipped)
4274
4275 def _testWriteNonBlocking(self):
4276 self.serv_skipped = None
4277 self.serv_conn.setblocking(False)
4278 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004279 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004280 LIMIT = 10
4281 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004282 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004283 self.assertGreater(n, 0)
4284 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004285 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004286 if n is None:
4287 # Succeeded
4288 break
4289 self.assertGreater(n, 0)
4290 else:
4291 # Let us know that this test didn't manage to establish
4292 # the expected conditions. This is not a failure in itself but,
4293 # if it happens repeatedly, the test should be fixed.
4294 self.serv_skipped = "failed to saturate the socket buffer"
4295
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004296
Guido van Rossum8c943832002-08-08 01:00:28 +00004297class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4298
4299 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4300
4301
4302class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4303
4304 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004305
Thomas Woutersb2137042007-02-01 18:02:27 +00004306
Antoine Pitrou834bd812010-10-13 16:17:14 +00004307class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4308 """Tests for socket.makefile() in text mode (rather than binary)"""
4309
4310 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004311 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004312 write_mode = 'wb'
4313 write_msg = MSG
4314 newline = ''
4315
4316
4317class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4318 """Tests for socket.makefile() in text mode (rather than binary)"""
4319
4320 read_mode = 'rb'
4321 read_msg = MSG
4322 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004323 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004324 newline = ''
4325
4326
4327class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4328 """Tests for socket.makefile() in text mode (rather than binary)"""
4329
4330 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004331 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004332 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004333 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004334 newline = ''
4335
4336
Guido van Rossumd8faa362007-04-27 19:54:29 +00004337class NetworkConnectionTest(object):
4338 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004339
Guido van Rossumd8faa362007-04-27 19:54:29 +00004340 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004341 # We're inherited below by BasicTCPTest2, which also inherits
4342 # BasicTCPTest, which defines self.port referenced below.
4343 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004344 self.serv_conn = self.cli
4345
4346class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4347 """Tests that NetworkConnection does not break existing TCP functionality.
4348 """
4349
4350class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004351
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004352 class MockSocket(socket.socket):
4353 def connect(self, *args):
4354 raise socket.timeout('timed out')
4355
4356 @contextlib.contextmanager
4357 def mocked_socket_module(self):
4358 """Return a socket which times out on connect"""
4359 old_socket = socket.socket
4360 socket.socket = self.MockSocket
4361 try:
4362 yield
4363 finally:
4364 socket.socket = old_socket
4365
4366 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004367 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004368 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004369 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004370 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004371 cli.connect((HOST, port))
4372 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4373
4374 def test_create_connection(self):
4375 # Issue #9792: errors raised by create_connection() should have
4376 # a proper errno attribute.
4377 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004378 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004379 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004380
4381 # Issue #16257: create_connection() calls getaddrinfo() against
4382 # 'localhost'. This may result in an IPV6 addr being returned
4383 # as well as an IPV4 one:
4384 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4385 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4386 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4387 #
4388 # create_connection() enumerates through all the addresses returned
4389 # and if it doesn't successfully bind to any of them, it propagates
4390 # the last exception it encountered.
4391 #
4392 # On Solaris, ENETUNREACH is returned in this circumstance instead
4393 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4394 # expected errnos.
4395 expected_errnos = [ errno.ECONNREFUSED, ]
4396 if hasattr(errno, 'ENETUNREACH'):
4397 expected_errnos.append(errno.ENETUNREACH)
4398
4399 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004400
4401 def test_create_connection_timeout(self):
4402 # Issue #9792: create_connection() should not recast timeout errors
4403 # as generic socket errors.
4404 with self.mocked_socket_module():
4405 with self.assertRaises(socket.timeout):
4406 socket.create_connection((HOST, 1234))
4407
Guido van Rossumd8faa362007-04-27 19:54:29 +00004408
Victor Stinner45df8202010-04-28 22:31:17 +00004409@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004410class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4411
4412 def __init__(self, methodName='runTest'):
4413 SocketTCPTest.__init__(self, methodName=methodName)
4414 ThreadableTest.__init__(self)
4415
4416 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004417 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004418
4419 def clientTearDown(self):
4420 self.cli.close()
4421 self.cli = None
4422 ThreadableTest.clientTearDown(self)
4423
4424 def _justAccept(self):
4425 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004426 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004427
4428 testFamily = _justAccept
4429 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004430 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004431 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004432 self.assertEqual(self.cli.family, 2)
4433
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004434 testSourceAddress = _justAccept
4435 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004436 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4437 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004438 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004439 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004440 # The port number being used is sufficient to show that the bind()
4441 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004442
Guido van Rossumd8faa362007-04-27 19:54:29 +00004443 testTimeoutDefault = _justAccept
4444 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004445 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004446 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004447 socket.setdefaulttimeout(42)
4448 try:
4449 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004450 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004451 finally:
4452 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004453 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004454
4455 testTimeoutNone = _justAccept
4456 def _testTimeoutNone(self):
4457 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004458 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004459 socket.setdefaulttimeout(30)
4460 try:
4461 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004462 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004463 finally:
4464 socket.setdefaulttimeout(None)
4465 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004466
4467 testTimeoutValueNamed = _justAccept
4468 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004469 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004470 self.assertEqual(self.cli.gettimeout(), 30)
4471
4472 testTimeoutValueNonamed = _justAccept
4473 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004474 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004475 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004476 self.assertEqual(self.cli.gettimeout(), 30)
4477
Victor Stinner45df8202010-04-28 22:31:17 +00004478@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004479class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4480
4481 def __init__(self, methodName='runTest'):
4482 SocketTCPTest.__init__(self, methodName=methodName)
4483 ThreadableTest.__init__(self)
4484
4485 def clientSetUp(self):
4486 pass
4487
4488 def clientTearDown(self):
4489 self.cli.close()
4490 self.cli = None
4491 ThreadableTest.clientTearDown(self)
4492
4493 def testInsideTimeout(self):
4494 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004495 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004496 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004497 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004498 testOutsideTimeout = testInsideTimeout
4499
4500 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004501 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004502 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004503 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004504
4505 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004506 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004507 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004508
4509
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004510class TCPTimeoutTest(SocketTCPTest):
4511
4512 def testTCPTimeout(self):
4513 def raise_timeout(*args, **kwargs):
4514 self.serv.settimeout(1.0)
4515 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004516 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004517 "Error generating a timeout exception (TCP)")
4518
4519 def testTimeoutZero(self):
4520 ok = False
4521 try:
4522 self.serv.settimeout(0.0)
4523 foo = self.serv.accept()
4524 except socket.timeout:
4525 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004526 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004527 ok = True
4528 except:
4529 self.fail("caught unexpected exception (TCP)")
4530 if not ok:
4531 self.fail("accept() returned success when we did not expect it")
4532
Serhiy Storchaka43767632013-11-03 21:31:38 +02004533 @unittest.skipUnless(hasattr(signal, 'alarm'),
4534 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004535 def testInterruptedTimeout(self):
4536 # XXX I don't know how to do this test on MSWindows or any other
4537 # plaform that doesn't support signal.alarm() or os.kill(), though
4538 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004539 self.serv.settimeout(5.0) # must be longer than alarm
4540 class Alarm(Exception):
4541 pass
4542 def alarm_handler(signal, frame):
4543 raise Alarm
4544 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4545 try:
4546 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4547 try:
4548 foo = self.serv.accept()
4549 except socket.timeout:
4550 self.fail("caught timeout instead of Alarm")
4551 except Alarm:
4552 pass
4553 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004554 self.fail("caught other exception instead of Alarm:"
4555 " %s(%s):\n%s" %
4556 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004557 else:
4558 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004559 finally:
4560 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004561 except Alarm:
4562 self.fail("got Alarm in wrong place")
4563 finally:
4564 # no alarm can be pending. Safe to restore old handler.
4565 signal.signal(signal.SIGALRM, old_alarm)
4566
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004567class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004568
4569 def testUDPTimeout(self):
4570 def raise_timeout(*args, **kwargs):
4571 self.serv.settimeout(1.0)
4572 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004573 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004574 "Error generating a timeout exception (UDP)")
4575
4576 def testTimeoutZero(self):
4577 ok = False
4578 try:
4579 self.serv.settimeout(0.0)
4580 foo = self.serv.recv(1024)
4581 except socket.timeout:
4582 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004583 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004584 ok = True
4585 except:
4586 self.fail("caught unexpected exception (UDP)")
4587 if not ok:
4588 self.fail("recv() returned success when we did not expect it")
4589
4590class TestExceptions(unittest.TestCase):
4591
4592 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004593 self.assertTrue(issubclass(OSError, Exception))
4594 self.assertTrue(issubclass(socket.herror, OSError))
4595 self.assertTrue(issubclass(socket.gaierror, OSError))
4596 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004597
Yury Selivanovfa22b292016-10-18 16:03:52 -04004598 def test_setblocking_invalidfd(self):
4599 # Regression test for issue #28471
4600
4601 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4602 sock = socket.socket(
4603 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4604 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004605 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004606
4607 with self.assertRaises(OSError):
4608 sock.setblocking(False)
4609
4610
Serhiy Storchaka43767632013-11-03 21:31:38 +02004611@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004612class TestLinuxAbstractNamespace(unittest.TestCase):
4613
4614 UNIX_PATH_MAX = 108
4615
4616 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004617 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004618 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4619 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004620 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004621 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4622 s2.connect(s1.getsockname())
4623 with s1.accept()[0] as s3:
4624 self.assertEqual(s1.getsockname(), address)
4625 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004626
4627 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004628 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004629 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4630 s.bind(address)
4631 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004632
4633 def testNameOverflow(self):
4634 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004635 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004636 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004637
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004638 def testStrName(self):
4639 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004640 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4641 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004642 s.bind("\x00python\x00test\x00")
4643 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004644 finally:
4645 s.close()
4646
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004647 def testBytearrayName(self):
4648 # Check that an abstract name can be passed as a bytearray.
4649 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4650 s.bind(bytearray(b"\x00python\x00test\x00"))
4651 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4652
Serhiy Storchaka43767632013-11-03 21:31:38 +02004653@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004654class TestUnixDomain(unittest.TestCase):
4655
4656 def setUp(self):
4657 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4658
4659 def tearDown(self):
4660 self.sock.close()
4661
4662 def encoded(self, path):
4663 # Return the given path encoded in the file system encoding,
4664 # or skip the test if this is not possible.
4665 try:
4666 return os.fsencode(path)
4667 except UnicodeEncodeError:
4668 self.skipTest(
4669 "Pathname {0!a} cannot be represented in file "
4670 "system encoding {1!r}".format(
4671 path, sys.getfilesystemencoding()))
4672
Antoine Pitrou16374872011-12-16 15:04:12 +01004673 def bind(self, sock, path):
4674 # Bind the socket
4675 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004676 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004677 except OSError as e:
4678 if str(e) == "AF_UNIX path too long":
4679 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004680 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004681 .format(path))
4682 else:
4683 raise
4684
Antoine Pitrou495b5022017-05-02 17:20:00 +02004685 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02004686 # Issue #30205 (note getsockname() can return None on OS X)
4687 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02004688
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004689 def testStrAddr(self):
4690 # Test binding to and retrieving a normal string pathname.
4691 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004692 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004693 self.addCleanup(support.unlink, path)
4694 self.assertEqual(self.sock.getsockname(), path)
4695
4696 def testBytesAddr(self):
4697 # Test binding to a bytes pathname.
4698 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004699 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004700 self.addCleanup(support.unlink, path)
4701 self.assertEqual(self.sock.getsockname(), path)
4702
4703 def testSurrogateescapeBind(self):
4704 # Test binding to a valid non-ASCII pathname, with the
4705 # non-ASCII bytes supplied using surrogateescape encoding.
4706 path = os.path.abspath(support.TESTFN_UNICODE)
4707 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004708 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004709 self.addCleanup(support.unlink, path)
4710 self.assertEqual(self.sock.getsockname(), path)
4711
4712 def testUnencodableAddr(self):
4713 # Test binding to a pathname that cannot be encoded in the
4714 # file system encoding.
4715 if support.TESTFN_UNENCODABLE is None:
4716 self.skipTest("No unencodable filename available")
4717 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004718 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004719 self.addCleanup(support.unlink, path)
4720 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004721
Victor Stinner45df8202010-04-28 22:31:17 +00004722@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004723class BufferIOTest(SocketConnectedTest):
4724 """
4725 Test the buffer versions of socket.recv() and socket.send().
4726 """
4727 def __init__(self, methodName='runTest'):
4728 SocketConnectedTest.__init__(self, methodName=methodName)
4729
Antoine Pitrou25480782010-03-17 22:50:28 +00004730 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004731 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004732 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004733 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004734 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004735 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004736 self.assertEqual(msg, MSG)
4737
Antoine Pitrou25480782010-03-17 22:50:28 +00004738 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004739 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004740 self.serv_conn.send(buf)
4741
Antoine Pitrou25480782010-03-17 22:50:28 +00004742 def testRecvIntoBytearray(self):
4743 buf = bytearray(1024)
4744 nbytes = self.cli_conn.recv_into(buf)
4745 self.assertEqual(nbytes, len(MSG))
4746 msg = buf[:len(MSG)]
4747 self.assertEqual(msg, MSG)
4748
4749 _testRecvIntoBytearray = _testRecvIntoArray
4750
4751 def testRecvIntoMemoryview(self):
4752 buf = bytearray(1024)
4753 nbytes = self.cli_conn.recv_into(memoryview(buf))
4754 self.assertEqual(nbytes, len(MSG))
4755 msg = buf[:len(MSG)]
4756 self.assertEqual(msg, MSG)
4757
4758 _testRecvIntoMemoryview = _testRecvIntoArray
4759
4760 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004761 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004762 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004763 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004764 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004765 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004766 self.assertEqual(msg, MSG)
4767
Antoine Pitrou25480782010-03-17 22:50:28 +00004768 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004769 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004770 self.serv_conn.send(buf)
4771
Antoine Pitrou25480782010-03-17 22:50:28 +00004772 def testRecvFromIntoBytearray(self):
4773 buf = bytearray(1024)
4774 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4775 self.assertEqual(nbytes, len(MSG))
4776 msg = buf[:len(MSG)]
4777 self.assertEqual(msg, MSG)
4778
4779 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4780
4781 def testRecvFromIntoMemoryview(self):
4782 buf = bytearray(1024)
4783 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4784 self.assertEqual(nbytes, len(MSG))
4785 msg = buf[:len(MSG)]
4786 self.assertEqual(msg, MSG)
4787
4788 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4789
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004790 def testRecvFromIntoSmallBuffer(self):
4791 # See issue #20246.
4792 buf = bytearray(8)
4793 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4794
4795 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004796 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004797
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004798 def testRecvFromIntoEmptyBuffer(self):
4799 buf = bytearray()
4800 self.cli_conn.recvfrom_into(buf)
4801 self.cli_conn.recvfrom_into(buf, 0)
4802
4803 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4804
Christian Heimes043d6f62008-01-07 17:19:16 +00004805
4806TIPC_STYPE = 2000
4807TIPC_LOWER = 200
4808TIPC_UPPER = 210
4809
4810def isTipcAvailable():
4811 """Check if the TIPC module is loaded
4812
4813 The TIPC module is not loaded automatically on Ubuntu and probably
4814 other Linux distros.
4815 """
4816 if not hasattr(socket, "AF_TIPC"):
4817 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004818 try:
4819 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00004820 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00004821 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00004822 # have not the permission to read it.
4823 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004824 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00004825 for line in f:
4826 if line.startswith("tipc "):
4827 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004828 return False
4829
Serhiy Storchaka43767632013-11-03 21:31:38 +02004830@unittest.skipUnless(isTipcAvailable(),
4831 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004832class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004833 def testRDM(self):
4834 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4835 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004836 self.addCleanup(srv.close)
4837 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004838
4839 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4840 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4841 TIPC_LOWER, TIPC_UPPER)
4842 srv.bind(srvaddr)
4843
4844 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4845 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4846 cli.sendto(MSG, sendaddr)
4847
4848 msg, recvaddr = srv.recvfrom(1024)
4849
4850 self.assertEqual(cli.getsockname(), recvaddr)
4851 self.assertEqual(msg, MSG)
4852
4853
Serhiy Storchaka43767632013-11-03 21:31:38 +02004854@unittest.skipUnless(isTipcAvailable(),
4855 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004856class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004857 def __init__(self, methodName = 'runTest'):
4858 unittest.TestCase.__init__(self, methodName = methodName)
4859 ThreadableTest.__init__(self)
4860
4861 def setUp(self):
4862 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004863 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004864 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4865 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4866 TIPC_LOWER, TIPC_UPPER)
4867 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004868 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004869 self.serverExplicitReady()
4870 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004871 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004872
4873 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00004874 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00004875 # accept() call; sleep a little while to avoid it, otherwise
4876 # we could get an exception
4877 time.sleep(0.1)
4878 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004879 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004880 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4881 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4882 self.cli.connect(addr)
4883 self.cliaddr = self.cli.getsockname()
4884
4885 def testStream(self):
4886 msg = self.conn.recv(1024)
4887 self.assertEqual(msg, MSG)
4888 self.assertEqual(self.cliaddr, self.connaddr)
4889
4890 def _testStream(self):
4891 self.cli.send(MSG)
4892 self.cli.close()
4893
4894
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004895@unittest.skipUnless(thread, 'Threading required for this test.')
4896class ContextManagersTest(ThreadedTCPSocketTest):
4897
4898 def _testSocketClass(self):
4899 # base test
4900 with socket.socket() as sock:
4901 self.assertFalse(sock._closed)
4902 self.assertTrue(sock._closed)
4903 # close inside with block
4904 with socket.socket() as sock:
4905 sock.close()
4906 self.assertTrue(sock._closed)
4907 # exception inside with block
4908 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004909 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004910 self.assertTrue(sock._closed)
4911
4912 def testCreateConnectionBase(self):
4913 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004914 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004915 data = conn.recv(1024)
4916 conn.sendall(data)
4917
4918 def _testCreateConnectionBase(self):
4919 address = self.serv.getsockname()
4920 with socket.create_connection(address) as sock:
4921 self.assertFalse(sock._closed)
4922 sock.sendall(b'foo')
4923 self.assertEqual(sock.recv(1024), b'foo')
4924 self.assertTrue(sock._closed)
4925
4926 def testCreateConnectionClose(self):
4927 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004928 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004929 data = conn.recv(1024)
4930 conn.sendall(data)
4931
4932 def _testCreateConnectionClose(self):
4933 address = self.serv.getsockname()
4934 with socket.create_connection(address) as sock:
4935 sock.close()
4936 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004937 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004938
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004939
Victor Stinnerdaf45552013-08-28 00:53:59 +02004940class InheritanceTest(unittest.TestCase):
4941 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4942 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004943 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004944 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004945 with socket.socket(socket.AF_INET,
4946 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4947 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004948 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004949
4950 def test_default_inheritable(self):
4951 sock = socket.socket()
4952 with sock:
4953 self.assertEqual(sock.get_inheritable(), False)
4954
4955 def test_dup(self):
4956 sock = socket.socket()
4957 with sock:
4958 newsock = sock.dup()
4959 sock.close()
4960 with newsock:
4961 self.assertEqual(newsock.get_inheritable(), False)
4962
4963 def test_set_inheritable(self):
4964 sock = socket.socket()
4965 with sock:
4966 sock.set_inheritable(True)
4967 self.assertEqual(sock.get_inheritable(), True)
4968
4969 sock.set_inheritable(False)
4970 self.assertEqual(sock.get_inheritable(), False)
4971
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004972 @unittest.skipIf(fcntl is None, "need fcntl")
4973 def test_get_inheritable_cloexec(self):
4974 sock = socket.socket()
4975 with sock:
4976 fd = sock.fileno()
4977 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004978
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004979 # clear FD_CLOEXEC flag
4980 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4981 flags &= ~fcntl.FD_CLOEXEC
4982 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004983
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004984 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004985
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004986 @unittest.skipIf(fcntl is None, "need fcntl")
4987 def test_set_inheritable_cloexec(self):
4988 sock = socket.socket()
4989 with sock:
4990 fd = sock.fileno()
4991 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4992 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004993
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004994 sock.set_inheritable(True)
4995 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4996 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004997
4998
Victor Stinnerdaf45552013-08-28 00:53:59 +02004999 @unittest.skipUnless(hasattr(socket, "socketpair"),
5000 "need socket.socketpair()")
5001 def test_socketpair(self):
5002 s1, s2 = socket.socketpair()
5003 self.addCleanup(s1.close)
5004 self.addCleanup(s2.close)
5005 self.assertEqual(s1.get_inheritable(), False)
5006 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005007
5008
5009@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5010 "SOCK_NONBLOCK not defined")
5011class NonblockConstantTest(unittest.TestCase):
5012 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5013 if nonblock:
5014 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
5015 self.assertEqual(s.gettimeout(), timeout)
5016 else:
5017 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
5018 self.assertEqual(s.gettimeout(), None)
5019
Charles-François Natali239bb962011-06-03 12:55:15 +02005020 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005021 def test_SOCK_NONBLOCK(self):
5022 # a lot of it seems silly and redundant, but I wanted to test that
5023 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005024 with socket.socket(socket.AF_INET,
5025 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5026 self.checkNonblock(s)
5027 s.setblocking(1)
5028 self.checkNonblock(s, False)
5029 s.setblocking(0)
5030 self.checkNonblock(s)
5031 s.settimeout(None)
5032 self.checkNonblock(s, False)
5033 s.settimeout(2.0)
5034 self.checkNonblock(s, timeout=2.0)
5035 s.setblocking(1)
5036 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005037 # defaulttimeout
5038 t = socket.getdefaulttimeout()
5039 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005040 with socket.socket() as s:
5041 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005042 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005043 with socket.socket() as s:
5044 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005045 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005046 with socket.socket() as s:
5047 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005048 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005049 with socket.socket() as s:
5050 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005051 socket.setdefaulttimeout(t)
5052
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005053
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005054@unittest.skipUnless(os.name == "nt", "Windows specific")
5055@unittest.skipUnless(multiprocessing, "need multiprocessing")
5056class TestSocketSharing(SocketTCPTest):
5057 # This must be classmethod and not staticmethod or multiprocessing
5058 # won't be able to bootstrap it.
5059 @classmethod
5060 def remoteProcessServer(cls, q):
5061 # Recreate socket from shared data
5062 sdata = q.get()
5063 message = q.get()
5064
5065 s = socket.fromshare(sdata)
5066 s2, c = s.accept()
5067
5068 # Send the message
5069 s2.sendall(message)
5070 s2.close()
5071 s.close()
5072
5073 def testShare(self):
5074 # Transfer the listening server socket to another process
5075 # and service it from there.
5076
5077 # Create process:
5078 q = multiprocessing.Queue()
5079 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5080 p.start()
5081
5082 # Get the shared socket data
5083 data = self.serv.share(p.pid)
5084
5085 # Pass the shared socket to the other process
5086 addr = self.serv.getsockname()
5087 self.serv.close()
5088 q.put(data)
5089
5090 # The data that the server will send us
5091 message = b"slapmahfro"
5092 q.put(message)
5093
5094 # Connect
5095 s = socket.create_connection(addr)
5096 # listen for the data
5097 m = []
5098 while True:
5099 data = s.recv(100)
5100 if not data:
5101 break
5102 m.append(data)
5103 s.close()
5104 received = b"".join(m)
5105 self.assertEqual(received, message)
5106 p.join()
5107
5108 def testShareLength(self):
5109 data = self.serv.share(os.getpid())
5110 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5111 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5112
5113 def compareSockets(self, org, other):
5114 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005115 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005116 self.assertEqual(org.gettimeout(), None)
5117 self.assertEqual(org.gettimeout(), other.gettimeout())
5118
5119 self.assertEqual(org.family, other.family)
5120 self.assertEqual(org.type, other.type)
5121 # If the user specified "0" for proto, then
5122 # internally windows will have picked the correct value.
5123 # Python introspection on the socket however will still return
5124 # 0. For the shared socket, the python value is recreated
5125 # from the actual value, so it may not compare correctly.
5126 if org.proto != 0:
5127 self.assertEqual(org.proto, other.proto)
5128
5129 def testShareLocal(self):
5130 data = self.serv.share(os.getpid())
5131 s = socket.fromshare(data)
5132 try:
5133 self.compareSockets(self.serv, s)
5134 finally:
5135 s.close()
5136
5137 def testTypes(self):
5138 families = [socket.AF_INET, socket.AF_INET6]
5139 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5140 for f in families:
5141 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005142 try:
5143 source = socket.socket(f, t)
5144 except OSError:
5145 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005146 try:
5147 data = source.share(os.getpid())
5148 shared = socket.fromshare(data)
5149 try:
5150 self.compareSockets(source, shared)
5151 finally:
5152 shared.close()
5153 finally:
5154 source.close()
5155
5156
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005157@unittest.skipUnless(thread, 'Threading required for this test.')
5158class SendfileUsingSendTest(ThreadedTCPSocketTest):
5159 """
5160 Test the send() implementation of socket.sendfile().
5161 """
5162
5163 FILESIZE = (10 * 1024 * 1024) # 10MB
5164 BUFSIZE = 8192
5165 FILEDATA = b""
5166 TIMEOUT = 2
5167
5168 @classmethod
5169 def setUpClass(cls):
5170 def chunks(total, step):
5171 assert total >= step
5172 while total > step:
5173 yield step
5174 total -= step
5175 if total:
5176 yield total
5177
5178 chunk = b"".join([random.choice(string.ascii_letters).encode()
5179 for i in range(cls.BUFSIZE)])
5180 with open(support.TESTFN, 'wb') as f:
5181 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5182 f.write(chunk)
5183 with open(support.TESTFN, 'rb') as f:
5184 cls.FILEDATA = f.read()
5185 assert len(cls.FILEDATA) == cls.FILESIZE
5186
5187 @classmethod
5188 def tearDownClass(cls):
5189 support.unlink(support.TESTFN)
5190
5191 def accept_conn(self):
5192 self.serv.settimeout(self.TIMEOUT)
5193 conn, addr = self.serv.accept()
5194 conn.settimeout(self.TIMEOUT)
5195 self.addCleanup(conn.close)
5196 return conn
5197
5198 def recv_data(self, conn):
5199 received = []
5200 while True:
5201 chunk = conn.recv(self.BUFSIZE)
5202 if not chunk:
5203 break
5204 received.append(chunk)
5205 return b''.join(received)
5206
5207 def meth_from_sock(self, sock):
5208 # Depending on the mixin class being run return either send()
5209 # or sendfile() method implementation.
5210 return getattr(sock, "_sendfile_use_send")
5211
5212 # regular file
5213
5214 def _testRegularFile(self):
5215 address = self.serv.getsockname()
5216 file = open(support.TESTFN, 'rb')
5217 with socket.create_connection(address) as sock, file as file:
5218 meth = self.meth_from_sock(sock)
5219 sent = meth(file)
5220 self.assertEqual(sent, self.FILESIZE)
5221 self.assertEqual(file.tell(), self.FILESIZE)
5222
5223 def testRegularFile(self):
5224 conn = self.accept_conn()
5225 data = self.recv_data(conn)
5226 self.assertEqual(len(data), self.FILESIZE)
5227 self.assertEqual(data, self.FILEDATA)
5228
5229 # non regular file
5230
5231 def _testNonRegularFile(self):
5232 address = self.serv.getsockname()
5233 file = io.BytesIO(self.FILEDATA)
5234 with socket.create_connection(address) as sock, file as file:
5235 sent = sock.sendfile(file)
5236 self.assertEqual(sent, self.FILESIZE)
5237 self.assertEqual(file.tell(), self.FILESIZE)
5238 self.assertRaises(socket._GiveupOnSendfile,
5239 sock._sendfile_use_sendfile, file)
5240
5241 def testNonRegularFile(self):
5242 conn = self.accept_conn()
5243 data = self.recv_data(conn)
5244 self.assertEqual(len(data), self.FILESIZE)
5245 self.assertEqual(data, self.FILEDATA)
5246
5247 # empty file
5248
5249 def _testEmptyFileSend(self):
5250 address = self.serv.getsockname()
5251 filename = support.TESTFN + "2"
5252 with open(filename, 'wb'):
5253 self.addCleanup(support.unlink, filename)
5254 file = open(filename, 'rb')
5255 with socket.create_connection(address) as sock, file as file:
5256 meth = self.meth_from_sock(sock)
5257 sent = meth(file)
5258 self.assertEqual(sent, 0)
5259 self.assertEqual(file.tell(), 0)
5260
5261 def testEmptyFileSend(self):
5262 conn = self.accept_conn()
5263 data = self.recv_data(conn)
5264 self.assertEqual(data, b"")
5265
5266 # offset
5267
5268 def _testOffset(self):
5269 address = self.serv.getsockname()
5270 file = open(support.TESTFN, 'rb')
5271 with socket.create_connection(address) as sock, file as file:
5272 meth = self.meth_from_sock(sock)
5273 sent = meth(file, offset=5000)
5274 self.assertEqual(sent, self.FILESIZE - 5000)
5275 self.assertEqual(file.tell(), self.FILESIZE)
5276
5277 def testOffset(self):
5278 conn = self.accept_conn()
5279 data = self.recv_data(conn)
5280 self.assertEqual(len(data), self.FILESIZE - 5000)
5281 self.assertEqual(data, self.FILEDATA[5000:])
5282
5283 # count
5284
5285 def _testCount(self):
5286 address = self.serv.getsockname()
5287 file = open(support.TESTFN, 'rb')
5288 with socket.create_connection(address, timeout=2) as sock, file as file:
5289 count = 5000007
5290 meth = self.meth_from_sock(sock)
5291 sent = meth(file, count=count)
5292 self.assertEqual(sent, count)
5293 self.assertEqual(file.tell(), count)
5294
5295 def testCount(self):
5296 count = 5000007
5297 conn = self.accept_conn()
5298 data = self.recv_data(conn)
5299 self.assertEqual(len(data), count)
5300 self.assertEqual(data, self.FILEDATA[:count])
5301
5302 # count small
5303
5304 def _testCountSmall(self):
5305 address = self.serv.getsockname()
5306 file = open(support.TESTFN, 'rb')
5307 with socket.create_connection(address, timeout=2) as sock, file as file:
5308 count = 1
5309 meth = self.meth_from_sock(sock)
5310 sent = meth(file, count=count)
5311 self.assertEqual(sent, count)
5312 self.assertEqual(file.tell(), count)
5313
5314 def testCountSmall(self):
5315 count = 1
5316 conn = self.accept_conn()
5317 data = self.recv_data(conn)
5318 self.assertEqual(len(data), count)
5319 self.assertEqual(data, self.FILEDATA[:count])
5320
5321 # count + offset
5322
5323 def _testCountWithOffset(self):
5324 address = self.serv.getsockname()
5325 file = open(support.TESTFN, 'rb')
5326 with socket.create_connection(address, timeout=2) as sock, file as file:
5327 count = 100007
5328 meth = self.meth_from_sock(sock)
5329 sent = meth(file, offset=2007, count=count)
5330 self.assertEqual(sent, count)
5331 self.assertEqual(file.tell(), count + 2007)
5332
5333 def testCountWithOffset(self):
5334 count = 100007
5335 conn = self.accept_conn()
5336 data = self.recv_data(conn)
5337 self.assertEqual(len(data), count)
5338 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5339
5340 # non blocking sockets are not supposed to work
5341
5342 def _testNonBlocking(self):
5343 address = self.serv.getsockname()
5344 file = open(support.TESTFN, 'rb')
5345 with socket.create_connection(address) as sock, file as file:
5346 sock.setblocking(False)
5347 meth = self.meth_from_sock(sock)
5348 self.assertRaises(ValueError, meth, file)
5349 self.assertRaises(ValueError, sock.sendfile, file)
5350
5351 def testNonBlocking(self):
5352 conn = self.accept_conn()
5353 if conn.recv(8192):
5354 self.fail('was not supposed to receive any data')
5355
5356 # timeout (non-triggered)
5357
5358 def _testWithTimeout(self):
5359 address = self.serv.getsockname()
5360 file = open(support.TESTFN, 'rb')
5361 with socket.create_connection(address, timeout=2) as sock, file as file:
5362 meth = self.meth_from_sock(sock)
5363 sent = meth(file)
5364 self.assertEqual(sent, self.FILESIZE)
5365
5366 def testWithTimeout(self):
5367 conn = self.accept_conn()
5368 data = self.recv_data(conn)
5369 self.assertEqual(len(data), self.FILESIZE)
5370 self.assertEqual(data, self.FILEDATA)
5371
5372 # timeout (triggered)
5373
5374 def _testWithTimeoutTriggeredSend(self):
5375 address = self.serv.getsockname()
5376 file = open(support.TESTFN, 'rb')
5377 with socket.create_connection(address, timeout=0.01) as sock, \
5378 file as file:
5379 meth = self.meth_from_sock(sock)
5380 self.assertRaises(socket.timeout, meth, file)
5381
5382 def testWithTimeoutTriggeredSend(self):
5383 conn = self.accept_conn()
5384 conn.recv(88192)
5385
5386 # errors
5387
5388 def _test_errors(self):
5389 pass
5390
5391 def test_errors(self):
5392 with open(support.TESTFN, 'rb') as file:
5393 with socket.socket(type=socket.SOCK_DGRAM) as s:
5394 meth = self.meth_from_sock(s)
5395 self.assertRaisesRegex(
5396 ValueError, "SOCK_STREAM", meth, file)
5397 with open(support.TESTFN, 'rt') as file:
5398 with socket.socket() as s:
5399 meth = self.meth_from_sock(s)
5400 self.assertRaisesRegex(
5401 ValueError, "binary mode", meth, file)
5402 with open(support.TESTFN, 'rb') as file:
5403 with socket.socket() as s:
5404 meth = self.meth_from_sock(s)
5405 self.assertRaisesRegex(TypeError, "positive integer",
5406 meth, file, count='2')
5407 self.assertRaisesRegex(TypeError, "positive integer",
5408 meth, file, count=0.1)
5409 self.assertRaisesRegex(ValueError, "positive integer",
5410 meth, file, count=0)
5411 self.assertRaisesRegex(ValueError, "positive integer",
5412 meth, file, count=-1)
5413
5414
5415@unittest.skipUnless(thread, 'Threading required for this test.')
5416@unittest.skipUnless(hasattr(os, "sendfile"),
5417 'os.sendfile() required for this test.')
5418class SendfileUsingSendfileTest(SendfileUsingSendTest):
5419 """
5420 Test the sendfile() implementation of socket.sendfile().
5421 """
5422 def meth_from_sock(self, sock):
5423 return getattr(sock, "_sendfile_use_sendfile")
5424
Christian Heimes48371412016-09-06 00:37:46 +02005425
5426@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005427class LinuxKernelCryptoAPI(unittest.TestCase):
5428 # tests for AF_ALG
5429 def create_alg(self, typ, name):
5430 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005431 try:
5432 sock.bind((typ, name))
5433 except FileNotFoundError as e:
5434 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005435 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005436 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005437 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005438 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005439
5440 def test_sha256(self):
5441 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5442 "177a9cb410ff61f20015ad")
5443 with self.create_alg('hash', 'sha256') as algo:
5444 op, _ = algo.accept()
5445 with op:
5446 op.sendall(b"abc")
5447 self.assertEqual(op.recv(512), expected)
5448
5449 op, _ = algo.accept()
5450 with op:
5451 op.send(b'a', socket.MSG_MORE)
5452 op.send(b'b', socket.MSG_MORE)
5453 op.send(b'c', socket.MSG_MORE)
5454 op.send(b'')
5455 self.assertEqual(op.recv(512), expected)
5456
5457 def test_hmac_sha1(self):
5458 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5459 with self.create_alg('hash', 'hmac(sha1)') as algo:
5460 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5461 op, _ = algo.accept()
5462 with op:
5463 op.sendall(b"what do ya want for nothing?")
5464 self.assertEqual(op.recv(512), expected)
5465
Christian Heimese084f842016-09-11 20:11:30 +02005466 # Although it should work with 3.19 and newer the test blocks on
5467 # Ubuntu 15.10 with Kernel 4.2.0-19.
5468 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005469 def test_aes_cbc(self):
5470 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5471 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5472 msg = b"Single block msg"
5473 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5474 msglen = len(msg)
5475 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5476 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5477 op, _ = algo.accept()
5478 with op:
5479 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5480 flags=socket.MSG_MORE)
5481 op.sendall(msg)
5482 self.assertEqual(op.recv(msglen), ciphertext)
5483
5484 op, _ = algo.accept()
5485 with op:
5486 op.sendmsg_afalg([ciphertext],
5487 op=socket.ALG_OP_DECRYPT, iv=iv)
5488 self.assertEqual(op.recv(msglen), msg)
5489
5490 # long message
5491 multiplier = 1024
5492 longmsg = [msg] * multiplier
5493 op, _ = algo.accept()
5494 with op:
5495 op.sendmsg_afalg(longmsg,
5496 op=socket.ALG_OP_ENCRYPT, iv=iv)
5497 enc = op.recv(msglen * multiplier)
5498 self.assertEqual(len(enc), msglen * multiplier)
5499 self.assertTrue(enc[:msglen], ciphertext)
5500
5501 op, _ = algo.accept()
5502 with op:
5503 op.sendmsg_afalg([enc],
5504 op=socket.ALG_OP_DECRYPT, iv=iv)
5505 dec = op.recv(msglen * multiplier)
5506 self.assertEqual(len(dec), msglen * multiplier)
5507 self.assertEqual(dec, msg * multiplier)
5508
matejcik9764c152017-02-16 14:41:31 +01005509 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005510 def test_aead_aes_gcm(self):
5511 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5512 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5513 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5514 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5515 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5516 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5517
5518 taglen = len(expected_tag)
5519 assoclen = len(assoc)
5520
5521 with self.create_alg('aead', 'gcm(aes)') as algo:
5522 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5523 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5524 None, taglen)
5525
5526 # send assoc, plain and tag buffer in separate steps
5527 op, _ = algo.accept()
5528 with op:
5529 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5530 assoclen=assoclen, flags=socket.MSG_MORE)
5531 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005532 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005533 res = op.recv(assoclen + len(plain) + taglen)
5534 self.assertEqual(expected_ct, res[assoclen:-taglen])
5535 self.assertEqual(expected_tag, res[-taglen:])
5536
5537 # now with msg
5538 op, _ = algo.accept()
5539 with op:
matejcik9764c152017-02-16 14:41:31 +01005540 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005541 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5542 assoclen=assoclen)
5543 res = op.recv(assoclen + len(plain) + taglen)
5544 self.assertEqual(expected_ct, res[assoclen:-taglen])
5545 self.assertEqual(expected_tag, res[-taglen:])
5546
5547 # create anc data manually
5548 pack_uint32 = struct.Struct('I').pack
5549 op, _ = algo.accept()
5550 with op:
matejcik9764c152017-02-16 14:41:31 +01005551 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005552 op.sendmsg(
5553 [msg],
5554 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5555 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5556 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5557 )
5558 )
matejcik9764c152017-02-16 14:41:31 +01005559 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005560 self.assertEqual(expected_ct, res[assoclen:-taglen])
5561 self.assertEqual(expected_tag, res[-taglen:])
5562
5563 # decrypt and verify
5564 op, _ = algo.accept()
5565 with op:
5566 msg = assoc + expected_ct + expected_tag
5567 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5568 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005569 res = op.recv(len(msg) - taglen)
5570 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005571
Christian Heimese084f842016-09-11 20:11:30 +02005572 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005573 def test_drbg_pr_sha256(self):
5574 # deterministic random bit generator, prediction resistance, sha256
5575 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5576 extra_seed = os.urandom(32)
5577 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5578 op, _ = algo.accept()
5579 with op:
5580 rn = op.recv(32)
5581 self.assertEqual(len(rn), 32)
5582
5583 def test_sendmsg_afalg_args(self):
5584 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005585 with sock:
5586 with self.assertRaises(TypeError):
5587 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005588
Christian Heimes02b30352016-09-11 19:49:56 +02005589 with self.assertRaises(TypeError):
5590 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005591
Christian Heimes02b30352016-09-11 19:49:56 +02005592 with self.assertRaises(TypeError):
5593 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005594
Christian Heimes02b30352016-09-11 19:49:56 +02005595 with self.assertRaises(TypeError):
5596 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005597
Christian Heimes02b30352016-09-11 19:49:56 +02005598 with self.assertRaises(TypeError):
5599 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5600
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005601
Guido van Rossumb995eb72002-07-31 16:08:40 +00005602def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005603 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005604 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005605
5606 tests.extend([
5607 NonBlockingTCPTests,
5608 FileObjectClassTestCase,
5609 UnbufferedFileObjectClassTestCase,
5610 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005611 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005612 UnicodeReadFileObjectClassTestCase,
5613 UnicodeWriteFileObjectClassTestCase,
5614 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005615 NetworkConnectionNoServer,
5616 NetworkConnectionAttributesTest,
5617 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005618 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005619 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005620 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005621 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005622 tests.append(BasicSocketPairTest)
5623 tests.append(TestUnixDomain)
5624 tests.append(TestLinuxAbstractNamespace)
5625 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005626 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005627 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005628 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005629 tests.extend([
5630 CmsgMacroTests,
5631 SendmsgUDPTest,
5632 RecvmsgUDPTest,
5633 RecvmsgIntoUDPTest,
5634 SendmsgUDP6Test,
5635 RecvmsgUDP6Test,
5636 RecvmsgRFC3542AncillaryUDP6Test,
5637 RecvmsgIntoRFC3542AncillaryUDP6Test,
5638 RecvmsgIntoUDP6Test,
5639 SendmsgTCPTest,
5640 RecvmsgTCPTest,
5641 RecvmsgIntoTCPTest,
5642 SendmsgSCTPStreamTest,
5643 RecvmsgSCTPStreamTest,
5644 RecvmsgIntoSCTPStreamTest,
5645 SendmsgUnixStreamTest,
5646 RecvmsgUnixStreamTest,
5647 RecvmsgIntoUnixStreamTest,
5648 RecvmsgSCMRightsStreamTest,
5649 RecvmsgIntoSCMRightsStreamTest,
5650 # These are slow when setitimer() is not available
5651 InterruptedRecvTimeoutTest,
5652 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005653 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005654 SendfileUsingSendTest,
5655 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005656 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005657
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005658 thread_info = support.threading_setup()
5659 support.run_unittest(*tests)
5660 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005661
5662if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005663 test_main()