blob: f8e5b369ef23b6c9d022069ab1a1d8947c28bce1 [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
Guido van Rossum018919a2007-01-15 00:07:32 +0000909 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300910 import _testcapi
911 s_good_values = [0, 1, 2, 0xffff]
912 l_good_values = s_good_values + [0xffffffff]
913 l_bad_values = [-1, -2, 1<<32, 1<<1000]
914 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
915 _testcapi.INT_MAX + 1]
916 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
917 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000918 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000919 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300920 for k in l_good_values:
921 socket.ntohl(k)
922 socket.htonl(k)
923 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000924 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000925 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300926 for k in l_bad_values:
927 self.assertRaises(OverflowError, socket.ntohl, k)
928 self.assertRaises(OverflowError, socket.htonl, k)
929 for k in s_deprecated_values:
930 self.assertWarns(DeprecationWarning, socket.ntohs, k)
931 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000932
Barry Warsaw11b91a02004-06-28 00:50:43 +0000933 def testGetServBy(self):
934 eq = self.assertEqual
935 # Find one service that exists, then check all the related interfaces.
936 # I've ordered this by protocols that have both a tcp and udp
937 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200938 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200939 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000940 # avoid the 'echo' service on this platform, as there is an
941 # assumption breaking non-standard port/protocol entry
942 services = ('daytime', 'qotd', 'domain')
943 else:
944 services = ('echo', 'daytime', 'domain')
945 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000946 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000947 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000948 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200949 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000950 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000951 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200952 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000953 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +0100954 # Issue #26936: Android getservbyname() was broken before API 23.
955 if (not hasattr(sys, 'getandroidapilevel') or
956 sys.getandroidapilevel() >= 23):
957 port2 = socket.getservbyname(service)
958 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400959 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000960 try:
961 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200962 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000963 udpport = None
964 else:
965 eq(udpport, port)
966 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +0100967 # Issue #26936: Android getservbyport() is broken.
968 if not support.is_android:
969 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +0000970 eq(socket.getservbyport(port, 'tcp'), service)
971 if udpport is not None:
972 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000973 # Make sure getservbyport does not accept out of range ports.
974 self.assertRaises(OverflowError, socket.getservbyport, -1)
975 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000976
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000977 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000978 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000979 # The default timeout should initially be None
980 self.assertEqual(socket.getdefaulttimeout(), None)
981 s = socket.socket()
982 self.assertEqual(s.gettimeout(), None)
983 s.close()
984
985 # Set the default timeout to 10, and see if it propagates
986 socket.setdefaulttimeout(10)
987 self.assertEqual(socket.getdefaulttimeout(), 10)
988 s = socket.socket()
989 self.assertEqual(s.gettimeout(), 10)
990 s.close()
991
992 # Reset the default timeout to None, and see if it propagates
993 socket.setdefaulttimeout(None)
994 self.assertEqual(socket.getdefaulttimeout(), None)
995 s = socket.socket()
996 self.assertEqual(s.gettimeout(), None)
997 s.close()
998
999 # Check that setting it to an invalid value raises ValueError
1000 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1001
1002 # Check that setting it to an invalid type raises TypeError
1003 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1004
Serhiy Storchaka43767632013-11-03 21:31:38 +02001005 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1006 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001007 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001008 # Test that issue1008086 and issue767150 are fixed.
1009 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001010 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1011 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001012
Serhiy Storchaka43767632013-11-03 21:31:38 +02001013 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1014 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001015 def testIPv4toString(self):
1016 from socket import inet_aton as f, inet_pton, AF_INET
1017 g = lambda a: inet_pton(AF_INET, a)
1018
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001019 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001020 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001021 )
1022
Ezio Melottib3aedd42010-11-20 19:04:17 +00001023 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1024 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1025 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1026 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1027 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001028 assertInvalid(f, '0.0.0.')
1029 assertInvalid(f, '300.0.0.0')
1030 assertInvalid(f, 'a.0.0.0')
1031 assertInvalid(f, '1.2.3.4.5')
1032 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001033
Ezio Melottib3aedd42010-11-20 19:04:17 +00001034 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1035 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1036 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1037 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001038 assertInvalid(g, '0.0.0.')
1039 assertInvalid(g, '300.0.0.0')
1040 assertInvalid(g, 'a.0.0.0')
1041 assertInvalid(g, '1.2.3.4.5')
1042 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001043
Serhiy Storchaka43767632013-11-03 21:31:38 +02001044 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1045 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001046 def testIPv6toString(self):
1047 try:
1048 from socket import inet_pton, AF_INET6, has_ipv6
1049 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001050 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001051 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001052 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001053
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001054 if sys.platform == "win32":
1055 try:
1056 inet_pton(AF_INET6, '::')
1057 except OSError as e:
1058 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001059 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001060
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001061 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001062 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001063 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001064 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001065
Ezio Melottib3aedd42010-11-20 19:04:17 +00001066 self.assertEqual(b'\x00' * 16, f('::'))
1067 self.assertEqual(b'\x00' * 16, f('0::0'))
1068 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1069 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001070 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 +00001071 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1072 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001073 self.assertEqual(
1074 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1075 f('ad42:abc::127:0:254:2')
1076 )
1077 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1078 assertInvalid('0x20::')
1079 assertInvalid(':::')
1080 assertInvalid('::0::')
1081 assertInvalid('1::abc::')
1082 assertInvalid('1::abc::def')
1083 assertInvalid('1:2:3:4:5:6:')
1084 assertInvalid('1:2:3:4:5:6')
1085 assertInvalid('1:2:3:4:5:6:7:8:')
1086 assertInvalid('1:2:3:4:5:6:7:8:0')
1087
1088 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1089 f('::254.42.23.64')
1090 )
1091 self.assertEqual(
1092 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1093 f('42::a29b:254.42.23.64')
1094 )
1095 self.assertEqual(
1096 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1097 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1098 )
1099 assertInvalid('255.254.253.252')
1100 assertInvalid('1::260.2.3.0')
1101 assertInvalid('1::0.be.e.0')
1102 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1103 assertInvalid('::1.2.3.4:0')
1104 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001105
Serhiy Storchaka43767632013-11-03 21:31:38 +02001106 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1107 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001108 def testStringToIPv4(self):
1109 from socket import inet_ntoa as f, inet_ntop, AF_INET
1110 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001111 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001112 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001113 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001114
Ezio Melottib3aedd42010-11-20 19:04:17 +00001115 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1116 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1117 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1118 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001119 assertInvalid(f, b'\x00' * 3)
1120 assertInvalid(f, b'\x00' * 5)
1121 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001122 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001123
Ezio Melottib3aedd42010-11-20 19:04:17 +00001124 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1125 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1126 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001127 assertInvalid(g, b'\x00' * 3)
1128 assertInvalid(g, b'\x00' * 5)
1129 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001130 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001131
Serhiy Storchaka43767632013-11-03 21:31:38 +02001132 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1133 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001134 def testStringToIPv6(self):
1135 try:
1136 from socket import inet_ntop, AF_INET6, has_ipv6
1137 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001138 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001139 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001140 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001141
1142 if sys.platform == "win32":
1143 try:
1144 inet_ntop(AF_INET6, b'\x00' * 16)
1145 except OSError as e:
1146 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001147 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001148
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001149 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001150 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001151 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001152 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001153
Ezio Melottib3aedd42010-11-20 19:04:17 +00001154 self.assertEqual('::', f(b'\x00' * 16))
1155 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1156 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001157 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001158 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 +00001159 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001160 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001161
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001162 assertInvalid(b'\x12' * 15)
1163 assertInvalid(b'\x12' * 17)
1164 assertInvalid(b'\x12' * 4)
1165
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001166 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001167
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001168 def testSockName(self):
1169 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001170 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001171 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001172 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001173 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001174 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001175 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1176 # it reasonable to get the host's addr in addition to 0.0.0.0.
1177 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001178 try:
1179 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001180 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001181 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001182 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001183 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001184 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001185
1186 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001187 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001188 # We know a socket should start without reuse==0
1189 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001190 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001191 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001192 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001193
1194 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001195 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001196 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001197 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001198 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1199 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001200 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001201
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001202 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001203 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001204 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1205 sock.settimeout(1)
1206 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001207 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001208
Martin Panter50ab1a32016-04-11 00:38:12 +00001209 def testCloseException(self):
1210 sock = socket.socket()
1211 socket.socket(fileno=sock.fileno()).close()
1212 try:
1213 sock.close()
1214 except OSError as err:
1215 # Winsock apparently raises ENOTSOCK
1216 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1217 else:
1218 self.fail("close() should raise EBADF/ENOTSOCK")
1219
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001220 def testNewAttributes(self):
1221 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001222
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001223 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1224 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001225 if hasattr(socket, 'SOCK_CLOEXEC'):
1226 self.assertIn(sock.type,
1227 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1228 socket.SOCK_STREAM))
1229 else:
1230 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001231 self.assertEqual(sock.proto, 0)
1232 sock.close()
1233
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001234 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001235 sock = socket.socket()
1236 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001237 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001238 big_port = port + 65536
1239 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001240 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1241 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1242 # Since find_unused_port() is inherently subject to race conditions, we
1243 # call it a couple times if necessary.
1244 for i in itertools.count():
1245 port = support.find_unused_port()
1246 try:
1247 sock.bind((HOST, port))
1248 except OSError as e:
1249 if e.errno != errno.EADDRINUSE or i == 5:
1250 raise
1251 else:
1252 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001253
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001254 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001255 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001256 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1257 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1258 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1259 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001260 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1261 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001262 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001263 self.assertRaises(ValueError, s.ioctl, -1, None)
1264 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001265
Steve Dowerea93ac02016-06-17 12:52:18 -07001266 @unittest.skipUnless(os.name == "nt", "Windows specific")
1267 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1268 'Loopback fast path support required for this test')
1269 def test_sio_loopback_fast_path(self):
1270 s = socket.socket()
1271 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001272 try:
1273 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1274 except OSError as exc:
1275 WSAEOPNOTSUPP = 10045
1276 if exc.winerror == WSAEOPNOTSUPP:
1277 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1278 "doesn't implemented in this Windows version")
1279 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001280 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1281
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001282 def testGetaddrinfo(self):
1283 try:
1284 socket.getaddrinfo('localhost', 80)
1285 except socket.gaierror as err:
1286 if err.errno == socket.EAI_SERVICE:
1287 # see http://bugs.python.org/issue1282647
1288 self.skipTest("buggy libc version")
1289 raise
1290 # len of every sequence is supposed to be == 5
1291 for info in socket.getaddrinfo(HOST, None):
1292 self.assertEqual(len(info), 5)
1293 # host can be a domain name, a string representation of an
1294 # IPv4/v6 address or None
1295 socket.getaddrinfo('localhost', 80)
1296 socket.getaddrinfo('127.0.0.1', 80)
1297 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001298 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001299 socket.getaddrinfo('::1', 80)
1300 # port can be a string service name such as "http", a numeric
1301 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001302 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1303 if (not hasattr(sys, 'getandroidapilevel') or
1304 sys.getandroidapilevel() >= 23):
1305 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001306 socket.getaddrinfo(HOST, 80)
1307 socket.getaddrinfo(HOST, None)
1308 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001309 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1310 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001311 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001312 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1313 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001314 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001315 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1316 for _, socktype, _, _, _ in infos:
1317 self.assertEqual(socktype, socket.SOCK_STREAM)
1318 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001319 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001320 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1321 # a server willing to support both IPv4 and IPv6 will
1322 # usually do this
1323 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1324 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001325 # test keyword arguments
1326 a = socket.getaddrinfo(HOST, None)
1327 b = socket.getaddrinfo(host=HOST, port=None)
1328 self.assertEqual(a, b)
1329 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1330 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1331 self.assertEqual(a, b)
1332 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1333 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1334 self.assertEqual(a, b)
1335 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1336 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1337 self.assertEqual(a, b)
1338 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1339 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1340 self.assertEqual(a, b)
1341 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1342 socket.AI_PASSIVE)
1343 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1344 type=socket.SOCK_STREAM, proto=0,
1345 flags=socket.AI_PASSIVE)
1346 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001347 # Issue #6697.
1348 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001349
Ned Deilyb24f4812014-02-13 22:50:42 -08001350 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001351 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001352 try:
1353 # The arguments here are undefined and the call may succeed
1354 # or fail. All we care here is that it doesn't segfault.
1355 socket.getaddrinfo("localhost", None, 0, 0, 0,
1356 socket.AI_NUMERICSERV)
1357 except socket.gaierror:
1358 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001359
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001360 def test_getnameinfo(self):
1361 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001362 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001363
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001364 @unittest.skipUnless(support.is_resource_enabled('network'),
1365 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001366 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001367 # Check for internet access before running test
1368 # (issue #12804, issue #25138).
1369 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001370 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001371
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001372 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001373 domain = 'испытание.pythontest.net'
1374 socket.gethostbyname(domain)
1375 socket.gethostbyname_ex(domain)
1376 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001377 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1378 # have a reverse entry yet
1379 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001380
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001381 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001382 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001383 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1384 self.skipTest("signal.alarm and socket.socketpair required for this test")
1385 # Our signal handlers clobber the C errno by calling a math function
1386 # with an invalid domain value.
1387 def ok_handler(*args):
1388 self.assertRaises(ValueError, math.acosh, 0)
1389 def raising_handler(*args):
1390 self.assertRaises(ValueError, math.acosh, 0)
1391 1 // 0
1392 c, s = socket.socketpair()
1393 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1394 try:
1395 if with_timeout:
1396 # Just above the one second minimum for signal.alarm
1397 c.settimeout(1.5)
1398 with self.assertRaises(ZeroDivisionError):
1399 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001400 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001401 if with_timeout:
1402 signal.signal(signal.SIGALRM, ok_handler)
1403 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001404 self.assertRaises(socket.timeout, c.sendall,
1405 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001406 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001407 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001408 signal.signal(signal.SIGALRM, old_alarm)
1409 c.close()
1410 s.close()
1411
1412 def test_sendall_interrupted(self):
1413 self.check_sendall_interrupted(False)
1414
1415 def test_sendall_interrupted_with_timeout(self):
1416 self.check_sendall_interrupted(True)
1417
Antoine Pitroue033e062010-10-29 10:38:18 +00001418 def test_dealloc_warn(self):
1419 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1420 r = repr(sock)
1421 with self.assertWarns(ResourceWarning) as cm:
1422 sock = None
1423 support.gc_collect()
1424 self.assertIn(r, str(cm.warning.args[0]))
1425 # An open socket file object gets dereferenced after the socket
1426 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1427 f = sock.makefile('rb')
1428 r = repr(sock)
1429 sock = None
1430 support.gc_collect()
1431 with self.assertWarns(ResourceWarning):
1432 f = None
1433 support.gc_collect()
1434
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001435 def test_name_closed_socketio(self):
1436 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1437 fp = sock.makefile("rb")
1438 fp.close()
1439 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1440
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001441 def test_unusable_closed_socketio(self):
1442 with socket.socket() as sock:
1443 fp = sock.makefile("rb", buffering=0)
1444 self.assertTrue(fp.readable())
1445 self.assertFalse(fp.writable())
1446 self.assertFalse(fp.seekable())
1447 fp.close()
1448 self.assertRaises(ValueError, fp.readable)
1449 self.assertRaises(ValueError, fp.writable)
1450 self.assertRaises(ValueError, fp.seekable)
1451
Berker Peksag3fe64d02016-02-18 17:34:00 +02001452 def test_makefile_mode(self):
1453 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1454 with self.subTest(mode=mode):
1455 with socket.socket() as sock:
1456 with sock.makefile(mode) as fp:
1457 self.assertEqual(fp.mode, mode)
1458
1459 def test_makefile_invalid_mode(self):
1460 for mode in 'rt', 'x', '+', 'a':
1461 with self.subTest(mode=mode):
1462 with socket.socket() as sock:
1463 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1464 sock.makefile(mode)
1465
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001466 def test_pickle(self):
1467 sock = socket.socket()
1468 with sock:
1469 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1470 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001471 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1472 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1473 self.assertEqual(family, socket.AF_INET)
1474 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1475 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001476
Serhiy Storchaka78980432013-01-15 01:12:17 +02001477 def test_listen_backlog(self):
1478 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001479 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1480 srv.bind((HOST, 0))
1481 srv.listen(backlog)
1482
1483 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001484 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001485 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001486
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001487 @support.cpython_only
1488 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001489 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001490 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001491 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1492 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001493 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001494 srv.close()
1495
Charles-François Natali42663332012-01-02 15:57:30 +01001496 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001497 def test_flowinfo(self):
1498 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001499 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001500 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001501 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001502
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001503 def test_str_for_enums(self):
1504 # Make sure that the AF_* and SOCK_* constants have enum-like string
1505 # reprs.
1506 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1507 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001508 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001509
1510 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1511 def test_uknown_socket_family_repr(self):
1512 # Test that when created with a family that's not one of the known
1513 # AF_*/SOCK_* constants, socket.family just returns the number.
1514 #
1515 # To do this we fool socket.socket into believing it already has an
1516 # open fd because on this path it doesn't actually verify the family and
1517 # type and populates the socket object.
1518 #
1519 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001520 fd, path = tempfile.mkstemp()
1521 self.addCleanup(os.unlink, path)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001522 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1523 self.assertEqual(s.family, 42424)
1524 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001525
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001526 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1527 def test__sendfile_use_sendfile(self):
1528 class File:
1529 def __init__(self, fd):
1530 self.fd = fd
1531
1532 def fileno(self):
1533 return self.fd
1534 with socket.socket() as sock:
1535 fd = os.open(os.curdir, os.O_RDONLY)
1536 os.close(fd)
1537 with self.assertRaises(socket._GiveupOnSendfile):
1538 sock._sendfile_use_sendfile(File(fd))
1539 with self.assertRaises(OverflowError):
1540 sock._sendfile_use_sendfile(File(2**1000))
1541 with self.assertRaises(TypeError):
1542 sock._sendfile_use_sendfile(File(None))
1543
1544
Charles-François Natali47413c12011-10-06 19:47:44 +02001545@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1546class BasicCANTest(unittest.TestCase):
1547
1548 def testCrucialConstants(self):
1549 socket.AF_CAN
1550 socket.PF_CAN
1551 socket.CAN_RAW
1552
Charles-François Natali773e42d2013-02-05 19:42:01 +01001553 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1554 'socket.CAN_BCM required for this test.')
1555 def testBCMConstants(self):
1556 socket.CAN_BCM
1557
1558 # opcodes
1559 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1560 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1561 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1562 socket.CAN_BCM_TX_SEND # send one CAN frame
1563 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1564 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1565 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1566 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1567 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1568 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1569 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1570 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1571
Charles-François Natali47413c12011-10-06 19:47:44 +02001572 def testCreateSocket(self):
1573 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1574 pass
1575
Charles-François Natali773e42d2013-02-05 19:42:01 +01001576 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1577 'socket.CAN_BCM required for this test.')
1578 def testCreateBCMSocket(self):
1579 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1580 pass
1581
Charles-François Natali47413c12011-10-06 19:47:44 +02001582 def testBindAny(self):
1583 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1584 s.bind(('', ))
1585
1586 def testTooLongInterfaceName(self):
1587 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1588 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001589 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001590 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001591
1592 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1593 'socket.CAN_RAW_LOOPBACK required for this test.')
1594 def testLoopback(self):
1595 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1596 for loopback in (0, 1):
1597 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1598 loopback)
1599 self.assertEqual(loopback,
1600 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1601
1602 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1603 'socket.CAN_RAW_FILTER required for this test.')
1604 def testFilter(self):
1605 can_id, can_mask = 0x200, 0x700
1606 can_filter = struct.pack("=II", can_id, can_mask)
1607 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1608 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1609 self.assertEqual(can_filter,
1610 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001611 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001612
1613
1614@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001615@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001616class CANTest(ThreadedCANSocketTest):
1617
Charles-François Natali47413c12011-10-06 19:47:44 +02001618 def __init__(self, methodName='runTest'):
1619 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1620
1621 @classmethod
1622 def build_can_frame(cls, can_id, data):
1623 """Build a CAN frame."""
1624 can_dlc = len(data)
1625 data = data.ljust(8, b'\x00')
1626 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1627
1628 @classmethod
1629 def dissect_can_frame(cls, frame):
1630 """Dissect a CAN frame."""
1631 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1632 return (can_id, can_dlc, data[:can_dlc])
1633
1634 def testSendFrame(self):
1635 cf, addr = self.s.recvfrom(self.bufsize)
1636 self.assertEqual(self.cf, cf)
1637 self.assertEqual(addr[0], self.interface)
1638 self.assertEqual(addr[1], socket.AF_CAN)
1639
1640 def _testSendFrame(self):
1641 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1642 self.cli.send(self.cf)
1643
1644 def testSendMaxFrame(self):
1645 cf, addr = self.s.recvfrom(self.bufsize)
1646 self.assertEqual(self.cf, cf)
1647
1648 def _testSendMaxFrame(self):
1649 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1650 self.cli.send(self.cf)
1651
1652 def testSendMultiFrames(self):
1653 cf, addr = self.s.recvfrom(self.bufsize)
1654 self.assertEqual(self.cf1, cf)
1655
1656 cf, addr = self.s.recvfrom(self.bufsize)
1657 self.assertEqual(self.cf2, cf)
1658
1659 def _testSendMultiFrames(self):
1660 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1661 self.cli.send(self.cf1)
1662
1663 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1664 self.cli.send(self.cf2)
1665
Charles-François Natali773e42d2013-02-05 19:42:01 +01001666 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1667 'socket.CAN_BCM required for this test.')
1668 def _testBCM(self):
1669 cf, addr = self.cli.recvfrom(self.bufsize)
1670 self.assertEqual(self.cf, cf)
1671 can_id, can_dlc, data = self.dissect_can_frame(cf)
1672 self.assertEqual(self.can_id, can_id)
1673 self.assertEqual(self.data, data)
1674
1675 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1676 'socket.CAN_BCM required for this test.')
1677 def testBCM(self):
1678 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1679 self.addCleanup(bcm.close)
1680 bcm.connect((self.interface,))
1681 self.can_id = 0x123
1682 self.data = bytes([0xc0, 0xff, 0xee])
1683 self.cf = self.build_can_frame(self.can_id, self.data)
1684 opcode = socket.CAN_BCM_TX_SEND
1685 flags = 0
1686 count = 0
1687 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1688 bcm_can_id = 0x0222
1689 nframes = 1
1690 assert len(self.cf) == 16
1691 header = struct.pack(self.bcm_cmd_msg_fmt,
1692 opcode,
1693 flags,
1694 count,
1695 ival1_seconds,
1696 ival1_usec,
1697 ival2_seconds,
1698 ival2_usec,
1699 bcm_can_id,
1700 nframes,
1701 )
1702 header_plus_frame = header + self.cf
1703 bytes_sent = bcm.send(header_plus_frame)
1704 self.assertEqual(bytes_sent, len(header_plus_frame))
1705
Charles-François Natali47413c12011-10-06 19:47:44 +02001706
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001707@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1708class BasicRDSTest(unittest.TestCase):
1709
1710 def testCrucialConstants(self):
1711 socket.AF_RDS
1712 socket.PF_RDS
1713
1714 def testCreateSocket(self):
1715 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1716 pass
1717
1718 def testSocketBufferSize(self):
1719 bufsize = 16384
1720 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1721 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1722 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1723
1724
1725@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1726@unittest.skipUnless(thread, 'Threading required for this test.')
1727class RDSTest(ThreadedRDSSocketTest):
1728
1729 def __init__(self, methodName='runTest'):
1730 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1731
Charles-François Natali240c55f2011-11-10 20:33:36 +01001732 def setUp(self):
1733 super().setUp()
1734 self.evt = threading.Event()
1735
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001736 def testSendAndRecv(self):
1737 data, addr = self.serv.recvfrom(self.bufsize)
1738 self.assertEqual(self.data, data)
1739 self.assertEqual(self.cli_addr, addr)
1740
1741 def _testSendAndRecv(self):
1742 self.data = b'spam'
1743 self.cli.sendto(self.data, 0, (HOST, self.port))
1744
1745 def testPeek(self):
1746 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1747 self.assertEqual(self.data, data)
1748 data, addr = self.serv.recvfrom(self.bufsize)
1749 self.assertEqual(self.data, data)
1750
1751 def _testPeek(self):
1752 self.data = b'spam'
1753 self.cli.sendto(self.data, 0, (HOST, self.port))
1754
1755 @requireAttrs(socket.socket, 'recvmsg')
1756 def testSendAndRecvMsg(self):
1757 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1758 self.assertEqual(self.data, data)
1759
1760 @requireAttrs(socket.socket, 'sendmsg')
1761 def _testSendAndRecvMsg(self):
1762 self.data = b'hello ' * 10
1763 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1764
1765 def testSendAndRecvMulti(self):
1766 data, addr = self.serv.recvfrom(self.bufsize)
1767 self.assertEqual(self.data1, data)
1768
1769 data, addr = self.serv.recvfrom(self.bufsize)
1770 self.assertEqual(self.data2, data)
1771
1772 def _testSendAndRecvMulti(self):
1773 self.data1 = b'bacon'
1774 self.cli.sendto(self.data1, 0, (HOST, self.port))
1775
1776 self.data2 = b'egg'
1777 self.cli.sendto(self.data2, 0, (HOST, self.port))
1778
1779 def testSelect(self):
1780 r, w, x = select.select([self.serv], [], [], 3.0)
1781 self.assertIn(self.serv, r)
1782 data, addr = self.serv.recvfrom(self.bufsize)
1783 self.assertEqual(self.data, data)
1784
1785 def _testSelect(self):
1786 self.data = b'select'
1787 self.cli.sendto(self.data, 0, (HOST, self.port))
1788
1789 def testCongestion(self):
1790 # wait until the sender is done
1791 self.evt.wait()
1792
1793 def _testCongestion(self):
1794 # test the behavior in case of congestion
1795 self.data = b'fill'
1796 self.cli.setblocking(False)
1797 try:
1798 # try to lower the receiver's socket buffer size
1799 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1800 except OSError:
1801 pass
1802 with self.assertRaises(OSError) as cm:
1803 try:
1804 # fill the receiver's socket buffer
1805 while True:
1806 self.cli.sendto(self.data, 0, (HOST, self.port))
1807 finally:
1808 # signal the receiver we're done
1809 self.evt.set()
1810 # sendto() should have failed with ENOBUFS
1811 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1812 # and we should have received a congestion notification through poll
1813 r, w, x = select.select([self.serv], [], [], 3.0)
1814 self.assertIn(self.serv, r)
1815
1816
Victor Stinner45df8202010-04-28 22:31:17 +00001817@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001818class BasicTCPTest(SocketConnectedTest):
1819
1820 def __init__(self, methodName='runTest'):
1821 SocketConnectedTest.__init__(self, methodName=methodName)
1822
1823 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001824 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001825 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001826 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001827
1828 def _testRecv(self):
1829 self.serv_conn.send(MSG)
1830
1831 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001832 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001833 seg1 = self.cli_conn.recv(len(MSG) - 3)
1834 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001835 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001836 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001837
1838 def _testOverFlowRecv(self):
1839 self.serv_conn.send(MSG)
1840
1841 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001842 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001843 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001844 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001845
1846 def _testRecvFrom(self):
1847 self.serv_conn.send(MSG)
1848
1849 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001850 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001851 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1852 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001853 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001854 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001855
1856 def _testOverFlowRecvFrom(self):
1857 self.serv_conn.send(MSG)
1858
1859 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001860 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001861 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001862 while 1:
1863 read = self.cli_conn.recv(1024)
1864 if not read:
1865 break
Guido van Rossume531e292002-08-08 20:28:34 +00001866 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001867 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001868
1869 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001870 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001871 self.serv_conn.sendall(big_chunk)
1872
1873 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001874 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001875 fd = self.cli_conn.fileno()
1876 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001877 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001878 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001879 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001880 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001881
1882 def _testFromFd(self):
1883 self.serv_conn.send(MSG)
1884
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001885 def testDup(self):
1886 # Testing dup()
1887 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001888 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001889 msg = sock.recv(1024)
1890 self.assertEqual(msg, MSG)
1891
1892 def _testDup(self):
1893 self.serv_conn.send(MSG)
1894
Guido van Rossum24e4af82002-06-12 19:18:08 +00001895 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001896 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001897 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001898 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001899 # wait for _testShutdown to finish: on OS X, when the server
1900 # closes the connection the client also becomes disconnected,
1901 # and the client's shutdown call will fail. (Issue #4397.)
1902 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001903
1904 def _testShutdown(self):
1905 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001906 self.serv_conn.shutdown(2)
1907
1908 testShutdown_overflow = support.cpython_only(testShutdown)
1909
1910 @support.cpython_only
1911 def _testShutdown_overflow(self):
1912 import _testcapi
1913 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001914 # Issue 15989
1915 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1916 _testcapi.INT_MAX + 1)
1917 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1918 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001919 self.serv_conn.shutdown(2)
1920
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001921 def testDetach(self):
1922 # Testing detach()
1923 fileno = self.cli_conn.fileno()
1924 f = self.cli_conn.detach()
1925 self.assertEqual(f, fileno)
1926 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001927 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001928 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001929 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001930 # ...but we can create another socket using the (still open)
1931 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001932 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001933 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001934 msg = sock.recv(1024)
1935 self.assertEqual(msg, MSG)
1936
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001937 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001938 self.serv_conn.send(MSG)
1939
Victor Stinner45df8202010-04-28 22:31:17 +00001940@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001941class BasicUDPTest(ThreadedUDPSocketTest):
1942
1943 def __init__(self, methodName='runTest'):
1944 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1945
1946 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001947 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001948 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001949 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001950
1951 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001952 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001953
Guido van Rossum1c938012002-06-12 21:17:20 +00001954 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001955 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001956 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001957 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001958
Guido van Rossum1c938012002-06-12 21:17:20 +00001959 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001960 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001961
Guido van Rossumd8faa362007-04-27 19:54:29 +00001962 def testRecvFromNegative(self):
1963 # Negative lengths passed to recvfrom should give ValueError.
1964 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1965
1966 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001967 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001968
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001969# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1970# same test code is used with different families and types of socket
1971# (e.g. stream, datagram), and tests using recvmsg() are repeated
1972# using recvmsg_into().
1973#
1974# The generic test classes such as SendmsgTests and
1975# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1976# supplied with sockets cli_sock and serv_sock representing the
1977# client's and the server's end of the connection respectively, and
1978# attributes cli_addr and serv_addr holding their (numeric where
1979# appropriate) addresses.
1980#
1981# The final concrete test classes combine these with subclasses of
1982# SocketTestBase which set up client and server sockets of a specific
1983# type, and with subclasses of SendrecvmsgBase such as
1984# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1985# sockets to cli_sock and serv_sock and override the methods and
1986# attributes of SendrecvmsgBase to fill in destination addresses if
1987# needed when sending, check for specific flags in msg_flags, etc.
1988#
1989# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1990# recvmsg_into().
1991
1992# XXX: like the other datagram (UDP) tests in this module, the code
1993# here assumes that datagram delivery on the local machine will be
1994# reliable.
1995
1996class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1997 # Base class for sendmsg()/recvmsg() tests.
1998
1999 # Time in seconds to wait before considering a test failed, or
2000 # None for no timeout. Not all tests actually set a timeout.
2001 fail_timeout = 3.0
2002
2003 def setUp(self):
2004 self.misc_event = threading.Event()
2005 super().setUp()
2006
2007 def sendToServer(self, msg):
2008 # Send msg to the server.
2009 return self.cli_sock.send(msg)
2010
2011 # Tuple of alternative default arguments for sendmsg() when called
2012 # via sendmsgToServer() (e.g. to include a destination address).
2013 sendmsg_to_server_defaults = ()
2014
2015 def sendmsgToServer(self, *args):
2016 # Call sendmsg() on self.cli_sock with the given arguments,
2017 # filling in any arguments which are not supplied with the
2018 # corresponding items of self.sendmsg_to_server_defaults, if
2019 # any.
2020 return self.cli_sock.sendmsg(
2021 *(args + self.sendmsg_to_server_defaults[len(args):]))
2022
2023 def doRecvmsg(self, sock, bufsize, *args):
2024 # Call recvmsg() on sock with given arguments and return its
2025 # result. Should be used for tests which can use either
2026 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2027 # this method with one which emulates it using recvmsg_into(),
2028 # thus allowing the same test to be used for both methods.
2029 result = sock.recvmsg(bufsize, *args)
2030 self.registerRecvmsgResult(result)
2031 return result
2032
2033 def registerRecvmsgResult(self, result):
2034 # Called by doRecvmsg() with the return value of recvmsg() or
2035 # recvmsg_into(). Can be overridden to arrange cleanup based
2036 # on the returned ancillary data, for instance.
2037 pass
2038
2039 def checkRecvmsgAddress(self, addr1, addr2):
2040 # Called to compare the received address with the address of
2041 # the peer.
2042 self.assertEqual(addr1, addr2)
2043
2044 # Flags that are normally unset in msg_flags
2045 msg_flags_common_unset = 0
2046 for name in ("MSG_CTRUNC", "MSG_OOB"):
2047 msg_flags_common_unset |= getattr(socket, name, 0)
2048
2049 # Flags that are normally set
2050 msg_flags_common_set = 0
2051
2052 # Flags set when a complete record has been received (e.g. MSG_EOR
2053 # for SCTP)
2054 msg_flags_eor_indicator = 0
2055
2056 # Flags set when a complete record has not been received
2057 # (e.g. MSG_TRUNC for datagram sockets)
2058 msg_flags_non_eor_indicator = 0
2059
2060 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2061 # Method to check the value of msg_flags returned by recvmsg[_into]().
2062 #
2063 # Checks that all bits in msg_flags_common_set attribute are
2064 # set in "flags" and all bits in msg_flags_common_unset are
2065 # unset.
2066 #
2067 # The "eor" argument specifies whether the flags should
2068 # indicate that a full record (or datagram) has been received.
2069 # If "eor" is None, no checks are done; otherwise, checks
2070 # that:
2071 #
2072 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2073 # set and all bits in msg_flags_non_eor_indicator are unset
2074 #
2075 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2076 # are set and all bits in msg_flags_eor_indicator are unset
2077 #
2078 # If "checkset" and/or "checkunset" are supplied, they require
2079 # the given bits to be set or unset respectively, overriding
2080 # what the attributes require for those bits.
2081 #
2082 # If any bits are set in "ignore", they will not be checked,
2083 # regardless of the other inputs.
2084 #
2085 # Will raise Exception if the inputs require a bit to be both
2086 # set and unset, and it is not ignored.
2087
2088 defaultset = self.msg_flags_common_set
2089 defaultunset = self.msg_flags_common_unset
2090
2091 if eor:
2092 defaultset |= self.msg_flags_eor_indicator
2093 defaultunset |= self.msg_flags_non_eor_indicator
2094 elif eor is not None:
2095 defaultset |= self.msg_flags_non_eor_indicator
2096 defaultunset |= self.msg_flags_eor_indicator
2097
2098 # Function arguments override defaults
2099 defaultset &= ~checkunset
2100 defaultunset &= ~checkset
2101
2102 # Merge arguments with remaining defaults, and check for conflicts
2103 checkset |= defaultset
2104 checkunset |= defaultunset
2105 inboth = checkset & checkunset & ~ignore
2106 if inboth:
2107 raise Exception("contradictory set, unset requirements for flags "
2108 "{0:#x}".format(inboth))
2109
2110 # Compare with given msg_flags value
2111 mask = (checkset | checkunset) & ~ignore
2112 self.assertEqual(flags & mask, checkset & mask)
2113
2114
2115class RecvmsgIntoMixin(SendrecvmsgBase):
2116 # Mixin to implement doRecvmsg() using recvmsg_into().
2117
2118 def doRecvmsg(self, sock, bufsize, *args):
2119 buf = bytearray(bufsize)
2120 result = sock.recvmsg_into([buf], *args)
2121 self.registerRecvmsgResult(result)
2122 self.assertGreaterEqual(result[0], 0)
2123 self.assertLessEqual(result[0], bufsize)
2124 return (bytes(buf[:result[0]]),) + result[1:]
2125
2126
2127class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2128 # Defines flags to be checked in msg_flags for datagram sockets.
2129
2130 @property
2131 def msg_flags_non_eor_indicator(self):
2132 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2133
2134
2135class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2136 # Defines flags to be checked in msg_flags for SCTP sockets.
2137
2138 @property
2139 def msg_flags_eor_indicator(self):
2140 return super().msg_flags_eor_indicator | socket.MSG_EOR
2141
2142
2143class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2144 # Base class for tests on connectionless-mode sockets. Users must
2145 # supply sockets on attributes cli and serv to be mapped to
2146 # cli_sock and serv_sock respectively.
2147
2148 @property
2149 def serv_sock(self):
2150 return self.serv
2151
2152 @property
2153 def cli_sock(self):
2154 return self.cli
2155
2156 @property
2157 def sendmsg_to_server_defaults(self):
2158 return ([], [], 0, self.serv_addr)
2159
2160 def sendToServer(self, msg):
2161 return self.cli_sock.sendto(msg, self.serv_addr)
2162
2163
2164class SendrecvmsgConnectedBase(SendrecvmsgBase):
2165 # Base class for tests on connected sockets. Users must supply
2166 # sockets on attributes serv_conn and cli_conn (representing the
2167 # connections *to* the server and the client), to be mapped to
2168 # cli_sock and serv_sock respectively.
2169
2170 @property
2171 def serv_sock(self):
2172 return self.cli_conn
2173
2174 @property
2175 def cli_sock(self):
2176 return self.serv_conn
2177
2178 def checkRecvmsgAddress(self, addr1, addr2):
2179 # Address is currently "unspecified" for a connected socket,
2180 # so we don't examine it
2181 pass
2182
2183
2184class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2185 # Base class to set a timeout on server's socket.
2186
2187 def setUp(self):
2188 super().setUp()
2189 self.serv_sock.settimeout(self.fail_timeout)
2190
2191
2192class SendmsgTests(SendrecvmsgServerTimeoutBase):
2193 # Tests for sendmsg() which can use any socket type and do not
2194 # involve recvmsg() or recvmsg_into().
2195
2196 def testSendmsg(self):
2197 # Send a simple message with sendmsg().
2198 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2199
2200 def _testSendmsg(self):
2201 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2202
2203 def testSendmsgDataGenerator(self):
2204 # Send from buffer obtained from a generator (not a sequence).
2205 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2206
2207 def _testSendmsgDataGenerator(self):
2208 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2209 len(MSG))
2210
2211 def testSendmsgAncillaryGenerator(self):
2212 # Gather (empty) ancillary data from a generator.
2213 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2214
2215 def _testSendmsgAncillaryGenerator(self):
2216 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2217 len(MSG))
2218
2219 def testSendmsgArray(self):
2220 # Send data from an array instead of the usual bytes object.
2221 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2222
2223 def _testSendmsgArray(self):
2224 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2225 len(MSG))
2226
2227 def testSendmsgGather(self):
2228 # Send message data from more than one buffer (gather write).
2229 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2230
2231 def _testSendmsgGather(self):
2232 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2233
2234 def testSendmsgBadArgs(self):
2235 # Check that sendmsg() rejects invalid arguments.
2236 self.assertEqual(self.serv_sock.recv(1000), b"done")
2237
2238 def _testSendmsgBadArgs(self):
2239 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2240 self.assertRaises(TypeError, self.sendmsgToServer,
2241 b"not in an iterable")
2242 self.assertRaises(TypeError, self.sendmsgToServer,
2243 object())
2244 self.assertRaises(TypeError, self.sendmsgToServer,
2245 [object()])
2246 self.assertRaises(TypeError, self.sendmsgToServer,
2247 [MSG, object()])
2248 self.assertRaises(TypeError, self.sendmsgToServer,
2249 [MSG], object())
2250 self.assertRaises(TypeError, self.sendmsgToServer,
2251 [MSG], [], object())
2252 self.assertRaises(TypeError, self.sendmsgToServer,
2253 [MSG], [], 0, object())
2254 self.sendToServer(b"done")
2255
2256 def testSendmsgBadCmsg(self):
2257 # Check that invalid ancillary data items are rejected.
2258 self.assertEqual(self.serv_sock.recv(1000), b"done")
2259
2260 def _testSendmsgBadCmsg(self):
2261 self.assertRaises(TypeError, self.sendmsgToServer,
2262 [MSG], [object()])
2263 self.assertRaises(TypeError, self.sendmsgToServer,
2264 [MSG], [(object(), 0, b"data")])
2265 self.assertRaises(TypeError, self.sendmsgToServer,
2266 [MSG], [(0, object(), b"data")])
2267 self.assertRaises(TypeError, self.sendmsgToServer,
2268 [MSG], [(0, 0, object())])
2269 self.assertRaises(TypeError, self.sendmsgToServer,
2270 [MSG], [(0, 0)])
2271 self.assertRaises(TypeError, self.sendmsgToServer,
2272 [MSG], [(0, 0, b"data", 42)])
2273 self.sendToServer(b"done")
2274
2275 @requireAttrs(socket, "CMSG_SPACE")
2276 def testSendmsgBadMultiCmsg(self):
2277 # Check that invalid ancillary data items are rejected when
2278 # more than one item is present.
2279 self.assertEqual(self.serv_sock.recv(1000), b"done")
2280
2281 @testSendmsgBadMultiCmsg.client_skip
2282 def _testSendmsgBadMultiCmsg(self):
2283 self.assertRaises(TypeError, self.sendmsgToServer,
2284 [MSG], [0, 0, b""])
2285 self.assertRaises(TypeError, self.sendmsgToServer,
2286 [MSG], [(0, 0, b""), object()])
2287 self.sendToServer(b"done")
2288
2289 def testSendmsgExcessCmsgReject(self):
2290 # Check that sendmsg() rejects excess ancillary data items
2291 # when the number that can be sent is limited.
2292 self.assertEqual(self.serv_sock.recv(1000), b"done")
2293
2294 def _testSendmsgExcessCmsgReject(self):
2295 if not hasattr(socket, "CMSG_SPACE"):
2296 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002297 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002298 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2299 self.assertIsNone(cm.exception.errno)
2300 self.sendToServer(b"done")
2301
2302 def testSendmsgAfterClose(self):
2303 # Check that sendmsg() fails on a closed socket.
2304 pass
2305
2306 def _testSendmsgAfterClose(self):
2307 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002308 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002309
2310
2311class SendmsgStreamTests(SendmsgTests):
2312 # Tests for sendmsg() which require a stream socket and do not
2313 # involve recvmsg() or recvmsg_into().
2314
2315 def testSendmsgExplicitNoneAddr(self):
2316 # Check that peer address can be specified as None.
2317 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2318
2319 def _testSendmsgExplicitNoneAddr(self):
2320 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2321
2322 def testSendmsgTimeout(self):
2323 # Check that timeout works with sendmsg().
2324 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2325 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2326
2327 def _testSendmsgTimeout(self):
2328 try:
2329 self.cli_sock.settimeout(0.03)
2330 with self.assertRaises(socket.timeout):
2331 while True:
2332 self.sendmsgToServer([b"a"*512])
2333 finally:
2334 self.misc_event.set()
2335
2336 # XXX: would be nice to have more tests for sendmsg flags argument.
2337
2338 # Linux supports MSG_DONTWAIT when sending, but in general, it
2339 # only works when receiving. Could add other platforms if they
2340 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002341 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002342 "MSG_DONTWAIT not known to work on this platform when "
2343 "sending")
2344 def testSendmsgDontWait(self):
2345 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2346 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2347 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2348
2349 @testSendmsgDontWait.client_skip
2350 def _testSendmsgDontWait(self):
2351 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002352 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002353 while True:
2354 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2355 self.assertIn(cm.exception.errno,
2356 (errno.EAGAIN, errno.EWOULDBLOCK))
2357 finally:
2358 self.misc_event.set()
2359
2360
2361class SendmsgConnectionlessTests(SendmsgTests):
2362 # Tests for sendmsg() which require a connectionless-mode
2363 # (e.g. datagram) socket, and do not involve recvmsg() or
2364 # recvmsg_into().
2365
2366 def testSendmsgNoDestAddr(self):
2367 # Check that sendmsg() fails when no destination address is
2368 # given for unconnected socket.
2369 pass
2370
2371 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002372 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002373 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002374 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002375 [MSG], [], 0, None)
2376
2377
2378class RecvmsgGenericTests(SendrecvmsgBase):
2379 # Tests for recvmsg() which can also be emulated using
2380 # recvmsg_into(), and can use any socket type.
2381
2382 def testRecvmsg(self):
2383 # Receive a simple message with recvmsg[_into]().
2384 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2385 self.assertEqual(msg, MSG)
2386 self.checkRecvmsgAddress(addr, self.cli_addr)
2387 self.assertEqual(ancdata, [])
2388 self.checkFlags(flags, eor=True)
2389
2390 def _testRecvmsg(self):
2391 self.sendToServer(MSG)
2392
2393 def testRecvmsgExplicitDefaults(self):
2394 # Test recvmsg[_into]() with default arguments provided explicitly.
2395 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2396 len(MSG), 0, 0)
2397 self.assertEqual(msg, MSG)
2398 self.checkRecvmsgAddress(addr, self.cli_addr)
2399 self.assertEqual(ancdata, [])
2400 self.checkFlags(flags, eor=True)
2401
2402 def _testRecvmsgExplicitDefaults(self):
2403 self.sendToServer(MSG)
2404
2405 def testRecvmsgShorter(self):
2406 # Receive a message smaller than buffer.
2407 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2408 len(MSG) + 42)
2409 self.assertEqual(msg, MSG)
2410 self.checkRecvmsgAddress(addr, self.cli_addr)
2411 self.assertEqual(ancdata, [])
2412 self.checkFlags(flags, eor=True)
2413
2414 def _testRecvmsgShorter(self):
2415 self.sendToServer(MSG)
2416
Charles-François Natali8619cd72011-10-03 19:43:15 +02002417 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2418 # datagram is received (issue #13001).
2419 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002420 def testRecvmsgTrunc(self):
2421 # Receive part of message, check for truncation indicators.
2422 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2423 len(MSG) - 3)
2424 self.assertEqual(msg, MSG[:-3])
2425 self.checkRecvmsgAddress(addr, self.cli_addr)
2426 self.assertEqual(ancdata, [])
2427 self.checkFlags(flags, eor=False)
2428
Charles-François Natali8619cd72011-10-03 19:43:15 +02002429 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002430 def _testRecvmsgTrunc(self):
2431 self.sendToServer(MSG)
2432
2433 def testRecvmsgShortAncillaryBuf(self):
2434 # Test ancillary data buffer too small to hold any ancillary data.
2435 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2436 len(MSG), 1)
2437 self.assertEqual(msg, MSG)
2438 self.checkRecvmsgAddress(addr, self.cli_addr)
2439 self.assertEqual(ancdata, [])
2440 self.checkFlags(flags, eor=True)
2441
2442 def _testRecvmsgShortAncillaryBuf(self):
2443 self.sendToServer(MSG)
2444
2445 def testRecvmsgLongAncillaryBuf(self):
2446 # Test large ancillary data buffer.
2447 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2448 len(MSG), 10240)
2449 self.assertEqual(msg, MSG)
2450 self.checkRecvmsgAddress(addr, self.cli_addr)
2451 self.assertEqual(ancdata, [])
2452 self.checkFlags(flags, eor=True)
2453
2454 def _testRecvmsgLongAncillaryBuf(self):
2455 self.sendToServer(MSG)
2456
2457 def testRecvmsgAfterClose(self):
2458 # Check that recvmsg[_into]() fails on a closed socket.
2459 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002460 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002461
2462 def _testRecvmsgAfterClose(self):
2463 pass
2464
2465 def testRecvmsgTimeout(self):
2466 # Check that timeout works.
2467 try:
2468 self.serv_sock.settimeout(0.03)
2469 self.assertRaises(socket.timeout,
2470 self.doRecvmsg, self.serv_sock, len(MSG))
2471 finally:
2472 self.misc_event.set()
2473
2474 def _testRecvmsgTimeout(self):
2475 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2476
2477 @requireAttrs(socket, "MSG_PEEK")
2478 def testRecvmsgPeek(self):
2479 # Check that MSG_PEEK in flags enables examination of pending
2480 # data without consuming it.
2481
2482 # Receive part of data with MSG_PEEK.
2483 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2484 len(MSG) - 3, 0,
2485 socket.MSG_PEEK)
2486 self.assertEqual(msg, MSG[:-3])
2487 self.checkRecvmsgAddress(addr, self.cli_addr)
2488 self.assertEqual(ancdata, [])
2489 # Ignoring MSG_TRUNC here (so this test is the same for stream
2490 # and datagram sockets). Some wording in POSIX seems to
2491 # suggest that it needn't be set when peeking, but that may
2492 # just be a slip.
2493 self.checkFlags(flags, eor=False,
2494 ignore=getattr(socket, "MSG_TRUNC", 0))
2495
2496 # Receive all data with MSG_PEEK.
2497 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2498 len(MSG), 0,
2499 socket.MSG_PEEK)
2500 self.assertEqual(msg, MSG)
2501 self.checkRecvmsgAddress(addr, self.cli_addr)
2502 self.assertEqual(ancdata, [])
2503 self.checkFlags(flags, eor=True)
2504
2505 # Check that the same data can still be received normally.
2506 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2507 self.assertEqual(msg, MSG)
2508 self.checkRecvmsgAddress(addr, self.cli_addr)
2509 self.assertEqual(ancdata, [])
2510 self.checkFlags(flags, eor=True)
2511
2512 @testRecvmsgPeek.client_skip
2513 def _testRecvmsgPeek(self):
2514 self.sendToServer(MSG)
2515
2516 @requireAttrs(socket.socket, "sendmsg")
2517 def testRecvmsgFromSendmsg(self):
2518 # Test receiving with recvmsg[_into]() when message is sent
2519 # using sendmsg().
2520 self.serv_sock.settimeout(self.fail_timeout)
2521 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2522 self.assertEqual(msg, MSG)
2523 self.checkRecvmsgAddress(addr, self.cli_addr)
2524 self.assertEqual(ancdata, [])
2525 self.checkFlags(flags, eor=True)
2526
2527 @testRecvmsgFromSendmsg.client_skip
2528 def _testRecvmsgFromSendmsg(self):
2529 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2530
2531
2532class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2533 # Tests which require a stream socket and can use either recvmsg()
2534 # or recvmsg_into().
2535
2536 def testRecvmsgEOF(self):
2537 # Receive end-of-stream indicator (b"", peer socket closed).
2538 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2539 self.assertEqual(msg, b"")
2540 self.checkRecvmsgAddress(addr, self.cli_addr)
2541 self.assertEqual(ancdata, [])
2542 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2543
2544 def _testRecvmsgEOF(self):
2545 self.cli_sock.close()
2546
2547 def testRecvmsgOverflow(self):
2548 # Receive a message in more than one chunk.
2549 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2550 len(MSG) - 3)
2551 self.checkRecvmsgAddress(addr, self.cli_addr)
2552 self.assertEqual(ancdata, [])
2553 self.checkFlags(flags, eor=False)
2554
2555 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2556 self.checkRecvmsgAddress(addr, self.cli_addr)
2557 self.assertEqual(ancdata, [])
2558 self.checkFlags(flags, eor=True)
2559
2560 msg = seg1 + seg2
2561 self.assertEqual(msg, MSG)
2562
2563 def _testRecvmsgOverflow(self):
2564 self.sendToServer(MSG)
2565
2566
2567class RecvmsgTests(RecvmsgGenericTests):
2568 # Tests for recvmsg() which can use any socket type.
2569
2570 def testRecvmsgBadArgs(self):
2571 # Check that recvmsg() rejects invalid arguments.
2572 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2573 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2574 -1, 0, 0)
2575 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2576 len(MSG), -1, 0)
2577 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2578 [bytearray(10)], 0, 0)
2579 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2580 object(), 0, 0)
2581 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2582 len(MSG), object(), 0)
2583 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2584 len(MSG), 0, object())
2585
2586 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2587 self.assertEqual(msg, MSG)
2588 self.checkRecvmsgAddress(addr, self.cli_addr)
2589 self.assertEqual(ancdata, [])
2590 self.checkFlags(flags, eor=True)
2591
2592 def _testRecvmsgBadArgs(self):
2593 self.sendToServer(MSG)
2594
2595
2596class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2597 # Tests for recvmsg_into() which can use any socket type.
2598
2599 def testRecvmsgIntoBadArgs(self):
2600 # Check that recvmsg_into() rejects invalid arguments.
2601 buf = bytearray(len(MSG))
2602 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2603 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2604 len(MSG), 0, 0)
2605 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2606 buf, 0, 0)
2607 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2608 [object()], 0, 0)
2609 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2610 [b"I'm not writable"], 0, 0)
2611 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2612 [buf, object()], 0, 0)
2613 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2614 [buf], -1, 0)
2615 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2616 [buf], object(), 0)
2617 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2618 [buf], 0, object())
2619
2620 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2621 self.assertEqual(nbytes, len(MSG))
2622 self.assertEqual(buf, bytearray(MSG))
2623 self.checkRecvmsgAddress(addr, self.cli_addr)
2624 self.assertEqual(ancdata, [])
2625 self.checkFlags(flags, eor=True)
2626
2627 def _testRecvmsgIntoBadArgs(self):
2628 self.sendToServer(MSG)
2629
2630 def testRecvmsgIntoGenerator(self):
2631 # Receive into buffer obtained from a generator (not a sequence).
2632 buf = bytearray(len(MSG))
2633 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2634 (o for o in [buf]))
2635 self.assertEqual(nbytes, len(MSG))
2636 self.assertEqual(buf, bytearray(MSG))
2637 self.checkRecvmsgAddress(addr, self.cli_addr)
2638 self.assertEqual(ancdata, [])
2639 self.checkFlags(flags, eor=True)
2640
2641 def _testRecvmsgIntoGenerator(self):
2642 self.sendToServer(MSG)
2643
2644 def testRecvmsgIntoArray(self):
2645 # Receive into an array rather than the usual bytearray.
2646 buf = array.array("B", [0] * len(MSG))
2647 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2648 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002649 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002650 self.checkRecvmsgAddress(addr, self.cli_addr)
2651 self.assertEqual(ancdata, [])
2652 self.checkFlags(flags, eor=True)
2653
2654 def _testRecvmsgIntoArray(self):
2655 self.sendToServer(MSG)
2656
2657 def testRecvmsgIntoScatter(self):
2658 # Receive into multiple buffers (scatter write).
2659 b1 = bytearray(b"----")
2660 b2 = bytearray(b"0123456789")
2661 b3 = bytearray(b"--------------")
2662 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2663 [b1, memoryview(b2)[2:9], b3])
2664 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2665 self.assertEqual(b1, bytearray(b"Mary"))
2666 self.assertEqual(b2, bytearray(b"01 had a 9"))
2667 self.assertEqual(b3, bytearray(b"little lamb---"))
2668 self.checkRecvmsgAddress(addr, self.cli_addr)
2669 self.assertEqual(ancdata, [])
2670 self.checkFlags(flags, eor=True)
2671
2672 def _testRecvmsgIntoScatter(self):
2673 self.sendToServer(b"Mary had a little lamb")
2674
2675
2676class CmsgMacroTests(unittest.TestCase):
2677 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2678 # assumptions used by sendmsg() and recvmsg[_into](), which share
2679 # code with these functions.
2680
2681 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002682 try:
2683 import _testcapi
2684 except ImportError:
2685 socklen_t_limit = 0x7fffffff
2686 else:
2687 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002688
2689 @requireAttrs(socket, "CMSG_LEN")
2690 def testCMSG_LEN(self):
2691 # Test CMSG_LEN() with various valid and invalid values,
2692 # checking the assumptions used by recvmsg() and sendmsg().
2693 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2694 values = list(range(257)) + list(range(toobig - 257, toobig))
2695
2696 # struct cmsghdr has at least three members, two of which are ints
2697 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2698 for n in values:
2699 ret = socket.CMSG_LEN(n)
2700 # This is how recvmsg() calculates the data size
2701 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2702 self.assertLessEqual(ret, self.socklen_t_limit)
2703
2704 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2705 # sendmsg() shares code with these functions, and requires
2706 # that it reject values over the limit.
2707 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2708 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2709
2710 @requireAttrs(socket, "CMSG_SPACE")
2711 def testCMSG_SPACE(self):
2712 # Test CMSG_SPACE() with various valid and invalid values,
2713 # checking the assumptions used by sendmsg().
2714 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2715 values = list(range(257)) + list(range(toobig - 257, toobig))
2716
2717 last = socket.CMSG_SPACE(0)
2718 # struct cmsghdr has at least three members, two of which are ints
2719 self.assertGreater(last, array.array("i").itemsize * 2)
2720 for n in values:
2721 ret = socket.CMSG_SPACE(n)
2722 self.assertGreaterEqual(ret, last)
2723 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2724 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2725 self.assertLessEqual(ret, self.socklen_t_limit)
2726 last = ret
2727
2728 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2729 # sendmsg() shares code with these functions, and requires
2730 # that it reject values over the limit.
2731 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2732 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2733
2734
2735class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2736 # Tests for file descriptor passing on Unix-domain sockets.
2737
2738 # Invalid file descriptor value that's unlikely to evaluate to a
2739 # real FD even if one of its bytes is replaced with a different
2740 # value (which shouldn't actually happen).
2741 badfd = -0x5555
2742
2743 def newFDs(self, n):
2744 # Return a list of n file descriptors for newly-created files
2745 # containing their list indices as ASCII numbers.
2746 fds = []
2747 for i in range(n):
2748 fd, path = tempfile.mkstemp()
2749 self.addCleanup(os.unlink, path)
2750 self.addCleanup(os.close, fd)
2751 os.write(fd, str(i).encode())
2752 fds.append(fd)
2753 return fds
2754
2755 def checkFDs(self, fds):
2756 # Check that the file descriptors in the given list contain
2757 # their correct list indices as ASCII numbers.
2758 for n, fd in enumerate(fds):
2759 os.lseek(fd, 0, os.SEEK_SET)
2760 self.assertEqual(os.read(fd, 1024), str(n).encode())
2761
2762 def registerRecvmsgResult(self, result):
2763 self.addCleanup(self.closeRecvmsgFDs, result)
2764
2765 def closeRecvmsgFDs(self, recvmsg_result):
2766 # Close all file descriptors specified in the ancillary data
2767 # of the given return value from recvmsg() or recvmsg_into().
2768 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2769 if (cmsg_level == socket.SOL_SOCKET and
2770 cmsg_type == socket.SCM_RIGHTS):
2771 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002772 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002773 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2774 for fd in fds:
2775 os.close(fd)
2776
2777 def createAndSendFDs(self, n):
2778 # Send n new file descriptors created by newFDs() to the
2779 # server, with the constant MSG as the non-ancillary data.
2780 self.assertEqual(
2781 self.sendmsgToServer([MSG],
2782 [(socket.SOL_SOCKET,
2783 socket.SCM_RIGHTS,
2784 array.array("i", self.newFDs(n)))]),
2785 len(MSG))
2786
2787 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2788 # Check that constant MSG was received with numfds file
2789 # descriptors in a maximum of maxcmsgs control messages (which
2790 # must contain only complete integers). By default, check
2791 # that MSG_CTRUNC is unset, but ignore any flags in
2792 # ignoreflags.
2793 msg, ancdata, flags, addr = result
2794 self.assertEqual(msg, MSG)
2795 self.checkRecvmsgAddress(addr, self.cli_addr)
2796 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2797 ignore=ignoreflags)
2798
2799 self.assertIsInstance(ancdata, list)
2800 self.assertLessEqual(len(ancdata), maxcmsgs)
2801 fds = array.array("i")
2802 for item in ancdata:
2803 self.assertIsInstance(item, tuple)
2804 cmsg_level, cmsg_type, cmsg_data = item
2805 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2806 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2807 self.assertIsInstance(cmsg_data, bytes)
2808 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002809 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002810
2811 self.assertEqual(len(fds), numfds)
2812 self.checkFDs(fds)
2813
2814 def testFDPassSimple(self):
2815 # Pass a single FD (array read from bytes object).
2816 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2817 len(MSG), 10240))
2818
2819 def _testFDPassSimple(self):
2820 self.assertEqual(
2821 self.sendmsgToServer(
2822 [MSG],
2823 [(socket.SOL_SOCKET,
2824 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002825 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002826 len(MSG))
2827
2828 def testMultipleFDPass(self):
2829 # Pass multiple FDs in a single array.
2830 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2831 len(MSG), 10240))
2832
2833 def _testMultipleFDPass(self):
2834 self.createAndSendFDs(4)
2835
2836 @requireAttrs(socket, "CMSG_SPACE")
2837 def testFDPassCMSG_SPACE(self):
2838 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2839 self.checkRecvmsgFDs(
2840 4, self.doRecvmsg(self.serv_sock, len(MSG),
2841 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2842
2843 @testFDPassCMSG_SPACE.client_skip
2844 def _testFDPassCMSG_SPACE(self):
2845 self.createAndSendFDs(4)
2846
2847 def testFDPassCMSG_LEN(self):
2848 # Test using CMSG_LEN() to calculate ancillary buffer size.
2849 self.checkRecvmsgFDs(1,
2850 self.doRecvmsg(self.serv_sock, len(MSG),
2851 socket.CMSG_LEN(4 * SIZEOF_INT)),
2852 # RFC 3542 says implementations may set
2853 # MSG_CTRUNC if there isn't enough space
2854 # for trailing padding.
2855 ignoreflags=socket.MSG_CTRUNC)
2856
2857 def _testFDPassCMSG_LEN(self):
2858 self.createAndSendFDs(1)
2859
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002860 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002861 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002862 @requireAttrs(socket, "CMSG_SPACE")
2863 def testFDPassSeparate(self):
2864 # Pass two FDs in two separate arrays. Arrays may be combined
2865 # into a single control message by the OS.
2866 self.checkRecvmsgFDs(2,
2867 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2868 maxcmsgs=2)
2869
2870 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002871 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002872 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002873 def _testFDPassSeparate(self):
2874 fd0, fd1 = self.newFDs(2)
2875 self.assertEqual(
2876 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2877 socket.SCM_RIGHTS,
2878 array.array("i", [fd0])),
2879 (socket.SOL_SOCKET,
2880 socket.SCM_RIGHTS,
2881 array.array("i", [fd1]))]),
2882 len(MSG))
2883
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002884 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002885 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002886 @requireAttrs(socket, "CMSG_SPACE")
2887 def testFDPassSeparateMinSpace(self):
2888 # Pass two FDs in two separate arrays, receiving them into the
2889 # minimum space for two arrays.
2890 self.checkRecvmsgFDs(2,
2891 self.doRecvmsg(self.serv_sock, len(MSG),
2892 socket.CMSG_SPACE(SIZEOF_INT) +
2893 socket.CMSG_LEN(SIZEOF_INT)),
2894 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2895
2896 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002897 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002898 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002899 def _testFDPassSeparateMinSpace(self):
2900 fd0, fd1 = self.newFDs(2)
2901 self.assertEqual(
2902 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2903 socket.SCM_RIGHTS,
2904 array.array("i", [fd0])),
2905 (socket.SOL_SOCKET,
2906 socket.SCM_RIGHTS,
2907 array.array("i", [fd1]))]),
2908 len(MSG))
2909
2910 def sendAncillaryIfPossible(self, msg, ancdata):
2911 # Try to send msg and ancdata to server, but if the system
2912 # call fails, just send msg with no ancillary data.
2913 try:
2914 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002915 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002916 # Check that it was the system call that failed
2917 self.assertIsInstance(e.errno, int)
2918 nbytes = self.sendmsgToServer([msg])
2919 self.assertEqual(nbytes, len(msg))
2920
Brett Cannon3bbad122015-12-28 17:21:44 -08002921 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002922 def testFDPassEmpty(self):
2923 # Try to pass an empty FD array. Can receive either no array
2924 # or an empty array.
2925 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2926 len(MSG), 10240),
2927 ignoreflags=socket.MSG_CTRUNC)
2928
2929 def _testFDPassEmpty(self):
2930 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2931 socket.SCM_RIGHTS,
2932 b"")])
2933
2934 def testFDPassPartialInt(self):
2935 # Try to pass a truncated FD array.
2936 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2937 len(MSG), 10240)
2938 self.assertEqual(msg, MSG)
2939 self.checkRecvmsgAddress(addr, self.cli_addr)
2940 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2941 self.assertLessEqual(len(ancdata), 1)
2942 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2943 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2944 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2945 self.assertLess(len(cmsg_data), SIZEOF_INT)
2946
2947 def _testFDPassPartialInt(self):
2948 self.sendAncillaryIfPossible(
2949 MSG,
2950 [(socket.SOL_SOCKET,
2951 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002952 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002953
2954 @requireAttrs(socket, "CMSG_SPACE")
2955 def testFDPassPartialIntInMiddle(self):
2956 # Try to pass two FD arrays, the first of which is truncated.
2957 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2958 len(MSG), 10240)
2959 self.assertEqual(msg, MSG)
2960 self.checkRecvmsgAddress(addr, self.cli_addr)
2961 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2962 self.assertLessEqual(len(ancdata), 2)
2963 fds = array.array("i")
2964 # Arrays may have been combined in a single control message
2965 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2966 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2967 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002968 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002969 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2970 self.assertLessEqual(len(fds), 2)
2971 self.checkFDs(fds)
2972
2973 @testFDPassPartialIntInMiddle.client_skip
2974 def _testFDPassPartialIntInMiddle(self):
2975 fd0, fd1 = self.newFDs(2)
2976 self.sendAncillaryIfPossible(
2977 MSG,
2978 [(socket.SOL_SOCKET,
2979 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002980 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002981 (socket.SOL_SOCKET,
2982 socket.SCM_RIGHTS,
2983 array.array("i", [fd1]))])
2984
2985 def checkTruncatedHeader(self, result, ignoreflags=0):
2986 # Check that no ancillary data items are returned when data is
2987 # truncated inside the cmsghdr structure.
2988 msg, ancdata, flags, addr = result
2989 self.assertEqual(msg, MSG)
2990 self.checkRecvmsgAddress(addr, self.cli_addr)
2991 self.assertEqual(ancdata, [])
2992 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2993 ignore=ignoreflags)
2994
2995 def testCmsgTruncNoBufSize(self):
2996 # Check that no ancillary data is received when no buffer size
2997 # is specified.
2998 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2999 # BSD seems to set MSG_CTRUNC only
3000 # if an item has been partially
3001 # received.
3002 ignoreflags=socket.MSG_CTRUNC)
3003
3004 def _testCmsgTruncNoBufSize(self):
3005 self.createAndSendFDs(1)
3006
3007 def testCmsgTrunc0(self):
3008 # Check that no ancillary data is received when buffer size is 0.
3009 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3010 ignoreflags=socket.MSG_CTRUNC)
3011
3012 def _testCmsgTrunc0(self):
3013 self.createAndSendFDs(1)
3014
3015 # Check that no ancillary data is returned for various non-zero
3016 # (but still too small) buffer sizes.
3017
3018 def testCmsgTrunc1(self):
3019 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3020
3021 def _testCmsgTrunc1(self):
3022 self.createAndSendFDs(1)
3023
3024 def testCmsgTrunc2Int(self):
3025 # The cmsghdr structure has at least three members, two of
3026 # which are ints, so we still shouldn't see any ancillary
3027 # data.
3028 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3029 SIZEOF_INT * 2))
3030
3031 def _testCmsgTrunc2Int(self):
3032 self.createAndSendFDs(1)
3033
3034 def testCmsgTruncLen0Minus1(self):
3035 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3036 socket.CMSG_LEN(0) - 1))
3037
3038 def _testCmsgTruncLen0Minus1(self):
3039 self.createAndSendFDs(1)
3040
3041 # The following tests try to truncate the control message in the
3042 # middle of the FD array.
3043
3044 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3045 # Check that file descriptor data is truncated to between
3046 # mindata and maxdata bytes when received with buffer size
3047 # ancbuf, and that any complete file descriptor numbers are
3048 # valid.
3049 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3050 len(MSG), ancbuf)
3051 self.assertEqual(msg, MSG)
3052 self.checkRecvmsgAddress(addr, self.cli_addr)
3053 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3054
3055 if mindata == 0 and ancdata == []:
3056 return
3057 self.assertEqual(len(ancdata), 1)
3058 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3059 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3060 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3061 self.assertGreaterEqual(len(cmsg_data), mindata)
3062 self.assertLessEqual(len(cmsg_data), maxdata)
3063 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003064 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003065 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3066 self.checkFDs(fds)
3067
3068 def testCmsgTruncLen0(self):
3069 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3070
3071 def _testCmsgTruncLen0(self):
3072 self.createAndSendFDs(1)
3073
3074 def testCmsgTruncLen0Plus1(self):
3075 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3076
3077 def _testCmsgTruncLen0Plus1(self):
3078 self.createAndSendFDs(2)
3079
3080 def testCmsgTruncLen1(self):
3081 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3082 maxdata=SIZEOF_INT)
3083
3084 def _testCmsgTruncLen1(self):
3085 self.createAndSendFDs(2)
3086
3087 def testCmsgTruncLen2Minus1(self):
3088 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3089 maxdata=(2 * SIZEOF_INT) - 1)
3090
3091 def _testCmsgTruncLen2Minus1(self):
3092 self.createAndSendFDs(2)
3093
3094
3095class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3096 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3097 # features of the RFC 3542 Advanced Sockets API for IPv6.
3098 # Currently we can only handle certain data items (e.g. traffic
3099 # class, hop limit, MTU discovery and fragmentation settings)
3100 # without resorting to unportable means such as the struct module,
3101 # but the tests here are aimed at testing the ancillary data
3102 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3103 # itself.
3104
3105 # Test value to use when setting hop limit of packet
3106 hop_limit = 2
3107
3108 # Test value to use when setting traffic class of packet.
3109 # -1 means "use kernel default".
3110 traffic_class = -1
3111
3112 def ancillaryMapping(self, ancdata):
3113 # Given ancillary data list ancdata, return a mapping from
3114 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3115 # Check that no (level, type) pair appears more than once.
3116 d = {}
3117 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3118 self.assertNotIn((cmsg_level, cmsg_type), d)
3119 d[(cmsg_level, cmsg_type)] = cmsg_data
3120 return d
3121
3122 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3123 # Receive hop limit into ancbufsize bytes of ancillary data
3124 # space. Check that data is MSG, ancillary data is not
3125 # truncated (but ignore any flags in ignoreflags), and hop
3126 # limit is between 0 and maxhop inclusive.
3127 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3128 socket.IPV6_RECVHOPLIMIT, 1)
3129 self.misc_event.set()
3130 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3131 len(MSG), ancbufsize)
3132
3133 self.assertEqual(msg, MSG)
3134 self.checkRecvmsgAddress(addr, self.cli_addr)
3135 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3136 ignore=ignoreflags)
3137
3138 self.assertEqual(len(ancdata), 1)
3139 self.assertIsInstance(ancdata[0], tuple)
3140 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3141 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3142 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3143 self.assertIsInstance(cmsg_data, bytes)
3144 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3145 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003146 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003147 self.assertGreaterEqual(a[0], 0)
3148 self.assertLessEqual(a[0], maxhop)
3149
3150 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3151 def testRecvHopLimit(self):
3152 # Test receiving the packet hop limit as ancillary data.
3153 self.checkHopLimit(ancbufsize=10240)
3154
3155 @testRecvHopLimit.client_skip
3156 def _testRecvHopLimit(self):
3157 # Need to wait until server has asked to receive ancillary
3158 # data, as implementations are not required to buffer it
3159 # otherwise.
3160 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3161 self.sendToServer(MSG)
3162
3163 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3164 def testRecvHopLimitCMSG_SPACE(self):
3165 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3166 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3167
3168 @testRecvHopLimitCMSG_SPACE.client_skip
3169 def _testRecvHopLimitCMSG_SPACE(self):
3170 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3171 self.sendToServer(MSG)
3172
3173 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3174 # 3542 says portable applications must provide space for trailing
3175 # padding. Implementations may set MSG_CTRUNC if there isn't
3176 # enough space for the padding.
3177
3178 @requireAttrs(socket.socket, "sendmsg")
3179 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3180 def testSetHopLimit(self):
3181 # Test setting hop limit on outgoing packet and receiving it
3182 # at the other end.
3183 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3184
3185 @testSetHopLimit.client_skip
3186 def _testSetHopLimit(self):
3187 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3188 self.assertEqual(
3189 self.sendmsgToServer([MSG],
3190 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3191 array.array("i", [self.hop_limit]))]),
3192 len(MSG))
3193
3194 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3195 ignoreflags=0):
3196 # Receive traffic class and hop limit into ancbufsize bytes of
3197 # ancillary data space. Check that data is MSG, ancillary
3198 # data is not truncated (but ignore any flags in ignoreflags),
3199 # and traffic class and hop limit are in range (hop limit no
3200 # more than maxhop).
3201 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3202 socket.IPV6_RECVHOPLIMIT, 1)
3203 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3204 socket.IPV6_RECVTCLASS, 1)
3205 self.misc_event.set()
3206 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3207 len(MSG), ancbufsize)
3208
3209 self.assertEqual(msg, MSG)
3210 self.checkRecvmsgAddress(addr, self.cli_addr)
3211 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3212 ignore=ignoreflags)
3213 self.assertEqual(len(ancdata), 2)
3214 ancmap = self.ancillaryMapping(ancdata)
3215
3216 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3217 self.assertEqual(len(tcdata), SIZEOF_INT)
3218 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003219 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003220 self.assertGreaterEqual(a[0], 0)
3221 self.assertLessEqual(a[0], 255)
3222
3223 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3224 self.assertEqual(len(hldata), SIZEOF_INT)
3225 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003226 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003227 self.assertGreaterEqual(a[0], 0)
3228 self.assertLessEqual(a[0], maxhop)
3229
3230 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3231 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3232 def testRecvTrafficClassAndHopLimit(self):
3233 # Test receiving traffic class and hop limit as ancillary data.
3234 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3235
3236 @testRecvTrafficClassAndHopLimit.client_skip
3237 def _testRecvTrafficClassAndHopLimit(self):
3238 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3239 self.sendToServer(MSG)
3240
3241 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3242 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3243 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3244 # Test receiving traffic class and hop limit, using
3245 # CMSG_SPACE() to calculate buffer size.
3246 self.checkTrafficClassAndHopLimit(
3247 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3248
3249 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3250 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3251 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3252 self.sendToServer(MSG)
3253
3254 @requireAttrs(socket.socket, "sendmsg")
3255 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3256 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3257 def testSetTrafficClassAndHopLimit(self):
3258 # Test setting traffic class and hop limit on outgoing packet,
3259 # and receiving them at the other end.
3260 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3261 maxhop=self.hop_limit)
3262
3263 @testSetTrafficClassAndHopLimit.client_skip
3264 def _testSetTrafficClassAndHopLimit(self):
3265 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3266 self.assertEqual(
3267 self.sendmsgToServer([MSG],
3268 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3269 array.array("i", [self.traffic_class])),
3270 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3271 array.array("i", [self.hop_limit]))]),
3272 len(MSG))
3273
3274 @requireAttrs(socket.socket, "sendmsg")
3275 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3276 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3277 def testOddCmsgSize(self):
3278 # Try to send ancillary data with first item one byte too
3279 # long. Fall back to sending with correct size if this fails,
3280 # and check that second item was handled correctly.
3281 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3282 maxhop=self.hop_limit)
3283
3284 @testOddCmsgSize.client_skip
3285 def _testOddCmsgSize(self):
3286 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3287 try:
3288 nbytes = self.sendmsgToServer(
3289 [MSG],
3290 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003291 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003292 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3293 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003294 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003295 self.assertIsInstance(e.errno, int)
3296 nbytes = self.sendmsgToServer(
3297 [MSG],
3298 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3299 array.array("i", [self.traffic_class])),
3300 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3301 array.array("i", [self.hop_limit]))])
3302 self.assertEqual(nbytes, len(MSG))
3303
3304 # Tests for proper handling of truncated ancillary data
3305
3306 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3307 # Receive hop limit into ancbufsize bytes of ancillary data
3308 # space, which should be too small to contain the ancillary
3309 # data header (if ancbufsize is None, pass no second argument
3310 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3311 # (unless included in ignoreflags), and no ancillary data is
3312 # returned.
3313 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3314 socket.IPV6_RECVHOPLIMIT, 1)
3315 self.misc_event.set()
3316 args = () if ancbufsize is None else (ancbufsize,)
3317 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3318 len(MSG), *args)
3319
3320 self.assertEqual(msg, MSG)
3321 self.checkRecvmsgAddress(addr, self.cli_addr)
3322 self.assertEqual(ancdata, [])
3323 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3324 ignore=ignoreflags)
3325
3326 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3327 def testCmsgTruncNoBufSize(self):
3328 # Check that no ancillary data is received when no ancillary
3329 # buffer size is provided.
3330 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3331 # BSD seems to set
3332 # MSG_CTRUNC only if an item
3333 # has been partially
3334 # received.
3335 ignoreflags=socket.MSG_CTRUNC)
3336
3337 @testCmsgTruncNoBufSize.client_skip
3338 def _testCmsgTruncNoBufSize(self):
3339 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3340 self.sendToServer(MSG)
3341
3342 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3343 def testSingleCmsgTrunc0(self):
3344 # Check that no ancillary data is received when ancillary
3345 # buffer size is zero.
3346 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3347 ignoreflags=socket.MSG_CTRUNC)
3348
3349 @testSingleCmsgTrunc0.client_skip
3350 def _testSingleCmsgTrunc0(self):
3351 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3352 self.sendToServer(MSG)
3353
3354 # Check that no ancillary data is returned for various non-zero
3355 # (but still too small) buffer sizes.
3356
3357 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3358 def testSingleCmsgTrunc1(self):
3359 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3360
3361 @testSingleCmsgTrunc1.client_skip
3362 def _testSingleCmsgTrunc1(self):
3363 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3364 self.sendToServer(MSG)
3365
3366 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3367 def testSingleCmsgTrunc2Int(self):
3368 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3369
3370 @testSingleCmsgTrunc2Int.client_skip
3371 def _testSingleCmsgTrunc2Int(self):
3372 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3373 self.sendToServer(MSG)
3374
3375 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3376 def testSingleCmsgTruncLen0Minus1(self):
3377 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3378
3379 @testSingleCmsgTruncLen0Minus1.client_skip
3380 def _testSingleCmsgTruncLen0Minus1(self):
3381 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3382 self.sendToServer(MSG)
3383
3384 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3385 def testSingleCmsgTruncInData(self):
3386 # Test truncation of a control message inside its associated
3387 # data. The message may be returned with its data truncated,
3388 # or not returned at all.
3389 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3390 socket.IPV6_RECVHOPLIMIT, 1)
3391 self.misc_event.set()
3392 msg, ancdata, flags, addr = self.doRecvmsg(
3393 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3394
3395 self.assertEqual(msg, MSG)
3396 self.checkRecvmsgAddress(addr, self.cli_addr)
3397 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3398
3399 self.assertLessEqual(len(ancdata), 1)
3400 if ancdata:
3401 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3402 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3403 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3404 self.assertLess(len(cmsg_data), SIZEOF_INT)
3405
3406 @testSingleCmsgTruncInData.client_skip
3407 def _testSingleCmsgTruncInData(self):
3408 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3409 self.sendToServer(MSG)
3410
3411 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3412 # Receive traffic class and hop limit into ancbufsize bytes of
3413 # ancillary data space, which should be large enough to
3414 # contain the first item, but too small to contain the header
3415 # of the second. Check that data is MSG, MSG_CTRUNC is set
3416 # (unless included in ignoreflags), and only one ancillary
3417 # data item is returned.
3418 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3419 socket.IPV6_RECVHOPLIMIT, 1)
3420 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3421 socket.IPV6_RECVTCLASS, 1)
3422 self.misc_event.set()
3423 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3424 len(MSG), ancbufsize)
3425
3426 self.assertEqual(msg, MSG)
3427 self.checkRecvmsgAddress(addr, self.cli_addr)
3428 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3429 ignore=ignoreflags)
3430
3431 self.assertEqual(len(ancdata), 1)
3432 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3433 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3434 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3435 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3436 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003437 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003438 self.assertGreaterEqual(a[0], 0)
3439 self.assertLessEqual(a[0], 255)
3440
3441 # Try the above test with various buffer sizes.
3442
3443 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3444 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3445 def testSecondCmsgTrunc0(self):
3446 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3447 ignoreflags=socket.MSG_CTRUNC)
3448
3449 @testSecondCmsgTrunc0.client_skip
3450 def _testSecondCmsgTrunc0(self):
3451 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3452 self.sendToServer(MSG)
3453
3454 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3455 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3456 def testSecondCmsgTrunc1(self):
3457 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3458
3459 @testSecondCmsgTrunc1.client_skip
3460 def _testSecondCmsgTrunc1(self):
3461 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3462 self.sendToServer(MSG)
3463
3464 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3465 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3466 def testSecondCmsgTrunc2Int(self):
3467 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3468 2 * SIZEOF_INT)
3469
3470 @testSecondCmsgTrunc2Int.client_skip
3471 def _testSecondCmsgTrunc2Int(self):
3472 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3473 self.sendToServer(MSG)
3474
3475 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3476 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3477 def testSecondCmsgTruncLen0Minus1(self):
3478 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3479 socket.CMSG_LEN(0) - 1)
3480
3481 @testSecondCmsgTruncLen0Minus1.client_skip
3482 def _testSecondCmsgTruncLen0Minus1(self):
3483 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3484 self.sendToServer(MSG)
3485
3486 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3487 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3488 def testSecomdCmsgTruncInData(self):
3489 # Test truncation of the second of two control messages inside
3490 # its associated data.
3491 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3492 socket.IPV6_RECVHOPLIMIT, 1)
3493 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3494 socket.IPV6_RECVTCLASS, 1)
3495 self.misc_event.set()
3496 msg, ancdata, flags, addr = self.doRecvmsg(
3497 self.serv_sock, len(MSG),
3498 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3499
3500 self.assertEqual(msg, MSG)
3501 self.checkRecvmsgAddress(addr, self.cli_addr)
3502 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3503
3504 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3505
3506 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3507 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3508 cmsg_types.remove(cmsg_type)
3509 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3510 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003511 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003512 self.assertGreaterEqual(a[0], 0)
3513 self.assertLessEqual(a[0], 255)
3514
3515 if ancdata:
3516 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3517 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3518 cmsg_types.remove(cmsg_type)
3519 self.assertLess(len(cmsg_data), SIZEOF_INT)
3520
3521 self.assertEqual(ancdata, [])
3522
3523 @testSecomdCmsgTruncInData.client_skip
3524 def _testSecomdCmsgTruncInData(self):
3525 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3526 self.sendToServer(MSG)
3527
3528
3529# Derive concrete test classes for different socket types.
3530
3531class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3532 SendrecvmsgConnectionlessBase,
3533 ThreadedSocketTestMixin, UDPTestBase):
3534 pass
3535
3536@requireAttrs(socket.socket, "sendmsg")
3537@unittest.skipUnless(thread, 'Threading required for this test.')
3538class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3539 pass
3540
3541@requireAttrs(socket.socket, "recvmsg")
3542@unittest.skipUnless(thread, 'Threading required for this test.')
3543class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3544 pass
3545
3546@requireAttrs(socket.socket, "recvmsg_into")
3547@unittest.skipUnless(thread, 'Threading required for this test.')
3548class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3549 pass
3550
3551
3552class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3553 SendrecvmsgConnectionlessBase,
3554 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003555
3556 def checkRecvmsgAddress(self, addr1, addr2):
3557 # Called to compare the received address with the address of
3558 # the peer, ignoring scope ID
3559 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003560
3561@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003562@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003563@requireSocket("AF_INET6", "SOCK_DGRAM")
3564@unittest.skipUnless(thread, 'Threading required for this test.')
3565class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3566 pass
3567
3568@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003569@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003570@requireSocket("AF_INET6", "SOCK_DGRAM")
3571@unittest.skipUnless(thread, 'Threading required for this test.')
3572class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3573 pass
3574
3575@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003576@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003577@requireSocket("AF_INET6", "SOCK_DGRAM")
3578@unittest.skipUnless(thread, 'Threading required for this test.')
3579class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3580 pass
3581
3582@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003583@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003584@requireAttrs(socket, "IPPROTO_IPV6")
3585@requireSocket("AF_INET6", "SOCK_DGRAM")
3586@unittest.skipUnless(thread, 'Threading required for this test.')
3587class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3588 SendrecvmsgUDP6TestBase):
3589 pass
3590
3591@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003592@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003593@requireAttrs(socket, "IPPROTO_IPV6")
3594@requireSocket("AF_INET6", "SOCK_DGRAM")
3595@unittest.skipUnless(thread, 'Threading required for this test.')
3596class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3597 RFC3542AncillaryTest,
3598 SendrecvmsgUDP6TestBase):
3599 pass
3600
3601
3602class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3603 ConnectedStreamTestMixin, TCPTestBase):
3604 pass
3605
3606@requireAttrs(socket.socket, "sendmsg")
3607@unittest.skipUnless(thread, 'Threading required for this test.')
3608class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3609 pass
3610
3611@requireAttrs(socket.socket, "recvmsg")
3612@unittest.skipUnless(thread, 'Threading required for this test.')
3613class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3614 SendrecvmsgTCPTestBase):
3615 pass
3616
3617@requireAttrs(socket.socket, "recvmsg_into")
3618@unittest.skipUnless(thread, 'Threading required for this test.')
3619class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3620 SendrecvmsgTCPTestBase):
3621 pass
3622
3623
3624class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3625 SendrecvmsgConnectedBase,
3626 ConnectedStreamTestMixin, SCTPStreamBase):
3627 pass
3628
3629@requireAttrs(socket.socket, "sendmsg")
3630@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3631@unittest.skipUnless(thread, 'Threading required for this test.')
3632class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3633 pass
3634
3635@requireAttrs(socket.socket, "recvmsg")
3636@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3637@unittest.skipUnless(thread, 'Threading required for this test.')
3638class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3639 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003640
3641 def testRecvmsgEOF(self):
3642 try:
3643 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3644 except OSError as e:
3645 if e.errno != errno.ENOTCONN:
3646 raise
3647 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003648
3649@requireAttrs(socket.socket, "recvmsg_into")
3650@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3651@unittest.skipUnless(thread, 'Threading required for this test.')
3652class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3653 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003654
3655 def testRecvmsgEOF(self):
3656 try:
3657 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3658 except OSError as e:
3659 if e.errno != errno.ENOTCONN:
3660 raise
3661 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003662
3663
3664class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3665 ConnectedStreamTestMixin, UnixStreamBase):
3666 pass
3667
3668@requireAttrs(socket.socket, "sendmsg")
3669@requireAttrs(socket, "AF_UNIX")
3670@unittest.skipUnless(thread, 'Threading required for this test.')
3671class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3672 pass
3673
3674@requireAttrs(socket.socket, "recvmsg")
3675@requireAttrs(socket, "AF_UNIX")
3676@unittest.skipUnless(thread, 'Threading required for this test.')
3677class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3678 SendrecvmsgUnixStreamTestBase):
3679 pass
3680
3681@requireAttrs(socket.socket, "recvmsg_into")
3682@requireAttrs(socket, "AF_UNIX")
3683@unittest.skipUnless(thread, 'Threading required for this test.')
3684class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3685 SendrecvmsgUnixStreamTestBase):
3686 pass
3687
3688@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3689@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3690@unittest.skipUnless(thread, 'Threading required for this test.')
3691class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3692 pass
3693
3694@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3695@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3696@unittest.skipUnless(thread, 'Threading required for this test.')
3697class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3698 SendrecvmsgUnixStreamTestBase):
3699 pass
3700
3701
3702# Test interrupting the interruptible send/receive methods with a
3703# signal when a timeout is set. These tests avoid having multiple
3704# threads alive during the test so that the OS cannot deliver the
3705# signal to the wrong one.
3706
3707class InterruptedTimeoutBase(unittest.TestCase):
3708 # Base class for interrupted send/receive tests. Installs an
3709 # empty handler for SIGALRM and removes it on teardown, along with
3710 # any scheduled alarms.
3711
3712 def setUp(self):
3713 super().setUp()
3714 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003715 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003716 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3717 self.addCleanup(self.setAlarm, 0)
3718
3719 # Timeout for socket operations
3720 timeout = 4.0
3721
3722 # Provide setAlarm() method to schedule delivery of SIGALRM after
3723 # given number of seconds, or cancel it if zero, and an
3724 # appropriate time value to use. Use setitimer() if available.
3725 if hasattr(signal, "setitimer"):
3726 alarm_time = 0.05
3727
3728 def setAlarm(self, seconds):
3729 signal.setitimer(signal.ITIMER_REAL, seconds)
3730 else:
3731 # Old systems may deliver the alarm up to one second early
3732 alarm_time = 2
3733
3734 def setAlarm(self, seconds):
3735 signal.alarm(seconds)
3736
3737
3738# Require siginterrupt() in order to ensure that system calls are
3739# interrupted by default.
3740@requireAttrs(signal, "siginterrupt")
3741@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3742 "Don't have signal.alarm or signal.setitimer")
3743class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3744 # Test interrupting the recv*() methods with signals when a
3745 # timeout is set.
3746
3747 def setUp(self):
3748 super().setUp()
3749 self.serv.settimeout(self.timeout)
3750
3751 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003752 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003753 # errno of EINTR when interrupted by a signal.
3754 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003755 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003756 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003757
3758 def testInterruptedRecvTimeout(self):
3759 self.checkInterruptedRecv(self.serv.recv, 1024)
3760
3761 def testInterruptedRecvIntoTimeout(self):
3762 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3763
3764 def testInterruptedRecvfromTimeout(self):
3765 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3766
3767 def testInterruptedRecvfromIntoTimeout(self):
3768 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3769
3770 @requireAttrs(socket.socket, "recvmsg")
3771 def testInterruptedRecvmsgTimeout(self):
3772 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3773
3774 @requireAttrs(socket.socket, "recvmsg_into")
3775 def testInterruptedRecvmsgIntoTimeout(self):
3776 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3777
3778
3779# Require siginterrupt() in order to ensure that system calls are
3780# interrupted by default.
3781@requireAttrs(signal, "siginterrupt")
3782@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3783 "Don't have signal.alarm or signal.setitimer")
3784@unittest.skipUnless(thread, 'Threading required for this test.')
3785class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3786 ThreadSafeCleanupTestCase,
3787 SocketListeningTestMixin, TCPTestBase):
3788 # Test interrupting the interruptible send*() methods with signals
3789 # when a timeout is set.
3790
3791 def setUp(self):
3792 super().setUp()
3793 self.serv_conn = self.newSocket()
3794 self.addCleanup(self.serv_conn.close)
3795 # Use a thread to complete the connection, but wait for it to
3796 # terminate before running the test, so that there is only one
3797 # thread to accept the signal.
3798 cli_thread = threading.Thread(target=self.doConnect)
3799 cli_thread.start()
3800 self.cli_conn, addr = self.serv.accept()
3801 self.addCleanup(self.cli_conn.close)
3802 cli_thread.join()
3803 self.serv_conn.settimeout(self.timeout)
3804
3805 def doConnect(self):
3806 self.serv_conn.connect(self.serv_addr)
3807
3808 def checkInterruptedSend(self, func, *args, **kwargs):
3809 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003810 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003811 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003812 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003813 while True:
3814 self.setAlarm(self.alarm_time)
3815 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003816
Ned Deilyc5640382014-02-03 13:58:31 -08003817 # Issue #12958: The following tests have problems on OS X prior to 10.7
3818 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003819 def testInterruptedSendTimeout(self):
3820 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3821
Ned Deilyc5640382014-02-03 13:58:31 -08003822 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003823 def testInterruptedSendtoTimeout(self):
3824 # Passing an actual address here as Python's wrapper for
3825 # sendto() doesn't allow passing a zero-length one; POSIX
3826 # requires that the address is ignored since the socket is
3827 # connection-mode, however.
3828 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3829 self.serv_addr)
3830
Ned Deilyc5640382014-02-03 13:58:31 -08003831 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003832 @requireAttrs(socket.socket, "sendmsg")
3833 def testInterruptedSendmsgTimeout(self):
3834 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3835
3836
Victor Stinner45df8202010-04-28 22:31:17 +00003837@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003838class TCPCloserTest(ThreadedTCPSocketTest):
3839
3840 def testClose(self):
3841 conn, addr = self.serv.accept()
3842 conn.close()
3843
3844 sd = self.cli
3845 read, write, err = select.select([sd], [], [], 1.0)
3846 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003847 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003848
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003849 # Calling close() many times should be safe.
3850 conn.close()
3851 conn.close()
3852
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003853 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003854 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003855 time.sleep(1.0)
3856
Victor Stinner45df8202010-04-28 22:31:17 +00003857@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003858class BasicSocketPairTest(SocketPairTest):
3859
3860 def __init__(self, methodName='runTest'):
3861 SocketPairTest.__init__(self, methodName=methodName)
3862
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003863 def _check_defaults(self, sock):
3864 self.assertIsInstance(sock, socket.socket)
3865 if hasattr(socket, 'AF_UNIX'):
3866 self.assertEqual(sock.family, socket.AF_UNIX)
3867 else:
3868 self.assertEqual(sock.family, socket.AF_INET)
3869 self.assertEqual(sock.type, socket.SOCK_STREAM)
3870 self.assertEqual(sock.proto, 0)
3871
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003872 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003873 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003874
3875 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003876 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003877
Dave Cole331708b2004-08-09 04:51:41 +00003878 def testRecv(self):
3879 msg = self.serv.recv(1024)
3880 self.assertEqual(msg, MSG)
3881
3882 def _testRecv(self):
3883 self.cli.send(MSG)
3884
3885 def testSend(self):
3886 self.serv.send(MSG)
3887
3888 def _testSend(self):
3889 msg = self.cli.recv(1024)
3890 self.assertEqual(msg, MSG)
3891
Victor Stinner45df8202010-04-28 22:31:17 +00003892@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003893class NonBlockingTCPTests(ThreadedTCPSocketTest):
3894
3895 def __init__(self, methodName='runTest'):
3896 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3897
3898 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003899 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003900 self.serv.setblocking(True)
3901 self.assertIsNone(self.serv.gettimeout())
3902 self.serv.setblocking(False)
3903 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003904 start = time.time()
3905 try:
3906 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003907 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003908 pass
3909 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003910 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003911
3912 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003913 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003914
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003915 @support.cpython_only
3916 def testSetBlocking_overflow(self):
3917 # Issue 15989
3918 import _testcapi
3919 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3920 self.skipTest('needs UINT_MAX < ULONG_MAX')
3921 self.serv.setblocking(False)
3922 self.assertEqual(self.serv.gettimeout(), 0.0)
3923 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3924 self.assertIsNone(self.serv.gettimeout())
3925
3926 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3927
Serhiy Storchaka43767632013-11-03 21:31:38 +02003928 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3929 'test needs socket.SOCK_NONBLOCK')
3930 @support.requires_linux_version(2, 6, 28)
3931 def testInitNonBlocking(self):
3932 # reinit server socket
3933 self.serv.close()
3934 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3935 socket.SOCK_NONBLOCK)
3936 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003937 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003938 # actual testing
3939 start = time.time()
3940 try:
3941 self.serv.accept()
3942 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003943 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003944 end = time.time()
3945 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3946
3947 def _testInitNonBlocking(self):
3948 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003949
Antoine Pitrou600232b2011-01-05 21:03:42 +00003950 def testInheritFlags(self):
3951 # Issue #7995: when calling accept() on a listening socket with a
3952 # timeout, the resulting socket should not be non-blocking.
3953 self.serv.settimeout(10)
3954 try:
3955 conn, addr = self.serv.accept()
3956 message = conn.recv(len(MSG))
3957 finally:
3958 conn.close()
3959 self.serv.settimeout(None)
3960
3961 def _testInheritFlags(self):
3962 time.sleep(0.1)
3963 self.cli.connect((HOST, self.port))
3964 time.sleep(0.5)
3965 self.cli.send(MSG)
3966
Guido van Rossum24e4af82002-06-12 19:18:08 +00003967 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003968 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003969 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003970 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003971 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003972 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003973 pass
3974 else:
3975 self.fail("Error trying to do non-blocking accept.")
3976 read, write, err = select.select([self.serv], [], [])
3977 if self.serv in read:
3978 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07003979 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00003980 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003981 else:
3982 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003983
Guido van Rossum24e4af82002-06-12 19:18:08 +00003984 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003985 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003986 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003987
3988 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003989 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003990 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003991 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003992
3993 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003994 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003995 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003996
3997 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003998 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003999 conn, addr = self.serv.accept()
4000 conn.setblocking(0)
4001 try:
4002 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02004003 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004004 pass
4005 else:
4006 self.fail("Error trying to do non-blocking recv.")
4007 read, write, err = select.select([conn], [], [])
4008 if conn in read:
4009 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004010 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00004011 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004012 else:
4013 self.fail("Error during select call to non-blocking socket.")
4014
4015 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004016 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004017 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004018 self.cli.send(MSG)
4019
Victor Stinner45df8202010-04-28 22:31:17 +00004020@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00004021class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004022 """Unit tests for the object returned by socket.makefile()
4023
Antoine Pitrou834bd812010-10-13 16:17:14 +00004024 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004025 the client connection. You can read from this file to
4026 get output from the server.
4027
Antoine Pitrou834bd812010-10-13 16:17:14 +00004028 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004029 server connection. You can write to this file to send output
4030 to the client.
4031 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004032
Guido van Rossume9f66142002-08-07 15:46:19 +00004033 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004034 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004035 errors = 'strict'
4036 newline = None
4037
4038 read_mode = 'rb'
4039 read_msg = MSG
4040 write_mode = 'wb'
4041 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004042
Guido van Rossum24e4af82002-06-12 19:18:08 +00004043 def __init__(self, methodName='runTest'):
4044 SocketConnectedTest.__init__(self, methodName=methodName)
4045
4046 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004047 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4048 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004049 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004050 self.read_file = self.cli_conn.makefile(
4051 self.read_mode, self.bufsize,
4052 encoding = self.encoding,
4053 errors = self.errors,
4054 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004055
4056 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004057 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004058 self.read_file.close()
4059 self.assertTrue(self.read_file.closed)
4060 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004061 SocketConnectedTest.tearDown(self)
4062
4063 def clientSetUp(self):
4064 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004065 self.write_file = self.serv_conn.makefile(
4066 self.write_mode, self.bufsize,
4067 encoding = self.encoding,
4068 errors = self.errors,
4069 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004070
4071 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004072 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004073 self.write_file.close()
4074 self.assertTrue(self.write_file.closed)
4075 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004076 SocketConnectedTest.clientTearDown(self)
4077
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004078 def testReadAfterTimeout(self):
4079 # Issue #7322: A file object must disallow further reads
4080 # after a timeout has occurred.
4081 self.cli_conn.settimeout(1)
4082 self.read_file.read(3)
4083 # First read raises a timeout
4084 self.assertRaises(socket.timeout, self.read_file.read, 1)
4085 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004086 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004087 self.read_file.read(1)
4088 self.assertIn("cannot read from timed out object", str(ctx.exception))
4089
4090 def _testReadAfterTimeout(self):
4091 self.write_file.write(self.write_msg[0:3])
4092 self.write_file.flush()
4093 self.serv_finished.wait()
4094
Guido van Rossum24e4af82002-06-12 19:18:08 +00004095 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004096 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004097 first_seg = self.read_file.read(len(self.read_msg)-3)
4098 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004099 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004100 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004101
4102 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004103 self.write_file.write(self.write_msg)
4104 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004105
Guido van Rossum8c943832002-08-08 01:00:28 +00004106 def testFullRead(self):
4107 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004108 msg = self.read_file.read()
4109 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004110
4111 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004112 self.write_file.write(self.write_msg)
4113 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004114
Guido van Rossum24e4af82002-06-12 19:18:08 +00004115 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004116 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004117 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004118 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004119 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004120 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004121 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004122 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004123 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004124
4125 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004126 self.write_file.write(self.write_msg)
4127 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004128
4129 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004130 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004131 line = self.read_file.readline()
4132 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004133
4134 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004135 self.write_file.write(self.write_msg)
4136 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004137
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004138 def testCloseAfterMakefile(self):
4139 # The file returned by makefile should keep the socket open.
4140 self.cli_conn.close()
4141 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004142 msg = self.read_file.read()
4143 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004144
4145 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004146 self.write_file.write(self.write_msg)
4147 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004148
4149 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004150 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004151 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004152 if isinstance(self.read_msg, str):
4153 msg = msg.decode()
4154 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004155
4156 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004157 self.write_file.write(self.write_msg)
4158 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004159
Tim Peters116d83c2004-03-28 02:20:45 +00004160 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004161 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004162
4163 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004164 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004165
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004166 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004167 self.assertEqual(self.read_file.mode, self.read_mode)
4168 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004169
4170 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004171 self.assertEqual(self.write_file.mode, self.write_mode)
4172 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004173
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004174 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004175 self.read_file.close()
4176 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004177 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004178 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004179
4180 def _testRealClose(self):
4181 pass
4182
4183
Guido van Rossume9f66142002-08-07 15:46:19 +00004184class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4185
4186 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004187
Guido van Rossume9f66142002-08-07 15:46:19 +00004188 In this case (and in this case only), it should be possible to
4189 create a file object, read a line from it, create another file
4190 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004191 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004192 when reading multiple requests from the same socket."""
4193
4194 bufsize = 0 # Use unbuffered mode
4195
4196 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004197 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004198 line = self.read_file.readline() # first line
4199 self.assertEqual(line, b"A. " + self.write_msg) # first line
4200 self.read_file = self.cli_conn.makefile('rb', 0)
4201 line = self.read_file.readline() # second line
4202 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004203
4204 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004205 self.write_file.write(b"A. " + self.write_msg)
4206 self.write_file.write(b"B. " + self.write_msg)
4207 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004208
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004209 def testMakefileClose(self):
4210 # The file returned by makefile should keep the socket open...
4211 self.cli_conn.close()
4212 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004213 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004214 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004215 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004216 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004217
4218 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004219 self.write_file.write(self.write_msg)
4220 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004221
4222 def testMakefileCloseSocketDestroy(self):
4223 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004224 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004225 refcount_after = sys.getrefcount(self.cli_conn)
4226 self.assertEqual(refcount_before - 1, refcount_after)
4227
4228 def _testMakefileCloseSocketDestroy(self):
4229 pass
4230
Antoine Pitrou98b46702010-09-18 22:59:00 +00004231 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004232 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004233 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4234
4235 def testSmallReadNonBlocking(self):
4236 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004237 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4238 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004239 self.evt1.set()
4240 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004241 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004242 if first_seg is None:
4243 # Data not arrived (can happen under Windows), wait a bit
4244 time.sleep(0.5)
4245 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004246 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004247 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004248 self.assertEqual(n, 3)
4249 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004250 self.assertEqual(msg, self.read_msg)
4251 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4252 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004253
4254 def _testSmallReadNonBlocking(self):
4255 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004256 self.write_file.write(self.write_msg)
4257 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004258 self.evt2.set()
4259 # Avoid cloding the socket before the server test has finished,
4260 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4261 self.serv_finished.wait(5.0)
4262
4263 def testWriteNonBlocking(self):
4264 self.cli_finished.wait(5.0)
4265 # The client thread can't skip directly - the SkipTest exception
4266 # would appear as a failure.
4267 if self.serv_skipped:
4268 self.skipTest(self.serv_skipped)
4269
4270 def _testWriteNonBlocking(self):
4271 self.serv_skipped = None
4272 self.serv_conn.setblocking(False)
4273 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004274 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004275 LIMIT = 10
4276 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004277 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004278 self.assertGreater(n, 0)
4279 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004280 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004281 if n is None:
4282 # Succeeded
4283 break
4284 self.assertGreater(n, 0)
4285 else:
4286 # Let us know that this test didn't manage to establish
4287 # the expected conditions. This is not a failure in itself but,
4288 # if it happens repeatedly, the test should be fixed.
4289 self.serv_skipped = "failed to saturate the socket buffer"
4290
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004291
Guido van Rossum8c943832002-08-08 01:00:28 +00004292class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4293
4294 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4295
4296
4297class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4298
4299 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004300
Thomas Woutersb2137042007-02-01 18:02:27 +00004301
Antoine Pitrou834bd812010-10-13 16:17:14 +00004302class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4303 """Tests for socket.makefile() in text mode (rather than binary)"""
4304
4305 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004306 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004307 write_mode = 'wb'
4308 write_msg = MSG
4309 newline = ''
4310
4311
4312class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4313 """Tests for socket.makefile() in text mode (rather than binary)"""
4314
4315 read_mode = 'rb'
4316 read_msg = MSG
4317 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004318 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004319 newline = ''
4320
4321
4322class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4323 """Tests for socket.makefile() in text mode (rather than binary)"""
4324
4325 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004326 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004327 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004328 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004329 newline = ''
4330
4331
Guido van Rossumd8faa362007-04-27 19:54:29 +00004332class NetworkConnectionTest(object):
4333 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004334
Guido van Rossumd8faa362007-04-27 19:54:29 +00004335 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004336 # We're inherited below by BasicTCPTest2, which also inherits
4337 # BasicTCPTest, which defines self.port referenced below.
4338 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004339 self.serv_conn = self.cli
4340
4341class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4342 """Tests that NetworkConnection does not break existing TCP functionality.
4343 """
4344
4345class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004346
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004347 class MockSocket(socket.socket):
4348 def connect(self, *args):
4349 raise socket.timeout('timed out')
4350
4351 @contextlib.contextmanager
4352 def mocked_socket_module(self):
4353 """Return a socket which times out on connect"""
4354 old_socket = socket.socket
4355 socket.socket = self.MockSocket
4356 try:
4357 yield
4358 finally:
4359 socket.socket = old_socket
4360
4361 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004362 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004363 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004364 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004365 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004366 cli.connect((HOST, port))
4367 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4368
4369 def test_create_connection(self):
4370 # Issue #9792: errors raised by create_connection() should have
4371 # a proper errno attribute.
4372 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004373 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004374 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004375
4376 # Issue #16257: create_connection() calls getaddrinfo() against
4377 # 'localhost'. This may result in an IPV6 addr being returned
4378 # as well as an IPV4 one:
4379 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4380 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4381 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4382 #
4383 # create_connection() enumerates through all the addresses returned
4384 # and if it doesn't successfully bind to any of them, it propagates
4385 # the last exception it encountered.
4386 #
4387 # On Solaris, ENETUNREACH is returned in this circumstance instead
4388 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4389 # expected errnos.
4390 expected_errnos = [ errno.ECONNREFUSED, ]
4391 if hasattr(errno, 'ENETUNREACH'):
4392 expected_errnos.append(errno.ENETUNREACH)
4393
4394 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004395
4396 def test_create_connection_timeout(self):
4397 # Issue #9792: create_connection() should not recast timeout errors
4398 # as generic socket errors.
4399 with self.mocked_socket_module():
4400 with self.assertRaises(socket.timeout):
4401 socket.create_connection((HOST, 1234))
4402
Guido van Rossumd8faa362007-04-27 19:54:29 +00004403
Victor Stinner45df8202010-04-28 22:31:17 +00004404@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004405class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4406
4407 def __init__(self, methodName='runTest'):
4408 SocketTCPTest.__init__(self, methodName=methodName)
4409 ThreadableTest.__init__(self)
4410
4411 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004412 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004413
4414 def clientTearDown(self):
4415 self.cli.close()
4416 self.cli = None
4417 ThreadableTest.clientTearDown(self)
4418
4419 def _justAccept(self):
4420 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004421 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004422
4423 testFamily = _justAccept
4424 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004425 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004426 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004427 self.assertEqual(self.cli.family, 2)
4428
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004429 testSourceAddress = _justAccept
4430 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004431 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4432 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004433 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004434 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004435 # The port number being used is sufficient to show that the bind()
4436 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004437
Guido van Rossumd8faa362007-04-27 19:54:29 +00004438 testTimeoutDefault = _justAccept
4439 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004440 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004441 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004442 socket.setdefaulttimeout(42)
4443 try:
4444 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004445 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004446 finally:
4447 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004448 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004449
4450 testTimeoutNone = _justAccept
4451 def _testTimeoutNone(self):
4452 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004453 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004454 socket.setdefaulttimeout(30)
4455 try:
4456 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004457 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004458 finally:
4459 socket.setdefaulttimeout(None)
4460 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004461
4462 testTimeoutValueNamed = _justAccept
4463 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004464 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004465 self.assertEqual(self.cli.gettimeout(), 30)
4466
4467 testTimeoutValueNonamed = _justAccept
4468 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004469 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004470 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004471 self.assertEqual(self.cli.gettimeout(), 30)
4472
Victor Stinner45df8202010-04-28 22:31:17 +00004473@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004474class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4475
4476 def __init__(self, methodName='runTest'):
4477 SocketTCPTest.__init__(self, methodName=methodName)
4478 ThreadableTest.__init__(self)
4479
4480 def clientSetUp(self):
4481 pass
4482
4483 def clientTearDown(self):
4484 self.cli.close()
4485 self.cli = None
4486 ThreadableTest.clientTearDown(self)
4487
4488 def testInsideTimeout(self):
4489 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004490 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004491 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004492 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004493 testOutsideTimeout = testInsideTimeout
4494
4495 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004496 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004497 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004498 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004499
4500 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004501 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004502 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004503
4504
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004505class TCPTimeoutTest(SocketTCPTest):
4506
4507 def testTCPTimeout(self):
4508 def raise_timeout(*args, **kwargs):
4509 self.serv.settimeout(1.0)
4510 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004511 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004512 "Error generating a timeout exception (TCP)")
4513
4514 def testTimeoutZero(self):
4515 ok = False
4516 try:
4517 self.serv.settimeout(0.0)
4518 foo = self.serv.accept()
4519 except socket.timeout:
4520 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004521 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004522 ok = True
4523 except:
4524 self.fail("caught unexpected exception (TCP)")
4525 if not ok:
4526 self.fail("accept() returned success when we did not expect it")
4527
Serhiy Storchaka43767632013-11-03 21:31:38 +02004528 @unittest.skipUnless(hasattr(signal, 'alarm'),
4529 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004530 def testInterruptedTimeout(self):
4531 # XXX I don't know how to do this test on MSWindows or any other
4532 # plaform that doesn't support signal.alarm() or os.kill(), though
4533 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004534 self.serv.settimeout(5.0) # must be longer than alarm
4535 class Alarm(Exception):
4536 pass
4537 def alarm_handler(signal, frame):
4538 raise Alarm
4539 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4540 try:
4541 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4542 try:
4543 foo = self.serv.accept()
4544 except socket.timeout:
4545 self.fail("caught timeout instead of Alarm")
4546 except Alarm:
4547 pass
4548 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004549 self.fail("caught other exception instead of Alarm:"
4550 " %s(%s):\n%s" %
4551 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004552 else:
4553 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004554 finally:
4555 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004556 except Alarm:
4557 self.fail("got Alarm in wrong place")
4558 finally:
4559 # no alarm can be pending. Safe to restore old handler.
4560 signal.signal(signal.SIGALRM, old_alarm)
4561
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004562class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004563
4564 def testUDPTimeout(self):
4565 def raise_timeout(*args, **kwargs):
4566 self.serv.settimeout(1.0)
4567 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004568 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004569 "Error generating a timeout exception (UDP)")
4570
4571 def testTimeoutZero(self):
4572 ok = False
4573 try:
4574 self.serv.settimeout(0.0)
4575 foo = self.serv.recv(1024)
4576 except socket.timeout:
4577 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004578 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004579 ok = True
4580 except:
4581 self.fail("caught unexpected exception (UDP)")
4582 if not ok:
4583 self.fail("recv() returned success when we did not expect it")
4584
4585class TestExceptions(unittest.TestCase):
4586
4587 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004588 self.assertTrue(issubclass(OSError, Exception))
4589 self.assertTrue(issubclass(socket.herror, OSError))
4590 self.assertTrue(issubclass(socket.gaierror, OSError))
4591 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004592
Yury Selivanovfa22b292016-10-18 16:03:52 -04004593 def test_setblocking_invalidfd(self):
4594 # Regression test for issue #28471
4595
4596 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4597 sock = socket.socket(
4598 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4599 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004600 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004601
4602 with self.assertRaises(OSError):
4603 sock.setblocking(False)
4604
4605
Serhiy Storchaka43767632013-11-03 21:31:38 +02004606@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004607class TestLinuxAbstractNamespace(unittest.TestCase):
4608
4609 UNIX_PATH_MAX = 108
4610
4611 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004612 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004613 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4614 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004615 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004616 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4617 s2.connect(s1.getsockname())
4618 with s1.accept()[0] as s3:
4619 self.assertEqual(s1.getsockname(), address)
4620 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004621
4622 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004623 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004624 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4625 s.bind(address)
4626 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004627
4628 def testNameOverflow(self):
4629 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004630 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004631 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004632
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004633 def testStrName(self):
4634 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004635 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4636 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004637 s.bind("\x00python\x00test\x00")
4638 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004639 finally:
4640 s.close()
4641
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004642 def testBytearrayName(self):
4643 # Check that an abstract name can be passed as a bytearray.
4644 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4645 s.bind(bytearray(b"\x00python\x00test\x00"))
4646 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4647
Serhiy Storchaka43767632013-11-03 21:31:38 +02004648@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004649class TestUnixDomain(unittest.TestCase):
4650
4651 def setUp(self):
4652 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4653
4654 def tearDown(self):
4655 self.sock.close()
4656
4657 def encoded(self, path):
4658 # Return the given path encoded in the file system encoding,
4659 # or skip the test if this is not possible.
4660 try:
4661 return os.fsencode(path)
4662 except UnicodeEncodeError:
4663 self.skipTest(
4664 "Pathname {0!a} cannot be represented in file "
4665 "system encoding {1!r}".format(
4666 path, sys.getfilesystemencoding()))
4667
Antoine Pitrou16374872011-12-16 15:04:12 +01004668 def bind(self, sock, path):
4669 # Bind the socket
4670 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004671 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004672 except OSError as e:
4673 if str(e) == "AF_UNIX path too long":
4674 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004675 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004676 .format(path))
4677 else:
4678 raise
4679
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004680 def testStrAddr(self):
4681 # Test binding to and retrieving a normal string pathname.
4682 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004683 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004684 self.addCleanup(support.unlink, path)
4685 self.assertEqual(self.sock.getsockname(), path)
4686
4687 def testBytesAddr(self):
4688 # Test binding to a bytes pathname.
4689 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004690 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004691 self.addCleanup(support.unlink, path)
4692 self.assertEqual(self.sock.getsockname(), path)
4693
4694 def testSurrogateescapeBind(self):
4695 # Test binding to a valid non-ASCII pathname, with the
4696 # non-ASCII bytes supplied using surrogateescape encoding.
4697 path = os.path.abspath(support.TESTFN_UNICODE)
4698 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004699 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004700 self.addCleanup(support.unlink, path)
4701 self.assertEqual(self.sock.getsockname(), path)
4702
4703 def testUnencodableAddr(self):
4704 # Test binding to a pathname that cannot be encoded in the
4705 # file system encoding.
4706 if support.TESTFN_UNENCODABLE is None:
4707 self.skipTest("No unencodable filename available")
4708 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004709 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004710 self.addCleanup(support.unlink, path)
4711 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004712
Victor Stinner45df8202010-04-28 22:31:17 +00004713@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004714class BufferIOTest(SocketConnectedTest):
4715 """
4716 Test the buffer versions of socket.recv() and socket.send().
4717 """
4718 def __init__(self, methodName='runTest'):
4719 SocketConnectedTest.__init__(self, methodName=methodName)
4720
Antoine Pitrou25480782010-03-17 22:50:28 +00004721 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004722 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004723 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004724 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004725 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004726 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004727 self.assertEqual(msg, MSG)
4728
Antoine Pitrou25480782010-03-17 22:50:28 +00004729 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004730 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004731 self.serv_conn.send(buf)
4732
Antoine Pitrou25480782010-03-17 22:50:28 +00004733 def testRecvIntoBytearray(self):
4734 buf = bytearray(1024)
4735 nbytes = self.cli_conn.recv_into(buf)
4736 self.assertEqual(nbytes, len(MSG))
4737 msg = buf[:len(MSG)]
4738 self.assertEqual(msg, MSG)
4739
4740 _testRecvIntoBytearray = _testRecvIntoArray
4741
4742 def testRecvIntoMemoryview(self):
4743 buf = bytearray(1024)
4744 nbytes = self.cli_conn.recv_into(memoryview(buf))
4745 self.assertEqual(nbytes, len(MSG))
4746 msg = buf[:len(MSG)]
4747 self.assertEqual(msg, MSG)
4748
4749 _testRecvIntoMemoryview = _testRecvIntoArray
4750
4751 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004752 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004753 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004754 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004755 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004756 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004757 self.assertEqual(msg, MSG)
4758
Antoine Pitrou25480782010-03-17 22:50:28 +00004759 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004760 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004761 self.serv_conn.send(buf)
4762
Antoine Pitrou25480782010-03-17 22:50:28 +00004763 def testRecvFromIntoBytearray(self):
4764 buf = bytearray(1024)
4765 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4766 self.assertEqual(nbytes, len(MSG))
4767 msg = buf[:len(MSG)]
4768 self.assertEqual(msg, MSG)
4769
4770 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4771
4772 def testRecvFromIntoMemoryview(self):
4773 buf = bytearray(1024)
4774 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4775 self.assertEqual(nbytes, len(MSG))
4776 msg = buf[:len(MSG)]
4777 self.assertEqual(msg, MSG)
4778
4779 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4780
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004781 def testRecvFromIntoSmallBuffer(self):
4782 # See issue #20246.
4783 buf = bytearray(8)
4784 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4785
4786 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004787 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004788
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004789 def testRecvFromIntoEmptyBuffer(self):
4790 buf = bytearray()
4791 self.cli_conn.recvfrom_into(buf)
4792 self.cli_conn.recvfrom_into(buf, 0)
4793
4794 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4795
Christian Heimes043d6f62008-01-07 17:19:16 +00004796
4797TIPC_STYPE = 2000
4798TIPC_LOWER = 200
4799TIPC_UPPER = 210
4800
4801def isTipcAvailable():
4802 """Check if the TIPC module is loaded
4803
4804 The TIPC module is not loaded automatically on Ubuntu and probably
4805 other Linux distros.
4806 """
4807 if not hasattr(socket, "AF_TIPC"):
4808 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004809 try:
4810 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00004811 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00004812 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00004813 # have not the permission to read it.
4814 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004815 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00004816 for line in f:
4817 if line.startswith("tipc "):
4818 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004819 return False
4820
Serhiy Storchaka43767632013-11-03 21:31:38 +02004821@unittest.skipUnless(isTipcAvailable(),
4822 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004823class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004824 def testRDM(self):
4825 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4826 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004827 self.addCleanup(srv.close)
4828 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004829
4830 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4831 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4832 TIPC_LOWER, TIPC_UPPER)
4833 srv.bind(srvaddr)
4834
4835 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4836 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4837 cli.sendto(MSG, sendaddr)
4838
4839 msg, recvaddr = srv.recvfrom(1024)
4840
4841 self.assertEqual(cli.getsockname(), recvaddr)
4842 self.assertEqual(msg, MSG)
4843
4844
Serhiy Storchaka43767632013-11-03 21:31:38 +02004845@unittest.skipUnless(isTipcAvailable(),
4846 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004847class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004848 def __init__(self, methodName = 'runTest'):
4849 unittest.TestCase.__init__(self, methodName = methodName)
4850 ThreadableTest.__init__(self)
4851
4852 def setUp(self):
4853 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004854 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004855 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4856 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4857 TIPC_LOWER, TIPC_UPPER)
4858 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004859 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004860 self.serverExplicitReady()
4861 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004862 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004863
4864 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00004865 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00004866 # accept() call; sleep a little while to avoid it, otherwise
4867 # we could get an exception
4868 time.sleep(0.1)
4869 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004870 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004871 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4872 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4873 self.cli.connect(addr)
4874 self.cliaddr = self.cli.getsockname()
4875
4876 def testStream(self):
4877 msg = self.conn.recv(1024)
4878 self.assertEqual(msg, MSG)
4879 self.assertEqual(self.cliaddr, self.connaddr)
4880
4881 def _testStream(self):
4882 self.cli.send(MSG)
4883 self.cli.close()
4884
4885
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004886@unittest.skipUnless(thread, 'Threading required for this test.')
4887class ContextManagersTest(ThreadedTCPSocketTest):
4888
4889 def _testSocketClass(self):
4890 # base test
4891 with socket.socket() as sock:
4892 self.assertFalse(sock._closed)
4893 self.assertTrue(sock._closed)
4894 # close inside with block
4895 with socket.socket() as sock:
4896 sock.close()
4897 self.assertTrue(sock._closed)
4898 # exception inside with block
4899 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004900 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004901 self.assertTrue(sock._closed)
4902
4903 def testCreateConnectionBase(self):
4904 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004905 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004906 data = conn.recv(1024)
4907 conn.sendall(data)
4908
4909 def _testCreateConnectionBase(self):
4910 address = self.serv.getsockname()
4911 with socket.create_connection(address) as sock:
4912 self.assertFalse(sock._closed)
4913 sock.sendall(b'foo')
4914 self.assertEqual(sock.recv(1024), b'foo')
4915 self.assertTrue(sock._closed)
4916
4917 def testCreateConnectionClose(self):
4918 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004919 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004920 data = conn.recv(1024)
4921 conn.sendall(data)
4922
4923 def _testCreateConnectionClose(self):
4924 address = self.serv.getsockname()
4925 with socket.create_connection(address) as sock:
4926 sock.close()
4927 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004928 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004929
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004930
Victor Stinnerdaf45552013-08-28 00:53:59 +02004931class InheritanceTest(unittest.TestCase):
4932 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4933 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004934 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004935 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004936 with socket.socket(socket.AF_INET,
4937 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4938 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004939 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004940
4941 def test_default_inheritable(self):
4942 sock = socket.socket()
4943 with sock:
4944 self.assertEqual(sock.get_inheritable(), False)
4945
4946 def test_dup(self):
4947 sock = socket.socket()
4948 with sock:
4949 newsock = sock.dup()
4950 sock.close()
4951 with newsock:
4952 self.assertEqual(newsock.get_inheritable(), False)
4953
4954 def test_set_inheritable(self):
4955 sock = socket.socket()
4956 with sock:
4957 sock.set_inheritable(True)
4958 self.assertEqual(sock.get_inheritable(), True)
4959
4960 sock.set_inheritable(False)
4961 self.assertEqual(sock.get_inheritable(), False)
4962
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004963 @unittest.skipIf(fcntl is None, "need fcntl")
4964 def test_get_inheritable_cloexec(self):
4965 sock = socket.socket()
4966 with sock:
4967 fd = sock.fileno()
4968 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004969
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004970 # clear FD_CLOEXEC flag
4971 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4972 flags &= ~fcntl.FD_CLOEXEC
4973 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004974
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004975 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004976
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004977 @unittest.skipIf(fcntl is None, "need fcntl")
4978 def test_set_inheritable_cloexec(self):
4979 sock = socket.socket()
4980 with sock:
4981 fd = sock.fileno()
4982 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4983 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004984
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004985 sock.set_inheritable(True)
4986 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4987 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004988
4989
Victor Stinnerdaf45552013-08-28 00:53:59 +02004990 @unittest.skipUnless(hasattr(socket, "socketpair"),
4991 "need socket.socketpair()")
4992 def test_socketpair(self):
4993 s1, s2 = socket.socketpair()
4994 self.addCleanup(s1.close)
4995 self.addCleanup(s2.close)
4996 self.assertEqual(s1.get_inheritable(), False)
4997 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004998
4999
5000@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5001 "SOCK_NONBLOCK not defined")
5002class NonblockConstantTest(unittest.TestCase):
5003 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5004 if nonblock:
5005 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
5006 self.assertEqual(s.gettimeout(), timeout)
5007 else:
5008 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
5009 self.assertEqual(s.gettimeout(), None)
5010
Charles-François Natali239bb962011-06-03 12:55:15 +02005011 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005012 def test_SOCK_NONBLOCK(self):
5013 # a lot of it seems silly and redundant, but I wanted to test that
5014 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005015 with socket.socket(socket.AF_INET,
5016 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5017 self.checkNonblock(s)
5018 s.setblocking(1)
5019 self.checkNonblock(s, False)
5020 s.setblocking(0)
5021 self.checkNonblock(s)
5022 s.settimeout(None)
5023 self.checkNonblock(s, False)
5024 s.settimeout(2.0)
5025 self.checkNonblock(s, timeout=2.0)
5026 s.setblocking(1)
5027 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005028 # defaulttimeout
5029 t = socket.getdefaulttimeout()
5030 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005031 with socket.socket() as s:
5032 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005033 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005034 with socket.socket() as s:
5035 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005036 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005037 with socket.socket() as s:
5038 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005039 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005040 with socket.socket() as s:
5041 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005042 socket.setdefaulttimeout(t)
5043
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005044
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005045@unittest.skipUnless(os.name == "nt", "Windows specific")
5046@unittest.skipUnless(multiprocessing, "need multiprocessing")
5047class TestSocketSharing(SocketTCPTest):
5048 # This must be classmethod and not staticmethod or multiprocessing
5049 # won't be able to bootstrap it.
5050 @classmethod
5051 def remoteProcessServer(cls, q):
5052 # Recreate socket from shared data
5053 sdata = q.get()
5054 message = q.get()
5055
5056 s = socket.fromshare(sdata)
5057 s2, c = s.accept()
5058
5059 # Send the message
5060 s2.sendall(message)
5061 s2.close()
5062 s.close()
5063
5064 def testShare(self):
5065 # Transfer the listening server socket to another process
5066 # and service it from there.
5067
5068 # Create process:
5069 q = multiprocessing.Queue()
5070 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5071 p.start()
5072
5073 # Get the shared socket data
5074 data = self.serv.share(p.pid)
5075
5076 # Pass the shared socket to the other process
5077 addr = self.serv.getsockname()
5078 self.serv.close()
5079 q.put(data)
5080
5081 # The data that the server will send us
5082 message = b"slapmahfro"
5083 q.put(message)
5084
5085 # Connect
5086 s = socket.create_connection(addr)
5087 # listen for the data
5088 m = []
5089 while True:
5090 data = s.recv(100)
5091 if not data:
5092 break
5093 m.append(data)
5094 s.close()
5095 received = b"".join(m)
5096 self.assertEqual(received, message)
5097 p.join()
5098
5099 def testShareLength(self):
5100 data = self.serv.share(os.getpid())
5101 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5102 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5103
5104 def compareSockets(self, org, other):
5105 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005106 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005107 self.assertEqual(org.gettimeout(), None)
5108 self.assertEqual(org.gettimeout(), other.gettimeout())
5109
5110 self.assertEqual(org.family, other.family)
5111 self.assertEqual(org.type, other.type)
5112 # If the user specified "0" for proto, then
5113 # internally windows will have picked the correct value.
5114 # Python introspection on the socket however will still return
5115 # 0. For the shared socket, the python value is recreated
5116 # from the actual value, so it may not compare correctly.
5117 if org.proto != 0:
5118 self.assertEqual(org.proto, other.proto)
5119
5120 def testShareLocal(self):
5121 data = self.serv.share(os.getpid())
5122 s = socket.fromshare(data)
5123 try:
5124 self.compareSockets(self.serv, s)
5125 finally:
5126 s.close()
5127
5128 def testTypes(self):
5129 families = [socket.AF_INET, socket.AF_INET6]
5130 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5131 for f in families:
5132 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005133 try:
5134 source = socket.socket(f, t)
5135 except OSError:
5136 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005137 try:
5138 data = source.share(os.getpid())
5139 shared = socket.fromshare(data)
5140 try:
5141 self.compareSockets(source, shared)
5142 finally:
5143 shared.close()
5144 finally:
5145 source.close()
5146
5147
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005148@unittest.skipUnless(thread, 'Threading required for this test.')
5149class SendfileUsingSendTest(ThreadedTCPSocketTest):
5150 """
5151 Test the send() implementation of socket.sendfile().
5152 """
5153
5154 FILESIZE = (10 * 1024 * 1024) # 10MB
5155 BUFSIZE = 8192
5156 FILEDATA = b""
5157 TIMEOUT = 2
5158
5159 @classmethod
5160 def setUpClass(cls):
5161 def chunks(total, step):
5162 assert total >= step
5163 while total > step:
5164 yield step
5165 total -= step
5166 if total:
5167 yield total
5168
5169 chunk = b"".join([random.choice(string.ascii_letters).encode()
5170 for i in range(cls.BUFSIZE)])
5171 with open(support.TESTFN, 'wb') as f:
5172 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5173 f.write(chunk)
5174 with open(support.TESTFN, 'rb') as f:
5175 cls.FILEDATA = f.read()
5176 assert len(cls.FILEDATA) == cls.FILESIZE
5177
5178 @classmethod
5179 def tearDownClass(cls):
5180 support.unlink(support.TESTFN)
5181
5182 def accept_conn(self):
5183 self.serv.settimeout(self.TIMEOUT)
5184 conn, addr = self.serv.accept()
5185 conn.settimeout(self.TIMEOUT)
5186 self.addCleanup(conn.close)
5187 return conn
5188
5189 def recv_data(self, conn):
5190 received = []
5191 while True:
5192 chunk = conn.recv(self.BUFSIZE)
5193 if not chunk:
5194 break
5195 received.append(chunk)
5196 return b''.join(received)
5197
5198 def meth_from_sock(self, sock):
5199 # Depending on the mixin class being run return either send()
5200 # or sendfile() method implementation.
5201 return getattr(sock, "_sendfile_use_send")
5202
5203 # regular file
5204
5205 def _testRegularFile(self):
5206 address = self.serv.getsockname()
5207 file = open(support.TESTFN, 'rb')
5208 with socket.create_connection(address) as sock, file as file:
5209 meth = self.meth_from_sock(sock)
5210 sent = meth(file)
5211 self.assertEqual(sent, self.FILESIZE)
5212 self.assertEqual(file.tell(), self.FILESIZE)
5213
5214 def testRegularFile(self):
5215 conn = self.accept_conn()
5216 data = self.recv_data(conn)
5217 self.assertEqual(len(data), self.FILESIZE)
5218 self.assertEqual(data, self.FILEDATA)
5219
5220 # non regular file
5221
5222 def _testNonRegularFile(self):
5223 address = self.serv.getsockname()
5224 file = io.BytesIO(self.FILEDATA)
5225 with socket.create_connection(address) as sock, file as file:
5226 sent = sock.sendfile(file)
5227 self.assertEqual(sent, self.FILESIZE)
5228 self.assertEqual(file.tell(), self.FILESIZE)
5229 self.assertRaises(socket._GiveupOnSendfile,
5230 sock._sendfile_use_sendfile, file)
5231
5232 def testNonRegularFile(self):
5233 conn = self.accept_conn()
5234 data = self.recv_data(conn)
5235 self.assertEqual(len(data), self.FILESIZE)
5236 self.assertEqual(data, self.FILEDATA)
5237
5238 # empty file
5239
5240 def _testEmptyFileSend(self):
5241 address = self.serv.getsockname()
5242 filename = support.TESTFN + "2"
5243 with open(filename, 'wb'):
5244 self.addCleanup(support.unlink, filename)
5245 file = open(filename, 'rb')
5246 with socket.create_connection(address) as sock, file as file:
5247 meth = self.meth_from_sock(sock)
5248 sent = meth(file)
5249 self.assertEqual(sent, 0)
5250 self.assertEqual(file.tell(), 0)
5251
5252 def testEmptyFileSend(self):
5253 conn = self.accept_conn()
5254 data = self.recv_data(conn)
5255 self.assertEqual(data, b"")
5256
5257 # offset
5258
5259 def _testOffset(self):
5260 address = self.serv.getsockname()
5261 file = open(support.TESTFN, 'rb')
5262 with socket.create_connection(address) as sock, file as file:
5263 meth = self.meth_from_sock(sock)
5264 sent = meth(file, offset=5000)
5265 self.assertEqual(sent, self.FILESIZE - 5000)
5266 self.assertEqual(file.tell(), self.FILESIZE)
5267
5268 def testOffset(self):
5269 conn = self.accept_conn()
5270 data = self.recv_data(conn)
5271 self.assertEqual(len(data), self.FILESIZE - 5000)
5272 self.assertEqual(data, self.FILEDATA[5000:])
5273
5274 # count
5275
5276 def _testCount(self):
5277 address = self.serv.getsockname()
5278 file = open(support.TESTFN, 'rb')
5279 with socket.create_connection(address, timeout=2) as sock, file as file:
5280 count = 5000007
5281 meth = self.meth_from_sock(sock)
5282 sent = meth(file, count=count)
5283 self.assertEqual(sent, count)
5284 self.assertEqual(file.tell(), count)
5285
5286 def testCount(self):
5287 count = 5000007
5288 conn = self.accept_conn()
5289 data = self.recv_data(conn)
5290 self.assertEqual(len(data), count)
5291 self.assertEqual(data, self.FILEDATA[:count])
5292
5293 # count small
5294
5295 def _testCountSmall(self):
5296 address = self.serv.getsockname()
5297 file = open(support.TESTFN, 'rb')
5298 with socket.create_connection(address, timeout=2) as sock, file as file:
5299 count = 1
5300 meth = self.meth_from_sock(sock)
5301 sent = meth(file, count=count)
5302 self.assertEqual(sent, count)
5303 self.assertEqual(file.tell(), count)
5304
5305 def testCountSmall(self):
5306 count = 1
5307 conn = self.accept_conn()
5308 data = self.recv_data(conn)
5309 self.assertEqual(len(data), count)
5310 self.assertEqual(data, self.FILEDATA[:count])
5311
5312 # count + offset
5313
5314 def _testCountWithOffset(self):
5315 address = self.serv.getsockname()
5316 file = open(support.TESTFN, 'rb')
5317 with socket.create_connection(address, timeout=2) as sock, file as file:
5318 count = 100007
5319 meth = self.meth_from_sock(sock)
5320 sent = meth(file, offset=2007, count=count)
5321 self.assertEqual(sent, count)
5322 self.assertEqual(file.tell(), count + 2007)
5323
5324 def testCountWithOffset(self):
5325 count = 100007
5326 conn = self.accept_conn()
5327 data = self.recv_data(conn)
5328 self.assertEqual(len(data), count)
5329 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5330
5331 # non blocking sockets are not supposed to work
5332
5333 def _testNonBlocking(self):
5334 address = self.serv.getsockname()
5335 file = open(support.TESTFN, 'rb')
5336 with socket.create_connection(address) as sock, file as file:
5337 sock.setblocking(False)
5338 meth = self.meth_from_sock(sock)
5339 self.assertRaises(ValueError, meth, file)
5340 self.assertRaises(ValueError, sock.sendfile, file)
5341
5342 def testNonBlocking(self):
5343 conn = self.accept_conn()
5344 if conn.recv(8192):
5345 self.fail('was not supposed to receive any data')
5346
5347 # timeout (non-triggered)
5348
5349 def _testWithTimeout(self):
5350 address = self.serv.getsockname()
5351 file = open(support.TESTFN, 'rb')
5352 with socket.create_connection(address, timeout=2) as sock, file as file:
5353 meth = self.meth_from_sock(sock)
5354 sent = meth(file)
5355 self.assertEqual(sent, self.FILESIZE)
5356
5357 def testWithTimeout(self):
5358 conn = self.accept_conn()
5359 data = self.recv_data(conn)
5360 self.assertEqual(len(data), self.FILESIZE)
5361 self.assertEqual(data, self.FILEDATA)
5362
5363 # timeout (triggered)
5364
5365 def _testWithTimeoutTriggeredSend(self):
5366 address = self.serv.getsockname()
5367 file = open(support.TESTFN, 'rb')
5368 with socket.create_connection(address, timeout=0.01) as sock, \
5369 file as file:
5370 meth = self.meth_from_sock(sock)
5371 self.assertRaises(socket.timeout, meth, file)
5372
5373 def testWithTimeoutTriggeredSend(self):
5374 conn = self.accept_conn()
5375 conn.recv(88192)
5376
5377 # errors
5378
5379 def _test_errors(self):
5380 pass
5381
5382 def test_errors(self):
5383 with open(support.TESTFN, 'rb') as file:
5384 with socket.socket(type=socket.SOCK_DGRAM) as s:
5385 meth = self.meth_from_sock(s)
5386 self.assertRaisesRegex(
5387 ValueError, "SOCK_STREAM", meth, file)
5388 with open(support.TESTFN, 'rt') as file:
5389 with socket.socket() as s:
5390 meth = self.meth_from_sock(s)
5391 self.assertRaisesRegex(
5392 ValueError, "binary mode", meth, file)
5393 with open(support.TESTFN, 'rb') as file:
5394 with socket.socket() as s:
5395 meth = self.meth_from_sock(s)
5396 self.assertRaisesRegex(TypeError, "positive integer",
5397 meth, file, count='2')
5398 self.assertRaisesRegex(TypeError, "positive integer",
5399 meth, file, count=0.1)
5400 self.assertRaisesRegex(ValueError, "positive integer",
5401 meth, file, count=0)
5402 self.assertRaisesRegex(ValueError, "positive integer",
5403 meth, file, count=-1)
5404
5405
5406@unittest.skipUnless(thread, 'Threading required for this test.')
5407@unittest.skipUnless(hasattr(os, "sendfile"),
5408 'os.sendfile() required for this test.')
5409class SendfileUsingSendfileTest(SendfileUsingSendTest):
5410 """
5411 Test the sendfile() implementation of socket.sendfile().
5412 """
5413 def meth_from_sock(self, sock):
5414 return getattr(sock, "_sendfile_use_sendfile")
5415
Christian Heimes48371412016-09-06 00:37:46 +02005416
5417@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005418class LinuxKernelCryptoAPI(unittest.TestCase):
5419 # tests for AF_ALG
5420 def create_alg(self, typ, name):
5421 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005422 try:
5423 sock.bind((typ, name))
5424 except FileNotFoundError as e:
5425 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005426 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005427 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005428 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005429 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005430
5431 def test_sha256(self):
5432 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5433 "177a9cb410ff61f20015ad")
5434 with self.create_alg('hash', 'sha256') as algo:
5435 op, _ = algo.accept()
5436 with op:
5437 op.sendall(b"abc")
5438 self.assertEqual(op.recv(512), expected)
5439
5440 op, _ = algo.accept()
5441 with op:
5442 op.send(b'a', socket.MSG_MORE)
5443 op.send(b'b', socket.MSG_MORE)
5444 op.send(b'c', socket.MSG_MORE)
5445 op.send(b'')
5446 self.assertEqual(op.recv(512), expected)
5447
5448 def test_hmac_sha1(self):
5449 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5450 with self.create_alg('hash', 'hmac(sha1)') as algo:
5451 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5452 op, _ = algo.accept()
5453 with op:
5454 op.sendall(b"what do ya want for nothing?")
5455 self.assertEqual(op.recv(512), expected)
5456
Christian Heimese084f842016-09-11 20:11:30 +02005457 # Although it should work with 3.19 and newer the test blocks on
5458 # Ubuntu 15.10 with Kernel 4.2.0-19.
5459 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005460 def test_aes_cbc(self):
5461 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5462 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5463 msg = b"Single block msg"
5464 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5465 msglen = len(msg)
5466 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5467 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5468 op, _ = algo.accept()
5469 with op:
5470 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5471 flags=socket.MSG_MORE)
5472 op.sendall(msg)
5473 self.assertEqual(op.recv(msglen), ciphertext)
5474
5475 op, _ = algo.accept()
5476 with op:
5477 op.sendmsg_afalg([ciphertext],
5478 op=socket.ALG_OP_DECRYPT, iv=iv)
5479 self.assertEqual(op.recv(msglen), msg)
5480
5481 # long message
5482 multiplier = 1024
5483 longmsg = [msg] * multiplier
5484 op, _ = algo.accept()
5485 with op:
5486 op.sendmsg_afalg(longmsg,
5487 op=socket.ALG_OP_ENCRYPT, iv=iv)
5488 enc = op.recv(msglen * multiplier)
5489 self.assertEqual(len(enc), msglen * multiplier)
5490 self.assertTrue(enc[:msglen], ciphertext)
5491
5492 op, _ = algo.accept()
5493 with op:
5494 op.sendmsg_afalg([enc],
5495 op=socket.ALG_OP_DECRYPT, iv=iv)
5496 dec = op.recv(msglen * multiplier)
5497 self.assertEqual(len(dec), msglen * multiplier)
5498 self.assertEqual(dec, msg * multiplier)
5499
matejcik9764c152017-02-16 14:41:31 +01005500 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005501 def test_aead_aes_gcm(self):
5502 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5503 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5504 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5505 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5506 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5507 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5508
5509 taglen = len(expected_tag)
5510 assoclen = len(assoc)
5511
5512 with self.create_alg('aead', 'gcm(aes)') as algo:
5513 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5514 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5515 None, taglen)
5516
5517 # send assoc, plain and tag buffer in separate steps
5518 op, _ = algo.accept()
5519 with op:
5520 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5521 assoclen=assoclen, flags=socket.MSG_MORE)
5522 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005523 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005524 res = op.recv(assoclen + len(plain) + taglen)
5525 self.assertEqual(expected_ct, res[assoclen:-taglen])
5526 self.assertEqual(expected_tag, res[-taglen:])
5527
5528 # now with msg
5529 op, _ = algo.accept()
5530 with op:
matejcik9764c152017-02-16 14:41:31 +01005531 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005532 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5533 assoclen=assoclen)
5534 res = op.recv(assoclen + len(plain) + taglen)
5535 self.assertEqual(expected_ct, res[assoclen:-taglen])
5536 self.assertEqual(expected_tag, res[-taglen:])
5537
5538 # create anc data manually
5539 pack_uint32 = struct.Struct('I').pack
5540 op, _ = algo.accept()
5541 with op:
matejcik9764c152017-02-16 14:41:31 +01005542 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005543 op.sendmsg(
5544 [msg],
5545 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5546 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5547 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5548 )
5549 )
matejcik9764c152017-02-16 14:41:31 +01005550 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005551 self.assertEqual(expected_ct, res[assoclen:-taglen])
5552 self.assertEqual(expected_tag, res[-taglen:])
5553
5554 # decrypt and verify
5555 op, _ = algo.accept()
5556 with op:
5557 msg = assoc + expected_ct + expected_tag
5558 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5559 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005560 res = op.recv(len(msg) - taglen)
5561 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005562
Christian Heimese084f842016-09-11 20:11:30 +02005563 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005564 def test_drbg_pr_sha256(self):
5565 # deterministic random bit generator, prediction resistance, sha256
5566 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5567 extra_seed = os.urandom(32)
5568 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5569 op, _ = algo.accept()
5570 with op:
5571 rn = op.recv(32)
5572 self.assertEqual(len(rn), 32)
5573
5574 def test_sendmsg_afalg_args(self):
5575 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005576 with sock:
5577 with self.assertRaises(TypeError):
5578 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005579
Christian Heimes02b30352016-09-11 19:49:56 +02005580 with self.assertRaises(TypeError):
5581 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005582
Christian Heimes02b30352016-09-11 19:49:56 +02005583 with self.assertRaises(TypeError):
5584 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005585
Christian Heimes02b30352016-09-11 19:49:56 +02005586 with self.assertRaises(TypeError):
5587 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
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=socket.ALG_OP_ENCRYPT, assoclen=-1)
5591
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005592
Guido van Rossumb995eb72002-07-31 16:08:40 +00005593def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005594 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005595 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005596
5597 tests.extend([
5598 NonBlockingTCPTests,
5599 FileObjectClassTestCase,
5600 UnbufferedFileObjectClassTestCase,
5601 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005602 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005603 UnicodeReadFileObjectClassTestCase,
5604 UnicodeWriteFileObjectClassTestCase,
5605 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005606 NetworkConnectionNoServer,
5607 NetworkConnectionAttributesTest,
5608 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005609 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005610 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005611 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005612 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005613 tests.append(BasicSocketPairTest)
5614 tests.append(TestUnixDomain)
5615 tests.append(TestLinuxAbstractNamespace)
5616 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005617 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005618 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005619 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005620 tests.extend([
5621 CmsgMacroTests,
5622 SendmsgUDPTest,
5623 RecvmsgUDPTest,
5624 RecvmsgIntoUDPTest,
5625 SendmsgUDP6Test,
5626 RecvmsgUDP6Test,
5627 RecvmsgRFC3542AncillaryUDP6Test,
5628 RecvmsgIntoRFC3542AncillaryUDP6Test,
5629 RecvmsgIntoUDP6Test,
5630 SendmsgTCPTest,
5631 RecvmsgTCPTest,
5632 RecvmsgIntoTCPTest,
5633 SendmsgSCTPStreamTest,
5634 RecvmsgSCTPStreamTest,
5635 RecvmsgIntoSCTPStreamTest,
5636 SendmsgUnixStreamTest,
5637 RecvmsgUnixStreamTest,
5638 RecvmsgIntoUnixStreamTest,
5639 RecvmsgSCMRightsStreamTest,
5640 RecvmsgIntoSCMRightsStreamTest,
5641 # These are slow when setitimer() is not available
5642 InterruptedRecvTimeoutTest,
5643 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005644 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005645 SendfileUsingSendTest,
5646 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005647 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005648
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005649 thread_info = support.threading_setup()
5650 support.run_unittest(*tests)
5651 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005652
5653if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005654 test_main()