blob: b5c9c0cf2187e777f54411661c0b3898e3e92700 [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):
806 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
807 '1:1:1:1:1:1:1:1:1']:
808 self.assertRaises(OSError, socket.gethostbyname, addr)
809 self.assertRaises(OSError, socket.gethostbyaddr, addr)
810
811 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
812 self.assertEqual(socket.gethostbyname(addr), addr)
813
814 # we don't test support.HOSTv6 because there's a chance it doesn't have
815 # a matching name entry (e.g. 'ip6-localhost')
816 for host in [support.HOST]:
817 self.assertIn(host, socket.gethostbyaddr(host)[2])
818
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000819 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
820 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
821 def test_sethostname(self):
822 oldhn = socket.gethostname()
823 try:
824 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200825 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000826 if e.errno == errno.EPERM:
827 self.skipTest("test should be run as root")
828 else:
829 raise
830 try:
831 # running test as root!
832 self.assertEqual(socket.gethostname(), 'new')
833 # Should work with bytes objects too
834 socket.sethostname(b'bar')
835 self.assertEqual(socket.gethostname(), 'bar')
836 finally:
837 socket.sethostname(oldhn)
838
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700839 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
840 'socket.if_nameindex() not available.')
841 def testInterfaceNameIndex(self):
842 interfaces = socket.if_nameindex()
843 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200844 self.assertIsInstance(index, int)
845 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700846 # interface indices are non-zero integers
847 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200848 _index = socket.if_nametoindex(name)
849 self.assertIsInstance(_index, int)
850 self.assertEqual(index, _index)
851 _name = socket.if_indextoname(index)
852 self.assertIsInstance(_name, str)
853 self.assertEqual(name, _name)
854
855 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
856 'socket.if_nameindex() not available.')
857 def testInvalidInterfaceNameIndex(self):
858 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200859 self.assertRaises(OSError, socket.if_indextoname, 0)
860 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200861 # test with invalid values
862 self.assertRaises(TypeError, socket.if_nametoindex, 0)
863 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700864
Serhiy Storchaka43767632013-11-03 21:31:38 +0200865 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
866 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000867 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000868 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200869 try:
870 # On some versions, this loses a reference
871 orig = sys.getrefcount(__name__)
872 socket.getnameinfo(__name__,0)
873 except TypeError:
874 if sys.getrefcount(__name__) != orig:
875 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000876
Guido van Rossum24e4af82002-06-12 19:18:08 +0000877 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000878 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000879 try:
880 # On some versions, this crashes the interpreter.
881 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200882 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000883 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000884
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000885 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000886 # This just checks that htons etc. are their own inverse,
887 # when looking at the lower 16 or 32 bits.
888 sizes = {socket.htonl: 32, socket.ntohl: 32,
889 socket.htons: 16, socket.ntohs: 16}
890 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000891 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000892 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
893 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000894
Guido van Rossuma2627af2002-09-14 00:58:46 +0000895 swapped = func(mask)
896 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000897 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000898
Guido van Rossum018919a2007-01-15 00:07:32 +0000899 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300900 import _testcapi
901 s_good_values = [0, 1, 2, 0xffff]
902 l_good_values = s_good_values + [0xffffffff]
903 l_bad_values = [-1, -2, 1<<32, 1<<1000]
904 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
905 _testcapi.INT_MAX + 1]
906 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
907 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000908 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000909 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300910 for k in l_good_values:
911 socket.ntohl(k)
912 socket.htonl(k)
913 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000914 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000915 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300916 for k in l_bad_values:
917 self.assertRaises(OverflowError, socket.ntohl, k)
918 self.assertRaises(OverflowError, socket.htonl, k)
919 for k in s_deprecated_values:
920 self.assertWarns(DeprecationWarning, socket.ntohs, k)
921 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000922
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
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +0100944 # Issue #26936: Android getservbyname() was broken before API 23.
945 if (not hasattr(sys, 'getandroidapilevel') or
946 sys.getandroidapilevel() >= 23):
947 port2 = socket.getservbyname(service)
948 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400949 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000950 try:
951 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200952 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000953 udpport = None
954 else:
955 eq(udpport, port)
956 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +0100957 # Issue #26936: Android getservbyport() is broken.
958 if not support.is_android:
959 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +0000960 eq(socket.getservbyport(port, 'tcp'), service)
961 if udpport is not None:
962 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000963 # Make sure getservbyport does not accept out of range ports.
964 self.assertRaises(OverflowError, socket.getservbyport, -1)
965 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000966
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000967 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000968 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000969 # The default timeout should initially be None
970 self.assertEqual(socket.getdefaulttimeout(), None)
971 s = socket.socket()
972 self.assertEqual(s.gettimeout(), None)
973 s.close()
974
975 # Set the default timeout to 10, and see if it propagates
976 socket.setdefaulttimeout(10)
977 self.assertEqual(socket.getdefaulttimeout(), 10)
978 s = socket.socket()
979 self.assertEqual(s.gettimeout(), 10)
980 s.close()
981
982 # Reset the default timeout to None, and see if it propagates
983 socket.setdefaulttimeout(None)
984 self.assertEqual(socket.getdefaulttimeout(), None)
985 s = socket.socket()
986 self.assertEqual(s.gettimeout(), None)
987 s.close()
988
989 # Check that setting it to an invalid value raises ValueError
990 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
991
992 # Check that setting it to an invalid type raises TypeError
993 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
994
Serhiy Storchaka43767632013-11-03 21:31:38 +0200995 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
996 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000997 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000998 # Test that issue1008086 and issue767150 are fixed.
999 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001000 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1001 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001002
Serhiy Storchaka43767632013-11-03 21:31:38 +02001003 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1004 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001005 def testIPv4toString(self):
1006 from socket import inet_aton as f, inet_pton, AF_INET
1007 g = lambda a: inet_pton(AF_INET, a)
1008
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001009 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001010 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001011 )
1012
Ezio Melottib3aedd42010-11-20 19:04:17 +00001013 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1014 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1015 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1016 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1017 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001018 assertInvalid(f, '0.0.0.')
1019 assertInvalid(f, '300.0.0.0')
1020 assertInvalid(f, 'a.0.0.0')
1021 assertInvalid(f, '1.2.3.4.5')
1022 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001023
Ezio Melottib3aedd42010-11-20 19:04:17 +00001024 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1025 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1026 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1027 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001028 assertInvalid(g, '0.0.0.')
1029 assertInvalid(g, '300.0.0.0')
1030 assertInvalid(g, 'a.0.0.0')
1031 assertInvalid(g, '1.2.3.4.5')
1032 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001033
Serhiy Storchaka43767632013-11-03 21:31:38 +02001034 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1035 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001036 def testIPv6toString(self):
1037 try:
1038 from socket import inet_pton, AF_INET6, has_ipv6
1039 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001040 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001041 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001042 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001043
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001044 if sys.platform == "win32":
1045 try:
1046 inet_pton(AF_INET6, '::')
1047 except OSError as e:
1048 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001049 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001050
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001051 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001052 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001053 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001054 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001055
Ezio Melottib3aedd42010-11-20 19:04:17 +00001056 self.assertEqual(b'\x00' * 16, f('::'))
1057 self.assertEqual(b'\x00' * 16, f('0::0'))
1058 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1059 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001060 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 +00001061 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1062 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001063 self.assertEqual(
1064 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1065 f('ad42:abc::127:0:254:2')
1066 )
1067 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1068 assertInvalid('0x20::')
1069 assertInvalid(':::')
1070 assertInvalid('::0::')
1071 assertInvalid('1::abc::')
1072 assertInvalid('1::abc::def')
1073 assertInvalid('1:2:3:4:5:6:')
1074 assertInvalid('1:2:3:4:5:6')
1075 assertInvalid('1:2:3:4:5:6:7:8:')
1076 assertInvalid('1:2:3:4:5:6:7:8:0')
1077
1078 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1079 f('::254.42.23.64')
1080 )
1081 self.assertEqual(
1082 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1083 f('42::a29b:254.42.23.64')
1084 )
1085 self.assertEqual(
1086 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1087 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1088 )
1089 assertInvalid('255.254.253.252')
1090 assertInvalid('1::260.2.3.0')
1091 assertInvalid('1::0.be.e.0')
1092 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1093 assertInvalid('::1.2.3.4:0')
1094 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001095
Serhiy Storchaka43767632013-11-03 21:31:38 +02001096 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1097 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001098 def testStringToIPv4(self):
1099 from socket import inet_ntoa as f, inet_ntop, AF_INET
1100 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001101 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001102 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001103 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001104
Ezio Melottib3aedd42010-11-20 19:04:17 +00001105 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1106 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1107 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1108 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001109 assertInvalid(f, b'\x00' * 3)
1110 assertInvalid(f, b'\x00' * 5)
1111 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001112 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001113
Ezio Melottib3aedd42010-11-20 19:04:17 +00001114 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1115 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1116 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001117 assertInvalid(g, b'\x00' * 3)
1118 assertInvalid(g, b'\x00' * 5)
1119 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001120 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001121
Serhiy Storchaka43767632013-11-03 21:31:38 +02001122 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1123 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001124 def testStringToIPv6(self):
1125 try:
1126 from socket import inet_ntop, AF_INET6, has_ipv6
1127 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001128 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001129 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001130 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001131
1132 if sys.platform == "win32":
1133 try:
1134 inet_ntop(AF_INET6, b'\x00' * 16)
1135 except OSError as e:
1136 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001137 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001138
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001139 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001140 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001141 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001142 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001143
Ezio Melottib3aedd42010-11-20 19:04:17 +00001144 self.assertEqual('::', f(b'\x00' * 16))
1145 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1146 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001147 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001148 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 +00001149 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001150 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001151
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001152 assertInvalid(b'\x12' * 15)
1153 assertInvalid(b'\x12' * 17)
1154 assertInvalid(b'\x12' * 4)
1155
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001156 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001157
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001158 def testSockName(self):
1159 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001160 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001161 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001162 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001163 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001164 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001165 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1166 # it reasonable to get the host's addr in addition to 0.0.0.0.
1167 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001168 try:
1169 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001170 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001171 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001172 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001173 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001174 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001175
1176 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001177 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001178 # We know a socket should start without reuse==0
1179 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001180 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001181 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001182 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001183
1184 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001185 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001186 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001187 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001188 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1189 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001190 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001191
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001192 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001193 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001194 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1195 sock.settimeout(1)
1196 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001197 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001198
Martin Panter50ab1a32016-04-11 00:38:12 +00001199 def testCloseException(self):
1200 sock = socket.socket()
1201 socket.socket(fileno=sock.fileno()).close()
1202 try:
1203 sock.close()
1204 except OSError as err:
1205 # Winsock apparently raises ENOTSOCK
1206 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1207 else:
1208 self.fail("close() should raise EBADF/ENOTSOCK")
1209
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001210 def testNewAttributes(self):
1211 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001212
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001213 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1214 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001215 if hasattr(socket, 'SOCK_CLOEXEC'):
1216 self.assertIn(sock.type,
1217 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1218 socket.SOCK_STREAM))
1219 else:
1220 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001221 self.assertEqual(sock.proto, 0)
1222 sock.close()
1223
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001224 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001225 sock = socket.socket()
1226 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001227 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001228 big_port = port + 65536
1229 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001230 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1231 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1232 # Since find_unused_port() is inherently subject to race conditions, we
1233 # call it a couple times if necessary.
1234 for i in itertools.count():
1235 port = support.find_unused_port()
1236 try:
1237 sock.bind((HOST, port))
1238 except OSError as e:
1239 if e.errno != errno.EADDRINUSE or i == 5:
1240 raise
1241 else:
1242 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001243
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001244 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001245 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001246 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1247 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1248 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1249 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001250 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1251 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001252 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001253 self.assertRaises(ValueError, s.ioctl, -1, None)
1254 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001255
Steve Dowerea93ac02016-06-17 12:52:18 -07001256 @unittest.skipUnless(os.name == "nt", "Windows specific")
1257 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1258 'Loopback fast path support required for this test')
1259 def test_sio_loopback_fast_path(self):
1260 s = socket.socket()
1261 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001262 try:
1263 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1264 except OSError as exc:
1265 WSAEOPNOTSUPP = 10045
1266 if exc.winerror == WSAEOPNOTSUPP:
1267 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1268 "doesn't implemented in this Windows version")
1269 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001270 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1271
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001272 def testGetaddrinfo(self):
1273 try:
1274 socket.getaddrinfo('localhost', 80)
1275 except socket.gaierror as err:
1276 if err.errno == socket.EAI_SERVICE:
1277 # see http://bugs.python.org/issue1282647
1278 self.skipTest("buggy libc version")
1279 raise
1280 # len of every sequence is supposed to be == 5
1281 for info in socket.getaddrinfo(HOST, None):
1282 self.assertEqual(len(info), 5)
1283 # host can be a domain name, a string representation of an
1284 # IPv4/v6 address or None
1285 socket.getaddrinfo('localhost', 80)
1286 socket.getaddrinfo('127.0.0.1', 80)
1287 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001288 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001289 socket.getaddrinfo('::1', 80)
1290 # port can be a string service name such as "http", a numeric
1291 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001292 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1293 if (not hasattr(sys, 'getandroidapilevel') or
1294 sys.getandroidapilevel() >= 23):
1295 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001296 socket.getaddrinfo(HOST, 80)
1297 socket.getaddrinfo(HOST, None)
1298 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001299 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1300 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001301 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001302 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1303 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001304 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001305 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1306 for _, socktype, _, _, _ in infos:
1307 self.assertEqual(socktype, socket.SOCK_STREAM)
1308 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001309 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001310 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1311 # a server willing to support both IPv4 and IPv6 will
1312 # usually do this
1313 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1314 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001315 # test keyword arguments
1316 a = socket.getaddrinfo(HOST, None)
1317 b = socket.getaddrinfo(host=HOST, port=None)
1318 self.assertEqual(a, b)
1319 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1320 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1321 self.assertEqual(a, b)
1322 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1323 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1324 self.assertEqual(a, b)
1325 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1326 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1327 self.assertEqual(a, b)
1328 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1329 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1330 self.assertEqual(a, b)
1331 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1332 socket.AI_PASSIVE)
1333 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1334 type=socket.SOCK_STREAM, proto=0,
1335 flags=socket.AI_PASSIVE)
1336 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001337 # Issue #6697.
1338 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001339
Ned Deilyb24f4812014-02-13 22:50:42 -08001340 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001341 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001342 try:
1343 # The arguments here are undefined and the call may succeed
1344 # or fail. All we care here is that it doesn't segfault.
1345 socket.getaddrinfo("localhost", None, 0, 0, 0,
1346 socket.AI_NUMERICSERV)
1347 except socket.gaierror:
1348 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001349
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001350 def test_getnameinfo(self):
1351 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001352 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001353
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001354 @unittest.skipUnless(support.is_resource_enabled('network'),
1355 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001356 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001357 # Check for internet access before running test
1358 # (issue #12804, issue #25138).
1359 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001360 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001361
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001362 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001363 domain = 'испытание.pythontest.net'
1364 socket.gethostbyname(domain)
1365 socket.gethostbyname_ex(domain)
1366 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001367 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1368 # have a reverse entry yet
1369 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001370
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001371 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001372 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001373 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1374 self.skipTest("signal.alarm and socket.socketpair required for this test")
1375 # Our signal handlers clobber the C errno by calling a math function
1376 # with an invalid domain value.
1377 def ok_handler(*args):
1378 self.assertRaises(ValueError, math.acosh, 0)
1379 def raising_handler(*args):
1380 self.assertRaises(ValueError, math.acosh, 0)
1381 1 // 0
1382 c, s = socket.socketpair()
1383 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1384 try:
1385 if with_timeout:
1386 # Just above the one second minimum for signal.alarm
1387 c.settimeout(1.5)
1388 with self.assertRaises(ZeroDivisionError):
1389 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001390 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001391 if with_timeout:
1392 signal.signal(signal.SIGALRM, ok_handler)
1393 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001394 self.assertRaises(socket.timeout, c.sendall,
1395 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001396 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001397 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001398 signal.signal(signal.SIGALRM, old_alarm)
1399 c.close()
1400 s.close()
1401
1402 def test_sendall_interrupted(self):
1403 self.check_sendall_interrupted(False)
1404
1405 def test_sendall_interrupted_with_timeout(self):
1406 self.check_sendall_interrupted(True)
1407
Antoine Pitroue033e062010-10-29 10:38:18 +00001408 def test_dealloc_warn(self):
1409 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1410 r = repr(sock)
1411 with self.assertWarns(ResourceWarning) as cm:
1412 sock = None
1413 support.gc_collect()
1414 self.assertIn(r, str(cm.warning.args[0]))
1415 # An open socket file object gets dereferenced after the socket
1416 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1417 f = sock.makefile('rb')
1418 r = repr(sock)
1419 sock = None
1420 support.gc_collect()
1421 with self.assertWarns(ResourceWarning):
1422 f = None
1423 support.gc_collect()
1424
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001425 def test_name_closed_socketio(self):
1426 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1427 fp = sock.makefile("rb")
1428 fp.close()
1429 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1430
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001431 def test_unusable_closed_socketio(self):
1432 with socket.socket() as sock:
1433 fp = sock.makefile("rb", buffering=0)
1434 self.assertTrue(fp.readable())
1435 self.assertFalse(fp.writable())
1436 self.assertFalse(fp.seekable())
1437 fp.close()
1438 self.assertRaises(ValueError, fp.readable)
1439 self.assertRaises(ValueError, fp.writable)
1440 self.assertRaises(ValueError, fp.seekable)
1441
Berker Peksag3fe64d02016-02-18 17:34:00 +02001442 def test_makefile_mode(self):
1443 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1444 with self.subTest(mode=mode):
1445 with socket.socket() as sock:
1446 with sock.makefile(mode) as fp:
1447 self.assertEqual(fp.mode, mode)
1448
1449 def test_makefile_invalid_mode(self):
1450 for mode in 'rt', 'x', '+', 'a':
1451 with self.subTest(mode=mode):
1452 with socket.socket() as sock:
1453 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1454 sock.makefile(mode)
1455
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001456 def test_pickle(self):
1457 sock = socket.socket()
1458 with sock:
1459 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1460 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001461 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1462 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1463 self.assertEqual(family, socket.AF_INET)
1464 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1465 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001466
Serhiy Storchaka78980432013-01-15 01:12:17 +02001467 def test_listen_backlog(self):
1468 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001469 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1470 srv.bind((HOST, 0))
1471 srv.listen(backlog)
1472
1473 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001474 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001475 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001476
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001477 @support.cpython_only
1478 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001479 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001480 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001481 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1482 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001483 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001484 srv.close()
1485
Charles-François Natali42663332012-01-02 15:57:30 +01001486 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001487 def test_flowinfo(self):
1488 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001489 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001490 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001491 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001492
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001493 def test_str_for_enums(self):
1494 # Make sure that the AF_* and SOCK_* constants have enum-like string
1495 # reprs.
1496 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1497 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001498 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001499
1500 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1501 def test_uknown_socket_family_repr(self):
1502 # Test that when created with a family that's not one of the known
1503 # AF_*/SOCK_* constants, socket.family just returns the number.
1504 #
1505 # To do this we fool socket.socket into believing it already has an
1506 # open fd because on this path it doesn't actually verify the family and
1507 # type and populates the socket object.
1508 #
1509 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001510 fd, path = tempfile.mkstemp()
1511 self.addCleanup(os.unlink, path)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001512 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1513 self.assertEqual(s.family, 42424)
1514 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001515
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001516 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1517 def test__sendfile_use_sendfile(self):
1518 class File:
1519 def __init__(self, fd):
1520 self.fd = fd
1521
1522 def fileno(self):
1523 return self.fd
1524 with socket.socket() as sock:
1525 fd = os.open(os.curdir, os.O_RDONLY)
1526 os.close(fd)
1527 with self.assertRaises(socket._GiveupOnSendfile):
1528 sock._sendfile_use_sendfile(File(fd))
1529 with self.assertRaises(OverflowError):
1530 sock._sendfile_use_sendfile(File(2**1000))
1531 with self.assertRaises(TypeError):
1532 sock._sendfile_use_sendfile(File(None))
1533
1534
Charles-François Natali47413c12011-10-06 19:47:44 +02001535@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1536class BasicCANTest(unittest.TestCase):
1537
1538 def testCrucialConstants(self):
1539 socket.AF_CAN
1540 socket.PF_CAN
1541 socket.CAN_RAW
1542
Charles-François Natali773e42d2013-02-05 19:42:01 +01001543 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1544 'socket.CAN_BCM required for this test.')
1545 def testBCMConstants(self):
1546 socket.CAN_BCM
1547
1548 # opcodes
1549 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1550 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1551 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1552 socket.CAN_BCM_TX_SEND # send one CAN frame
1553 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1554 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1555 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1556 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1557 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1558 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1559 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1560 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1561
Charles-François Natali47413c12011-10-06 19:47:44 +02001562 def testCreateSocket(self):
1563 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1564 pass
1565
Charles-François Natali773e42d2013-02-05 19:42:01 +01001566 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1567 'socket.CAN_BCM required for this test.')
1568 def testCreateBCMSocket(self):
1569 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1570 pass
1571
Charles-François Natali47413c12011-10-06 19:47:44 +02001572 def testBindAny(self):
1573 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1574 s.bind(('', ))
1575
1576 def testTooLongInterfaceName(self):
1577 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1578 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001579 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001580 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001581
1582 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1583 'socket.CAN_RAW_LOOPBACK required for this test.')
1584 def testLoopback(self):
1585 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1586 for loopback in (0, 1):
1587 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1588 loopback)
1589 self.assertEqual(loopback,
1590 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1591
1592 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1593 'socket.CAN_RAW_FILTER required for this test.')
1594 def testFilter(self):
1595 can_id, can_mask = 0x200, 0x700
1596 can_filter = struct.pack("=II", can_id, can_mask)
1597 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1598 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1599 self.assertEqual(can_filter,
1600 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001601 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001602
1603
1604@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001605@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001606class CANTest(ThreadedCANSocketTest):
1607
Charles-François Natali47413c12011-10-06 19:47:44 +02001608 def __init__(self, methodName='runTest'):
1609 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1610
1611 @classmethod
1612 def build_can_frame(cls, can_id, data):
1613 """Build a CAN frame."""
1614 can_dlc = len(data)
1615 data = data.ljust(8, b'\x00')
1616 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1617
1618 @classmethod
1619 def dissect_can_frame(cls, frame):
1620 """Dissect a CAN frame."""
1621 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1622 return (can_id, can_dlc, data[:can_dlc])
1623
1624 def testSendFrame(self):
1625 cf, addr = self.s.recvfrom(self.bufsize)
1626 self.assertEqual(self.cf, cf)
1627 self.assertEqual(addr[0], self.interface)
1628 self.assertEqual(addr[1], socket.AF_CAN)
1629
1630 def _testSendFrame(self):
1631 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1632 self.cli.send(self.cf)
1633
1634 def testSendMaxFrame(self):
1635 cf, addr = self.s.recvfrom(self.bufsize)
1636 self.assertEqual(self.cf, cf)
1637
1638 def _testSendMaxFrame(self):
1639 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1640 self.cli.send(self.cf)
1641
1642 def testSendMultiFrames(self):
1643 cf, addr = self.s.recvfrom(self.bufsize)
1644 self.assertEqual(self.cf1, cf)
1645
1646 cf, addr = self.s.recvfrom(self.bufsize)
1647 self.assertEqual(self.cf2, cf)
1648
1649 def _testSendMultiFrames(self):
1650 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1651 self.cli.send(self.cf1)
1652
1653 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1654 self.cli.send(self.cf2)
1655
Charles-François Natali773e42d2013-02-05 19:42:01 +01001656 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1657 'socket.CAN_BCM required for this test.')
1658 def _testBCM(self):
1659 cf, addr = self.cli.recvfrom(self.bufsize)
1660 self.assertEqual(self.cf, cf)
1661 can_id, can_dlc, data = self.dissect_can_frame(cf)
1662 self.assertEqual(self.can_id, can_id)
1663 self.assertEqual(self.data, data)
1664
1665 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1666 'socket.CAN_BCM required for this test.')
1667 def testBCM(self):
1668 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1669 self.addCleanup(bcm.close)
1670 bcm.connect((self.interface,))
1671 self.can_id = 0x123
1672 self.data = bytes([0xc0, 0xff, 0xee])
1673 self.cf = self.build_can_frame(self.can_id, self.data)
1674 opcode = socket.CAN_BCM_TX_SEND
1675 flags = 0
1676 count = 0
1677 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1678 bcm_can_id = 0x0222
1679 nframes = 1
1680 assert len(self.cf) == 16
1681 header = struct.pack(self.bcm_cmd_msg_fmt,
1682 opcode,
1683 flags,
1684 count,
1685 ival1_seconds,
1686 ival1_usec,
1687 ival2_seconds,
1688 ival2_usec,
1689 bcm_can_id,
1690 nframes,
1691 )
1692 header_plus_frame = header + self.cf
1693 bytes_sent = bcm.send(header_plus_frame)
1694 self.assertEqual(bytes_sent, len(header_plus_frame))
1695
Charles-François Natali47413c12011-10-06 19:47:44 +02001696
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001697@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1698class BasicRDSTest(unittest.TestCase):
1699
1700 def testCrucialConstants(self):
1701 socket.AF_RDS
1702 socket.PF_RDS
1703
1704 def testCreateSocket(self):
1705 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1706 pass
1707
1708 def testSocketBufferSize(self):
1709 bufsize = 16384
1710 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1711 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1712 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1713
1714
1715@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1716@unittest.skipUnless(thread, 'Threading required for this test.')
1717class RDSTest(ThreadedRDSSocketTest):
1718
1719 def __init__(self, methodName='runTest'):
1720 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1721
Charles-François Natali240c55f2011-11-10 20:33:36 +01001722 def setUp(self):
1723 super().setUp()
1724 self.evt = threading.Event()
1725
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001726 def testSendAndRecv(self):
1727 data, addr = self.serv.recvfrom(self.bufsize)
1728 self.assertEqual(self.data, data)
1729 self.assertEqual(self.cli_addr, addr)
1730
1731 def _testSendAndRecv(self):
1732 self.data = b'spam'
1733 self.cli.sendto(self.data, 0, (HOST, self.port))
1734
1735 def testPeek(self):
1736 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1737 self.assertEqual(self.data, data)
1738 data, addr = self.serv.recvfrom(self.bufsize)
1739 self.assertEqual(self.data, data)
1740
1741 def _testPeek(self):
1742 self.data = b'spam'
1743 self.cli.sendto(self.data, 0, (HOST, self.port))
1744
1745 @requireAttrs(socket.socket, 'recvmsg')
1746 def testSendAndRecvMsg(self):
1747 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1748 self.assertEqual(self.data, data)
1749
1750 @requireAttrs(socket.socket, 'sendmsg')
1751 def _testSendAndRecvMsg(self):
1752 self.data = b'hello ' * 10
1753 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1754
1755 def testSendAndRecvMulti(self):
1756 data, addr = self.serv.recvfrom(self.bufsize)
1757 self.assertEqual(self.data1, data)
1758
1759 data, addr = self.serv.recvfrom(self.bufsize)
1760 self.assertEqual(self.data2, data)
1761
1762 def _testSendAndRecvMulti(self):
1763 self.data1 = b'bacon'
1764 self.cli.sendto(self.data1, 0, (HOST, self.port))
1765
1766 self.data2 = b'egg'
1767 self.cli.sendto(self.data2, 0, (HOST, self.port))
1768
1769 def testSelect(self):
1770 r, w, x = select.select([self.serv], [], [], 3.0)
1771 self.assertIn(self.serv, r)
1772 data, addr = self.serv.recvfrom(self.bufsize)
1773 self.assertEqual(self.data, data)
1774
1775 def _testSelect(self):
1776 self.data = b'select'
1777 self.cli.sendto(self.data, 0, (HOST, self.port))
1778
1779 def testCongestion(self):
1780 # wait until the sender is done
1781 self.evt.wait()
1782
1783 def _testCongestion(self):
1784 # test the behavior in case of congestion
1785 self.data = b'fill'
1786 self.cli.setblocking(False)
1787 try:
1788 # try to lower the receiver's socket buffer size
1789 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1790 except OSError:
1791 pass
1792 with self.assertRaises(OSError) as cm:
1793 try:
1794 # fill the receiver's socket buffer
1795 while True:
1796 self.cli.sendto(self.data, 0, (HOST, self.port))
1797 finally:
1798 # signal the receiver we're done
1799 self.evt.set()
1800 # sendto() should have failed with ENOBUFS
1801 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1802 # and we should have received a congestion notification through poll
1803 r, w, x = select.select([self.serv], [], [], 3.0)
1804 self.assertIn(self.serv, r)
1805
1806
Victor Stinner45df8202010-04-28 22:31:17 +00001807@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001808class BasicTCPTest(SocketConnectedTest):
1809
1810 def __init__(self, methodName='runTest'):
1811 SocketConnectedTest.__init__(self, methodName=methodName)
1812
1813 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001814 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001815 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001816 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001817
1818 def _testRecv(self):
1819 self.serv_conn.send(MSG)
1820
1821 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001822 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001823 seg1 = self.cli_conn.recv(len(MSG) - 3)
1824 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001825 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001826 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001827
1828 def _testOverFlowRecv(self):
1829 self.serv_conn.send(MSG)
1830
1831 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001832 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001833 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001834 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001835
1836 def _testRecvFrom(self):
1837 self.serv_conn.send(MSG)
1838
1839 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001840 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001841 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1842 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001843 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001844 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001845
1846 def _testOverFlowRecvFrom(self):
1847 self.serv_conn.send(MSG)
1848
1849 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001850 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001851 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001852 while 1:
1853 read = self.cli_conn.recv(1024)
1854 if not read:
1855 break
Guido van Rossume531e292002-08-08 20:28:34 +00001856 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001857 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001858
1859 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001860 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001861 self.serv_conn.sendall(big_chunk)
1862
1863 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001864 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001865 fd = self.cli_conn.fileno()
1866 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001867 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001868 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001869 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001870 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001871
1872 def _testFromFd(self):
1873 self.serv_conn.send(MSG)
1874
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001875 def testDup(self):
1876 # Testing dup()
1877 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001878 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001879 msg = sock.recv(1024)
1880 self.assertEqual(msg, MSG)
1881
1882 def _testDup(self):
1883 self.serv_conn.send(MSG)
1884
Guido van Rossum24e4af82002-06-12 19:18:08 +00001885 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001886 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001887 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001888 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001889 # wait for _testShutdown to finish: on OS X, when the server
1890 # closes the connection the client also becomes disconnected,
1891 # and the client's shutdown call will fail. (Issue #4397.)
1892 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001893
1894 def _testShutdown(self):
1895 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001896 self.serv_conn.shutdown(2)
1897
1898 testShutdown_overflow = support.cpython_only(testShutdown)
1899
1900 @support.cpython_only
1901 def _testShutdown_overflow(self):
1902 import _testcapi
1903 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001904 # Issue 15989
1905 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1906 _testcapi.INT_MAX + 1)
1907 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1908 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001909 self.serv_conn.shutdown(2)
1910
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001911 def testDetach(self):
1912 # Testing detach()
1913 fileno = self.cli_conn.fileno()
1914 f = self.cli_conn.detach()
1915 self.assertEqual(f, fileno)
1916 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001917 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001918 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001919 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001920 # ...but we can create another socket using the (still open)
1921 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001922 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001923 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001924 msg = sock.recv(1024)
1925 self.assertEqual(msg, MSG)
1926
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001927 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001928 self.serv_conn.send(MSG)
1929
Victor Stinner45df8202010-04-28 22:31:17 +00001930@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001931class BasicUDPTest(ThreadedUDPSocketTest):
1932
1933 def __init__(self, methodName='runTest'):
1934 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1935
1936 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001937 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001938 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001939 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001940
1941 def _testSendtoAndRecv(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 Rossum1c938012002-06-12 21:17:20 +00001944 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001945 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001946 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001947 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001948
Guido van Rossum1c938012002-06-12 21:17:20 +00001949 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001950 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001951
Guido van Rossumd8faa362007-04-27 19:54:29 +00001952 def testRecvFromNegative(self):
1953 # Negative lengths passed to recvfrom should give ValueError.
1954 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1955
1956 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001957 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001958
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001959# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1960# same test code is used with different families and types of socket
1961# (e.g. stream, datagram), and tests using recvmsg() are repeated
1962# using recvmsg_into().
1963#
1964# The generic test classes such as SendmsgTests and
1965# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1966# supplied with sockets cli_sock and serv_sock representing the
1967# client's and the server's end of the connection respectively, and
1968# attributes cli_addr and serv_addr holding their (numeric where
1969# appropriate) addresses.
1970#
1971# The final concrete test classes combine these with subclasses of
1972# SocketTestBase which set up client and server sockets of a specific
1973# type, and with subclasses of SendrecvmsgBase such as
1974# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1975# sockets to cli_sock and serv_sock and override the methods and
1976# attributes of SendrecvmsgBase to fill in destination addresses if
1977# needed when sending, check for specific flags in msg_flags, etc.
1978#
1979# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1980# recvmsg_into().
1981
1982# XXX: like the other datagram (UDP) tests in this module, the code
1983# here assumes that datagram delivery on the local machine will be
1984# reliable.
1985
1986class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1987 # Base class for sendmsg()/recvmsg() tests.
1988
1989 # Time in seconds to wait before considering a test failed, or
1990 # None for no timeout. Not all tests actually set a timeout.
1991 fail_timeout = 3.0
1992
1993 def setUp(self):
1994 self.misc_event = threading.Event()
1995 super().setUp()
1996
1997 def sendToServer(self, msg):
1998 # Send msg to the server.
1999 return self.cli_sock.send(msg)
2000
2001 # Tuple of alternative default arguments for sendmsg() when called
2002 # via sendmsgToServer() (e.g. to include a destination address).
2003 sendmsg_to_server_defaults = ()
2004
2005 def sendmsgToServer(self, *args):
2006 # Call sendmsg() on self.cli_sock with the given arguments,
2007 # filling in any arguments which are not supplied with the
2008 # corresponding items of self.sendmsg_to_server_defaults, if
2009 # any.
2010 return self.cli_sock.sendmsg(
2011 *(args + self.sendmsg_to_server_defaults[len(args):]))
2012
2013 def doRecvmsg(self, sock, bufsize, *args):
2014 # Call recvmsg() on sock with given arguments and return its
2015 # result. Should be used for tests which can use either
2016 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2017 # this method with one which emulates it using recvmsg_into(),
2018 # thus allowing the same test to be used for both methods.
2019 result = sock.recvmsg(bufsize, *args)
2020 self.registerRecvmsgResult(result)
2021 return result
2022
2023 def registerRecvmsgResult(self, result):
2024 # Called by doRecvmsg() with the return value of recvmsg() or
2025 # recvmsg_into(). Can be overridden to arrange cleanup based
2026 # on the returned ancillary data, for instance.
2027 pass
2028
2029 def checkRecvmsgAddress(self, addr1, addr2):
2030 # Called to compare the received address with the address of
2031 # the peer.
2032 self.assertEqual(addr1, addr2)
2033
2034 # Flags that are normally unset in msg_flags
2035 msg_flags_common_unset = 0
2036 for name in ("MSG_CTRUNC", "MSG_OOB"):
2037 msg_flags_common_unset |= getattr(socket, name, 0)
2038
2039 # Flags that are normally set
2040 msg_flags_common_set = 0
2041
2042 # Flags set when a complete record has been received (e.g. MSG_EOR
2043 # for SCTP)
2044 msg_flags_eor_indicator = 0
2045
2046 # Flags set when a complete record has not been received
2047 # (e.g. MSG_TRUNC for datagram sockets)
2048 msg_flags_non_eor_indicator = 0
2049
2050 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2051 # Method to check the value of msg_flags returned by recvmsg[_into]().
2052 #
2053 # Checks that all bits in msg_flags_common_set attribute are
2054 # set in "flags" and all bits in msg_flags_common_unset are
2055 # unset.
2056 #
2057 # The "eor" argument specifies whether the flags should
2058 # indicate that a full record (or datagram) has been received.
2059 # If "eor" is None, no checks are done; otherwise, checks
2060 # that:
2061 #
2062 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2063 # set and all bits in msg_flags_non_eor_indicator are unset
2064 #
2065 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2066 # are set and all bits in msg_flags_eor_indicator are unset
2067 #
2068 # If "checkset" and/or "checkunset" are supplied, they require
2069 # the given bits to be set or unset respectively, overriding
2070 # what the attributes require for those bits.
2071 #
2072 # If any bits are set in "ignore", they will not be checked,
2073 # regardless of the other inputs.
2074 #
2075 # Will raise Exception if the inputs require a bit to be both
2076 # set and unset, and it is not ignored.
2077
2078 defaultset = self.msg_flags_common_set
2079 defaultunset = self.msg_flags_common_unset
2080
2081 if eor:
2082 defaultset |= self.msg_flags_eor_indicator
2083 defaultunset |= self.msg_flags_non_eor_indicator
2084 elif eor is not None:
2085 defaultset |= self.msg_flags_non_eor_indicator
2086 defaultunset |= self.msg_flags_eor_indicator
2087
2088 # Function arguments override defaults
2089 defaultset &= ~checkunset
2090 defaultunset &= ~checkset
2091
2092 # Merge arguments with remaining defaults, and check for conflicts
2093 checkset |= defaultset
2094 checkunset |= defaultunset
2095 inboth = checkset & checkunset & ~ignore
2096 if inboth:
2097 raise Exception("contradictory set, unset requirements for flags "
2098 "{0:#x}".format(inboth))
2099
2100 # Compare with given msg_flags value
2101 mask = (checkset | checkunset) & ~ignore
2102 self.assertEqual(flags & mask, checkset & mask)
2103
2104
2105class RecvmsgIntoMixin(SendrecvmsgBase):
2106 # Mixin to implement doRecvmsg() using recvmsg_into().
2107
2108 def doRecvmsg(self, sock, bufsize, *args):
2109 buf = bytearray(bufsize)
2110 result = sock.recvmsg_into([buf], *args)
2111 self.registerRecvmsgResult(result)
2112 self.assertGreaterEqual(result[0], 0)
2113 self.assertLessEqual(result[0], bufsize)
2114 return (bytes(buf[:result[0]]),) + result[1:]
2115
2116
2117class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2118 # Defines flags to be checked in msg_flags for datagram sockets.
2119
2120 @property
2121 def msg_flags_non_eor_indicator(self):
2122 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2123
2124
2125class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2126 # Defines flags to be checked in msg_flags for SCTP sockets.
2127
2128 @property
2129 def msg_flags_eor_indicator(self):
2130 return super().msg_flags_eor_indicator | socket.MSG_EOR
2131
2132
2133class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2134 # Base class for tests on connectionless-mode sockets. Users must
2135 # supply sockets on attributes cli and serv to be mapped to
2136 # cli_sock and serv_sock respectively.
2137
2138 @property
2139 def serv_sock(self):
2140 return self.serv
2141
2142 @property
2143 def cli_sock(self):
2144 return self.cli
2145
2146 @property
2147 def sendmsg_to_server_defaults(self):
2148 return ([], [], 0, self.serv_addr)
2149
2150 def sendToServer(self, msg):
2151 return self.cli_sock.sendto(msg, self.serv_addr)
2152
2153
2154class SendrecvmsgConnectedBase(SendrecvmsgBase):
2155 # Base class for tests on connected sockets. Users must supply
2156 # sockets on attributes serv_conn and cli_conn (representing the
2157 # connections *to* the server and the client), to be mapped to
2158 # cli_sock and serv_sock respectively.
2159
2160 @property
2161 def serv_sock(self):
2162 return self.cli_conn
2163
2164 @property
2165 def cli_sock(self):
2166 return self.serv_conn
2167
2168 def checkRecvmsgAddress(self, addr1, addr2):
2169 # Address is currently "unspecified" for a connected socket,
2170 # so we don't examine it
2171 pass
2172
2173
2174class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2175 # Base class to set a timeout on server's socket.
2176
2177 def setUp(self):
2178 super().setUp()
2179 self.serv_sock.settimeout(self.fail_timeout)
2180
2181
2182class SendmsgTests(SendrecvmsgServerTimeoutBase):
2183 # Tests for sendmsg() which can use any socket type and do not
2184 # involve recvmsg() or recvmsg_into().
2185
2186 def testSendmsg(self):
2187 # Send a simple message with sendmsg().
2188 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2189
2190 def _testSendmsg(self):
2191 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2192
2193 def testSendmsgDataGenerator(self):
2194 # Send from buffer obtained from a generator (not a sequence).
2195 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2196
2197 def _testSendmsgDataGenerator(self):
2198 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2199 len(MSG))
2200
2201 def testSendmsgAncillaryGenerator(self):
2202 # Gather (empty) ancillary data from a generator.
2203 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2204
2205 def _testSendmsgAncillaryGenerator(self):
2206 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2207 len(MSG))
2208
2209 def testSendmsgArray(self):
2210 # Send data from an array instead of the usual bytes object.
2211 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2212
2213 def _testSendmsgArray(self):
2214 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2215 len(MSG))
2216
2217 def testSendmsgGather(self):
2218 # Send message data from more than one buffer (gather write).
2219 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2220
2221 def _testSendmsgGather(self):
2222 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2223
2224 def testSendmsgBadArgs(self):
2225 # Check that sendmsg() rejects invalid arguments.
2226 self.assertEqual(self.serv_sock.recv(1000), b"done")
2227
2228 def _testSendmsgBadArgs(self):
2229 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2230 self.assertRaises(TypeError, self.sendmsgToServer,
2231 b"not in an iterable")
2232 self.assertRaises(TypeError, self.sendmsgToServer,
2233 object())
2234 self.assertRaises(TypeError, self.sendmsgToServer,
2235 [object()])
2236 self.assertRaises(TypeError, self.sendmsgToServer,
2237 [MSG, object()])
2238 self.assertRaises(TypeError, self.sendmsgToServer,
2239 [MSG], object())
2240 self.assertRaises(TypeError, self.sendmsgToServer,
2241 [MSG], [], object())
2242 self.assertRaises(TypeError, self.sendmsgToServer,
2243 [MSG], [], 0, object())
2244 self.sendToServer(b"done")
2245
2246 def testSendmsgBadCmsg(self):
2247 # Check that invalid ancillary data items are rejected.
2248 self.assertEqual(self.serv_sock.recv(1000), b"done")
2249
2250 def _testSendmsgBadCmsg(self):
2251 self.assertRaises(TypeError, self.sendmsgToServer,
2252 [MSG], [object()])
2253 self.assertRaises(TypeError, self.sendmsgToServer,
2254 [MSG], [(object(), 0, b"data")])
2255 self.assertRaises(TypeError, self.sendmsgToServer,
2256 [MSG], [(0, object(), b"data")])
2257 self.assertRaises(TypeError, self.sendmsgToServer,
2258 [MSG], [(0, 0, object())])
2259 self.assertRaises(TypeError, self.sendmsgToServer,
2260 [MSG], [(0, 0)])
2261 self.assertRaises(TypeError, self.sendmsgToServer,
2262 [MSG], [(0, 0, b"data", 42)])
2263 self.sendToServer(b"done")
2264
2265 @requireAttrs(socket, "CMSG_SPACE")
2266 def testSendmsgBadMultiCmsg(self):
2267 # Check that invalid ancillary data items are rejected when
2268 # more than one item is present.
2269 self.assertEqual(self.serv_sock.recv(1000), b"done")
2270
2271 @testSendmsgBadMultiCmsg.client_skip
2272 def _testSendmsgBadMultiCmsg(self):
2273 self.assertRaises(TypeError, self.sendmsgToServer,
2274 [MSG], [0, 0, b""])
2275 self.assertRaises(TypeError, self.sendmsgToServer,
2276 [MSG], [(0, 0, b""), object()])
2277 self.sendToServer(b"done")
2278
2279 def testSendmsgExcessCmsgReject(self):
2280 # Check that sendmsg() rejects excess ancillary data items
2281 # when the number that can be sent is limited.
2282 self.assertEqual(self.serv_sock.recv(1000), b"done")
2283
2284 def _testSendmsgExcessCmsgReject(self):
2285 if not hasattr(socket, "CMSG_SPACE"):
2286 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002287 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002288 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2289 self.assertIsNone(cm.exception.errno)
2290 self.sendToServer(b"done")
2291
2292 def testSendmsgAfterClose(self):
2293 # Check that sendmsg() fails on a closed socket.
2294 pass
2295
2296 def _testSendmsgAfterClose(self):
2297 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002298 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002299
2300
2301class SendmsgStreamTests(SendmsgTests):
2302 # Tests for sendmsg() which require a stream socket and do not
2303 # involve recvmsg() or recvmsg_into().
2304
2305 def testSendmsgExplicitNoneAddr(self):
2306 # Check that peer address can be specified as None.
2307 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2308
2309 def _testSendmsgExplicitNoneAddr(self):
2310 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2311
2312 def testSendmsgTimeout(self):
2313 # Check that timeout works with sendmsg().
2314 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2315 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2316
2317 def _testSendmsgTimeout(self):
2318 try:
2319 self.cli_sock.settimeout(0.03)
2320 with self.assertRaises(socket.timeout):
2321 while True:
2322 self.sendmsgToServer([b"a"*512])
2323 finally:
2324 self.misc_event.set()
2325
2326 # XXX: would be nice to have more tests for sendmsg flags argument.
2327
2328 # Linux supports MSG_DONTWAIT when sending, but in general, it
2329 # only works when receiving. Could add other platforms if they
2330 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002331 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002332 "MSG_DONTWAIT not known to work on this platform when "
2333 "sending")
2334 def testSendmsgDontWait(self):
2335 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2336 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2337 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2338
2339 @testSendmsgDontWait.client_skip
2340 def _testSendmsgDontWait(self):
2341 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002342 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002343 while True:
2344 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2345 self.assertIn(cm.exception.errno,
2346 (errno.EAGAIN, errno.EWOULDBLOCK))
2347 finally:
2348 self.misc_event.set()
2349
2350
2351class SendmsgConnectionlessTests(SendmsgTests):
2352 # Tests for sendmsg() which require a connectionless-mode
2353 # (e.g. datagram) socket, and do not involve recvmsg() or
2354 # recvmsg_into().
2355
2356 def testSendmsgNoDestAddr(self):
2357 # Check that sendmsg() fails when no destination address is
2358 # given for unconnected socket.
2359 pass
2360
2361 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002362 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002363 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002364 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002365 [MSG], [], 0, None)
2366
2367
2368class RecvmsgGenericTests(SendrecvmsgBase):
2369 # Tests for recvmsg() which can also be emulated using
2370 # recvmsg_into(), and can use any socket type.
2371
2372 def testRecvmsg(self):
2373 # Receive a simple message with recvmsg[_into]().
2374 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2375 self.assertEqual(msg, MSG)
2376 self.checkRecvmsgAddress(addr, self.cli_addr)
2377 self.assertEqual(ancdata, [])
2378 self.checkFlags(flags, eor=True)
2379
2380 def _testRecvmsg(self):
2381 self.sendToServer(MSG)
2382
2383 def testRecvmsgExplicitDefaults(self):
2384 # Test recvmsg[_into]() with default arguments provided explicitly.
2385 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2386 len(MSG), 0, 0)
2387 self.assertEqual(msg, MSG)
2388 self.checkRecvmsgAddress(addr, self.cli_addr)
2389 self.assertEqual(ancdata, [])
2390 self.checkFlags(flags, eor=True)
2391
2392 def _testRecvmsgExplicitDefaults(self):
2393 self.sendToServer(MSG)
2394
2395 def testRecvmsgShorter(self):
2396 # Receive a message smaller than buffer.
2397 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2398 len(MSG) + 42)
2399 self.assertEqual(msg, MSG)
2400 self.checkRecvmsgAddress(addr, self.cli_addr)
2401 self.assertEqual(ancdata, [])
2402 self.checkFlags(flags, eor=True)
2403
2404 def _testRecvmsgShorter(self):
2405 self.sendToServer(MSG)
2406
Charles-François Natali8619cd72011-10-03 19:43:15 +02002407 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2408 # datagram is received (issue #13001).
2409 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002410 def testRecvmsgTrunc(self):
2411 # Receive part of message, check for truncation indicators.
2412 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2413 len(MSG) - 3)
2414 self.assertEqual(msg, MSG[:-3])
2415 self.checkRecvmsgAddress(addr, self.cli_addr)
2416 self.assertEqual(ancdata, [])
2417 self.checkFlags(flags, eor=False)
2418
Charles-François Natali8619cd72011-10-03 19:43:15 +02002419 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002420 def _testRecvmsgTrunc(self):
2421 self.sendToServer(MSG)
2422
2423 def testRecvmsgShortAncillaryBuf(self):
2424 # Test ancillary data buffer too small to hold any ancillary data.
2425 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2426 len(MSG), 1)
2427 self.assertEqual(msg, MSG)
2428 self.checkRecvmsgAddress(addr, self.cli_addr)
2429 self.assertEqual(ancdata, [])
2430 self.checkFlags(flags, eor=True)
2431
2432 def _testRecvmsgShortAncillaryBuf(self):
2433 self.sendToServer(MSG)
2434
2435 def testRecvmsgLongAncillaryBuf(self):
2436 # Test large ancillary data buffer.
2437 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2438 len(MSG), 10240)
2439 self.assertEqual(msg, MSG)
2440 self.checkRecvmsgAddress(addr, self.cli_addr)
2441 self.assertEqual(ancdata, [])
2442 self.checkFlags(flags, eor=True)
2443
2444 def _testRecvmsgLongAncillaryBuf(self):
2445 self.sendToServer(MSG)
2446
2447 def testRecvmsgAfterClose(self):
2448 # Check that recvmsg[_into]() fails on a closed socket.
2449 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002450 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002451
2452 def _testRecvmsgAfterClose(self):
2453 pass
2454
2455 def testRecvmsgTimeout(self):
2456 # Check that timeout works.
2457 try:
2458 self.serv_sock.settimeout(0.03)
2459 self.assertRaises(socket.timeout,
2460 self.doRecvmsg, self.serv_sock, len(MSG))
2461 finally:
2462 self.misc_event.set()
2463
2464 def _testRecvmsgTimeout(self):
2465 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2466
2467 @requireAttrs(socket, "MSG_PEEK")
2468 def testRecvmsgPeek(self):
2469 # Check that MSG_PEEK in flags enables examination of pending
2470 # data without consuming it.
2471
2472 # Receive part of data with MSG_PEEK.
2473 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2474 len(MSG) - 3, 0,
2475 socket.MSG_PEEK)
2476 self.assertEqual(msg, MSG[:-3])
2477 self.checkRecvmsgAddress(addr, self.cli_addr)
2478 self.assertEqual(ancdata, [])
2479 # Ignoring MSG_TRUNC here (so this test is the same for stream
2480 # and datagram sockets). Some wording in POSIX seems to
2481 # suggest that it needn't be set when peeking, but that may
2482 # just be a slip.
2483 self.checkFlags(flags, eor=False,
2484 ignore=getattr(socket, "MSG_TRUNC", 0))
2485
2486 # Receive all data with MSG_PEEK.
2487 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2488 len(MSG), 0,
2489 socket.MSG_PEEK)
2490 self.assertEqual(msg, MSG)
2491 self.checkRecvmsgAddress(addr, self.cli_addr)
2492 self.assertEqual(ancdata, [])
2493 self.checkFlags(flags, eor=True)
2494
2495 # Check that the same data can still be received normally.
2496 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2497 self.assertEqual(msg, MSG)
2498 self.checkRecvmsgAddress(addr, self.cli_addr)
2499 self.assertEqual(ancdata, [])
2500 self.checkFlags(flags, eor=True)
2501
2502 @testRecvmsgPeek.client_skip
2503 def _testRecvmsgPeek(self):
2504 self.sendToServer(MSG)
2505
2506 @requireAttrs(socket.socket, "sendmsg")
2507 def testRecvmsgFromSendmsg(self):
2508 # Test receiving with recvmsg[_into]() when message is sent
2509 # using sendmsg().
2510 self.serv_sock.settimeout(self.fail_timeout)
2511 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2512 self.assertEqual(msg, MSG)
2513 self.checkRecvmsgAddress(addr, self.cli_addr)
2514 self.assertEqual(ancdata, [])
2515 self.checkFlags(flags, eor=True)
2516
2517 @testRecvmsgFromSendmsg.client_skip
2518 def _testRecvmsgFromSendmsg(self):
2519 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2520
2521
2522class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2523 # Tests which require a stream socket and can use either recvmsg()
2524 # or recvmsg_into().
2525
2526 def testRecvmsgEOF(self):
2527 # Receive end-of-stream indicator (b"", peer socket closed).
2528 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2529 self.assertEqual(msg, b"")
2530 self.checkRecvmsgAddress(addr, self.cli_addr)
2531 self.assertEqual(ancdata, [])
2532 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2533
2534 def _testRecvmsgEOF(self):
2535 self.cli_sock.close()
2536
2537 def testRecvmsgOverflow(self):
2538 # Receive a message in more than one chunk.
2539 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2540 len(MSG) - 3)
2541 self.checkRecvmsgAddress(addr, self.cli_addr)
2542 self.assertEqual(ancdata, [])
2543 self.checkFlags(flags, eor=False)
2544
2545 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2546 self.checkRecvmsgAddress(addr, self.cli_addr)
2547 self.assertEqual(ancdata, [])
2548 self.checkFlags(flags, eor=True)
2549
2550 msg = seg1 + seg2
2551 self.assertEqual(msg, MSG)
2552
2553 def _testRecvmsgOverflow(self):
2554 self.sendToServer(MSG)
2555
2556
2557class RecvmsgTests(RecvmsgGenericTests):
2558 # Tests for recvmsg() which can use any socket type.
2559
2560 def testRecvmsgBadArgs(self):
2561 # Check that recvmsg() rejects invalid arguments.
2562 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2563 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2564 -1, 0, 0)
2565 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2566 len(MSG), -1, 0)
2567 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2568 [bytearray(10)], 0, 0)
2569 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2570 object(), 0, 0)
2571 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2572 len(MSG), object(), 0)
2573 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2574 len(MSG), 0, object())
2575
2576 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2577 self.assertEqual(msg, MSG)
2578 self.checkRecvmsgAddress(addr, self.cli_addr)
2579 self.assertEqual(ancdata, [])
2580 self.checkFlags(flags, eor=True)
2581
2582 def _testRecvmsgBadArgs(self):
2583 self.sendToServer(MSG)
2584
2585
2586class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2587 # Tests for recvmsg_into() which can use any socket type.
2588
2589 def testRecvmsgIntoBadArgs(self):
2590 # Check that recvmsg_into() rejects invalid arguments.
2591 buf = bytearray(len(MSG))
2592 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2593 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2594 len(MSG), 0, 0)
2595 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2596 buf, 0, 0)
2597 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2598 [object()], 0, 0)
2599 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2600 [b"I'm not writable"], 0, 0)
2601 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2602 [buf, object()], 0, 0)
2603 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2604 [buf], -1, 0)
2605 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2606 [buf], object(), 0)
2607 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2608 [buf], 0, object())
2609
2610 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2611 self.assertEqual(nbytes, len(MSG))
2612 self.assertEqual(buf, bytearray(MSG))
2613 self.checkRecvmsgAddress(addr, self.cli_addr)
2614 self.assertEqual(ancdata, [])
2615 self.checkFlags(flags, eor=True)
2616
2617 def _testRecvmsgIntoBadArgs(self):
2618 self.sendToServer(MSG)
2619
2620 def testRecvmsgIntoGenerator(self):
2621 # Receive into buffer obtained from a generator (not a sequence).
2622 buf = bytearray(len(MSG))
2623 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2624 (o for o in [buf]))
2625 self.assertEqual(nbytes, len(MSG))
2626 self.assertEqual(buf, bytearray(MSG))
2627 self.checkRecvmsgAddress(addr, self.cli_addr)
2628 self.assertEqual(ancdata, [])
2629 self.checkFlags(flags, eor=True)
2630
2631 def _testRecvmsgIntoGenerator(self):
2632 self.sendToServer(MSG)
2633
2634 def testRecvmsgIntoArray(self):
2635 # Receive into an array rather than the usual bytearray.
2636 buf = array.array("B", [0] * len(MSG))
2637 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2638 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002639 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002640 self.checkRecvmsgAddress(addr, self.cli_addr)
2641 self.assertEqual(ancdata, [])
2642 self.checkFlags(flags, eor=True)
2643
2644 def _testRecvmsgIntoArray(self):
2645 self.sendToServer(MSG)
2646
2647 def testRecvmsgIntoScatter(self):
2648 # Receive into multiple buffers (scatter write).
2649 b1 = bytearray(b"----")
2650 b2 = bytearray(b"0123456789")
2651 b3 = bytearray(b"--------------")
2652 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2653 [b1, memoryview(b2)[2:9], b3])
2654 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2655 self.assertEqual(b1, bytearray(b"Mary"))
2656 self.assertEqual(b2, bytearray(b"01 had a 9"))
2657 self.assertEqual(b3, bytearray(b"little lamb---"))
2658 self.checkRecvmsgAddress(addr, self.cli_addr)
2659 self.assertEqual(ancdata, [])
2660 self.checkFlags(flags, eor=True)
2661
2662 def _testRecvmsgIntoScatter(self):
2663 self.sendToServer(b"Mary had a little lamb")
2664
2665
2666class CmsgMacroTests(unittest.TestCase):
2667 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2668 # assumptions used by sendmsg() and recvmsg[_into](), which share
2669 # code with these functions.
2670
2671 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002672 try:
2673 import _testcapi
2674 except ImportError:
2675 socklen_t_limit = 0x7fffffff
2676 else:
2677 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002678
2679 @requireAttrs(socket, "CMSG_LEN")
2680 def testCMSG_LEN(self):
2681 # Test CMSG_LEN() with various valid and invalid values,
2682 # checking the assumptions used by recvmsg() and sendmsg().
2683 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2684 values = list(range(257)) + list(range(toobig - 257, toobig))
2685
2686 # struct cmsghdr has at least three members, two of which are ints
2687 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2688 for n in values:
2689 ret = socket.CMSG_LEN(n)
2690 # This is how recvmsg() calculates the data size
2691 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2692 self.assertLessEqual(ret, self.socklen_t_limit)
2693
2694 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2695 # sendmsg() shares code with these functions, and requires
2696 # that it reject values over the limit.
2697 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2698 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2699
2700 @requireAttrs(socket, "CMSG_SPACE")
2701 def testCMSG_SPACE(self):
2702 # Test CMSG_SPACE() with various valid and invalid values,
2703 # checking the assumptions used by sendmsg().
2704 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2705 values = list(range(257)) + list(range(toobig - 257, toobig))
2706
2707 last = socket.CMSG_SPACE(0)
2708 # struct cmsghdr has at least three members, two of which are ints
2709 self.assertGreater(last, array.array("i").itemsize * 2)
2710 for n in values:
2711 ret = socket.CMSG_SPACE(n)
2712 self.assertGreaterEqual(ret, last)
2713 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2714 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2715 self.assertLessEqual(ret, self.socklen_t_limit)
2716 last = ret
2717
2718 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2719 # sendmsg() shares code with these functions, and requires
2720 # that it reject values over the limit.
2721 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2722 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2723
2724
2725class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2726 # Tests for file descriptor passing on Unix-domain sockets.
2727
2728 # Invalid file descriptor value that's unlikely to evaluate to a
2729 # real FD even if one of its bytes is replaced with a different
2730 # value (which shouldn't actually happen).
2731 badfd = -0x5555
2732
2733 def newFDs(self, n):
2734 # Return a list of n file descriptors for newly-created files
2735 # containing their list indices as ASCII numbers.
2736 fds = []
2737 for i in range(n):
2738 fd, path = tempfile.mkstemp()
2739 self.addCleanup(os.unlink, path)
2740 self.addCleanup(os.close, fd)
2741 os.write(fd, str(i).encode())
2742 fds.append(fd)
2743 return fds
2744
2745 def checkFDs(self, fds):
2746 # Check that the file descriptors in the given list contain
2747 # their correct list indices as ASCII numbers.
2748 for n, fd in enumerate(fds):
2749 os.lseek(fd, 0, os.SEEK_SET)
2750 self.assertEqual(os.read(fd, 1024), str(n).encode())
2751
2752 def registerRecvmsgResult(self, result):
2753 self.addCleanup(self.closeRecvmsgFDs, result)
2754
2755 def closeRecvmsgFDs(self, recvmsg_result):
2756 # Close all file descriptors specified in the ancillary data
2757 # of the given return value from recvmsg() or recvmsg_into().
2758 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2759 if (cmsg_level == socket.SOL_SOCKET and
2760 cmsg_type == socket.SCM_RIGHTS):
2761 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002762 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002763 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2764 for fd in fds:
2765 os.close(fd)
2766
2767 def createAndSendFDs(self, n):
2768 # Send n new file descriptors created by newFDs() to the
2769 # server, with the constant MSG as the non-ancillary data.
2770 self.assertEqual(
2771 self.sendmsgToServer([MSG],
2772 [(socket.SOL_SOCKET,
2773 socket.SCM_RIGHTS,
2774 array.array("i", self.newFDs(n)))]),
2775 len(MSG))
2776
2777 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2778 # Check that constant MSG was received with numfds file
2779 # descriptors in a maximum of maxcmsgs control messages (which
2780 # must contain only complete integers). By default, check
2781 # that MSG_CTRUNC is unset, but ignore any flags in
2782 # ignoreflags.
2783 msg, ancdata, flags, addr = result
2784 self.assertEqual(msg, MSG)
2785 self.checkRecvmsgAddress(addr, self.cli_addr)
2786 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2787 ignore=ignoreflags)
2788
2789 self.assertIsInstance(ancdata, list)
2790 self.assertLessEqual(len(ancdata), maxcmsgs)
2791 fds = array.array("i")
2792 for item in ancdata:
2793 self.assertIsInstance(item, tuple)
2794 cmsg_level, cmsg_type, cmsg_data = item
2795 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2796 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2797 self.assertIsInstance(cmsg_data, bytes)
2798 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002799 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002800
2801 self.assertEqual(len(fds), numfds)
2802 self.checkFDs(fds)
2803
2804 def testFDPassSimple(self):
2805 # Pass a single FD (array read from bytes object).
2806 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2807 len(MSG), 10240))
2808
2809 def _testFDPassSimple(self):
2810 self.assertEqual(
2811 self.sendmsgToServer(
2812 [MSG],
2813 [(socket.SOL_SOCKET,
2814 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002815 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002816 len(MSG))
2817
2818 def testMultipleFDPass(self):
2819 # Pass multiple FDs in a single array.
2820 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2821 len(MSG), 10240))
2822
2823 def _testMultipleFDPass(self):
2824 self.createAndSendFDs(4)
2825
2826 @requireAttrs(socket, "CMSG_SPACE")
2827 def testFDPassCMSG_SPACE(self):
2828 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2829 self.checkRecvmsgFDs(
2830 4, self.doRecvmsg(self.serv_sock, len(MSG),
2831 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2832
2833 @testFDPassCMSG_SPACE.client_skip
2834 def _testFDPassCMSG_SPACE(self):
2835 self.createAndSendFDs(4)
2836
2837 def testFDPassCMSG_LEN(self):
2838 # Test using CMSG_LEN() to calculate ancillary buffer size.
2839 self.checkRecvmsgFDs(1,
2840 self.doRecvmsg(self.serv_sock, len(MSG),
2841 socket.CMSG_LEN(4 * SIZEOF_INT)),
2842 # RFC 3542 says implementations may set
2843 # MSG_CTRUNC if there isn't enough space
2844 # for trailing padding.
2845 ignoreflags=socket.MSG_CTRUNC)
2846
2847 def _testFDPassCMSG_LEN(self):
2848 self.createAndSendFDs(1)
2849
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002850 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002851 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002852 @requireAttrs(socket, "CMSG_SPACE")
2853 def testFDPassSeparate(self):
2854 # Pass two FDs in two separate arrays. Arrays may be combined
2855 # into a single control message by the OS.
2856 self.checkRecvmsgFDs(2,
2857 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2858 maxcmsgs=2)
2859
2860 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002861 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002862 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002863 def _testFDPassSeparate(self):
2864 fd0, fd1 = self.newFDs(2)
2865 self.assertEqual(
2866 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2867 socket.SCM_RIGHTS,
2868 array.array("i", [fd0])),
2869 (socket.SOL_SOCKET,
2870 socket.SCM_RIGHTS,
2871 array.array("i", [fd1]))]),
2872 len(MSG))
2873
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002874 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002875 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002876 @requireAttrs(socket, "CMSG_SPACE")
2877 def testFDPassSeparateMinSpace(self):
2878 # Pass two FDs in two separate arrays, receiving them into the
2879 # minimum space for two arrays.
2880 self.checkRecvmsgFDs(2,
2881 self.doRecvmsg(self.serv_sock, len(MSG),
2882 socket.CMSG_SPACE(SIZEOF_INT) +
2883 socket.CMSG_LEN(SIZEOF_INT)),
2884 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2885
2886 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002887 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002888 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002889 def _testFDPassSeparateMinSpace(self):
2890 fd0, fd1 = self.newFDs(2)
2891 self.assertEqual(
2892 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2893 socket.SCM_RIGHTS,
2894 array.array("i", [fd0])),
2895 (socket.SOL_SOCKET,
2896 socket.SCM_RIGHTS,
2897 array.array("i", [fd1]))]),
2898 len(MSG))
2899
2900 def sendAncillaryIfPossible(self, msg, ancdata):
2901 # Try to send msg and ancdata to server, but if the system
2902 # call fails, just send msg with no ancillary data.
2903 try:
2904 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002905 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002906 # Check that it was the system call that failed
2907 self.assertIsInstance(e.errno, int)
2908 nbytes = self.sendmsgToServer([msg])
2909 self.assertEqual(nbytes, len(msg))
2910
Brett Cannon3bbad122015-12-28 17:21:44 -08002911 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002912 def testFDPassEmpty(self):
2913 # Try to pass an empty FD array. Can receive either no array
2914 # or an empty array.
2915 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2916 len(MSG), 10240),
2917 ignoreflags=socket.MSG_CTRUNC)
2918
2919 def _testFDPassEmpty(self):
2920 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2921 socket.SCM_RIGHTS,
2922 b"")])
2923
2924 def testFDPassPartialInt(self):
2925 # Try to pass a truncated FD array.
2926 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2927 len(MSG), 10240)
2928 self.assertEqual(msg, MSG)
2929 self.checkRecvmsgAddress(addr, self.cli_addr)
2930 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2931 self.assertLessEqual(len(ancdata), 1)
2932 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2933 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2934 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2935 self.assertLess(len(cmsg_data), SIZEOF_INT)
2936
2937 def _testFDPassPartialInt(self):
2938 self.sendAncillaryIfPossible(
2939 MSG,
2940 [(socket.SOL_SOCKET,
2941 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002942 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002943
2944 @requireAttrs(socket, "CMSG_SPACE")
2945 def testFDPassPartialIntInMiddle(self):
2946 # Try to pass two FD arrays, the first of which is truncated.
2947 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2948 len(MSG), 10240)
2949 self.assertEqual(msg, MSG)
2950 self.checkRecvmsgAddress(addr, self.cli_addr)
2951 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2952 self.assertLessEqual(len(ancdata), 2)
2953 fds = array.array("i")
2954 # Arrays may have been combined in a single control message
2955 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2956 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2957 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002958 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002959 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2960 self.assertLessEqual(len(fds), 2)
2961 self.checkFDs(fds)
2962
2963 @testFDPassPartialIntInMiddle.client_skip
2964 def _testFDPassPartialIntInMiddle(self):
2965 fd0, fd1 = self.newFDs(2)
2966 self.sendAncillaryIfPossible(
2967 MSG,
2968 [(socket.SOL_SOCKET,
2969 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002970 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002971 (socket.SOL_SOCKET,
2972 socket.SCM_RIGHTS,
2973 array.array("i", [fd1]))])
2974
2975 def checkTruncatedHeader(self, result, ignoreflags=0):
2976 # Check that no ancillary data items are returned when data is
2977 # truncated inside the cmsghdr structure.
2978 msg, ancdata, flags, addr = result
2979 self.assertEqual(msg, MSG)
2980 self.checkRecvmsgAddress(addr, self.cli_addr)
2981 self.assertEqual(ancdata, [])
2982 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2983 ignore=ignoreflags)
2984
2985 def testCmsgTruncNoBufSize(self):
2986 # Check that no ancillary data is received when no buffer size
2987 # is specified.
2988 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2989 # BSD seems to set MSG_CTRUNC only
2990 # if an item has been partially
2991 # received.
2992 ignoreflags=socket.MSG_CTRUNC)
2993
2994 def _testCmsgTruncNoBufSize(self):
2995 self.createAndSendFDs(1)
2996
2997 def testCmsgTrunc0(self):
2998 # Check that no ancillary data is received when buffer size is 0.
2999 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3000 ignoreflags=socket.MSG_CTRUNC)
3001
3002 def _testCmsgTrunc0(self):
3003 self.createAndSendFDs(1)
3004
3005 # Check that no ancillary data is returned for various non-zero
3006 # (but still too small) buffer sizes.
3007
3008 def testCmsgTrunc1(self):
3009 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3010
3011 def _testCmsgTrunc1(self):
3012 self.createAndSendFDs(1)
3013
3014 def testCmsgTrunc2Int(self):
3015 # The cmsghdr structure has at least three members, two of
3016 # which are ints, so we still shouldn't see any ancillary
3017 # data.
3018 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3019 SIZEOF_INT * 2))
3020
3021 def _testCmsgTrunc2Int(self):
3022 self.createAndSendFDs(1)
3023
3024 def testCmsgTruncLen0Minus1(self):
3025 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3026 socket.CMSG_LEN(0) - 1))
3027
3028 def _testCmsgTruncLen0Minus1(self):
3029 self.createAndSendFDs(1)
3030
3031 # The following tests try to truncate the control message in the
3032 # middle of the FD array.
3033
3034 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3035 # Check that file descriptor data is truncated to between
3036 # mindata and maxdata bytes when received with buffer size
3037 # ancbuf, and that any complete file descriptor numbers are
3038 # valid.
3039 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3040 len(MSG), ancbuf)
3041 self.assertEqual(msg, MSG)
3042 self.checkRecvmsgAddress(addr, self.cli_addr)
3043 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3044
3045 if mindata == 0 and ancdata == []:
3046 return
3047 self.assertEqual(len(ancdata), 1)
3048 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3049 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3050 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3051 self.assertGreaterEqual(len(cmsg_data), mindata)
3052 self.assertLessEqual(len(cmsg_data), maxdata)
3053 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003054 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003055 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3056 self.checkFDs(fds)
3057
3058 def testCmsgTruncLen0(self):
3059 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3060
3061 def _testCmsgTruncLen0(self):
3062 self.createAndSendFDs(1)
3063
3064 def testCmsgTruncLen0Plus1(self):
3065 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3066
3067 def _testCmsgTruncLen0Plus1(self):
3068 self.createAndSendFDs(2)
3069
3070 def testCmsgTruncLen1(self):
3071 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3072 maxdata=SIZEOF_INT)
3073
3074 def _testCmsgTruncLen1(self):
3075 self.createAndSendFDs(2)
3076
3077 def testCmsgTruncLen2Minus1(self):
3078 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3079 maxdata=(2 * SIZEOF_INT) - 1)
3080
3081 def _testCmsgTruncLen2Minus1(self):
3082 self.createAndSendFDs(2)
3083
3084
3085class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3086 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3087 # features of the RFC 3542 Advanced Sockets API for IPv6.
3088 # Currently we can only handle certain data items (e.g. traffic
3089 # class, hop limit, MTU discovery and fragmentation settings)
3090 # without resorting to unportable means such as the struct module,
3091 # but the tests here are aimed at testing the ancillary data
3092 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3093 # itself.
3094
3095 # Test value to use when setting hop limit of packet
3096 hop_limit = 2
3097
3098 # Test value to use when setting traffic class of packet.
3099 # -1 means "use kernel default".
3100 traffic_class = -1
3101
3102 def ancillaryMapping(self, ancdata):
3103 # Given ancillary data list ancdata, return a mapping from
3104 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3105 # Check that no (level, type) pair appears more than once.
3106 d = {}
3107 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3108 self.assertNotIn((cmsg_level, cmsg_type), d)
3109 d[(cmsg_level, cmsg_type)] = cmsg_data
3110 return d
3111
3112 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3113 # Receive hop limit into ancbufsize bytes of ancillary data
3114 # space. Check that data is MSG, ancillary data is not
3115 # truncated (but ignore any flags in ignoreflags), and hop
3116 # limit is between 0 and maxhop inclusive.
3117 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3118 socket.IPV6_RECVHOPLIMIT, 1)
3119 self.misc_event.set()
3120 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3121 len(MSG), ancbufsize)
3122
3123 self.assertEqual(msg, MSG)
3124 self.checkRecvmsgAddress(addr, self.cli_addr)
3125 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3126 ignore=ignoreflags)
3127
3128 self.assertEqual(len(ancdata), 1)
3129 self.assertIsInstance(ancdata[0], tuple)
3130 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3131 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3132 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3133 self.assertIsInstance(cmsg_data, bytes)
3134 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3135 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003136 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003137 self.assertGreaterEqual(a[0], 0)
3138 self.assertLessEqual(a[0], maxhop)
3139
3140 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3141 def testRecvHopLimit(self):
3142 # Test receiving the packet hop limit as ancillary data.
3143 self.checkHopLimit(ancbufsize=10240)
3144
3145 @testRecvHopLimit.client_skip
3146 def _testRecvHopLimit(self):
3147 # Need to wait until server has asked to receive ancillary
3148 # data, as implementations are not required to buffer it
3149 # otherwise.
3150 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3151 self.sendToServer(MSG)
3152
3153 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3154 def testRecvHopLimitCMSG_SPACE(self):
3155 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3156 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3157
3158 @testRecvHopLimitCMSG_SPACE.client_skip
3159 def _testRecvHopLimitCMSG_SPACE(self):
3160 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3161 self.sendToServer(MSG)
3162
3163 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3164 # 3542 says portable applications must provide space for trailing
3165 # padding. Implementations may set MSG_CTRUNC if there isn't
3166 # enough space for the padding.
3167
3168 @requireAttrs(socket.socket, "sendmsg")
3169 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3170 def testSetHopLimit(self):
3171 # Test setting hop limit on outgoing packet and receiving it
3172 # at the other end.
3173 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3174
3175 @testSetHopLimit.client_skip
3176 def _testSetHopLimit(self):
3177 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3178 self.assertEqual(
3179 self.sendmsgToServer([MSG],
3180 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3181 array.array("i", [self.hop_limit]))]),
3182 len(MSG))
3183
3184 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3185 ignoreflags=0):
3186 # Receive traffic class and hop limit into ancbufsize bytes of
3187 # ancillary data space. Check that data is MSG, ancillary
3188 # data is not truncated (but ignore any flags in ignoreflags),
3189 # and traffic class and hop limit are in range (hop limit no
3190 # more than maxhop).
3191 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3192 socket.IPV6_RECVHOPLIMIT, 1)
3193 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3194 socket.IPV6_RECVTCLASS, 1)
3195 self.misc_event.set()
3196 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3197 len(MSG), ancbufsize)
3198
3199 self.assertEqual(msg, MSG)
3200 self.checkRecvmsgAddress(addr, self.cli_addr)
3201 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3202 ignore=ignoreflags)
3203 self.assertEqual(len(ancdata), 2)
3204 ancmap = self.ancillaryMapping(ancdata)
3205
3206 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3207 self.assertEqual(len(tcdata), SIZEOF_INT)
3208 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003209 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003210 self.assertGreaterEqual(a[0], 0)
3211 self.assertLessEqual(a[0], 255)
3212
3213 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3214 self.assertEqual(len(hldata), SIZEOF_INT)
3215 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003216 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003217 self.assertGreaterEqual(a[0], 0)
3218 self.assertLessEqual(a[0], maxhop)
3219
3220 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3221 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3222 def testRecvTrafficClassAndHopLimit(self):
3223 # Test receiving traffic class and hop limit as ancillary data.
3224 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3225
3226 @testRecvTrafficClassAndHopLimit.client_skip
3227 def _testRecvTrafficClassAndHopLimit(self):
3228 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3229 self.sendToServer(MSG)
3230
3231 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3232 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3233 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3234 # Test receiving traffic class and hop limit, using
3235 # CMSG_SPACE() to calculate buffer size.
3236 self.checkTrafficClassAndHopLimit(
3237 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3238
3239 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3240 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3241 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3242 self.sendToServer(MSG)
3243
3244 @requireAttrs(socket.socket, "sendmsg")
3245 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3246 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3247 def testSetTrafficClassAndHopLimit(self):
3248 # Test setting traffic class and hop limit on outgoing packet,
3249 # and receiving them at the other end.
3250 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3251 maxhop=self.hop_limit)
3252
3253 @testSetTrafficClassAndHopLimit.client_skip
3254 def _testSetTrafficClassAndHopLimit(self):
3255 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3256 self.assertEqual(
3257 self.sendmsgToServer([MSG],
3258 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3259 array.array("i", [self.traffic_class])),
3260 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3261 array.array("i", [self.hop_limit]))]),
3262 len(MSG))
3263
3264 @requireAttrs(socket.socket, "sendmsg")
3265 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3266 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3267 def testOddCmsgSize(self):
3268 # Try to send ancillary data with first item one byte too
3269 # long. Fall back to sending with correct size if this fails,
3270 # and check that second item was handled correctly.
3271 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3272 maxhop=self.hop_limit)
3273
3274 @testOddCmsgSize.client_skip
3275 def _testOddCmsgSize(self):
3276 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3277 try:
3278 nbytes = self.sendmsgToServer(
3279 [MSG],
3280 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003281 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003282 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3283 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003284 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003285 self.assertIsInstance(e.errno, int)
3286 nbytes = self.sendmsgToServer(
3287 [MSG],
3288 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3289 array.array("i", [self.traffic_class])),
3290 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3291 array.array("i", [self.hop_limit]))])
3292 self.assertEqual(nbytes, len(MSG))
3293
3294 # Tests for proper handling of truncated ancillary data
3295
3296 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3297 # Receive hop limit into ancbufsize bytes of ancillary data
3298 # space, which should be too small to contain the ancillary
3299 # data header (if ancbufsize is None, pass no second argument
3300 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3301 # (unless included in ignoreflags), and no ancillary data is
3302 # returned.
3303 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3304 socket.IPV6_RECVHOPLIMIT, 1)
3305 self.misc_event.set()
3306 args = () if ancbufsize is None else (ancbufsize,)
3307 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3308 len(MSG), *args)
3309
3310 self.assertEqual(msg, MSG)
3311 self.checkRecvmsgAddress(addr, self.cli_addr)
3312 self.assertEqual(ancdata, [])
3313 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3314 ignore=ignoreflags)
3315
3316 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3317 def testCmsgTruncNoBufSize(self):
3318 # Check that no ancillary data is received when no ancillary
3319 # buffer size is provided.
3320 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3321 # BSD seems to set
3322 # MSG_CTRUNC only if an item
3323 # has been partially
3324 # received.
3325 ignoreflags=socket.MSG_CTRUNC)
3326
3327 @testCmsgTruncNoBufSize.client_skip
3328 def _testCmsgTruncNoBufSize(self):
3329 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3330 self.sendToServer(MSG)
3331
3332 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3333 def testSingleCmsgTrunc0(self):
3334 # Check that no ancillary data is received when ancillary
3335 # buffer size is zero.
3336 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3337 ignoreflags=socket.MSG_CTRUNC)
3338
3339 @testSingleCmsgTrunc0.client_skip
3340 def _testSingleCmsgTrunc0(self):
3341 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3342 self.sendToServer(MSG)
3343
3344 # Check that no ancillary data is returned for various non-zero
3345 # (but still too small) buffer sizes.
3346
3347 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3348 def testSingleCmsgTrunc1(self):
3349 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3350
3351 @testSingleCmsgTrunc1.client_skip
3352 def _testSingleCmsgTrunc1(self):
3353 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3354 self.sendToServer(MSG)
3355
3356 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3357 def testSingleCmsgTrunc2Int(self):
3358 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3359
3360 @testSingleCmsgTrunc2Int.client_skip
3361 def _testSingleCmsgTrunc2Int(self):
3362 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3363 self.sendToServer(MSG)
3364
3365 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3366 def testSingleCmsgTruncLen0Minus1(self):
3367 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3368
3369 @testSingleCmsgTruncLen0Minus1.client_skip
3370 def _testSingleCmsgTruncLen0Minus1(self):
3371 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3372 self.sendToServer(MSG)
3373
3374 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3375 def testSingleCmsgTruncInData(self):
3376 # Test truncation of a control message inside its associated
3377 # data. The message may be returned with its data truncated,
3378 # or not returned at all.
3379 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3380 socket.IPV6_RECVHOPLIMIT, 1)
3381 self.misc_event.set()
3382 msg, ancdata, flags, addr = self.doRecvmsg(
3383 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3384
3385 self.assertEqual(msg, MSG)
3386 self.checkRecvmsgAddress(addr, self.cli_addr)
3387 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3388
3389 self.assertLessEqual(len(ancdata), 1)
3390 if ancdata:
3391 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3392 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3393 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3394 self.assertLess(len(cmsg_data), SIZEOF_INT)
3395
3396 @testSingleCmsgTruncInData.client_skip
3397 def _testSingleCmsgTruncInData(self):
3398 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3399 self.sendToServer(MSG)
3400
3401 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3402 # Receive traffic class and hop limit into ancbufsize bytes of
3403 # ancillary data space, which should be large enough to
3404 # contain the first item, but too small to contain the header
3405 # of the second. Check that data is MSG, MSG_CTRUNC is set
3406 # (unless included in ignoreflags), and only one ancillary
3407 # data item is returned.
3408 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3409 socket.IPV6_RECVHOPLIMIT, 1)
3410 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3411 socket.IPV6_RECVTCLASS, 1)
3412 self.misc_event.set()
3413 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3414 len(MSG), ancbufsize)
3415
3416 self.assertEqual(msg, MSG)
3417 self.checkRecvmsgAddress(addr, self.cli_addr)
3418 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3419 ignore=ignoreflags)
3420
3421 self.assertEqual(len(ancdata), 1)
3422 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3423 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3424 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3425 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3426 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003427 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003428 self.assertGreaterEqual(a[0], 0)
3429 self.assertLessEqual(a[0], 255)
3430
3431 # Try the above test with various buffer sizes.
3432
3433 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3434 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3435 def testSecondCmsgTrunc0(self):
3436 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3437 ignoreflags=socket.MSG_CTRUNC)
3438
3439 @testSecondCmsgTrunc0.client_skip
3440 def _testSecondCmsgTrunc0(self):
3441 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3442 self.sendToServer(MSG)
3443
3444 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3445 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3446 def testSecondCmsgTrunc1(self):
3447 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3448
3449 @testSecondCmsgTrunc1.client_skip
3450 def _testSecondCmsgTrunc1(self):
3451 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3452 self.sendToServer(MSG)
3453
3454 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3455 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3456 def testSecondCmsgTrunc2Int(self):
3457 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3458 2 * SIZEOF_INT)
3459
3460 @testSecondCmsgTrunc2Int.client_skip
3461 def _testSecondCmsgTrunc2Int(self):
3462 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3463 self.sendToServer(MSG)
3464
3465 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3466 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3467 def testSecondCmsgTruncLen0Minus1(self):
3468 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3469 socket.CMSG_LEN(0) - 1)
3470
3471 @testSecondCmsgTruncLen0Minus1.client_skip
3472 def _testSecondCmsgTruncLen0Minus1(self):
3473 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3474 self.sendToServer(MSG)
3475
3476 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3477 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3478 def testSecomdCmsgTruncInData(self):
3479 # Test truncation of the second of two control messages inside
3480 # its associated data.
3481 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3482 socket.IPV6_RECVHOPLIMIT, 1)
3483 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3484 socket.IPV6_RECVTCLASS, 1)
3485 self.misc_event.set()
3486 msg, ancdata, flags, addr = self.doRecvmsg(
3487 self.serv_sock, len(MSG),
3488 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3489
3490 self.assertEqual(msg, MSG)
3491 self.checkRecvmsgAddress(addr, self.cli_addr)
3492 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3493
3494 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3495
3496 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3497 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3498 cmsg_types.remove(cmsg_type)
3499 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3500 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003501 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003502 self.assertGreaterEqual(a[0], 0)
3503 self.assertLessEqual(a[0], 255)
3504
3505 if ancdata:
3506 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3507 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3508 cmsg_types.remove(cmsg_type)
3509 self.assertLess(len(cmsg_data), SIZEOF_INT)
3510
3511 self.assertEqual(ancdata, [])
3512
3513 @testSecomdCmsgTruncInData.client_skip
3514 def _testSecomdCmsgTruncInData(self):
3515 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3516 self.sendToServer(MSG)
3517
3518
3519# Derive concrete test classes for different socket types.
3520
3521class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3522 SendrecvmsgConnectionlessBase,
3523 ThreadedSocketTestMixin, UDPTestBase):
3524 pass
3525
3526@requireAttrs(socket.socket, "sendmsg")
3527@unittest.skipUnless(thread, 'Threading required for this test.')
3528class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3529 pass
3530
3531@requireAttrs(socket.socket, "recvmsg")
3532@unittest.skipUnless(thread, 'Threading required for this test.')
3533class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3534 pass
3535
3536@requireAttrs(socket.socket, "recvmsg_into")
3537@unittest.skipUnless(thread, 'Threading required for this test.')
3538class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3539 pass
3540
3541
3542class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3543 SendrecvmsgConnectionlessBase,
3544 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003545
3546 def checkRecvmsgAddress(self, addr1, addr2):
3547 # Called to compare the received address with the address of
3548 # the peer, ignoring scope ID
3549 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003550
3551@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003552@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003553@requireSocket("AF_INET6", "SOCK_DGRAM")
3554@unittest.skipUnless(thread, 'Threading required for this test.')
3555class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3556 pass
3557
3558@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003559@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003560@requireSocket("AF_INET6", "SOCK_DGRAM")
3561@unittest.skipUnless(thread, 'Threading required for this test.')
3562class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3563 pass
3564
3565@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003566@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003567@requireSocket("AF_INET6", "SOCK_DGRAM")
3568@unittest.skipUnless(thread, 'Threading required for this test.')
3569class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3570 pass
3571
3572@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003573@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003574@requireAttrs(socket, "IPPROTO_IPV6")
3575@requireSocket("AF_INET6", "SOCK_DGRAM")
3576@unittest.skipUnless(thread, 'Threading required for this test.')
3577class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3578 SendrecvmsgUDP6TestBase):
3579 pass
3580
3581@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003582@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003583@requireAttrs(socket, "IPPROTO_IPV6")
3584@requireSocket("AF_INET6", "SOCK_DGRAM")
3585@unittest.skipUnless(thread, 'Threading required for this test.')
3586class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3587 RFC3542AncillaryTest,
3588 SendrecvmsgUDP6TestBase):
3589 pass
3590
3591
3592class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3593 ConnectedStreamTestMixin, TCPTestBase):
3594 pass
3595
3596@requireAttrs(socket.socket, "sendmsg")
3597@unittest.skipUnless(thread, 'Threading required for this test.')
3598class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3599 pass
3600
3601@requireAttrs(socket.socket, "recvmsg")
3602@unittest.skipUnless(thread, 'Threading required for this test.')
3603class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3604 SendrecvmsgTCPTestBase):
3605 pass
3606
3607@requireAttrs(socket.socket, "recvmsg_into")
3608@unittest.skipUnless(thread, 'Threading required for this test.')
3609class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3610 SendrecvmsgTCPTestBase):
3611 pass
3612
3613
3614class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3615 SendrecvmsgConnectedBase,
3616 ConnectedStreamTestMixin, SCTPStreamBase):
3617 pass
3618
3619@requireAttrs(socket.socket, "sendmsg")
3620@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3621@unittest.skipUnless(thread, 'Threading required for this test.')
3622class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3623 pass
3624
3625@requireAttrs(socket.socket, "recvmsg")
3626@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3627@unittest.skipUnless(thread, 'Threading required for this test.')
3628class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3629 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003630
3631 def testRecvmsgEOF(self):
3632 try:
3633 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3634 except OSError as e:
3635 if e.errno != errno.ENOTCONN:
3636 raise
3637 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003638
3639@requireAttrs(socket.socket, "recvmsg_into")
3640@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3641@unittest.skipUnless(thread, 'Threading required for this test.')
3642class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3643 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003644
3645 def testRecvmsgEOF(self):
3646 try:
3647 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3648 except OSError as e:
3649 if e.errno != errno.ENOTCONN:
3650 raise
3651 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003652
3653
3654class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3655 ConnectedStreamTestMixin, UnixStreamBase):
3656 pass
3657
3658@requireAttrs(socket.socket, "sendmsg")
3659@requireAttrs(socket, "AF_UNIX")
3660@unittest.skipUnless(thread, 'Threading required for this test.')
3661class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3662 pass
3663
3664@requireAttrs(socket.socket, "recvmsg")
3665@requireAttrs(socket, "AF_UNIX")
3666@unittest.skipUnless(thread, 'Threading required for this test.')
3667class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3668 SendrecvmsgUnixStreamTestBase):
3669 pass
3670
3671@requireAttrs(socket.socket, "recvmsg_into")
3672@requireAttrs(socket, "AF_UNIX")
3673@unittest.skipUnless(thread, 'Threading required for this test.')
3674class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3675 SendrecvmsgUnixStreamTestBase):
3676 pass
3677
3678@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3679@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3680@unittest.skipUnless(thread, 'Threading required for this test.')
3681class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3682 pass
3683
3684@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3685@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3686@unittest.skipUnless(thread, 'Threading required for this test.')
3687class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3688 SendrecvmsgUnixStreamTestBase):
3689 pass
3690
3691
3692# Test interrupting the interruptible send/receive methods with a
3693# signal when a timeout is set. These tests avoid having multiple
3694# threads alive during the test so that the OS cannot deliver the
3695# signal to the wrong one.
3696
3697class InterruptedTimeoutBase(unittest.TestCase):
3698 # Base class for interrupted send/receive tests. Installs an
3699 # empty handler for SIGALRM and removes it on teardown, along with
3700 # any scheduled alarms.
3701
3702 def setUp(self):
3703 super().setUp()
3704 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003705 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003706 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3707 self.addCleanup(self.setAlarm, 0)
3708
3709 # Timeout for socket operations
3710 timeout = 4.0
3711
3712 # Provide setAlarm() method to schedule delivery of SIGALRM after
3713 # given number of seconds, or cancel it if zero, and an
3714 # appropriate time value to use. Use setitimer() if available.
3715 if hasattr(signal, "setitimer"):
3716 alarm_time = 0.05
3717
3718 def setAlarm(self, seconds):
3719 signal.setitimer(signal.ITIMER_REAL, seconds)
3720 else:
3721 # Old systems may deliver the alarm up to one second early
3722 alarm_time = 2
3723
3724 def setAlarm(self, seconds):
3725 signal.alarm(seconds)
3726
3727
3728# Require siginterrupt() in order to ensure that system calls are
3729# interrupted by default.
3730@requireAttrs(signal, "siginterrupt")
3731@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3732 "Don't have signal.alarm or signal.setitimer")
3733class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3734 # Test interrupting the recv*() methods with signals when a
3735 # timeout is set.
3736
3737 def setUp(self):
3738 super().setUp()
3739 self.serv.settimeout(self.timeout)
3740
3741 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003742 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003743 # errno of EINTR when interrupted by a signal.
3744 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003745 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003746 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003747
3748 def testInterruptedRecvTimeout(self):
3749 self.checkInterruptedRecv(self.serv.recv, 1024)
3750
3751 def testInterruptedRecvIntoTimeout(self):
3752 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3753
3754 def testInterruptedRecvfromTimeout(self):
3755 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3756
3757 def testInterruptedRecvfromIntoTimeout(self):
3758 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3759
3760 @requireAttrs(socket.socket, "recvmsg")
3761 def testInterruptedRecvmsgTimeout(self):
3762 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3763
3764 @requireAttrs(socket.socket, "recvmsg_into")
3765 def testInterruptedRecvmsgIntoTimeout(self):
3766 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3767
3768
3769# Require siginterrupt() in order to ensure that system calls are
3770# interrupted by default.
3771@requireAttrs(signal, "siginterrupt")
3772@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3773 "Don't have signal.alarm or signal.setitimer")
3774@unittest.skipUnless(thread, 'Threading required for this test.')
3775class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3776 ThreadSafeCleanupTestCase,
3777 SocketListeningTestMixin, TCPTestBase):
3778 # Test interrupting the interruptible send*() methods with signals
3779 # when a timeout is set.
3780
3781 def setUp(self):
3782 super().setUp()
3783 self.serv_conn = self.newSocket()
3784 self.addCleanup(self.serv_conn.close)
3785 # Use a thread to complete the connection, but wait for it to
3786 # terminate before running the test, so that there is only one
3787 # thread to accept the signal.
3788 cli_thread = threading.Thread(target=self.doConnect)
3789 cli_thread.start()
3790 self.cli_conn, addr = self.serv.accept()
3791 self.addCleanup(self.cli_conn.close)
3792 cli_thread.join()
3793 self.serv_conn.settimeout(self.timeout)
3794
3795 def doConnect(self):
3796 self.serv_conn.connect(self.serv_addr)
3797
3798 def checkInterruptedSend(self, func, *args, **kwargs):
3799 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003800 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003801 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003802 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003803 while True:
3804 self.setAlarm(self.alarm_time)
3805 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003806
Ned Deilyc5640382014-02-03 13:58:31 -08003807 # Issue #12958: The following tests have problems on OS X prior to 10.7
3808 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003809 def testInterruptedSendTimeout(self):
3810 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3811
Ned Deilyc5640382014-02-03 13:58:31 -08003812 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003813 def testInterruptedSendtoTimeout(self):
3814 # Passing an actual address here as Python's wrapper for
3815 # sendto() doesn't allow passing a zero-length one; POSIX
3816 # requires that the address is ignored since the socket is
3817 # connection-mode, however.
3818 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3819 self.serv_addr)
3820
Ned Deilyc5640382014-02-03 13:58:31 -08003821 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003822 @requireAttrs(socket.socket, "sendmsg")
3823 def testInterruptedSendmsgTimeout(self):
3824 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3825
3826
Victor Stinner45df8202010-04-28 22:31:17 +00003827@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003828class TCPCloserTest(ThreadedTCPSocketTest):
3829
3830 def testClose(self):
3831 conn, addr = self.serv.accept()
3832 conn.close()
3833
3834 sd = self.cli
3835 read, write, err = select.select([sd], [], [], 1.0)
3836 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003837 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003838
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003839 # Calling close() many times should be safe.
3840 conn.close()
3841 conn.close()
3842
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003843 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003844 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003845 time.sleep(1.0)
3846
Victor Stinner45df8202010-04-28 22:31:17 +00003847@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003848class BasicSocketPairTest(SocketPairTest):
3849
3850 def __init__(self, methodName='runTest'):
3851 SocketPairTest.__init__(self, methodName=methodName)
3852
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003853 def _check_defaults(self, sock):
3854 self.assertIsInstance(sock, socket.socket)
3855 if hasattr(socket, 'AF_UNIX'):
3856 self.assertEqual(sock.family, socket.AF_UNIX)
3857 else:
3858 self.assertEqual(sock.family, socket.AF_INET)
3859 self.assertEqual(sock.type, socket.SOCK_STREAM)
3860 self.assertEqual(sock.proto, 0)
3861
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003862 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003863 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003864
3865 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003866 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003867
Dave Cole331708b2004-08-09 04:51:41 +00003868 def testRecv(self):
3869 msg = self.serv.recv(1024)
3870 self.assertEqual(msg, MSG)
3871
3872 def _testRecv(self):
3873 self.cli.send(MSG)
3874
3875 def testSend(self):
3876 self.serv.send(MSG)
3877
3878 def _testSend(self):
3879 msg = self.cli.recv(1024)
3880 self.assertEqual(msg, MSG)
3881
Victor Stinner45df8202010-04-28 22:31:17 +00003882@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003883class NonBlockingTCPTests(ThreadedTCPSocketTest):
3884
3885 def __init__(self, methodName='runTest'):
3886 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3887
3888 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003889 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003890 self.serv.setblocking(True)
3891 self.assertIsNone(self.serv.gettimeout())
3892 self.serv.setblocking(False)
3893 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003894 start = time.time()
3895 try:
3896 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003897 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003898 pass
3899 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003900 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003901
3902 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003903 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003904
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003905 @support.cpython_only
3906 def testSetBlocking_overflow(self):
3907 # Issue 15989
3908 import _testcapi
3909 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3910 self.skipTest('needs UINT_MAX < ULONG_MAX')
3911 self.serv.setblocking(False)
3912 self.assertEqual(self.serv.gettimeout(), 0.0)
3913 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3914 self.assertIsNone(self.serv.gettimeout())
3915
3916 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3917
Serhiy Storchaka43767632013-11-03 21:31:38 +02003918 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3919 'test needs socket.SOCK_NONBLOCK')
3920 @support.requires_linux_version(2, 6, 28)
3921 def testInitNonBlocking(self):
3922 # reinit server socket
3923 self.serv.close()
3924 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3925 socket.SOCK_NONBLOCK)
3926 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003927 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003928 # actual testing
3929 start = time.time()
3930 try:
3931 self.serv.accept()
3932 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003933 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003934 end = time.time()
3935 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3936
3937 def _testInitNonBlocking(self):
3938 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003939
Antoine Pitrou600232b2011-01-05 21:03:42 +00003940 def testInheritFlags(self):
3941 # Issue #7995: when calling accept() on a listening socket with a
3942 # timeout, the resulting socket should not be non-blocking.
3943 self.serv.settimeout(10)
3944 try:
3945 conn, addr = self.serv.accept()
3946 message = conn.recv(len(MSG))
3947 finally:
3948 conn.close()
3949 self.serv.settimeout(None)
3950
3951 def _testInheritFlags(self):
3952 time.sleep(0.1)
3953 self.cli.connect((HOST, self.port))
3954 time.sleep(0.5)
3955 self.cli.send(MSG)
3956
Guido van Rossum24e4af82002-06-12 19:18:08 +00003957 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003958 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003959 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003960 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003961 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003962 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003963 pass
3964 else:
3965 self.fail("Error trying to do non-blocking accept.")
3966 read, write, err = select.select([self.serv], [], [])
3967 if self.serv in read:
3968 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07003969 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00003970 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003971 else:
3972 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003973
Guido van Rossum24e4af82002-06-12 19:18:08 +00003974 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003975 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003976 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003977
3978 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003979 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003980 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003981 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003982
3983 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003984 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003985 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003986
3987 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003988 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003989 conn, addr = self.serv.accept()
3990 conn.setblocking(0)
3991 try:
3992 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003993 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003994 pass
3995 else:
3996 self.fail("Error trying to do non-blocking recv.")
3997 read, write, err = select.select([conn], [], [])
3998 if conn in read:
3999 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004000 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00004001 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004002 else:
4003 self.fail("Error during select call to non-blocking socket.")
4004
4005 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004006 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004007 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004008 self.cli.send(MSG)
4009
Victor Stinner45df8202010-04-28 22:31:17 +00004010@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00004011class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004012 """Unit tests for the object returned by socket.makefile()
4013
Antoine Pitrou834bd812010-10-13 16:17:14 +00004014 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004015 the client connection. You can read from this file to
4016 get output from the server.
4017
Antoine Pitrou834bd812010-10-13 16:17:14 +00004018 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004019 server connection. You can write to this file to send output
4020 to the client.
4021 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004022
Guido van Rossume9f66142002-08-07 15:46:19 +00004023 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004024 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004025 errors = 'strict'
4026 newline = None
4027
4028 read_mode = 'rb'
4029 read_msg = MSG
4030 write_mode = 'wb'
4031 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004032
Guido van Rossum24e4af82002-06-12 19:18:08 +00004033 def __init__(self, methodName='runTest'):
4034 SocketConnectedTest.__init__(self, methodName=methodName)
4035
4036 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004037 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4038 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004039 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004040 self.read_file = self.cli_conn.makefile(
4041 self.read_mode, self.bufsize,
4042 encoding = self.encoding,
4043 errors = self.errors,
4044 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004045
4046 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004047 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004048 self.read_file.close()
4049 self.assertTrue(self.read_file.closed)
4050 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004051 SocketConnectedTest.tearDown(self)
4052
4053 def clientSetUp(self):
4054 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004055 self.write_file = self.serv_conn.makefile(
4056 self.write_mode, self.bufsize,
4057 encoding = self.encoding,
4058 errors = self.errors,
4059 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004060
4061 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004062 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004063 self.write_file.close()
4064 self.assertTrue(self.write_file.closed)
4065 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004066 SocketConnectedTest.clientTearDown(self)
4067
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004068 def testReadAfterTimeout(self):
4069 # Issue #7322: A file object must disallow further reads
4070 # after a timeout has occurred.
4071 self.cli_conn.settimeout(1)
4072 self.read_file.read(3)
4073 # First read raises a timeout
4074 self.assertRaises(socket.timeout, self.read_file.read, 1)
4075 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004076 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004077 self.read_file.read(1)
4078 self.assertIn("cannot read from timed out object", str(ctx.exception))
4079
4080 def _testReadAfterTimeout(self):
4081 self.write_file.write(self.write_msg[0:3])
4082 self.write_file.flush()
4083 self.serv_finished.wait()
4084
Guido van Rossum24e4af82002-06-12 19:18:08 +00004085 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004086 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004087 first_seg = self.read_file.read(len(self.read_msg)-3)
4088 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004089 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004090 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004091
4092 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004093 self.write_file.write(self.write_msg)
4094 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004095
Guido van Rossum8c943832002-08-08 01:00:28 +00004096 def testFullRead(self):
4097 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004098 msg = self.read_file.read()
4099 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004100
4101 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004102 self.write_file.write(self.write_msg)
4103 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004104
Guido van Rossum24e4af82002-06-12 19:18:08 +00004105 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004106 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004107 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004108 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004109 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004110 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004111 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004112 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004113 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004114
4115 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004116 self.write_file.write(self.write_msg)
4117 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004118
4119 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004120 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004121 line = self.read_file.readline()
4122 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004123
4124 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004125 self.write_file.write(self.write_msg)
4126 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004127
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004128 def testCloseAfterMakefile(self):
4129 # The file returned by makefile should keep the socket open.
4130 self.cli_conn.close()
4131 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004132 msg = self.read_file.read()
4133 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004134
4135 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004136 self.write_file.write(self.write_msg)
4137 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004138
4139 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004140 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004141 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004142 if isinstance(self.read_msg, str):
4143 msg = msg.decode()
4144 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004145
4146 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004147 self.write_file.write(self.write_msg)
4148 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004149
Tim Peters116d83c2004-03-28 02:20:45 +00004150 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004151 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004152
4153 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004154 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004155
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004156 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004157 self.assertEqual(self.read_file.mode, self.read_mode)
4158 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004159
4160 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004161 self.assertEqual(self.write_file.mode, self.write_mode)
4162 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004163
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004164 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004165 self.read_file.close()
4166 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004167 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004168 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004169
4170 def _testRealClose(self):
4171 pass
4172
4173
Guido van Rossume9f66142002-08-07 15:46:19 +00004174class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4175
4176 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004177
Guido van Rossume9f66142002-08-07 15:46:19 +00004178 In this case (and in this case only), it should be possible to
4179 create a file object, read a line from it, create another file
4180 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004181 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004182 when reading multiple requests from the same socket."""
4183
4184 bufsize = 0 # Use unbuffered mode
4185
4186 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004187 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004188 line = self.read_file.readline() # first line
4189 self.assertEqual(line, b"A. " + self.write_msg) # first line
4190 self.read_file = self.cli_conn.makefile('rb', 0)
4191 line = self.read_file.readline() # second line
4192 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004193
4194 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004195 self.write_file.write(b"A. " + self.write_msg)
4196 self.write_file.write(b"B. " + self.write_msg)
4197 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004198
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004199 def testMakefileClose(self):
4200 # The file returned by makefile should keep the socket open...
4201 self.cli_conn.close()
4202 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004203 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004204 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004205 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004206 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004207
4208 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004209 self.write_file.write(self.write_msg)
4210 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004211
4212 def testMakefileCloseSocketDestroy(self):
4213 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004214 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004215 refcount_after = sys.getrefcount(self.cli_conn)
4216 self.assertEqual(refcount_before - 1, refcount_after)
4217
4218 def _testMakefileCloseSocketDestroy(self):
4219 pass
4220
Antoine Pitrou98b46702010-09-18 22:59:00 +00004221 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004222 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004223 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4224
4225 def testSmallReadNonBlocking(self):
4226 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004227 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4228 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004229 self.evt1.set()
4230 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004231 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004232 if first_seg is None:
4233 # Data not arrived (can happen under Windows), wait a bit
4234 time.sleep(0.5)
4235 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004236 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004237 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004238 self.assertEqual(n, 3)
4239 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004240 self.assertEqual(msg, self.read_msg)
4241 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4242 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004243
4244 def _testSmallReadNonBlocking(self):
4245 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004246 self.write_file.write(self.write_msg)
4247 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004248 self.evt2.set()
4249 # Avoid cloding the socket before the server test has finished,
4250 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4251 self.serv_finished.wait(5.0)
4252
4253 def testWriteNonBlocking(self):
4254 self.cli_finished.wait(5.0)
4255 # The client thread can't skip directly - the SkipTest exception
4256 # would appear as a failure.
4257 if self.serv_skipped:
4258 self.skipTest(self.serv_skipped)
4259
4260 def _testWriteNonBlocking(self):
4261 self.serv_skipped = None
4262 self.serv_conn.setblocking(False)
4263 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004264 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004265 LIMIT = 10
4266 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004267 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004268 self.assertGreater(n, 0)
4269 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004270 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004271 if n is None:
4272 # Succeeded
4273 break
4274 self.assertGreater(n, 0)
4275 else:
4276 # Let us know that this test didn't manage to establish
4277 # the expected conditions. This is not a failure in itself but,
4278 # if it happens repeatedly, the test should be fixed.
4279 self.serv_skipped = "failed to saturate the socket buffer"
4280
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004281
Guido van Rossum8c943832002-08-08 01:00:28 +00004282class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4283
4284 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4285
4286
4287class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4288
4289 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004290
Thomas Woutersb2137042007-02-01 18:02:27 +00004291
Antoine Pitrou834bd812010-10-13 16:17:14 +00004292class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4293 """Tests for socket.makefile() in text mode (rather than binary)"""
4294
4295 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004296 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004297 write_mode = 'wb'
4298 write_msg = MSG
4299 newline = ''
4300
4301
4302class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4303 """Tests for socket.makefile() in text mode (rather than binary)"""
4304
4305 read_mode = 'rb'
4306 read_msg = MSG
4307 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004308 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004309 newline = ''
4310
4311
4312class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4313 """Tests for socket.makefile() in text mode (rather than binary)"""
4314
4315 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004316 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004317 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004318 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004319 newline = ''
4320
4321
Guido van Rossumd8faa362007-04-27 19:54:29 +00004322class NetworkConnectionTest(object):
4323 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004324
Guido van Rossumd8faa362007-04-27 19:54:29 +00004325 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004326 # We're inherited below by BasicTCPTest2, which also inherits
4327 # BasicTCPTest, which defines self.port referenced below.
4328 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004329 self.serv_conn = self.cli
4330
4331class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4332 """Tests that NetworkConnection does not break existing TCP functionality.
4333 """
4334
4335class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004336
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004337 class MockSocket(socket.socket):
4338 def connect(self, *args):
4339 raise socket.timeout('timed out')
4340
4341 @contextlib.contextmanager
4342 def mocked_socket_module(self):
4343 """Return a socket which times out on connect"""
4344 old_socket = socket.socket
4345 socket.socket = self.MockSocket
4346 try:
4347 yield
4348 finally:
4349 socket.socket = old_socket
4350
4351 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004352 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004353 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004354 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004355 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004356 cli.connect((HOST, port))
4357 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4358
4359 def test_create_connection(self):
4360 # Issue #9792: errors raised by create_connection() should have
4361 # a proper errno attribute.
4362 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004363 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004364 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004365
4366 # Issue #16257: create_connection() calls getaddrinfo() against
4367 # 'localhost'. This may result in an IPV6 addr being returned
4368 # as well as an IPV4 one:
4369 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4370 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4371 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4372 #
4373 # create_connection() enumerates through all the addresses returned
4374 # and if it doesn't successfully bind to any of them, it propagates
4375 # the last exception it encountered.
4376 #
4377 # On Solaris, ENETUNREACH is returned in this circumstance instead
4378 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4379 # expected errnos.
4380 expected_errnos = [ errno.ECONNREFUSED, ]
4381 if hasattr(errno, 'ENETUNREACH'):
4382 expected_errnos.append(errno.ENETUNREACH)
4383
4384 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004385
4386 def test_create_connection_timeout(self):
4387 # Issue #9792: create_connection() should not recast timeout errors
4388 # as generic socket errors.
4389 with self.mocked_socket_module():
4390 with self.assertRaises(socket.timeout):
4391 socket.create_connection((HOST, 1234))
4392
Guido van Rossumd8faa362007-04-27 19:54:29 +00004393
Victor Stinner45df8202010-04-28 22:31:17 +00004394@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004395class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4396
4397 def __init__(self, methodName='runTest'):
4398 SocketTCPTest.__init__(self, methodName=methodName)
4399 ThreadableTest.__init__(self)
4400
4401 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004402 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004403
4404 def clientTearDown(self):
4405 self.cli.close()
4406 self.cli = None
4407 ThreadableTest.clientTearDown(self)
4408
4409 def _justAccept(self):
4410 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004411 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004412
4413 testFamily = _justAccept
4414 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004415 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004416 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004417 self.assertEqual(self.cli.family, 2)
4418
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004419 testSourceAddress = _justAccept
4420 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004421 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4422 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004423 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004424 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004425 # The port number being used is sufficient to show that the bind()
4426 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004427
Guido van Rossumd8faa362007-04-27 19:54:29 +00004428 testTimeoutDefault = _justAccept
4429 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004430 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004431 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004432 socket.setdefaulttimeout(42)
4433 try:
4434 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004435 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004436 finally:
4437 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004438 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004439
4440 testTimeoutNone = _justAccept
4441 def _testTimeoutNone(self):
4442 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004443 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004444 socket.setdefaulttimeout(30)
4445 try:
4446 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004447 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004448 finally:
4449 socket.setdefaulttimeout(None)
4450 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004451
4452 testTimeoutValueNamed = _justAccept
4453 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004454 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004455 self.assertEqual(self.cli.gettimeout(), 30)
4456
4457 testTimeoutValueNonamed = _justAccept
4458 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004459 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004460 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004461 self.assertEqual(self.cli.gettimeout(), 30)
4462
Victor Stinner45df8202010-04-28 22:31:17 +00004463@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004464class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4465
4466 def __init__(self, methodName='runTest'):
4467 SocketTCPTest.__init__(self, methodName=methodName)
4468 ThreadableTest.__init__(self)
4469
4470 def clientSetUp(self):
4471 pass
4472
4473 def clientTearDown(self):
4474 self.cli.close()
4475 self.cli = None
4476 ThreadableTest.clientTearDown(self)
4477
4478 def testInsideTimeout(self):
4479 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004480 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004481 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004482 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004483 testOutsideTimeout = testInsideTimeout
4484
4485 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004486 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004487 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004488 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004489
4490 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004491 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004492 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004493
4494
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004495class TCPTimeoutTest(SocketTCPTest):
4496
4497 def testTCPTimeout(self):
4498 def raise_timeout(*args, **kwargs):
4499 self.serv.settimeout(1.0)
4500 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004501 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004502 "Error generating a timeout exception (TCP)")
4503
4504 def testTimeoutZero(self):
4505 ok = False
4506 try:
4507 self.serv.settimeout(0.0)
4508 foo = self.serv.accept()
4509 except socket.timeout:
4510 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004511 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004512 ok = True
4513 except:
4514 self.fail("caught unexpected exception (TCP)")
4515 if not ok:
4516 self.fail("accept() returned success when we did not expect it")
4517
Serhiy Storchaka43767632013-11-03 21:31:38 +02004518 @unittest.skipUnless(hasattr(signal, 'alarm'),
4519 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004520 def testInterruptedTimeout(self):
4521 # XXX I don't know how to do this test on MSWindows or any other
4522 # plaform that doesn't support signal.alarm() or os.kill(), though
4523 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004524 self.serv.settimeout(5.0) # must be longer than alarm
4525 class Alarm(Exception):
4526 pass
4527 def alarm_handler(signal, frame):
4528 raise Alarm
4529 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4530 try:
4531 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4532 try:
4533 foo = self.serv.accept()
4534 except socket.timeout:
4535 self.fail("caught timeout instead of Alarm")
4536 except Alarm:
4537 pass
4538 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004539 self.fail("caught other exception instead of Alarm:"
4540 " %s(%s):\n%s" %
4541 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004542 else:
4543 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004544 finally:
4545 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004546 except Alarm:
4547 self.fail("got Alarm in wrong place")
4548 finally:
4549 # no alarm can be pending. Safe to restore old handler.
4550 signal.signal(signal.SIGALRM, old_alarm)
4551
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004552class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004553
4554 def testUDPTimeout(self):
4555 def raise_timeout(*args, **kwargs):
4556 self.serv.settimeout(1.0)
4557 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004558 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004559 "Error generating a timeout exception (UDP)")
4560
4561 def testTimeoutZero(self):
4562 ok = False
4563 try:
4564 self.serv.settimeout(0.0)
4565 foo = self.serv.recv(1024)
4566 except socket.timeout:
4567 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004568 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004569 ok = True
4570 except:
4571 self.fail("caught unexpected exception (UDP)")
4572 if not ok:
4573 self.fail("recv() returned success when we did not expect it")
4574
4575class TestExceptions(unittest.TestCase):
4576
4577 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004578 self.assertTrue(issubclass(OSError, Exception))
4579 self.assertTrue(issubclass(socket.herror, OSError))
4580 self.assertTrue(issubclass(socket.gaierror, OSError))
4581 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004582
Yury Selivanovfa22b292016-10-18 16:03:52 -04004583 def test_setblocking_invalidfd(self):
4584 # Regression test for issue #28471
4585
4586 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4587 sock = socket.socket(
4588 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4589 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004590 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004591
4592 with self.assertRaises(OSError):
4593 sock.setblocking(False)
4594
4595
Serhiy Storchaka43767632013-11-03 21:31:38 +02004596@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004597class TestLinuxAbstractNamespace(unittest.TestCase):
4598
4599 UNIX_PATH_MAX = 108
4600
4601 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004602 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004603 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4604 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004605 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004606 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4607 s2.connect(s1.getsockname())
4608 with s1.accept()[0] as s3:
4609 self.assertEqual(s1.getsockname(), address)
4610 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004611
4612 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004613 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004614 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4615 s.bind(address)
4616 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004617
4618 def testNameOverflow(self):
4619 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004620 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004621 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004622
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004623 def testStrName(self):
4624 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004625 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4626 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004627 s.bind("\x00python\x00test\x00")
4628 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004629 finally:
4630 s.close()
4631
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004632 def testBytearrayName(self):
4633 # Check that an abstract name can be passed as a bytearray.
4634 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4635 s.bind(bytearray(b"\x00python\x00test\x00"))
4636 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4637
Serhiy Storchaka43767632013-11-03 21:31:38 +02004638@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004639class TestUnixDomain(unittest.TestCase):
4640
4641 def setUp(self):
4642 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4643
4644 def tearDown(self):
4645 self.sock.close()
4646
4647 def encoded(self, path):
4648 # Return the given path encoded in the file system encoding,
4649 # or skip the test if this is not possible.
4650 try:
4651 return os.fsencode(path)
4652 except UnicodeEncodeError:
4653 self.skipTest(
4654 "Pathname {0!a} cannot be represented in file "
4655 "system encoding {1!r}".format(
4656 path, sys.getfilesystemencoding()))
4657
Antoine Pitrou16374872011-12-16 15:04:12 +01004658 def bind(self, sock, path):
4659 # Bind the socket
4660 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004661 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004662 except OSError as e:
4663 if str(e) == "AF_UNIX path too long":
4664 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004665 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004666 .format(path))
4667 else:
4668 raise
4669
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004670 def testStrAddr(self):
4671 # Test binding to and retrieving a normal string pathname.
4672 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004673 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004674 self.addCleanup(support.unlink, path)
4675 self.assertEqual(self.sock.getsockname(), path)
4676
4677 def testBytesAddr(self):
4678 # Test binding to a bytes pathname.
4679 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004680 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004681 self.addCleanup(support.unlink, path)
4682 self.assertEqual(self.sock.getsockname(), path)
4683
4684 def testSurrogateescapeBind(self):
4685 # Test binding to a valid non-ASCII pathname, with the
4686 # non-ASCII bytes supplied using surrogateescape encoding.
4687 path = os.path.abspath(support.TESTFN_UNICODE)
4688 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004689 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004690 self.addCleanup(support.unlink, path)
4691 self.assertEqual(self.sock.getsockname(), path)
4692
4693 def testUnencodableAddr(self):
4694 # Test binding to a pathname that cannot be encoded in the
4695 # file system encoding.
4696 if support.TESTFN_UNENCODABLE is None:
4697 self.skipTest("No unencodable filename available")
4698 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004699 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004700 self.addCleanup(support.unlink, path)
4701 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004702
Victor Stinner45df8202010-04-28 22:31:17 +00004703@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004704class BufferIOTest(SocketConnectedTest):
4705 """
4706 Test the buffer versions of socket.recv() and socket.send().
4707 """
4708 def __init__(self, methodName='runTest'):
4709 SocketConnectedTest.__init__(self, methodName=methodName)
4710
Antoine Pitrou25480782010-03-17 22:50:28 +00004711 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004712 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004713 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004714 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004715 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004716 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004717 self.assertEqual(msg, MSG)
4718
Antoine Pitrou25480782010-03-17 22:50:28 +00004719 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004720 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004721 self.serv_conn.send(buf)
4722
Antoine Pitrou25480782010-03-17 22:50:28 +00004723 def testRecvIntoBytearray(self):
4724 buf = bytearray(1024)
4725 nbytes = self.cli_conn.recv_into(buf)
4726 self.assertEqual(nbytes, len(MSG))
4727 msg = buf[:len(MSG)]
4728 self.assertEqual(msg, MSG)
4729
4730 _testRecvIntoBytearray = _testRecvIntoArray
4731
4732 def testRecvIntoMemoryview(self):
4733 buf = bytearray(1024)
4734 nbytes = self.cli_conn.recv_into(memoryview(buf))
4735 self.assertEqual(nbytes, len(MSG))
4736 msg = buf[:len(MSG)]
4737 self.assertEqual(msg, MSG)
4738
4739 _testRecvIntoMemoryview = _testRecvIntoArray
4740
4741 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004742 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004743 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004744 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004745 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004746 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004747 self.assertEqual(msg, MSG)
4748
Antoine Pitrou25480782010-03-17 22:50:28 +00004749 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004750 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004751 self.serv_conn.send(buf)
4752
Antoine Pitrou25480782010-03-17 22:50:28 +00004753 def testRecvFromIntoBytearray(self):
4754 buf = bytearray(1024)
4755 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4756 self.assertEqual(nbytes, len(MSG))
4757 msg = buf[:len(MSG)]
4758 self.assertEqual(msg, MSG)
4759
4760 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4761
4762 def testRecvFromIntoMemoryview(self):
4763 buf = bytearray(1024)
4764 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4765 self.assertEqual(nbytes, len(MSG))
4766 msg = buf[:len(MSG)]
4767 self.assertEqual(msg, MSG)
4768
4769 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4770
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004771 def testRecvFromIntoSmallBuffer(self):
4772 # See issue #20246.
4773 buf = bytearray(8)
4774 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4775
4776 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004777 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004778
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004779 def testRecvFromIntoEmptyBuffer(self):
4780 buf = bytearray()
4781 self.cli_conn.recvfrom_into(buf)
4782 self.cli_conn.recvfrom_into(buf, 0)
4783
4784 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4785
Christian Heimes043d6f62008-01-07 17:19:16 +00004786
4787TIPC_STYPE = 2000
4788TIPC_LOWER = 200
4789TIPC_UPPER = 210
4790
4791def isTipcAvailable():
4792 """Check if the TIPC module is loaded
4793
4794 The TIPC module is not loaded automatically on Ubuntu and probably
4795 other Linux distros.
4796 """
4797 if not hasattr(socket, "AF_TIPC"):
4798 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004799 try:
4800 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00004801 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00004802 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00004803 # have not the permission to read it.
4804 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004805 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00004806 for line in f:
4807 if line.startswith("tipc "):
4808 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004809 return False
4810
Serhiy Storchaka43767632013-11-03 21:31:38 +02004811@unittest.skipUnless(isTipcAvailable(),
4812 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004813class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004814 def testRDM(self):
4815 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4816 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004817 self.addCleanup(srv.close)
4818 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004819
4820 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4821 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4822 TIPC_LOWER, TIPC_UPPER)
4823 srv.bind(srvaddr)
4824
4825 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4826 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4827 cli.sendto(MSG, sendaddr)
4828
4829 msg, recvaddr = srv.recvfrom(1024)
4830
4831 self.assertEqual(cli.getsockname(), recvaddr)
4832 self.assertEqual(msg, MSG)
4833
4834
Serhiy Storchaka43767632013-11-03 21:31:38 +02004835@unittest.skipUnless(isTipcAvailable(),
4836 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004837class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004838 def __init__(self, methodName = 'runTest'):
4839 unittest.TestCase.__init__(self, methodName = methodName)
4840 ThreadableTest.__init__(self)
4841
4842 def setUp(self):
4843 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004844 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004845 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4846 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4847 TIPC_LOWER, TIPC_UPPER)
4848 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004849 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004850 self.serverExplicitReady()
4851 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004852 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004853
4854 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00004855 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00004856 # accept() call; sleep a little while to avoid it, otherwise
4857 # we could get an exception
4858 time.sleep(0.1)
4859 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004860 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004861 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4862 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4863 self.cli.connect(addr)
4864 self.cliaddr = self.cli.getsockname()
4865
4866 def testStream(self):
4867 msg = self.conn.recv(1024)
4868 self.assertEqual(msg, MSG)
4869 self.assertEqual(self.cliaddr, self.connaddr)
4870
4871 def _testStream(self):
4872 self.cli.send(MSG)
4873 self.cli.close()
4874
4875
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004876@unittest.skipUnless(thread, 'Threading required for this test.')
4877class ContextManagersTest(ThreadedTCPSocketTest):
4878
4879 def _testSocketClass(self):
4880 # base test
4881 with socket.socket() as sock:
4882 self.assertFalse(sock._closed)
4883 self.assertTrue(sock._closed)
4884 # close inside with block
4885 with socket.socket() as sock:
4886 sock.close()
4887 self.assertTrue(sock._closed)
4888 # exception inside with block
4889 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004890 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004891 self.assertTrue(sock._closed)
4892
4893 def testCreateConnectionBase(self):
4894 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004895 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004896 data = conn.recv(1024)
4897 conn.sendall(data)
4898
4899 def _testCreateConnectionBase(self):
4900 address = self.serv.getsockname()
4901 with socket.create_connection(address) as sock:
4902 self.assertFalse(sock._closed)
4903 sock.sendall(b'foo')
4904 self.assertEqual(sock.recv(1024), b'foo')
4905 self.assertTrue(sock._closed)
4906
4907 def testCreateConnectionClose(self):
4908 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004909 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004910 data = conn.recv(1024)
4911 conn.sendall(data)
4912
4913 def _testCreateConnectionClose(self):
4914 address = self.serv.getsockname()
4915 with socket.create_connection(address) as sock:
4916 sock.close()
4917 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004918 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004919
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004920
Victor Stinnerdaf45552013-08-28 00:53:59 +02004921class InheritanceTest(unittest.TestCase):
4922 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4923 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004924 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004925 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004926 with socket.socket(socket.AF_INET,
4927 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4928 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004929 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004930
4931 def test_default_inheritable(self):
4932 sock = socket.socket()
4933 with sock:
4934 self.assertEqual(sock.get_inheritable(), False)
4935
4936 def test_dup(self):
4937 sock = socket.socket()
4938 with sock:
4939 newsock = sock.dup()
4940 sock.close()
4941 with newsock:
4942 self.assertEqual(newsock.get_inheritable(), False)
4943
4944 def test_set_inheritable(self):
4945 sock = socket.socket()
4946 with sock:
4947 sock.set_inheritable(True)
4948 self.assertEqual(sock.get_inheritable(), True)
4949
4950 sock.set_inheritable(False)
4951 self.assertEqual(sock.get_inheritable(), False)
4952
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004953 @unittest.skipIf(fcntl is None, "need fcntl")
4954 def test_get_inheritable_cloexec(self):
4955 sock = socket.socket()
4956 with sock:
4957 fd = sock.fileno()
4958 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004959
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004960 # clear FD_CLOEXEC flag
4961 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4962 flags &= ~fcntl.FD_CLOEXEC
4963 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004964
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004965 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004966
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004967 @unittest.skipIf(fcntl is None, "need fcntl")
4968 def test_set_inheritable_cloexec(self):
4969 sock = socket.socket()
4970 with sock:
4971 fd = sock.fileno()
4972 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4973 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004974
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004975 sock.set_inheritable(True)
4976 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4977 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004978
4979
Victor Stinnerdaf45552013-08-28 00:53:59 +02004980 @unittest.skipUnless(hasattr(socket, "socketpair"),
4981 "need socket.socketpair()")
4982 def test_socketpair(self):
4983 s1, s2 = socket.socketpair()
4984 self.addCleanup(s1.close)
4985 self.addCleanup(s2.close)
4986 self.assertEqual(s1.get_inheritable(), False)
4987 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004988
4989
4990@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4991 "SOCK_NONBLOCK not defined")
4992class NonblockConstantTest(unittest.TestCase):
4993 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4994 if nonblock:
4995 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4996 self.assertEqual(s.gettimeout(), timeout)
4997 else:
4998 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4999 self.assertEqual(s.gettimeout(), None)
5000
Charles-François Natali239bb962011-06-03 12:55:15 +02005001 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005002 def test_SOCK_NONBLOCK(self):
5003 # a lot of it seems silly and redundant, but I wanted to test that
5004 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005005 with socket.socket(socket.AF_INET,
5006 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5007 self.checkNonblock(s)
5008 s.setblocking(1)
5009 self.checkNonblock(s, False)
5010 s.setblocking(0)
5011 self.checkNonblock(s)
5012 s.settimeout(None)
5013 self.checkNonblock(s, False)
5014 s.settimeout(2.0)
5015 self.checkNonblock(s, timeout=2.0)
5016 s.setblocking(1)
5017 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005018 # defaulttimeout
5019 t = socket.getdefaulttimeout()
5020 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005021 with socket.socket() as s:
5022 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005023 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005024 with socket.socket() as s:
5025 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005026 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005027 with socket.socket() as s:
5028 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005029 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005030 with socket.socket() as s:
5031 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005032 socket.setdefaulttimeout(t)
5033
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005034
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005035@unittest.skipUnless(os.name == "nt", "Windows specific")
5036@unittest.skipUnless(multiprocessing, "need multiprocessing")
5037class TestSocketSharing(SocketTCPTest):
5038 # This must be classmethod and not staticmethod or multiprocessing
5039 # won't be able to bootstrap it.
5040 @classmethod
5041 def remoteProcessServer(cls, q):
5042 # Recreate socket from shared data
5043 sdata = q.get()
5044 message = q.get()
5045
5046 s = socket.fromshare(sdata)
5047 s2, c = s.accept()
5048
5049 # Send the message
5050 s2.sendall(message)
5051 s2.close()
5052 s.close()
5053
5054 def testShare(self):
5055 # Transfer the listening server socket to another process
5056 # and service it from there.
5057
5058 # Create process:
5059 q = multiprocessing.Queue()
5060 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5061 p.start()
5062
5063 # Get the shared socket data
5064 data = self.serv.share(p.pid)
5065
5066 # Pass the shared socket to the other process
5067 addr = self.serv.getsockname()
5068 self.serv.close()
5069 q.put(data)
5070
5071 # The data that the server will send us
5072 message = b"slapmahfro"
5073 q.put(message)
5074
5075 # Connect
5076 s = socket.create_connection(addr)
5077 # listen for the data
5078 m = []
5079 while True:
5080 data = s.recv(100)
5081 if not data:
5082 break
5083 m.append(data)
5084 s.close()
5085 received = b"".join(m)
5086 self.assertEqual(received, message)
5087 p.join()
5088
5089 def testShareLength(self):
5090 data = self.serv.share(os.getpid())
5091 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5092 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5093
5094 def compareSockets(self, org, other):
5095 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005096 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005097 self.assertEqual(org.gettimeout(), None)
5098 self.assertEqual(org.gettimeout(), other.gettimeout())
5099
5100 self.assertEqual(org.family, other.family)
5101 self.assertEqual(org.type, other.type)
5102 # If the user specified "0" for proto, then
5103 # internally windows will have picked the correct value.
5104 # Python introspection on the socket however will still return
5105 # 0. For the shared socket, the python value is recreated
5106 # from the actual value, so it may not compare correctly.
5107 if org.proto != 0:
5108 self.assertEqual(org.proto, other.proto)
5109
5110 def testShareLocal(self):
5111 data = self.serv.share(os.getpid())
5112 s = socket.fromshare(data)
5113 try:
5114 self.compareSockets(self.serv, s)
5115 finally:
5116 s.close()
5117
5118 def testTypes(self):
5119 families = [socket.AF_INET, socket.AF_INET6]
5120 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5121 for f in families:
5122 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005123 try:
5124 source = socket.socket(f, t)
5125 except OSError:
5126 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005127 try:
5128 data = source.share(os.getpid())
5129 shared = socket.fromshare(data)
5130 try:
5131 self.compareSockets(source, shared)
5132 finally:
5133 shared.close()
5134 finally:
5135 source.close()
5136
5137
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005138@unittest.skipUnless(thread, 'Threading required for this test.')
5139class SendfileUsingSendTest(ThreadedTCPSocketTest):
5140 """
5141 Test the send() implementation of socket.sendfile().
5142 """
5143
5144 FILESIZE = (10 * 1024 * 1024) # 10MB
5145 BUFSIZE = 8192
5146 FILEDATA = b""
5147 TIMEOUT = 2
5148
5149 @classmethod
5150 def setUpClass(cls):
5151 def chunks(total, step):
5152 assert total >= step
5153 while total > step:
5154 yield step
5155 total -= step
5156 if total:
5157 yield total
5158
5159 chunk = b"".join([random.choice(string.ascii_letters).encode()
5160 for i in range(cls.BUFSIZE)])
5161 with open(support.TESTFN, 'wb') as f:
5162 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5163 f.write(chunk)
5164 with open(support.TESTFN, 'rb') as f:
5165 cls.FILEDATA = f.read()
5166 assert len(cls.FILEDATA) == cls.FILESIZE
5167
5168 @classmethod
5169 def tearDownClass(cls):
5170 support.unlink(support.TESTFN)
5171
5172 def accept_conn(self):
5173 self.serv.settimeout(self.TIMEOUT)
5174 conn, addr = self.serv.accept()
5175 conn.settimeout(self.TIMEOUT)
5176 self.addCleanup(conn.close)
5177 return conn
5178
5179 def recv_data(self, conn):
5180 received = []
5181 while True:
5182 chunk = conn.recv(self.BUFSIZE)
5183 if not chunk:
5184 break
5185 received.append(chunk)
5186 return b''.join(received)
5187
5188 def meth_from_sock(self, sock):
5189 # Depending on the mixin class being run return either send()
5190 # or sendfile() method implementation.
5191 return getattr(sock, "_sendfile_use_send")
5192
5193 # regular file
5194
5195 def _testRegularFile(self):
5196 address = self.serv.getsockname()
5197 file = open(support.TESTFN, 'rb')
5198 with socket.create_connection(address) as sock, file as file:
5199 meth = self.meth_from_sock(sock)
5200 sent = meth(file)
5201 self.assertEqual(sent, self.FILESIZE)
5202 self.assertEqual(file.tell(), self.FILESIZE)
5203
5204 def testRegularFile(self):
5205 conn = self.accept_conn()
5206 data = self.recv_data(conn)
5207 self.assertEqual(len(data), self.FILESIZE)
5208 self.assertEqual(data, self.FILEDATA)
5209
5210 # non regular file
5211
5212 def _testNonRegularFile(self):
5213 address = self.serv.getsockname()
5214 file = io.BytesIO(self.FILEDATA)
5215 with socket.create_connection(address) as sock, file as file:
5216 sent = sock.sendfile(file)
5217 self.assertEqual(sent, self.FILESIZE)
5218 self.assertEqual(file.tell(), self.FILESIZE)
5219 self.assertRaises(socket._GiveupOnSendfile,
5220 sock._sendfile_use_sendfile, file)
5221
5222 def testNonRegularFile(self):
5223 conn = self.accept_conn()
5224 data = self.recv_data(conn)
5225 self.assertEqual(len(data), self.FILESIZE)
5226 self.assertEqual(data, self.FILEDATA)
5227
5228 # empty file
5229
5230 def _testEmptyFileSend(self):
5231 address = self.serv.getsockname()
5232 filename = support.TESTFN + "2"
5233 with open(filename, 'wb'):
5234 self.addCleanup(support.unlink, filename)
5235 file = open(filename, 'rb')
5236 with socket.create_connection(address) as sock, file as file:
5237 meth = self.meth_from_sock(sock)
5238 sent = meth(file)
5239 self.assertEqual(sent, 0)
5240 self.assertEqual(file.tell(), 0)
5241
5242 def testEmptyFileSend(self):
5243 conn = self.accept_conn()
5244 data = self.recv_data(conn)
5245 self.assertEqual(data, b"")
5246
5247 # offset
5248
5249 def _testOffset(self):
5250 address = self.serv.getsockname()
5251 file = open(support.TESTFN, 'rb')
5252 with socket.create_connection(address) as sock, file as file:
5253 meth = self.meth_from_sock(sock)
5254 sent = meth(file, offset=5000)
5255 self.assertEqual(sent, self.FILESIZE - 5000)
5256 self.assertEqual(file.tell(), self.FILESIZE)
5257
5258 def testOffset(self):
5259 conn = self.accept_conn()
5260 data = self.recv_data(conn)
5261 self.assertEqual(len(data), self.FILESIZE - 5000)
5262 self.assertEqual(data, self.FILEDATA[5000:])
5263
5264 # count
5265
5266 def _testCount(self):
5267 address = self.serv.getsockname()
5268 file = open(support.TESTFN, 'rb')
5269 with socket.create_connection(address, timeout=2) as sock, file as file:
5270 count = 5000007
5271 meth = self.meth_from_sock(sock)
5272 sent = meth(file, count=count)
5273 self.assertEqual(sent, count)
5274 self.assertEqual(file.tell(), count)
5275
5276 def testCount(self):
5277 count = 5000007
5278 conn = self.accept_conn()
5279 data = self.recv_data(conn)
5280 self.assertEqual(len(data), count)
5281 self.assertEqual(data, self.FILEDATA[:count])
5282
5283 # count small
5284
5285 def _testCountSmall(self):
5286 address = self.serv.getsockname()
5287 file = open(support.TESTFN, 'rb')
5288 with socket.create_connection(address, timeout=2) as sock, file as file:
5289 count = 1
5290 meth = self.meth_from_sock(sock)
5291 sent = meth(file, count=count)
5292 self.assertEqual(sent, count)
5293 self.assertEqual(file.tell(), count)
5294
5295 def testCountSmall(self):
5296 count = 1
5297 conn = self.accept_conn()
5298 data = self.recv_data(conn)
5299 self.assertEqual(len(data), count)
5300 self.assertEqual(data, self.FILEDATA[:count])
5301
5302 # count + offset
5303
5304 def _testCountWithOffset(self):
5305 address = self.serv.getsockname()
5306 file = open(support.TESTFN, 'rb')
5307 with socket.create_connection(address, timeout=2) as sock, file as file:
5308 count = 100007
5309 meth = self.meth_from_sock(sock)
5310 sent = meth(file, offset=2007, count=count)
5311 self.assertEqual(sent, count)
5312 self.assertEqual(file.tell(), count + 2007)
5313
5314 def testCountWithOffset(self):
5315 count = 100007
5316 conn = self.accept_conn()
5317 data = self.recv_data(conn)
5318 self.assertEqual(len(data), count)
5319 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5320
5321 # non blocking sockets are not supposed to work
5322
5323 def _testNonBlocking(self):
5324 address = self.serv.getsockname()
5325 file = open(support.TESTFN, 'rb')
5326 with socket.create_connection(address) as sock, file as file:
5327 sock.setblocking(False)
5328 meth = self.meth_from_sock(sock)
5329 self.assertRaises(ValueError, meth, file)
5330 self.assertRaises(ValueError, sock.sendfile, file)
5331
5332 def testNonBlocking(self):
5333 conn = self.accept_conn()
5334 if conn.recv(8192):
5335 self.fail('was not supposed to receive any data')
5336
5337 # timeout (non-triggered)
5338
5339 def _testWithTimeout(self):
5340 address = self.serv.getsockname()
5341 file = open(support.TESTFN, 'rb')
5342 with socket.create_connection(address, timeout=2) as sock, file as file:
5343 meth = self.meth_from_sock(sock)
5344 sent = meth(file)
5345 self.assertEqual(sent, self.FILESIZE)
5346
5347 def testWithTimeout(self):
5348 conn = self.accept_conn()
5349 data = self.recv_data(conn)
5350 self.assertEqual(len(data), self.FILESIZE)
5351 self.assertEqual(data, self.FILEDATA)
5352
5353 # timeout (triggered)
5354
5355 def _testWithTimeoutTriggeredSend(self):
5356 address = self.serv.getsockname()
5357 file = open(support.TESTFN, 'rb')
5358 with socket.create_connection(address, timeout=0.01) as sock, \
5359 file as file:
5360 meth = self.meth_from_sock(sock)
5361 self.assertRaises(socket.timeout, meth, file)
5362
5363 def testWithTimeoutTriggeredSend(self):
5364 conn = self.accept_conn()
5365 conn.recv(88192)
5366
5367 # errors
5368
5369 def _test_errors(self):
5370 pass
5371
5372 def test_errors(self):
5373 with open(support.TESTFN, 'rb') as file:
5374 with socket.socket(type=socket.SOCK_DGRAM) as s:
5375 meth = self.meth_from_sock(s)
5376 self.assertRaisesRegex(
5377 ValueError, "SOCK_STREAM", meth, file)
5378 with open(support.TESTFN, 'rt') as file:
5379 with socket.socket() as s:
5380 meth = self.meth_from_sock(s)
5381 self.assertRaisesRegex(
5382 ValueError, "binary mode", meth, file)
5383 with open(support.TESTFN, 'rb') as file:
5384 with socket.socket() as s:
5385 meth = self.meth_from_sock(s)
5386 self.assertRaisesRegex(TypeError, "positive integer",
5387 meth, file, count='2')
5388 self.assertRaisesRegex(TypeError, "positive integer",
5389 meth, file, count=0.1)
5390 self.assertRaisesRegex(ValueError, "positive integer",
5391 meth, file, count=0)
5392 self.assertRaisesRegex(ValueError, "positive integer",
5393 meth, file, count=-1)
5394
5395
5396@unittest.skipUnless(thread, 'Threading required for this test.')
5397@unittest.skipUnless(hasattr(os, "sendfile"),
5398 'os.sendfile() required for this test.')
5399class SendfileUsingSendfileTest(SendfileUsingSendTest):
5400 """
5401 Test the sendfile() implementation of socket.sendfile().
5402 """
5403 def meth_from_sock(self, sock):
5404 return getattr(sock, "_sendfile_use_sendfile")
5405
Christian Heimes48371412016-09-06 00:37:46 +02005406
5407@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005408class LinuxKernelCryptoAPI(unittest.TestCase):
5409 # tests for AF_ALG
5410 def create_alg(self, typ, name):
5411 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005412 try:
5413 sock.bind((typ, name))
5414 except FileNotFoundError as e:
5415 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005416 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005417 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005418 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005419 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005420
5421 def test_sha256(self):
5422 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5423 "177a9cb410ff61f20015ad")
5424 with self.create_alg('hash', 'sha256') as algo:
5425 op, _ = algo.accept()
5426 with op:
5427 op.sendall(b"abc")
5428 self.assertEqual(op.recv(512), expected)
5429
5430 op, _ = algo.accept()
5431 with op:
5432 op.send(b'a', socket.MSG_MORE)
5433 op.send(b'b', socket.MSG_MORE)
5434 op.send(b'c', socket.MSG_MORE)
5435 op.send(b'')
5436 self.assertEqual(op.recv(512), expected)
5437
5438 def test_hmac_sha1(self):
5439 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5440 with self.create_alg('hash', 'hmac(sha1)') as algo:
5441 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5442 op, _ = algo.accept()
5443 with op:
5444 op.sendall(b"what do ya want for nothing?")
5445 self.assertEqual(op.recv(512), expected)
5446
Christian Heimese084f842016-09-11 20:11:30 +02005447 # Although it should work with 3.19 and newer the test blocks on
5448 # Ubuntu 15.10 with Kernel 4.2.0-19.
5449 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005450 def test_aes_cbc(self):
5451 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5452 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5453 msg = b"Single block msg"
5454 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5455 msglen = len(msg)
5456 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5457 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5458 op, _ = algo.accept()
5459 with op:
5460 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5461 flags=socket.MSG_MORE)
5462 op.sendall(msg)
5463 self.assertEqual(op.recv(msglen), ciphertext)
5464
5465 op, _ = algo.accept()
5466 with op:
5467 op.sendmsg_afalg([ciphertext],
5468 op=socket.ALG_OP_DECRYPT, iv=iv)
5469 self.assertEqual(op.recv(msglen), msg)
5470
5471 # long message
5472 multiplier = 1024
5473 longmsg = [msg] * multiplier
5474 op, _ = algo.accept()
5475 with op:
5476 op.sendmsg_afalg(longmsg,
5477 op=socket.ALG_OP_ENCRYPT, iv=iv)
5478 enc = op.recv(msglen * multiplier)
5479 self.assertEqual(len(enc), msglen * multiplier)
5480 self.assertTrue(enc[:msglen], ciphertext)
5481
5482 op, _ = algo.accept()
5483 with op:
5484 op.sendmsg_afalg([enc],
5485 op=socket.ALG_OP_DECRYPT, iv=iv)
5486 dec = op.recv(msglen * multiplier)
5487 self.assertEqual(len(dec), msglen * multiplier)
5488 self.assertEqual(dec, msg * multiplier)
5489
Christian Heimese084f842016-09-11 20:11:30 +02005490 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005491 def test_aead_aes_gcm(self):
5492 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5493 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5494 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5495 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5496 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5497 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5498
5499 taglen = len(expected_tag)
5500 assoclen = len(assoc)
5501
5502 with self.create_alg('aead', 'gcm(aes)') as algo:
5503 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5504 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5505 None, taglen)
5506
5507 # send assoc, plain and tag buffer in separate steps
5508 op, _ = algo.accept()
5509 with op:
5510 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5511 assoclen=assoclen, flags=socket.MSG_MORE)
5512 op.sendall(assoc, socket.MSG_MORE)
5513 op.sendall(plain, socket.MSG_MORE)
5514 op.sendall(b'\x00' * taglen)
5515 res = op.recv(assoclen + len(plain) + taglen)
5516 self.assertEqual(expected_ct, res[assoclen:-taglen])
5517 self.assertEqual(expected_tag, res[-taglen:])
5518
5519 # now with msg
5520 op, _ = algo.accept()
5521 with op:
5522 msg = assoc + plain + b'\x00' * taglen
5523 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5524 assoclen=assoclen)
5525 res = op.recv(assoclen + len(plain) + taglen)
5526 self.assertEqual(expected_ct, res[assoclen:-taglen])
5527 self.assertEqual(expected_tag, res[-taglen:])
5528
5529 # create anc data manually
5530 pack_uint32 = struct.Struct('I').pack
5531 op, _ = algo.accept()
5532 with op:
5533 msg = assoc + plain + b'\x00' * taglen
5534 op.sendmsg(
5535 [msg],
5536 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5537 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5538 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5539 )
5540 )
5541 res = op.recv(len(msg))
5542 self.assertEqual(expected_ct, res[assoclen:-taglen])
5543 self.assertEqual(expected_tag, res[-taglen:])
5544
5545 # decrypt and verify
5546 op, _ = algo.accept()
5547 with op:
5548 msg = assoc + expected_ct + expected_tag
5549 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5550 assoclen=assoclen)
5551 res = op.recv(len(msg))
5552 self.assertEqual(plain, res[assoclen:-taglen])
5553
Christian Heimese084f842016-09-11 20:11:30 +02005554 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005555 def test_drbg_pr_sha256(self):
5556 # deterministic random bit generator, prediction resistance, sha256
5557 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5558 extra_seed = os.urandom(32)
5559 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5560 op, _ = algo.accept()
5561 with op:
5562 rn = op.recv(32)
5563 self.assertEqual(len(rn), 32)
5564
5565 def test_sendmsg_afalg_args(self):
5566 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005567 with sock:
5568 with self.assertRaises(TypeError):
5569 sock.sendmsg_afalg()
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=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005573
Christian Heimes02b30352016-09-11 19:49:56 +02005574 with self.assertRaises(TypeError):
5575 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005576
Christian Heimes02b30352016-09-11 19:49:56 +02005577 with self.assertRaises(TypeError):
5578 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005579
Christian Heimes02b30352016-09-11 19:49:56 +02005580 with self.assertRaises(TypeError):
5581 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5582
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005583
Guido van Rossumb995eb72002-07-31 16:08:40 +00005584def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005585 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005586 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005587
5588 tests.extend([
5589 NonBlockingTCPTests,
5590 FileObjectClassTestCase,
5591 UnbufferedFileObjectClassTestCase,
5592 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005593 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005594 UnicodeReadFileObjectClassTestCase,
5595 UnicodeWriteFileObjectClassTestCase,
5596 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005597 NetworkConnectionNoServer,
5598 NetworkConnectionAttributesTest,
5599 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005600 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005601 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005602 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005603 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005604 tests.append(BasicSocketPairTest)
5605 tests.append(TestUnixDomain)
5606 tests.append(TestLinuxAbstractNamespace)
5607 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005608 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005609 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005610 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005611 tests.extend([
5612 CmsgMacroTests,
5613 SendmsgUDPTest,
5614 RecvmsgUDPTest,
5615 RecvmsgIntoUDPTest,
5616 SendmsgUDP6Test,
5617 RecvmsgUDP6Test,
5618 RecvmsgRFC3542AncillaryUDP6Test,
5619 RecvmsgIntoRFC3542AncillaryUDP6Test,
5620 RecvmsgIntoUDP6Test,
5621 SendmsgTCPTest,
5622 RecvmsgTCPTest,
5623 RecvmsgIntoTCPTest,
5624 SendmsgSCTPStreamTest,
5625 RecvmsgSCTPStreamTest,
5626 RecvmsgIntoSCTPStreamTest,
5627 SendmsgUnixStreamTest,
5628 RecvmsgUnixStreamTest,
5629 RecvmsgIntoUnixStreamTest,
5630 RecvmsgSCMRightsStreamTest,
5631 RecvmsgIntoSCMRightsStreamTest,
5632 # These are slow when setitimer() is not available
5633 InterruptedRecvTimeoutTest,
5634 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005635 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005636 SendfileUsingSendTest,
5637 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005638 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005639
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005640 thread_info = support.threading_setup()
5641 support.run_unittest(*tests)
5642 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005643
5644if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005645 test_main()