blob: 1508f20c9f05987f497f9591642d71e41a0a9d8c [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003
Christian Heimes5e696852008-04-09 08:37:03 +00004import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005import io
Charles-François Natali65708cf2014-07-25 18:44:30 +01006import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +00007import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +10009import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000016import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000017from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000018import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000019import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010020import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020021import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020022import random
23import string
Antoine Pitroub1c54962010-10-14 15:05:38 +000024try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000025 import multiprocessing
26except ImportError:
27 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020028try:
29 import fcntl
30except ImportError:
31 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000032
Benjamin Petersonee8712c2008-05-20 21:35:26 +000033HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000034MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000035
Victor Stinner45df8202010-04-28 22:31:17 +000036try:
37 import _thread as thread
38 import threading
39except ImportError:
40 thread = None
41 threading = None
Victor Stinnere254e532014-07-26 14:36:55 +020042try:
43 import _socket
44except ImportError:
45 _socket = None
46
Victor Stinner45df8202010-04-28 22:31:17 +000047
Charles-François Natali47413c12011-10-06 19:47:44 +020048def _have_socket_can():
49 """Check whether CAN sockets are supported on this host."""
50 try:
51 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020052 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020053 return False
54 else:
55 s.close()
56 return True
57
Charles-François Natali10b8cf42011-11-10 19:21:37 +010058def _have_socket_rds():
59 """Check whether RDS sockets are supported on this host."""
60 try:
61 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
62 except (AttributeError, OSError):
63 return False
64 else:
65 s.close()
66 return True
67
Christian Heimes48371412016-09-06 00:37:46 +020068def _have_socket_alg():
69 """Check whether AF_ALG sockets are supported on this host."""
70 try:
71 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
72 except (AttributeError, OSError):
73 return False
74 else:
75 s.close()
76 return True
77
Charles-François Natali47413c12011-10-06 19:47:44 +020078HAVE_SOCKET_CAN = _have_socket_can()
79
Charles-François Natali10b8cf42011-11-10 19:21:37 +010080HAVE_SOCKET_RDS = _have_socket_rds()
81
Christian Heimes48371412016-09-06 00:37:46 +020082HAVE_SOCKET_ALG = _have_socket_alg()
83
Nick Coghlan96fe56a2011-08-22 11:55:57 +100084# Size in bytes of the int type
85SIZEOF_INT = array.array("i").itemsize
86
Guido van Rossum24e4af82002-06-12 19:18:08 +000087class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000088
Guido van Rossum24e4af82002-06-12 19:18:08 +000089 def setUp(self):
90 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000091 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +010092 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +000093
Guido van Rossum24e4af82002-06-12 19:18:08 +000094 def tearDown(self):
95 self.serv.close()
96 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000097
Guido van Rossum24e4af82002-06-12 19:18:08 +000098class SocketUDPTest(unittest.TestCase):
99
100 def setUp(self):
101 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000102 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000103
104 def tearDown(self):
105 self.serv.close()
106 self.serv = None
107
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000108class ThreadSafeCleanupTestCase(unittest.TestCase):
109 """Subclass of unittest.TestCase with thread-safe cleanup methods.
110
111 This subclass protects the addCleanup() and doCleanups() methods
112 with a recursive lock.
113 """
114
115 if threading:
116 def __init__(self, *args, **kwargs):
117 super().__init__(*args, **kwargs)
118 self._cleanup_lock = threading.RLock()
119
120 def addCleanup(self, *args, **kwargs):
121 with self._cleanup_lock:
122 return super().addCleanup(*args, **kwargs)
123
124 def doCleanups(self, *args, **kwargs):
125 with self._cleanup_lock:
126 return super().doCleanups(*args, **kwargs)
127
Charles-François Natali47413c12011-10-06 19:47:44 +0200128class SocketCANTest(unittest.TestCase):
129
130 """To be able to run this test, a `vcan0` CAN interface can be created with
131 the following commands:
132 # modprobe vcan
133 # ip link add dev vcan0 type vcan
134 # ifconfig vcan0 up
135 """
136 interface = 'vcan0'
137 bufsize = 128
138
Charles-François Natali773e42d2013-02-05 19:42:01 +0100139 """The CAN frame structure is defined in <linux/can.h>:
140
141 struct can_frame {
142 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
143 __u8 can_dlc; /* data length code: 0 .. 8 */
144 __u8 data[8] __attribute__((aligned(8)));
145 };
146 """
147 can_frame_fmt = "=IB3x8s"
148 can_frame_size = struct.calcsize(can_frame_fmt)
149
150 """The Broadcast Management Command frame structure is defined
151 in <linux/can/bcm.h>:
152
153 struct bcm_msg_head {
154 __u32 opcode;
155 __u32 flags;
156 __u32 count;
157 struct timeval ival1, ival2;
158 canid_t can_id;
159 __u32 nframes;
160 struct can_frame frames[0];
161 }
162
163 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
164 `struct can_frame` definition). Must use native not standard types for packing.
165 """
166 bcm_cmd_msg_fmt = "@3I4l2I"
167 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
168
Charles-François Natali47413c12011-10-06 19:47:44 +0200169 def setUp(self):
170 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200171 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200172 try:
173 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200174 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200175 self.skipTest('network interface `%s` does not exist' %
176 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200177
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100178
179class SocketRDSTest(unittest.TestCase):
180
181 """To be able to run this test, the `rds` kernel module must be loaded:
182 # modprobe rds
183 """
184 bufsize = 8192
185
186 def setUp(self):
187 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
188 self.addCleanup(self.serv.close)
189 try:
190 self.port = support.bind_port(self.serv)
191 except OSError:
192 self.skipTest('unable to bind RDS socket')
193
194
Guido van Rossum24e4af82002-06-12 19:18:08 +0000195class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000196 """Threadable Test class
197
198 The ThreadableTest class makes it easy to create a threaded
199 client/server pair from an existing unit test. To create a
200 new threaded class from an existing unit test, use multiple
201 inheritance:
202
203 class NewClass (OldClass, ThreadableTest):
204 pass
205
206 This class defines two new fixture functions with obvious
207 purposes for overriding:
208
209 clientSetUp ()
210 clientTearDown ()
211
212 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000213 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000214 '_' to indicate the client portion of the test. Ex:
215
216 def testFoo(self):
217 # Server portion
218
219 def _testFoo(self):
220 # Client portion
221
222 Any exceptions raised by the clients during their tests
223 are caught and transferred to the main thread to alert
224 the testing framework.
225
226 Note, the server setup function cannot call any blocking
227 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000228 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000229 the blocking call (such as in setting up a client/server
230 connection and performing the accept() in setUp().
231 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000232
233 def __init__(self):
234 # Swap the true setup function
235 self.__setUp = self.setUp
236 self.__tearDown = self.tearDown
237 self.setUp = self._setUp
238 self.tearDown = self._tearDown
239
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000240 def serverExplicitReady(self):
241 """This method allows the server to explicitly indicate that
242 it wants the client thread to proceed. This is useful if the
243 server is about to execute a blocking routine that is
244 dependent upon the client thread during its setup routine."""
245 self.server_ready.set()
246
Guido van Rossum24e4af82002-06-12 19:18:08 +0000247 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000248 self.server_ready = threading.Event()
249 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000251 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200252 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000253
254 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000255 methodname = self.id()
256 i = methodname.rfind('.')
257 methodname = methodname[i+1:]
258 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000259 self.client_thread = thread.start_new_thread(
260 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000261
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200262 try:
263 self.__setUp()
264 except:
265 self.server_crashed = True
266 raise
267 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000268 self.server_ready.set()
269 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000270
271 def _tearDown(self):
272 self.__tearDown()
273 self.done.wait()
274
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000275 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000276 exc = self.queue.get()
277 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000278
279 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000280 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100281 try:
282 self.clientSetUp()
283 except BaseException as e:
284 self.queue.put(e)
285 self.clientTearDown()
286 return
287 finally:
288 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200289 if self.server_crashed:
290 self.clientTearDown()
291 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000292 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000293 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000294 try:
295 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000296 except BaseException as e:
297 self.queue.put(e)
298 finally:
299 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000300
301 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000302 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000303
304 def clientTearDown(self):
305 self.done.set()
306 thread.exit()
307
308class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
309
310 def __init__(self, methodName='runTest'):
311 SocketTCPTest.__init__(self, methodName=methodName)
312 ThreadableTest.__init__(self)
313
314 def clientSetUp(self):
315 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
316
317 def clientTearDown(self):
318 self.cli.close()
319 self.cli = None
320 ThreadableTest.clientTearDown(self)
321
322class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
323
324 def __init__(self, methodName='runTest'):
325 SocketUDPTest.__init__(self, methodName=methodName)
326 ThreadableTest.__init__(self)
327
328 def clientSetUp(self):
329 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
330
Brian Curtin3beb38f2010-11-04 03:41:43 +0000331 def clientTearDown(self):
332 self.cli.close()
333 self.cli = None
334 ThreadableTest.clientTearDown(self)
335
Charles-François Natali47413c12011-10-06 19:47:44 +0200336class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
337
338 def __init__(self, methodName='runTest'):
339 SocketCANTest.__init__(self, methodName=methodName)
340 ThreadableTest.__init__(self)
341
342 def clientSetUp(self):
343 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
344 try:
345 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200346 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200347 # skipTest should not be called here, and will be called in the
348 # server instead
349 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200350
351 def clientTearDown(self):
352 self.cli.close()
353 self.cli = None
354 ThreadableTest.clientTearDown(self)
355
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100356class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
357
358 def __init__(self, methodName='runTest'):
359 SocketRDSTest.__init__(self, methodName=methodName)
360 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100361
362 def clientSetUp(self):
363 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
364 try:
365 # RDS sockets must be bound explicitly to send or receive data
366 self.cli.bind((HOST, 0))
367 self.cli_addr = self.cli.getsockname()
368 except OSError:
369 # skipTest should not be called here, and will be called in the
370 # server instead
371 pass
372
373 def clientTearDown(self):
374 self.cli.close()
375 self.cli = None
376 ThreadableTest.clientTearDown(self)
377
Guido van Rossum24e4af82002-06-12 19:18:08 +0000378class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000379 """Socket tests for client-server connection.
380
381 self.cli_conn is a client socket connected to the server. The
382 setUp() method guarantees that it is connected to the server.
383 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000384
385 def __init__(self, methodName='runTest'):
386 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
387
388 def setUp(self):
389 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000390 # Indicate explicitly we're ready for the client thread to
391 # proceed and then perform the blocking call to accept
392 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000393 conn, addr = self.serv.accept()
394 self.cli_conn = conn
395
396 def tearDown(self):
397 self.cli_conn.close()
398 self.cli_conn = None
399 ThreadedTCPSocketTest.tearDown(self)
400
401 def clientSetUp(self):
402 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000403 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000404 self.serv_conn = self.cli
405
406 def clientTearDown(self):
407 self.serv_conn.close()
408 self.serv_conn = None
409 ThreadedTCPSocketTest.clientTearDown(self)
410
Dave Cole331708b2004-08-09 04:51:41 +0000411class SocketPairTest(unittest.TestCase, ThreadableTest):
412
413 def __init__(self, methodName='runTest'):
414 unittest.TestCase.__init__(self, methodName=methodName)
415 ThreadableTest.__init__(self)
416
417 def setUp(self):
418 self.serv, self.cli = socket.socketpair()
419
420 def tearDown(self):
421 self.serv.close()
422 self.serv = None
423
424 def clientSetUp(self):
425 pass
426
427 def clientTearDown(self):
428 self.cli.close()
429 self.cli = None
430 ThreadableTest.clientTearDown(self)
431
Tim Peters494aaee2004-08-09 18:54:11 +0000432
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000433# The following classes are used by the sendmsg()/recvmsg() tests.
434# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
435# gives a drop-in replacement for SocketConnectedTest, but different
436# address families can be used, and the attributes serv_addr and
437# cli_addr will be set to the addresses of the endpoints.
438
439class SocketTestBase(unittest.TestCase):
440 """A base class for socket tests.
441
442 Subclasses must provide methods newSocket() to return a new socket
443 and bindSock(sock) to bind it to an unused address.
444
445 Creates a socket self.serv and sets self.serv_addr to its address.
446 """
447
448 def setUp(self):
449 self.serv = self.newSocket()
450 self.bindServer()
451
452 def bindServer(self):
453 """Bind server socket and set self.serv_addr to its address."""
454 self.bindSock(self.serv)
455 self.serv_addr = self.serv.getsockname()
456
457 def tearDown(self):
458 self.serv.close()
459 self.serv = None
460
461
462class SocketListeningTestMixin(SocketTestBase):
463 """Mixin to listen on the server socket."""
464
465 def setUp(self):
466 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100467 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000468
469
470class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
471 ThreadableTest):
472 """Mixin to add client socket and allow client/server tests.
473
474 Client socket is self.cli and its address is self.cli_addr. See
475 ThreadableTest for usage information.
476 """
477
478 def __init__(self, *args, **kwargs):
479 super().__init__(*args, **kwargs)
480 ThreadableTest.__init__(self)
481
482 def clientSetUp(self):
483 self.cli = self.newClientSocket()
484 self.bindClient()
485
486 def newClientSocket(self):
487 """Return a new socket for use as client."""
488 return self.newSocket()
489
490 def bindClient(self):
491 """Bind client socket and set self.cli_addr to its address."""
492 self.bindSock(self.cli)
493 self.cli_addr = self.cli.getsockname()
494
495 def clientTearDown(self):
496 self.cli.close()
497 self.cli = None
498 ThreadableTest.clientTearDown(self)
499
500
501class ConnectedStreamTestMixin(SocketListeningTestMixin,
502 ThreadedSocketTestMixin):
503 """Mixin to allow client/server stream tests with connected client.
504
505 Server's socket representing connection to client is self.cli_conn
506 and client's connection to server is self.serv_conn. (Based on
507 SocketConnectedTest.)
508 """
509
510 def setUp(self):
511 super().setUp()
512 # Indicate explicitly we're ready for the client thread to
513 # proceed and then perform the blocking call to accept
514 self.serverExplicitReady()
515 conn, addr = self.serv.accept()
516 self.cli_conn = conn
517
518 def tearDown(self):
519 self.cli_conn.close()
520 self.cli_conn = None
521 super().tearDown()
522
523 def clientSetUp(self):
524 super().clientSetUp()
525 self.cli.connect(self.serv_addr)
526 self.serv_conn = self.cli
527
528 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100529 try:
530 self.serv_conn.close()
531 self.serv_conn = None
532 except AttributeError:
533 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000534 super().clientTearDown()
535
536
537class UnixSocketTestBase(SocketTestBase):
538 """Base class for Unix-domain socket tests."""
539
540 # This class is used for file descriptor passing tests, so we
541 # create the sockets in a private directory so that other users
542 # can't send anything that might be problematic for a privileged
543 # user running the tests.
544
545 def setUp(self):
546 self.dir_path = tempfile.mkdtemp()
547 self.addCleanup(os.rmdir, self.dir_path)
548 super().setUp()
549
550 def bindSock(self, sock):
551 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100552 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000553 self.addCleanup(support.unlink, path)
554
555class UnixStreamBase(UnixSocketTestBase):
556 """Base class for Unix-domain SOCK_STREAM tests."""
557
558 def newSocket(self):
559 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
560
561
562class InetTestBase(SocketTestBase):
563 """Base class for IPv4 socket tests."""
564
565 host = HOST
566
567 def setUp(self):
568 super().setUp()
569 self.port = self.serv_addr[1]
570
571 def bindSock(self, sock):
572 support.bind_port(sock, host=self.host)
573
574class TCPTestBase(InetTestBase):
575 """Base class for TCP-over-IPv4 tests."""
576
577 def newSocket(self):
578 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
579
580class UDPTestBase(InetTestBase):
581 """Base class for UDP-over-IPv4 tests."""
582
583 def newSocket(self):
584 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
585
586class SCTPStreamBase(InetTestBase):
587 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
588
589 def newSocket(self):
590 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
591 socket.IPPROTO_SCTP)
592
593
594class Inet6TestBase(InetTestBase):
595 """Base class for IPv6 socket tests."""
596
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200597 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000598
599class UDP6TestBase(Inet6TestBase):
600 """Base class for UDP-over-IPv6 tests."""
601
602 def newSocket(self):
603 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
604
605
606# Test-skipping decorators for use with ThreadableTest.
607
608def skipWithClientIf(condition, reason):
609 """Skip decorated test if condition is true, add client_skip decorator.
610
611 If the decorated object is not a class, sets its attribute
612 "client_skip" to a decorator which will return an empty function
613 if the test is to be skipped, or the original function if it is
614 not. This can be used to avoid running the client part of a
615 skipped test when using ThreadableTest.
616 """
617 def client_pass(*args, **kwargs):
618 pass
619 def skipdec(obj):
620 retval = unittest.skip(reason)(obj)
621 if not isinstance(obj, type):
622 retval.client_skip = lambda f: client_pass
623 return retval
624 def noskipdec(obj):
625 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
626 obj.client_skip = lambda f: f
627 return obj
628 return skipdec if condition else noskipdec
629
630
631def requireAttrs(obj, *attributes):
632 """Skip decorated test if obj is missing any of the given attributes.
633
634 Sets client_skip attribute as skipWithClientIf() does.
635 """
636 missing = [name for name in attributes if not hasattr(obj, name)]
637 return skipWithClientIf(
638 missing, "don't have " + ", ".join(name for name in missing))
639
640
641def requireSocket(*args):
642 """Skip decorated test if a socket cannot be created with given arguments.
643
644 When an argument is given as a string, will use the value of that
645 attribute of the socket module, or skip the test if it doesn't
646 exist. Sets client_skip attribute as skipWithClientIf() does.
647 """
648 err = None
649 missing = [obj for obj in args if
650 isinstance(obj, str) and not hasattr(socket, obj)]
651 if missing:
652 err = "don't have " + ", ".join(name for name in missing)
653 else:
654 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
655 for obj in args]
656 try:
657 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200658 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000659 # XXX: check errno?
660 err = str(e)
661 else:
662 s.close()
663 return skipWithClientIf(
664 err is not None,
665 "can't create socket({0}): {1}".format(
666 ", ".join(str(o) for o in args), err))
667
668
Guido van Rossum24e4af82002-06-12 19:18:08 +0000669#######################################################################
670## Begin Tests
671
672class GeneralModuleTests(unittest.TestCase):
673
Ethan Furman7184bac2014-10-14 18:56:53 -0700674 def test_SocketType_is_socketobject(self):
675 import _socket
676 self.assertTrue(socket.SocketType is _socket.socket)
677 s = socket.socket()
678 self.assertIsInstance(s, socket.SocketType)
679 s.close()
680
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000681 def test_repr(self):
682 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200683 with s:
684 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000685 self.assertIn('family=%s' % socket.AF_INET, repr(s))
686 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200687 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200688 self.assertNotIn('raddr', repr(s))
689 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200690 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200691 self.assertIn(str(s.getsockname()), repr(s))
692 self.assertIn('[closed]', repr(s))
693 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000694
Victor Stinnere254e532014-07-26 14:36:55 +0200695 @unittest.skipUnless(_socket is not None, 'need _socket module')
696 def test_csocket_repr(self):
697 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
698 try:
699 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
700 % (s.fileno(), s.family, s.type, s.proto))
701 self.assertEqual(repr(s), expected)
702 finally:
703 s.close()
704 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
705 % (s.family, s.type, s.proto))
706 self.assertEqual(repr(s), expected)
707
Raymond Hettinger027bb632004-05-31 03:09:25 +0000708 def test_weakref(self):
709 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
710 p = proxy(s)
711 self.assertEqual(p.fileno(), s.fileno())
712 s.close()
713 s = None
714 try:
715 p.fileno()
716 except ReferenceError:
717 pass
718 else:
719 self.fail('Socket proxy still exists')
720
Guido van Rossum24e4af82002-06-12 19:18:08 +0000721 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000722 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300723 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200724 with self.assertRaises(OSError, msg=msg % 'OSError'):
725 raise OSError
726 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000727 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200728 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000729 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000730
Ezio Melotti63e42302011-05-07 19:47:48 +0300731 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000732 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300733 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
734 self.addCleanup(s.close)
735 s.bind(('', 0))
736 sockname = s.getsockname()
737 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300738 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300739 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300740 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400741 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300742 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300743 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300744 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400745 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300746 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300747 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300748 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300749 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300750 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300751 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300752 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400753 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300754 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300755 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300756 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400757 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300758 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300759 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300760 self.assertIn('not NoneType', str(cm.exception))
761 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300762 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300763 self.assertIn('an integer is required', str(cm.exception))
764 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300765 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300766 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300767 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300768 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300769 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300770 self.assertIn('(1 given)', str(cm.exception))
771 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300772 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300773 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300774
Guido van Rossum24e4af82002-06-12 19:18:08 +0000775 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000776 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000777 socket.AF_INET
778 socket.SOCK_STREAM
779 socket.SOCK_DGRAM
780 socket.SOCK_RAW
781 socket.SOCK_RDM
782 socket.SOCK_SEQPACKET
783 socket.SOL_SOCKET
784 socket.SO_REUSEADDR
785
Guido van Rossum654c11e2002-06-13 20:24:17 +0000786 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000787 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000788 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000789 try:
790 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200791 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000792 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600793 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000794 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000795 try:
796 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200797 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000798 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600799 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000800 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000801 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000802 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000803 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000804
Charles-François Natali0cc86852013-09-13 19:53:08 +0200805 def test_host_resolution(self):
Charles-François Natali0cc86852013-09-13 19:53:08 +0200806 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
807 self.assertEqual(socket.gethostbyname(addr), addr)
808
809 # we don't test support.HOSTv6 because there's a chance it doesn't have
810 # a matching name entry (e.g. 'ip6-localhost')
811 for host in [support.HOST]:
812 self.assertIn(host, socket.gethostbyaddr(host)[2])
813
Xiang Zhang284a2ba2017-03-07 11:53:29 +0800814 def test_host_resolution_bad_address(self):
815 # These are all malformed IP addresses and expected not to resolve to
816 # any result. But some ISPs, e.g. AWS, may successfully resolve these
817 # IPs.
818 explanation = (
819 "resolving an invalid IP address did not raise OSError; "
820 "can be caused by a broken DNS server"
821 )
822 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
823 '1:1:1:1:1:1:1:1:1']:
824 with self.assertRaises(OSError):
825 socket.gethostbyname(addr)
826 with self.assertRaises(OSError, msg=explanation):
827 socket.gethostbyaddr(addr)
828
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000829 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
830 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
831 def test_sethostname(self):
832 oldhn = socket.gethostname()
833 try:
834 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200835 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000836 if e.errno == errno.EPERM:
837 self.skipTest("test should be run as root")
838 else:
839 raise
840 try:
841 # running test as root!
842 self.assertEqual(socket.gethostname(), 'new')
843 # Should work with bytes objects too
844 socket.sethostname(b'bar')
845 self.assertEqual(socket.gethostname(), 'bar')
846 finally:
847 socket.sethostname(oldhn)
848
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700849 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
850 'socket.if_nameindex() not available.')
851 def testInterfaceNameIndex(self):
852 interfaces = socket.if_nameindex()
853 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200854 self.assertIsInstance(index, int)
855 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700856 # interface indices are non-zero integers
857 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200858 _index = socket.if_nametoindex(name)
859 self.assertIsInstance(_index, int)
860 self.assertEqual(index, _index)
861 _name = socket.if_indextoname(index)
862 self.assertIsInstance(_name, str)
863 self.assertEqual(name, _name)
864
865 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
866 'socket.if_nameindex() not available.')
867 def testInvalidInterfaceNameIndex(self):
868 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200869 self.assertRaises(OSError, socket.if_indextoname, 0)
870 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200871 # test with invalid values
872 self.assertRaises(TypeError, socket.if_nametoindex, 0)
873 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700874
Serhiy Storchaka43767632013-11-03 21:31:38 +0200875 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
876 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000877 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000878 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200879 try:
880 # On some versions, this loses a reference
881 orig = sys.getrefcount(__name__)
882 socket.getnameinfo(__name__,0)
883 except TypeError:
884 if sys.getrefcount(__name__) != orig:
885 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000886
Guido van Rossum24e4af82002-06-12 19:18:08 +0000887 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000888 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000889 try:
890 # On some versions, this crashes the interpreter.
891 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200892 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000893 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000894
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000895 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000896 # This just checks that htons etc. are their own inverse,
897 # when looking at the lower 16 or 32 bits.
898 sizes = {socket.htonl: 32, socket.ntohl: 32,
899 socket.htons: 16, socket.ntohs: 16}
900 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000901 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000902 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
903 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000904
Guido van Rossuma2627af2002-09-14 00:58:46 +0000905 swapped = func(mask)
906 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000907 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000908
Guido van Rossum018919a2007-01-15 00:07:32 +0000909 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000910 good_values = [ 1, 2, 3, 1, 2, 3 ]
911 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000912 for k in good_values:
913 socket.ntohl(k)
914 socket.ntohs(k)
915 socket.htonl(k)
916 socket.htons(k)
917 for k in bad_values:
918 self.assertRaises(OverflowError, socket.ntohl, k)
919 self.assertRaises(OverflowError, socket.ntohs, k)
920 self.assertRaises(OverflowError, socket.htonl, k)
921 self.assertRaises(OverflowError, socket.htons, k)
922
Barry Warsaw11b91a02004-06-28 00:50:43 +0000923 def testGetServBy(self):
924 eq = self.assertEqual
925 # Find one service that exists, then check all the related interfaces.
926 # I've ordered this by protocols that have both a tcp and udp
927 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200928 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200929 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000930 # avoid the 'echo' service on this platform, as there is an
931 # assumption breaking non-standard port/protocol entry
932 services = ('daytime', 'qotd', 'domain')
933 else:
934 services = ('echo', 'daytime', 'domain')
935 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000936 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000937 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000938 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200939 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000940 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000941 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200942 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000943 # Try same call with optional protocol omitted
944 port2 = socket.getservbyname(service)
945 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400946 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000947 try:
948 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200949 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000950 udpport = None
951 else:
952 eq(udpport, port)
953 # Now make sure the lookup by port returns the same service name
954 eq(socket.getservbyport(port2), service)
955 eq(socket.getservbyport(port, 'tcp'), service)
956 if udpport is not None:
957 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000958 # Make sure getservbyport does not accept out of range ports.
959 self.assertRaises(OverflowError, socket.getservbyport, -1)
960 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000961
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000962 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000963 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000964 # The default timeout should initially be None
965 self.assertEqual(socket.getdefaulttimeout(), None)
966 s = socket.socket()
967 self.assertEqual(s.gettimeout(), None)
968 s.close()
969
970 # Set the default timeout to 10, and see if it propagates
971 socket.setdefaulttimeout(10)
972 self.assertEqual(socket.getdefaulttimeout(), 10)
973 s = socket.socket()
974 self.assertEqual(s.gettimeout(), 10)
975 s.close()
976
977 # Reset the default timeout to None, and see if it propagates
978 socket.setdefaulttimeout(None)
979 self.assertEqual(socket.getdefaulttimeout(), None)
980 s = socket.socket()
981 self.assertEqual(s.gettimeout(), None)
982 s.close()
983
984 # Check that setting it to an invalid value raises ValueError
985 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
986
987 # Check that setting it to an invalid type raises TypeError
988 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
989
Serhiy Storchaka43767632013-11-03 21:31:38 +0200990 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
991 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000992 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000993 # Test that issue1008086 and issue767150 are fixed.
994 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000995 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
996 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000997
Serhiy Storchaka43767632013-11-03 21:31:38 +0200998 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
999 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001000 def testIPv4toString(self):
1001 from socket import inet_aton as f, inet_pton, AF_INET
1002 g = lambda a: inet_pton(AF_INET, a)
1003
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001004 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001005 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001006 )
1007
Ezio Melottib3aedd42010-11-20 19:04:17 +00001008 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1009 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1010 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1011 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1012 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001013 assertInvalid(f, '0.0.0.')
1014 assertInvalid(f, '300.0.0.0')
1015 assertInvalid(f, 'a.0.0.0')
1016 assertInvalid(f, '1.2.3.4.5')
1017 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001018
Ezio Melottib3aedd42010-11-20 19:04:17 +00001019 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1020 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1021 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1022 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001023 assertInvalid(g, '0.0.0.')
1024 assertInvalid(g, '300.0.0.0')
1025 assertInvalid(g, 'a.0.0.0')
1026 assertInvalid(g, '1.2.3.4.5')
1027 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001028
Serhiy Storchaka43767632013-11-03 21:31:38 +02001029 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1030 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001031 def testIPv6toString(self):
1032 try:
1033 from socket import inet_pton, AF_INET6, has_ipv6
1034 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001035 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001036 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001037 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001038
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001039 if sys.platform == "win32":
1040 try:
1041 inet_pton(AF_INET6, '::')
1042 except OSError as e:
1043 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001044 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001045
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001046 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001047 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001048 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001049 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001050
Ezio Melottib3aedd42010-11-20 19:04:17 +00001051 self.assertEqual(b'\x00' * 16, f('::'))
1052 self.assertEqual(b'\x00' * 16, f('0::0'))
1053 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1054 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001055 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 +00001056 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1057 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001058 self.assertEqual(
1059 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1060 f('ad42:abc::127:0:254:2')
1061 )
1062 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1063 assertInvalid('0x20::')
1064 assertInvalid(':::')
1065 assertInvalid('::0::')
1066 assertInvalid('1::abc::')
1067 assertInvalid('1::abc::def')
1068 assertInvalid('1:2:3:4:5:6:')
1069 assertInvalid('1:2:3:4:5:6')
1070 assertInvalid('1:2:3:4:5:6:7:8:')
1071 assertInvalid('1:2:3:4:5:6:7:8:0')
1072
1073 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1074 f('::254.42.23.64')
1075 )
1076 self.assertEqual(
1077 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1078 f('42::a29b:254.42.23.64')
1079 )
1080 self.assertEqual(
1081 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1082 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1083 )
1084 assertInvalid('255.254.253.252')
1085 assertInvalid('1::260.2.3.0')
1086 assertInvalid('1::0.be.e.0')
1087 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1088 assertInvalid('::1.2.3.4:0')
1089 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001090
Serhiy Storchaka43767632013-11-03 21:31:38 +02001091 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1092 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001093 def testStringToIPv4(self):
1094 from socket import inet_ntoa as f, inet_ntop, AF_INET
1095 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001096 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001097 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001098 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001099
Ezio Melottib3aedd42010-11-20 19:04:17 +00001100 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1101 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1102 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1103 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001104 assertInvalid(f, b'\x00' * 3)
1105 assertInvalid(f, b'\x00' * 5)
1106 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001107 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001108
Ezio Melottib3aedd42010-11-20 19:04:17 +00001109 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1110 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1111 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001112 assertInvalid(g, b'\x00' * 3)
1113 assertInvalid(g, b'\x00' * 5)
1114 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001115 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001116
Serhiy Storchaka43767632013-11-03 21:31:38 +02001117 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1118 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001119 def testStringToIPv6(self):
1120 try:
1121 from socket import inet_ntop, AF_INET6, has_ipv6
1122 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001123 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001124 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001125 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001126
1127 if sys.platform == "win32":
1128 try:
1129 inet_ntop(AF_INET6, b'\x00' * 16)
1130 except OSError as e:
1131 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001132 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001133
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001134 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001135 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001136 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001137 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001138
Ezio Melottib3aedd42010-11-20 19:04:17 +00001139 self.assertEqual('::', f(b'\x00' * 16))
1140 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1141 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001142 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001143 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 +00001144 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001145 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001146
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001147 assertInvalid(b'\x12' * 15)
1148 assertInvalid(b'\x12' * 17)
1149 assertInvalid(b'\x12' * 4)
1150
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001151 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001152
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001153 def testSockName(self):
1154 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001155 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001156 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001157 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001158 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001159 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001160 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1161 # it reasonable to get the host's addr in addition to 0.0.0.0.
1162 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001163 try:
1164 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001165 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001166 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001167 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001168 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001169 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001170
1171 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001172 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001173 # We know a socket should start without reuse==0
1174 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001175 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001176 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001177 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001178
1179 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001180 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001181 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001182 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001183 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1184 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001185 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001186
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001187 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001188 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001189 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1190 sock.settimeout(1)
1191 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001192 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001193
Martin Panter50ab1a32016-04-11 00:38:12 +00001194 def testCloseException(self):
1195 sock = socket.socket()
1196 socket.socket(fileno=sock.fileno()).close()
1197 try:
1198 sock.close()
1199 except OSError as err:
1200 # Winsock apparently raises ENOTSOCK
1201 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1202 else:
1203 self.fail("close() should raise EBADF/ENOTSOCK")
1204
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001205 def testNewAttributes(self):
1206 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001207
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001208 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1209 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001210 if hasattr(socket, 'SOCK_CLOEXEC'):
1211 self.assertIn(sock.type,
1212 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1213 socket.SOCK_STREAM))
1214 else:
1215 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001216 self.assertEqual(sock.proto, 0)
1217 sock.close()
1218
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001219 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001220 sock = socket.socket()
1221 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001222 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001223 big_port = port + 65536
1224 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001225 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1226 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1227 # Since find_unused_port() is inherently subject to race conditions, we
1228 # call it a couple times if necessary.
1229 for i in itertools.count():
1230 port = support.find_unused_port()
1231 try:
1232 sock.bind((HOST, port))
1233 except OSError as e:
1234 if e.errno != errno.EADDRINUSE or i == 5:
1235 raise
1236 else:
1237 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001238
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001239 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001240 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001241 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1242 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1243 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1244 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001245 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1246 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001247 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001248 self.assertRaises(ValueError, s.ioctl, -1, None)
1249 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001250
Steve Dowerea93ac02016-06-17 12:52:18 -07001251 @unittest.skipUnless(os.name == "nt", "Windows specific")
1252 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1253 'Loopback fast path support required for this test')
1254 def test_sio_loopback_fast_path(self):
1255 s = socket.socket()
1256 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001257 try:
1258 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1259 except OSError as exc:
1260 WSAEOPNOTSUPP = 10045
1261 if exc.winerror == WSAEOPNOTSUPP:
1262 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1263 "doesn't implemented in this Windows version")
1264 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001265 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1266
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001267 def testGetaddrinfo(self):
1268 try:
1269 socket.getaddrinfo('localhost', 80)
1270 except socket.gaierror as err:
1271 if err.errno == socket.EAI_SERVICE:
1272 # see http://bugs.python.org/issue1282647
1273 self.skipTest("buggy libc version")
1274 raise
1275 # len of every sequence is supposed to be == 5
1276 for info in socket.getaddrinfo(HOST, None):
1277 self.assertEqual(len(info), 5)
1278 # host can be a domain name, a string representation of an
1279 # IPv4/v6 address or None
1280 socket.getaddrinfo('localhost', 80)
1281 socket.getaddrinfo('127.0.0.1', 80)
1282 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001283 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001284 socket.getaddrinfo('::1', 80)
1285 # port can be a string service name such as "http", a numeric
1286 # port number or None
1287 socket.getaddrinfo(HOST, "http")
1288 socket.getaddrinfo(HOST, 80)
1289 socket.getaddrinfo(HOST, None)
1290 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001291 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1292 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001293 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001294 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1295 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001296 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001297 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1298 for _, socktype, _, _, _ in infos:
1299 self.assertEqual(socktype, socket.SOCK_STREAM)
1300 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001301 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001302 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1303 # a server willing to support both IPv4 and IPv6 will
1304 # usually do this
1305 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1306 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001307 # test keyword arguments
1308 a = socket.getaddrinfo(HOST, None)
1309 b = socket.getaddrinfo(host=HOST, port=None)
1310 self.assertEqual(a, b)
1311 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1312 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1313 self.assertEqual(a, b)
1314 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1315 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1316 self.assertEqual(a, b)
1317 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1318 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1319 self.assertEqual(a, b)
1320 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1321 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1322 self.assertEqual(a, b)
1323 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1324 socket.AI_PASSIVE)
1325 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1326 type=socket.SOCK_STREAM, proto=0,
1327 flags=socket.AI_PASSIVE)
1328 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001329 # Issue #6697.
1330 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001331
Ned Deilyb24f4812014-02-13 22:50:42 -08001332 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001333 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001334 try:
1335 # The arguments here are undefined and the call may succeed
1336 # or fail. All we care here is that it doesn't segfault.
1337 socket.getaddrinfo("localhost", None, 0, 0, 0,
1338 socket.AI_NUMERICSERV)
1339 except socket.gaierror:
1340 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001341
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001342 def test_getnameinfo(self):
1343 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001344 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001345
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001346 @unittest.skipUnless(support.is_resource_enabled('network'),
1347 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001348 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001349 # Check for internet access before running test
1350 # (issue #12804, issue #25138).
1351 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001352 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001353
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001354 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001355 domain = 'испытание.pythontest.net'
1356 socket.gethostbyname(domain)
1357 socket.gethostbyname_ex(domain)
1358 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001359 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1360 # have a reverse entry yet
1361 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001362
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001363 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001364 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001365 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1366 self.skipTest("signal.alarm and socket.socketpair required for this test")
1367 # Our signal handlers clobber the C errno by calling a math function
1368 # with an invalid domain value.
1369 def ok_handler(*args):
1370 self.assertRaises(ValueError, math.acosh, 0)
1371 def raising_handler(*args):
1372 self.assertRaises(ValueError, math.acosh, 0)
1373 1 // 0
1374 c, s = socket.socketpair()
1375 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1376 try:
1377 if with_timeout:
1378 # Just above the one second minimum for signal.alarm
1379 c.settimeout(1.5)
1380 with self.assertRaises(ZeroDivisionError):
1381 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001382 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001383 if with_timeout:
1384 signal.signal(signal.SIGALRM, ok_handler)
1385 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001386 self.assertRaises(socket.timeout, c.sendall,
1387 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001388 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001389 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001390 signal.signal(signal.SIGALRM, old_alarm)
1391 c.close()
1392 s.close()
1393
1394 def test_sendall_interrupted(self):
1395 self.check_sendall_interrupted(False)
1396
1397 def test_sendall_interrupted_with_timeout(self):
1398 self.check_sendall_interrupted(True)
1399
Antoine Pitroue033e062010-10-29 10:38:18 +00001400 def test_dealloc_warn(self):
1401 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1402 r = repr(sock)
1403 with self.assertWarns(ResourceWarning) as cm:
1404 sock = None
1405 support.gc_collect()
1406 self.assertIn(r, str(cm.warning.args[0]))
1407 # An open socket file object gets dereferenced after the socket
1408 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1409 f = sock.makefile('rb')
1410 r = repr(sock)
1411 sock = None
1412 support.gc_collect()
1413 with self.assertWarns(ResourceWarning):
1414 f = None
1415 support.gc_collect()
1416
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001417 def test_name_closed_socketio(self):
1418 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1419 fp = sock.makefile("rb")
1420 fp.close()
1421 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1422
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001423 def test_unusable_closed_socketio(self):
1424 with socket.socket() as sock:
1425 fp = sock.makefile("rb", buffering=0)
1426 self.assertTrue(fp.readable())
1427 self.assertFalse(fp.writable())
1428 self.assertFalse(fp.seekable())
1429 fp.close()
1430 self.assertRaises(ValueError, fp.readable)
1431 self.assertRaises(ValueError, fp.writable)
1432 self.assertRaises(ValueError, fp.seekable)
1433
Berker Peksag3fe64d02016-02-18 17:34:00 +02001434 def test_makefile_mode(self):
1435 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1436 with self.subTest(mode=mode):
1437 with socket.socket() as sock:
1438 with sock.makefile(mode) as fp:
1439 self.assertEqual(fp.mode, mode)
1440
1441 def test_makefile_invalid_mode(self):
1442 for mode in 'rt', 'x', '+', 'a':
1443 with self.subTest(mode=mode):
1444 with socket.socket() as sock:
1445 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1446 sock.makefile(mode)
1447
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001448 def test_pickle(self):
1449 sock = socket.socket()
1450 with sock:
1451 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1452 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001453 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1454 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1455 self.assertEqual(family, socket.AF_INET)
1456 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1457 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001458
Serhiy Storchaka78980432013-01-15 01:12:17 +02001459 def test_listen_backlog(self):
1460 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001461 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1462 srv.bind((HOST, 0))
1463 srv.listen(backlog)
1464
1465 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001466 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001467 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001468
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001469 @support.cpython_only
1470 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001471 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001472 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001473 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1474 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001475 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001476 srv.close()
1477
Charles-François Natali42663332012-01-02 15:57:30 +01001478 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001479 def test_flowinfo(self):
1480 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001481 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001482 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001483 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001484
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001485 def test_str_for_enums(self):
1486 # Make sure that the AF_* and SOCK_* constants have enum-like string
1487 # reprs.
1488 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1489 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001490 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001491
1492 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1493 def test_uknown_socket_family_repr(self):
1494 # Test that when created with a family that's not one of the known
1495 # AF_*/SOCK_* constants, socket.family just returns the number.
1496 #
1497 # To do this we fool socket.socket into believing it already has an
1498 # open fd because on this path it doesn't actually verify the family and
1499 # type and populates the socket object.
1500 #
1501 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001502 fd, path = tempfile.mkstemp()
1503 self.addCleanup(os.unlink, path)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001504 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1505 self.assertEqual(s.family, 42424)
1506 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001507
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001508 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1509 def test__sendfile_use_sendfile(self):
1510 class File:
1511 def __init__(self, fd):
1512 self.fd = fd
1513
1514 def fileno(self):
1515 return self.fd
1516 with socket.socket() as sock:
1517 fd = os.open(os.curdir, os.O_RDONLY)
1518 os.close(fd)
1519 with self.assertRaises(socket._GiveupOnSendfile):
1520 sock._sendfile_use_sendfile(File(fd))
1521 with self.assertRaises(OverflowError):
1522 sock._sendfile_use_sendfile(File(2**1000))
1523 with self.assertRaises(TypeError):
1524 sock._sendfile_use_sendfile(File(None))
1525
1526
Charles-François Natali47413c12011-10-06 19:47:44 +02001527@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1528class BasicCANTest(unittest.TestCase):
1529
1530 def testCrucialConstants(self):
1531 socket.AF_CAN
1532 socket.PF_CAN
1533 socket.CAN_RAW
1534
Charles-François Natali773e42d2013-02-05 19:42:01 +01001535 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1536 'socket.CAN_BCM required for this test.')
1537 def testBCMConstants(self):
1538 socket.CAN_BCM
1539
1540 # opcodes
1541 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1542 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1543 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1544 socket.CAN_BCM_TX_SEND # send one CAN frame
1545 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1546 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1547 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1548 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1549 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1550 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1551 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1552 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1553
Charles-François Natali47413c12011-10-06 19:47:44 +02001554 def testCreateSocket(self):
1555 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1556 pass
1557
Charles-François Natali773e42d2013-02-05 19:42:01 +01001558 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1559 'socket.CAN_BCM required for this test.')
1560 def testCreateBCMSocket(self):
1561 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1562 pass
1563
Charles-François Natali47413c12011-10-06 19:47:44 +02001564 def testBindAny(self):
1565 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1566 s.bind(('', ))
1567
1568 def testTooLongInterfaceName(self):
1569 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1570 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001571 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001572 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001573
1574 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1575 'socket.CAN_RAW_LOOPBACK required for this test.')
1576 def testLoopback(self):
1577 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1578 for loopback in (0, 1):
1579 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1580 loopback)
1581 self.assertEqual(loopback,
1582 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1583
1584 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1585 'socket.CAN_RAW_FILTER required for this test.')
1586 def testFilter(self):
1587 can_id, can_mask = 0x200, 0x700
1588 can_filter = struct.pack("=II", can_id, can_mask)
1589 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1590 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1591 self.assertEqual(can_filter,
1592 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001593 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001594
1595
1596@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001597@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001598class CANTest(ThreadedCANSocketTest):
1599
Charles-François Natali47413c12011-10-06 19:47:44 +02001600 def __init__(self, methodName='runTest'):
1601 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1602
1603 @classmethod
1604 def build_can_frame(cls, can_id, data):
1605 """Build a CAN frame."""
1606 can_dlc = len(data)
1607 data = data.ljust(8, b'\x00')
1608 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1609
1610 @classmethod
1611 def dissect_can_frame(cls, frame):
1612 """Dissect a CAN frame."""
1613 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1614 return (can_id, can_dlc, data[:can_dlc])
1615
1616 def testSendFrame(self):
1617 cf, addr = self.s.recvfrom(self.bufsize)
1618 self.assertEqual(self.cf, cf)
1619 self.assertEqual(addr[0], self.interface)
1620 self.assertEqual(addr[1], socket.AF_CAN)
1621
1622 def _testSendFrame(self):
1623 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1624 self.cli.send(self.cf)
1625
1626 def testSendMaxFrame(self):
1627 cf, addr = self.s.recvfrom(self.bufsize)
1628 self.assertEqual(self.cf, cf)
1629
1630 def _testSendMaxFrame(self):
1631 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1632 self.cli.send(self.cf)
1633
1634 def testSendMultiFrames(self):
1635 cf, addr = self.s.recvfrom(self.bufsize)
1636 self.assertEqual(self.cf1, cf)
1637
1638 cf, addr = self.s.recvfrom(self.bufsize)
1639 self.assertEqual(self.cf2, cf)
1640
1641 def _testSendMultiFrames(self):
1642 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1643 self.cli.send(self.cf1)
1644
1645 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1646 self.cli.send(self.cf2)
1647
Charles-François Natali773e42d2013-02-05 19:42:01 +01001648 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1649 'socket.CAN_BCM required for this test.')
1650 def _testBCM(self):
1651 cf, addr = self.cli.recvfrom(self.bufsize)
1652 self.assertEqual(self.cf, cf)
1653 can_id, can_dlc, data = self.dissect_can_frame(cf)
1654 self.assertEqual(self.can_id, can_id)
1655 self.assertEqual(self.data, data)
1656
1657 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1658 'socket.CAN_BCM required for this test.')
1659 def testBCM(self):
1660 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1661 self.addCleanup(bcm.close)
1662 bcm.connect((self.interface,))
1663 self.can_id = 0x123
1664 self.data = bytes([0xc0, 0xff, 0xee])
1665 self.cf = self.build_can_frame(self.can_id, self.data)
1666 opcode = socket.CAN_BCM_TX_SEND
1667 flags = 0
1668 count = 0
1669 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1670 bcm_can_id = 0x0222
1671 nframes = 1
1672 assert len(self.cf) == 16
1673 header = struct.pack(self.bcm_cmd_msg_fmt,
1674 opcode,
1675 flags,
1676 count,
1677 ival1_seconds,
1678 ival1_usec,
1679 ival2_seconds,
1680 ival2_usec,
1681 bcm_can_id,
1682 nframes,
1683 )
1684 header_plus_frame = header + self.cf
1685 bytes_sent = bcm.send(header_plus_frame)
1686 self.assertEqual(bytes_sent, len(header_plus_frame))
1687
Charles-François Natali47413c12011-10-06 19:47:44 +02001688
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001689@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1690class BasicRDSTest(unittest.TestCase):
1691
1692 def testCrucialConstants(self):
1693 socket.AF_RDS
1694 socket.PF_RDS
1695
1696 def testCreateSocket(self):
1697 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1698 pass
1699
1700 def testSocketBufferSize(self):
1701 bufsize = 16384
1702 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1703 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1704 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1705
1706
1707@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1708@unittest.skipUnless(thread, 'Threading required for this test.')
1709class RDSTest(ThreadedRDSSocketTest):
1710
1711 def __init__(self, methodName='runTest'):
1712 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1713
Charles-François Natali240c55f2011-11-10 20:33:36 +01001714 def setUp(self):
1715 super().setUp()
1716 self.evt = threading.Event()
1717
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001718 def testSendAndRecv(self):
1719 data, addr = self.serv.recvfrom(self.bufsize)
1720 self.assertEqual(self.data, data)
1721 self.assertEqual(self.cli_addr, addr)
1722
1723 def _testSendAndRecv(self):
1724 self.data = b'spam'
1725 self.cli.sendto(self.data, 0, (HOST, self.port))
1726
1727 def testPeek(self):
1728 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1729 self.assertEqual(self.data, data)
1730 data, addr = self.serv.recvfrom(self.bufsize)
1731 self.assertEqual(self.data, data)
1732
1733 def _testPeek(self):
1734 self.data = b'spam'
1735 self.cli.sendto(self.data, 0, (HOST, self.port))
1736
1737 @requireAttrs(socket.socket, 'recvmsg')
1738 def testSendAndRecvMsg(self):
1739 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1740 self.assertEqual(self.data, data)
1741
1742 @requireAttrs(socket.socket, 'sendmsg')
1743 def _testSendAndRecvMsg(self):
1744 self.data = b'hello ' * 10
1745 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1746
1747 def testSendAndRecvMulti(self):
1748 data, addr = self.serv.recvfrom(self.bufsize)
1749 self.assertEqual(self.data1, data)
1750
1751 data, addr = self.serv.recvfrom(self.bufsize)
1752 self.assertEqual(self.data2, data)
1753
1754 def _testSendAndRecvMulti(self):
1755 self.data1 = b'bacon'
1756 self.cli.sendto(self.data1, 0, (HOST, self.port))
1757
1758 self.data2 = b'egg'
1759 self.cli.sendto(self.data2, 0, (HOST, self.port))
1760
1761 def testSelect(self):
1762 r, w, x = select.select([self.serv], [], [], 3.0)
1763 self.assertIn(self.serv, r)
1764 data, addr = self.serv.recvfrom(self.bufsize)
1765 self.assertEqual(self.data, data)
1766
1767 def _testSelect(self):
1768 self.data = b'select'
1769 self.cli.sendto(self.data, 0, (HOST, self.port))
1770
1771 def testCongestion(self):
1772 # wait until the sender is done
1773 self.evt.wait()
1774
1775 def _testCongestion(self):
1776 # test the behavior in case of congestion
1777 self.data = b'fill'
1778 self.cli.setblocking(False)
1779 try:
1780 # try to lower the receiver's socket buffer size
1781 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1782 except OSError:
1783 pass
1784 with self.assertRaises(OSError) as cm:
1785 try:
1786 # fill the receiver's socket buffer
1787 while True:
1788 self.cli.sendto(self.data, 0, (HOST, self.port))
1789 finally:
1790 # signal the receiver we're done
1791 self.evt.set()
1792 # sendto() should have failed with ENOBUFS
1793 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1794 # and we should have received a congestion notification through poll
1795 r, w, x = select.select([self.serv], [], [], 3.0)
1796 self.assertIn(self.serv, r)
1797
1798
Victor Stinner45df8202010-04-28 22:31:17 +00001799@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001800class BasicTCPTest(SocketConnectedTest):
1801
1802 def __init__(self, methodName='runTest'):
1803 SocketConnectedTest.__init__(self, methodName=methodName)
1804
1805 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001806 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001807 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001808 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001809
1810 def _testRecv(self):
1811 self.serv_conn.send(MSG)
1812
1813 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001814 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001815 seg1 = self.cli_conn.recv(len(MSG) - 3)
1816 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001817 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001818 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001819
1820 def _testOverFlowRecv(self):
1821 self.serv_conn.send(MSG)
1822
1823 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001824 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001825 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001826 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001827
1828 def _testRecvFrom(self):
1829 self.serv_conn.send(MSG)
1830
1831 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001832 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001833 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1834 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001835 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001836 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001837
1838 def _testOverFlowRecvFrom(self):
1839 self.serv_conn.send(MSG)
1840
1841 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001842 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001843 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001844 while 1:
1845 read = self.cli_conn.recv(1024)
1846 if not read:
1847 break
Guido van Rossume531e292002-08-08 20:28:34 +00001848 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001849 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001850
1851 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001852 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001853 self.serv_conn.sendall(big_chunk)
1854
1855 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001856 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001857 fd = self.cli_conn.fileno()
1858 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001859 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001860 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001861 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001862 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001863
1864 def _testFromFd(self):
1865 self.serv_conn.send(MSG)
1866
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001867 def testDup(self):
1868 # Testing dup()
1869 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001870 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001871 msg = sock.recv(1024)
1872 self.assertEqual(msg, MSG)
1873
1874 def _testDup(self):
1875 self.serv_conn.send(MSG)
1876
Guido van Rossum24e4af82002-06-12 19:18:08 +00001877 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001878 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001879 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001880 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001881 # wait for _testShutdown to finish: on OS X, when the server
1882 # closes the connection the client also becomes disconnected,
1883 # and the client's shutdown call will fail. (Issue #4397.)
1884 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001885
1886 def _testShutdown(self):
1887 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001888 self.serv_conn.shutdown(2)
1889
1890 testShutdown_overflow = support.cpython_only(testShutdown)
1891
1892 @support.cpython_only
1893 def _testShutdown_overflow(self):
1894 import _testcapi
1895 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001896 # Issue 15989
1897 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1898 _testcapi.INT_MAX + 1)
1899 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1900 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001901 self.serv_conn.shutdown(2)
1902
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001903 def testDetach(self):
1904 # Testing detach()
1905 fileno = self.cli_conn.fileno()
1906 f = self.cli_conn.detach()
1907 self.assertEqual(f, fileno)
1908 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001909 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001910 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001911 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001912 # ...but we can create another socket using the (still open)
1913 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001914 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001915 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001916 msg = sock.recv(1024)
1917 self.assertEqual(msg, MSG)
1918
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001919 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001920 self.serv_conn.send(MSG)
1921
Victor Stinner45df8202010-04-28 22:31:17 +00001922@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001923class BasicUDPTest(ThreadedUDPSocketTest):
1924
1925 def __init__(self, methodName='runTest'):
1926 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1927
1928 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001929 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001930 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001931 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001932
1933 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001934 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001935
Guido van Rossum1c938012002-06-12 21:17:20 +00001936 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001937 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001938 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001939 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001940
Guido van Rossum1c938012002-06-12 21:17:20 +00001941 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001942 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001943
Guido van Rossumd8faa362007-04-27 19:54:29 +00001944 def testRecvFromNegative(self):
1945 # Negative lengths passed to recvfrom should give ValueError.
1946 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1947
1948 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001949 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001950
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001951# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1952# same test code is used with different families and types of socket
1953# (e.g. stream, datagram), and tests using recvmsg() are repeated
1954# using recvmsg_into().
1955#
1956# The generic test classes such as SendmsgTests and
1957# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1958# supplied with sockets cli_sock and serv_sock representing the
1959# client's and the server's end of the connection respectively, and
1960# attributes cli_addr and serv_addr holding their (numeric where
1961# appropriate) addresses.
1962#
1963# The final concrete test classes combine these with subclasses of
1964# SocketTestBase which set up client and server sockets of a specific
1965# type, and with subclasses of SendrecvmsgBase such as
1966# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1967# sockets to cli_sock and serv_sock and override the methods and
1968# attributes of SendrecvmsgBase to fill in destination addresses if
1969# needed when sending, check for specific flags in msg_flags, etc.
1970#
1971# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1972# recvmsg_into().
1973
1974# XXX: like the other datagram (UDP) tests in this module, the code
1975# here assumes that datagram delivery on the local machine will be
1976# reliable.
1977
1978class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1979 # Base class for sendmsg()/recvmsg() tests.
1980
1981 # Time in seconds to wait before considering a test failed, or
1982 # None for no timeout. Not all tests actually set a timeout.
1983 fail_timeout = 3.0
1984
1985 def setUp(self):
1986 self.misc_event = threading.Event()
1987 super().setUp()
1988
1989 def sendToServer(self, msg):
1990 # Send msg to the server.
1991 return self.cli_sock.send(msg)
1992
1993 # Tuple of alternative default arguments for sendmsg() when called
1994 # via sendmsgToServer() (e.g. to include a destination address).
1995 sendmsg_to_server_defaults = ()
1996
1997 def sendmsgToServer(self, *args):
1998 # Call sendmsg() on self.cli_sock with the given arguments,
1999 # filling in any arguments which are not supplied with the
2000 # corresponding items of self.sendmsg_to_server_defaults, if
2001 # any.
2002 return self.cli_sock.sendmsg(
2003 *(args + self.sendmsg_to_server_defaults[len(args):]))
2004
2005 def doRecvmsg(self, sock, bufsize, *args):
2006 # Call recvmsg() on sock with given arguments and return its
2007 # result. Should be used for tests which can use either
2008 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2009 # this method with one which emulates it using recvmsg_into(),
2010 # thus allowing the same test to be used for both methods.
2011 result = sock.recvmsg(bufsize, *args)
2012 self.registerRecvmsgResult(result)
2013 return result
2014
2015 def registerRecvmsgResult(self, result):
2016 # Called by doRecvmsg() with the return value of recvmsg() or
2017 # recvmsg_into(). Can be overridden to arrange cleanup based
2018 # on the returned ancillary data, for instance.
2019 pass
2020
2021 def checkRecvmsgAddress(self, addr1, addr2):
2022 # Called to compare the received address with the address of
2023 # the peer.
2024 self.assertEqual(addr1, addr2)
2025
2026 # Flags that are normally unset in msg_flags
2027 msg_flags_common_unset = 0
2028 for name in ("MSG_CTRUNC", "MSG_OOB"):
2029 msg_flags_common_unset |= getattr(socket, name, 0)
2030
2031 # Flags that are normally set
2032 msg_flags_common_set = 0
2033
2034 # Flags set when a complete record has been received (e.g. MSG_EOR
2035 # for SCTP)
2036 msg_flags_eor_indicator = 0
2037
2038 # Flags set when a complete record has not been received
2039 # (e.g. MSG_TRUNC for datagram sockets)
2040 msg_flags_non_eor_indicator = 0
2041
2042 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2043 # Method to check the value of msg_flags returned by recvmsg[_into]().
2044 #
2045 # Checks that all bits in msg_flags_common_set attribute are
2046 # set in "flags" and all bits in msg_flags_common_unset are
2047 # unset.
2048 #
2049 # The "eor" argument specifies whether the flags should
2050 # indicate that a full record (or datagram) has been received.
2051 # If "eor" is None, no checks are done; otherwise, checks
2052 # that:
2053 #
2054 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2055 # set and all bits in msg_flags_non_eor_indicator are unset
2056 #
2057 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2058 # are set and all bits in msg_flags_eor_indicator are unset
2059 #
2060 # If "checkset" and/or "checkunset" are supplied, they require
2061 # the given bits to be set or unset respectively, overriding
2062 # what the attributes require for those bits.
2063 #
2064 # If any bits are set in "ignore", they will not be checked,
2065 # regardless of the other inputs.
2066 #
2067 # Will raise Exception if the inputs require a bit to be both
2068 # set and unset, and it is not ignored.
2069
2070 defaultset = self.msg_flags_common_set
2071 defaultunset = self.msg_flags_common_unset
2072
2073 if eor:
2074 defaultset |= self.msg_flags_eor_indicator
2075 defaultunset |= self.msg_flags_non_eor_indicator
2076 elif eor is not None:
2077 defaultset |= self.msg_flags_non_eor_indicator
2078 defaultunset |= self.msg_flags_eor_indicator
2079
2080 # Function arguments override defaults
2081 defaultset &= ~checkunset
2082 defaultunset &= ~checkset
2083
2084 # Merge arguments with remaining defaults, and check for conflicts
2085 checkset |= defaultset
2086 checkunset |= defaultunset
2087 inboth = checkset & checkunset & ~ignore
2088 if inboth:
2089 raise Exception("contradictory set, unset requirements for flags "
2090 "{0:#x}".format(inboth))
2091
2092 # Compare with given msg_flags value
2093 mask = (checkset | checkunset) & ~ignore
2094 self.assertEqual(flags & mask, checkset & mask)
2095
2096
2097class RecvmsgIntoMixin(SendrecvmsgBase):
2098 # Mixin to implement doRecvmsg() using recvmsg_into().
2099
2100 def doRecvmsg(self, sock, bufsize, *args):
2101 buf = bytearray(bufsize)
2102 result = sock.recvmsg_into([buf], *args)
2103 self.registerRecvmsgResult(result)
2104 self.assertGreaterEqual(result[0], 0)
2105 self.assertLessEqual(result[0], bufsize)
2106 return (bytes(buf[:result[0]]),) + result[1:]
2107
2108
2109class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2110 # Defines flags to be checked in msg_flags for datagram sockets.
2111
2112 @property
2113 def msg_flags_non_eor_indicator(self):
2114 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2115
2116
2117class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2118 # Defines flags to be checked in msg_flags for SCTP sockets.
2119
2120 @property
2121 def msg_flags_eor_indicator(self):
2122 return super().msg_flags_eor_indicator | socket.MSG_EOR
2123
2124
2125class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2126 # Base class for tests on connectionless-mode sockets. Users must
2127 # supply sockets on attributes cli and serv to be mapped to
2128 # cli_sock and serv_sock respectively.
2129
2130 @property
2131 def serv_sock(self):
2132 return self.serv
2133
2134 @property
2135 def cli_sock(self):
2136 return self.cli
2137
2138 @property
2139 def sendmsg_to_server_defaults(self):
2140 return ([], [], 0, self.serv_addr)
2141
2142 def sendToServer(self, msg):
2143 return self.cli_sock.sendto(msg, self.serv_addr)
2144
2145
2146class SendrecvmsgConnectedBase(SendrecvmsgBase):
2147 # Base class for tests on connected sockets. Users must supply
2148 # sockets on attributes serv_conn and cli_conn (representing the
2149 # connections *to* the server and the client), to be mapped to
2150 # cli_sock and serv_sock respectively.
2151
2152 @property
2153 def serv_sock(self):
2154 return self.cli_conn
2155
2156 @property
2157 def cli_sock(self):
2158 return self.serv_conn
2159
2160 def checkRecvmsgAddress(self, addr1, addr2):
2161 # Address is currently "unspecified" for a connected socket,
2162 # so we don't examine it
2163 pass
2164
2165
2166class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2167 # Base class to set a timeout on server's socket.
2168
2169 def setUp(self):
2170 super().setUp()
2171 self.serv_sock.settimeout(self.fail_timeout)
2172
2173
2174class SendmsgTests(SendrecvmsgServerTimeoutBase):
2175 # Tests for sendmsg() which can use any socket type and do not
2176 # involve recvmsg() or recvmsg_into().
2177
2178 def testSendmsg(self):
2179 # Send a simple message with sendmsg().
2180 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2181
2182 def _testSendmsg(self):
2183 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2184
2185 def testSendmsgDataGenerator(self):
2186 # Send from buffer obtained from a generator (not a sequence).
2187 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2188
2189 def _testSendmsgDataGenerator(self):
2190 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2191 len(MSG))
2192
2193 def testSendmsgAncillaryGenerator(self):
2194 # Gather (empty) ancillary data from a generator.
2195 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2196
2197 def _testSendmsgAncillaryGenerator(self):
2198 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2199 len(MSG))
2200
2201 def testSendmsgArray(self):
2202 # Send data from an array instead of the usual bytes object.
2203 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2204
2205 def _testSendmsgArray(self):
2206 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2207 len(MSG))
2208
2209 def testSendmsgGather(self):
2210 # Send message data from more than one buffer (gather write).
2211 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2212
2213 def _testSendmsgGather(self):
2214 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2215
2216 def testSendmsgBadArgs(self):
2217 # Check that sendmsg() rejects invalid arguments.
2218 self.assertEqual(self.serv_sock.recv(1000), b"done")
2219
2220 def _testSendmsgBadArgs(self):
2221 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2222 self.assertRaises(TypeError, self.sendmsgToServer,
2223 b"not in an iterable")
2224 self.assertRaises(TypeError, self.sendmsgToServer,
2225 object())
2226 self.assertRaises(TypeError, self.sendmsgToServer,
2227 [object()])
2228 self.assertRaises(TypeError, self.sendmsgToServer,
2229 [MSG, object()])
2230 self.assertRaises(TypeError, self.sendmsgToServer,
2231 [MSG], object())
2232 self.assertRaises(TypeError, self.sendmsgToServer,
2233 [MSG], [], object())
2234 self.assertRaises(TypeError, self.sendmsgToServer,
2235 [MSG], [], 0, object())
2236 self.sendToServer(b"done")
2237
2238 def testSendmsgBadCmsg(self):
2239 # Check that invalid ancillary data items are rejected.
2240 self.assertEqual(self.serv_sock.recv(1000), b"done")
2241
2242 def _testSendmsgBadCmsg(self):
2243 self.assertRaises(TypeError, self.sendmsgToServer,
2244 [MSG], [object()])
2245 self.assertRaises(TypeError, self.sendmsgToServer,
2246 [MSG], [(object(), 0, b"data")])
2247 self.assertRaises(TypeError, self.sendmsgToServer,
2248 [MSG], [(0, object(), b"data")])
2249 self.assertRaises(TypeError, self.sendmsgToServer,
2250 [MSG], [(0, 0, object())])
2251 self.assertRaises(TypeError, self.sendmsgToServer,
2252 [MSG], [(0, 0)])
2253 self.assertRaises(TypeError, self.sendmsgToServer,
2254 [MSG], [(0, 0, b"data", 42)])
2255 self.sendToServer(b"done")
2256
2257 @requireAttrs(socket, "CMSG_SPACE")
2258 def testSendmsgBadMultiCmsg(self):
2259 # Check that invalid ancillary data items are rejected when
2260 # more than one item is present.
2261 self.assertEqual(self.serv_sock.recv(1000), b"done")
2262
2263 @testSendmsgBadMultiCmsg.client_skip
2264 def _testSendmsgBadMultiCmsg(self):
2265 self.assertRaises(TypeError, self.sendmsgToServer,
2266 [MSG], [0, 0, b""])
2267 self.assertRaises(TypeError, self.sendmsgToServer,
2268 [MSG], [(0, 0, b""), object()])
2269 self.sendToServer(b"done")
2270
2271 def testSendmsgExcessCmsgReject(self):
2272 # Check that sendmsg() rejects excess ancillary data items
2273 # when the number that can be sent is limited.
2274 self.assertEqual(self.serv_sock.recv(1000), b"done")
2275
2276 def _testSendmsgExcessCmsgReject(self):
2277 if not hasattr(socket, "CMSG_SPACE"):
2278 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002279 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002280 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2281 self.assertIsNone(cm.exception.errno)
2282 self.sendToServer(b"done")
2283
2284 def testSendmsgAfterClose(self):
2285 # Check that sendmsg() fails on a closed socket.
2286 pass
2287
2288 def _testSendmsgAfterClose(self):
2289 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002290 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002291
2292
2293class SendmsgStreamTests(SendmsgTests):
2294 # Tests for sendmsg() which require a stream socket and do not
2295 # involve recvmsg() or recvmsg_into().
2296
2297 def testSendmsgExplicitNoneAddr(self):
2298 # Check that peer address can be specified as None.
2299 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2300
2301 def _testSendmsgExplicitNoneAddr(self):
2302 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2303
2304 def testSendmsgTimeout(self):
2305 # Check that timeout works with sendmsg().
2306 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2307 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2308
2309 def _testSendmsgTimeout(self):
2310 try:
2311 self.cli_sock.settimeout(0.03)
2312 with self.assertRaises(socket.timeout):
2313 while True:
2314 self.sendmsgToServer([b"a"*512])
2315 finally:
2316 self.misc_event.set()
2317
2318 # XXX: would be nice to have more tests for sendmsg flags argument.
2319
2320 # Linux supports MSG_DONTWAIT when sending, but in general, it
2321 # only works when receiving. Could add other platforms if they
2322 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002323 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002324 "MSG_DONTWAIT not known to work on this platform when "
2325 "sending")
2326 def testSendmsgDontWait(self):
2327 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2328 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2329 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2330
2331 @testSendmsgDontWait.client_skip
2332 def _testSendmsgDontWait(self):
2333 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002334 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002335 while True:
2336 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2337 self.assertIn(cm.exception.errno,
2338 (errno.EAGAIN, errno.EWOULDBLOCK))
2339 finally:
2340 self.misc_event.set()
2341
2342
2343class SendmsgConnectionlessTests(SendmsgTests):
2344 # Tests for sendmsg() which require a connectionless-mode
2345 # (e.g. datagram) socket, and do not involve recvmsg() or
2346 # recvmsg_into().
2347
2348 def testSendmsgNoDestAddr(self):
2349 # Check that sendmsg() fails when no destination address is
2350 # given for unconnected socket.
2351 pass
2352
2353 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002354 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002355 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002356 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002357 [MSG], [], 0, None)
2358
2359
2360class RecvmsgGenericTests(SendrecvmsgBase):
2361 # Tests for recvmsg() which can also be emulated using
2362 # recvmsg_into(), and can use any socket type.
2363
2364 def testRecvmsg(self):
2365 # Receive a simple message with recvmsg[_into]().
2366 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2367 self.assertEqual(msg, MSG)
2368 self.checkRecvmsgAddress(addr, self.cli_addr)
2369 self.assertEqual(ancdata, [])
2370 self.checkFlags(flags, eor=True)
2371
2372 def _testRecvmsg(self):
2373 self.sendToServer(MSG)
2374
2375 def testRecvmsgExplicitDefaults(self):
2376 # Test recvmsg[_into]() with default arguments provided explicitly.
2377 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2378 len(MSG), 0, 0)
2379 self.assertEqual(msg, MSG)
2380 self.checkRecvmsgAddress(addr, self.cli_addr)
2381 self.assertEqual(ancdata, [])
2382 self.checkFlags(flags, eor=True)
2383
2384 def _testRecvmsgExplicitDefaults(self):
2385 self.sendToServer(MSG)
2386
2387 def testRecvmsgShorter(self):
2388 # Receive a message smaller than buffer.
2389 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2390 len(MSG) + 42)
2391 self.assertEqual(msg, MSG)
2392 self.checkRecvmsgAddress(addr, self.cli_addr)
2393 self.assertEqual(ancdata, [])
2394 self.checkFlags(flags, eor=True)
2395
2396 def _testRecvmsgShorter(self):
2397 self.sendToServer(MSG)
2398
Charles-François Natali8619cd72011-10-03 19:43:15 +02002399 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2400 # datagram is received (issue #13001).
2401 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002402 def testRecvmsgTrunc(self):
2403 # Receive part of message, check for truncation indicators.
2404 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2405 len(MSG) - 3)
2406 self.assertEqual(msg, MSG[:-3])
2407 self.checkRecvmsgAddress(addr, self.cli_addr)
2408 self.assertEqual(ancdata, [])
2409 self.checkFlags(flags, eor=False)
2410
Charles-François Natali8619cd72011-10-03 19:43:15 +02002411 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002412 def _testRecvmsgTrunc(self):
2413 self.sendToServer(MSG)
2414
2415 def testRecvmsgShortAncillaryBuf(self):
2416 # Test ancillary data buffer too small to hold any ancillary data.
2417 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2418 len(MSG), 1)
2419 self.assertEqual(msg, MSG)
2420 self.checkRecvmsgAddress(addr, self.cli_addr)
2421 self.assertEqual(ancdata, [])
2422 self.checkFlags(flags, eor=True)
2423
2424 def _testRecvmsgShortAncillaryBuf(self):
2425 self.sendToServer(MSG)
2426
2427 def testRecvmsgLongAncillaryBuf(self):
2428 # Test large ancillary data buffer.
2429 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2430 len(MSG), 10240)
2431 self.assertEqual(msg, MSG)
2432 self.checkRecvmsgAddress(addr, self.cli_addr)
2433 self.assertEqual(ancdata, [])
2434 self.checkFlags(flags, eor=True)
2435
2436 def _testRecvmsgLongAncillaryBuf(self):
2437 self.sendToServer(MSG)
2438
2439 def testRecvmsgAfterClose(self):
2440 # Check that recvmsg[_into]() fails on a closed socket.
2441 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002442 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002443
2444 def _testRecvmsgAfterClose(self):
2445 pass
2446
2447 def testRecvmsgTimeout(self):
2448 # Check that timeout works.
2449 try:
2450 self.serv_sock.settimeout(0.03)
2451 self.assertRaises(socket.timeout,
2452 self.doRecvmsg, self.serv_sock, len(MSG))
2453 finally:
2454 self.misc_event.set()
2455
2456 def _testRecvmsgTimeout(self):
2457 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2458
2459 @requireAttrs(socket, "MSG_PEEK")
2460 def testRecvmsgPeek(self):
2461 # Check that MSG_PEEK in flags enables examination of pending
2462 # data without consuming it.
2463
2464 # Receive part of data with MSG_PEEK.
2465 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2466 len(MSG) - 3, 0,
2467 socket.MSG_PEEK)
2468 self.assertEqual(msg, MSG[:-3])
2469 self.checkRecvmsgAddress(addr, self.cli_addr)
2470 self.assertEqual(ancdata, [])
2471 # Ignoring MSG_TRUNC here (so this test is the same for stream
2472 # and datagram sockets). Some wording in POSIX seems to
2473 # suggest that it needn't be set when peeking, but that may
2474 # just be a slip.
2475 self.checkFlags(flags, eor=False,
2476 ignore=getattr(socket, "MSG_TRUNC", 0))
2477
2478 # Receive all data with MSG_PEEK.
2479 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2480 len(MSG), 0,
2481 socket.MSG_PEEK)
2482 self.assertEqual(msg, MSG)
2483 self.checkRecvmsgAddress(addr, self.cli_addr)
2484 self.assertEqual(ancdata, [])
2485 self.checkFlags(flags, eor=True)
2486
2487 # Check that the same data can still be received normally.
2488 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2489 self.assertEqual(msg, MSG)
2490 self.checkRecvmsgAddress(addr, self.cli_addr)
2491 self.assertEqual(ancdata, [])
2492 self.checkFlags(flags, eor=True)
2493
2494 @testRecvmsgPeek.client_skip
2495 def _testRecvmsgPeek(self):
2496 self.sendToServer(MSG)
2497
2498 @requireAttrs(socket.socket, "sendmsg")
2499 def testRecvmsgFromSendmsg(self):
2500 # Test receiving with recvmsg[_into]() when message is sent
2501 # using sendmsg().
2502 self.serv_sock.settimeout(self.fail_timeout)
2503 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2504 self.assertEqual(msg, MSG)
2505 self.checkRecvmsgAddress(addr, self.cli_addr)
2506 self.assertEqual(ancdata, [])
2507 self.checkFlags(flags, eor=True)
2508
2509 @testRecvmsgFromSendmsg.client_skip
2510 def _testRecvmsgFromSendmsg(self):
2511 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2512
2513
2514class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2515 # Tests which require a stream socket and can use either recvmsg()
2516 # or recvmsg_into().
2517
2518 def testRecvmsgEOF(self):
2519 # Receive end-of-stream indicator (b"", peer socket closed).
2520 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2521 self.assertEqual(msg, b"")
2522 self.checkRecvmsgAddress(addr, self.cli_addr)
2523 self.assertEqual(ancdata, [])
2524 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2525
2526 def _testRecvmsgEOF(self):
2527 self.cli_sock.close()
2528
2529 def testRecvmsgOverflow(self):
2530 # Receive a message in more than one chunk.
2531 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2532 len(MSG) - 3)
2533 self.checkRecvmsgAddress(addr, self.cli_addr)
2534 self.assertEqual(ancdata, [])
2535 self.checkFlags(flags, eor=False)
2536
2537 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2538 self.checkRecvmsgAddress(addr, self.cli_addr)
2539 self.assertEqual(ancdata, [])
2540 self.checkFlags(flags, eor=True)
2541
2542 msg = seg1 + seg2
2543 self.assertEqual(msg, MSG)
2544
2545 def _testRecvmsgOverflow(self):
2546 self.sendToServer(MSG)
2547
2548
2549class RecvmsgTests(RecvmsgGenericTests):
2550 # Tests for recvmsg() which can use any socket type.
2551
2552 def testRecvmsgBadArgs(self):
2553 # Check that recvmsg() rejects invalid arguments.
2554 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2555 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2556 -1, 0, 0)
2557 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2558 len(MSG), -1, 0)
2559 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2560 [bytearray(10)], 0, 0)
2561 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2562 object(), 0, 0)
2563 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2564 len(MSG), object(), 0)
2565 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2566 len(MSG), 0, object())
2567
2568 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2569 self.assertEqual(msg, MSG)
2570 self.checkRecvmsgAddress(addr, self.cli_addr)
2571 self.assertEqual(ancdata, [])
2572 self.checkFlags(flags, eor=True)
2573
2574 def _testRecvmsgBadArgs(self):
2575 self.sendToServer(MSG)
2576
2577
2578class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2579 # Tests for recvmsg_into() which can use any socket type.
2580
2581 def testRecvmsgIntoBadArgs(self):
2582 # Check that recvmsg_into() rejects invalid arguments.
2583 buf = bytearray(len(MSG))
2584 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2585 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2586 len(MSG), 0, 0)
2587 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2588 buf, 0, 0)
2589 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2590 [object()], 0, 0)
2591 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2592 [b"I'm not writable"], 0, 0)
2593 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2594 [buf, object()], 0, 0)
2595 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2596 [buf], -1, 0)
2597 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2598 [buf], object(), 0)
2599 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2600 [buf], 0, object())
2601
2602 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2603 self.assertEqual(nbytes, len(MSG))
2604 self.assertEqual(buf, bytearray(MSG))
2605 self.checkRecvmsgAddress(addr, self.cli_addr)
2606 self.assertEqual(ancdata, [])
2607 self.checkFlags(flags, eor=True)
2608
2609 def _testRecvmsgIntoBadArgs(self):
2610 self.sendToServer(MSG)
2611
2612 def testRecvmsgIntoGenerator(self):
2613 # Receive into buffer obtained from a generator (not a sequence).
2614 buf = bytearray(len(MSG))
2615 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2616 (o for o in [buf]))
2617 self.assertEqual(nbytes, len(MSG))
2618 self.assertEqual(buf, bytearray(MSG))
2619 self.checkRecvmsgAddress(addr, self.cli_addr)
2620 self.assertEqual(ancdata, [])
2621 self.checkFlags(flags, eor=True)
2622
2623 def _testRecvmsgIntoGenerator(self):
2624 self.sendToServer(MSG)
2625
2626 def testRecvmsgIntoArray(self):
2627 # Receive into an array rather than the usual bytearray.
2628 buf = array.array("B", [0] * len(MSG))
2629 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2630 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002631 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002632 self.checkRecvmsgAddress(addr, self.cli_addr)
2633 self.assertEqual(ancdata, [])
2634 self.checkFlags(flags, eor=True)
2635
2636 def _testRecvmsgIntoArray(self):
2637 self.sendToServer(MSG)
2638
2639 def testRecvmsgIntoScatter(self):
2640 # Receive into multiple buffers (scatter write).
2641 b1 = bytearray(b"----")
2642 b2 = bytearray(b"0123456789")
2643 b3 = bytearray(b"--------------")
2644 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2645 [b1, memoryview(b2)[2:9], b3])
2646 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2647 self.assertEqual(b1, bytearray(b"Mary"))
2648 self.assertEqual(b2, bytearray(b"01 had a 9"))
2649 self.assertEqual(b3, bytearray(b"little lamb---"))
2650 self.checkRecvmsgAddress(addr, self.cli_addr)
2651 self.assertEqual(ancdata, [])
2652 self.checkFlags(flags, eor=True)
2653
2654 def _testRecvmsgIntoScatter(self):
2655 self.sendToServer(b"Mary had a little lamb")
2656
2657
2658class CmsgMacroTests(unittest.TestCase):
2659 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2660 # assumptions used by sendmsg() and recvmsg[_into](), which share
2661 # code with these functions.
2662
2663 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002664 try:
2665 import _testcapi
2666 except ImportError:
2667 socklen_t_limit = 0x7fffffff
2668 else:
2669 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002670
2671 @requireAttrs(socket, "CMSG_LEN")
2672 def testCMSG_LEN(self):
2673 # Test CMSG_LEN() with various valid and invalid values,
2674 # checking the assumptions used by recvmsg() and sendmsg().
2675 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2676 values = list(range(257)) + list(range(toobig - 257, toobig))
2677
2678 # struct cmsghdr has at least three members, two of which are ints
2679 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2680 for n in values:
2681 ret = socket.CMSG_LEN(n)
2682 # This is how recvmsg() calculates the data size
2683 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2684 self.assertLessEqual(ret, self.socklen_t_limit)
2685
2686 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2687 # sendmsg() shares code with these functions, and requires
2688 # that it reject values over the limit.
2689 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2690 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2691
2692 @requireAttrs(socket, "CMSG_SPACE")
2693 def testCMSG_SPACE(self):
2694 # Test CMSG_SPACE() with various valid and invalid values,
2695 # checking the assumptions used by sendmsg().
2696 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2697 values = list(range(257)) + list(range(toobig - 257, toobig))
2698
2699 last = socket.CMSG_SPACE(0)
2700 # struct cmsghdr has at least three members, two of which are ints
2701 self.assertGreater(last, array.array("i").itemsize * 2)
2702 for n in values:
2703 ret = socket.CMSG_SPACE(n)
2704 self.assertGreaterEqual(ret, last)
2705 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2706 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2707 self.assertLessEqual(ret, self.socklen_t_limit)
2708 last = ret
2709
2710 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2711 # sendmsg() shares code with these functions, and requires
2712 # that it reject values over the limit.
2713 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2714 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2715
2716
2717class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2718 # Tests for file descriptor passing on Unix-domain sockets.
2719
2720 # Invalid file descriptor value that's unlikely to evaluate to a
2721 # real FD even if one of its bytes is replaced with a different
2722 # value (which shouldn't actually happen).
2723 badfd = -0x5555
2724
2725 def newFDs(self, n):
2726 # Return a list of n file descriptors for newly-created files
2727 # containing their list indices as ASCII numbers.
2728 fds = []
2729 for i in range(n):
2730 fd, path = tempfile.mkstemp()
2731 self.addCleanup(os.unlink, path)
2732 self.addCleanup(os.close, fd)
2733 os.write(fd, str(i).encode())
2734 fds.append(fd)
2735 return fds
2736
2737 def checkFDs(self, fds):
2738 # Check that the file descriptors in the given list contain
2739 # their correct list indices as ASCII numbers.
2740 for n, fd in enumerate(fds):
2741 os.lseek(fd, 0, os.SEEK_SET)
2742 self.assertEqual(os.read(fd, 1024), str(n).encode())
2743
2744 def registerRecvmsgResult(self, result):
2745 self.addCleanup(self.closeRecvmsgFDs, result)
2746
2747 def closeRecvmsgFDs(self, recvmsg_result):
2748 # Close all file descriptors specified in the ancillary data
2749 # of the given return value from recvmsg() or recvmsg_into().
2750 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2751 if (cmsg_level == socket.SOL_SOCKET and
2752 cmsg_type == socket.SCM_RIGHTS):
2753 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002754 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002755 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2756 for fd in fds:
2757 os.close(fd)
2758
2759 def createAndSendFDs(self, n):
2760 # Send n new file descriptors created by newFDs() to the
2761 # server, with the constant MSG as the non-ancillary data.
2762 self.assertEqual(
2763 self.sendmsgToServer([MSG],
2764 [(socket.SOL_SOCKET,
2765 socket.SCM_RIGHTS,
2766 array.array("i", self.newFDs(n)))]),
2767 len(MSG))
2768
2769 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2770 # Check that constant MSG was received with numfds file
2771 # descriptors in a maximum of maxcmsgs control messages (which
2772 # must contain only complete integers). By default, check
2773 # that MSG_CTRUNC is unset, but ignore any flags in
2774 # ignoreflags.
2775 msg, ancdata, flags, addr = result
2776 self.assertEqual(msg, MSG)
2777 self.checkRecvmsgAddress(addr, self.cli_addr)
2778 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2779 ignore=ignoreflags)
2780
2781 self.assertIsInstance(ancdata, list)
2782 self.assertLessEqual(len(ancdata), maxcmsgs)
2783 fds = array.array("i")
2784 for item in ancdata:
2785 self.assertIsInstance(item, tuple)
2786 cmsg_level, cmsg_type, cmsg_data = item
2787 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2788 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2789 self.assertIsInstance(cmsg_data, bytes)
2790 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002791 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002792
2793 self.assertEqual(len(fds), numfds)
2794 self.checkFDs(fds)
2795
2796 def testFDPassSimple(self):
2797 # Pass a single FD (array read from bytes object).
2798 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2799 len(MSG), 10240))
2800
2801 def _testFDPassSimple(self):
2802 self.assertEqual(
2803 self.sendmsgToServer(
2804 [MSG],
2805 [(socket.SOL_SOCKET,
2806 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002807 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002808 len(MSG))
2809
2810 def testMultipleFDPass(self):
2811 # Pass multiple FDs in a single array.
2812 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2813 len(MSG), 10240))
2814
2815 def _testMultipleFDPass(self):
2816 self.createAndSendFDs(4)
2817
2818 @requireAttrs(socket, "CMSG_SPACE")
2819 def testFDPassCMSG_SPACE(self):
2820 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2821 self.checkRecvmsgFDs(
2822 4, self.doRecvmsg(self.serv_sock, len(MSG),
2823 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2824
2825 @testFDPassCMSG_SPACE.client_skip
2826 def _testFDPassCMSG_SPACE(self):
2827 self.createAndSendFDs(4)
2828
2829 def testFDPassCMSG_LEN(self):
2830 # Test using CMSG_LEN() to calculate ancillary buffer size.
2831 self.checkRecvmsgFDs(1,
2832 self.doRecvmsg(self.serv_sock, len(MSG),
2833 socket.CMSG_LEN(4 * SIZEOF_INT)),
2834 # RFC 3542 says implementations may set
2835 # MSG_CTRUNC if there isn't enough space
2836 # for trailing padding.
2837 ignoreflags=socket.MSG_CTRUNC)
2838
2839 def _testFDPassCMSG_LEN(self):
2840 self.createAndSendFDs(1)
2841
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002842 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002843 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002844 @requireAttrs(socket, "CMSG_SPACE")
2845 def testFDPassSeparate(self):
2846 # Pass two FDs in two separate arrays. Arrays may be combined
2847 # into a single control message by the OS.
2848 self.checkRecvmsgFDs(2,
2849 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2850 maxcmsgs=2)
2851
2852 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002853 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002854 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002855 def _testFDPassSeparate(self):
2856 fd0, fd1 = self.newFDs(2)
2857 self.assertEqual(
2858 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2859 socket.SCM_RIGHTS,
2860 array.array("i", [fd0])),
2861 (socket.SOL_SOCKET,
2862 socket.SCM_RIGHTS,
2863 array.array("i", [fd1]))]),
2864 len(MSG))
2865
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002866 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002867 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002868 @requireAttrs(socket, "CMSG_SPACE")
2869 def testFDPassSeparateMinSpace(self):
2870 # Pass two FDs in two separate arrays, receiving them into the
2871 # minimum space for two arrays.
2872 self.checkRecvmsgFDs(2,
2873 self.doRecvmsg(self.serv_sock, len(MSG),
2874 socket.CMSG_SPACE(SIZEOF_INT) +
2875 socket.CMSG_LEN(SIZEOF_INT)),
2876 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2877
2878 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002879 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002880 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002881 def _testFDPassSeparateMinSpace(self):
2882 fd0, fd1 = self.newFDs(2)
2883 self.assertEqual(
2884 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2885 socket.SCM_RIGHTS,
2886 array.array("i", [fd0])),
2887 (socket.SOL_SOCKET,
2888 socket.SCM_RIGHTS,
2889 array.array("i", [fd1]))]),
2890 len(MSG))
2891
2892 def sendAncillaryIfPossible(self, msg, ancdata):
2893 # Try to send msg and ancdata to server, but if the system
2894 # call fails, just send msg with no ancillary data.
2895 try:
2896 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002897 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002898 # Check that it was the system call that failed
2899 self.assertIsInstance(e.errno, int)
2900 nbytes = self.sendmsgToServer([msg])
2901 self.assertEqual(nbytes, len(msg))
2902
Brett Cannon3bbad122015-12-28 17:21:44 -08002903 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002904 def testFDPassEmpty(self):
2905 # Try to pass an empty FD array. Can receive either no array
2906 # or an empty array.
2907 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2908 len(MSG), 10240),
2909 ignoreflags=socket.MSG_CTRUNC)
2910
2911 def _testFDPassEmpty(self):
2912 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2913 socket.SCM_RIGHTS,
2914 b"")])
2915
2916 def testFDPassPartialInt(self):
2917 # Try to pass a truncated FD array.
2918 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2919 len(MSG), 10240)
2920 self.assertEqual(msg, MSG)
2921 self.checkRecvmsgAddress(addr, self.cli_addr)
2922 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2923 self.assertLessEqual(len(ancdata), 1)
2924 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2925 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2926 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2927 self.assertLess(len(cmsg_data), SIZEOF_INT)
2928
2929 def _testFDPassPartialInt(self):
2930 self.sendAncillaryIfPossible(
2931 MSG,
2932 [(socket.SOL_SOCKET,
2933 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002934 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002935
2936 @requireAttrs(socket, "CMSG_SPACE")
2937 def testFDPassPartialIntInMiddle(self):
2938 # Try to pass two FD arrays, the first of which is truncated.
2939 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2940 len(MSG), 10240)
2941 self.assertEqual(msg, MSG)
2942 self.checkRecvmsgAddress(addr, self.cli_addr)
2943 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2944 self.assertLessEqual(len(ancdata), 2)
2945 fds = array.array("i")
2946 # Arrays may have been combined in a single control message
2947 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2948 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2949 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002950 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002951 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2952 self.assertLessEqual(len(fds), 2)
2953 self.checkFDs(fds)
2954
2955 @testFDPassPartialIntInMiddle.client_skip
2956 def _testFDPassPartialIntInMiddle(self):
2957 fd0, fd1 = self.newFDs(2)
2958 self.sendAncillaryIfPossible(
2959 MSG,
2960 [(socket.SOL_SOCKET,
2961 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002962 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002963 (socket.SOL_SOCKET,
2964 socket.SCM_RIGHTS,
2965 array.array("i", [fd1]))])
2966
2967 def checkTruncatedHeader(self, result, ignoreflags=0):
2968 # Check that no ancillary data items are returned when data is
2969 # truncated inside the cmsghdr structure.
2970 msg, ancdata, flags, addr = result
2971 self.assertEqual(msg, MSG)
2972 self.checkRecvmsgAddress(addr, self.cli_addr)
2973 self.assertEqual(ancdata, [])
2974 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2975 ignore=ignoreflags)
2976
2977 def testCmsgTruncNoBufSize(self):
2978 # Check that no ancillary data is received when no buffer size
2979 # is specified.
2980 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2981 # BSD seems to set MSG_CTRUNC only
2982 # if an item has been partially
2983 # received.
2984 ignoreflags=socket.MSG_CTRUNC)
2985
2986 def _testCmsgTruncNoBufSize(self):
2987 self.createAndSendFDs(1)
2988
2989 def testCmsgTrunc0(self):
2990 # Check that no ancillary data is received when buffer size is 0.
2991 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2992 ignoreflags=socket.MSG_CTRUNC)
2993
2994 def _testCmsgTrunc0(self):
2995 self.createAndSendFDs(1)
2996
2997 # Check that no ancillary data is returned for various non-zero
2998 # (but still too small) buffer sizes.
2999
3000 def testCmsgTrunc1(self):
3001 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3002
3003 def _testCmsgTrunc1(self):
3004 self.createAndSendFDs(1)
3005
3006 def testCmsgTrunc2Int(self):
3007 # The cmsghdr structure has at least three members, two of
3008 # which are ints, so we still shouldn't see any ancillary
3009 # data.
3010 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3011 SIZEOF_INT * 2))
3012
3013 def _testCmsgTrunc2Int(self):
3014 self.createAndSendFDs(1)
3015
3016 def testCmsgTruncLen0Minus1(self):
3017 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3018 socket.CMSG_LEN(0) - 1))
3019
3020 def _testCmsgTruncLen0Minus1(self):
3021 self.createAndSendFDs(1)
3022
3023 # The following tests try to truncate the control message in the
3024 # middle of the FD array.
3025
3026 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3027 # Check that file descriptor data is truncated to between
3028 # mindata and maxdata bytes when received with buffer size
3029 # ancbuf, and that any complete file descriptor numbers are
3030 # valid.
3031 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3032 len(MSG), ancbuf)
3033 self.assertEqual(msg, MSG)
3034 self.checkRecvmsgAddress(addr, self.cli_addr)
3035 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3036
3037 if mindata == 0 and ancdata == []:
3038 return
3039 self.assertEqual(len(ancdata), 1)
3040 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3041 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3042 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3043 self.assertGreaterEqual(len(cmsg_data), mindata)
3044 self.assertLessEqual(len(cmsg_data), maxdata)
3045 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003046 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003047 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3048 self.checkFDs(fds)
3049
3050 def testCmsgTruncLen0(self):
3051 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3052
3053 def _testCmsgTruncLen0(self):
3054 self.createAndSendFDs(1)
3055
3056 def testCmsgTruncLen0Plus1(self):
3057 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3058
3059 def _testCmsgTruncLen0Plus1(self):
3060 self.createAndSendFDs(2)
3061
3062 def testCmsgTruncLen1(self):
3063 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3064 maxdata=SIZEOF_INT)
3065
3066 def _testCmsgTruncLen1(self):
3067 self.createAndSendFDs(2)
3068
3069 def testCmsgTruncLen2Minus1(self):
3070 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3071 maxdata=(2 * SIZEOF_INT) - 1)
3072
3073 def _testCmsgTruncLen2Minus1(self):
3074 self.createAndSendFDs(2)
3075
3076
3077class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3078 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3079 # features of the RFC 3542 Advanced Sockets API for IPv6.
3080 # Currently we can only handle certain data items (e.g. traffic
3081 # class, hop limit, MTU discovery and fragmentation settings)
3082 # without resorting to unportable means such as the struct module,
3083 # but the tests here are aimed at testing the ancillary data
3084 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3085 # itself.
3086
3087 # Test value to use when setting hop limit of packet
3088 hop_limit = 2
3089
3090 # Test value to use when setting traffic class of packet.
3091 # -1 means "use kernel default".
3092 traffic_class = -1
3093
3094 def ancillaryMapping(self, ancdata):
3095 # Given ancillary data list ancdata, return a mapping from
3096 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3097 # Check that no (level, type) pair appears more than once.
3098 d = {}
3099 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3100 self.assertNotIn((cmsg_level, cmsg_type), d)
3101 d[(cmsg_level, cmsg_type)] = cmsg_data
3102 return d
3103
3104 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3105 # Receive hop limit into ancbufsize bytes of ancillary data
3106 # space. Check that data is MSG, ancillary data is not
3107 # truncated (but ignore any flags in ignoreflags), and hop
3108 # limit is between 0 and maxhop inclusive.
3109 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3110 socket.IPV6_RECVHOPLIMIT, 1)
3111 self.misc_event.set()
3112 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3113 len(MSG), ancbufsize)
3114
3115 self.assertEqual(msg, MSG)
3116 self.checkRecvmsgAddress(addr, self.cli_addr)
3117 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3118 ignore=ignoreflags)
3119
3120 self.assertEqual(len(ancdata), 1)
3121 self.assertIsInstance(ancdata[0], tuple)
3122 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3123 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3124 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3125 self.assertIsInstance(cmsg_data, bytes)
3126 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3127 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003128 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003129 self.assertGreaterEqual(a[0], 0)
3130 self.assertLessEqual(a[0], maxhop)
3131
3132 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3133 def testRecvHopLimit(self):
3134 # Test receiving the packet hop limit as ancillary data.
3135 self.checkHopLimit(ancbufsize=10240)
3136
3137 @testRecvHopLimit.client_skip
3138 def _testRecvHopLimit(self):
3139 # Need to wait until server has asked to receive ancillary
3140 # data, as implementations are not required to buffer it
3141 # otherwise.
3142 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3143 self.sendToServer(MSG)
3144
3145 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3146 def testRecvHopLimitCMSG_SPACE(self):
3147 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3148 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3149
3150 @testRecvHopLimitCMSG_SPACE.client_skip
3151 def _testRecvHopLimitCMSG_SPACE(self):
3152 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3153 self.sendToServer(MSG)
3154
3155 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3156 # 3542 says portable applications must provide space for trailing
3157 # padding. Implementations may set MSG_CTRUNC if there isn't
3158 # enough space for the padding.
3159
3160 @requireAttrs(socket.socket, "sendmsg")
3161 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3162 def testSetHopLimit(self):
3163 # Test setting hop limit on outgoing packet and receiving it
3164 # at the other end.
3165 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3166
3167 @testSetHopLimit.client_skip
3168 def _testSetHopLimit(self):
3169 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3170 self.assertEqual(
3171 self.sendmsgToServer([MSG],
3172 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3173 array.array("i", [self.hop_limit]))]),
3174 len(MSG))
3175
3176 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3177 ignoreflags=0):
3178 # Receive traffic class and hop limit into ancbufsize bytes of
3179 # ancillary data space. Check that data is MSG, ancillary
3180 # data is not truncated (but ignore any flags in ignoreflags),
3181 # and traffic class and hop limit are in range (hop limit no
3182 # more than maxhop).
3183 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3184 socket.IPV6_RECVHOPLIMIT, 1)
3185 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3186 socket.IPV6_RECVTCLASS, 1)
3187 self.misc_event.set()
3188 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3189 len(MSG), ancbufsize)
3190
3191 self.assertEqual(msg, MSG)
3192 self.checkRecvmsgAddress(addr, self.cli_addr)
3193 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3194 ignore=ignoreflags)
3195 self.assertEqual(len(ancdata), 2)
3196 ancmap = self.ancillaryMapping(ancdata)
3197
3198 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3199 self.assertEqual(len(tcdata), SIZEOF_INT)
3200 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003201 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003202 self.assertGreaterEqual(a[0], 0)
3203 self.assertLessEqual(a[0], 255)
3204
3205 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3206 self.assertEqual(len(hldata), SIZEOF_INT)
3207 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003208 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003209 self.assertGreaterEqual(a[0], 0)
3210 self.assertLessEqual(a[0], maxhop)
3211
3212 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3213 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3214 def testRecvTrafficClassAndHopLimit(self):
3215 # Test receiving traffic class and hop limit as ancillary data.
3216 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3217
3218 @testRecvTrafficClassAndHopLimit.client_skip
3219 def _testRecvTrafficClassAndHopLimit(self):
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 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3225 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3226 # Test receiving traffic class and hop limit, using
3227 # CMSG_SPACE() to calculate buffer size.
3228 self.checkTrafficClassAndHopLimit(
3229 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3230
3231 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3232 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3233 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3234 self.sendToServer(MSG)
3235
3236 @requireAttrs(socket.socket, "sendmsg")
3237 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3238 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3239 def testSetTrafficClassAndHopLimit(self):
3240 # Test setting traffic class and hop limit on outgoing packet,
3241 # and receiving them at the other end.
3242 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3243 maxhop=self.hop_limit)
3244
3245 @testSetTrafficClassAndHopLimit.client_skip
3246 def _testSetTrafficClassAndHopLimit(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_TCLASS,
3251 array.array("i", [self.traffic_class])),
3252 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3253 array.array("i", [self.hop_limit]))]),
3254 len(MSG))
3255
3256 @requireAttrs(socket.socket, "sendmsg")
3257 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3258 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3259 def testOddCmsgSize(self):
3260 # Try to send ancillary data with first item one byte too
3261 # long. Fall back to sending with correct size if this fails,
3262 # and check that second item was handled correctly.
3263 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3264 maxhop=self.hop_limit)
3265
3266 @testOddCmsgSize.client_skip
3267 def _testOddCmsgSize(self):
3268 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3269 try:
3270 nbytes = self.sendmsgToServer(
3271 [MSG],
3272 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003273 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003274 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3275 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003276 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003277 self.assertIsInstance(e.errno, int)
3278 nbytes = self.sendmsgToServer(
3279 [MSG],
3280 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3281 array.array("i", [self.traffic_class])),
3282 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3283 array.array("i", [self.hop_limit]))])
3284 self.assertEqual(nbytes, len(MSG))
3285
3286 # Tests for proper handling of truncated ancillary data
3287
3288 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3289 # Receive hop limit into ancbufsize bytes of ancillary data
3290 # space, which should be too small to contain the ancillary
3291 # data header (if ancbufsize is None, pass no second argument
3292 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3293 # (unless included in ignoreflags), and no ancillary data is
3294 # returned.
3295 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3296 socket.IPV6_RECVHOPLIMIT, 1)
3297 self.misc_event.set()
3298 args = () if ancbufsize is None else (ancbufsize,)
3299 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3300 len(MSG), *args)
3301
3302 self.assertEqual(msg, MSG)
3303 self.checkRecvmsgAddress(addr, self.cli_addr)
3304 self.assertEqual(ancdata, [])
3305 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3306 ignore=ignoreflags)
3307
3308 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3309 def testCmsgTruncNoBufSize(self):
3310 # Check that no ancillary data is received when no ancillary
3311 # buffer size is provided.
3312 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3313 # BSD seems to set
3314 # MSG_CTRUNC only if an item
3315 # has been partially
3316 # received.
3317 ignoreflags=socket.MSG_CTRUNC)
3318
3319 @testCmsgTruncNoBufSize.client_skip
3320 def _testCmsgTruncNoBufSize(self):
3321 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3322 self.sendToServer(MSG)
3323
3324 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3325 def testSingleCmsgTrunc0(self):
3326 # Check that no ancillary data is received when ancillary
3327 # buffer size is zero.
3328 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3329 ignoreflags=socket.MSG_CTRUNC)
3330
3331 @testSingleCmsgTrunc0.client_skip
3332 def _testSingleCmsgTrunc0(self):
3333 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3334 self.sendToServer(MSG)
3335
3336 # Check that no ancillary data is returned for various non-zero
3337 # (but still too small) buffer sizes.
3338
3339 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3340 def testSingleCmsgTrunc1(self):
3341 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3342
3343 @testSingleCmsgTrunc1.client_skip
3344 def _testSingleCmsgTrunc1(self):
3345 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3346 self.sendToServer(MSG)
3347
3348 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3349 def testSingleCmsgTrunc2Int(self):
3350 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3351
3352 @testSingleCmsgTrunc2Int.client_skip
3353 def _testSingleCmsgTrunc2Int(self):
3354 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3355 self.sendToServer(MSG)
3356
3357 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3358 def testSingleCmsgTruncLen0Minus1(self):
3359 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3360
3361 @testSingleCmsgTruncLen0Minus1.client_skip
3362 def _testSingleCmsgTruncLen0Minus1(self):
3363 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3364 self.sendToServer(MSG)
3365
3366 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3367 def testSingleCmsgTruncInData(self):
3368 # Test truncation of a control message inside its associated
3369 # data. The message may be returned with its data truncated,
3370 # or not returned at all.
3371 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3372 socket.IPV6_RECVHOPLIMIT, 1)
3373 self.misc_event.set()
3374 msg, ancdata, flags, addr = self.doRecvmsg(
3375 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3376
3377 self.assertEqual(msg, MSG)
3378 self.checkRecvmsgAddress(addr, self.cli_addr)
3379 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3380
3381 self.assertLessEqual(len(ancdata), 1)
3382 if ancdata:
3383 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3384 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3385 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3386 self.assertLess(len(cmsg_data), SIZEOF_INT)
3387
3388 @testSingleCmsgTruncInData.client_skip
3389 def _testSingleCmsgTruncInData(self):
3390 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3391 self.sendToServer(MSG)
3392
3393 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3394 # Receive traffic class and hop limit into ancbufsize bytes of
3395 # ancillary data space, which should be large enough to
3396 # contain the first item, but too small to contain the header
3397 # of the second. Check that data is MSG, MSG_CTRUNC is set
3398 # (unless included in ignoreflags), and only one ancillary
3399 # data item is returned.
3400 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3401 socket.IPV6_RECVHOPLIMIT, 1)
3402 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3403 socket.IPV6_RECVTCLASS, 1)
3404 self.misc_event.set()
3405 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3406 len(MSG), ancbufsize)
3407
3408 self.assertEqual(msg, MSG)
3409 self.checkRecvmsgAddress(addr, self.cli_addr)
3410 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3411 ignore=ignoreflags)
3412
3413 self.assertEqual(len(ancdata), 1)
3414 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3415 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3416 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3417 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3418 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003419 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003420 self.assertGreaterEqual(a[0], 0)
3421 self.assertLessEqual(a[0], 255)
3422
3423 # Try the above test with various buffer sizes.
3424
3425 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3426 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3427 def testSecondCmsgTrunc0(self):
3428 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3429 ignoreflags=socket.MSG_CTRUNC)
3430
3431 @testSecondCmsgTrunc0.client_skip
3432 def _testSecondCmsgTrunc0(self):
3433 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3434 self.sendToServer(MSG)
3435
3436 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3437 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3438 def testSecondCmsgTrunc1(self):
3439 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3440
3441 @testSecondCmsgTrunc1.client_skip
3442 def _testSecondCmsgTrunc1(self):
3443 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3444 self.sendToServer(MSG)
3445
3446 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3447 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3448 def testSecondCmsgTrunc2Int(self):
3449 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3450 2 * SIZEOF_INT)
3451
3452 @testSecondCmsgTrunc2Int.client_skip
3453 def _testSecondCmsgTrunc2Int(self):
3454 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3455 self.sendToServer(MSG)
3456
3457 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3458 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3459 def testSecondCmsgTruncLen0Minus1(self):
3460 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3461 socket.CMSG_LEN(0) - 1)
3462
3463 @testSecondCmsgTruncLen0Minus1.client_skip
3464 def _testSecondCmsgTruncLen0Minus1(self):
3465 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3466 self.sendToServer(MSG)
3467
3468 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3469 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3470 def testSecomdCmsgTruncInData(self):
3471 # Test truncation of the second of two control messages inside
3472 # its associated data.
3473 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3474 socket.IPV6_RECVHOPLIMIT, 1)
3475 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3476 socket.IPV6_RECVTCLASS, 1)
3477 self.misc_event.set()
3478 msg, ancdata, flags, addr = self.doRecvmsg(
3479 self.serv_sock, len(MSG),
3480 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3481
3482 self.assertEqual(msg, MSG)
3483 self.checkRecvmsgAddress(addr, self.cli_addr)
3484 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3485
3486 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3487
3488 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3489 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3490 cmsg_types.remove(cmsg_type)
3491 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3492 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003493 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003494 self.assertGreaterEqual(a[0], 0)
3495 self.assertLessEqual(a[0], 255)
3496
3497 if ancdata:
3498 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3499 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3500 cmsg_types.remove(cmsg_type)
3501 self.assertLess(len(cmsg_data), SIZEOF_INT)
3502
3503 self.assertEqual(ancdata, [])
3504
3505 @testSecomdCmsgTruncInData.client_skip
3506 def _testSecomdCmsgTruncInData(self):
3507 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3508 self.sendToServer(MSG)
3509
3510
3511# Derive concrete test classes for different socket types.
3512
3513class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3514 SendrecvmsgConnectionlessBase,
3515 ThreadedSocketTestMixin, UDPTestBase):
3516 pass
3517
3518@requireAttrs(socket.socket, "sendmsg")
3519@unittest.skipUnless(thread, 'Threading required for this test.')
3520class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3521 pass
3522
3523@requireAttrs(socket.socket, "recvmsg")
3524@unittest.skipUnless(thread, 'Threading required for this test.')
3525class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3526 pass
3527
3528@requireAttrs(socket.socket, "recvmsg_into")
3529@unittest.skipUnless(thread, 'Threading required for this test.')
3530class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3531 pass
3532
3533
3534class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3535 SendrecvmsgConnectionlessBase,
3536 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003537
3538 def checkRecvmsgAddress(self, addr1, addr2):
3539 # Called to compare the received address with the address of
3540 # the peer, ignoring scope ID
3541 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003542
3543@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003544@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003545@requireSocket("AF_INET6", "SOCK_DGRAM")
3546@unittest.skipUnless(thread, 'Threading required for this test.')
3547class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3548 pass
3549
3550@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003551@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003552@requireSocket("AF_INET6", "SOCK_DGRAM")
3553@unittest.skipUnless(thread, 'Threading required for this test.')
3554class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3555 pass
3556
3557@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003558@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003559@requireSocket("AF_INET6", "SOCK_DGRAM")
3560@unittest.skipUnless(thread, 'Threading required for this test.')
3561class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3562 pass
3563
3564@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003565@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003566@requireAttrs(socket, "IPPROTO_IPV6")
3567@requireSocket("AF_INET6", "SOCK_DGRAM")
3568@unittest.skipUnless(thread, 'Threading required for this test.')
3569class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3570 SendrecvmsgUDP6TestBase):
3571 pass
3572
3573@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003574@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003575@requireAttrs(socket, "IPPROTO_IPV6")
3576@requireSocket("AF_INET6", "SOCK_DGRAM")
3577@unittest.skipUnless(thread, 'Threading required for this test.')
3578class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3579 RFC3542AncillaryTest,
3580 SendrecvmsgUDP6TestBase):
3581 pass
3582
3583
3584class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3585 ConnectedStreamTestMixin, TCPTestBase):
3586 pass
3587
3588@requireAttrs(socket.socket, "sendmsg")
3589@unittest.skipUnless(thread, 'Threading required for this test.')
3590class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3591 pass
3592
3593@requireAttrs(socket.socket, "recvmsg")
3594@unittest.skipUnless(thread, 'Threading required for this test.')
3595class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3596 SendrecvmsgTCPTestBase):
3597 pass
3598
3599@requireAttrs(socket.socket, "recvmsg_into")
3600@unittest.skipUnless(thread, 'Threading required for this test.')
3601class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3602 SendrecvmsgTCPTestBase):
3603 pass
3604
3605
3606class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3607 SendrecvmsgConnectedBase,
3608 ConnectedStreamTestMixin, SCTPStreamBase):
3609 pass
3610
3611@requireAttrs(socket.socket, "sendmsg")
3612@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3613@unittest.skipUnless(thread, 'Threading required for this test.')
3614class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3615 pass
3616
3617@requireAttrs(socket.socket, "recvmsg")
3618@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3619@unittest.skipUnless(thread, 'Threading required for this test.')
3620class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3621 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003622
3623 def testRecvmsgEOF(self):
3624 try:
3625 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3626 except OSError as e:
3627 if e.errno != errno.ENOTCONN:
3628 raise
3629 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003630
3631@requireAttrs(socket.socket, "recvmsg_into")
3632@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3633@unittest.skipUnless(thread, 'Threading required for this test.')
3634class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3635 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003636
3637 def testRecvmsgEOF(self):
3638 try:
3639 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3640 except OSError as e:
3641 if e.errno != errno.ENOTCONN:
3642 raise
3643 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003644
3645
3646class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3647 ConnectedStreamTestMixin, UnixStreamBase):
3648 pass
3649
3650@requireAttrs(socket.socket, "sendmsg")
3651@requireAttrs(socket, "AF_UNIX")
3652@unittest.skipUnless(thread, 'Threading required for this test.')
3653class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3654 pass
3655
3656@requireAttrs(socket.socket, "recvmsg")
3657@requireAttrs(socket, "AF_UNIX")
3658@unittest.skipUnless(thread, 'Threading required for this test.')
3659class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3660 SendrecvmsgUnixStreamTestBase):
3661 pass
3662
3663@requireAttrs(socket.socket, "recvmsg_into")
3664@requireAttrs(socket, "AF_UNIX")
3665@unittest.skipUnless(thread, 'Threading required for this test.')
3666class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3667 SendrecvmsgUnixStreamTestBase):
3668 pass
3669
3670@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3671@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3672@unittest.skipUnless(thread, 'Threading required for this test.')
3673class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3674 pass
3675
3676@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3677@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3678@unittest.skipUnless(thread, 'Threading required for this test.')
3679class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3680 SendrecvmsgUnixStreamTestBase):
3681 pass
3682
3683
3684# Test interrupting the interruptible send/receive methods with a
3685# signal when a timeout is set. These tests avoid having multiple
3686# threads alive during the test so that the OS cannot deliver the
3687# signal to the wrong one.
3688
3689class InterruptedTimeoutBase(unittest.TestCase):
3690 # Base class for interrupted send/receive tests. Installs an
3691 # empty handler for SIGALRM and removes it on teardown, along with
3692 # any scheduled alarms.
3693
3694 def setUp(self):
3695 super().setUp()
3696 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003697 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003698 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3699 self.addCleanup(self.setAlarm, 0)
3700
3701 # Timeout for socket operations
3702 timeout = 4.0
3703
3704 # Provide setAlarm() method to schedule delivery of SIGALRM after
3705 # given number of seconds, or cancel it if zero, and an
3706 # appropriate time value to use. Use setitimer() if available.
3707 if hasattr(signal, "setitimer"):
3708 alarm_time = 0.05
3709
3710 def setAlarm(self, seconds):
3711 signal.setitimer(signal.ITIMER_REAL, seconds)
3712 else:
3713 # Old systems may deliver the alarm up to one second early
3714 alarm_time = 2
3715
3716 def setAlarm(self, seconds):
3717 signal.alarm(seconds)
3718
3719
3720# Require siginterrupt() in order to ensure that system calls are
3721# interrupted by default.
3722@requireAttrs(signal, "siginterrupt")
3723@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3724 "Don't have signal.alarm or signal.setitimer")
3725class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3726 # Test interrupting the recv*() methods with signals when a
3727 # timeout is set.
3728
3729 def setUp(self):
3730 super().setUp()
3731 self.serv.settimeout(self.timeout)
3732
3733 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003734 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003735 # errno of EINTR when interrupted by a signal.
3736 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003737 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003738 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003739
3740 def testInterruptedRecvTimeout(self):
3741 self.checkInterruptedRecv(self.serv.recv, 1024)
3742
3743 def testInterruptedRecvIntoTimeout(self):
3744 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3745
3746 def testInterruptedRecvfromTimeout(self):
3747 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3748
3749 def testInterruptedRecvfromIntoTimeout(self):
3750 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3751
3752 @requireAttrs(socket.socket, "recvmsg")
3753 def testInterruptedRecvmsgTimeout(self):
3754 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3755
3756 @requireAttrs(socket.socket, "recvmsg_into")
3757 def testInterruptedRecvmsgIntoTimeout(self):
3758 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3759
3760
3761# Require siginterrupt() in order to ensure that system calls are
3762# interrupted by default.
3763@requireAttrs(signal, "siginterrupt")
3764@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3765 "Don't have signal.alarm or signal.setitimer")
3766@unittest.skipUnless(thread, 'Threading required for this test.')
3767class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3768 ThreadSafeCleanupTestCase,
3769 SocketListeningTestMixin, TCPTestBase):
3770 # Test interrupting the interruptible send*() methods with signals
3771 # when a timeout is set.
3772
3773 def setUp(self):
3774 super().setUp()
3775 self.serv_conn = self.newSocket()
3776 self.addCleanup(self.serv_conn.close)
3777 # Use a thread to complete the connection, but wait for it to
3778 # terminate before running the test, so that there is only one
3779 # thread to accept the signal.
3780 cli_thread = threading.Thread(target=self.doConnect)
3781 cli_thread.start()
3782 self.cli_conn, addr = self.serv.accept()
3783 self.addCleanup(self.cli_conn.close)
3784 cli_thread.join()
3785 self.serv_conn.settimeout(self.timeout)
3786
3787 def doConnect(self):
3788 self.serv_conn.connect(self.serv_addr)
3789
3790 def checkInterruptedSend(self, func, *args, **kwargs):
3791 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003792 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003793 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003794 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003795 while True:
3796 self.setAlarm(self.alarm_time)
3797 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003798
Ned Deilyc5640382014-02-03 13:58:31 -08003799 # Issue #12958: The following tests have problems on OS X prior to 10.7
3800 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003801 def testInterruptedSendTimeout(self):
3802 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3803
Ned Deilyc5640382014-02-03 13:58:31 -08003804 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003805 def testInterruptedSendtoTimeout(self):
3806 # Passing an actual address here as Python's wrapper for
3807 # sendto() doesn't allow passing a zero-length one; POSIX
3808 # requires that the address is ignored since the socket is
3809 # connection-mode, however.
3810 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3811 self.serv_addr)
3812
Ned Deilyc5640382014-02-03 13:58:31 -08003813 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003814 @requireAttrs(socket.socket, "sendmsg")
3815 def testInterruptedSendmsgTimeout(self):
3816 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3817
3818
Victor Stinner45df8202010-04-28 22:31:17 +00003819@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003820class TCPCloserTest(ThreadedTCPSocketTest):
3821
3822 def testClose(self):
3823 conn, addr = self.serv.accept()
3824 conn.close()
3825
3826 sd = self.cli
3827 read, write, err = select.select([sd], [], [], 1.0)
3828 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003829 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003830
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003831 # Calling close() many times should be safe.
3832 conn.close()
3833 conn.close()
3834
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003835 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003836 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003837 time.sleep(1.0)
3838
Victor Stinner45df8202010-04-28 22:31:17 +00003839@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003840class BasicSocketPairTest(SocketPairTest):
3841
3842 def __init__(self, methodName='runTest'):
3843 SocketPairTest.__init__(self, methodName=methodName)
3844
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003845 def _check_defaults(self, sock):
3846 self.assertIsInstance(sock, socket.socket)
3847 if hasattr(socket, 'AF_UNIX'):
3848 self.assertEqual(sock.family, socket.AF_UNIX)
3849 else:
3850 self.assertEqual(sock.family, socket.AF_INET)
3851 self.assertEqual(sock.type, socket.SOCK_STREAM)
3852 self.assertEqual(sock.proto, 0)
3853
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003854 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003855 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003856
3857 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003858 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003859
Dave Cole331708b2004-08-09 04:51:41 +00003860 def testRecv(self):
3861 msg = self.serv.recv(1024)
3862 self.assertEqual(msg, MSG)
3863
3864 def _testRecv(self):
3865 self.cli.send(MSG)
3866
3867 def testSend(self):
3868 self.serv.send(MSG)
3869
3870 def _testSend(self):
3871 msg = self.cli.recv(1024)
3872 self.assertEqual(msg, MSG)
3873
Victor Stinner45df8202010-04-28 22:31:17 +00003874@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003875class NonBlockingTCPTests(ThreadedTCPSocketTest):
3876
3877 def __init__(self, methodName='runTest'):
3878 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3879
3880 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003881 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003882 self.serv.setblocking(True)
3883 self.assertIsNone(self.serv.gettimeout())
3884 self.serv.setblocking(False)
3885 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003886 start = time.time()
3887 try:
3888 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003889 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003890 pass
3891 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003892 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003893
3894 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003895 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003896
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003897 @support.cpython_only
3898 def testSetBlocking_overflow(self):
3899 # Issue 15989
3900 import _testcapi
3901 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3902 self.skipTest('needs UINT_MAX < ULONG_MAX')
3903 self.serv.setblocking(False)
3904 self.assertEqual(self.serv.gettimeout(), 0.0)
3905 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3906 self.assertIsNone(self.serv.gettimeout())
3907
3908 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3909
Serhiy Storchaka43767632013-11-03 21:31:38 +02003910 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3911 'test needs socket.SOCK_NONBLOCK')
3912 @support.requires_linux_version(2, 6, 28)
3913 def testInitNonBlocking(self):
3914 # reinit server socket
3915 self.serv.close()
3916 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3917 socket.SOCK_NONBLOCK)
3918 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003919 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003920 # actual testing
3921 start = time.time()
3922 try:
3923 self.serv.accept()
3924 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003925 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003926 end = time.time()
3927 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3928
3929 def _testInitNonBlocking(self):
3930 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003931
Antoine Pitrou600232b2011-01-05 21:03:42 +00003932 def testInheritFlags(self):
3933 # Issue #7995: when calling accept() on a listening socket with a
3934 # timeout, the resulting socket should not be non-blocking.
3935 self.serv.settimeout(10)
3936 try:
3937 conn, addr = self.serv.accept()
3938 message = conn.recv(len(MSG))
3939 finally:
3940 conn.close()
3941 self.serv.settimeout(None)
3942
3943 def _testInheritFlags(self):
3944 time.sleep(0.1)
3945 self.cli.connect((HOST, self.port))
3946 time.sleep(0.5)
3947 self.cli.send(MSG)
3948
Guido van Rossum24e4af82002-06-12 19:18:08 +00003949 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003950 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003951 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003952 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003953 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003954 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003955 pass
3956 else:
3957 self.fail("Error trying to do non-blocking accept.")
3958 read, write, err = select.select([self.serv], [], [])
3959 if self.serv in read:
3960 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07003961 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00003962 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003963 else:
3964 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003965
Guido van Rossum24e4af82002-06-12 19:18:08 +00003966 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003967 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003968 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003969
3970 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003971 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003972 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003973 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003974
3975 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003976 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003977 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003978
3979 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003980 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003981 conn, addr = self.serv.accept()
3982 conn.setblocking(0)
3983 try:
3984 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003985 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003986 pass
3987 else:
3988 self.fail("Error trying to do non-blocking recv.")
3989 read, write, err = select.select([conn], [], [])
3990 if conn in read:
3991 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003992 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003993 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003994 else:
3995 self.fail("Error during select call to non-blocking socket.")
3996
3997 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003998 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003999 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004000 self.cli.send(MSG)
4001
Victor Stinner45df8202010-04-28 22:31:17 +00004002@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00004003class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004004 """Unit tests for the object returned by socket.makefile()
4005
Antoine Pitrou834bd812010-10-13 16:17:14 +00004006 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004007 the client connection. You can read from this file to
4008 get output from the server.
4009
Antoine Pitrou834bd812010-10-13 16:17:14 +00004010 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004011 server connection. You can write to this file to send output
4012 to the client.
4013 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004014
Guido van Rossume9f66142002-08-07 15:46:19 +00004015 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004016 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004017 errors = 'strict'
4018 newline = None
4019
4020 read_mode = 'rb'
4021 read_msg = MSG
4022 write_mode = 'wb'
4023 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004024
Guido van Rossum24e4af82002-06-12 19:18:08 +00004025 def __init__(self, methodName='runTest'):
4026 SocketConnectedTest.__init__(self, methodName=methodName)
4027
4028 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004029 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4030 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004031 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004032 self.read_file = self.cli_conn.makefile(
4033 self.read_mode, self.bufsize,
4034 encoding = self.encoding,
4035 errors = self.errors,
4036 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004037
4038 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004039 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004040 self.read_file.close()
4041 self.assertTrue(self.read_file.closed)
4042 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004043 SocketConnectedTest.tearDown(self)
4044
4045 def clientSetUp(self):
4046 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004047 self.write_file = self.serv_conn.makefile(
4048 self.write_mode, self.bufsize,
4049 encoding = self.encoding,
4050 errors = self.errors,
4051 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004052
4053 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004054 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004055 self.write_file.close()
4056 self.assertTrue(self.write_file.closed)
4057 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004058 SocketConnectedTest.clientTearDown(self)
4059
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004060 def testReadAfterTimeout(self):
4061 # Issue #7322: A file object must disallow further reads
4062 # after a timeout has occurred.
4063 self.cli_conn.settimeout(1)
4064 self.read_file.read(3)
4065 # First read raises a timeout
4066 self.assertRaises(socket.timeout, self.read_file.read, 1)
4067 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004068 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004069 self.read_file.read(1)
4070 self.assertIn("cannot read from timed out object", str(ctx.exception))
4071
4072 def _testReadAfterTimeout(self):
4073 self.write_file.write(self.write_msg[0:3])
4074 self.write_file.flush()
4075 self.serv_finished.wait()
4076
Guido van Rossum24e4af82002-06-12 19:18:08 +00004077 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004078 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004079 first_seg = self.read_file.read(len(self.read_msg)-3)
4080 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004081 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004082 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004083
4084 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004085 self.write_file.write(self.write_msg)
4086 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004087
Guido van Rossum8c943832002-08-08 01:00:28 +00004088 def testFullRead(self):
4089 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004090 msg = self.read_file.read()
4091 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004092
4093 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004094 self.write_file.write(self.write_msg)
4095 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004096
Guido van Rossum24e4af82002-06-12 19:18:08 +00004097 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004098 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004099 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004100 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004101 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004102 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004103 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004104 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004105 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004106
4107 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004108 self.write_file.write(self.write_msg)
4109 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004110
4111 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004112 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004113 line = self.read_file.readline()
4114 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004115
4116 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004117 self.write_file.write(self.write_msg)
4118 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004119
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004120 def testCloseAfterMakefile(self):
4121 # The file returned by makefile should keep the socket open.
4122 self.cli_conn.close()
4123 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004124 msg = self.read_file.read()
4125 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004126
4127 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004128 self.write_file.write(self.write_msg)
4129 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004130
4131 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004132 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004133 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004134 if isinstance(self.read_msg, str):
4135 msg = msg.decode()
4136 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004137
4138 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004139 self.write_file.write(self.write_msg)
4140 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004141
Tim Peters116d83c2004-03-28 02:20:45 +00004142 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004143 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004144
4145 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004146 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004147
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004148 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004149 self.assertEqual(self.read_file.mode, self.read_mode)
4150 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004151
4152 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004153 self.assertEqual(self.write_file.mode, self.write_mode)
4154 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004155
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004156 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004157 self.read_file.close()
4158 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004159 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004160 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004161
4162 def _testRealClose(self):
4163 pass
4164
4165
Guido van Rossume9f66142002-08-07 15:46:19 +00004166class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4167
4168 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004169
Guido van Rossume9f66142002-08-07 15:46:19 +00004170 In this case (and in this case only), it should be possible to
4171 create a file object, read a line from it, create another file
4172 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004173 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004174 when reading multiple requests from the same socket."""
4175
4176 bufsize = 0 # Use unbuffered mode
4177
4178 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004179 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004180 line = self.read_file.readline() # first line
4181 self.assertEqual(line, b"A. " + self.write_msg) # first line
4182 self.read_file = self.cli_conn.makefile('rb', 0)
4183 line = self.read_file.readline() # second line
4184 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004185
4186 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004187 self.write_file.write(b"A. " + self.write_msg)
4188 self.write_file.write(b"B. " + self.write_msg)
4189 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004190
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004191 def testMakefileClose(self):
4192 # The file returned by makefile should keep the socket open...
4193 self.cli_conn.close()
4194 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004195 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004196 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004197 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004198 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004199
4200 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004201 self.write_file.write(self.write_msg)
4202 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004203
4204 def testMakefileCloseSocketDestroy(self):
4205 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004206 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004207 refcount_after = sys.getrefcount(self.cli_conn)
4208 self.assertEqual(refcount_before - 1, refcount_after)
4209
4210 def _testMakefileCloseSocketDestroy(self):
4211 pass
4212
Antoine Pitrou98b46702010-09-18 22:59:00 +00004213 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004214 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004215 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4216
4217 def testSmallReadNonBlocking(self):
4218 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004219 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4220 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004221 self.evt1.set()
4222 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004223 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004224 if first_seg is None:
4225 # Data not arrived (can happen under Windows), wait a bit
4226 time.sleep(0.5)
4227 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004228 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004229 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004230 self.assertEqual(n, 3)
4231 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004232 self.assertEqual(msg, self.read_msg)
4233 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4234 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004235
4236 def _testSmallReadNonBlocking(self):
4237 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004238 self.write_file.write(self.write_msg)
4239 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004240 self.evt2.set()
4241 # Avoid cloding the socket before the server test has finished,
4242 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4243 self.serv_finished.wait(5.0)
4244
4245 def testWriteNonBlocking(self):
4246 self.cli_finished.wait(5.0)
4247 # The client thread can't skip directly - the SkipTest exception
4248 # would appear as a failure.
4249 if self.serv_skipped:
4250 self.skipTest(self.serv_skipped)
4251
4252 def _testWriteNonBlocking(self):
4253 self.serv_skipped = None
4254 self.serv_conn.setblocking(False)
4255 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004256 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004257 LIMIT = 10
4258 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004259 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004260 self.assertGreater(n, 0)
4261 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004262 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004263 if n is None:
4264 # Succeeded
4265 break
4266 self.assertGreater(n, 0)
4267 else:
4268 # Let us know that this test didn't manage to establish
4269 # the expected conditions. This is not a failure in itself but,
4270 # if it happens repeatedly, the test should be fixed.
4271 self.serv_skipped = "failed to saturate the socket buffer"
4272
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004273
Guido van Rossum8c943832002-08-08 01:00:28 +00004274class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4275
4276 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4277
4278
4279class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4280
4281 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004282
Thomas Woutersb2137042007-02-01 18:02:27 +00004283
Antoine Pitrou834bd812010-10-13 16:17:14 +00004284class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4285 """Tests for socket.makefile() in text mode (rather than binary)"""
4286
4287 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004288 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004289 write_mode = 'wb'
4290 write_msg = MSG
4291 newline = ''
4292
4293
4294class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4295 """Tests for socket.makefile() in text mode (rather than binary)"""
4296
4297 read_mode = 'rb'
4298 read_msg = MSG
4299 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004300 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004301 newline = ''
4302
4303
4304class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4305 """Tests for socket.makefile() in text mode (rather than binary)"""
4306
4307 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004308 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004309 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004310 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004311 newline = ''
4312
4313
Guido van Rossumd8faa362007-04-27 19:54:29 +00004314class NetworkConnectionTest(object):
4315 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004316
Guido van Rossumd8faa362007-04-27 19:54:29 +00004317 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004318 # We're inherited below by BasicTCPTest2, which also inherits
4319 # BasicTCPTest, which defines self.port referenced below.
4320 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004321 self.serv_conn = self.cli
4322
4323class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4324 """Tests that NetworkConnection does not break existing TCP functionality.
4325 """
4326
4327class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004328
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004329 class MockSocket(socket.socket):
4330 def connect(self, *args):
4331 raise socket.timeout('timed out')
4332
4333 @contextlib.contextmanager
4334 def mocked_socket_module(self):
4335 """Return a socket which times out on connect"""
4336 old_socket = socket.socket
4337 socket.socket = self.MockSocket
4338 try:
4339 yield
4340 finally:
4341 socket.socket = old_socket
4342
4343 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004344 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004345 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004346 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004347 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004348 cli.connect((HOST, port))
4349 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4350
4351 def test_create_connection(self):
4352 # Issue #9792: errors raised by create_connection() should have
4353 # a proper errno attribute.
4354 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004355 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004356 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004357
4358 # Issue #16257: create_connection() calls getaddrinfo() against
4359 # 'localhost'. This may result in an IPV6 addr being returned
4360 # as well as an IPV4 one:
4361 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4362 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4363 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4364 #
4365 # create_connection() enumerates through all the addresses returned
4366 # and if it doesn't successfully bind to any of them, it propagates
4367 # the last exception it encountered.
4368 #
4369 # On Solaris, ENETUNREACH is returned in this circumstance instead
4370 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4371 # expected errnos.
4372 expected_errnos = [ errno.ECONNREFUSED, ]
4373 if hasattr(errno, 'ENETUNREACH'):
4374 expected_errnos.append(errno.ENETUNREACH)
4375
4376 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004377
4378 def test_create_connection_timeout(self):
4379 # Issue #9792: create_connection() should not recast timeout errors
4380 # as generic socket errors.
4381 with self.mocked_socket_module():
4382 with self.assertRaises(socket.timeout):
4383 socket.create_connection((HOST, 1234))
4384
Guido van Rossumd8faa362007-04-27 19:54:29 +00004385
Victor Stinner45df8202010-04-28 22:31:17 +00004386@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004387class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4388
4389 def __init__(self, methodName='runTest'):
4390 SocketTCPTest.__init__(self, methodName=methodName)
4391 ThreadableTest.__init__(self)
4392
4393 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004394 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004395
4396 def clientTearDown(self):
4397 self.cli.close()
4398 self.cli = None
4399 ThreadableTest.clientTearDown(self)
4400
4401 def _justAccept(self):
4402 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004403 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004404
4405 testFamily = _justAccept
4406 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004407 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004408 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004409 self.assertEqual(self.cli.family, 2)
4410
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004411 testSourceAddress = _justAccept
4412 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004413 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4414 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004415 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004416 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004417 # The port number being used is sufficient to show that the bind()
4418 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004419
Guido van Rossumd8faa362007-04-27 19:54:29 +00004420 testTimeoutDefault = _justAccept
4421 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004422 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004423 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004424 socket.setdefaulttimeout(42)
4425 try:
4426 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004427 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004428 finally:
4429 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004430 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004431
4432 testTimeoutNone = _justAccept
4433 def _testTimeoutNone(self):
4434 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004435 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004436 socket.setdefaulttimeout(30)
4437 try:
4438 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004439 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004440 finally:
4441 socket.setdefaulttimeout(None)
4442 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004443
4444 testTimeoutValueNamed = _justAccept
4445 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004446 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004447 self.assertEqual(self.cli.gettimeout(), 30)
4448
4449 testTimeoutValueNonamed = _justAccept
4450 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004451 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004452 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004453 self.assertEqual(self.cli.gettimeout(), 30)
4454
Victor Stinner45df8202010-04-28 22:31:17 +00004455@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004456class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4457
4458 def __init__(self, methodName='runTest'):
4459 SocketTCPTest.__init__(self, methodName=methodName)
4460 ThreadableTest.__init__(self)
4461
4462 def clientSetUp(self):
4463 pass
4464
4465 def clientTearDown(self):
4466 self.cli.close()
4467 self.cli = None
4468 ThreadableTest.clientTearDown(self)
4469
4470 def testInsideTimeout(self):
4471 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004472 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004473 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004474 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004475 testOutsideTimeout = testInsideTimeout
4476
4477 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004478 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004479 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004480 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004481
4482 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004483 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004484 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004485
4486
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004487class TCPTimeoutTest(SocketTCPTest):
4488
4489 def testTCPTimeout(self):
4490 def raise_timeout(*args, **kwargs):
4491 self.serv.settimeout(1.0)
4492 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004493 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004494 "Error generating a timeout exception (TCP)")
4495
4496 def testTimeoutZero(self):
4497 ok = False
4498 try:
4499 self.serv.settimeout(0.0)
4500 foo = self.serv.accept()
4501 except socket.timeout:
4502 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004503 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004504 ok = True
4505 except:
4506 self.fail("caught unexpected exception (TCP)")
4507 if not ok:
4508 self.fail("accept() returned success when we did not expect it")
4509
Serhiy Storchaka43767632013-11-03 21:31:38 +02004510 @unittest.skipUnless(hasattr(signal, 'alarm'),
4511 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004512 def testInterruptedTimeout(self):
4513 # XXX I don't know how to do this test on MSWindows or any other
4514 # plaform that doesn't support signal.alarm() or os.kill(), though
4515 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004516 self.serv.settimeout(5.0) # must be longer than alarm
4517 class Alarm(Exception):
4518 pass
4519 def alarm_handler(signal, frame):
4520 raise Alarm
4521 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4522 try:
4523 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4524 try:
4525 foo = self.serv.accept()
4526 except socket.timeout:
4527 self.fail("caught timeout instead of Alarm")
4528 except Alarm:
4529 pass
4530 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004531 self.fail("caught other exception instead of Alarm:"
4532 " %s(%s):\n%s" %
4533 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004534 else:
4535 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004536 finally:
4537 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004538 except Alarm:
4539 self.fail("got Alarm in wrong place")
4540 finally:
4541 # no alarm can be pending. Safe to restore old handler.
4542 signal.signal(signal.SIGALRM, old_alarm)
4543
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004544class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004545
4546 def testUDPTimeout(self):
4547 def raise_timeout(*args, **kwargs):
4548 self.serv.settimeout(1.0)
4549 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004550 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004551 "Error generating a timeout exception (UDP)")
4552
4553 def testTimeoutZero(self):
4554 ok = False
4555 try:
4556 self.serv.settimeout(0.0)
4557 foo = self.serv.recv(1024)
4558 except socket.timeout:
4559 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004560 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004561 ok = True
4562 except:
4563 self.fail("caught unexpected exception (UDP)")
4564 if not ok:
4565 self.fail("recv() returned success when we did not expect it")
4566
4567class TestExceptions(unittest.TestCase):
4568
4569 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004570 self.assertTrue(issubclass(OSError, Exception))
4571 self.assertTrue(issubclass(socket.herror, OSError))
4572 self.assertTrue(issubclass(socket.gaierror, OSError))
4573 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004574
Yury Selivanovfa22b292016-10-18 16:03:52 -04004575 def test_setblocking_invalidfd(self):
4576 # Regression test for issue #28471
4577
4578 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4579 sock = socket.socket(
4580 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4581 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004582 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004583
4584 with self.assertRaises(OSError):
4585 sock.setblocking(False)
4586
4587
Serhiy Storchaka43767632013-11-03 21:31:38 +02004588@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004589class TestLinuxAbstractNamespace(unittest.TestCase):
4590
4591 UNIX_PATH_MAX = 108
4592
4593 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004594 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004595 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4596 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004597 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004598 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4599 s2.connect(s1.getsockname())
4600 with s1.accept()[0] as s3:
4601 self.assertEqual(s1.getsockname(), address)
4602 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004603
4604 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004605 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004606 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4607 s.bind(address)
4608 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004609
4610 def testNameOverflow(self):
4611 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004612 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004613 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004614
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004615 def testStrName(self):
4616 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004617 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4618 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004619 s.bind("\x00python\x00test\x00")
4620 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004621 finally:
4622 s.close()
4623
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004624 def testBytearrayName(self):
4625 # Check that an abstract name can be passed as a bytearray.
4626 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4627 s.bind(bytearray(b"\x00python\x00test\x00"))
4628 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4629
Serhiy Storchaka43767632013-11-03 21:31:38 +02004630@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004631class TestUnixDomain(unittest.TestCase):
4632
4633 def setUp(self):
4634 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4635
4636 def tearDown(self):
4637 self.sock.close()
4638
4639 def encoded(self, path):
4640 # Return the given path encoded in the file system encoding,
4641 # or skip the test if this is not possible.
4642 try:
4643 return os.fsencode(path)
4644 except UnicodeEncodeError:
4645 self.skipTest(
4646 "Pathname {0!a} cannot be represented in file "
4647 "system encoding {1!r}".format(
4648 path, sys.getfilesystemencoding()))
4649
Antoine Pitrou16374872011-12-16 15:04:12 +01004650 def bind(self, sock, path):
4651 # Bind the socket
4652 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004653 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004654 except OSError as e:
4655 if str(e) == "AF_UNIX path too long":
4656 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004657 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004658 .format(path))
4659 else:
4660 raise
4661
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004662 def testStrAddr(self):
4663 # Test binding to and retrieving a normal string pathname.
4664 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004665 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004666 self.addCleanup(support.unlink, path)
4667 self.assertEqual(self.sock.getsockname(), path)
4668
4669 def testBytesAddr(self):
4670 # Test binding to a bytes pathname.
4671 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004672 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004673 self.addCleanup(support.unlink, path)
4674 self.assertEqual(self.sock.getsockname(), path)
4675
4676 def testSurrogateescapeBind(self):
4677 # Test binding to a valid non-ASCII pathname, with the
4678 # non-ASCII bytes supplied using surrogateescape encoding.
4679 path = os.path.abspath(support.TESTFN_UNICODE)
4680 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004681 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004682 self.addCleanup(support.unlink, path)
4683 self.assertEqual(self.sock.getsockname(), path)
4684
4685 def testUnencodableAddr(self):
4686 # Test binding to a pathname that cannot be encoded in the
4687 # file system encoding.
4688 if support.TESTFN_UNENCODABLE is None:
4689 self.skipTest("No unencodable filename available")
4690 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004691 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004692 self.addCleanup(support.unlink, path)
4693 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004694
Victor Stinner45df8202010-04-28 22:31:17 +00004695@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004696class BufferIOTest(SocketConnectedTest):
4697 """
4698 Test the buffer versions of socket.recv() and socket.send().
4699 """
4700 def __init__(self, methodName='runTest'):
4701 SocketConnectedTest.__init__(self, methodName=methodName)
4702
Antoine Pitrou25480782010-03-17 22:50:28 +00004703 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004704 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004705 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004706 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004707 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004708 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004709 self.assertEqual(msg, MSG)
4710
Antoine Pitrou25480782010-03-17 22:50:28 +00004711 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004712 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004713 self.serv_conn.send(buf)
4714
Antoine Pitrou25480782010-03-17 22:50:28 +00004715 def testRecvIntoBytearray(self):
4716 buf = bytearray(1024)
4717 nbytes = self.cli_conn.recv_into(buf)
4718 self.assertEqual(nbytes, len(MSG))
4719 msg = buf[:len(MSG)]
4720 self.assertEqual(msg, MSG)
4721
4722 _testRecvIntoBytearray = _testRecvIntoArray
4723
4724 def testRecvIntoMemoryview(self):
4725 buf = bytearray(1024)
4726 nbytes = self.cli_conn.recv_into(memoryview(buf))
4727 self.assertEqual(nbytes, len(MSG))
4728 msg = buf[:len(MSG)]
4729 self.assertEqual(msg, MSG)
4730
4731 _testRecvIntoMemoryview = _testRecvIntoArray
4732
4733 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004734 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004735 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004736 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004737 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004738 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004739 self.assertEqual(msg, MSG)
4740
Antoine Pitrou25480782010-03-17 22:50:28 +00004741 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004742 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004743 self.serv_conn.send(buf)
4744
Antoine Pitrou25480782010-03-17 22:50:28 +00004745 def testRecvFromIntoBytearray(self):
4746 buf = bytearray(1024)
4747 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4748 self.assertEqual(nbytes, len(MSG))
4749 msg = buf[:len(MSG)]
4750 self.assertEqual(msg, MSG)
4751
4752 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4753
4754 def testRecvFromIntoMemoryview(self):
4755 buf = bytearray(1024)
4756 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4757 self.assertEqual(nbytes, len(MSG))
4758 msg = buf[:len(MSG)]
4759 self.assertEqual(msg, MSG)
4760
4761 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4762
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004763 def testRecvFromIntoSmallBuffer(self):
4764 # See issue #20246.
4765 buf = bytearray(8)
4766 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4767
4768 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004769 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004770
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004771 def testRecvFromIntoEmptyBuffer(self):
4772 buf = bytearray()
4773 self.cli_conn.recvfrom_into(buf)
4774 self.cli_conn.recvfrom_into(buf, 0)
4775
4776 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4777
Christian Heimes043d6f62008-01-07 17:19:16 +00004778
4779TIPC_STYPE = 2000
4780TIPC_LOWER = 200
4781TIPC_UPPER = 210
4782
4783def isTipcAvailable():
4784 """Check if the TIPC module is loaded
4785
4786 The TIPC module is not loaded automatically on Ubuntu and probably
4787 other Linux distros.
4788 """
4789 if not hasattr(socket, "AF_TIPC"):
4790 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004791 try:
4792 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00004793 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00004794 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00004795 # have not the permission to read it.
4796 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004797 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00004798 for line in f:
4799 if line.startswith("tipc "):
4800 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004801 return False
4802
Serhiy Storchaka43767632013-11-03 21:31:38 +02004803@unittest.skipUnless(isTipcAvailable(),
4804 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004805class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004806 def testRDM(self):
4807 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4808 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004809 self.addCleanup(srv.close)
4810 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004811
4812 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4813 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4814 TIPC_LOWER, TIPC_UPPER)
4815 srv.bind(srvaddr)
4816
4817 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4818 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4819 cli.sendto(MSG, sendaddr)
4820
4821 msg, recvaddr = srv.recvfrom(1024)
4822
4823 self.assertEqual(cli.getsockname(), recvaddr)
4824 self.assertEqual(msg, MSG)
4825
4826
Serhiy Storchaka43767632013-11-03 21:31:38 +02004827@unittest.skipUnless(isTipcAvailable(),
4828 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004829class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004830 def __init__(self, methodName = 'runTest'):
4831 unittest.TestCase.__init__(self, methodName = methodName)
4832 ThreadableTest.__init__(self)
4833
4834 def setUp(self):
4835 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004836 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004837 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4838 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4839 TIPC_LOWER, TIPC_UPPER)
4840 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004841 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004842 self.serverExplicitReady()
4843 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004844 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004845
4846 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00004847 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00004848 # accept() call; sleep a little while to avoid it, otherwise
4849 # we could get an exception
4850 time.sleep(0.1)
4851 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004852 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004853 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4854 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4855 self.cli.connect(addr)
4856 self.cliaddr = self.cli.getsockname()
4857
4858 def testStream(self):
4859 msg = self.conn.recv(1024)
4860 self.assertEqual(msg, MSG)
4861 self.assertEqual(self.cliaddr, self.connaddr)
4862
4863 def _testStream(self):
4864 self.cli.send(MSG)
4865 self.cli.close()
4866
4867
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004868@unittest.skipUnless(thread, 'Threading required for this test.')
4869class ContextManagersTest(ThreadedTCPSocketTest):
4870
4871 def _testSocketClass(self):
4872 # base test
4873 with socket.socket() as sock:
4874 self.assertFalse(sock._closed)
4875 self.assertTrue(sock._closed)
4876 # close inside with block
4877 with socket.socket() as sock:
4878 sock.close()
4879 self.assertTrue(sock._closed)
4880 # exception inside with block
4881 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004882 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004883 self.assertTrue(sock._closed)
4884
4885 def testCreateConnectionBase(self):
4886 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004887 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004888 data = conn.recv(1024)
4889 conn.sendall(data)
4890
4891 def _testCreateConnectionBase(self):
4892 address = self.serv.getsockname()
4893 with socket.create_connection(address) as sock:
4894 self.assertFalse(sock._closed)
4895 sock.sendall(b'foo')
4896 self.assertEqual(sock.recv(1024), b'foo')
4897 self.assertTrue(sock._closed)
4898
4899 def testCreateConnectionClose(self):
4900 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004901 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004902 data = conn.recv(1024)
4903 conn.sendall(data)
4904
4905 def _testCreateConnectionClose(self):
4906 address = self.serv.getsockname()
4907 with socket.create_connection(address) as sock:
4908 sock.close()
4909 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004910 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004911
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004912
Victor Stinnerdaf45552013-08-28 00:53:59 +02004913class InheritanceTest(unittest.TestCase):
4914 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4915 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004916 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004917 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004918 with socket.socket(socket.AF_INET,
4919 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4920 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004921 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004922
4923 def test_default_inheritable(self):
4924 sock = socket.socket()
4925 with sock:
4926 self.assertEqual(sock.get_inheritable(), False)
4927
4928 def test_dup(self):
4929 sock = socket.socket()
4930 with sock:
4931 newsock = sock.dup()
4932 sock.close()
4933 with newsock:
4934 self.assertEqual(newsock.get_inheritable(), False)
4935
4936 def test_set_inheritable(self):
4937 sock = socket.socket()
4938 with sock:
4939 sock.set_inheritable(True)
4940 self.assertEqual(sock.get_inheritable(), True)
4941
4942 sock.set_inheritable(False)
4943 self.assertEqual(sock.get_inheritable(), False)
4944
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004945 @unittest.skipIf(fcntl is None, "need fcntl")
4946 def test_get_inheritable_cloexec(self):
4947 sock = socket.socket()
4948 with sock:
4949 fd = sock.fileno()
4950 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004951
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004952 # clear FD_CLOEXEC flag
4953 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4954 flags &= ~fcntl.FD_CLOEXEC
4955 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004956
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004957 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004958
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004959 @unittest.skipIf(fcntl is None, "need fcntl")
4960 def test_set_inheritable_cloexec(self):
4961 sock = socket.socket()
4962 with sock:
4963 fd = sock.fileno()
4964 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4965 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004966
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004967 sock.set_inheritable(True)
4968 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4969 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004970
4971
Victor Stinnerdaf45552013-08-28 00:53:59 +02004972 @unittest.skipUnless(hasattr(socket, "socketpair"),
4973 "need socket.socketpair()")
4974 def test_socketpair(self):
4975 s1, s2 = socket.socketpair()
4976 self.addCleanup(s1.close)
4977 self.addCleanup(s2.close)
4978 self.assertEqual(s1.get_inheritable(), False)
4979 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004980
4981
4982@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4983 "SOCK_NONBLOCK not defined")
4984class NonblockConstantTest(unittest.TestCase):
4985 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4986 if nonblock:
4987 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4988 self.assertEqual(s.gettimeout(), timeout)
4989 else:
4990 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4991 self.assertEqual(s.gettimeout(), None)
4992
Charles-François Natali239bb962011-06-03 12:55:15 +02004993 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004994 def test_SOCK_NONBLOCK(self):
4995 # a lot of it seems silly and redundant, but I wanted to test that
4996 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004997 with socket.socket(socket.AF_INET,
4998 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4999 self.checkNonblock(s)
5000 s.setblocking(1)
5001 self.checkNonblock(s, False)
5002 s.setblocking(0)
5003 self.checkNonblock(s)
5004 s.settimeout(None)
5005 self.checkNonblock(s, False)
5006 s.settimeout(2.0)
5007 self.checkNonblock(s, timeout=2.0)
5008 s.setblocking(1)
5009 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005010 # defaulttimeout
5011 t = socket.getdefaulttimeout()
5012 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005013 with socket.socket() as s:
5014 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005015 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005016 with socket.socket() as s:
5017 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005018 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005019 with socket.socket() as s:
5020 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005021 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005022 with socket.socket() as s:
5023 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005024 socket.setdefaulttimeout(t)
5025
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005026
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005027@unittest.skipUnless(os.name == "nt", "Windows specific")
5028@unittest.skipUnless(multiprocessing, "need multiprocessing")
5029class TestSocketSharing(SocketTCPTest):
5030 # This must be classmethod and not staticmethod or multiprocessing
5031 # won't be able to bootstrap it.
5032 @classmethod
5033 def remoteProcessServer(cls, q):
5034 # Recreate socket from shared data
5035 sdata = q.get()
5036 message = q.get()
5037
5038 s = socket.fromshare(sdata)
5039 s2, c = s.accept()
5040
5041 # Send the message
5042 s2.sendall(message)
5043 s2.close()
5044 s.close()
5045
5046 def testShare(self):
5047 # Transfer the listening server socket to another process
5048 # and service it from there.
5049
5050 # Create process:
5051 q = multiprocessing.Queue()
5052 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5053 p.start()
5054
5055 # Get the shared socket data
5056 data = self.serv.share(p.pid)
5057
5058 # Pass the shared socket to the other process
5059 addr = self.serv.getsockname()
5060 self.serv.close()
5061 q.put(data)
5062
5063 # The data that the server will send us
5064 message = b"slapmahfro"
5065 q.put(message)
5066
5067 # Connect
5068 s = socket.create_connection(addr)
5069 # listen for the data
5070 m = []
5071 while True:
5072 data = s.recv(100)
5073 if not data:
5074 break
5075 m.append(data)
5076 s.close()
5077 received = b"".join(m)
5078 self.assertEqual(received, message)
5079 p.join()
5080
5081 def testShareLength(self):
5082 data = self.serv.share(os.getpid())
5083 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5084 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5085
5086 def compareSockets(self, org, other):
5087 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005088 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005089 self.assertEqual(org.gettimeout(), None)
5090 self.assertEqual(org.gettimeout(), other.gettimeout())
5091
5092 self.assertEqual(org.family, other.family)
5093 self.assertEqual(org.type, other.type)
5094 # If the user specified "0" for proto, then
5095 # internally windows will have picked the correct value.
5096 # Python introspection on the socket however will still return
5097 # 0. For the shared socket, the python value is recreated
5098 # from the actual value, so it may not compare correctly.
5099 if org.proto != 0:
5100 self.assertEqual(org.proto, other.proto)
5101
5102 def testShareLocal(self):
5103 data = self.serv.share(os.getpid())
5104 s = socket.fromshare(data)
5105 try:
5106 self.compareSockets(self.serv, s)
5107 finally:
5108 s.close()
5109
5110 def testTypes(self):
5111 families = [socket.AF_INET, socket.AF_INET6]
5112 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5113 for f in families:
5114 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005115 try:
5116 source = socket.socket(f, t)
5117 except OSError:
5118 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005119 try:
5120 data = source.share(os.getpid())
5121 shared = socket.fromshare(data)
5122 try:
5123 self.compareSockets(source, shared)
5124 finally:
5125 shared.close()
5126 finally:
5127 source.close()
5128
5129
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005130@unittest.skipUnless(thread, 'Threading required for this test.')
5131class SendfileUsingSendTest(ThreadedTCPSocketTest):
5132 """
5133 Test the send() implementation of socket.sendfile().
5134 """
5135
5136 FILESIZE = (10 * 1024 * 1024) # 10MB
5137 BUFSIZE = 8192
5138 FILEDATA = b""
5139 TIMEOUT = 2
5140
5141 @classmethod
5142 def setUpClass(cls):
5143 def chunks(total, step):
5144 assert total >= step
5145 while total > step:
5146 yield step
5147 total -= step
5148 if total:
5149 yield total
5150
5151 chunk = b"".join([random.choice(string.ascii_letters).encode()
5152 for i in range(cls.BUFSIZE)])
5153 with open(support.TESTFN, 'wb') as f:
5154 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5155 f.write(chunk)
5156 with open(support.TESTFN, 'rb') as f:
5157 cls.FILEDATA = f.read()
5158 assert len(cls.FILEDATA) == cls.FILESIZE
5159
5160 @classmethod
5161 def tearDownClass(cls):
5162 support.unlink(support.TESTFN)
5163
5164 def accept_conn(self):
5165 self.serv.settimeout(self.TIMEOUT)
5166 conn, addr = self.serv.accept()
5167 conn.settimeout(self.TIMEOUT)
5168 self.addCleanup(conn.close)
5169 return conn
5170
5171 def recv_data(self, conn):
5172 received = []
5173 while True:
5174 chunk = conn.recv(self.BUFSIZE)
5175 if not chunk:
5176 break
5177 received.append(chunk)
5178 return b''.join(received)
5179
5180 def meth_from_sock(self, sock):
5181 # Depending on the mixin class being run return either send()
5182 # or sendfile() method implementation.
5183 return getattr(sock, "_sendfile_use_send")
5184
5185 # regular file
5186
5187 def _testRegularFile(self):
5188 address = self.serv.getsockname()
5189 file = open(support.TESTFN, 'rb')
5190 with socket.create_connection(address) as sock, file as file:
5191 meth = self.meth_from_sock(sock)
5192 sent = meth(file)
5193 self.assertEqual(sent, self.FILESIZE)
5194 self.assertEqual(file.tell(), self.FILESIZE)
5195
5196 def testRegularFile(self):
5197 conn = self.accept_conn()
5198 data = self.recv_data(conn)
5199 self.assertEqual(len(data), self.FILESIZE)
5200 self.assertEqual(data, self.FILEDATA)
5201
5202 # non regular file
5203
5204 def _testNonRegularFile(self):
5205 address = self.serv.getsockname()
5206 file = io.BytesIO(self.FILEDATA)
5207 with socket.create_connection(address) as sock, file as file:
5208 sent = sock.sendfile(file)
5209 self.assertEqual(sent, self.FILESIZE)
5210 self.assertEqual(file.tell(), self.FILESIZE)
5211 self.assertRaises(socket._GiveupOnSendfile,
5212 sock._sendfile_use_sendfile, file)
5213
5214 def testNonRegularFile(self):
5215 conn = self.accept_conn()
5216 data = self.recv_data(conn)
5217 self.assertEqual(len(data), self.FILESIZE)
5218 self.assertEqual(data, self.FILEDATA)
5219
5220 # empty file
5221
5222 def _testEmptyFileSend(self):
5223 address = self.serv.getsockname()
5224 filename = support.TESTFN + "2"
5225 with open(filename, 'wb'):
5226 self.addCleanup(support.unlink, filename)
5227 file = open(filename, 'rb')
5228 with socket.create_connection(address) as sock, file as file:
5229 meth = self.meth_from_sock(sock)
5230 sent = meth(file)
5231 self.assertEqual(sent, 0)
5232 self.assertEqual(file.tell(), 0)
5233
5234 def testEmptyFileSend(self):
5235 conn = self.accept_conn()
5236 data = self.recv_data(conn)
5237 self.assertEqual(data, b"")
5238
5239 # offset
5240
5241 def _testOffset(self):
5242 address = self.serv.getsockname()
5243 file = open(support.TESTFN, 'rb')
5244 with socket.create_connection(address) as sock, file as file:
5245 meth = self.meth_from_sock(sock)
5246 sent = meth(file, offset=5000)
5247 self.assertEqual(sent, self.FILESIZE - 5000)
5248 self.assertEqual(file.tell(), self.FILESIZE)
5249
5250 def testOffset(self):
5251 conn = self.accept_conn()
5252 data = self.recv_data(conn)
5253 self.assertEqual(len(data), self.FILESIZE - 5000)
5254 self.assertEqual(data, self.FILEDATA[5000:])
5255
5256 # count
5257
5258 def _testCount(self):
5259 address = self.serv.getsockname()
5260 file = open(support.TESTFN, 'rb')
5261 with socket.create_connection(address, timeout=2) as sock, file as file:
5262 count = 5000007
5263 meth = self.meth_from_sock(sock)
5264 sent = meth(file, count=count)
5265 self.assertEqual(sent, count)
5266 self.assertEqual(file.tell(), count)
5267
5268 def testCount(self):
5269 count = 5000007
5270 conn = self.accept_conn()
5271 data = self.recv_data(conn)
5272 self.assertEqual(len(data), count)
5273 self.assertEqual(data, self.FILEDATA[:count])
5274
5275 # count small
5276
5277 def _testCountSmall(self):
5278 address = self.serv.getsockname()
5279 file = open(support.TESTFN, 'rb')
5280 with socket.create_connection(address, timeout=2) as sock, file as file:
5281 count = 1
5282 meth = self.meth_from_sock(sock)
5283 sent = meth(file, count=count)
5284 self.assertEqual(sent, count)
5285 self.assertEqual(file.tell(), count)
5286
5287 def testCountSmall(self):
5288 count = 1
5289 conn = self.accept_conn()
5290 data = self.recv_data(conn)
5291 self.assertEqual(len(data), count)
5292 self.assertEqual(data, self.FILEDATA[:count])
5293
5294 # count + offset
5295
5296 def _testCountWithOffset(self):
5297 address = self.serv.getsockname()
5298 file = open(support.TESTFN, 'rb')
5299 with socket.create_connection(address, timeout=2) as sock, file as file:
5300 count = 100007
5301 meth = self.meth_from_sock(sock)
5302 sent = meth(file, offset=2007, count=count)
5303 self.assertEqual(sent, count)
5304 self.assertEqual(file.tell(), count + 2007)
5305
5306 def testCountWithOffset(self):
5307 count = 100007
5308 conn = self.accept_conn()
5309 data = self.recv_data(conn)
5310 self.assertEqual(len(data), count)
5311 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5312
5313 # non blocking sockets are not supposed to work
5314
5315 def _testNonBlocking(self):
5316 address = self.serv.getsockname()
5317 file = open(support.TESTFN, 'rb')
5318 with socket.create_connection(address) as sock, file as file:
5319 sock.setblocking(False)
5320 meth = self.meth_from_sock(sock)
5321 self.assertRaises(ValueError, meth, file)
5322 self.assertRaises(ValueError, sock.sendfile, file)
5323
5324 def testNonBlocking(self):
5325 conn = self.accept_conn()
5326 if conn.recv(8192):
5327 self.fail('was not supposed to receive any data')
5328
5329 # timeout (non-triggered)
5330
5331 def _testWithTimeout(self):
5332 address = self.serv.getsockname()
5333 file = open(support.TESTFN, 'rb')
5334 with socket.create_connection(address, timeout=2) as sock, file as file:
5335 meth = self.meth_from_sock(sock)
5336 sent = meth(file)
5337 self.assertEqual(sent, self.FILESIZE)
5338
5339 def testWithTimeout(self):
5340 conn = self.accept_conn()
5341 data = self.recv_data(conn)
5342 self.assertEqual(len(data), self.FILESIZE)
5343 self.assertEqual(data, self.FILEDATA)
5344
5345 # timeout (triggered)
5346
5347 def _testWithTimeoutTriggeredSend(self):
5348 address = self.serv.getsockname()
5349 file = open(support.TESTFN, 'rb')
5350 with socket.create_connection(address, timeout=0.01) as sock, \
5351 file as file:
5352 meth = self.meth_from_sock(sock)
5353 self.assertRaises(socket.timeout, meth, file)
5354
5355 def testWithTimeoutTriggeredSend(self):
5356 conn = self.accept_conn()
5357 conn.recv(88192)
5358
5359 # errors
5360
5361 def _test_errors(self):
5362 pass
5363
5364 def test_errors(self):
5365 with open(support.TESTFN, 'rb') as file:
5366 with socket.socket(type=socket.SOCK_DGRAM) as s:
5367 meth = self.meth_from_sock(s)
5368 self.assertRaisesRegex(
5369 ValueError, "SOCK_STREAM", meth, file)
5370 with open(support.TESTFN, 'rt') as file:
5371 with socket.socket() as s:
5372 meth = self.meth_from_sock(s)
5373 self.assertRaisesRegex(
5374 ValueError, "binary mode", meth, file)
5375 with open(support.TESTFN, 'rb') as file:
5376 with socket.socket() as s:
5377 meth = self.meth_from_sock(s)
5378 self.assertRaisesRegex(TypeError, "positive integer",
5379 meth, file, count='2')
5380 self.assertRaisesRegex(TypeError, "positive integer",
5381 meth, file, count=0.1)
5382 self.assertRaisesRegex(ValueError, "positive integer",
5383 meth, file, count=0)
5384 self.assertRaisesRegex(ValueError, "positive integer",
5385 meth, file, count=-1)
5386
5387
5388@unittest.skipUnless(thread, 'Threading required for this test.')
5389@unittest.skipUnless(hasattr(os, "sendfile"),
5390 'os.sendfile() required for this test.')
5391class SendfileUsingSendfileTest(SendfileUsingSendTest):
5392 """
5393 Test the sendfile() implementation of socket.sendfile().
5394 """
5395 def meth_from_sock(self, sock):
5396 return getattr(sock, "_sendfile_use_sendfile")
5397
Christian Heimes48371412016-09-06 00:37:46 +02005398
5399@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005400class LinuxKernelCryptoAPI(unittest.TestCase):
5401 # tests for AF_ALG
5402 def create_alg(self, typ, name):
5403 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005404 try:
5405 sock.bind((typ, name))
5406 except FileNotFoundError as e:
5407 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005408 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005409 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005410 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005411 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005412
5413 def test_sha256(self):
5414 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5415 "177a9cb410ff61f20015ad")
5416 with self.create_alg('hash', 'sha256') as algo:
5417 op, _ = algo.accept()
5418 with op:
5419 op.sendall(b"abc")
5420 self.assertEqual(op.recv(512), expected)
5421
5422 op, _ = algo.accept()
5423 with op:
5424 op.send(b'a', socket.MSG_MORE)
5425 op.send(b'b', socket.MSG_MORE)
5426 op.send(b'c', socket.MSG_MORE)
5427 op.send(b'')
5428 self.assertEqual(op.recv(512), expected)
5429
5430 def test_hmac_sha1(self):
5431 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5432 with self.create_alg('hash', 'hmac(sha1)') as algo:
5433 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5434 op, _ = algo.accept()
5435 with op:
5436 op.sendall(b"what do ya want for nothing?")
5437 self.assertEqual(op.recv(512), expected)
5438
Christian Heimese084f842016-09-11 20:11:30 +02005439 # Although it should work with 3.19 and newer the test blocks on
5440 # Ubuntu 15.10 with Kernel 4.2.0-19.
5441 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005442 def test_aes_cbc(self):
5443 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5444 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5445 msg = b"Single block msg"
5446 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5447 msglen = len(msg)
5448 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5449 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5450 op, _ = algo.accept()
5451 with op:
5452 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5453 flags=socket.MSG_MORE)
5454 op.sendall(msg)
5455 self.assertEqual(op.recv(msglen), ciphertext)
5456
5457 op, _ = algo.accept()
5458 with op:
5459 op.sendmsg_afalg([ciphertext],
5460 op=socket.ALG_OP_DECRYPT, iv=iv)
5461 self.assertEqual(op.recv(msglen), msg)
5462
5463 # long message
5464 multiplier = 1024
5465 longmsg = [msg] * multiplier
5466 op, _ = algo.accept()
5467 with op:
5468 op.sendmsg_afalg(longmsg,
5469 op=socket.ALG_OP_ENCRYPT, iv=iv)
5470 enc = op.recv(msglen * multiplier)
5471 self.assertEqual(len(enc), msglen * multiplier)
5472 self.assertTrue(enc[:msglen], ciphertext)
5473
5474 op, _ = algo.accept()
5475 with op:
5476 op.sendmsg_afalg([enc],
5477 op=socket.ALG_OP_DECRYPT, iv=iv)
5478 dec = op.recv(msglen * multiplier)
5479 self.assertEqual(len(dec), msglen * multiplier)
5480 self.assertEqual(dec, msg * multiplier)
5481
Mariatta4ac01f02017-03-16 20:58:42 -07005482 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005483 def test_aead_aes_gcm(self):
5484 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5485 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5486 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5487 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5488 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5489 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5490
5491 taglen = len(expected_tag)
5492 assoclen = len(assoc)
5493
5494 with self.create_alg('aead', 'gcm(aes)') as algo:
5495 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5496 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5497 None, taglen)
5498
5499 # send assoc, plain and tag buffer in separate steps
5500 op, _ = algo.accept()
5501 with op:
5502 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5503 assoclen=assoclen, flags=socket.MSG_MORE)
5504 op.sendall(assoc, socket.MSG_MORE)
Mariatta4ac01f02017-03-16 20:58:42 -07005505 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005506 res = op.recv(assoclen + len(plain) + taglen)
5507 self.assertEqual(expected_ct, res[assoclen:-taglen])
5508 self.assertEqual(expected_tag, res[-taglen:])
5509
5510 # now with msg
5511 op, _ = algo.accept()
5512 with op:
Mariatta4ac01f02017-03-16 20:58:42 -07005513 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005514 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5515 assoclen=assoclen)
5516 res = op.recv(assoclen + len(plain) + taglen)
5517 self.assertEqual(expected_ct, res[assoclen:-taglen])
5518 self.assertEqual(expected_tag, res[-taglen:])
5519
5520 # create anc data manually
5521 pack_uint32 = struct.Struct('I').pack
5522 op, _ = algo.accept()
5523 with op:
Mariatta4ac01f02017-03-16 20:58:42 -07005524 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005525 op.sendmsg(
5526 [msg],
5527 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5528 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5529 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5530 )
5531 )
Mariatta4ac01f02017-03-16 20:58:42 -07005532 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005533 self.assertEqual(expected_ct, res[assoclen:-taglen])
5534 self.assertEqual(expected_tag, res[-taglen:])
5535
5536 # decrypt and verify
5537 op, _ = algo.accept()
5538 with op:
5539 msg = assoc + expected_ct + expected_tag
5540 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5541 assoclen=assoclen)
Mariatta4ac01f02017-03-16 20:58:42 -07005542 res = op.recv(len(msg) - taglen)
5543 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005544
Christian Heimese084f842016-09-11 20:11:30 +02005545 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005546 def test_drbg_pr_sha256(self):
5547 # deterministic random bit generator, prediction resistance, sha256
5548 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5549 extra_seed = os.urandom(32)
5550 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5551 op, _ = algo.accept()
5552 with op:
5553 rn = op.recv(32)
5554 self.assertEqual(len(rn), 32)
5555
5556 def test_sendmsg_afalg_args(self):
5557 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005558 with sock:
5559 with self.assertRaises(TypeError):
5560 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005561
Christian Heimes02b30352016-09-11 19:49:56 +02005562 with self.assertRaises(TypeError):
5563 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005564
Christian Heimes02b30352016-09-11 19:49:56 +02005565 with self.assertRaises(TypeError):
5566 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005567
Christian Heimes02b30352016-09-11 19:49:56 +02005568 with self.assertRaises(TypeError):
5569 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005570
Christian Heimes02b30352016-09-11 19:49:56 +02005571 with self.assertRaises(TypeError):
5572 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5573
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005574
Guido van Rossumb995eb72002-07-31 16:08:40 +00005575def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005576 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005577 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005578
5579 tests.extend([
5580 NonBlockingTCPTests,
5581 FileObjectClassTestCase,
5582 UnbufferedFileObjectClassTestCase,
5583 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005584 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005585 UnicodeReadFileObjectClassTestCase,
5586 UnicodeWriteFileObjectClassTestCase,
5587 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005588 NetworkConnectionNoServer,
5589 NetworkConnectionAttributesTest,
5590 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005591 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005592 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005593 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005594 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005595 tests.append(BasicSocketPairTest)
5596 tests.append(TestUnixDomain)
5597 tests.append(TestLinuxAbstractNamespace)
5598 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005599 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005600 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005601 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005602 tests.extend([
5603 CmsgMacroTests,
5604 SendmsgUDPTest,
5605 RecvmsgUDPTest,
5606 RecvmsgIntoUDPTest,
5607 SendmsgUDP6Test,
5608 RecvmsgUDP6Test,
5609 RecvmsgRFC3542AncillaryUDP6Test,
5610 RecvmsgIntoRFC3542AncillaryUDP6Test,
5611 RecvmsgIntoUDP6Test,
5612 SendmsgTCPTest,
5613 RecvmsgTCPTest,
5614 RecvmsgIntoTCPTest,
5615 SendmsgSCTPStreamTest,
5616 RecvmsgSCTPStreamTest,
5617 RecvmsgIntoSCTPStreamTest,
5618 SendmsgUnixStreamTest,
5619 RecvmsgUnixStreamTest,
5620 RecvmsgIntoUnixStreamTest,
5621 RecvmsgSCMRightsStreamTest,
5622 RecvmsgIntoSCMRightsStreamTest,
5623 # These are slow when setitimer() is not available
5624 InterruptedRecvTimeoutTest,
5625 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005626 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005627 SendfileUsingSendTest,
5628 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005629 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005630
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005631 thread_info = support.threading_setup()
5632 support.run_unittest(*tests)
5633 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005634
5635if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005636 test_main()