blob: 84234887747983cd7a206b4ed0915ad3401491bf [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
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040058def _have_socket_can_isotp():
59 """Check whether CAN ISOTP sockets are supported on this host."""
60 try:
61 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
62 except (AttributeError, OSError):
63 return False
64 else:
65 s.close()
66 return True
67
Charles-François Natali10b8cf42011-11-10 19:21:37 +010068def _have_socket_rds():
69 """Check whether RDS sockets are supported on this host."""
70 try:
71 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
72 except (AttributeError, OSError):
73 return False
74 else:
75 s.close()
76 return True
77
Christian Heimes48371412016-09-06 00:37:46 +020078def _have_socket_alg():
79 """Check whether AF_ALG sockets are supported on this host."""
80 try:
81 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
82 except (AttributeError, OSError):
83 return False
84 else:
85 s.close()
86 return True
87
Charles-François Natali47413c12011-10-06 19:47:44 +020088HAVE_SOCKET_CAN = _have_socket_can()
89
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040090HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
91
Charles-François Natali10b8cf42011-11-10 19:21:37 +010092HAVE_SOCKET_RDS = _have_socket_rds()
93
Christian Heimes48371412016-09-06 00:37:46 +020094HAVE_SOCKET_ALG = _have_socket_alg()
95
Nick Coghlan96fe56a2011-08-22 11:55:57 +100096# Size in bytes of the int type
97SIZEOF_INT = array.array("i").itemsize
98
Guido van Rossum24e4af82002-06-12 19:18:08 +000099class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000100
Guido van Rossum24e4af82002-06-12 19:18:08 +0000101 def setUp(self):
102 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000103 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100104 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000105
Guido van Rossum24e4af82002-06-12 19:18:08 +0000106 def tearDown(self):
107 self.serv.close()
108 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000109
Guido van Rossum24e4af82002-06-12 19:18:08 +0000110class SocketUDPTest(unittest.TestCase):
111
112 def setUp(self):
113 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000114 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000115
116 def tearDown(self):
117 self.serv.close()
118 self.serv = None
119
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000120class ThreadSafeCleanupTestCase(unittest.TestCase):
121 """Subclass of unittest.TestCase with thread-safe cleanup methods.
122
123 This subclass protects the addCleanup() and doCleanups() methods
124 with a recursive lock.
125 """
126
127 if threading:
128 def __init__(self, *args, **kwargs):
129 super().__init__(*args, **kwargs)
130 self._cleanup_lock = threading.RLock()
131
132 def addCleanup(self, *args, **kwargs):
133 with self._cleanup_lock:
134 return super().addCleanup(*args, **kwargs)
135
136 def doCleanups(self, *args, **kwargs):
137 with self._cleanup_lock:
138 return super().doCleanups(*args, **kwargs)
139
Charles-François Natali47413c12011-10-06 19:47:44 +0200140class SocketCANTest(unittest.TestCase):
141
142 """To be able to run this test, a `vcan0` CAN interface can be created with
143 the following commands:
144 # modprobe vcan
145 # ip link add dev vcan0 type vcan
146 # ifconfig vcan0 up
147 """
148 interface = 'vcan0'
149 bufsize = 128
150
Charles-François Natali773e42d2013-02-05 19:42:01 +0100151 """The CAN frame structure is defined in <linux/can.h>:
152
153 struct can_frame {
154 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
155 __u8 can_dlc; /* data length code: 0 .. 8 */
156 __u8 data[8] __attribute__((aligned(8)));
157 };
158 """
159 can_frame_fmt = "=IB3x8s"
160 can_frame_size = struct.calcsize(can_frame_fmt)
161
162 """The Broadcast Management Command frame structure is defined
163 in <linux/can/bcm.h>:
164
165 struct bcm_msg_head {
166 __u32 opcode;
167 __u32 flags;
168 __u32 count;
169 struct timeval ival1, ival2;
170 canid_t can_id;
171 __u32 nframes;
172 struct can_frame frames[0];
173 }
174
175 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
176 `struct can_frame` definition). Must use native not standard types for packing.
177 """
178 bcm_cmd_msg_fmt = "@3I4l2I"
179 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
180
Charles-François Natali47413c12011-10-06 19:47:44 +0200181 def setUp(self):
182 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200183 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200184 try:
185 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200186 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200187 self.skipTest('network interface `%s` does not exist' %
188 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200189
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100190
191class SocketRDSTest(unittest.TestCase):
192
193 """To be able to run this test, the `rds` kernel module must be loaded:
194 # modprobe rds
195 """
196 bufsize = 8192
197
198 def setUp(self):
199 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
200 self.addCleanup(self.serv.close)
201 try:
202 self.port = support.bind_port(self.serv)
203 except OSError:
204 self.skipTest('unable to bind RDS socket')
205
206
Guido van Rossum24e4af82002-06-12 19:18:08 +0000207class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000208 """Threadable Test class
209
210 The ThreadableTest class makes it easy to create a threaded
211 client/server pair from an existing unit test. To create a
212 new threaded class from an existing unit test, use multiple
213 inheritance:
214
215 class NewClass (OldClass, ThreadableTest):
216 pass
217
218 This class defines two new fixture functions with obvious
219 purposes for overriding:
220
221 clientSetUp ()
222 clientTearDown ()
223
224 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000225 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000226 '_' to indicate the client portion of the test. Ex:
227
228 def testFoo(self):
229 # Server portion
230
231 def _testFoo(self):
232 # Client portion
233
234 Any exceptions raised by the clients during their tests
235 are caught and transferred to the main thread to alert
236 the testing framework.
237
238 Note, the server setup function cannot call any blocking
239 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000240 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000241 the blocking call (such as in setting up a client/server
242 connection and performing the accept() in setUp().
243 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000244
245 def __init__(self):
246 # Swap the true setup function
247 self.__setUp = self.setUp
248 self.__tearDown = self.tearDown
249 self.setUp = self._setUp
250 self.tearDown = self._tearDown
251
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000252 def serverExplicitReady(self):
253 """This method allows the server to explicitly indicate that
254 it wants the client thread to proceed. This is useful if the
255 server is about to execute a blocking routine that is
256 dependent upon the client thread during its setup routine."""
257 self.server_ready.set()
258
Guido van Rossum24e4af82002-06-12 19:18:08 +0000259 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000260 self.server_ready = threading.Event()
261 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000262 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000263 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200264 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000265
266 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000267 methodname = self.id()
268 i = methodname.rfind('.')
269 methodname = methodname[i+1:]
270 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000271 self.client_thread = thread.start_new_thread(
272 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000273
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200274 try:
275 self.__setUp()
276 except:
277 self.server_crashed = True
278 raise
279 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000280 self.server_ready.set()
281 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000282
283 def _tearDown(self):
284 self.__tearDown()
285 self.done.wait()
286
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000287 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000288 exc = self.queue.get()
289 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000290
291 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000292 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100293 try:
294 self.clientSetUp()
295 except BaseException as e:
296 self.queue.put(e)
297 self.clientTearDown()
298 return
299 finally:
300 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200301 if self.server_crashed:
302 self.clientTearDown()
303 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000304 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000305 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000306 try:
307 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000308 except BaseException as e:
309 self.queue.put(e)
310 finally:
311 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000312
313 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000314 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000315
316 def clientTearDown(self):
317 self.done.set()
318 thread.exit()
319
320class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
321
322 def __init__(self, methodName='runTest'):
323 SocketTCPTest.__init__(self, methodName=methodName)
324 ThreadableTest.__init__(self)
325
326 def clientSetUp(self):
327 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
328
329 def clientTearDown(self):
330 self.cli.close()
331 self.cli = None
332 ThreadableTest.clientTearDown(self)
333
334class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
335
336 def __init__(self, methodName='runTest'):
337 SocketUDPTest.__init__(self, methodName=methodName)
338 ThreadableTest.__init__(self)
339
340 def clientSetUp(self):
341 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
342
Brian Curtin3beb38f2010-11-04 03:41:43 +0000343 def clientTearDown(self):
344 self.cli.close()
345 self.cli = None
346 ThreadableTest.clientTearDown(self)
347
Charles-François Natali47413c12011-10-06 19:47:44 +0200348class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
349
350 def __init__(self, methodName='runTest'):
351 SocketCANTest.__init__(self, methodName=methodName)
352 ThreadableTest.__init__(self)
353
354 def clientSetUp(self):
355 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
356 try:
357 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200358 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200359 # skipTest should not be called here, and will be called in the
360 # server instead
361 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200362
363 def clientTearDown(self):
364 self.cli.close()
365 self.cli = None
366 ThreadableTest.clientTearDown(self)
367
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100368class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
369
370 def __init__(self, methodName='runTest'):
371 SocketRDSTest.__init__(self, methodName=methodName)
372 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100373
374 def clientSetUp(self):
375 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
376 try:
377 # RDS sockets must be bound explicitly to send or receive data
378 self.cli.bind((HOST, 0))
379 self.cli_addr = self.cli.getsockname()
380 except OSError:
381 # skipTest should not be called here, and will be called in the
382 # server instead
383 pass
384
385 def clientTearDown(self):
386 self.cli.close()
387 self.cli = None
388 ThreadableTest.clientTearDown(self)
389
Guido van Rossum24e4af82002-06-12 19:18:08 +0000390class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000391 """Socket tests for client-server connection.
392
393 self.cli_conn is a client socket connected to the server. The
394 setUp() method guarantees that it is connected to the server.
395 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000396
397 def __init__(self, methodName='runTest'):
398 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
399
400 def setUp(self):
401 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000402 # Indicate explicitly we're ready for the client thread to
403 # proceed and then perform the blocking call to accept
404 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000405 conn, addr = self.serv.accept()
406 self.cli_conn = conn
407
408 def tearDown(self):
409 self.cli_conn.close()
410 self.cli_conn = None
411 ThreadedTCPSocketTest.tearDown(self)
412
413 def clientSetUp(self):
414 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000415 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000416 self.serv_conn = self.cli
417
418 def clientTearDown(self):
419 self.serv_conn.close()
420 self.serv_conn = None
421 ThreadedTCPSocketTest.clientTearDown(self)
422
Dave Cole331708b2004-08-09 04:51:41 +0000423class SocketPairTest(unittest.TestCase, ThreadableTest):
424
425 def __init__(self, methodName='runTest'):
426 unittest.TestCase.__init__(self, methodName=methodName)
427 ThreadableTest.__init__(self)
428
429 def setUp(self):
430 self.serv, self.cli = socket.socketpair()
431
432 def tearDown(self):
433 self.serv.close()
434 self.serv = None
435
436 def clientSetUp(self):
437 pass
438
439 def clientTearDown(self):
440 self.cli.close()
441 self.cli = None
442 ThreadableTest.clientTearDown(self)
443
Tim Peters494aaee2004-08-09 18:54:11 +0000444
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000445# The following classes are used by the sendmsg()/recvmsg() tests.
446# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
447# gives a drop-in replacement for SocketConnectedTest, but different
448# address families can be used, and the attributes serv_addr and
449# cli_addr will be set to the addresses of the endpoints.
450
451class SocketTestBase(unittest.TestCase):
452 """A base class for socket tests.
453
454 Subclasses must provide methods newSocket() to return a new socket
455 and bindSock(sock) to bind it to an unused address.
456
457 Creates a socket self.serv and sets self.serv_addr to its address.
458 """
459
460 def setUp(self):
461 self.serv = self.newSocket()
462 self.bindServer()
463
464 def bindServer(self):
465 """Bind server socket and set self.serv_addr to its address."""
466 self.bindSock(self.serv)
467 self.serv_addr = self.serv.getsockname()
468
469 def tearDown(self):
470 self.serv.close()
471 self.serv = None
472
473
474class SocketListeningTestMixin(SocketTestBase):
475 """Mixin to listen on the server socket."""
476
477 def setUp(self):
478 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100479 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000480
481
482class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
483 ThreadableTest):
484 """Mixin to add client socket and allow client/server tests.
485
486 Client socket is self.cli and its address is self.cli_addr. See
487 ThreadableTest for usage information.
488 """
489
490 def __init__(self, *args, **kwargs):
491 super().__init__(*args, **kwargs)
492 ThreadableTest.__init__(self)
493
494 def clientSetUp(self):
495 self.cli = self.newClientSocket()
496 self.bindClient()
497
498 def newClientSocket(self):
499 """Return a new socket for use as client."""
500 return self.newSocket()
501
502 def bindClient(self):
503 """Bind client socket and set self.cli_addr to its address."""
504 self.bindSock(self.cli)
505 self.cli_addr = self.cli.getsockname()
506
507 def clientTearDown(self):
508 self.cli.close()
509 self.cli = None
510 ThreadableTest.clientTearDown(self)
511
512
513class ConnectedStreamTestMixin(SocketListeningTestMixin,
514 ThreadedSocketTestMixin):
515 """Mixin to allow client/server stream tests with connected client.
516
517 Server's socket representing connection to client is self.cli_conn
518 and client's connection to server is self.serv_conn. (Based on
519 SocketConnectedTest.)
520 """
521
522 def setUp(self):
523 super().setUp()
524 # Indicate explicitly we're ready for the client thread to
525 # proceed and then perform the blocking call to accept
526 self.serverExplicitReady()
527 conn, addr = self.serv.accept()
528 self.cli_conn = conn
529
530 def tearDown(self):
531 self.cli_conn.close()
532 self.cli_conn = None
533 super().tearDown()
534
535 def clientSetUp(self):
536 super().clientSetUp()
537 self.cli.connect(self.serv_addr)
538 self.serv_conn = self.cli
539
540 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100541 try:
542 self.serv_conn.close()
543 self.serv_conn = None
544 except AttributeError:
545 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000546 super().clientTearDown()
547
548
549class UnixSocketTestBase(SocketTestBase):
550 """Base class for Unix-domain socket tests."""
551
552 # This class is used for file descriptor passing tests, so we
553 # create the sockets in a private directory so that other users
554 # can't send anything that might be problematic for a privileged
555 # user running the tests.
556
557 def setUp(self):
558 self.dir_path = tempfile.mkdtemp()
559 self.addCleanup(os.rmdir, self.dir_path)
560 super().setUp()
561
562 def bindSock(self, sock):
563 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100564 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000565 self.addCleanup(support.unlink, path)
566
567class UnixStreamBase(UnixSocketTestBase):
568 """Base class for Unix-domain SOCK_STREAM tests."""
569
570 def newSocket(self):
571 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
572
573
574class InetTestBase(SocketTestBase):
575 """Base class for IPv4 socket tests."""
576
577 host = HOST
578
579 def setUp(self):
580 super().setUp()
581 self.port = self.serv_addr[1]
582
583 def bindSock(self, sock):
584 support.bind_port(sock, host=self.host)
585
586class TCPTestBase(InetTestBase):
587 """Base class for TCP-over-IPv4 tests."""
588
589 def newSocket(self):
590 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
591
592class UDPTestBase(InetTestBase):
593 """Base class for UDP-over-IPv4 tests."""
594
595 def newSocket(self):
596 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
597
598class SCTPStreamBase(InetTestBase):
599 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
600
601 def newSocket(self):
602 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
603 socket.IPPROTO_SCTP)
604
605
606class Inet6TestBase(InetTestBase):
607 """Base class for IPv6 socket tests."""
608
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200609 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000610
611class UDP6TestBase(Inet6TestBase):
612 """Base class for UDP-over-IPv6 tests."""
613
614 def newSocket(self):
615 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
616
617
618# Test-skipping decorators for use with ThreadableTest.
619
620def skipWithClientIf(condition, reason):
621 """Skip decorated test if condition is true, add client_skip decorator.
622
623 If the decorated object is not a class, sets its attribute
624 "client_skip" to a decorator which will return an empty function
625 if the test is to be skipped, or the original function if it is
626 not. This can be used to avoid running the client part of a
627 skipped test when using ThreadableTest.
628 """
629 def client_pass(*args, **kwargs):
630 pass
631 def skipdec(obj):
632 retval = unittest.skip(reason)(obj)
633 if not isinstance(obj, type):
634 retval.client_skip = lambda f: client_pass
635 return retval
636 def noskipdec(obj):
637 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
638 obj.client_skip = lambda f: f
639 return obj
640 return skipdec if condition else noskipdec
641
642
643def requireAttrs(obj, *attributes):
644 """Skip decorated test if obj is missing any of the given attributes.
645
646 Sets client_skip attribute as skipWithClientIf() does.
647 """
648 missing = [name for name in attributes if not hasattr(obj, name)]
649 return skipWithClientIf(
650 missing, "don't have " + ", ".join(name for name in missing))
651
652
653def requireSocket(*args):
654 """Skip decorated test if a socket cannot be created with given arguments.
655
656 When an argument is given as a string, will use the value of that
657 attribute of the socket module, or skip the test if it doesn't
658 exist. Sets client_skip attribute as skipWithClientIf() does.
659 """
660 err = None
661 missing = [obj for obj in args if
662 isinstance(obj, str) and not hasattr(socket, obj)]
663 if missing:
664 err = "don't have " + ", ".join(name for name in missing)
665 else:
666 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
667 for obj in args]
668 try:
669 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200670 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000671 # XXX: check errno?
672 err = str(e)
673 else:
674 s.close()
675 return skipWithClientIf(
676 err is not None,
677 "can't create socket({0}): {1}".format(
678 ", ".join(str(o) for o in args), err))
679
680
Guido van Rossum24e4af82002-06-12 19:18:08 +0000681#######################################################################
682## Begin Tests
683
684class GeneralModuleTests(unittest.TestCase):
685
Ethan Furman7184bac2014-10-14 18:56:53 -0700686 def test_SocketType_is_socketobject(self):
687 import _socket
688 self.assertTrue(socket.SocketType is _socket.socket)
689 s = socket.socket()
690 self.assertIsInstance(s, socket.SocketType)
691 s.close()
692
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000693 def test_repr(self):
694 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200695 with s:
696 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000697 self.assertIn('family=%s' % socket.AF_INET, repr(s))
698 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200699 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200700 self.assertNotIn('raddr', repr(s))
701 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200702 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200703 self.assertIn(str(s.getsockname()), repr(s))
704 self.assertIn('[closed]', repr(s))
705 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000706
Victor Stinnere254e532014-07-26 14:36:55 +0200707 @unittest.skipUnless(_socket is not None, 'need _socket module')
708 def test_csocket_repr(self):
709 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
710 try:
711 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
712 % (s.fileno(), s.family, s.type, s.proto))
713 self.assertEqual(repr(s), expected)
714 finally:
715 s.close()
716 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
717 % (s.family, s.type, s.proto))
718 self.assertEqual(repr(s), expected)
719
Raymond Hettinger027bb632004-05-31 03:09:25 +0000720 def test_weakref(self):
721 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
722 p = proxy(s)
723 self.assertEqual(p.fileno(), s.fileno())
724 s.close()
725 s = None
726 try:
727 p.fileno()
728 except ReferenceError:
729 pass
730 else:
731 self.fail('Socket proxy still exists')
732
Guido van Rossum24e4af82002-06-12 19:18:08 +0000733 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000734 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300735 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200736 with self.assertRaises(OSError, msg=msg % 'OSError'):
737 raise OSError
738 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000739 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200740 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000741 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000742
Ezio Melotti63e42302011-05-07 19:47:48 +0300743 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000744 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300745 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
746 self.addCleanup(s.close)
747 s.bind(('', 0))
748 sockname = s.getsockname()
749 # 2 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', 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, 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', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300760 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300761 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300762 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300763 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300764 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400765 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300766 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300767 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300768 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400769 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300770 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300771 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300772 self.assertIn('not NoneType', str(cm.exception))
773 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300774 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300775 self.assertIn('an integer is required', str(cm.exception))
776 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300777 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300778 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300779 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300780 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300781 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300782 self.assertIn('(1 given)', str(cm.exception))
783 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300784 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300785 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300786
Guido van Rossum24e4af82002-06-12 19:18:08 +0000787 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000788 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000789 socket.AF_INET
790 socket.SOCK_STREAM
791 socket.SOCK_DGRAM
792 socket.SOCK_RAW
793 socket.SOCK_RDM
794 socket.SOCK_SEQPACKET
795 socket.SOL_SOCKET
796 socket.SO_REUSEADDR
797
Guido van Rossum654c11e2002-06-13 20:24:17 +0000798 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000799 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000800 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000801 try:
802 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200803 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000804 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600805 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000806 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000807 try:
808 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200809 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000810 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600811 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000812 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000813 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000814 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000815 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000816
Charles-François Natali0cc86852013-09-13 19:53:08 +0200817 def test_host_resolution(self):
Charles-François Natali0cc86852013-09-13 19:53:08 +0200818 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
819 self.assertEqual(socket.gethostbyname(addr), addr)
820
821 # we don't test support.HOSTv6 because there's a chance it doesn't have
822 # a matching name entry (e.g. 'ip6-localhost')
823 for host in [support.HOST]:
824 self.assertIn(host, socket.gethostbyaddr(host)[2])
825
Xiang Zhangd36a7162017-03-07 11:06:09 +0800826 def test_host_resolution_bad_address(self):
827 # These are all malformed IP addresses and expected not to resolve to
828 # any result. But some ISPs, e.g. AWS, may successfully resolve these
829 # IPs.
830 explanation = (
831 "resolving an invalid IP address did not raise OSError; "
832 "can be caused by a broken DNS server"
833 )
834 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
835 '1:1:1:1:1:1:1:1:1']:
836 with self.assertRaises(OSError):
837 socket.gethostbyname(addr)
838 with self.assertRaises(OSError, msg=explanation):
839 socket.gethostbyaddr(addr)
840
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000841 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
842 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
843 def test_sethostname(self):
844 oldhn = socket.gethostname()
845 try:
846 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200847 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000848 if e.errno == errno.EPERM:
849 self.skipTest("test should be run as root")
850 else:
851 raise
852 try:
853 # running test as root!
854 self.assertEqual(socket.gethostname(), 'new')
855 # Should work with bytes objects too
856 socket.sethostname(b'bar')
857 self.assertEqual(socket.gethostname(), 'bar')
858 finally:
859 socket.sethostname(oldhn)
860
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700861 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
862 'socket.if_nameindex() not available.')
863 def testInterfaceNameIndex(self):
864 interfaces = socket.if_nameindex()
865 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200866 self.assertIsInstance(index, int)
867 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700868 # interface indices are non-zero integers
869 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200870 _index = socket.if_nametoindex(name)
871 self.assertIsInstance(_index, int)
872 self.assertEqual(index, _index)
873 _name = socket.if_indextoname(index)
874 self.assertIsInstance(_name, str)
875 self.assertEqual(name, _name)
876
877 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
878 'socket.if_nameindex() not available.')
879 def testInvalidInterfaceNameIndex(self):
880 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200881 self.assertRaises(OSError, socket.if_indextoname, 0)
882 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200883 # test with invalid values
884 self.assertRaises(TypeError, socket.if_nametoindex, 0)
885 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700886
Serhiy Storchaka43767632013-11-03 21:31:38 +0200887 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
888 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000889 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000890 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200891 try:
892 # On some versions, this loses a reference
893 orig = sys.getrefcount(__name__)
894 socket.getnameinfo(__name__,0)
895 except TypeError:
896 if sys.getrefcount(__name__) != orig:
897 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000898
Guido van Rossum24e4af82002-06-12 19:18:08 +0000899 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000900 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000901 try:
902 # On some versions, this crashes the interpreter.
903 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200904 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000905 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000906
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000907 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000908 # This just checks that htons etc. are their own inverse,
909 # when looking at the lower 16 or 32 bits.
910 sizes = {socket.htonl: 32, socket.ntohl: 32,
911 socket.htons: 16, socket.ntohs: 16}
912 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000913 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000914 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
915 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000916
Guido van Rossuma2627af2002-09-14 00:58:46 +0000917 swapped = func(mask)
918 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000919 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000920
Serhiy Storchaka24c738a2017-03-19 20:20:10 +0200921 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +0000922 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300923 import _testcapi
924 s_good_values = [0, 1, 2, 0xffff]
925 l_good_values = s_good_values + [0xffffffff]
926 l_bad_values = [-1, -2, 1<<32, 1<<1000]
927 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
928 _testcapi.INT_MAX + 1]
929 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
930 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000931 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000932 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300933 for k in l_good_values:
934 socket.ntohl(k)
935 socket.htonl(k)
936 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000937 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000938 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300939 for k in l_bad_values:
940 self.assertRaises(OverflowError, socket.ntohl, k)
941 self.assertRaises(OverflowError, socket.htonl, k)
942 for k in s_deprecated_values:
943 self.assertWarns(DeprecationWarning, socket.ntohs, k)
944 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000945
Barry Warsaw11b91a02004-06-28 00:50:43 +0000946 def testGetServBy(self):
947 eq = self.assertEqual
948 # Find one service that exists, then check all the related interfaces.
949 # I've ordered this by protocols that have both a tcp and udp
950 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200951 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200952 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000953 # avoid the 'echo' service on this platform, as there is an
954 # assumption breaking non-standard port/protocol entry
955 services = ('daytime', 'qotd', 'domain')
956 else:
957 services = ('echo', 'daytime', 'domain')
958 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000959 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000960 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000961 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200962 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000963 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000964 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200965 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000966 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +0100967 # Issue #26936: Android getservbyname() was broken before API 23.
968 if (not hasattr(sys, 'getandroidapilevel') or
969 sys.getandroidapilevel() >= 23):
970 port2 = socket.getservbyname(service)
971 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400972 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000973 try:
974 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200975 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000976 udpport = None
977 else:
978 eq(udpport, port)
979 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +0100980 # Issue #26936: Android getservbyport() is broken.
981 if not support.is_android:
982 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +0000983 eq(socket.getservbyport(port, 'tcp'), service)
984 if udpport is not None:
985 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000986 # Make sure getservbyport does not accept out of range ports.
987 self.assertRaises(OverflowError, socket.getservbyport, -1)
988 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000989
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000990 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000991 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000992 # The default timeout should initially be None
993 self.assertEqual(socket.getdefaulttimeout(), None)
994 s = socket.socket()
995 self.assertEqual(s.gettimeout(), None)
996 s.close()
997
998 # Set the default timeout to 10, and see if it propagates
999 socket.setdefaulttimeout(10)
1000 self.assertEqual(socket.getdefaulttimeout(), 10)
1001 s = socket.socket()
1002 self.assertEqual(s.gettimeout(), 10)
1003 s.close()
1004
1005 # Reset the default timeout to None, and see if it propagates
1006 socket.setdefaulttimeout(None)
1007 self.assertEqual(socket.getdefaulttimeout(), None)
1008 s = socket.socket()
1009 self.assertEqual(s.gettimeout(), None)
1010 s.close()
1011
1012 # Check that setting it to an invalid value raises ValueError
1013 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1014
1015 # Check that setting it to an invalid type raises TypeError
1016 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1017
Serhiy Storchaka43767632013-11-03 21:31:38 +02001018 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1019 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001020 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001021 # Test that issue1008086 and issue767150 are fixed.
1022 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001023 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1024 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001025
Serhiy Storchaka43767632013-11-03 21:31:38 +02001026 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1027 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001028 def testIPv4toString(self):
1029 from socket import inet_aton as f, inet_pton, AF_INET
1030 g = lambda a: inet_pton(AF_INET, a)
1031
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001032 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001033 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001034 )
1035
Ezio Melottib3aedd42010-11-20 19:04:17 +00001036 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1037 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1038 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1039 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1040 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001041 # bpo-29972: inet_pton() doesn't fail on AIX
1042 if not sys.platform.startswith('aix'):
1043 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001044 assertInvalid(f, '300.0.0.0')
1045 assertInvalid(f, 'a.0.0.0')
1046 assertInvalid(f, '1.2.3.4.5')
1047 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001048
Ezio Melottib3aedd42010-11-20 19:04:17 +00001049 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1050 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1051 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1052 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001053 assertInvalid(g, '0.0.0.')
1054 assertInvalid(g, '300.0.0.0')
1055 assertInvalid(g, 'a.0.0.0')
1056 assertInvalid(g, '1.2.3.4.5')
1057 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001058
Serhiy Storchaka43767632013-11-03 21:31:38 +02001059 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1060 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001061 def testIPv6toString(self):
1062 try:
1063 from socket import inet_pton, AF_INET6, has_ipv6
1064 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001065 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001066 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001067 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001068
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001069 if sys.platform == "win32":
1070 try:
1071 inet_pton(AF_INET6, '::')
1072 except OSError as e:
1073 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001074 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001075
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001076 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001077 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001078 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001079 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001080
Ezio Melottib3aedd42010-11-20 19:04:17 +00001081 self.assertEqual(b'\x00' * 16, f('::'))
1082 self.assertEqual(b'\x00' * 16, f('0::0'))
1083 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1084 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001085 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 +00001086 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1087 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001088 self.assertEqual(
1089 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1090 f('ad42:abc::127:0:254:2')
1091 )
1092 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1093 assertInvalid('0x20::')
1094 assertInvalid(':::')
1095 assertInvalid('::0::')
1096 assertInvalid('1::abc::')
1097 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001098 assertInvalid('1:2:3:4:5:6')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001099 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001100 # bpo-29972: inet_pton() doesn't fail on AIX
1101 if not sys.platform.startswith('aix'):
1102 assertInvalid('1:2:3:4:5:6:')
1103 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001104
1105 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1106 f('::254.42.23.64')
1107 )
1108 self.assertEqual(
1109 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1110 f('42::a29b:254.42.23.64')
1111 )
1112 self.assertEqual(
1113 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1114 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1115 )
1116 assertInvalid('255.254.253.252')
1117 assertInvalid('1::260.2.3.0')
1118 assertInvalid('1::0.be.e.0')
1119 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1120 assertInvalid('::1.2.3.4:0')
1121 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001122
Serhiy Storchaka43767632013-11-03 21:31:38 +02001123 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1124 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001125 def testStringToIPv4(self):
1126 from socket import inet_ntoa as f, inet_ntop, AF_INET
1127 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001128 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001129 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001130 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001131
Ezio Melottib3aedd42010-11-20 19:04:17 +00001132 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1133 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1134 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1135 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001136 assertInvalid(f, b'\x00' * 3)
1137 assertInvalid(f, b'\x00' * 5)
1138 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001139 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001140
Ezio Melottib3aedd42010-11-20 19:04:17 +00001141 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1142 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1143 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001144 assertInvalid(g, b'\x00' * 3)
1145 assertInvalid(g, b'\x00' * 5)
1146 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001147 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001148
Serhiy Storchaka43767632013-11-03 21:31:38 +02001149 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1150 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001151 def testStringToIPv6(self):
1152 try:
1153 from socket import inet_ntop, AF_INET6, has_ipv6
1154 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001155 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001156 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001157 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001158
1159 if sys.platform == "win32":
1160 try:
1161 inet_ntop(AF_INET6, b'\x00' * 16)
1162 except OSError as e:
1163 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001164 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001165
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001166 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001167 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001168 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001169 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001170
Ezio Melottib3aedd42010-11-20 19:04:17 +00001171 self.assertEqual('::', f(b'\x00' * 16))
1172 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1173 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001174 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001175 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 +00001176 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001177 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001178
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001179 assertInvalid(b'\x12' * 15)
1180 assertInvalid(b'\x12' * 17)
1181 assertInvalid(b'\x12' * 4)
1182
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001183 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001184
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001185 def testSockName(self):
1186 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001187 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001188 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001189 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001190 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001191 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001192 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1193 # it reasonable to get the host's addr in addition to 0.0.0.0.
1194 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001195 try:
1196 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001197 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001198 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001199 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001200 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001201 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001202
1203 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001204 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001205 # We know a socket should start without reuse==0
1206 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001207 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001208 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001209 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001210
1211 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001212 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001213 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001214 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001215 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1216 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001217 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001218
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001219 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001220 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001221 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1222 sock.settimeout(1)
1223 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001224 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001225
Martin Panter50ab1a32016-04-11 00:38:12 +00001226 def testCloseException(self):
1227 sock = socket.socket()
1228 socket.socket(fileno=sock.fileno()).close()
1229 try:
1230 sock.close()
1231 except OSError as err:
1232 # Winsock apparently raises ENOTSOCK
1233 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1234 else:
1235 self.fail("close() should raise EBADF/ENOTSOCK")
1236
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001237 def testNewAttributes(self):
1238 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001239
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001240 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1241 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001242 if hasattr(socket, 'SOCK_CLOEXEC'):
1243 self.assertIn(sock.type,
1244 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1245 socket.SOCK_STREAM))
1246 else:
1247 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001248 self.assertEqual(sock.proto, 0)
1249 sock.close()
1250
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001251 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001252 sock = socket.socket()
1253 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001254 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001255 big_port = port + 65536
1256 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001257 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1258 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1259 # Since find_unused_port() is inherently subject to race conditions, we
1260 # call it a couple times if necessary.
1261 for i in itertools.count():
1262 port = support.find_unused_port()
1263 try:
1264 sock.bind((HOST, port))
1265 except OSError as e:
1266 if e.errno != errno.EADDRINUSE or i == 5:
1267 raise
1268 else:
1269 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001270
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001271 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001272 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001273 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1274 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1275 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1276 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001277 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1278 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001279 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001280 self.assertRaises(ValueError, s.ioctl, -1, None)
1281 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001282
Steve Dowerea93ac02016-06-17 12:52:18 -07001283 @unittest.skipUnless(os.name == "nt", "Windows specific")
1284 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1285 'Loopback fast path support required for this test')
1286 def test_sio_loopback_fast_path(self):
1287 s = socket.socket()
1288 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001289 try:
1290 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1291 except OSError as exc:
1292 WSAEOPNOTSUPP = 10045
1293 if exc.winerror == WSAEOPNOTSUPP:
1294 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1295 "doesn't implemented in this Windows version")
1296 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001297 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1298
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001299 def testGetaddrinfo(self):
1300 try:
1301 socket.getaddrinfo('localhost', 80)
1302 except socket.gaierror as err:
1303 if err.errno == socket.EAI_SERVICE:
1304 # see http://bugs.python.org/issue1282647
1305 self.skipTest("buggy libc version")
1306 raise
1307 # len of every sequence is supposed to be == 5
1308 for info in socket.getaddrinfo(HOST, None):
1309 self.assertEqual(len(info), 5)
1310 # host can be a domain name, a string representation of an
1311 # IPv4/v6 address or None
1312 socket.getaddrinfo('localhost', 80)
1313 socket.getaddrinfo('127.0.0.1', 80)
1314 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001315 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001316 socket.getaddrinfo('::1', 80)
1317 # port can be a string service name such as "http", a numeric
1318 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001319 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1320 if (not hasattr(sys, 'getandroidapilevel') or
1321 sys.getandroidapilevel() >= 23):
1322 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001323 socket.getaddrinfo(HOST, 80)
1324 socket.getaddrinfo(HOST, None)
1325 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001326 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1327 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001328 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001329 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1330 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001331 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001332 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1333 for _, socktype, _, _, _ in infos:
1334 self.assertEqual(socktype, socket.SOCK_STREAM)
1335 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001336 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001337 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1338 # a server willing to support both IPv4 and IPv6 will
1339 # usually do this
1340 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1341 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001342 # test keyword arguments
1343 a = socket.getaddrinfo(HOST, None)
1344 b = socket.getaddrinfo(host=HOST, port=None)
1345 self.assertEqual(a, b)
1346 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1347 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1348 self.assertEqual(a, b)
1349 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1350 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1351 self.assertEqual(a, b)
1352 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1353 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1354 self.assertEqual(a, b)
1355 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1356 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1357 self.assertEqual(a, b)
1358 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1359 socket.AI_PASSIVE)
1360 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1361 type=socket.SOCK_STREAM, proto=0,
1362 flags=socket.AI_PASSIVE)
1363 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001364 # Issue #6697.
1365 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001366
Ned Deilyb24f4812014-02-13 22:50:42 -08001367 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001368 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001369 try:
1370 # The arguments here are undefined and the call may succeed
1371 # or fail. All we care here is that it doesn't segfault.
1372 socket.getaddrinfo("localhost", None, 0, 0, 0,
1373 socket.AI_NUMERICSERV)
1374 except socket.gaierror:
1375 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001376
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001377 def test_getnameinfo(self):
1378 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001379 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001380
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001381 @unittest.skipUnless(support.is_resource_enabled('network'),
1382 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001383 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001384 # Check for internet access before running test
1385 # (issue #12804, issue #25138).
1386 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001387 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001388
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001389 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001390 domain = 'испытание.pythontest.net'
1391 socket.gethostbyname(domain)
1392 socket.gethostbyname_ex(domain)
1393 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001394 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1395 # have a reverse entry yet
1396 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001397
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001398 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001399 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001400 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1401 self.skipTest("signal.alarm and socket.socketpair required for this test")
1402 # Our signal handlers clobber the C errno by calling a math function
1403 # with an invalid domain value.
1404 def ok_handler(*args):
1405 self.assertRaises(ValueError, math.acosh, 0)
1406 def raising_handler(*args):
1407 self.assertRaises(ValueError, math.acosh, 0)
1408 1 // 0
1409 c, s = socket.socketpair()
1410 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1411 try:
1412 if with_timeout:
1413 # Just above the one second minimum for signal.alarm
1414 c.settimeout(1.5)
1415 with self.assertRaises(ZeroDivisionError):
1416 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001417 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001418 if with_timeout:
1419 signal.signal(signal.SIGALRM, ok_handler)
1420 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001421 self.assertRaises(socket.timeout, c.sendall,
1422 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001423 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001424 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001425 signal.signal(signal.SIGALRM, old_alarm)
1426 c.close()
1427 s.close()
1428
1429 def test_sendall_interrupted(self):
1430 self.check_sendall_interrupted(False)
1431
1432 def test_sendall_interrupted_with_timeout(self):
1433 self.check_sendall_interrupted(True)
1434
Antoine Pitroue033e062010-10-29 10:38:18 +00001435 def test_dealloc_warn(self):
1436 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1437 r = repr(sock)
1438 with self.assertWarns(ResourceWarning) as cm:
1439 sock = None
1440 support.gc_collect()
1441 self.assertIn(r, str(cm.warning.args[0]))
1442 # An open socket file object gets dereferenced after the socket
1443 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1444 f = sock.makefile('rb')
1445 r = repr(sock)
1446 sock = None
1447 support.gc_collect()
1448 with self.assertWarns(ResourceWarning):
1449 f = None
1450 support.gc_collect()
1451
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001452 def test_name_closed_socketio(self):
1453 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1454 fp = sock.makefile("rb")
1455 fp.close()
1456 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1457
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001458 def test_unusable_closed_socketio(self):
1459 with socket.socket() as sock:
1460 fp = sock.makefile("rb", buffering=0)
1461 self.assertTrue(fp.readable())
1462 self.assertFalse(fp.writable())
1463 self.assertFalse(fp.seekable())
1464 fp.close()
1465 self.assertRaises(ValueError, fp.readable)
1466 self.assertRaises(ValueError, fp.writable)
1467 self.assertRaises(ValueError, fp.seekable)
1468
Berker Peksag3fe64d02016-02-18 17:34:00 +02001469 def test_makefile_mode(self):
1470 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1471 with self.subTest(mode=mode):
1472 with socket.socket() as sock:
1473 with sock.makefile(mode) as fp:
1474 self.assertEqual(fp.mode, mode)
1475
1476 def test_makefile_invalid_mode(self):
1477 for mode in 'rt', 'x', '+', 'a':
1478 with self.subTest(mode=mode):
1479 with socket.socket() as sock:
1480 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1481 sock.makefile(mode)
1482
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001483 def test_pickle(self):
1484 sock = socket.socket()
1485 with sock:
1486 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1487 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001488 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1489 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1490 self.assertEqual(family, socket.AF_INET)
1491 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1492 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001493
Serhiy Storchaka78980432013-01-15 01:12:17 +02001494 def test_listen_backlog(self):
1495 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001496 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1497 srv.bind((HOST, 0))
1498 srv.listen(backlog)
1499
1500 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001501 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001502 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001503
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001504 @support.cpython_only
1505 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001506 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001507 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001508 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1509 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001510 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001511 srv.close()
1512
Charles-François Natali42663332012-01-02 15:57:30 +01001513 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001514 def test_flowinfo(self):
1515 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001516 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001517 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001518 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001519
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001520 def test_str_for_enums(self):
1521 # Make sure that the AF_* and SOCK_* constants have enum-like string
1522 # reprs.
1523 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1524 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001525 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001526
1527 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1528 def test_uknown_socket_family_repr(self):
1529 # Test that when created with a family that's not one of the known
1530 # AF_*/SOCK_* constants, socket.family just returns the number.
1531 #
1532 # To do this we fool socket.socket into believing it already has an
1533 # open fd because on this path it doesn't actually verify the family and
1534 # type and populates the socket object.
1535 #
1536 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001537 fd, path = tempfile.mkstemp()
1538 self.addCleanup(os.unlink, path)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001539 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1540 self.assertEqual(s.family, 42424)
1541 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001542
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001543 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1544 def test__sendfile_use_sendfile(self):
1545 class File:
1546 def __init__(self, fd):
1547 self.fd = fd
1548
1549 def fileno(self):
1550 return self.fd
1551 with socket.socket() as sock:
1552 fd = os.open(os.curdir, os.O_RDONLY)
1553 os.close(fd)
1554 with self.assertRaises(socket._GiveupOnSendfile):
1555 sock._sendfile_use_sendfile(File(fd))
1556 with self.assertRaises(OverflowError):
1557 sock._sendfile_use_sendfile(File(2**1000))
1558 with self.assertRaises(TypeError):
1559 sock._sendfile_use_sendfile(File(None))
1560
1561
Charles-François Natali47413c12011-10-06 19:47:44 +02001562@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1563class BasicCANTest(unittest.TestCase):
1564
1565 def testCrucialConstants(self):
1566 socket.AF_CAN
1567 socket.PF_CAN
1568 socket.CAN_RAW
1569
Charles-François Natali773e42d2013-02-05 19:42:01 +01001570 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1571 'socket.CAN_BCM required for this test.')
1572 def testBCMConstants(self):
1573 socket.CAN_BCM
1574
1575 # opcodes
1576 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1577 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1578 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1579 socket.CAN_BCM_TX_SEND # send one CAN frame
1580 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1581 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1582 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1583 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1584 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1585 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1586 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1587 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1588
Charles-François Natali47413c12011-10-06 19:47:44 +02001589 def testCreateSocket(self):
1590 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1591 pass
1592
Charles-François Natali773e42d2013-02-05 19:42:01 +01001593 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1594 'socket.CAN_BCM required for this test.')
1595 def testCreateBCMSocket(self):
1596 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1597 pass
1598
Charles-François Natali47413c12011-10-06 19:47:44 +02001599 def testBindAny(self):
1600 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1601 s.bind(('', ))
1602
1603 def testTooLongInterfaceName(self):
1604 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1605 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001606 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001607 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001608
1609 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1610 'socket.CAN_RAW_LOOPBACK required for this test.')
1611 def testLoopback(self):
1612 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1613 for loopback in (0, 1):
1614 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1615 loopback)
1616 self.assertEqual(loopback,
1617 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1618
1619 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1620 'socket.CAN_RAW_FILTER required for this test.')
1621 def testFilter(self):
1622 can_id, can_mask = 0x200, 0x700
1623 can_filter = struct.pack("=II", can_id, can_mask)
1624 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1625 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1626 self.assertEqual(can_filter,
1627 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001628 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001629
1630
1631@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001632@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001633class CANTest(ThreadedCANSocketTest):
1634
Charles-François Natali47413c12011-10-06 19:47:44 +02001635 def __init__(self, methodName='runTest'):
1636 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1637
1638 @classmethod
1639 def build_can_frame(cls, can_id, data):
1640 """Build a CAN frame."""
1641 can_dlc = len(data)
1642 data = data.ljust(8, b'\x00')
1643 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1644
1645 @classmethod
1646 def dissect_can_frame(cls, frame):
1647 """Dissect a CAN frame."""
1648 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1649 return (can_id, can_dlc, data[:can_dlc])
1650
1651 def testSendFrame(self):
1652 cf, addr = self.s.recvfrom(self.bufsize)
1653 self.assertEqual(self.cf, cf)
1654 self.assertEqual(addr[0], self.interface)
1655 self.assertEqual(addr[1], socket.AF_CAN)
1656
1657 def _testSendFrame(self):
1658 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1659 self.cli.send(self.cf)
1660
1661 def testSendMaxFrame(self):
1662 cf, addr = self.s.recvfrom(self.bufsize)
1663 self.assertEqual(self.cf, cf)
1664
1665 def _testSendMaxFrame(self):
1666 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1667 self.cli.send(self.cf)
1668
1669 def testSendMultiFrames(self):
1670 cf, addr = self.s.recvfrom(self.bufsize)
1671 self.assertEqual(self.cf1, cf)
1672
1673 cf, addr = self.s.recvfrom(self.bufsize)
1674 self.assertEqual(self.cf2, cf)
1675
1676 def _testSendMultiFrames(self):
1677 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1678 self.cli.send(self.cf1)
1679
1680 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1681 self.cli.send(self.cf2)
1682
Charles-François Natali773e42d2013-02-05 19:42:01 +01001683 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1684 'socket.CAN_BCM required for this test.')
1685 def _testBCM(self):
1686 cf, addr = self.cli.recvfrom(self.bufsize)
1687 self.assertEqual(self.cf, cf)
1688 can_id, can_dlc, data = self.dissect_can_frame(cf)
1689 self.assertEqual(self.can_id, can_id)
1690 self.assertEqual(self.data, data)
1691
1692 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1693 'socket.CAN_BCM required for this test.')
1694 def testBCM(self):
1695 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1696 self.addCleanup(bcm.close)
1697 bcm.connect((self.interface,))
1698 self.can_id = 0x123
1699 self.data = bytes([0xc0, 0xff, 0xee])
1700 self.cf = self.build_can_frame(self.can_id, self.data)
1701 opcode = socket.CAN_BCM_TX_SEND
1702 flags = 0
1703 count = 0
1704 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1705 bcm_can_id = 0x0222
1706 nframes = 1
1707 assert len(self.cf) == 16
1708 header = struct.pack(self.bcm_cmd_msg_fmt,
1709 opcode,
1710 flags,
1711 count,
1712 ival1_seconds,
1713 ival1_usec,
1714 ival2_seconds,
1715 ival2_usec,
1716 bcm_can_id,
1717 nframes,
1718 )
1719 header_plus_frame = header + self.cf
1720 bytes_sent = bcm.send(header_plus_frame)
1721 self.assertEqual(bytes_sent, len(header_plus_frame))
1722
Charles-François Natali47413c12011-10-06 19:47:44 +02001723
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001724@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
1725class ISOTPTest(unittest.TestCase):
1726
1727 def __init__(self, *args, **kwargs):
1728 super().__init__(*args, **kwargs)
1729 self.interface = "vcan0"
1730
1731 def testCrucialConstants(self):
1732 socket.AF_CAN
1733 socket.PF_CAN
1734 socket.CAN_ISOTP
1735 socket.SOCK_DGRAM
1736
1737 def testCreateSocket(self):
1738 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1739 pass
1740
1741 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
1742 'socket.CAN_ISOTP required for this test.')
1743 def testCreateISOTPSocket(self):
1744 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1745 pass
1746
1747 def testTooLongInterfaceName(self):
1748 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1749 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1750 with self.assertRaisesRegex(OSError, 'interface name too long'):
1751 s.bind(('x' * 1024, 1, 2))
1752
1753 def testBind(self):
1754 try:
1755 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1756 addr = self.interface, 0x123, 0x456
1757 s.bind(addr)
1758 self.assertEqual(s.getsockname(), addr)
1759 except OSError as e:
1760 if e.errno == errno.ENODEV:
1761 self.skipTest('network interface `%s` does not exist' %
1762 self.interface)
1763 else:
1764 raise
1765
1766
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001767@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1768class BasicRDSTest(unittest.TestCase):
1769
1770 def testCrucialConstants(self):
1771 socket.AF_RDS
1772 socket.PF_RDS
1773
1774 def testCreateSocket(self):
1775 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1776 pass
1777
1778 def testSocketBufferSize(self):
1779 bufsize = 16384
1780 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1781 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1782 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1783
1784
1785@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1786@unittest.skipUnless(thread, 'Threading required for this test.')
1787class RDSTest(ThreadedRDSSocketTest):
1788
1789 def __init__(self, methodName='runTest'):
1790 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1791
Charles-François Natali240c55f2011-11-10 20:33:36 +01001792 def setUp(self):
1793 super().setUp()
1794 self.evt = threading.Event()
1795
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001796 def testSendAndRecv(self):
1797 data, addr = self.serv.recvfrom(self.bufsize)
1798 self.assertEqual(self.data, data)
1799 self.assertEqual(self.cli_addr, addr)
1800
1801 def _testSendAndRecv(self):
1802 self.data = b'spam'
1803 self.cli.sendto(self.data, 0, (HOST, self.port))
1804
1805 def testPeek(self):
1806 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1807 self.assertEqual(self.data, data)
1808 data, addr = self.serv.recvfrom(self.bufsize)
1809 self.assertEqual(self.data, data)
1810
1811 def _testPeek(self):
1812 self.data = b'spam'
1813 self.cli.sendto(self.data, 0, (HOST, self.port))
1814
1815 @requireAttrs(socket.socket, 'recvmsg')
1816 def testSendAndRecvMsg(self):
1817 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1818 self.assertEqual(self.data, data)
1819
1820 @requireAttrs(socket.socket, 'sendmsg')
1821 def _testSendAndRecvMsg(self):
1822 self.data = b'hello ' * 10
1823 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1824
1825 def testSendAndRecvMulti(self):
1826 data, addr = self.serv.recvfrom(self.bufsize)
1827 self.assertEqual(self.data1, data)
1828
1829 data, addr = self.serv.recvfrom(self.bufsize)
1830 self.assertEqual(self.data2, data)
1831
1832 def _testSendAndRecvMulti(self):
1833 self.data1 = b'bacon'
1834 self.cli.sendto(self.data1, 0, (HOST, self.port))
1835
1836 self.data2 = b'egg'
1837 self.cli.sendto(self.data2, 0, (HOST, self.port))
1838
1839 def testSelect(self):
1840 r, w, x = select.select([self.serv], [], [], 3.0)
1841 self.assertIn(self.serv, r)
1842 data, addr = self.serv.recvfrom(self.bufsize)
1843 self.assertEqual(self.data, data)
1844
1845 def _testSelect(self):
1846 self.data = b'select'
1847 self.cli.sendto(self.data, 0, (HOST, self.port))
1848
1849 def testCongestion(self):
1850 # wait until the sender is done
1851 self.evt.wait()
1852
1853 def _testCongestion(self):
1854 # test the behavior in case of congestion
1855 self.data = b'fill'
1856 self.cli.setblocking(False)
1857 try:
1858 # try to lower the receiver's socket buffer size
1859 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1860 except OSError:
1861 pass
1862 with self.assertRaises(OSError) as cm:
1863 try:
1864 # fill the receiver's socket buffer
1865 while True:
1866 self.cli.sendto(self.data, 0, (HOST, self.port))
1867 finally:
1868 # signal the receiver we're done
1869 self.evt.set()
1870 # sendto() should have failed with ENOBUFS
1871 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1872 # and we should have received a congestion notification through poll
1873 r, w, x = select.select([self.serv], [], [], 3.0)
1874 self.assertIn(self.serv, r)
1875
1876
Victor Stinner45df8202010-04-28 22:31:17 +00001877@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001878class BasicTCPTest(SocketConnectedTest):
1879
1880 def __init__(self, methodName='runTest'):
1881 SocketConnectedTest.__init__(self, methodName=methodName)
1882
1883 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001884 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001885 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001886 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001887
1888 def _testRecv(self):
1889 self.serv_conn.send(MSG)
1890
1891 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001892 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001893 seg1 = self.cli_conn.recv(len(MSG) - 3)
1894 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001895 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001896 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001897
1898 def _testOverFlowRecv(self):
1899 self.serv_conn.send(MSG)
1900
1901 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001902 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001903 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001904 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001905
1906 def _testRecvFrom(self):
1907 self.serv_conn.send(MSG)
1908
1909 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001910 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001911 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1912 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001913 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001914 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001915
1916 def _testOverFlowRecvFrom(self):
1917 self.serv_conn.send(MSG)
1918
1919 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001920 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001921 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001922 while 1:
1923 read = self.cli_conn.recv(1024)
1924 if not read:
1925 break
Guido van Rossume531e292002-08-08 20:28:34 +00001926 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001927 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001928
1929 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001930 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001931 self.serv_conn.sendall(big_chunk)
1932
1933 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001934 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001935 fd = self.cli_conn.fileno()
1936 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001937 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001938 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001939 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001940 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001941
1942 def _testFromFd(self):
1943 self.serv_conn.send(MSG)
1944
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001945 def testDup(self):
1946 # Testing dup()
1947 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001948 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001949 msg = sock.recv(1024)
1950 self.assertEqual(msg, MSG)
1951
1952 def _testDup(self):
1953 self.serv_conn.send(MSG)
1954
Guido van Rossum24e4af82002-06-12 19:18:08 +00001955 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001956 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001957 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001958 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001959 # wait for _testShutdown to finish: on OS X, when the server
1960 # closes the connection the client also becomes disconnected,
1961 # and the client's shutdown call will fail. (Issue #4397.)
1962 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001963
1964 def _testShutdown(self):
1965 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001966 self.serv_conn.shutdown(2)
1967
1968 testShutdown_overflow = support.cpython_only(testShutdown)
1969
1970 @support.cpython_only
1971 def _testShutdown_overflow(self):
1972 import _testcapi
1973 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001974 # Issue 15989
1975 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1976 _testcapi.INT_MAX + 1)
1977 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1978 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001979 self.serv_conn.shutdown(2)
1980
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001981 def testDetach(self):
1982 # Testing detach()
1983 fileno = self.cli_conn.fileno()
1984 f = self.cli_conn.detach()
1985 self.assertEqual(f, fileno)
1986 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001987 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001988 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001989 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001990 # ...but we can create another socket using the (still open)
1991 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001992 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001993 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001994 msg = sock.recv(1024)
1995 self.assertEqual(msg, MSG)
1996
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001997 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001998 self.serv_conn.send(MSG)
1999
Victor Stinner45df8202010-04-28 22:31:17 +00002000@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00002001class BasicUDPTest(ThreadedUDPSocketTest):
2002
2003 def __init__(self, methodName='runTest'):
2004 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2005
2006 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002007 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002008 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002009 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002010
2011 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002012 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002013
Guido van Rossum1c938012002-06-12 21:17:20 +00002014 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002015 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002016 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002017 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002018
Guido van Rossum1c938012002-06-12 21:17:20 +00002019 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002020 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002021
Guido van Rossumd8faa362007-04-27 19:54:29 +00002022 def testRecvFromNegative(self):
2023 # Negative lengths passed to recvfrom should give ValueError.
2024 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2025
2026 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002027 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002028
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002029# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2030# same test code is used with different families and types of socket
2031# (e.g. stream, datagram), and tests using recvmsg() are repeated
2032# using recvmsg_into().
2033#
2034# The generic test classes such as SendmsgTests and
2035# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2036# supplied with sockets cli_sock and serv_sock representing the
2037# client's and the server's end of the connection respectively, and
2038# attributes cli_addr and serv_addr holding their (numeric where
2039# appropriate) addresses.
2040#
2041# The final concrete test classes combine these with subclasses of
2042# SocketTestBase which set up client and server sockets of a specific
2043# type, and with subclasses of SendrecvmsgBase such as
2044# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2045# sockets to cli_sock and serv_sock and override the methods and
2046# attributes of SendrecvmsgBase to fill in destination addresses if
2047# needed when sending, check for specific flags in msg_flags, etc.
2048#
2049# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2050# recvmsg_into().
2051
2052# XXX: like the other datagram (UDP) tests in this module, the code
2053# here assumes that datagram delivery on the local machine will be
2054# reliable.
2055
2056class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2057 # Base class for sendmsg()/recvmsg() tests.
2058
2059 # Time in seconds to wait before considering a test failed, or
2060 # None for no timeout. Not all tests actually set a timeout.
2061 fail_timeout = 3.0
2062
2063 def setUp(self):
2064 self.misc_event = threading.Event()
2065 super().setUp()
2066
2067 def sendToServer(self, msg):
2068 # Send msg to the server.
2069 return self.cli_sock.send(msg)
2070
2071 # Tuple of alternative default arguments for sendmsg() when called
2072 # via sendmsgToServer() (e.g. to include a destination address).
2073 sendmsg_to_server_defaults = ()
2074
2075 def sendmsgToServer(self, *args):
2076 # Call sendmsg() on self.cli_sock with the given arguments,
2077 # filling in any arguments which are not supplied with the
2078 # corresponding items of self.sendmsg_to_server_defaults, if
2079 # any.
2080 return self.cli_sock.sendmsg(
2081 *(args + self.sendmsg_to_server_defaults[len(args):]))
2082
2083 def doRecvmsg(self, sock, bufsize, *args):
2084 # Call recvmsg() on sock with given arguments and return its
2085 # result. Should be used for tests which can use either
2086 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2087 # this method with one which emulates it using recvmsg_into(),
2088 # thus allowing the same test to be used for both methods.
2089 result = sock.recvmsg(bufsize, *args)
2090 self.registerRecvmsgResult(result)
2091 return result
2092
2093 def registerRecvmsgResult(self, result):
2094 # Called by doRecvmsg() with the return value of recvmsg() or
2095 # recvmsg_into(). Can be overridden to arrange cleanup based
2096 # on the returned ancillary data, for instance.
2097 pass
2098
2099 def checkRecvmsgAddress(self, addr1, addr2):
2100 # Called to compare the received address with the address of
2101 # the peer.
2102 self.assertEqual(addr1, addr2)
2103
2104 # Flags that are normally unset in msg_flags
2105 msg_flags_common_unset = 0
2106 for name in ("MSG_CTRUNC", "MSG_OOB"):
2107 msg_flags_common_unset |= getattr(socket, name, 0)
2108
2109 # Flags that are normally set
2110 msg_flags_common_set = 0
2111
2112 # Flags set when a complete record has been received (e.g. MSG_EOR
2113 # for SCTP)
2114 msg_flags_eor_indicator = 0
2115
2116 # Flags set when a complete record has not been received
2117 # (e.g. MSG_TRUNC for datagram sockets)
2118 msg_flags_non_eor_indicator = 0
2119
2120 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2121 # Method to check the value of msg_flags returned by recvmsg[_into]().
2122 #
2123 # Checks that all bits in msg_flags_common_set attribute are
2124 # set in "flags" and all bits in msg_flags_common_unset are
2125 # unset.
2126 #
2127 # The "eor" argument specifies whether the flags should
2128 # indicate that a full record (or datagram) has been received.
2129 # If "eor" is None, no checks are done; otherwise, checks
2130 # that:
2131 #
2132 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2133 # set and all bits in msg_flags_non_eor_indicator are unset
2134 #
2135 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2136 # are set and all bits in msg_flags_eor_indicator are unset
2137 #
2138 # If "checkset" and/or "checkunset" are supplied, they require
2139 # the given bits to be set or unset respectively, overriding
2140 # what the attributes require for those bits.
2141 #
2142 # If any bits are set in "ignore", they will not be checked,
2143 # regardless of the other inputs.
2144 #
2145 # Will raise Exception if the inputs require a bit to be both
2146 # set and unset, and it is not ignored.
2147
2148 defaultset = self.msg_flags_common_set
2149 defaultunset = self.msg_flags_common_unset
2150
2151 if eor:
2152 defaultset |= self.msg_flags_eor_indicator
2153 defaultunset |= self.msg_flags_non_eor_indicator
2154 elif eor is not None:
2155 defaultset |= self.msg_flags_non_eor_indicator
2156 defaultunset |= self.msg_flags_eor_indicator
2157
2158 # Function arguments override defaults
2159 defaultset &= ~checkunset
2160 defaultunset &= ~checkset
2161
2162 # Merge arguments with remaining defaults, and check for conflicts
2163 checkset |= defaultset
2164 checkunset |= defaultunset
2165 inboth = checkset & checkunset & ~ignore
2166 if inboth:
2167 raise Exception("contradictory set, unset requirements for flags "
2168 "{0:#x}".format(inboth))
2169
2170 # Compare with given msg_flags value
2171 mask = (checkset | checkunset) & ~ignore
2172 self.assertEqual(flags & mask, checkset & mask)
2173
2174
2175class RecvmsgIntoMixin(SendrecvmsgBase):
2176 # Mixin to implement doRecvmsg() using recvmsg_into().
2177
2178 def doRecvmsg(self, sock, bufsize, *args):
2179 buf = bytearray(bufsize)
2180 result = sock.recvmsg_into([buf], *args)
2181 self.registerRecvmsgResult(result)
2182 self.assertGreaterEqual(result[0], 0)
2183 self.assertLessEqual(result[0], bufsize)
2184 return (bytes(buf[:result[0]]),) + result[1:]
2185
2186
2187class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2188 # Defines flags to be checked in msg_flags for datagram sockets.
2189
2190 @property
2191 def msg_flags_non_eor_indicator(self):
2192 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2193
2194
2195class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2196 # Defines flags to be checked in msg_flags for SCTP sockets.
2197
2198 @property
2199 def msg_flags_eor_indicator(self):
2200 return super().msg_flags_eor_indicator | socket.MSG_EOR
2201
2202
2203class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2204 # Base class for tests on connectionless-mode sockets. Users must
2205 # supply sockets on attributes cli and serv to be mapped to
2206 # cli_sock and serv_sock respectively.
2207
2208 @property
2209 def serv_sock(self):
2210 return self.serv
2211
2212 @property
2213 def cli_sock(self):
2214 return self.cli
2215
2216 @property
2217 def sendmsg_to_server_defaults(self):
2218 return ([], [], 0, self.serv_addr)
2219
2220 def sendToServer(self, msg):
2221 return self.cli_sock.sendto(msg, self.serv_addr)
2222
2223
2224class SendrecvmsgConnectedBase(SendrecvmsgBase):
2225 # Base class for tests on connected sockets. Users must supply
2226 # sockets on attributes serv_conn and cli_conn (representing the
2227 # connections *to* the server and the client), to be mapped to
2228 # cli_sock and serv_sock respectively.
2229
2230 @property
2231 def serv_sock(self):
2232 return self.cli_conn
2233
2234 @property
2235 def cli_sock(self):
2236 return self.serv_conn
2237
2238 def checkRecvmsgAddress(self, addr1, addr2):
2239 # Address is currently "unspecified" for a connected socket,
2240 # so we don't examine it
2241 pass
2242
2243
2244class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2245 # Base class to set a timeout on server's socket.
2246
2247 def setUp(self):
2248 super().setUp()
2249 self.serv_sock.settimeout(self.fail_timeout)
2250
2251
2252class SendmsgTests(SendrecvmsgServerTimeoutBase):
2253 # Tests for sendmsg() which can use any socket type and do not
2254 # involve recvmsg() or recvmsg_into().
2255
2256 def testSendmsg(self):
2257 # Send a simple message with sendmsg().
2258 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2259
2260 def _testSendmsg(self):
2261 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2262
2263 def testSendmsgDataGenerator(self):
2264 # Send from buffer obtained from a generator (not a sequence).
2265 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2266
2267 def _testSendmsgDataGenerator(self):
2268 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2269 len(MSG))
2270
2271 def testSendmsgAncillaryGenerator(self):
2272 # Gather (empty) ancillary data from a generator.
2273 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2274
2275 def _testSendmsgAncillaryGenerator(self):
2276 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2277 len(MSG))
2278
2279 def testSendmsgArray(self):
2280 # Send data from an array instead of the usual bytes object.
2281 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2282
2283 def _testSendmsgArray(self):
2284 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2285 len(MSG))
2286
2287 def testSendmsgGather(self):
2288 # Send message data from more than one buffer (gather write).
2289 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2290
2291 def _testSendmsgGather(self):
2292 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2293
2294 def testSendmsgBadArgs(self):
2295 # Check that sendmsg() rejects invalid arguments.
2296 self.assertEqual(self.serv_sock.recv(1000), b"done")
2297
2298 def _testSendmsgBadArgs(self):
2299 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2300 self.assertRaises(TypeError, self.sendmsgToServer,
2301 b"not in an iterable")
2302 self.assertRaises(TypeError, self.sendmsgToServer,
2303 object())
2304 self.assertRaises(TypeError, self.sendmsgToServer,
2305 [object()])
2306 self.assertRaises(TypeError, self.sendmsgToServer,
2307 [MSG, object()])
2308 self.assertRaises(TypeError, self.sendmsgToServer,
2309 [MSG], object())
2310 self.assertRaises(TypeError, self.sendmsgToServer,
2311 [MSG], [], object())
2312 self.assertRaises(TypeError, self.sendmsgToServer,
2313 [MSG], [], 0, object())
2314 self.sendToServer(b"done")
2315
2316 def testSendmsgBadCmsg(self):
2317 # Check that invalid ancillary data items are rejected.
2318 self.assertEqual(self.serv_sock.recv(1000), b"done")
2319
2320 def _testSendmsgBadCmsg(self):
2321 self.assertRaises(TypeError, self.sendmsgToServer,
2322 [MSG], [object()])
2323 self.assertRaises(TypeError, self.sendmsgToServer,
2324 [MSG], [(object(), 0, b"data")])
2325 self.assertRaises(TypeError, self.sendmsgToServer,
2326 [MSG], [(0, object(), b"data")])
2327 self.assertRaises(TypeError, self.sendmsgToServer,
2328 [MSG], [(0, 0, object())])
2329 self.assertRaises(TypeError, self.sendmsgToServer,
2330 [MSG], [(0, 0)])
2331 self.assertRaises(TypeError, self.sendmsgToServer,
2332 [MSG], [(0, 0, b"data", 42)])
2333 self.sendToServer(b"done")
2334
2335 @requireAttrs(socket, "CMSG_SPACE")
2336 def testSendmsgBadMultiCmsg(self):
2337 # Check that invalid ancillary data items are rejected when
2338 # more than one item is present.
2339 self.assertEqual(self.serv_sock.recv(1000), b"done")
2340
2341 @testSendmsgBadMultiCmsg.client_skip
2342 def _testSendmsgBadMultiCmsg(self):
2343 self.assertRaises(TypeError, self.sendmsgToServer,
2344 [MSG], [0, 0, b""])
2345 self.assertRaises(TypeError, self.sendmsgToServer,
2346 [MSG], [(0, 0, b""), object()])
2347 self.sendToServer(b"done")
2348
2349 def testSendmsgExcessCmsgReject(self):
2350 # Check that sendmsg() rejects excess ancillary data items
2351 # when the number that can be sent is limited.
2352 self.assertEqual(self.serv_sock.recv(1000), b"done")
2353
2354 def _testSendmsgExcessCmsgReject(self):
2355 if not hasattr(socket, "CMSG_SPACE"):
2356 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002357 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002358 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2359 self.assertIsNone(cm.exception.errno)
2360 self.sendToServer(b"done")
2361
2362 def testSendmsgAfterClose(self):
2363 # Check that sendmsg() fails on a closed socket.
2364 pass
2365
2366 def _testSendmsgAfterClose(self):
2367 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002368 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002369
2370
2371class SendmsgStreamTests(SendmsgTests):
2372 # Tests for sendmsg() which require a stream socket and do not
2373 # involve recvmsg() or recvmsg_into().
2374
2375 def testSendmsgExplicitNoneAddr(self):
2376 # Check that peer address can be specified as None.
2377 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2378
2379 def _testSendmsgExplicitNoneAddr(self):
2380 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2381
2382 def testSendmsgTimeout(self):
2383 # Check that timeout works with sendmsg().
2384 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2385 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2386
2387 def _testSendmsgTimeout(self):
2388 try:
2389 self.cli_sock.settimeout(0.03)
2390 with self.assertRaises(socket.timeout):
2391 while True:
2392 self.sendmsgToServer([b"a"*512])
2393 finally:
2394 self.misc_event.set()
2395
2396 # XXX: would be nice to have more tests for sendmsg flags argument.
2397
2398 # Linux supports MSG_DONTWAIT when sending, but in general, it
2399 # only works when receiving. Could add other platforms if they
2400 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002401 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002402 "MSG_DONTWAIT not known to work on this platform when "
2403 "sending")
2404 def testSendmsgDontWait(self):
2405 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2406 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2407 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2408
2409 @testSendmsgDontWait.client_skip
2410 def _testSendmsgDontWait(self):
2411 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002412 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002413 while True:
2414 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2415 self.assertIn(cm.exception.errno,
2416 (errno.EAGAIN, errno.EWOULDBLOCK))
2417 finally:
2418 self.misc_event.set()
2419
2420
2421class SendmsgConnectionlessTests(SendmsgTests):
2422 # Tests for sendmsg() which require a connectionless-mode
2423 # (e.g. datagram) socket, and do not involve recvmsg() or
2424 # recvmsg_into().
2425
2426 def testSendmsgNoDestAddr(self):
2427 # Check that sendmsg() fails when no destination address is
2428 # given for unconnected socket.
2429 pass
2430
2431 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002432 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002433 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002434 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002435 [MSG], [], 0, None)
2436
2437
2438class RecvmsgGenericTests(SendrecvmsgBase):
2439 # Tests for recvmsg() which can also be emulated using
2440 # recvmsg_into(), and can use any socket type.
2441
2442 def testRecvmsg(self):
2443 # Receive a simple message with recvmsg[_into]().
2444 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2445 self.assertEqual(msg, MSG)
2446 self.checkRecvmsgAddress(addr, self.cli_addr)
2447 self.assertEqual(ancdata, [])
2448 self.checkFlags(flags, eor=True)
2449
2450 def _testRecvmsg(self):
2451 self.sendToServer(MSG)
2452
2453 def testRecvmsgExplicitDefaults(self):
2454 # Test recvmsg[_into]() with default arguments provided explicitly.
2455 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2456 len(MSG), 0, 0)
2457 self.assertEqual(msg, MSG)
2458 self.checkRecvmsgAddress(addr, self.cli_addr)
2459 self.assertEqual(ancdata, [])
2460 self.checkFlags(flags, eor=True)
2461
2462 def _testRecvmsgExplicitDefaults(self):
2463 self.sendToServer(MSG)
2464
2465 def testRecvmsgShorter(self):
2466 # Receive a message smaller than buffer.
2467 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2468 len(MSG) + 42)
2469 self.assertEqual(msg, MSG)
2470 self.checkRecvmsgAddress(addr, self.cli_addr)
2471 self.assertEqual(ancdata, [])
2472 self.checkFlags(flags, eor=True)
2473
2474 def _testRecvmsgShorter(self):
2475 self.sendToServer(MSG)
2476
Charles-François Natali8619cd72011-10-03 19:43:15 +02002477 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2478 # datagram is received (issue #13001).
2479 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002480 def testRecvmsgTrunc(self):
2481 # Receive part of message, check for truncation indicators.
2482 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2483 len(MSG) - 3)
2484 self.assertEqual(msg, MSG[:-3])
2485 self.checkRecvmsgAddress(addr, self.cli_addr)
2486 self.assertEqual(ancdata, [])
2487 self.checkFlags(flags, eor=False)
2488
Charles-François Natali8619cd72011-10-03 19:43:15 +02002489 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002490 def _testRecvmsgTrunc(self):
2491 self.sendToServer(MSG)
2492
2493 def testRecvmsgShortAncillaryBuf(self):
2494 # Test ancillary data buffer too small to hold any ancillary data.
2495 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2496 len(MSG), 1)
2497 self.assertEqual(msg, MSG)
2498 self.checkRecvmsgAddress(addr, self.cli_addr)
2499 self.assertEqual(ancdata, [])
2500 self.checkFlags(flags, eor=True)
2501
2502 def _testRecvmsgShortAncillaryBuf(self):
2503 self.sendToServer(MSG)
2504
2505 def testRecvmsgLongAncillaryBuf(self):
2506 # Test large ancillary data buffer.
2507 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2508 len(MSG), 10240)
2509 self.assertEqual(msg, MSG)
2510 self.checkRecvmsgAddress(addr, self.cli_addr)
2511 self.assertEqual(ancdata, [])
2512 self.checkFlags(flags, eor=True)
2513
2514 def _testRecvmsgLongAncillaryBuf(self):
2515 self.sendToServer(MSG)
2516
2517 def testRecvmsgAfterClose(self):
2518 # Check that recvmsg[_into]() fails on a closed socket.
2519 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002520 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002521
2522 def _testRecvmsgAfterClose(self):
2523 pass
2524
2525 def testRecvmsgTimeout(self):
2526 # Check that timeout works.
2527 try:
2528 self.serv_sock.settimeout(0.03)
2529 self.assertRaises(socket.timeout,
2530 self.doRecvmsg, self.serv_sock, len(MSG))
2531 finally:
2532 self.misc_event.set()
2533
2534 def _testRecvmsgTimeout(self):
2535 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2536
2537 @requireAttrs(socket, "MSG_PEEK")
2538 def testRecvmsgPeek(self):
2539 # Check that MSG_PEEK in flags enables examination of pending
2540 # data without consuming it.
2541
2542 # Receive part of data with MSG_PEEK.
2543 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2544 len(MSG) - 3, 0,
2545 socket.MSG_PEEK)
2546 self.assertEqual(msg, MSG[:-3])
2547 self.checkRecvmsgAddress(addr, self.cli_addr)
2548 self.assertEqual(ancdata, [])
2549 # Ignoring MSG_TRUNC here (so this test is the same for stream
2550 # and datagram sockets). Some wording in POSIX seems to
2551 # suggest that it needn't be set when peeking, but that may
2552 # just be a slip.
2553 self.checkFlags(flags, eor=False,
2554 ignore=getattr(socket, "MSG_TRUNC", 0))
2555
2556 # Receive all data with MSG_PEEK.
2557 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2558 len(MSG), 0,
2559 socket.MSG_PEEK)
2560 self.assertEqual(msg, MSG)
2561 self.checkRecvmsgAddress(addr, self.cli_addr)
2562 self.assertEqual(ancdata, [])
2563 self.checkFlags(flags, eor=True)
2564
2565 # Check that the same data can still be received normally.
2566 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2567 self.assertEqual(msg, MSG)
2568 self.checkRecvmsgAddress(addr, self.cli_addr)
2569 self.assertEqual(ancdata, [])
2570 self.checkFlags(flags, eor=True)
2571
2572 @testRecvmsgPeek.client_skip
2573 def _testRecvmsgPeek(self):
2574 self.sendToServer(MSG)
2575
2576 @requireAttrs(socket.socket, "sendmsg")
2577 def testRecvmsgFromSendmsg(self):
2578 # Test receiving with recvmsg[_into]() when message is sent
2579 # using sendmsg().
2580 self.serv_sock.settimeout(self.fail_timeout)
2581 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2582 self.assertEqual(msg, MSG)
2583 self.checkRecvmsgAddress(addr, self.cli_addr)
2584 self.assertEqual(ancdata, [])
2585 self.checkFlags(flags, eor=True)
2586
2587 @testRecvmsgFromSendmsg.client_skip
2588 def _testRecvmsgFromSendmsg(self):
2589 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2590
2591
2592class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2593 # Tests which require a stream socket and can use either recvmsg()
2594 # or recvmsg_into().
2595
2596 def testRecvmsgEOF(self):
2597 # Receive end-of-stream indicator (b"", peer socket closed).
2598 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2599 self.assertEqual(msg, b"")
2600 self.checkRecvmsgAddress(addr, self.cli_addr)
2601 self.assertEqual(ancdata, [])
2602 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2603
2604 def _testRecvmsgEOF(self):
2605 self.cli_sock.close()
2606
2607 def testRecvmsgOverflow(self):
2608 # Receive a message in more than one chunk.
2609 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2610 len(MSG) - 3)
2611 self.checkRecvmsgAddress(addr, self.cli_addr)
2612 self.assertEqual(ancdata, [])
2613 self.checkFlags(flags, eor=False)
2614
2615 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2616 self.checkRecvmsgAddress(addr, self.cli_addr)
2617 self.assertEqual(ancdata, [])
2618 self.checkFlags(flags, eor=True)
2619
2620 msg = seg1 + seg2
2621 self.assertEqual(msg, MSG)
2622
2623 def _testRecvmsgOverflow(self):
2624 self.sendToServer(MSG)
2625
2626
2627class RecvmsgTests(RecvmsgGenericTests):
2628 # Tests for recvmsg() which can use any socket type.
2629
2630 def testRecvmsgBadArgs(self):
2631 # Check that recvmsg() rejects invalid arguments.
2632 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2633 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2634 -1, 0, 0)
2635 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2636 len(MSG), -1, 0)
2637 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2638 [bytearray(10)], 0, 0)
2639 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2640 object(), 0, 0)
2641 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2642 len(MSG), object(), 0)
2643 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2644 len(MSG), 0, object())
2645
2646 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2647 self.assertEqual(msg, MSG)
2648 self.checkRecvmsgAddress(addr, self.cli_addr)
2649 self.assertEqual(ancdata, [])
2650 self.checkFlags(flags, eor=True)
2651
2652 def _testRecvmsgBadArgs(self):
2653 self.sendToServer(MSG)
2654
2655
2656class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2657 # Tests for recvmsg_into() which can use any socket type.
2658
2659 def testRecvmsgIntoBadArgs(self):
2660 # Check that recvmsg_into() rejects invalid arguments.
2661 buf = bytearray(len(MSG))
2662 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2663 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2664 len(MSG), 0, 0)
2665 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2666 buf, 0, 0)
2667 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2668 [object()], 0, 0)
2669 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2670 [b"I'm not writable"], 0, 0)
2671 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2672 [buf, object()], 0, 0)
2673 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2674 [buf], -1, 0)
2675 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2676 [buf], object(), 0)
2677 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2678 [buf], 0, object())
2679
2680 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2681 self.assertEqual(nbytes, len(MSG))
2682 self.assertEqual(buf, bytearray(MSG))
2683 self.checkRecvmsgAddress(addr, self.cli_addr)
2684 self.assertEqual(ancdata, [])
2685 self.checkFlags(flags, eor=True)
2686
2687 def _testRecvmsgIntoBadArgs(self):
2688 self.sendToServer(MSG)
2689
2690 def testRecvmsgIntoGenerator(self):
2691 # Receive into buffer obtained from a generator (not a sequence).
2692 buf = bytearray(len(MSG))
2693 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2694 (o for o in [buf]))
2695 self.assertEqual(nbytes, len(MSG))
2696 self.assertEqual(buf, bytearray(MSG))
2697 self.checkRecvmsgAddress(addr, self.cli_addr)
2698 self.assertEqual(ancdata, [])
2699 self.checkFlags(flags, eor=True)
2700
2701 def _testRecvmsgIntoGenerator(self):
2702 self.sendToServer(MSG)
2703
2704 def testRecvmsgIntoArray(self):
2705 # Receive into an array rather than the usual bytearray.
2706 buf = array.array("B", [0] * len(MSG))
2707 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2708 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002709 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002710 self.checkRecvmsgAddress(addr, self.cli_addr)
2711 self.assertEqual(ancdata, [])
2712 self.checkFlags(flags, eor=True)
2713
2714 def _testRecvmsgIntoArray(self):
2715 self.sendToServer(MSG)
2716
2717 def testRecvmsgIntoScatter(self):
2718 # Receive into multiple buffers (scatter write).
2719 b1 = bytearray(b"----")
2720 b2 = bytearray(b"0123456789")
2721 b3 = bytearray(b"--------------")
2722 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2723 [b1, memoryview(b2)[2:9], b3])
2724 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2725 self.assertEqual(b1, bytearray(b"Mary"))
2726 self.assertEqual(b2, bytearray(b"01 had a 9"))
2727 self.assertEqual(b3, bytearray(b"little lamb---"))
2728 self.checkRecvmsgAddress(addr, self.cli_addr)
2729 self.assertEqual(ancdata, [])
2730 self.checkFlags(flags, eor=True)
2731
2732 def _testRecvmsgIntoScatter(self):
2733 self.sendToServer(b"Mary had a little lamb")
2734
2735
2736class CmsgMacroTests(unittest.TestCase):
2737 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2738 # assumptions used by sendmsg() and recvmsg[_into](), which share
2739 # code with these functions.
2740
2741 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002742 try:
2743 import _testcapi
2744 except ImportError:
2745 socklen_t_limit = 0x7fffffff
2746 else:
2747 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002748
2749 @requireAttrs(socket, "CMSG_LEN")
2750 def testCMSG_LEN(self):
2751 # Test CMSG_LEN() with various valid and invalid values,
2752 # checking the assumptions used by recvmsg() and sendmsg().
2753 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2754 values = list(range(257)) + list(range(toobig - 257, toobig))
2755
2756 # struct cmsghdr has at least three members, two of which are ints
2757 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2758 for n in values:
2759 ret = socket.CMSG_LEN(n)
2760 # This is how recvmsg() calculates the data size
2761 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2762 self.assertLessEqual(ret, self.socklen_t_limit)
2763
2764 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2765 # sendmsg() shares code with these functions, and requires
2766 # that it reject values over the limit.
2767 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2768 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2769
2770 @requireAttrs(socket, "CMSG_SPACE")
2771 def testCMSG_SPACE(self):
2772 # Test CMSG_SPACE() with various valid and invalid values,
2773 # checking the assumptions used by sendmsg().
2774 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2775 values = list(range(257)) + list(range(toobig - 257, toobig))
2776
2777 last = socket.CMSG_SPACE(0)
2778 # struct cmsghdr has at least three members, two of which are ints
2779 self.assertGreater(last, array.array("i").itemsize * 2)
2780 for n in values:
2781 ret = socket.CMSG_SPACE(n)
2782 self.assertGreaterEqual(ret, last)
2783 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2784 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2785 self.assertLessEqual(ret, self.socklen_t_limit)
2786 last = ret
2787
2788 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2789 # sendmsg() shares code with these functions, and requires
2790 # that it reject values over the limit.
2791 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2792 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2793
2794
2795class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2796 # Tests for file descriptor passing on Unix-domain sockets.
2797
2798 # Invalid file descriptor value that's unlikely to evaluate to a
2799 # real FD even if one of its bytes is replaced with a different
2800 # value (which shouldn't actually happen).
2801 badfd = -0x5555
2802
2803 def newFDs(self, n):
2804 # Return a list of n file descriptors for newly-created files
2805 # containing their list indices as ASCII numbers.
2806 fds = []
2807 for i in range(n):
2808 fd, path = tempfile.mkstemp()
2809 self.addCleanup(os.unlink, path)
2810 self.addCleanup(os.close, fd)
2811 os.write(fd, str(i).encode())
2812 fds.append(fd)
2813 return fds
2814
2815 def checkFDs(self, fds):
2816 # Check that the file descriptors in the given list contain
2817 # their correct list indices as ASCII numbers.
2818 for n, fd in enumerate(fds):
2819 os.lseek(fd, 0, os.SEEK_SET)
2820 self.assertEqual(os.read(fd, 1024), str(n).encode())
2821
2822 def registerRecvmsgResult(self, result):
2823 self.addCleanup(self.closeRecvmsgFDs, result)
2824
2825 def closeRecvmsgFDs(self, recvmsg_result):
2826 # Close all file descriptors specified in the ancillary data
2827 # of the given return value from recvmsg() or recvmsg_into().
2828 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2829 if (cmsg_level == socket.SOL_SOCKET and
2830 cmsg_type == socket.SCM_RIGHTS):
2831 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002832 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002833 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2834 for fd in fds:
2835 os.close(fd)
2836
2837 def createAndSendFDs(self, n):
2838 # Send n new file descriptors created by newFDs() to the
2839 # server, with the constant MSG as the non-ancillary data.
2840 self.assertEqual(
2841 self.sendmsgToServer([MSG],
2842 [(socket.SOL_SOCKET,
2843 socket.SCM_RIGHTS,
2844 array.array("i", self.newFDs(n)))]),
2845 len(MSG))
2846
2847 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2848 # Check that constant MSG was received with numfds file
2849 # descriptors in a maximum of maxcmsgs control messages (which
2850 # must contain only complete integers). By default, check
2851 # that MSG_CTRUNC is unset, but ignore any flags in
2852 # ignoreflags.
2853 msg, ancdata, flags, addr = result
2854 self.assertEqual(msg, MSG)
2855 self.checkRecvmsgAddress(addr, self.cli_addr)
2856 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2857 ignore=ignoreflags)
2858
2859 self.assertIsInstance(ancdata, list)
2860 self.assertLessEqual(len(ancdata), maxcmsgs)
2861 fds = array.array("i")
2862 for item in ancdata:
2863 self.assertIsInstance(item, tuple)
2864 cmsg_level, cmsg_type, cmsg_data = item
2865 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2866 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2867 self.assertIsInstance(cmsg_data, bytes)
2868 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002869 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002870
2871 self.assertEqual(len(fds), numfds)
2872 self.checkFDs(fds)
2873
2874 def testFDPassSimple(self):
2875 # Pass a single FD (array read from bytes object).
2876 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2877 len(MSG), 10240))
2878
2879 def _testFDPassSimple(self):
2880 self.assertEqual(
2881 self.sendmsgToServer(
2882 [MSG],
2883 [(socket.SOL_SOCKET,
2884 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002885 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002886 len(MSG))
2887
2888 def testMultipleFDPass(self):
2889 # Pass multiple FDs in a single array.
2890 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2891 len(MSG), 10240))
2892
2893 def _testMultipleFDPass(self):
2894 self.createAndSendFDs(4)
2895
2896 @requireAttrs(socket, "CMSG_SPACE")
2897 def testFDPassCMSG_SPACE(self):
2898 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2899 self.checkRecvmsgFDs(
2900 4, self.doRecvmsg(self.serv_sock, len(MSG),
2901 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2902
2903 @testFDPassCMSG_SPACE.client_skip
2904 def _testFDPassCMSG_SPACE(self):
2905 self.createAndSendFDs(4)
2906
2907 def testFDPassCMSG_LEN(self):
2908 # Test using CMSG_LEN() to calculate ancillary buffer size.
2909 self.checkRecvmsgFDs(1,
2910 self.doRecvmsg(self.serv_sock, len(MSG),
2911 socket.CMSG_LEN(4 * SIZEOF_INT)),
2912 # RFC 3542 says implementations may set
2913 # MSG_CTRUNC if there isn't enough space
2914 # for trailing padding.
2915 ignoreflags=socket.MSG_CTRUNC)
2916
2917 def _testFDPassCMSG_LEN(self):
2918 self.createAndSendFDs(1)
2919
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002920 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002921 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002922 @requireAttrs(socket, "CMSG_SPACE")
2923 def testFDPassSeparate(self):
2924 # Pass two FDs in two separate arrays. Arrays may be combined
2925 # into a single control message by the OS.
2926 self.checkRecvmsgFDs(2,
2927 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2928 maxcmsgs=2)
2929
2930 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002931 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002932 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002933 def _testFDPassSeparate(self):
2934 fd0, fd1 = self.newFDs(2)
2935 self.assertEqual(
2936 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2937 socket.SCM_RIGHTS,
2938 array.array("i", [fd0])),
2939 (socket.SOL_SOCKET,
2940 socket.SCM_RIGHTS,
2941 array.array("i", [fd1]))]),
2942 len(MSG))
2943
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002944 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002945 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002946 @requireAttrs(socket, "CMSG_SPACE")
2947 def testFDPassSeparateMinSpace(self):
2948 # Pass two FDs in two separate arrays, receiving them into the
2949 # minimum space for two arrays.
2950 self.checkRecvmsgFDs(2,
2951 self.doRecvmsg(self.serv_sock, len(MSG),
2952 socket.CMSG_SPACE(SIZEOF_INT) +
2953 socket.CMSG_LEN(SIZEOF_INT)),
2954 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2955
2956 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002957 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002958 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002959 def _testFDPassSeparateMinSpace(self):
2960 fd0, fd1 = self.newFDs(2)
2961 self.assertEqual(
2962 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2963 socket.SCM_RIGHTS,
2964 array.array("i", [fd0])),
2965 (socket.SOL_SOCKET,
2966 socket.SCM_RIGHTS,
2967 array.array("i", [fd1]))]),
2968 len(MSG))
2969
2970 def sendAncillaryIfPossible(self, msg, ancdata):
2971 # Try to send msg and ancdata to server, but if the system
2972 # call fails, just send msg with no ancillary data.
2973 try:
2974 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002975 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002976 # Check that it was the system call that failed
2977 self.assertIsInstance(e.errno, int)
2978 nbytes = self.sendmsgToServer([msg])
2979 self.assertEqual(nbytes, len(msg))
2980
Brett Cannon3bbad122015-12-28 17:21:44 -08002981 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002982 def testFDPassEmpty(self):
2983 # Try to pass an empty FD array. Can receive either no array
2984 # or an empty array.
2985 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2986 len(MSG), 10240),
2987 ignoreflags=socket.MSG_CTRUNC)
2988
2989 def _testFDPassEmpty(self):
2990 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2991 socket.SCM_RIGHTS,
2992 b"")])
2993
2994 def testFDPassPartialInt(self):
2995 # Try to pass a truncated FD array.
2996 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2997 len(MSG), 10240)
2998 self.assertEqual(msg, MSG)
2999 self.checkRecvmsgAddress(addr, self.cli_addr)
3000 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3001 self.assertLessEqual(len(ancdata), 1)
3002 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3003 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3004 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3005 self.assertLess(len(cmsg_data), SIZEOF_INT)
3006
3007 def _testFDPassPartialInt(self):
3008 self.sendAncillaryIfPossible(
3009 MSG,
3010 [(socket.SOL_SOCKET,
3011 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003012 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003013
3014 @requireAttrs(socket, "CMSG_SPACE")
3015 def testFDPassPartialIntInMiddle(self):
3016 # Try to pass two FD arrays, the first of which is truncated.
3017 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3018 len(MSG), 10240)
3019 self.assertEqual(msg, MSG)
3020 self.checkRecvmsgAddress(addr, self.cli_addr)
3021 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3022 self.assertLessEqual(len(ancdata), 2)
3023 fds = array.array("i")
3024 # Arrays may have been combined in a single control message
3025 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3026 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3027 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003028 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003029 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3030 self.assertLessEqual(len(fds), 2)
3031 self.checkFDs(fds)
3032
3033 @testFDPassPartialIntInMiddle.client_skip
3034 def _testFDPassPartialIntInMiddle(self):
3035 fd0, fd1 = self.newFDs(2)
3036 self.sendAncillaryIfPossible(
3037 MSG,
3038 [(socket.SOL_SOCKET,
3039 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003040 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003041 (socket.SOL_SOCKET,
3042 socket.SCM_RIGHTS,
3043 array.array("i", [fd1]))])
3044
3045 def checkTruncatedHeader(self, result, ignoreflags=0):
3046 # Check that no ancillary data items are returned when data is
3047 # truncated inside the cmsghdr structure.
3048 msg, ancdata, flags, addr = result
3049 self.assertEqual(msg, MSG)
3050 self.checkRecvmsgAddress(addr, self.cli_addr)
3051 self.assertEqual(ancdata, [])
3052 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3053 ignore=ignoreflags)
3054
3055 def testCmsgTruncNoBufSize(self):
3056 # Check that no ancillary data is received when no buffer size
3057 # is specified.
3058 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3059 # BSD seems to set MSG_CTRUNC only
3060 # if an item has been partially
3061 # received.
3062 ignoreflags=socket.MSG_CTRUNC)
3063
3064 def _testCmsgTruncNoBufSize(self):
3065 self.createAndSendFDs(1)
3066
3067 def testCmsgTrunc0(self):
3068 # Check that no ancillary data is received when buffer size is 0.
3069 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3070 ignoreflags=socket.MSG_CTRUNC)
3071
3072 def _testCmsgTrunc0(self):
3073 self.createAndSendFDs(1)
3074
3075 # Check that no ancillary data is returned for various non-zero
3076 # (but still too small) buffer sizes.
3077
3078 def testCmsgTrunc1(self):
3079 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3080
3081 def _testCmsgTrunc1(self):
3082 self.createAndSendFDs(1)
3083
3084 def testCmsgTrunc2Int(self):
3085 # The cmsghdr structure has at least three members, two of
3086 # which are ints, so we still shouldn't see any ancillary
3087 # data.
3088 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3089 SIZEOF_INT * 2))
3090
3091 def _testCmsgTrunc2Int(self):
3092 self.createAndSendFDs(1)
3093
3094 def testCmsgTruncLen0Minus1(self):
3095 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3096 socket.CMSG_LEN(0) - 1))
3097
3098 def _testCmsgTruncLen0Minus1(self):
3099 self.createAndSendFDs(1)
3100
3101 # The following tests try to truncate the control message in the
3102 # middle of the FD array.
3103
3104 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3105 # Check that file descriptor data is truncated to between
3106 # mindata and maxdata bytes when received with buffer size
3107 # ancbuf, and that any complete file descriptor numbers are
3108 # valid.
3109 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3110 len(MSG), ancbuf)
3111 self.assertEqual(msg, MSG)
3112 self.checkRecvmsgAddress(addr, self.cli_addr)
3113 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3114
3115 if mindata == 0 and ancdata == []:
3116 return
3117 self.assertEqual(len(ancdata), 1)
3118 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3119 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3120 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3121 self.assertGreaterEqual(len(cmsg_data), mindata)
3122 self.assertLessEqual(len(cmsg_data), maxdata)
3123 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003124 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003125 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3126 self.checkFDs(fds)
3127
3128 def testCmsgTruncLen0(self):
3129 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3130
3131 def _testCmsgTruncLen0(self):
3132 self.createAndSendFDs(1)
3133
3134 def testCmsgTruncLen0Plus1(self):
3135 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3136
3137 def _testCmsgTruncLen0Plus1(self):
3138 self.createAndSendFDs(2)
3139
3140 def testCmsgTruncLen1(self):
3141 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3142 maxdata=SIZEOF_INT)
3143
3144 def _testCmsgTruncLen1(self):
3145 self.createAndSendFDs(2)
3146
3147 def testCmsgTruncLen2Minus1(self):
3148 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3149 maxdata=(2 * SIZEOF_INT) - 1)
3150
3151 def _testCmsgTruncLen2Minus1(self):
3152 self.createAndSendFDs(2)
3153
3154
3155class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3156 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3157 # features of the RFC 3542 Advanced Sockets API for IPv6.
3158 # Currently we can only handle certain data items (e.g. traffic
3159 # class, hop limit, MTU discovery and fragmentation settings)
3160 # without resorting to unportable means such as the struct module,
3161 # but the tests here are aimed at testing the ancillary data
3162 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3163 # itself.
3164
3165 # Test value to use when setting hop limit of packet
3166 hop_limit = 2
3167
3168 # Test value to use when setting traffic class of packet.
3169 # -1 means "use kernel default".
3170 traffic_class = -1
3171
3172 def ancillaryMapping(self, ancdata):
3173 # Given ancillary data list ancdata, return a mapping from
3174 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3175 # Check that no (level, type) pair appears more than once.
3176 d = {}
3177 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3178 self.assertNotIn((cmsg_level, cmsg_type), d)
3179 d[(cmsg_level, cmsg_type)] = cmsg_data
3180 return d
3181
3182 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3183 # Receive hop limit into ancbufsize bytes of ancillary data
3184 # space. Check that data is MSG, ancillary data is not
3185 # truncated (but ignore any flags in ignoreflags), and hop
3186 # limit is between 0 and maxhop inclusive.
3187 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3188 socket.IPV6_RECVHOPLIMIT, 1)
3189 self.misc_event.set()
3190 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3191 len(MSG), ancbufsize)
3192
3193 self.assertEqual(msg, MSG)
3194 self.checkRecvmsgAddress(addr, self.cli_addr)
3195 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3196 ignore=ignoreflags)
3197
3198 self.assertEqual(len(ancdata), 1)
3199 self.assertIsInstance(ancdata[0], tuple)
3200 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3201 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3202 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3203 self.assertIsInstance(cmsg_data, bytes)
3204 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3205 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003206 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003207 self.assertGreaterEqual(a[0], 0)
3208 self.assertLessEqual(a[0], maxhop)
3209
3210 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3211 def testRecvHopLimit(self):
3212 # Test receiving the packet hop limit as ancillary data.
3213 self.checkHopLimit(ancbufsize=10240)
3214
3215 @testRecvHopLimit.client_skip
3216 def _testRecvHopLimit(self):
3217 # Need to wait until server has asked to receive ancillary
3218 # data, as implementations are not required to buffer it
3219 # otherwise.
3220 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3221 self.sendToServer(MSG)
3222
3223 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3224 def testRecvHopLimitCMSG_SPACE(self):
3225 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3226 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3227
3228 @testRecvHopLimitCMSG_SPACE.client_skip
3229 def _testRecvHopLimitCMSG_SPACE(self):
3230 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3231 self.sendToServer(MSG)
3232
3233 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3234 # 3542 says portable applications must provide space for trailing
3235 # padding. Implementations may set MSG_CTRUNC if there isn't
3236 # enough space for the padding.
3237
3238 @requireAttrs(socket.socket, "sendmsg")
3239 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3240 def testSetHopLimit(self):
3241 # Test setting hop limit on outgoing packet and receiving it
3242 # at the other end.
3243 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3244
3245 @testSetHopLimit.client_skip
3246 def _testSetHopLimit(self):
3247 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3248 self.assertEqual(
3249 self.sendmsgToServer([MSG],
3250 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3251 array.array("i", [self.hop_limit]))]),
3252 len(MSG))
3253
3254 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3255 ignoreflags=0):
3256 # Receive traffic class and hop limit into ancbufsize bytes of
3257 # ancillary data space. Check that data is MSG, ancillary
3258 # data is not truncated (but ignore any flags in ignoreflags),
3259 # and traffic class and hop limit are in range (hop limit no
3260 # more than maxhop).
3261 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3262 socket.IPV6_RECVHOPLIMIT, 1)
3263 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3264 socket.IPV6_RECVTCLASS, 1)
3265 self.misc_event.set()
3266 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3267 len(MSG), ancbufsize)
3268
3269 self.assertEqual(msg, MSG)
3270 self.checkRecvmsgAddress(addr, self.cli_addr)
3271 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3272 ignore=ignoreflags)
3273 self.assertEqual(len(ancdata), 2)
3274 ancmap = self.ancillaryMapping(ancdata)
3275
3276 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3277 self.assertEqual(len(tcdata), SIZEOF_INT)
3278 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003279 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003280 self.assertGreaterEqual(a[0], 0)
3281 self.assertLessEqual(a[0], 255)
3282
3283 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3284 self.assertEqual(len(hldata), SIZEOF_INT)
3285 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003286 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003287 self.assertGreaterEqual(a[0], 0)
3288 self.assertLessEqual(a[0], maxhop)
3289
3290 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3291 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3292 def testRecvTrafficClassAndHopLimit(self):
3293 # Test receiving traffic class and hop limit as ancillary data.
3294 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3295
3296 @testRecvTrafficClassAndHopLimit.client_skip
3297 def _testRecvTrafficClassAndHopLimit(self):
3298 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3299 self.sendToServer(MSG)
3300
3301 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3302 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3303 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3304 # Test receiving traffic class and hop limit, using
3305 # CMSG_SPACE() to calculate buffer size.
3306 self.checkTrafficClassAndHopLimit(
3307 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3308
3309 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3310 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3311 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3312 self.sendToServer(MSG)
3313
3314 @requireAttrs(socket.socket, "sendmsg")
3315 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3316 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3317 def testSetTrafficClassAndHopLimit(self):
3318 # Test setting traffic class and hop limit on outgoing packet,
3319 # and receiving them at the other end.
3320 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3321 maxhop=self.hop_limit)
3322
3323 @testSetTrafficClassAndHopLimit.client_skip
3324 def _testSetTrafficClassAndHopLimit(self):
3325 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3326 self.assertEqual(
3327 self.sendmsgToServer([MSG],
3328 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3329 array.array("i", [self.traffic_class])),
3330 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3331 array.array("i", [self.hop_limit]))]),
3332 len(MSG))
3333
3334 @requireAttrs(socket.socket, "sendmsg")
3335 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3336 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3337 def testOddCmsgSize(self):
3338 # Try to send ancillary data with first item one byte too
3339 # long. Fall back to sending with correct size if this fails,
3340 # and check that second item was handled correctly.
3341 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3342 maxhop=self.hop_limit)
3343
3344 @testOddCmsgSize.client_skip
3345 def _testOddCmsgSize(self):
3346 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3347 try:
3348 nbytes = self.sendmsgToServer(
3349 [MSG],
3350 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003351 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003352 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3353 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003354 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003355 self.assertIsInstance(e.errno, int)
3356 nbytes = self.sendmsgToServer(
3357 [MSG],
3358 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3359 array.array("i", [self.traffic_class])),
3360 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3361 array.array("i", [self.hop_limit]))])
3362 self.assertEqual(nbytes, len(MSG))
3363
3364 # Tests for proper handling of truncated ancillary data
3365
3366 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3367 # Receive hop limit into ancbufsize bytes of ancillary data
3368 # space, which should be too small to contain the ancillary
3369 # data header (if ancbufsize is None, pass no second argument
3370 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3371 # (unless included in ignoreflags), and no ancillary data is
3372 # returned.
3373 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3374 socket.IPV6_RECVHOPLIMIT, 1)
3375 self.misc_event.set()
3376 args = () if ancbufsize is None else (ancbufsize,)
3377 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3378 len(MSG), *args)
3379
3380 self.assertEqual(msg, MSG)
3381 self.checkRecvmsgAddress(addr, self.cli_addr)
3382 self.assertEqual(ancdata, [])
3383 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3384 ignore=ignoreflags)
3385
3386 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3387 def testCmsgTruncNoBufSize(self):
3388 # Check that no ancillary data is received when no ancillary
3389 # buffer size is provided.
3390 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3391 # BSD seems to set
3392 # MSG_CTRUNC only if an item
3393 # has been partially
3394 # received.
3395 ignoreflags=socket.MSG_CTRUNC)
3396
3397 @testCmsgTruncNoBufSize.client_skip
3398 def _testCmsgTruncNoBufSize(self):
3399 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3400 self.sendToServer(MSG)
3401
3402 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3403 def testSingleCmsgTrunc0(self):
3404 # Check that no ancillary data is received when ancillary
3405 # buffer size is zero.
3406 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3407 ignoreflags=socket.MSG_CTRUNC)
3408
3409 @testSingleCmsgTrunc0.client_skip
3410 def _testSingleCmsgTrunc0(self):
3411 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3412 self.sendToServer(MSG)
3413
3414 # Check that no ancillary data is returned for various non-zero
3415 # (but still too small) buffer sizes.
3416
3417 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3418 def testSingleCmsgTrunc1(self):
3419 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3420
3421 @testSingleCmsgTrunc1.client_skip
3422 def _testSingleCmsgTrunc1(self):
3423 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3424 self.sendToServer(MSG)
3425
3426 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3427 def testSingleCmsgTrunc2Int(self):
3428 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3429
3430 @testSingleCmsgTrunc2Int.client_skip
3431 def _testSingleCmsgTrunc2Int(self):
3432 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3433 self.sendToServer(MSG)
3434
3435 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3436 def testSingleCmsgTruncLen0Minus1(self):
3437 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3438
3439 @testSingleCmsgTruncLen0Minus1.client_skip
3440 def _testSingleCmsgTruncLen0Minus1(self):
3441 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3442 self.sendToServer(MSG)
3443
3444 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3445 def testSingleCmsgTruncInData(self):
3446 # Test truncation of a control message inside its associated
3447 # data. The message may be returned with its data truncated,
3448 # or not returned at all.
3449 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3450 socket.IPV6_RECVHOPLIMIT, 1)
3451 self.misc_event.set()
3452 msg, ancdata, flags, addr = self.doRecvmsg(
3453 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3454
3455 self.assertEqual(msg, MSG)
3456 self.checkRecvmsgAddress(addr, self.cli_addr)
3457 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3458
3459 self.assertLessEqual(len(ancdata), 1)
3460 if ancdata:
3461 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3462 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3463 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3464 self.assertLess(len(cmsg_data), SIZEOF_INT)
3465
3466 @testSingleCmsgTruncInData.client_skip
3467 def _testSingleCmsgTruncInData(self):
3468 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3469 self.sendToServer(MSG)
3470
3471 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3472 # Receive traffic class and hop limit into ancbufsize bytes of
3473 # ancillary data space, which should be large enough to
3474 # contain the first item, but too small to contain the header
3475 # of the second. Check that data is MSG, MSG_CTRUNC is set
3476 # (unless included in ignoreflags), and only one ancillary
3477 # data item is returned.
3478 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3479 socket.IPV6_RECVHOPLIMIT, 1)
3480 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3481 socket.IPV6_RECVTCLASS, 1)
3482 self.misc_event.set()
3483 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3484 len(MSG), ancbufsize)
3485
3486 self.assertEqual(msg, MSG)
3487 self.checkRecvmsgAddress(addr, self.cli_addr)
3488 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3489 ignore=ignoreflags)
3490
3491 self.assertEqual(len(ancdata), 1)
3492 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3493 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3494 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3495 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3496 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003497 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003498 self.assertGreaterEqual(a[0], 0)
3499 self.assertLessEqual(a[0], 255)
3500
3501 # Try the above test with various buffer sizes.
3502
3503 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3504 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3505 def testSecondCmsgTrunc0(self):
3506 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3507 ignoreflags=socket.MSG_CTRUNC)
3508
3509 @testSecondCmsgTrunc0.client_skip
3510 def _testSecondCmsgTrunc0(self):
3511 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3512 self.sendToServer(MSG)
3513
3514 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3515 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3516 def testSecondCmsgTrunc1(self):
3517 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3518
3519 @testSecondCmsgTrunc1.client_skip
3520 def _testSecondCmsgTrunc1(self):
3521 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3522 self.sendToServer(MSG)
3523
3524 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3525 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3526 def testSecondCmsgTrunc2Int(self):
3527 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3528 2 * SIZEOF_INT)
3529
3530 @testSecondCmsgTrunc2Int.client_skip
3531 def _testSecondCmsgTrunc2Int(self):
3532 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3533 self.sendToServer(MSG)
3534
3535 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3536 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3537 def testSecondCmsgTruncLen0Minus1(self):
3538 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3539 socket.CMSG_LEN(0) - 1)
3540
3541 @testSecondCmsgTruncLen0Minus1.client_skip
3542 def _testSecondCmsgTruncLen0Minus1(self):
3543 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3544 self.sendToServer(MSG)
3545
3546 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3547 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3548 def testSecomdCmsgTruncInData(self):
3549 # Test truncation of the second of two control messages inside
3550 # its associated data.
3551 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3552 socket.IPV6_RECVHOPLIMIT, 1)
3553 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3554 socket.IPV6_RECVTCLASS, 1)
3555 self.misc_event.set()
3556 msg, ancdata, flags, addr = self.doRecvmsg(
3557 self.serv_sock, len(MSG),
3558 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3559
3560 self.assertEqual(msg, MSG)
3561 self.checkRecvmsgAddress(addr, self.cli_addr)
3562 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3563
3564 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3565
3566 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3567 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3568 cmsg_types.remove(cmsg_type)
3569 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3570 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003571 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003572 self.assertGreaterEqual(a[0], 0)
3573 self.assertLessEqual(a[0], 255)
3574
3575 if ancdata:
3576 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3577 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3578 cmsg_types.remove(cmsg_type)
3579 self.assertLess(len(cmsg_data), SIZEOF_INT)
3580
3581 self.assertEqual(ancdata, [])
3582
3583 @testSecomdCmsgTruncInData.client_skip
3584 def _testSecomdCmsgTruncInData(self):
3585 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3586 self.sendToServer(MSG)
3587
3588
3589# Derive concrete test classes for different socket types.
3590
3591class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3592 SendrecvmsgConnectionlessBase,
3593 ThreadedSocketTestMixin, UDPTestBase):
3594 pass
3595
3596@requireAttrs(socket.socket, "sendmsg")
3597@unittest.skipUnless(thread, 'Threading required for this test.')
3598class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3599 pass
3600
3601@requireAttrs(socket.socket, "recvmsg")
3602@unittest.skipUnless(thread, 'Threading required for this test.')
3603class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3604 pass
3605
3606@requireAttrs(socket.socket, "recvmsg_into")
3607@unittest.skipUnless(thread, 'Threading required for this test.')
3608class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3609 pass
3610
3611
3612class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3613 SendrecvmsgConnectionlessBase,
3614 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003615
3616 def checkRecvmsgAddress(self, addr1, addr2):
3617 # Called to compare the received address with the address of
3618 # the peer, ignoring scope ID
3619 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003620
3621@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003622@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003623@requireSocket("AF_INET6", "SOCK_DGRAM")
3624@unittest.skipUnless(thread, 'Threading required for this test.')
3625class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3626 pass
3627
3628@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003629@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003630@requireSocket("AF_INET6", "SOCK_DGRAM")
3631@unittest.skipUnless(thread, 'Threading required for this test.')
3632class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3633 pass
3634
3635@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003636@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003637@requireSocket("AF_INET6", "SOCK_DGRAM")
3638@unittest.skipUnless(thread, 'Threading required for this test.')
3639class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3640 pass
3641
3642@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003643@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003644@requireAttrs(socket, "IPPROTO_IPV6")
3645@requireSocket("AF_INET6", "SOCK_DGRAM")
3646@unittest.skipUnless(thread, 'Threading required for this test.')
3647class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3648 SendrecvmsgUDP6TestBase):
3649 pass
3650
3651@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003652@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003653@requireAttrs(socket, "IPPROTO_IPV6")
3654@requireSocket("AF_INET6", "SOCK_DGRAM")
3655@unittest.skipUnless(thread, 'Threading required for this test.')
3656class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3657 RFC3542AncillaryTest,
3658 SendrecvmsgUDP6TestBase):
3659 pass
3660
3661
3662class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3663 ConnectedStreamTestMixin, TCPTestBase):
3664 pass
3665
3666@requireAttrs(socket.socket, "sendmsg")
3667@unittest.skipUnless(thread, 'Threading required for this test.')
3668class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3669 pass
3670
3671@requireAttrs(socket.socket, "recvmsg")
3672@unittest.skipUnless(thread, 'Threading required for this test.')
3673class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3674 SendrecvmsgTCPTestBase):
3675 pass
3676
3677@requireAttrs(socket.socket, "recvmsg_into")
3678@unittest.skipUnless(thread, 'Threading required for this test.')
3679class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3680 SendrecvmsgTCPTestBase):
3681 pass
3682
3683
3684class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3685 SendrecvmsgConnectedBase,
3686 ConnectedStreamTestMixin, SCTPStreamBase):
3687 pass
3688
3689@requireAttrs(socket.socket, "sendmsg")
3690@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3691@unittest.skipUnless(thread, 'Threading required for this test.')
3692class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3693 pass
3694
3695@requireAttrs(socket.socket, "recvmsg")
3696@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3697@unittest.skipUnless(thread, 'Threading required for this test.')
3698class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3699 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003700
3701 def testRecvmsgEOF(self):
3702 try:
3703 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3704 except OSError as e:
3705 if e.errno != errno.ENOTCONN:
3706 raise
3707 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003708
3709@requireAttrs(socket.socket, "recvmsg_into")
3710@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3711@unittest.skipUnless(thread, 'Threading required for this test.')
3712class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3713 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003714
3715 def testRecvmsgEOF(self):
3716 try:
3717 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3718 except OSError as e:
3719 if e.errno != errno.ENOTCONN:
3720 raise
3721 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003722
3723
3724class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3725 ConnectedStreamTestMixin, UnixStreamBase):
3726 pass
3727
3728@requireAttrs(socket.socket, "sendmsg")
3729@requireAttrs(socket, "AF_UNIX")
3730@unittest.skipUnless(thread, 'Threading required for this test.')
3731class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3732 pass
3733
3734@requireAttrs(socket.socket, "recvmsg")
3735@requireAttrs(socket, "AF_UNIX")
3736@unittest.skipUnless(thread, 'Threading required for this test.')
3737class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3738 SendrecvmsgUnixStreamTestBase):
3739 pass
3740
3741@requireAttrs(socket.socket, "recvmsg_into")
3742@requireAttrs(socket, "AF_UNIX")
3743@unittest.skipUnless(thread, 'Threading required for this test.')
3744class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3745 SendrecvmsgUnixStreamTestBase):
3746 pass
3747
3748@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3749@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3750@unittest.skipUnless(thread, 'Threading required for this test.')
3751class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3752 pass
3753
3754@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3755@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3756@unittest.skipUnless(thread, 'Threading required for this test.')
3757class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3758 SendrecvmsgUnixStreamTestBase):
3759 pass
3760
3761
3762# Test interrupting the interruptible send/receive methods with a
3763# signal when a timeout is set. These tests avoid having multiple
3764# threads alive during the test so that the OS cannot deliver the
3765# signal to the wrong one.
3766
3767class InterruptedTimeoutBase(unittest.TestCase):
3768 # Base class for interrupted send/receive tests. Installs an
3769 # empty handler for SIGALRM and removes it on teardown, along with
3770 # any scheduled alarms.
3771
3772 def setUp(self):
3773 super().setUp()
3774 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003775 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003776 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3777 self.addCleanup(self.setAlarm, 0)
3778
3779 # Timeout for socket operations
3780 timeout = 4.0
3781
3782 # Provide setAlarm() method to schedule delivery of SIGALRM after
3783 # given number of seconds, or cancel it if zero, and an
3784 # appropriate time value to use. Use setitimer() if available.
3785 if hasattr(signal, "setitimer"):
3786 alarm_time = 0.05
3787
3788 def setAlarm(self, seconds):
3789 signal.setitimer(signal.ITIMER_REAL, seconds)
3790 else:
3791 # Old systems may deliver the alarm up to one second early
3792 alarm_time = 2
3793
3794 def setAlarm(self, seconds):
3795 signal.alarm(seconds)
3796
3797
3798# Require siginterrupt() in order to ensure that system calls are
3799# interrupted by default.
3800@requireAttrs(signal, "siginterrupt")
3801@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3802 "Don't have signal.alarm or signal.setitimer")
3803class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3804 # Test interrupting the recv*() methods with signals when a
3805 # timeout is set.
3806
3807 def setUp(self):
3808 super().setUp()
3809 self.serv.settimeout(self.timeout)
3810
3811 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003812 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003813 # errno of EINTR when interrupted by a signal.
3814 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003815 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003816 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003817
3818 def testInterruptedRecvTimeout(self):
3819 self.checkInterruptedRecv(self.serv.recv, 1024)
3820
3821 def testInterruptedRecvIntoTimeout(self):
3822 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3823
3824 def testInterruptedRecvfromTimeout(self):
3825 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3826
3827 def testInterruptedRecvfromIntoTimeout(self):
3828 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3829
3830 @requireAttrs(socket.socket, "recvmsg")
3831 def testInterruptedRecvmsgTimeout(self):
3832 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3833
3834 @requireAttrs(socket.socket, "recvmsg_into")
3835 def testInterruptedRecvmsgIntoTimeout(self):
3836 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3837
3838
3839# Require siginterrupt() in order to ensure that system calls are
3840# interrupted by default.
3841@requireAttrs(signal, "siginterrupt")
3842@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3843 "Don't have signal.alarm or signal.setitimer")
3844@unittest.skipUnless(thread, 'Threading required for this test.')
3845class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3846 ThreadSafeCleanupTestCase,
3847 SocketListeningTestMixin, TCPTestBase):
3848 # Test interrupting the interruptible send*() methods with signals
3849 # when a timeout is set.
3850
3851 def setUp(self):
3852 super().setUp()
3853 self.serv_conn = self.newSocket()
3854 self.addCleanup(self.serv_conn.close)
3855 # Use a thread to complete the connection, but wait for it to
3856 # terminate before running the test, so that there is only one
3857 # thread to accept the signal.
3858 cli_thread = threading.Thread(target=self.doConnect)
3859 cli_thread.start()
3860 self.cli_conn, addr = self.serv.accept()
3861 self.addCleanup(self.cli_conn.close)
3862 cli_thread.join()
3863 self.serv_conn.settimeout(self.timeout)
3864
3865 def doConnect(self):
3866 self.serv_conn.connect(self.serv_addr)
3867
3868 def checkInterruptedSend(self, func, *args, **kwargs):
3869 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003870 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003871 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003872 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003873 while True:
3874 self.setAlarm(self.alarm_time)
3875 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003876
Ned Deilyc5640382014-02-03 13:58:31 -08003877 # Issue #12958: The following tests have problems on OS X prior to 10.7
3878 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003879 def testInterruptedSendTimeout(self):
3880 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3881
Ned Deilyc5640382014-02-03 13:58:31 -08003882 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003883 def testInterruptedSendtoTimeout(self):
3884 # Passing an actual address here as Python's wrapper for
3885 # sendto() doesn't allow passing a zero-length one; POSIX
3886 # requires that the address is ignored since the socket is
3887 # connection-mode, however.
3888 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3889 self.serv_addr)
3890
Ned Deilyc5640382014-02-03 13:58:31 -08003891 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003892 @requireAttrs(socket.socket, "sendmsg")
3893 def testInterruptedSendmsgTimeout(self):
3894 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3895
3896
Victor Stinner45df8202010-04-28 22:31:17 +00003897@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003898class TCPCloserTest(ThreadedTCPSocketTest):
3899
3900 def testClose(self):
3901 conn, addr = self.serv.accept()
3902 conn.close()
3903
3904 sd = self.cli
3905 read, write, err = select.select([sd], [], [], 1.0)
3906 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003907 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003908
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003909 # Calling close() many times should be safe.
3910 conn.close()
3911 conn.close()
3912
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003913 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003914 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003915 time.sleep(1.0)
3916
Victor Stinner45df8202010-04-28 22:31:17 +00003917@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003918class BasicSocketPairTest(SocketPairTest):
3919
3920 def __init__(self, methodName='runTest'):
3921 SocketPairTest.__init__(self, methodName=methodName)
3922
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003923 def _check_defaults(self, sock):
3924 self.assertIsInstance(sock, socket.socket)
3925 if hasattr(socket, 'AF_UNIX'):
3926 self.assertEqual(sock.family, socket.AF_UNIX)
3927 else:
3928 self.assertEqual(sock.family, socket.AF_INET)
3929 self.assertEqual(sock.type, socket.SOCK_STREAM)
3930 self.assertEqual(sock.proto, 0)
3931
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003932 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003933 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003934
3935 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003936 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003937
Dave Cole331708b2004-08-09 04:51:41 +00003938 def testRecv(self):
3939 msg = self.serv.recv(1024)
3940 self.assertEqual(msg, MSG)
3941
3942 def _testRecv(self):
3943 self.cli.send(MSG)
3944
3945 def testSend(self):
3946 self.serv.send(MSG)
3947
3948 def _testSend(self):
3949 msg = self.cli.recv(1024)
3950 self.assertEqual(msg, MSG)
3951
Victor Stinner45df8202010-04-28 22:31:17 +00003952@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003953class NonBlockingTCPTests(ThreadedTCPSocketTest):
3954
3955 def __init__(self, methodName='runTest'):
3956 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3957
3958 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003959 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003960 self.serv.setblocking(True)
3961 self.assertIsNone(self.serv.gettimeout())
3962 self.serv.setblocking(False)
3963 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003964 start = time.time()
3965 try:
3966 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003967 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003968 pass
3969 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003970 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003971
3972 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003973 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003974
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003975 @support.cpython_only
3976 def testSetBlocking_overflow(self):
3977 # Issue 15989
3978 import _testcapi
3979 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3980 self.skipTest('needs UINT_MAX < ULONG_MAX')
3981 self.serv.setblocking(False)
3982 self.assertEqual(self.serv.gettimeout(), 0.0)
3983 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3984 self.assertIsNone(self.serv.gettimeout())
3985
3986 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3987
Serhiy Storchaka43767632013-11-03 21:31:38 +02003988 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3989 'test needs socket.SOCK_NONBLOCK')
3990 @support.requires_linux_version(2, 6, 28)
3991 def testInitNonBlocking(self):
3992 # reinit server socket
3993 self.serv.close()
3994 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3995 socket.SOCK_NONBLOCK)
3996 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003997 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003998 # actual testing
3999 start = time.time()
4000 try:
4001 self.serv.accept()
4002 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00004003 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02004004 end = time.time()
4005 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
4006
4007 def _testInitNonBlocking(self):
4008 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004009
Antoine Pitrou600232b2011-01-05 21:03:42 +00004010 def testInheritFlags(self):
4011 # Issue #7995: when calling accept() on a listening socket with a
4012 # timeout, the resulting socket should not be non-blocking.
4013 self.serv.settimeout(10)
4014 try:
4015 conn, addr = self.serv.accept()
4016 message = conn.recv(len(MSG))
4017 finally:
4018 conn.close()
4019 self.serv.settimeout(None)
4020
4021 def _testInheritFlags(self):
4022 time.sleep(0.1)
4023 self.cli.connect((HOST, self.port))
4024 time.sleep(0.5)
4025 self.cli.send(MSG)
4026
Guido van Rossum24e4af82002-06-12 19:18:08 +00004027 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004028 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004029 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00004030 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004031 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004032 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004033 pass
4034 else:
4035 self.fail("Error trying to do non-blocking accept.")
4036 read, write, err = select.select([self.serv], [], [])
4037 if self.serv in read:
4038 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07004039 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00004040 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004041 else:
4042 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004043
Guido van Rossum24e4af82002-06-12 19:18:08 +00004044 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004045 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00004046 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004047
4048 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004049 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00004050 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004051 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004052
4053 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00004054 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00004055 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004056
4057 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004058 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004059 conn, addr = self.serv.accept()
4060 conn.setblocking(0)
4061 try:
4062 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02004063 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004064 pass
4065 else:
4066 self.fail("Error trying to do non-blocking recv.")
4067 read, write, err = select.select([conn], [], [])
4068 if conn in read:
4069 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004070 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00004071 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004072 else:
4073 self.fail("Error during select call to non-blocking socket.")
4074
4075 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004076 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004077 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004078 self.cli.send(MSG)
4079
Victor Stinner45df8202010-04-28 22:31:17 +00004080@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00004081class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004082 """Unit tests for the object returned by socket.makefile()
4083
Antoine Pitrou834bd812010-10-13 16:17:14 +00004084 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004085 the client connection. You can read from this file to
4086 get output from the server.
4087
Antoine Pitrou834bd812010-10-13 16:17:14 +00004088 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004089 server connection. You can write to this file to send output
4090 to the client.
4091 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004092
Guido van Rossume9f66142002-08-07 15:46:19 +00004093 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004094 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004095 errors = 'strict'
4096 newline = None
4097
4098 read_mode = 'rb'
4099 read_msg = MSG
4100 write_mode = 'wb'
4101 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004102
Guido van Rossum24e4af82002-06-12 19:18:08 +00004103 def __init__(self, methodName='runTest'):
4104 SocketConnectedTest.__init__(self, methodName=methodName)
4105
4106 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004107 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4108 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004109 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004110 self.read_file = self.cli_conn.makefile(
4111 self.read_mode, self.bufsize,
4112 encoding = self.encoding,
4113 errors = self.errors,
4114 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004115
4116 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004117 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004118 self.read_file.close()
4119 self.assertTrue(self.read_file.closed)
4120 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004121 SocketConnectedTest.tearDown(self)
4122
4123 def clientSetUp(self):
4124 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004125 self.write_file = self.serv_conn.makefile(
4126 self.write_mode, self.bufsize,
4127 encoding = self.encoding,
4128 errors = self.errors,
4129 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004130
4131 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004132 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004133 self.write_file.close()
4134 self.assertTrue(self.write_file.closed)
4135 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004136 SocketConnectedTest.clientTearDown(self)
4137
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004138 def testReadAfterTimeout(self):
4139 # Issue #7322: A file object must disallow further reads
4140 # after a timeout has occurred.
4141 self.cli_conn.settimeout(1)
4142 self.read_file.read(3)
4143 # First read raises a timeout
4144 self.assertRaises(socket.timeout, self.read_file.read, 1)
4145 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004146 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004147 self.read_file.read(1)
4148 self.assertIn("cannot read from timed out object", str(ctx.exception))
4149
4150 def _testReadAfterTimeout(self):
4151 self.write_file.write(self.write_msg[0:3])
4152 self.write_file.flush()
4153 self.serv_finished.wait()
4154
Guido van Rossum24e4af82002-06-12 19:18:08 +00004155 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004156 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004157 first_seg = self.read_file.read(len(self.read_msg)-3)
4158 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004159 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004160 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004161
4162 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004163 self.write_file.write(self.write_msg)
4164 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004165
Guido van Rossum8c943832002-08-08 01:00:28 +00004166 def testFullRead(self):
4167 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004168 msg = self.read_file.read()
4169 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004170
4171 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004172 self.write_file.write(self.write_msg)
4173 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004174
Guido van Rossum24e4af82002-06-12 19:18:08 +00004175 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004176 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004177 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004178 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004179 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004180 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004181 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004182 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004183 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004184
4185 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004186 self.write_file.write(self.write_msg)
4187 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004188
4189 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004190 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004191 line = self.read_file.readline()
4192 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004193
4194 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004195 self.write_file.write(self.write_msg)
4196 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004197
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004198 def testCloseAfterMakefile(self):
4199 # The file returned by makefile should keep the socket open.
4200 self.cli_conn.close()
4201 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004202 msg = self.read_file.read()
4203 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004204
4205 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004206 self.write_file.write(self.write_msg)
4207 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004208
4209 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004210 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004211 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004212 if isinstance(self.read_msg, str):
4213 msg = msg.decode()
4214 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004215
4216 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004217 self.write_file.write(self.write_msg)
4218 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004219
Tim Peters116d83c2004-03-28 02:20:45 +00004220 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004221 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004222
4223 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004224 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004225
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004226 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004227 self.assertEqual(self.read_file.mode, self.read_mode)
4228 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004229
4230 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004231 self.assertEqual(self.write_file.mode, self.write_mode)
4232 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004233
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004234 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004235 self.read_file.close()
4236 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004237 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004238 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004239
4240 def _testRealClose(self):
4241 pass
4242
4243
Guido van Rossume9f66142002-08-07 15:46:19 +00004244class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4245
4246 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004247
Guido van Rossume9f66142002-08-07 15:46:19 +00004248 In this case (and in this case only), it should be possible to
4249 create a file object, read a line from it, create another file
4250 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004251 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004252 when reading multiple requests from the same socket."""
4253
4254 bufsize = 0 # Use unbuffered mode
4255
4256 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004257 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004258 line = self.read_file.readline() # first line
4259 self.assertEqual(line, b"A. " + self.write_msg) # first line
4260 self.read_file = self.cli_conn.makefile('rb', 0)
4261 line = self.read_file.readline() # second line
4262 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004263
4264 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004265 self.write_file.write(b"A. " + self.write_msg)
4266 self.write_file.write(b"B. " + self.write_msg)
4267 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004268
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004269 def testMakefileClose(self):
4270 # The file returned by makefile should keep the socket open...
4271 self.cli_conn.close()
4272 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004273 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004274 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004275 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004276 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004277
4278 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004279 self.write_file.write(self.write_msg)
4280 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004281
4282 def testMakefileCloseSocketDestroy(self):
4283 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004284 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004285 refcount_after = sys.getrefcount(self.cli_conn)
4286 self.assertEqual(refcount_before - 1, refcount_after)
4287
4288 def _testMakefileCloseSocketDestroy(self):
4289 pass
4290
Antoine Pitrou98b46702010-09-18 22:59:00 +00004291 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004292 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004293 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4294
4295 def testSmallReadNonBlocking(self):
4296 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004297 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4298 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004299 self.evt1.set()
4300 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004301 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004302 if first_seg is None:
4303 # Data not arrived (can happen under Windows), wait a bit
4304 time.sleep(0.5)
4305 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004306 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004307 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004308 self.assertEqual(n, 3)
4309 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004310 self.assertEqual(msg, self.read_msg)
4311 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4312 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004313
4314 def _testSmallReadNonBlocking(self):
4315 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004316 self.write_file.write(self.write_msg)
4317 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004318 self.evt2.set()
4319 # Avoid cloding the socket before the server test has finished,
4320 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4321 self.serv_finished.wait(5.0)
4322
4323 def testWriteNonBlocking(self):
4324 self.cli_finished.wait(5.0)
4325 # The client thread can't skip directly - the SkipTest exception
4326 # would appear as a failure.
4327 if self.serv_skipped:
4328 self.skipTest(self.serv_skipped)
4329
4330 def _testWriteNonBlocking(self):
4331 self.serv_skipped = None
4332 self.serv_conn.setblocking(False)
4333 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004334 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004335 LIMIT = 10
4336 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004337 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004338 self.assertGreater(n, 0)
4339 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004340 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004341 if n is None:
4342 # Succeeded
4343 break
4344 self.assertGreater(n, 0)
4345 else:
4346 # Let us know that this test didn't manage to establish
4347 # the expected conditions. This is not a failure in itself but,
4348 # if it happens repeatedly, the test should be fixed.
4349 self.serv_skipped = "failed to saturate the socket buffer"
4350
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004351
Guido van Rossum8c943832002-08-08 01:00:28 +00004352class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4353
4354 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4355
4356
4357class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4358
4359 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004360
Thomas Woutersb2137042007-02-01 18:02:27 +00004361
Antoine Pitrou834bd812010-10-13 16:17:14 +00004362class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4363 """Tests for socket.makefile() in text mode (rather than binary)"""
4364
4365 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004366 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004367 write_mode = 'wb'
4368 write_msg = MSG
4369 newline = ''
4370
4371
4372class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4373 """Tests for socket.makefile() in text mode (rather than binary)"""
4374
4375 read_mode = 'rb'
4376 read_msg = MSG
4377 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004378 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004379 newline = ''
4380
4381
4382class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4383 """Tests for socket.makefile() in text mode (rather than binary)"""
4384
4385 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004386 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004387 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004388 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004389 newline = ''
4390
4391
Guido van Rossumd8faa362007-04-27 19:54:29 +00004392class NetworkConnectionTest(object):
4393 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004394
Guido van Rossumd8faa362007-04-27 19:54:29 +00004395 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004396 # We're inherited below by BasicTCPTest2, which also inherits
4397 # BasicTCPTest, which defines self.port referenced below.
4398 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004399 self.serv_conn = self.cli
4400
4401class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4402 """Tests that NetworkConnection does not break existing TCP functionality.
4403 """
4404
4405class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004406
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004407 class MockSocket(socket.socket):
4408 def connect(self, *args):
4409 raise socket.timeout('timed out')
4410
4411 @contextlib.contextmanager
4412 def mocked_socket_module(self):
4413 """Return a socket which times out on connect"""
4414 old_socket = socket.socket
4415 socket.socket = self.MockSocket
4416 try:
4417 yield
4418 finally:
4419 socket.socket = old_socket
4420
4421 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004422 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004423 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004424 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004425 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004426 cli.connect((HOST, port))
4427 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4428
4429 def test_create_connection(self):
4430 # Issue #9792: errors raised by create_connection() should have
4431 # a proper errno attribute.
4432 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004433 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004434 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004435
4436 # Issue #16257: create_connection() calls getaddrinfo() against
4437 # 'localhost'. This may result in an IPV6 addr being returned
4438 # as well as an IPV4 one:
4439 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4440 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4441 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4442 #
4443 # create_connection() enumerates through all the addresses returned
4444 # and if it doesn't successfully bind to any of them, it propagates
4445 # the last exception it encountered.
4446 #
4447 # On Solaris, ENETUNREACH is returned in this circumstance instead
4448 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4449 # expected errnos.
4450 expected_errnos = [ errno.ECONNREFUSED, ]
4451 if hasattr(errno, 'ENETUNREACH'):
4452 expected_errnos.append(errno.ENETUNREACH)
4453
4454 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004455
4456 def test_create_connection_timeout(self):
4457 # Issue #9792: create_connection() should not recast timeout errors
4458 # as generic socket errors.
4459 with self.mocked_socket_module():
4460 with self.assertRaises(socket.timeout):
4461 socket.create_connection((HOST, 1234))
4462
Guido van Rossumd8faa362007-04-27 19:54:29 +00004463
Victor Stinner45df8202010-04-28 22:31:17 +00004464@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004465class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4466
4467 def __init__(self, methodName='runTest'):
4468 SocketTCPTest.__init__(self, methodName=methodName)
4469 ThreadableTest.__init__(self)
4470
4471 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004472 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004473
4474 def clientTearDown(self):
4475 self.cli.close()
4476 self.cli = None
4477 ThreadableTest.clientTearDown(self)
4478
4479 def _justAccept(self):
4480 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004481 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004482
4483 testFamily = _justAccept
4484 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004485 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004486 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004487 self.assertEqual(self.cli.family, 2)
4488
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004489 testSourceAddress = _justAccept
4490 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004491 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4492 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004493 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004494 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004495 # The port number being used is sufficient to show that the bind()
4496 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004497
Guido van Rossumd8faa362007-04-27 19:54:29 +00004498 testTimeoutDefault = _justAccept
4499 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004500 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004501 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004502 socket.setdefaulttimeout(42)
4503 try:
4504 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004505 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004506 finally:
4507 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004508 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004509
4510 testTimeoutNone = _justAccept
4511 def _testTimeoutNone(self):
4512 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004513 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004514 socket.setdefaulttimeout(30)
4515 try:
4516 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004517 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004518 finally:
4519 socket.setdefaulttimeout(None)
4520 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004521
4522 testTimeoutValueNamed = _justAccept
4523 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004524 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004525 self.assertEqual(self.cli.gettimeout(), 30)
4526
4527 testTimeoutValueNonamed = _justAccept
4528 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004529 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004530 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004531 self.assertEqual(self.cli.gettimeout(), 30)
4532
Victor Stinner45df8202010-04-28 22:31:17 +00004533@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004534class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4535
4536 def __init__(self, methodName='runTest'):
4537 SocketTCPTest.__init__(self, methodName=methodName)
4538 ThreadableTest.__init__(self)
4539
4540 def clientSetUp(self):
4541 pass
4542
4543 def clientTearDown(self):
4544 self.cli.close()
4545 self.cli = None
4546 ThreadableTest.clientTearDown(self)
4547
4548 def testInsideTimeout(self):
4549 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004550 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004551 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004552 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004553 testOutsideTimeout = testInsideTimeout
4554
4555 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004556 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004557 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004558 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004559
4560 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004561 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004562 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004563
4564
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004565class TCPTimeoutTest(SocketTCPTest):
4566
4567 def testTCPTimeout(self):
4568 def raise_timeout(*args, **kwargs):
4569 self.serv.settimeout(1.0)
4570 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004571 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004572 "Error generating a timeout exception (TCP)")
4573
4574 def testTimeoutZero(self):
4575 ok = False
4576 try:
4577 self.serv.settimeout(0.0)
4578 foo = self.serv.accept()
4579 except socket.timeout:
4580 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004581 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004582 ok = True
4583 except:
4584 self.fail("caught unexpected exception (TCP)")
4585 if not ok:
4586 self.fail("accept() returned success when we did not expect it")
4587
Serhiy Storchaka43767632013-11-03 21:31:38 +02004588 @unittest.skipUnless(hasattr(signal, 'alarm'),
4589 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004590 def testInterruptedTimeout(self):
4591 # XXX I don't know how to do this test on MSWindows or any other
4592 # plaform that doesn't support signal.alarm() or os.kill(), though
4593 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004594 self.serv.settimeout(5.0) # must be longer than alarm
4595 class Alarm(Exception):
4596 pass
4597 def alarm_handler(signal, frame):
4598 raise Alarm
4599 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4600 try:
4601 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4602 try:
4603 foo = self.serv.accept()
4604 except socket.timeout:
4605 self.fail("caught timeout instead of Alarm")
4606 except Alarm:
4607 pass
4608 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004609 self.fail("caught other exception instead of Alarm:"
4610 " %s(%s):\n%s" %
4611 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004612 else:
4613 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004614 finally:
4615 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004616 except Alarm:
4617 self.fail("got Alarm in wrong place")
4618 finally:
4619 # no alarm can be pending. Safe to restore old handler.
4620 signal.signal(signal.SIGALRM, old_alarm)
4621
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004622class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004623
4624 def testUDPTimeout(self):
4625 def raise_timeout(*args, **kwargs):
4626 self.serv.settimeout(1.0)
4627 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004628 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004629 "Error generating a timeout exception (UDP)")
4630
4631 def testTimeoutZero(self):
4632 ok = False
4633 try:
4634 self.serv.settimeout(0.0)
4635 foo = self.serv.recv(1024)
4636 except socket.timeout:
4637 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004638 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004639 ok = True
4640 except:
4641 self.fail("caught unexpected exception (UDP)")
4642 if not ok:
4643 self.fail("recv() returned success when we did not expect it")
4644
4645class TestExceptions(unittest.TestCase):
4646
4647 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004648 self.assertTrue(issubclass(OSError, Exception))
4649 self.assertTrue(issubclass(socket.herror, OSError))
4650 self.assertTrue(issubclass(socket.gaierror, OSError))
4651 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004652
Yury Selivanovfa22b292016-10-18 16:03:52 -04004653 def test_setblocking_invalidfd(self):
4654 # Regression test for issue #28471
4655
4656 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4657 sock = socket.socket(
4658 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4659 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004660 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004661
4662 with self.assertRaises(OSError):
4663 sock.setblocking(False)
4664
4665
Serhiy Storchaka43767632013-11-03 21:31:38 +02004666@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004667class TestLinuxAbstractNamespace(unittest.TestCase):
4668
4669 UNIX_PATH_MAX = 108
4670
4671 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004672 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004673 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4674 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004675 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004676 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4677 s2.connect(s1.getsockname())
4678 with s1.accept()[0] as s3:
4679 self.assertEqual(s1.getsockname(), address)
4680 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004681
4682 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004683 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004684 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4685 s.bind(address)
4686 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004687
4688 def testNameOverflow(self):
4689 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004690 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004691 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004692
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004693 def testStrName(self):
4694 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004695 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4696 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004697 s.bind("\x00python\x00test\x00")
4698 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004699 finally:
4700 s.close()
4701
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004702 def testBytearrayName(self):
4703 # Check that an abstract name can be passed as a bytearray.
4704 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4705 s.bind(bytearray(b"\x00python\x00test\x00"))
4706 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4707
Serhiy Storchaka43767632013-11-03 21:31:38 +02004708@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004709class TestUnixDomain(unittest.TestCase):
4710
4711 def setUp(self):
4712 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4713
4714 def tearDown(self):
4715 self.sock.close()
4716
4717 def encoded(self, path):
4718 # Return the given path encoded in the file system encoding,
4719 # or skip the test if this is not possible.
4720 try:
4721 return os.fsencode(path)
4722 except UnicodeEncodeError:
4723 self.skipTest(
4724 "Pathname {0!a} cannot be represented in file "
4725 "system encoding {1!r}".format(
4726 path, sys.getfilesystemencoding()))
4727
Antoine Pitrou16374872011-12-16 15:04:12 +01004728 def bind(self, sock, path):
4729 # Bind the socket
4730 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004731 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004732 except OSError as e:
4733 if str(e) == "AF_UNIX path too long":
4734 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004735 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004736 .format(path))
4737 else:
4738 raise
4739
Antoine Pitrou495b5022017-05-02 17:20:00 +02004740 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02004741 # Issue #30205 (note getsockname() can return None on OS X)
4742 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02004743
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004744 def testStrAddr(self):
4745 # Test binding to and retrieving a normal string pathname.
4746 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004747 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004748 self.addCleanup(support.unlink, path)
4749 self.assertEqual(self.sock.getsockname(), path)
4750
4751 def testBytesAddr(self):
4752 # Test binding to a bytes pathname.
4753 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004754 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004755 self.addCleanup(support.unlink, path)
4756 self.assertEqual(self.sock.getsockname(), path)
4757
4758 def testSurrogateescapeBind(self):
4759 # Test binding to a valid non-ASCII pathname, with the
4760 # non-ASCII bytes supplied using surrogateescape encoding.
4761 path = os.path.abspath(support.TESTFN_UNICODE)
4762 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004763 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004764 self.addCleanup(support.unlink, path)
4765 self.assertEqual(self.sock.getsockname(), path)
4766
4767 def testUnencodableAddr(self):
4768 # Test binding to a pathname that cannot be encoded in the
4769 # file system encoding.
4770 if support.TESTFN_UNENCODABLE is None:
4771 self.skipTest("No unencodable filename available")
4772 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004773 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004774 self.addCleanup(support.unlink, path)
4775 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004776
Victor Stinner45df8202010-04-28 22:31:17 +00004777@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004778class BufferIOTest(SocketConnectedTest):
4779 """
4780 Test the buffer versions of socket.recv() and socket.send().
4781 """
4782 def __init__(self, methodName='runTest'):
4783 SocketConnectedTest.__init__(self, methodName=methodName)
4784
Antoine Pitrou25480782010-03-17 22:50:28 +00004785 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004786 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004787 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004788 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004789 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004790 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004791 self.assertEqual(msg, MSG)
4792
Antoine Pitrou25480782010-03-17 22:50:28 +00004793 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004794 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004795 self.serv_conn.send(buf)
4796
Antoine Pitrou25480782010-03-17 22:50:28 +00004797 def testRecvIntoBytearray(self):
4798 buf = bytearray(1024)
4799 nbytes = self.cli_conn.recv_into(buf)
4800 self.assertEqual(nbytes, len(MSG))
4801 msg = buf[:len(MSG)]
4802 self.assertEqual(msg, MSG)
4803
4804 _testRecvIntoBytearray = _testRecvIntoArray
4805
4806 def testRecvIntoMemoryview(self):
4807 buf = bytearray(1024)
4808 nbytes = self.cli_conn.recv_into(memoryview(buf))
4809 self.assertEqual(nbytes, len(MSG))
4810 msg = buf[:len(MSG)]
4811 self.assertEqual(msg, MSG)
4812
4813 _testRecvIntoMemoryview = _testRecvIntoArray
4814
4815 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004816 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004817 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004818 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004819 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004820 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004821 self.assertEqual(msg, MSG)
4822
Antoine Pitrou25480782010-03-17 22:50:28 +00004823 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004824 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004825 self.serv_conn.send(buf)
4826
Antoine Pitrou25480782010-03-17 22:50:28 +00004827 def testRecvFromIntoBytearray(self):
4828 buf = bytearray(1024)
4829 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4830 self.assertEqual(nbytes, len(MSG))
4831 msg = buf[:len(MSG)]
4832 self.assertEqual(msg, MSG)
4833
4834 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4835
4836 def testRecvFromIntoMemoryview(self):
4837 buf = bytearray(1024)
4838 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4839 self.assertEqual(nbytes, len(MSG))
4840 msg = buf[:len(MSG)]
4841 self.assertEqual(msg, MSG)
4842
4843 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4844
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004845 def testRecvFromIntoSmallBuffer(self):
4846 # See issue #20246.
4847 buf = bytearray(8)
4848 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4849
4850 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004851 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004852
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004853 def testRecvFromIntoEmptyBuffer(self):
4854 buf = bytearray()
4855 self.cli_conn.recvfrom_into(buf)
4856 self.cli_conn.recvfrom_into(buf, 0)
4857
4858 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4859
Christian Heimes043d6f62008-01-07 17:19:16 +00004860
4861TIPC_STYPE = 2000
4862TIPC_LOWER = 200
4863TIPC_UPPER = 210
4864
4865def isTipcAvailable():
4866 """Check if the TIPC module is loaded
4867
4868 The TIPC module is not loaded automatically on Ubuntu and probably
4869 other Linux distros.
4870 """
4871 if not hasattr(socket, "AF_TIPC"):
4872 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004873 try:
4874 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00004875 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00004876 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00004877 # have not the permission to read it.
4878 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004879 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00004880 for line in f:
4881 if line.startswith("tipc "):
4882 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004883 return False
4884
Serhiy Storchaka43767632013-11-03 21:31:38 +02004885@unittest.skipUnless(isTipcAvailable(),
4886 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004887class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004888 def testRDM(self):
4889 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4890 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004891 self.addCleanup(srv.close)
4892 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004893
4894 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4895 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4896 TIPC_LOWER, TIPC_UPPER)
4897 srv.bind(srvaddr)
4898
4899 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4900 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4901 cli.sendto(MSG, sendaddr)
4902
4903 msg, recvaddr = srv.recvfrom(1024)
4904
4905 self.assertEqual(cli.getsockname(), recvaddr)
4906 self.assertEqual(msg, MSG)
4907
4908
Serhiy Storchaka43767632013-11-03 21:31:38 +02004909@unittest.skipUnless(isTipcAvailable(),
4910 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004911class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004912 def __init__(self, methodName = 'runTest'):
4913 unittest.TestCase.__init__(self, methodName = methodName)
4914 ThreadableTest.__init__(self)
4915
4916 def setUp(self):
4917 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004918 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004919 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4920 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4921 TIPC_LOWER, TIPC_UPPER)
4922 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004923 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004924 self.serverExplicitReady()
4925 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004926 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004927
4928 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00004929 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00004930 # accept() call; sleep a little while to avoid it, otherwise
4931 # we could get an exception
4932 time.sleep(0.1)
4933 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004934 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004935 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4936 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4937 self.cli.connect(addr)
4938 self.cliaddr = self.cli.getsockname()
4939
4940 def testStream(self):
4941 msg = self.conn.recv(1024)
4942 self.assertEqual(msg, MSG)
4943 self.assertEqual(self.cliaddr, self.connaddr)
4944
4945 def _testStream(self):
4946 self.cli.send(MSG)
4947 self.cli.close()
4948
4949
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004950@unittest.skipUnless(thread, 'Threading required for this test.')
4951class ContextManagersTest(ThreadedTCPSocketTest):
4952
4953 def _testSocketClass(self):
4954 # base test
4955 with socket.socket() as sock:
4956 self.assertFalse(sock._closed)
4957 self.assertTrue(sock._closed)
4958 # close inside with block
4959 with socket.socket() as sock:
4960 sock.close()
4961 self.assertTrue(sock._closed)
4962 # exception inside with block
4963 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004964 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004965 self.assertTrue(sock._closed)
4966
4967 def testCreateConnectionBase(self):
4968 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004969 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004970 data = conn.recv(1024)
4971 conn.sendall(data)
4972
4973 def _testCreateConnectionBase(self):
4974 address = self.serv.getsockname()
4975 with socket.create_connection(address) as sock:
4976 self.assertFalse(sock._closed)
4977 sock.sendall(b'foo')
4978 self.assertEqual(sock.recv(1024), b'foo')
4979 self.assertTrue(sock._closed)
4980
4981 def testCreateConnectionClose(self):
4982 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004983 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004984 data = conn.recv(1024)
4985 conn.sendall(data)
4986
4987 def _testCreateConnectionClose(self):
4988 address = self.serv.getsockname()
4989 with socket.create_connection(address) as sock:
4990 sock.close()
4991 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004992 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004993
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004994
Victor Stinnerdaf45552013-08-28 00:53:59 +02004995class InheritanceTest(unittest.TestCase):
4996 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4997 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004998 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004999 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005000 with socket.socket(socket.AF_INET,
5001 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
5002 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005003 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005004
5005 def test_default_inheritable(self):
5006 sock = socket.socket()
5007 with sock:
5008 self.assertEqual(sock.get_inheritable(), False)
5009
5010 def test_dup(self):
5011 sock = socket.socket()
5012 with sock:
5013 newsock = sock.dup()
5014 sock.close()
5015 with newsock:
5016 self.assertEqual(newsock.get_inheritable(), False)
5017
5018 def test_set_inheritable(self):
5019 sock = socket.socket()
5020 with sock:
5021 sock.set_inheritable(True)
5022 self.assertEqual(sock.get_inheritable(), True)
5023
5024 sock.set_inheritable(False)
5025 self.assertEqual(sock.get_inheritable(), False)
5026
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005027 @unittest.skipIf(fcntl is None, "need fcntl")
5028 def test_get_inheritable_cloexec(self):
5029 sock = socket.socket()
5030 with sock:
5031 fd = sock.fileno()
5032 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005033
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005034 # clear FD_CLOEXEC flag
5035 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5036 flags &= ~fcntl.FD_CLOEXEC
5037 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005038
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005039 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005040
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005041 @unittest.skipIf(fcntl is None, "need fcntl")
5042 def test_set_inheritable_cloexec(self):
5043 sock = socket.socket()
5044 with sock:
5045 fd = sock.fileno()
5046 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5047 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005048
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005049 sock.set_inheritable(True)
5050 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5051 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005052
5053
Victor Stinnerdaf45552013-08-28 00:53:59 +02005054 @unittest.skipUnless(hasattr(socket, "socketpair"),
5055 "need socket.socketpair()")
5056 def test_socketpair(self):
5057 s1, s2 = socket.socketpair()
5058 self.addCleanup(s1.close)
5059 self.addCleanup(s2.close)
5060 self.assertEqual(s1.get_inheritable(), False)
5061 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005062
5063
5064@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5065 "SOCK_NONBLOCK not defined")
5066class NonblockConstantTest(unittest.TestCase):
5067 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5068 if nonblock:
5069 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
5070 self.assertEqual(s.gettimeout(), timeout)
5071 else:
5072 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
5073 self.assertEqual(s.gettimeout(), None)
5074
Charles-François Natali239bb962011-06-03 12:55:15 +02005075 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005076 def test_SOCK_NONBLOCK(self):
5077 # a lot of it seems silly and redundant, but I wanted to test that
5078 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005079 with socket.socket(socket.AF_INET,
5080 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5081 self.checkNonblock(s)
5082 s.setblocking(1)
5083 self.checkNonblock(s, False)
5084 s.setblocking(0)
5085 self.checkNonblock(s)
5086 s.settimeout(None)
5087 self.checkNonblock(s, False)
5088 s.settimeout(2.0)
5089 self.checkNonblock(s, timeout=2.0)
5090 s.setblocking(1)
5091 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005092 # defaulttimeout
5093 t = socket.getdefaulttimeout()
5094 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005095 with socket.socket() as s:
5096 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005097 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005098 with socket.socket() as s:
5099 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005100 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005101 with socket.socket() as s:
5102 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005103 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005104 with socket.socket() as s:
5105 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005106 socket.setdefaulttimeout(t)
5107
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005108
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005109@unittest.skipUnless(os.name == "nt", "Windows specific")
5110@unittest.skipUnless(multiprocessing, "need multiprocessing")
5111class TestSocketSharing(SocketTCPTest):
5112 # This must be classmethod and not staticmethod or multiprocessing
5113 # won't be able to bootstrap it.
5114 @classmethod
5115 def remoteProcessServer(cls, q):
5116 # Recreate socket from shared data
5117 sdata = q.get()
5118 message = q.get()
5119
5120 s = socket.fromshare(sdata)
5121 s2, c = s.accept()
5122
5123 # Send the message
5124 s2.sendall(message)
5125 s2.close()
5126 s.close()
5127
5128 def testShare(self):
5129 # Transfer the listening server socket to another process
5130 # and service it from there.
5131
5132 # Create process:
5133 q = multiprocessing.Queue()
5134 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5135 p.start()
5136
5137 # Get the shared socket data
5138 data = self.serv.share(p.pid)
5139
5140 # Pass the shared socket to the other process
5141 addr = self.serv.getsockname()
5142 self.serv.close()
5143 q.put(data)
5144
5145 # The data that the server will send us
5146 message = b"slapmahfro"
5147 q.put(message)
5148
5149 # Connect
5150 s = socket.create_connection(addr)
5151 # listen for the data
5152 m = []
5153 while True:
5154 data = s.recv(100)
5155 if not data:
5156 break
5157 m.append(data)
5158 s.close()
5159 received = b"".join(m)
5160 self.assertEqual(received, message)
5161 p.join()
5162
5163 def testShareLength(self):
5164 data = self.serv.share(os.getpid())
5165 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5166 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5167
5168 def compareSockets(self, org, other):
5169 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005170 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005171 self.assertEqual(org.gettimeout(), None)
5172 self.assertEqual(org.gettimeout(), other.gettimeout())
5173
5174 self.assertEqual(org.family, other.family)
5175 self.assertEqual(org.type, other.type)
5176 # If the user specified "0" for proto, then
5177 # internally windows will have picked the correct value.
5178 # Python introspection on the socket however will still return
5179 # 0. For the shared socket, the python value is recreated
5180 # from the actual value, so it may not compare correctly.
5181 if org.proto != 0:
5182 self.assertEqual(org.proto, other.proto)
5183
5184 def testShareLocal(self):
5185 data = self.serv.share(os.getpid())
5186 s = socket.fromshare(data)
5187 try:
5188 self.compareSockets(self.serv, s)
5189 finally:
5190 s.close()
5191
5192 def testTypes(self):
5193 families = [socket.AF_INET, socket.AF_INET6]
5194 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5195 for f in families:
5196 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005197 try:
5198 source = socket.socket(f, t)
5199 except OSError:
5200 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005201 try:
5202 data = source.share(os.getpid())
5203 shared = socket.fromshare(data)
5204 try:
5205 self.compareSockets(source, shared)
5206 finally:
5207 shared.close()
5208 finally:
5209 source.close()
5210
5211
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005212@unittest.skipUnless(thread, 'Threading required for this test.')
5213class SendfileUsingSendTest(ThreadedTCPSocketTest):
5214 """
5215 Test the send() implementation of socket.sendfile().
5216 """
5217
5218 FILESIZE = (10 * 1024 * 1024) # 10MB
5219 BUFSIZE = 8192
5220 FILEDATA = b""
5221 TIMEOUT = 2
5222
5223 @classmethod
5224 def setUpClass(cls):
5225 def chunks(total, step):
5226 assert total >= step
5227 while total > step:
5228 yield step
5229 total -= step
5230 if total:
5231 yield total
5232
5233 chunk = b"".join([random.choice(string.ascii_letters).encode()
5234 for i in range(cls.BUFSIZE)])
5235 with open(support.TESTFN, 'wb') as f:
5236 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5237 f.write(chunk)
5238 with open(support.TESTFN, 'rb') as f:
5239 cls.FILEDATA = f.read()
5240 assert len(cls.FILEDATA) == cls.FILESIZE
5241
5242 @classmethod
5243 def tearDownClass(cls):
5244 support.unlink(support.TESTFN)
5245
5246 def accept_conn(self):
5247 self.serv.settimeout(self.TIMEOUT)
5248 conn, addr = self.serv.accept()
5249 conn.settimeout(self.TIMEOUT)
5250 self.addCleanup(conn.close)
5251 return conn
5252
5253 def recv_data(self, conn):
5254 received = []
5255 while True:
5256 chunk = conn.recv(self.BUFSIZE)
5257 if not chunk:
5258 break
5259 received.append(chunk)
5260 return b''.join(received)
5261
5262 def meth_from_sock(self, sock):
5263 # Depending on the mixin class being run return either send()
5264 # or sendfile() method implementation.
5265 return getattr(sock, "_sendfile_use_send")
5266
5267 # regular file
5268
5269 def _testRegularFile(self):
5270 address = self.serv.getsockname()
5271 file = open(support.TESTFN, 'rb')
5272 with socket.create_connection(address) as sock, file as file:
5273 meth = self.meth_from_sock(sock)
5274 sent = meth(file)
5275 self.assertEqual(sent, self.FILESIZE)
5276 self.assertEqual(file.tell(), self.FILESIZE)
5277
5278 def testRegularFile(self):
5279 conn = self.accept_conn()
5280 data = self.recv_data(conn)
5281 self.assertEqual(len(data), self.FILESIZE)
5282 self.assertEqual(data, self.FILEDATA)
5283
5284 # non regular file
5285
5286 def _testNonRegularFile(self):
5287 address = self.serv.getsockname()
5288 file = io.BytesIO(self.FILEDATA)
5289 with socket.create_connection(address) as sock, file as file:
5290 sent = sock.sendfile(file)
5291 self.assertEqual(sent, self.FILESIZE)
5292 self.assertEqual(file.tell(), self.FILESIZE)
5293 self.assertRaises(socket._GiveupOnSendfile,
5294 sock._sendfile_use_sendfile, file)
5295
5296 def testNonRegularFile(self):
5297 conn = self.accept_conn()
5298 data = self.recv_data(conn)
5299 self.assertEqual(len(data), self.FILESIZE)
5300 self.assertEqual(data, self.FILEDATA)
5301
5302 # empty file
5303
5304 def _testEmptyFileSend(self):
5305 address = self.serv.getsockname()
5306 filename = support.TESTFN + "2"
5307 with open(filename, 'wb'):
5308 self.addCleanup(support.unlink, filename)
5309 file = open(filename, 'rb')
5310 with socket.create_connection(address) as sock, file as file:
5311 meth = self.meth_from_sock(sock)
5312 sent = meth(file)
5313 self.assertEqual(sent, 0)
5314 self.assertEqual(file.tell(), 0)
5315
5316 def testEmptyFileSend(self):
5317 conn = self.accept_conn()
5318 data = self.recv_data(conn)
5319 self.assertEqual(data, b"")
5320
5321 # offset
5322
5323 def _testOffset(self):
5324 address = self.serv.getsockname()
5325 file = open(support.TESTFN, 'rb')
5326 with socket.create_connection(address) as sock, file as file:
5327 meth = self.meth_from_sock(sock)
5328 sent = meth(file, offset=5000)
5329 self.assertEqual(sent, self.FILESIZE - 5000)
5330 self.assertEqual(file.tell(), self.FILESIZE)
5331
5332 def testOffset(self):
5333 conn = self.accept_conn()
5334 data = self.recv_data(conn)
5335 self.assertEqual(len(data), self.FILESIZE - 5000)
5336 self.assertEqual(data, self.FILEDATA[5000:])
5337
5338 # count
5339
5340 def _testCount(self):
5341 address = self.serv.getsockname()
5342 file = open(support.TESTFN, 'rb')
5343 with socket.create_connection(address, timeout=2) as sock, file as file:
5344 count = 5000007
5345 meth = self.meth_from_sock(sock)
5346 sent = meth(file, count=count)
5347 self.assertEqual(sent, count)
5348 self.assertEqual(file.tell(), count)
5349
5350 def testCount(self):
5351 count = 5000007
5352 conn = self.accept_conn()
5353 data = self.recv_data(conn)
5354 self.assertEqual(len(data), count)
5355 self.assertEqual(data, self.FILEDATA[:count])
5356
5357 # count small
5358
5359 def _testCountSmall(self):
5360 address = self.serv.getsockname()
5361 file = open(support.TESTFN, 'rb')
5362 with socket.create_connection(address, timeout=2) as sock, file as file:
5363 count = 1
5364 meth = self.meth_from_sock(sock)
5365 sent = meth(file, count=count)
5366 self.assertEqual(sent, count)
5367 self.assertEqual(file.tell(), count)
5368
5369 def testCountSmall(self):
5370 count = 1
5371 conn = self.accept_conn()
5372 data = self.recv_data(conn)
5373 self.assertEqual(len(data), count)
5374 self.assertEqual(data, self.FILEDATA[:count])
5375
5376 # count + offset
5377
5378 def _testCountWithOffset(self):
5379 address = self.serv.getsockname()
5380 file = open(support.TESTFN, 'rb')
5381 with socket.create_connection(address, timeout=2) as sock, file as file:
5382 count = 100007
5383 meth = self.meth_from_sock(sock)
5384 sent = meth(file, offset=2007, count=count)
5385 self.assertEqual(sent, count)
5386 self.assertEqual(file.tell(), count + 2007)
5387
5388 def testCountWithOffset(self):
5389 count = 100007
5390 conn = self.accept_conn()
5391 data = self.recv_data(conn)
5392 self.assertEqual(len(data), count)
5393 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5394
5395 # non blocking sockets are not supposed to work
5396
5397 def _testNonBlocking(self):
5398 address = self.serv.getsockname()
5399 file = open(support.TESTFN, 'rb')
5400 with socket.create_connection(address) as sock, file as file:
5401 sock.setblocking(False)
5402 meth = self.meth_from_sock(sock)
5403 self.assertRaises(ValueError, meth, file)
5404 self.assertRaises(ValueError, sock.sendfile, file)
5405
5406 def testNonBlocking(self):
5407 conn = self.accept_conn()
5408 if conn.recv(8192):
5409 self.fail('was not supposed to receive any data')
5410
5411 # timeout (non-triggered)
5412
5413 def _testWithTimeout(self):
5414 address = self.serv.getsockname()
5415 file = open(support.TESTFN, 'rb')
5416 with socket.create_connection(address, timeout=2) as sock, file as file:
5417 meth = self.meth_from_sock(sock)
5418 sent = meth(file)
5419 self.assertEqual(sent, self.FILESIZE)
5420
5421 def testWithTimeout(self):
5422 conn = self.accept_conn()
5423 data = self.recv_data(conn)
5424 self.assertEqual(len(data), self.FILESIZE)
5425 self.assertEqual(data, self.FILEDATA)
5426
5427 # timeout (triggered)
5428
5429 def _testWithTimeoutTriggeredSend(self):
5430 address = self.serv.getsockname()
5431 file = open(support.TESTFN, 'rb')
5432 with socket.create_connection(address, timeout=0.01) as sock, \
5433 file as file:
5434 meth = self.meth_from_sock(sock)
5435 self.assertRaises(socket.timeout, meth, file)
5436
5437 def testWithTimeoutTriggeredSend(self):
5438 conn = self.accept_conn()
5439 conn.recv(88192)
5440
5441 # errors
5442
5443 def _test_errors(self):
5444 pass
5445
5446 def test_errors(self):
5447 with open(support.TESTFN, 'rb') as file:
5448 with socket.socket(type=socket.SOCK_DGRAM) as s:
5449 meth = self.meth_from_sock(s)
5450 self.assertRaisesRegex(
5451 ValueError, "SOCK_STREAM", meth, file)
5452 with open(support.TESTFN, 'rt') as file:
5453 with socket.socket() as s:
5454 meth = self.meth_from_sock(s)
5455 self.assertRaisesRegex(
5456 ValueError, "binary mode", meth, file)
5457 with open(support.TESTFN, 'rb') as file:
5458 with socket.socket() as s:
5459 meth = self.meth_from_sock(s)
5460 self.assertRaisesRegex(TypeError, "positive integer",
5461 meth, file, count='2')
5462 self.assertRaisesRegex(TypeError, "positive integer",
5463 meth, file, count=0.1)
5464 self.assertRaisesRegex(ValueError, "positive integer",
5465 meth, file, count=0)
5466 self.assertRaisesRegex(ValueError, "positive integer",
5467 meth, file, count=-1)
5468
5469
5470@unittest.skipUnless(thread, 'Threading required for this test.')
5471@unittest.skipUnless(hasattr(os, "sendfile"),
5472 'os.sendfile() required for this test.')
5473class SendfileUsingSendfileTest(SendfileUsingSendTest):
5474 """
5475 Test the sendfile() implementation of socket.sendfile().
5476 """
5477 def meth_from_sock(self, sock):
5478 return getattr(sock, "_sendfile_use_sendfile")
5479
Christian Heimes48371412016-09-06 00:37:46 +02005480
5481@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005482class LinuxKernelCryptoAPI(unittest.TestCase):
5483 # tests for AF_ALG
5484 def create_alg(self, typ, name):
5485 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005486 try:
5487 sock.bind((typ, name))
5488 except FileNotFoundError as e:
5489 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005490 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005491 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005492 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005493 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005494
5495 def test_sha256(self):
5496 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5497 "177a9cb410ff61f20015ad")
5498 with self.create_alg('hash', 'sha256') as algo:
5499 op, _ = algo.accept()
5500 with op:
5501 op.sendall(b"abc")
5502 self.assertEqual(op.recv(512), expected)
5503
5504 op, _ = algo.accept()
5505 with op:
5506 op.send(b'a', socket.MSG_MORE)
5507 op.send(b'b', socket.MSG_MORE)
5508 op.send(b'c', socket.MSG_MORE)
5509 op.send(b'')
5510 self.assertEqual(op.recv(512), expected)
5511
5512 def test_hmac_sha1(self):
5513 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5514 with self.create_alg('hash', 'hmac(sha1)') as algo:
5515 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5516 op, _ = algo.accept()
5517 with op:
5518 op.sendall(b"what do ya want for nothing?")
5519 self.assertEqual(op.recv(512), expected)
5520
Christian Heimese084f842016-09-11 20:11:30 +02005521 # Although it should work with 3.19 and newer the test blocks on
5522 # Ubuntu 15.10 with Kernel 4.2.0-19.
5523 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005524 def test_aes_cbc(self):
5525 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5526 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5527 msg = b"Single block msg"
5528 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5529 msglen = len(msg)
5530 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5531 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5532 op, _ = algo.accept()
5533 with op:
5534 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5535 flags=socket.MSG_MORE)
5536 op.sendall(msg)
5537 self.assertEqual(op.recv(msglen), ciphertext)
5538
5539 op, _ = algo.accept()
5540 with op:
5541 op.sendmsg_afalg([ciphertext],
5542 op=socket.ALG_OP_DECRYPT, iv=iv)
5543 self.assertEqual(op.recv(msglen), msg)
5544
5545 # long message
5546 multiplier = 1024
5547 longmsg = [msg] * multiplier
5548 op, _ = algo.accept()
5549 with op:
5550 op.sendmsg_afalg(longmsg,
5551 op=socket.ALG_OP_ENCRYPT, iv=iv)
5552 enc = op.recv(msglen * multiplier)
5553 self.assertEqual(len(enc), msglen * multiplier)
5554 self.assertTrue(enc[:msglen], ciphertext)
5555
5556 op, _ = algo.accept()
5557 with op:
5558 op.sendmsg_afalg([enc],
5559 op=socket.ALG_OP_DECRYPT, iv=iv)
5560 dec = op.recv(msglen * multiplier)
5561 self.assertEqual(len(dec), msglen * multiplier)
5562 self.assertEqual(dec, msg * multiplier)
5563
matejcik9764c152017-02-16 14:41:31 +01005564 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005565 def test_aead_aes_gcm(self):
5566 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5567 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5568 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5569 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5570 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5571 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5572
5573 taglen = len(expected_tag)
5574 assoclen = len(assoc)
5575
5576 with self.create_alg('aead', 'gcm(aes)') as algo:
5577 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5578 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5579 None, taglen)
5580
5581 # send assoc, plain and tag buffer in separate steps
5582 op, _ = algo.accept()
5583 with op:
5584 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5585 assoclen=assoclen, flags=socket.MSG_MORE)
5586 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005587 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005588 res = op.recv(assoclen + len(plain) + taglen)
5589 self.assertEqual(expected_ct, res[assoclen:-taglen])
5590 self.assertEqual(expected_tag, res[-taglen:])
5591
5592 # now with msg
5593 op, _ = algo.accept()
5594 with op:
matejcik9764c152017-02-16 14:41:31 +01005595 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005596 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5597 assoclen=assoclen)
5598 res = op.recv(assoclen + len(plain) + taglen)
5599 self.assertEqual(expected_ct, res[assoclen:-taglen])
5600 self.assertEqual(expected_tag, res[-taglen:])
5601
5602 # create anc data manually
5603 pack_uint32 = struct.Struct('I').pack
5604 op, _ = algo.accept()
5605 with op:
matejcik9764c152017-02-16 14:41:31 +01005606 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005607 op.sendmsg(
5608 [msg],
5609 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5610 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5611 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5612 )
5613 )
matejcik9764c152017-02-16 14:41:31 +01005614 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005615 self.assertEqual(expected_ct, res[assoclen:-taglen])
5616 self.assertEqual(expected_tag, res[-taglen:])
5617
5618 # decrypt and verify
5619 op, _ = algo.accept()
5620 with op:
5621 msg = assoc + expected_ct + expected_tag
5622 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5623 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005624 res = op.recv(len(msg) - taglen)
5625 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005626
Christian Heimese084f842016-09-11 20:11:30 +02005627 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005628 def test_drbg_pr_sha256(self):
5629 # deterministic random bit generator, prediction resistance, sha256
5630 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5631 extra_seed = os.urandom(32)
5632 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5633 op, _ = algo.accept()
5634 with op:
5635 rn = op.recv(32)
5636 self.assertEqual(len(rn), 32)
5637
5638 def test_sendmsg_afalg_args(self):
5639 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005640 with sock:
5641 with self.assertRaises(TypeError):
5642 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005643
Christian Heimes02b30352016-09-11 19:49:56 +02005644 with self.assertRaises(TypeError):
5645 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005646
Christian Heimes02b30352016-09-11 19:49:56 +02005647 with self.assertRaises(TypeError):
5648 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005649
Christian Heimes02b30352016-09-11 19:49:56 +02005650 with self.assertRaises(TypeError):
5651 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005652
Christian Heimes02b30352016-09-11 19:49:56 +02005653 with self.assertRaises(TypeError):
5654 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5655
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005656
Guido van Rossumb995eb72002-07-31 16:08:40 +00005657def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005658 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005659 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005660
5661 tests.extend([
5662 NonBlockingTCPTests,
5663 FileObjectClassTestCase,
5664 UnbufferedFileObjectClassTestCase,
5665 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005666 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005667 UnicodeReadFileObjectClassTestCase,
5668 UnicodeWriteFileObjectClassTestCase,
5669 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005670 NetworkConnectionNoServer,
5671 NetworkConnectionAttributesTest,
5672 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005673 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005674 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005675 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005676 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005677 tests.append(BasicSocketPairTest)
5678 tests.append(TestUnixDomain)
5679 tests.append(TestLinuxAbstractNamespace)
5680 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005681 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005682 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005683 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005684 tests.extend([
5685 CmsgMacroTests,
5686 SendmsgUDPTest,
5687 RecvmsgUDPTest,
5688 RecvmsgIntoUDPTest,
5689 SendmsgUDP6Test,
5690 RecvmsgUDP6Test,
5691 RecvmsgRFC3542AncillaryUDP6Test,
5692 RecvmsgIntoRFC3542AncillaryUDP6Test,
5693 RecvmsgIntoUDP6Test,
5694 SendmsgTCPTest,
5695 RecvmsgTCPTest,
5696 RecvmsgIntoTCPTest,
5697 SendmsgSCTPStreamTest,
5698 RecvmsgSCTPStreamTest,
5699 RecvmsgIntoSCTPStreamTest,
5700 SendmsgUnixStreamTest,
5701 RecvmsgUnixStreamTest,
5702 RecvmsgIntoUnixStreamTest,
5703 RecvmsgSCMRightsStreamTest,
5704 RecvmsgIntoSCMRightsStreamTest,
5705 # These are slow when setitimer() is not available
5706 InterruptedRecvTimeoutTest,
5707 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005708 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005709 SendfileUsingSendTest,
5710 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005711 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005712
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005713 thread_info = support.threading_setup()
5714 support.run_unittest(*tests)
5715 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005716
5717if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005718 test_main()