blob: 7cc2e57b0ddf74906fe49f78895a85d5bd2bb9f7 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003
Christian Heimes5e696852008-04-09 08:37:03 +00004import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005import io
Charles-François Natali65708cf2014-07-25 18:44:30 +01006import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +00007import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +10009import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000016import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000017from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000018import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000019import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010020import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020021import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020022import random
23import string
Antoine Pitroub1c54962010-10-14 15:05:38 +000024try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000025 import multiprocessing
26except ImportError:
27 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020028try:
29 import fcntl
30except ImportError:
31 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000032
Benjamin Petersonee8712c2008-05-20 21:35:26 +000033HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000034MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000035
Victor Stinner45df8202010-04-28 22:31:17 +000036try:
37 import _thread as thread
38 import threading
39except ImportError:
40 thread = None
41 threading = None
Victor Stinnere254e532014-07-26 14:36:55 +020042try:
43 import _socket
44except ImportError:
45 _socket = None
46
Victor Stinner45df8202010-04-28 22:31:17 +000047
Charles-François Natali47413c12011-10-06 19:47:44 +020048def _have_socket_can():
49 """Check whether CAN sockets are supported on this host."""
50 try:
51 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020052 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020053 return False
54 else:
55 s.close()
56 return True
57
Charles-François Natali10b8cf42011-11-10 19:21:37 +010058def _have_socket_rds():
59 """Check whether RDS sockets are supported on this host."""
60 try:
61 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
62 except (AttributeError, OSError):
63 return False
64 else:
65 s.close()
66 return True
67
Christian Heimes48371412016-09-06 00:37:46 +020068def _have_socket_alg():
69 """Check whether AF_ALG sockets are supported on this host."""
70 try:
71 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
72 except (AttributeError, OSError):
73 return False
74 else:
75 s.close()
76 return True
77
Charles-François Natali47413c12011-10-06 19:47:44 +020078HAVE_SOCKET_CAN = _have_socket_can()
79
Charles-François Natali10b8cf42011-11-10 19:21:37 +010080HAVE_SOCKET_RDS = _have_socket_rds()
81
Christian Heimes48371412016-09-06 00:37:46 +020082HAVE_SOCKET_ALG = _have_socket_alg()
83
Nick Coghlan96fe56a2011-08-22 11:55:57 +100084# Size in bytes of the int type
85SIZEOF_INT = array.array("i").itemsize
86
Guido van Rossum24e4af82002-06-12 19:18:08 +000087class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000088
Guido van Rossum24e4af82002-06-12 19:18:08 +000089 def setUp(self):
90 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000091 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +010092 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +000093
Guido van Rossum24e4af82002-06-12 19:18:08 +000094 def tearDown(self):
95 self.serv.close()
96 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000097
Guido van Rossum24e4af82002-06-12 19:18:08 +000098class SocketUDPTest(unittest.TestCase):
99
100 def setUp(self):
101 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000102 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000103
104 def tearDown(self):
105 self.serv.close()
106 self.serv = None
107
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000108class ThreadSafeCleanupTestCase(unittest.TestCase):
109 """Subclass of unittest.TestCase with thread-safe cleanup methods.
110
111 This subclass protects the addCleanup() and doCleanups() methods
112 with a recursive lock.
113 """
114
115 if threading:
116 def __init__(self, *args, **kwargs):
117 super().__init__(*args, **kwargs)
118 self._cleanup_lock = threading.RLock()
119
120 def addCleanup(self, *args, **kwargs):
121 with self._cleanup_lock:
122 return super().addCleanup(*args, **kwargs)
123
124 def doCleanups(self, *args, **kwargs):
125 with self._cleanup_lock:
126 return super().doCleanups(*args, **kwargs)
127
Charles-François Natali47413c12011-10-06 19:47:44 +0200128class SocketCANTest(unittest.TestCase):
129
130 """To be able to run this test, a `vcan0` CAN interface can be created with
131 the following commands:
132 # modprobe vcan
133 # ip link add dev vcan0 type vcan
134 # ifconfig vcan0 up
135 """
136 interface = 'vcan0'
137 bufsize = 128
138
Charles-François Natali773e42d2013-02-05 19:42:01 +0100139 """The CAN frame structure is defined in <linux/can.h>:
140
141 struct can_frame {
142 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
143 __u8 can_dlc; /* data length code: 0 .. 8 */
144 __u8 data[8] __attribute__((aligned(8)));
145 };
146 """
147 can_frame_fmt = "=IB3x8s"
148 can_frame_size = struct.calcsize(can_frame_fmt)
149
150 """The Broadcast Management Command frame structure is defined
151 in <linux/can/bcm.h>:
152
153 struct bcm_msg_head {
154 __u32 opcode;
155 __u32 flags;
156 __u32 count;
157 struct timeval ival1, ival2;
158 canid_t can_id;
159 __u32 nframes;
160 struct can_frame frames[0];
161 }
162
163 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
164 `struct can_frame` definition). Must use native not standard types for packing.
165 """
166 bcm_cmd_msg_fmt = "@3I4l2I"
167 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
168
Charles-François Natali47413c12011-10-06 19:47:44 +0200169 def setUp(self):
170 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200171 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200172 try:
173 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200174 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200175 self.skipTest('network interface `%s` does not exist' %
176 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200177
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100178
179class SocketRDSTest(unittest.TestCase):
180
181 """To be able to run this test, the `rds` kernel module must be loaded:
182 # modprobe rds
183 """
184 bufsize = 8192
185
186 def setUp(self):
187 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
188 self.addCleanup(self.serv.close)
189 try:
190 self.port = support.bind_port(self.serv)
191 except OSError:
192 self.skipTest('unable to bind RDS socket')
193
194
Guido van Rossum24e4af82002-06-12 19:18:08 +0000195class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000196 """Threadable Test class
197
198 The ThreadableTest class makes it easy to create a threaded
199 client/server pair from an existing unit test. To create a
200 new threaded class from an existing unit test, use multiple
201 inheritance:
202
203 class NewClass (OldClass, ThreadableTest):
204 pass
205
206 This class defines two new fixture functions with obvious
207 purposes for overriding:
208
209 clientSetUp ()
210 clientTearDown ()
211
212 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000213 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000214 '_' to indicate the client portion of the test. Ex:
215
216 def testFoo(self):
217 # Server portion
218
219 def _testFoo(self):
220 # Client portion
221
222 Any exceptions raised by the clients during their tests
223 are caught and transferred to the main thread to alert
224 the testing framework.
225
226 Note, the server setup function cannot call any blocking
227 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000228 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000229 the blocking call (such as in setting up a client/server
230 connection and performing the accept() in setUp().
231 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000232
233 def __init__(self):
234 # Swap the true setup function
235 self.__setUp = self.setUp
236 self.__tearDown = self.tearDown
237 self.setUp = self._setUp
238 self.tearDown = self._tearDown
239
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000240 def serverExplicitReady(self):
241 """This method allows the server to explicitly indicate that
242 it wants the client thread to proceed. This is useful if the
243 server is about to execute a blocking routine that is
244 dependent upon the client thread during its setup routine."""
245 self.server_ready.set()
246
Guido van Rossum24e4af82002-06-12 19:18:08 +0000247 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000248 self.server_ready = threading.Event()
249 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000251 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200252 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000253
254 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000255 methodname = self.id()
256 i = methodname.rfind('.')
257 methodname = methodname[i+1:]
258 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000259 self.client_thread = thread.start_new_thread(
260 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000261
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200262 try:
263 self.__setUp()
264 except:
265 self.server_crashed = True
266 raise
267 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000268 self.server_ready.set()
269 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000270
271 def _tearDown(self):
272 self.__tearDown()
273 self.done.wait()
274
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000275 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000276 exc = self.queue.get()
277 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000278
279 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000280 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100281 try:
282 self.clientSetUp()
283 except BaseException as e:
284 self.queue.put(e)
285 self.clientTearDown()
286 return
287 finally:
288 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200289 if self.server_crashed:
290 self.clientTearDown()
291 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000292 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000293 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000294 try:
295 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000296 except BaseException as e:
297 self.queue.put(e)
298 finally:
299 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000300
301 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000302 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000303
304 def clientTearDown(self):
305 self.done.set()
306 thread.exit()
307
308class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
309
310 def __init__(self, methodName='runTest'):
311 SocketTCPTest.__init__(self, methodName=methodName)
312 ThreadableTest.__init__(self)
313
314 def clientSetUp(self):
315 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
316
317 def clientTearDown(self):
318 self.cli.close()
319 self.cli = None
320 ThreadableTest.clientTearDown(self)
321
322class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
323
324 def __init__(self, methodName='runTest'):
325 SocketUDPTest.__init__(self, methodName=methodName)
326 ThreadableTest.__init__(self)
327
328 def clientSetUp(self):
329 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
330
Brian Curtin3beb38f2010-11-04 03:41:43 +0000331 def clientTearDown(self):
332 self.cli.close()
333 self.cli = None
334 ThreadableTest.clientTearDown(self)
335
Charles-François Natali47413c12011-10-06 19:47:44 +0200336class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
337
338 def __init__(self, methodName='runTest'):
339 SocketCANTest.__init__(self, methodName=methodName)
340 ThreadableTest.__init__(self)
341
342 def clientSetUp(self):
343 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
344 try:
345 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200346 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200347 # skipTest should not be called here, and will be called in the
348 # server instead
349 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200350
351 def clientTearDown(self):
352 self.cli.close()
353 self.cli = None
354 ThreadableTest.clientTearDown(self)
355
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100356class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
357
358 def __init__(self, methodName='runTest'):
359 SocketRDSTest.__init__(self, methodName=methodName)
360 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100361
362 def clientSetUp(self):
363 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
364 try:
365 # RDS sockets must be bound explicitly to send or receive data
366 self.cli.bind((HOST, 0))
367 self.cli_addr = self.cli.getsockname()
368 except OSError:
369 # skipTest should not be called here, and will be called in the
370 # server instead
371 pass
372
373 def clientTearDown(self):
374 self.cli.close()
375 self.cli = None
376 ThreadableTest.clientTearDown(self)
377
Guido van Rossum24e4af82002-06-12 19:18:08 +0000378class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000379 """Socket tests for client-server connection.
380
381 self.cli_conn is a client socket connected to the server. The
382 setUp() method guarantees that it is connected to the server.
383 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000384
385 def __init__(self, methodName='runTest'):
386 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
387
388 def setUp(self):
389 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000390 # Indicate explicitly we're ready for the client thread to
391 # proceed and then perform the blocking call to accept
392 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000393 conn, addr = self.serv.accept()
394 self.cli_conn = conn
395
396 def tearDown(self):
397 self.cli_conn.close()
398 self.cli_conn = None
399 ThreadedTCPSocketTest.tearDown(self)
400
401 def clientSetUp(self):
402 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000403 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000404 self.serv_conn = self.cli
405
406 def clientTearDown(self):
407 self.serv_conn.close()
408 self.serv_conn = None
409 ThreadedTCPSocketTest.clientTearDown(self)
410
Dave Cole331708b2004-08-09 04:51:41 +0000411class SocketPairTest(unittest.TestCase, ThreadableTest):
412
413 def __init__(self, methodName='runTest'):
414 unittest.TestCase.__init__(self, methodName=methodName)
415 ThreadableTest.__init__(self)
416
417 def setUp(self):
418 self.serv, self.cli = socket.socketpair()
419
420 def tearDown(self):
421 self.serv.close()
422 self.serv = None
423
424 def clientSetUp(self):
425 pass
426
427 def clientTearDown(self):
428 self.cli.close()
429 self.cli = None
430 ThreadableTest.clientTearDown(self)
431
Tim Peters494aaee2004-08-09 18:54:11 +0000432
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000433# The following classes are used by the sendmsg()/recvmsg() tests.
434# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
435# gives a drop-in replacement for SocketConnectedTest, but different
436# address families can be used, and the attributes serv_addr and
437# cli_addr will be set to the addresses of the endpoints.
438
439class SocketTestBase(unittest.TestCase):
440 """A base class for socket tests.
441
442 Subclasses must provide methods newSocket() to return a new socket
443 and bindSock(sock) to bind it to an unused address.
444
445 Creates a socket self.serv and sets self.serv_addr to its address.
446 """
447
448 def setUp(self):
449 self.serv = self.newSocket()
450 self.bindServer()
451
452 def bindServer(self):
453 """Bind server socket and set self.serv_addr to its address."""
454 self.bindSock(self.serv)
455 self.serv_addr = self.serv.getsockname()
456
457 def tearDown(self):
458 self.serv.close()
459 self.serv = None
460
461
462class SocketListeningTestMixin(SocketTestBase):
463 """Mixin to listen on the server socket."""
464
465 def setUp(self):
466 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100467 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000468
469
470class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
471 ThreadableTest):
472 """Mixin to add client socket and allow client/server tests.
473
474 Client socket is self.cli and its address is self.cli_addr. See
475 ThreadableTest for usage information.
476 """
477
478 def __init__(self, *args, **kwargs):
479 super().__init__(*args, **kwargs)
480 ThreadableTest.__init__(self)
481
482 def clientSetUp(self):
483 self.cli = self.newClientSocket()
484 self.bindClient()
485
486 def newClientSocket(self):
487 """Return a new socket for use as client."""
488 return self.newSocket()
489
490 def bindClient(self):
491 """Bind client socket and set self.cli_addr to its address."""
492 self.bindSock(self.cli)
493 self.cli_addr = self.cli.getsockname()
494
495 def clientTearDown(self):
496 self.cli.close()
497 self.cli = None
498 ThreadableTest.clientTearDown(self)
499
500
501class ConnectedStreamTestMixin(SocketListeningTestMixin,
502 ThreadedSocketTestMixin):
503 """Mixin to allow client/server stream tests with connected client.
504
505 Server's socket representing connection to client is self.cli_conn
506 and client's connection to server is self.serv_conn. (Based on
507 SocketConnectedTest.)
508 """
509
510 def setUp(self):
511 super().setUp()
512 # Indicate explicitly we're ready for the client thread to
513 # proceed and then perform the blocking call to accept
514 self.serverExplicitReady()
515 conn, addr = self.serv.accept()
516 self.cli_conn = conn
517
518 def tearDown(self):
519 self.cli_conn.close()
520 self.cli_conn = None
521 super().tearDown()
522
523 def clientSetUp(self):
524 super().clientSetUp()
525 self.cli.connect(self.serv_addr)
526 self.serv_conn = self.cli
527
528 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100529 try:
530 self.serv_conn.close()
531 self.serv_conn = None
532 except AttributeError:
533 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000534 super().clientTearDown()
535
536
537class UnixSocketTestBase(SocketTestBase):
538 """Base class for Unix-domain socket tests."""
539
540 # This class is used for file descriptor passing tests, so we
541 # create the sockets in a private directory so that other users
542 # can't send anything that might be problematic for a privileged
543 # user running the tests.
544
545 def setUp(self):
546 self.dir_path = tempfile.mkdtemp()
547 self.addCleanup(os.rmdir, self.dir_path)
548 super().setUp()
549
550 def bindSock(self, sock):
551 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100552 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000553 self.addCleanup(support.unlink, path)
554
555class UnixStreamBase(UnixSocketTestBase):
556 """Base class for Unix-domain SOCK_STREAM tests."""
557
558 def newSocket(self):
559 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
560
561
562class InetTestBase(SocketTestBase):
563 """Base class for IPv4 socket tests."""
564
565 host = HOST
566
567 def setUp(self):
568 super().setUp()
569 self.port = self.serv_addr[1]
570
571 def bindSock(self, sock):
572 support.bind_port(sock, host=self.host)
573
574class TCPTestBase(InetTestBase):
575 """Base class for TCP-over-IPv4 tests."""
576
577 def newSocket(self):
578 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
579
580class UDPTestBase(InetTestBase):
581 """Base class for UDP-over-IPv4 tests."""
582
583 def newSocket(self):
584 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
585
586class SCTPStreamBase(InetTestBase):
587 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
588
589 def newSocket(self):
590 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
591 socket.IPPROTO_SCTP)
592
593
594class Inet6TestBase(InetTestBase):
595 """Base class for IPv6 socket tests."""
596
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200597 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000598
599class UDP6TestBase(Inet6TestBase):
600 """Base class for UDP-over-IPv6 tests."""
601
602 def newSocket(self):
603 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
604
605
606# Test-skipping decorators for use with ThreadableTest.
607
608def skipWithClientIf(condition, reason):
609 """Skip decorated test if condition is true, add client_skip decorator.
610
611 If the decorated object is not a class, sets its attribute
612 "client_skip" to a decorator which will return an empty function
613 if the test is to be skipped, or the original function if it is
614 not. This can be used to avoid running the client part of a
615 skipped test when using ThreadableTest.
616 """
617 def client_pass(*args, **kwargs):
618 pass
619 def skipdec(obj):
620 retval = unittest.skip(reason)(obj)
621 if not isinstance(obj, type):
622 retval.client_skip = lambda f: client_pass
623 return retval
624 def noskipdec(obj):
625 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
626 obj.client_skip = lambda f: f
627 return obj
628 return skipdec if condition else noskipdec
629
630
631def requireAttrs(obj, *attributes):
632 """Skip decorated test if obj is missing any of the given attributes.
633
634 Sets client_skip attribute as skipWithClientIf() does.
635 """
636 missing = [name for name in attributes if not hasattr(obj, name)]
637 return skipWithClientIf(
638 missing, "don't have " + ", ".join(name for name in missing))
639
640
641def requireSocket(*args):
642 """Skip decorated test if a socket cannot be created with given arguments.
643
644 When an argument is given as a string, will use the value of that
645 attribute of the socket module, or skip the test if it doesn't
646 exist. Sets client_skip attribute as skipWithClientIf() does.
647 """
648 err = None
649 missing = [obj for obj in args if
650 isinstance(obj, str) and not hasattr(socket, obj)]
651 if missing:
652 err = "don't have " + ", ".join(name for name in missing)
653 else:
654 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
655 for obj in args]
656 try:
657 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200658 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000659 # XXX: check errno?
660 err = str(e)
661 else:
662 s.close()
663 return skipWithClientIf(
664 err is not None,
665 "can't create socket({0}): {1}".format(
666 ", ".join(str(o) for o in args), err))
667
668
Guido van Rossum24e4af82002-06-12 19:18:08 +0000669#######################################################################
670## Begin Tests
671
672class GeneralModuleTests(unittest.TestCase):
673
Ethan Furman7184bac2014-10-14 18:56:53 -0700674 def test_SocketType_is_socketobject(self):
675 import _socket
676 self.assertTrue(socket.SocketType is _socket.socket)
677 s = socket.socket()
678 self.assertIsInstance(s, socket.SocketType)
679 s.close()
680
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000681 def test_repr(self):
682 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200683 with s:
684 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000685 self.assertIn('family=%s' % socket.AF_INET, repr(s))
686 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200687 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200688 self.assertNotIn('raddr', repr(s))
689 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200690 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200691 self.assertIn(str(s.getsockname()), repr(s))
692 self.assertIn('[closed]', repr(s))
693 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000694
Victor Stinnere254e532014-07-26 14:36:55 +0200695 @unittest.skipUnless(_socket is not None, 'need _socket module')
696 def test_csocket_repr(self):
697 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
698 try:
699 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
700 % (s.fileno(), s.family, s.type, s.proto))
701 self.assertEqual(repr(s), expected)
702 finally:
703 s.close()
704 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
705 % (s.family, s.type, s.proto))
706 self.assertEqual(repr(s), expected)
707
Raymond Hettinger027bb632004-05-31 03:09:25 +0000708 def test_weakref(self):
709 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
710 p = proxy(s)
711 self.assertEqual(p.fileno(), s.fileno())
712 s.close()
713 s = None
714 try:
715 p.fileno()
716 except ReferenceError:
717 pass
718 else:
719 self.fail('Socket proxy still exists')
720
Guido van Rossum24e4af82002-06-12 19:18:08 +0000721 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000722 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300723 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200724 with self.assertRaises(OSError, msg=msg % 'OSError'):
725 raise OSError
726 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000727 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200728 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000729 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000730
Ezio Melotti63e42302011-05-07 19:47:48 +0300731 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000732 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300733 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
734 self.addCleanup(s.close)
735 s.bind(('', 0))
736 sockname = s.getsockname()
737 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300738 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300739 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300740 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400741 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300742 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300743 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300744 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400745 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300746 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300747 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300748 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300749 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300750 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300751 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300752 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400753 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300754 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300755 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300756 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400757 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300758 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300759 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300760 self.assertIn('not NoneType', str(cm.exception))
761 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300762 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300763 self.assertIn('an integer is required', str(cm.exception))
764 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300765 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300766 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300767 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300768 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300769 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300770 self.assertIn('(1 given)', str(cm.exception))
771 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300772 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300773 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300774
Guido van Rossum24e4af82002-06-12 19:18:08 +0000775 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000776 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000777 socket.AF_INET
778 socket.SOCK_STREAM
779 socket.SOCK_DGRAM
780 socket.SOCK_RAW
781 socket.SOCK_RDM
782 socket.SOCK_SEQPACKET
783 socket.SOL_SOCKET
784 socket.SO_REUSEADDR
785
Guido van Rossum654c11e2002-06-13 20:24:17 +0000786 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000787 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000788 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000789 try:
790 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200791 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000792 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600793 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000794 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000795 try:
796 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200797 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000798 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600799 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000800 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000801 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000802 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000803 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000804
Charles-François Natali0cc86852013-09-13 19:53:08 +0200805 def test_host_resolution(self):
Charles-François Natali0cc86852013-09-13 19:53:08 +0200806 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
807 self.assertEqual(socket.gethostbyname(addr), addr)
808
809 # we don't test support.HOSTv6 because there's a chance it doesn't have
810 # a matching name entry (e.g. 'ip6-localhost')
811 for host in [support.HOST]:
812 self.assertIn(host, socket.gethostbyaddr(host)[2])
813
Xiang Zhangd36a7162017-03-07 11:06:09 +0800814 def test_host_resolution_bad_address(self):
815 # These are all malformed IP addresses and expected not to resolve to
816 # any result. But some ISPs, e.g. AWS, may successfully resolve these
817 # IPs.
818 explanation = (
819 "resolving an invalid IP address did not raise OSError; "
820 "can be caused by a broken DNS server"
821 )
822 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
823 '1:1:1:1:1:1:1:1:1']:
824 with self.assertRaises(OSError):
825 socket.gethostbyname(addr)
826 with self.assertRaises(OSError, msg=explanation):
827 socket.gethostbyaddr(addr)
828
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000829 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
830 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
831 def test_sethostname(self):
832 oldhn = socket.gethostname()
833 try:
834 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200835 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000836 if e.errno == errno.EPERM:
837 self.skipTest("test should be run as root")
838 else:
839 raise
840 try:
841 # running test as root!
842 self.assertEqual(socket.gethostname(), 'new')
843 # Should work with bytes objects too
844 socket.sethostname(b'bar')
845 self.assertEqual(socket.gethostname(), 'bar')
846 finally:
847 socket.sethostname(oldhn)
848
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700849 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
850 'socket.if_nameindex() not available.')
851 def testInterfaceNameIndex(self):
852 interfaces = socket.if_nameindex()
853 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200854 self.assertIsInstance(index, int)
855 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700856 # interface indices are non-zero integers
857 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200858 _index = socket.if_nametoindex(name)
859 self.assertIsInstance(_index, int)
860 self.assertEqual(index, _index)
861 _name = socket.if_indextoname(index)
862 self.assertIsInstance(_name, str)
863 self.assertEqual(name, _name)
864
865 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
866 'socket.if_nameindex() not available.')
867 def testInvalidInterfaceNameIndex(self):
868 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200869 self.assertRaises(OSError, socket.if_indextoname, 0)
870 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200871 # test with invalid values
872 self.assertRaises(TypeError, socket.if_nametoindex, 0)
873 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700874
Serhiy Storchaka43767632013-11-03 21:31:38 +0200875 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
876 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000877 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000878 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200879 try:
880 # On some versions, this loses a reference
881 orig = sys.getrefcount(__name__)
882 socket.getnameinfo(__name__,0)
883 except TypeError:
884 if sys.getrefcount(__name__) != orig:
885 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000886
Guido van Rossum24e4af82002-06-12 19:18:08 +0000887 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000888 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000889 try:
890 # On some versions, this crashes the interpreter.
891 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200892 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000893 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000894
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000895 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000896 # This just checks that htons etc. are their own inverse,
897 # when looking at the lower 16 or 32 bits.
898 sizes = {socket.htonl: 32, socket.ntohl: 32,
899 socket.htons: 16, socket.ntohs: 16}
900 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000901 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000902 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
903 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000904
Guido van Rossuma2627af2002-09-14 00:58:46 +0000905 swapped = func(mask)
906 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000907 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000908
Serhiy Storchaka24c738a2017-03-19 20:20:10 +0200909 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +0000910 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300911 import _testcapi
912 s_good_values = [0, 1, 2, 0xffff]
913 l_good_values = s_good_values + [0xffffffff]
914 l_bad_values = [-1, -2, 1<<32, 1<<1000]
915 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
916 _testcapi.INT_MAX + 1]
917 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
918 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000919 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000920 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300921 for k in l_good_values:
922 socket.ntohl(k)
923 socket.htonl(k)
924 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000925 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000926 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300927 for k in l_bad_values:
928 self.assertRaises(OverflowError, socket.ntohl, k)
929 self.assertRaises(OverflowError, socket.htonl, k)
930 for k in s_deprecated_values:
931 self.assertWarns(DeprecationWarning, socket.ntohs, k)
932 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000933
Barry Warsaw11b91a02004-06-28 00:50:43 +0000934 def testGetServBy(self):
935 eq = self.assertEqual
936 # Find one service that exists, then check all the related interfaces.
937 # I've ordered this by protocols that have both a tcp and udp
938 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200939 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200940 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000941 # avoid the 'echo' service on this platform, as there is an
942 # assumption breaking non-standard port/protocol entry
943 services = ('daytime', 'qotd', 'domain')
944 else:
945 services = ('echo', 'daytime', 'domain')
946 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000947 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000948 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000949 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200950 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000951 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000952 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200953 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000954 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +0100955 # Issue #26936: Android getservbyname() was broken before API 23.
956 if (not hasattr(sys, 'getandroidapilevel') or
957 sys.getandroidapilevel() >= 23):
958 port2 = socket.getservbyname(service)
959 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400960 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000961 try:
962 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200963 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000964 udpport = None
965 else:
966 eq(udpport, port)
967 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +0100968 # Issue #26936: Android getservbyport() is broken.
969 if not support.is_android:
970 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +0000971 eq(socket.getservbyport(port, 'tcp'), service)
972 if udpport is not None:
973 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000974 # Make sure getservbyport does not accept out of range ports.
975 self.assertRaises(OverflowError, socket.getservbyport, -1)
976 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000977
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000978 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000979 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000980 # The default timeout should initially be None
981 self.assertEqual(socket.getdefaulttimeout(), None)
982 s = socket.socket()
983 self.assertEqual(s.gettimeout(), None)
984 s.close()
985
986 # Set the default timeout to 10, and see if it propagates
987 socket.setdefaulttimeout(10)
988 self.assertEqual(socket.getdefaulttimeout(), 10)
989 s = socket.socket()
990 self.assertEqual(s.gettimeout(), 10)
991 s.close()
992
993 # Reset the default timeout to None, and see if it propagates
994 socket.setdefaulttimeout(None)
995 self.assertEqual(socket.getdefaulttimeout(), None)
996 s = socket.socket()
997 self.assertEqual(s.gettimeout(), None)
998 s.close()
999
1000 # Check that setting it to an invalid value raises ValueError
1001 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1002
1003 # Check that setting it to an invalid type raises TypeError
1004 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1005
Serhiy Storchaka43767632013-11-03 21:31:38 +02001006 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1007 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001008 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001009 # Test that issue1008086 and issue767150 are fixed.
1010 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001011 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1012 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001013
Serhiy Storchaka43767632013-11-03 21:31:38 +02001014 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1015 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001016 def testIPv4toString(self):
1017 from socket import inet_aton as f, inet_pton, AF_INET
1018 g = lambda a: inet_pton(AF_INET, a)
1019
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001020 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001021 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001022 )
1023
Ezio Melottib3aedd42010-11-20 19:04:17 +00001024 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1025 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1026 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1027 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1028 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001029 assertInvalid(f, '0.0.0.')
1030 assertInvalid(f, '300.0.0.0')
1031 assertInvalid(f, 'a.0.0.0')
1032 assertInvalid(f, '1.2.3.4.5')
1033 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001034
Ezio Melottib3aedd42010-11-20 19:04:17 +00001035 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1036 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1037 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1038 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001039 assertInvalid(g, '0.0.0.')
1040 assertInvalid(g, '300.0.0.0')
1041 assertInvalid(g, 'a.0.0.0')
1042 assertInvalid(g, '1.2.3.4.5')
1043 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001044
Serhiy Storchaka43767632013-11-03 21:31:38 +02001045 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1046 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001047 def testIPv6toString(self):
1048 try:
1049 from socket import inet_pton, AF_INET6, has_ipv6
1050 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001051 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001052 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001053 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001054
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001055 if sys.platform == "win32":
1056 try:
1057 inet_pton(AF_INET6, '::')
1058 except OSError as e:
1059 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001060 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001061
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001062 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001063 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001064 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001065 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001066
Ezio Melottib3aedd42010-11-20 19:04:17 +00001067 self.assertEqual(b'\x00' * 16, f('::'))
1068 self.assertEqual(b'\x00' * 16, f('0::0'))
1069 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1070 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001071 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 +00001072 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1073 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001074 self.assertEqual(
1075 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1076 f('ad42:abc::127:0:254:2')
1077 )
1078 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1079 assertInvalid('0x20::')
1080 assertInvalid(':::')
1081 assertInvalid('::0::')
1082 assertInvalid('1::abc::')
1083 assertInvalid('1::abc::def')
1084 assertInvalid('1:2:3:4:5:6:')
1085 assertInvalid('1:2:3:4:5:6')
1086 assertInvalid('1:2:3:4:5:6:7:8:')
1087 assertInvalid('1:2:3:4:5:6:7:8:0')
1088
1089 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1090 f('::254.42.23.64')
1091 )
1092 self.assertEqual(
1093 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1094 f('42::a29b:254.42.23.64')
1095 )
1096 self.assertEqual(
1097 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1098 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1099 )
1100 assertInvalid('255.254.253.252')
1101 assertInvalid('1::260.2.3.0')
1102 assertInvalid('1::0.be.e.0')
1103 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1104 assertInvalid('::1.2.3.4:0')
1105 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001106
Serhiy Storchaka43767632013-11-03 21:31:38 +02001107 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1108 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001109 def testStringToIPv4(self):
1110 from socket import inet_ntoa as f, inet_ntop, AF_INET
1111 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001112 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001113 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001114 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001115
Ezio Melottib3aedd42010-11-20 19:04:17 +00001116 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1117 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1118 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1119 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001120 assertInvalid(f, b'\x00' * 3)
1121 assertInvalid(f, b'\x00' * 5)
1122 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001123 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001124
Ezio Melottib3aedd42010-11-20 19:04:17 +00001125 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1126 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1127 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001128 assertInvalid(g, b'\x00' * 3)
1129 assertInvalid(g, b'\x00' * 5)
1130 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001131 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001132
Serhiy Storchaka43767632013-11-03 21:31:38 +02001133 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1134 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001135 def testStringToIPv6(self):
1136 try:
1137 from socket import inet_ntop, AF_INET6, has_ipv6
1138 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001139 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001140 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001141 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001142
1143 if sys.platform == "win32":
1144 try:
1145 inet_ntop(AF_INET6, b'\x00' * 16)
1146 except OSError as e:
1147 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001148 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001149
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001150 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001151 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001152 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001153 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001154
Ezio Melottib3aedd42010-11-20 19:04:17 +00001155 self.assertEqual('::', f(b'\x00' * 16))
1156 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1157 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001158 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001159 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 +00001160 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001161 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001162
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001163 assertInvalid(b'\x12' * 15)
1164 assertInvalid(b'\x12' * 17)
1165 assertInvalid(b'\x12' * 4)
1166
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001167 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001168
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001169 def testSockName(self):
1170 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001171 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001172 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001173 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001174 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001175 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001176 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1177 # it reasonable to get the host's addr in addition to 0.0.0.0.
1178 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001179 try:
1180 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001181 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001182 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001183 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001184 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001185 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001186
1187 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001188 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001189 # We know a socket should start without reuse==0
1190 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001191 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001192 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001193 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001194
1195 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001196 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001197 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001198 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001199 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1200 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001201 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001202
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001203 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001204 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001205 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1206 sock.settimeout(1)
1207 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001208 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001209
Martin Panter50ab1a32016-04-11 00:38:12 +00001210 def testCloseException(self):
1211 sock = socket.socket()
1212 socket.socket(fileno=sock.fileno()).close()
1213 try:
1214 sock.close()
1215 except OSError as err:
1216 # Winsock apparently raises ENOTSOCK
1217 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1218 else:
1219 self.fail("close() should raise EBADF/ENOTSOCK")
1220
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001221 def testNewAttributes(self):
1222 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001223
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001224 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1225 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001226 if hasattr(socket, 'SOCK_CLOEXEC'):
1227 self.assertIn(sock.type,
1228 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1229 socket.SOCK_STREAM))
1230 else:
1231 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001232 self.assertEqual(sock.proto, 0)
1233 sock.close()
1234
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001235 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001236 sock = socket.socket()
1237 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001238 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001239 big_port = port + 65536
1240 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001241 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1242 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1243 # Since find_unused_port() is inherently subject to race conditions, we
1244 # call it a couple times if necessary.
1245 for i in itertools.count():
1246 port = support.find_unused_port()
1247 try:
1248 sock.bind((HOST, port))
1249 except OSError as e:
1250 if e.errno != errno.EADDRINUSE or i == 5:
1251 raise
1252 else:
1253 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001254
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001255 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001256 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001257 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1258 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1259 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1260 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001261 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1262 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001263 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001264 self.assertRaises(ValueError, s.ioctl, -1, None)
1265 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001266
Steve Dowerea93ac02016-06-17 12:52:18 -07001267 @unittest.skipUnless(os.name == "nt", "Windows specific")
1268 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1269 'Loopback fast path support required for this test')
1270 def test_sio_loopback_fast_path(self):
1271 s = socket.socket()
1272 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001273 try:
1274 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1275 except OSError as exc:
1276 WSAEOPNOTSUPP = 10045
1277 if exc.winerror == WSAEOPNOTSUPP:
1278 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1279 "doesn't implemented in this Windows version")
1280 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001281 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1282
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001283 def testGetaddrinfo(self):
1284 try:
1285 socket.getaddrinfo('localhost', 80)
1286 except socket.gaierror as err:
1287 if err.errno == socket.EAI_SERVICE:
1288 # see http://bugs.python.org/issue1282647
1289 self.skipTest("buggy libc version")
1290 raise
1291 # len of every sequence is supposed to be == 5
1292 for info in socket.getaddrinfo(HOST, None):
1293 self.assertEqual(len(info), 5)
1294 # host can be a domain name, a string representation of an
1295 # IPv4/v6 address or None
1296 socket.getaddrinfo('localhost', 80)
1297 socket.getaddrinfo('127.0.0.1', 80)
1298 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001299 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001300 socket.getaddrinfo('::1', 80)
1301 # port can be a string service name such as "http", a numeric
1302 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001303 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1304 if (not hasattr(sys, 'getandroidapilevel') or
1305 sys.getandroidapilevel() >= 23):
1306 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001307 socket.getaddrinfo(HOST, 80)
1308 socket.getaddrinfo(HOST, None)
1309 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001310 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1311 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001312 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001313 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1314 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001315 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001316 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1317 for _, socktype, _, _, _ in infos:
1318 self.assertEqual(socktype, socket.SOCK_STREAM)
1319 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001320 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001321 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1322 # a server willing to support both IPv4 and IPv6 will
1323 # usually do this
1324 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1325 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001326 # test keyword arguments
1327 a = socket.getaddrinfo(HOST, None)
1328 b = socket.getaddrinfo(host=HOST, port=None)
1329 self.assertEqual(a, b)
1330 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1331 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1332 self.assertEqual(a, b)
1333 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1334 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1335 self.assertEqual(a, b)
1336 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1337 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1338 self.assertEqual(a, b)
1339 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1340 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1341 self.assertEqual(a, b)
1342 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1343 socket.AI_PASSIVE)
1344 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1345 type=socket.SOCK_STREAM, proto=0,
1346 flags=socket.AI_PASSIVE)
1347 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001348 # Issue #6697.
1349 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001350
Ned Deilyb24f4812014-02-13 22:50:42 -08001351 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001352 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001353 try:
1354 # The arguments here are undefined and the call may succeed
1355 # or fail. All we care here is that it doesn't segfault.
1356 socket.getaddrinfo("localhost", None, 0, 0, 0,
1357 socket.AI_NUMERICSERV)
1358 except socket.gaierror:
1359 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001360
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001361 def test_getnameinfo(self):
1362 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001363 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001364
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001365 @unittest.skipUnless(support.is_resource_enabled('network'),
1366 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001367 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001368 # Check for internet access before running test
1369 # (issue #12804, issue #25138).
1370 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001371 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001372
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001373 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001374 domain = 'испытание.pythontest.net'
1375 socket.gethostbyname(domain)
1376 socket.gethostbyname_ex(domain)
1377 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001378 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1379 # have a reverse entry yet
1380 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001381
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001382 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001383 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001384 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1385 self.skipTest("signal.alarm and socket.socketpair required for this test")
1386 # Our signal handlers clobber the C errno by calling a math function
1387 # with an invalid domain value.
1388 def ok_handler(*args):
1389 self.assertRaises(ValueError, math.acosh, 0)
1390 def raising_handler(*args):
1391 self.assertRaises(ValueError, math.acosh, 0)
1392 1 // 0
1393 c, s = socket.socketpair()
1394 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1395 try:
1396 if with_timeout:
1397 # Just above the one second minimum for signal.alarm
1398 c.settimeout(1.5)
1399 with self.assertRaises(ZeroDivisionError):
1400 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001401 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001402 if with_timeout:
1403 signal.signal(signal.SIGALRM, ok_handler)
1404 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001405 self.assertRaises(socket.timeout, c.sendall,
1406 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001407 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001408 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001409 signal.signal(signal.SIGALRM, old_alarm)
1410 c.close()
1411 s.close()
1412
1413 def test_sendall_interrupted(self):
1414 self.check_sendall_interrupted(False)
1415
1416 def test_sendall_interrupted_with_timeout(self):
1417 self.check_sendall_interrupted(True)
1418
Antoine Pitroue033e062010-10-29 10:38:18 +00001419 def test_dealloc_warn(self):
1420 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1421 r = repr(sock)
1422 with self.assertWarns(ResourceWarning) as cm:
1423 sock = None
1424 support.gc_collect()
1425 self.assertIn(r, str(cm.warning.args[0]))
1426 # An open socket file object gets dereferenced after the socket
1427 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1428 f = sock.makefile('rb')
1429 r = repr(sock)
1430 sock = None
1431 support.gc_collect()
1432 with self.assertWarns(ResourceWarning):
1433 f = None
1434 support.gc_collect()
1435
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001436 def test_name_closed_socketio(self):
1437 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1438 fp = sock.makefile("rb")
1439 fp.close()
1440 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1441
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001442 def test_unusable_closed_socketio(self):
1443 with socket.socket() as sock:
1444 fp = sock.makefile("rb", buffering=0)
1445 self.assertTrue(fp.readable())
1446 self.assertFalse(fp.writable())
1447 self.assertFalse(fp.seekable())
1448 fp.close()
1449 self.assertRaises(ValueError, fp.readable)
1450 self.assertRaises(ValueError, fp.writable)
1451 self.assertRaises(ValueError, fp.seekable)
1452
Berker Peksag3fe64d02016-02-18 17:34:00 +02001453 def test_makefile_mode(self):
1454 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1455 with self.subTest(mode=mode):
1456 with socket.socket() as sock:
1457 with sock.makefile(mode) as fp:
1458 self.assertEqual(fp.mode, mode)
1459
1460 def test_makefile_invalid_mode(self):
1461 for mode in 'rt', 'x', '+', 'a':
1462 with self.subTest(mode=mode):
1463 with socket.socket() as sock:
1464 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1465 sock.makefile(mode)
1466
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001467 def test_pickle(self):
1468 sock = socket.socket()
1469 with sock:
1470 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1471 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001472 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1473 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1474 self.assertEqual(family, socket.AF_INET)
1475 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1476 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001477
Serhiy Storchaka78980432013-01-15 01:12:17 +02001478 def test_listen_backlog(self):
1479 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001480 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1481 srv.bind((HOST, 0))
1482 srv.listen(backlog)
1483
1484 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001485 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001486 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001487
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001488 @support.cpython_only
1489 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001490 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001491 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001492 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1493 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001494 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001495 srv.close()
1496
Charles-François Natali42663332012-01-02 15:57:30 +01001497 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001498 def test_flowinfo(self):
1499 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001500 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001501 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001502 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001503
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001504 def test_str_for_enums(self):
1505 # Make sure that the AF_* and SOCK_* constants have enum-like string
1506 # reprs.
1507 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1508 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001509 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001510
1511 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1512 def test_uknown_socket_family_repr(self):
1513 # Test that when created with a family that's not one of the known
1514 # AF_*/SOCK_* constants, socket.family just returns the number.
1515 #
1516 # To do this we fool socket.socket into believing it already has an
1517 # open fd because on this path it doesn't actually verify the family and
1518 # type and populates the socket object.
1519 #
1520 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001521 fd, path = tempfile.mkstemp()
1522 self.addCleanup(os.unlink, path)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001523 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1524 self.assertEqual(s.family, 42424)
1525 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001526
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001527 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1528 def test__sendfile_use_sendfile(self):
1529 class File:
1530 def __init__(self, fd):
1531 self.fd = fd
1532
1533 def fileno(self):
1534 return self.fd
1535 with socket.socket() as sock:
1536 fd = os.open(os.curdir, os.O_RDONLY)
1537 os.close(fd)
1538 with self.assertRaises(socket._GiveupOnSendfile):
1539 sock._sendfile_use_sendfile(File(fd))
1540 with self.assertRaises(OverflowError):
1541 sock._sendfile_use_sendfile(File(2**1000))
1542 with self.assertRaises(TypeError):
1543 sock._sendfile_use_sendfile(File(None))
1544
1545
Charles-François Natali47413c12011-10-06 19:47:44 +02001546@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1547class BasicCANTest(unittest.TestCase):
1548
1549 def testCrucialConstants(self):
1550 socket.AF_CAN
1551 socket.PF_CAN
1552 socket.CAN_RAW
1553
Charles-François Natali773e42d2013-02-05 19:42:01 +01001554 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1555 'socket.CAN_BCM required for this test.')
1556 def testBCMConstants(self):
1557 socket.CAN_BCM
1558
1559 # opcodes
1560 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1561 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1562 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1563 socket.CAN_BCM_TX_SEND # send one CAN frame
1564 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1565 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1566 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1567 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1568 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1569 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1570 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1571 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1572
Charles-François Natali47413c12011-10-06 19:47:44 +02001573 def testCreateSocket(self):
1574 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1575 pass
1576
Charles-François Natali773e42d2013-02-05 19:42:01 +01001577 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1578 'socket.CAN_BCM required for this test.')
1579 def testCreateBCMSocket(self):
1580 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1581 pass
1582
Charles-François Natali47413c12011-10-06 19:47:44 +02001583 def testBindAny(self):
1584 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1585 s.bind(('', ))
1586
1587 def testTooLongInterfaceName(self):
1588 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1589 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001590 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001591 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001592
1593 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1594 'socket.CAN_RAW_LOOPBACK required for this test.')
1595 def testLoopback(self):
1596 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1597 for loopback in (0, 1):
1598 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1599 loopback)
1600 self.assertEqual(loopback,
1601 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1602
1603 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1604 'socket.CAN_RAW_FILTER required for this test.')
1605 def testFilter(self):
1606 can_id, can_mask = 0x200, 0x700
1607 can_filter = struct.pack("=II", can_id, can_mask)
1608 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1609 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1610 self.assertEqual(can_filter,
1611 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001612 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001613
1614
1615@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001616@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001617class CANTest(ThreadedCANSocketTest):
1618
Charles-François Natali47413c12011-10-06 19:47:44 +02001619 def __init__(self, methodName='runTest'):
1620 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1621
1622 @classmethod
1623 def build_can_frame(cls, can_id, data):
1624 """Build a CAN frame."""
1625 can_dlc = len(data)
1626 data = data.ljust(8, b'\x00')
1627 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1628
1629 @classmethod
1630 def dissect_can_frame(cls, frame):
1631 """Dissect a CAN frame."""
1632 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1633 return (can_id, can_dlc, data[:can_dlc])
1634
1635 def testSendFrame(self):
1636 cf, addr = self.s.recvfrom(self.bufsize)
1637 self.assertEqual(self.cf, cf)
1638 self.assertEqual(addr[0], self.interface)
1639 self.assertEqual(addr[1], socket.AF_CAN)
1640
1641 def _testSendFrame(self):
1642 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1643 self.cli.send(self.cf)
1644
1645 def testSendMaxFrame(self):
1646 cf, addr = self.s.recvfrom(self.bufsize)
1647 self.assertEqual(self.cf, cf)
1648
1649 def _testSendMaxFrame(self):
1650 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1651 self.cli.send(self.cf)
1652
1653 def testSendMultiFrames(self):
1654 cf, addr = self.s.recvfrom(self.bufsize)
1655 self.assertEqual(self.cf1, cf)
1656
1657 cf, addr = self.s.recvfrom(self.bufsize)
1658 self.assertEqual(self.cf2, cf)
1659
1660 def _testSendMultiFrames(self):
1661 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1662 self.cli.send(self.cf1)
1663
1664 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1665 self.cli.send(self.cf2)
1666
Charles-François Natali773e42d2013-02-05 19:42:01 +01001667 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1668 'socket.CAN_BCM required for this test.')
1669 def _testBCM(self):
1670 cf, addr = self.cli.recvfrom(self.bufsize)
1671 self.assertEqual(self.cf, cf)
1672 can_id, can_dlc, data = self.dissect_can_frame(cf)
1673 self.assertEqual(self.can_id, can_id)
1674 self.assertEqual(self.data, data)
1675
1676 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1677 'socket.CAN_BCM required for this test.')
1678 def testBCM(self):
1679 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1680 self.addCleanup(bcm.close)
1681 bcm.connect((self.interface,))
1682 self.can_id = 0x123
1683 self.data = bytes([0xc0, 0xff, 0xee])
1684 self.cf = self.build_can_frame(self.can_id, self.data)
1685 opcode = socket.CAN_BCM_TX_SEND
1686 flags = 0
1687 count = 0
1688 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1689 bcm_can_id = 0x0222
1690 nframes = 1
1691 assert len(self.cf) == 16
1692 header = struct.pack(self.bcm_cmd_msg_fmt,
1693 opcode,
1694 flags,
1695 count,
1696 ival1_seconds,
1697 ival1_usec,
1698 ival2_seconds,
1699 ival2_usec,
1700 bcm_can_id,
1701 nframes,
1702 )
1703 header_plus_frame = header + self.cf
1704 bytes_sent = bcm.send(header_plus_frame)
1705 self.assertEqual(bytes_sent, len(header_plus_frame))
1706
Charles-François Natali47413c12011-10-06 19:47:44 +02001707
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001708@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1709class BasicRDSTest(unittest.TestCase):
1710
1711 def testCrucialConstants(self):
1712 socket.AF_RDS
1713 socket.PF_RDS
1714
1715 def testCreateSocket(self):
1716 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1717 pass
1718
1719 def testSocketBufferSize(self):
1720 bufsize = 16384
1721 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1722 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1723 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1724
1725
1726@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1727@unittest.skipUnless(thread, 'Threading required for this test.')
1728class RDSTest(ThreadedRDSSocketTest):
1729
1730 def __init__(self, methodName='runTest'):
1731 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1732
Charles-François Natali240c55f2011-11-10 20:33:36 +01001733 def setUp(self):
1734 super().setUp()
1735 self.evt = threading.Event()
1736
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001737 def testSendAndRecv(self):
1738 data, addr = self.serv.recvfrom(self.bufsize)
1739 self.assertEqual(self.data, data)
1740 self.assertEqual(self.cli_addr, addr)
1741
1742 def _testSendAndRecv(self):
1743 self.data = b'spam'
1744 self.cli.sendto(self.data, 0, (HOST, self.port))
1745
1746 def testPeek(self):
1747 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1748 self.assertEqual(self.data, data)
1749 data, addr = self.serv.recvfrom(self.bufsize)
1750 self.assertEqual(self.data, data)
1751
1752 def _testPeek(self):
1753 self.data = b'spam'
1754 self.cli.sendto(self.data, 0, (HOST, self.port))
1755
1756 @requireAttrs(socket.socket, 'recvmsg')
1757 def testSendAndRecvMsg(self):
1758 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1759 self.assertEqual(self.data, data)
1760
1761 @requireAttrs(socket.socket, 'sendmsg')
1762 def _testSendAndRecvMsg(self):
1763 self.data = b'hello ' * 10
1764 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1765
1766 def testSendAndRecvMulti(self):
1767 data, addr = self.serv.recvfrom(self.bufsize)
1768 self.assertEqual(self.data1, data)
1769
1770 data, addr = self.serv.recvfrom(self.bufsize)
1771 self.assertEqual(self.data2, data)
1772
1773 def _testSendAndRecvMulti(self):
1774 self.data1 = b'bacon'
1775 self.cli.sendto(self.data1, 0, (HOST, self.port))
1776
1777 self.data2 = b'egg'
1778 self.cli.sendto(self.data2, 0, (HOST, self.port))
1779
1780 def testSelect(self):
1781 r, w, x = select.select([self.serv], [], [], 3.0)
1782 self.assertIn(self.serv, r)
1783 data, addr = self.serv.recvfrom(self.bufsize)
1784 self.assertEqual(self.data, data)
1785
1786 def _testSelect(self):
1787 self.data = b'select'
1788 self.cli.sendto(self.data, 0, (HOST, self.port))
1789
1790 def testCongestion(self):
1791 # wait until the sender is done
1792 self.evt.wait()
1793
1794 def _testCongestion(self):
1795 # test the behavior in case of congestion
1796 self.data = b'fill'
1797 self.cli.setblocking(False)
1798 try:
1799 # try to lower the receiver's socket buffer size
1800 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1801 except OSError:
1802 pass
1803 with self.assertRaises(OSError) as cm:
1804 try:
1805 # fill the receiver's socket buffer
1806 while True:
1807 self.cli.sendto(self.data, 0, (HOST, self.port))
1808 finally:
1809 # signal the receiver we're done
1810 self.evt.set()
1811 # sendto() should have failed with ENOBUFS
1812 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1813 # and we should have received a congestion notification through poll
1814 r, w, x = select.select([self.serv], [], [], 3.0)
1815 self.assertIn(self.serv, r)
1816
1817
Victor Stinner45df8202010-04-28 22:31:17 +00001818@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001819class BasicTCPTest(SocketConnectedTest):
1820
1821 def __init__(self, methodName='runTest'):
1822 SocketConnectedTest.__init__(self, methodName=methodName)
1823
1824 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001825 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001826 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001827 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001828
1829 def _testRecv(self):
1830 self.serv_conn.send(MSG)
1831
1832 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001833 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001834 seg1 = self.cli_conn.recv(len(MSG) - 3)
1835 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001836 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001837 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001838
1839 def _testOverFlowRecv(self):
1840 self.serv_conn.send(MSG)
1841
1842 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001843 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001844 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001845 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001846
1847 def _testRecvFrom(self):
1848 self.serv_conn.send(MSG)
1849
1850 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001851 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001852 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1853 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001854 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001855 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001856
1857 def _testOverFlowRecvFrom(self):
1858 self.serv_conn.send(MSG)
1859
1860 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001861 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001862 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001863 while 1:
1864 read = self.cli_conn.recv(1024)
1865 if not read:
1866 break
Guido van Rossume531e292002-08-08 20:28:34 +00001867 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001868 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001869
1870 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001871 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001872 self.serv_conn.sendall(big_chunk)
1873
1874 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001875 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001876 fd = self.cli_conn.fileno()
1877 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001878 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001879 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001880 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001881 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001882
1883 def _testFromFd(self):
1884 self.serv_conn.send(MSG)
1885
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001886 def testDup(self):
1887 # Testing dup()
1888 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001889 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001890 msg = sock.recv(1024)
1891 self.assertEqual(msg, MSG)
1892
1893 def _testDup(self):
1894 self.serv_conn.send(MSG)
1895
Guido van Rossum24e4af82002-06-12 19:18:08 +00001896 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001897 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001898 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001899 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001900 # wait for _testShutdown to finish: on OS X, when the server
1901 # closes the connection the client also becomes disconnected,
1902 # and the client's shutdown call will fail. (Issue #4397.)
1903 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001904
1905 def _testShutdown(self):
1906 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001907 self.serv_conn.shutdown(2)
1908
1909 testShutdown_overflow = support.cpython_only(testShutdown)
1910
1911 @support.cpython_only
1912 def _testShutdown_overflow(self):
1913 import _testcapi
1914 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001915 # Issue 15989
1916 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1917 _testcapi.INT_MAX + 1)
1918 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1919 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001920 self.serv_conn.shutdown(2)
1921
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001922 def testDetach(self):
1923 # Testing detach()
1924 fileno = self.cli_conn.fileno()
1925 f = self.cli_conn.detach()
1926 self.assertEqual(f, fileno)
1927 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001928 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001929 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001930 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001931 # ...but we can create another socket using the (still open)
1932 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001933 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001934 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001935 msg = sock.recv(1024)
1936 self.assertEqual(msg, MSG)
1937
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001938 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001939 self.serv_conn.send(MSG)
1940
Victor Stinner45df8202010-04-28 22:31:17 +00001941@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001942class BasicUDPTest(ThreadedUDPSocketTest):
1943
1944 def __init__(self, methodName='runTest'):
1945 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1946
1947 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001948 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001949 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001950 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001951
1952 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001953 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001954
Guido van Rossum1c938012002-06-12 21:17:20 +00001955 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001956 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001957 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001958 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001959
Guido van Rossum1c938012002-06-12 21:17:20 +00001960 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001961 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001962
Guido van Rossumd8faa362007-04-27 19:54:29 +00001963 def testRecvFromNegative(self):
1964 # Negative lengths passed to recvfrom should give ValueError.
1965 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1966
1967 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001968 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001969
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001970# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1971# same test code is used with different families and types of socket
1972# (e.g. stream, datagram), and tests using recvmsg() are repeated
1973# using recvmsg_into().
1974#
1975# The generic test classes such as SendmsgTests and
1976# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1977# supplied with sockets cli_sock and serv_sock representing the
1978# client's and the server's end of the connection respectively, and
1979# attributes cli_addr and serv_addr holding their (numeric where
1980# appropriate) addresses.
1981#
1982# The final concrete test classes combine these with subclasses of
1983# SocketTestBase which set up client and server sockets of a specific
1984# type, and with subclasses of SendrecvmsgBase such as
1985# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1986# sockets to cli_sock and serv_sock and override the methods and
1987# attributes of SendrecvmsgBase to fill in destination addresses if
1988# needed when sending, check for specific flags in msg_flags, etc.
1989#
1990# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1991# recvmsg_into().
1992
1993# XXX: like the other datagram (UDP) tests in this module, the code
1994# here assumes that datagram delivery on the local machine will be
1995# reliable.
1996
1997class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1998 # Base class for sendmsg()/recvmsg() tests.
1999
2000 # Time in seconds to wait before considering a test failed, or
2001 # None for no timeout. Not all tests actually set a timeout.
2002 fail_timeout = 3.0
2003
2004 def setUp(self):
2005 self.misc_event = threading.Event()
2006 super().setUp()
2007
2008 def sendToServer(self, msg):
2009 # Send msg to the server.
2010 return self.cli_sock.send(msg)
2011
2012 # Tuple of alternative default arguments for sendmsg() when called
2013 # via sendmsgToServer() (e.g. to include a destination address).
2014 sendmsg_to_server_defaults = ()
2015
2016 def sendmsgToServer(self, *args):
2017 # Call sendmsg() on self.cli_sock with the given arguments,
2018 # filling in any arguments which are not supplied with the
2019 # corresponding items of self.sendmsg_to_server_defaults, if
2020 # any.
2021 return self.cli_sock.sendmsg(
2022 *(args + self.sendmsg_to_server_defaults[len(args):]))
2023
2024 def doRecvmsg(self, sock, bufsize, *args):
2025 # Call recvmsg() on sock with given arguments and return its
2026 # result. Should be used for tests which can use either
2027 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2028 # this method with one which emulates it using recvmsg_into(),
2029 # thus allowing the same test to be used for both methods.
2030 result = sock.recvmsg(bufsize, *args)
2031 self.registerRecvmsgResult(result)
2032 return result
2033
2034 def registerRecvmsgResult(self, result):
2035 # Called by doRecvmsg() with the return value of recvmsg() or
2036 # recvmsg_into(). Can be overridden to arrange cleanup based
2037 # on the returned ancillary data, for instance.
2038 pass
2039
2040 def checkRecvmsgAddress(self, addr1, addr2):
2041 # Called to compare the received address with the address of
2042 # the peer.
2043 self.assertEqual(addr1, addr2)
2044
2045 # Flags that are normally unset in msg_flags
2046 msg_flags_common_unset = 0
2047 for name in ("MSG_CTRUNC", "MSG_OOB"):
2048 msg_flags_common_unset |= getattr(socket, name, 0)
2049
2050 # Flags that are normally set
2051 msg_flags_common_set = 0
2052
2053 # Flags set when a complete record has been received (e.g. MSG_EOR
2054 # for SCTP)
2055 msg_flags_eor_indicator = 0
2056
2057 # Flags set when a complete record has not been received
2058 # (e.g. MSG_TRUNC for datagram sockets)
2059 msg_flags_non_eor_indicator = 0
2060
2061 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2062 # Method to check the value of msg_flags returned by recvmsg[_into]().
2063 #
2064 # Checks that all bits in msg_flags_common_set attribute are
2065 # set in "flags" and all bits in msg_flags_common_unset are
2066 # unset.
2067 #
2068 # The "eor" argument specifies whether the flags should
2069 # indicate that a full record (or datagram) has been received.
2070 # If "eor" is None, no checks are done; otherwise, checks
2071 # that:
2072 #
2073 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2074 # set and all bits in msg_flags_non_eor_indicator are unset
2075 #
2076 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2077 # are set and all bits in msg_flags_eor_indicator are unset
2078 #
2079 # If "checkset" and/or "checkunset" are supplied, they require
2080 # the given bits to be set or unset respectively, overriding
2081 # what the attributes require for those bits.
2082 #
2083 # If any bits are set in "ignore", they will not be checked,
2084 # regardless of the other inputs.
2085 #
2086 # Will raise Exception if the inputs require a bit to be both
2087 # set and unset, and it is not ignored.
2088
2089 defaultset = self.msg_flags_common_set
2090 defaultunset = self.msg_flags_common_unset
2091
2092 if eor:
2093 defaultset |= self.msg_flags_eor_indicator
2094 defaultunset |= self.msg_flags_non_eor_indicator
2095 elif eor is not None:
2096 defaultset |= self.msg_flags_non_eor_indicator
2097 defaultunset |= self.msg_flags_eor_indicator
2098
2099 # Function arguments override defaults
2100 defaultset &= ~checkunset
2101 defaultunset &= ~checkset
2102
2103 # Merge arguments with remaining defaults, and check for conflicts
2104 checkset |= defaultset
2105 checkunset |= defaultunset
2106 inboth = checkset & checkunset & ~ignore
2107 if inboth:
2108 raise Exception("contradictory set, unset requirements for flags "
2109 "{0:#x}".format(inboth))
2110
2111 # Compare with given msg_flags value
2112 mask = (checkset | checkunset) & ~ignore
2113 self.assertEqual(flags & mask, checkset & mask)
2114
2115
2116class RecvmsgIntoMixin(SendrecvmsgBase):
2117 # Mixin to implement doRecvmsg() using recvmsg_into().
2118
2119 def doRecvmsg(self, sock, bufsize, *args):
2120 buf = bytearray(bufsize)
2121 result = sock.recvmsg_into([buf], *args)
2122 self.registerRecvmsgResult(result)
2123 self.assertGreaterEqual(result[0], 0)
2124 self.assertLessEqual(result[0], bufsize)
2125 return (bytes(buf[:result[0]]),) + result[1:]
2126
2127
2128class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2129 # Defines flags to be checked in msg_flags for datagram sockets.
2130
2131 @property
2132 def msg_flags_non_eor_indicator(self):
2133 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2134
2135
2136class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2137 # Defines flags to be checked in msg_flags for SCTP sockets.
2138
2139 @property
2140 def msg_flags_eor_indicator(self):
2141 return super().msg_flags_eor_indicator | socket.MSG_EOR
2142
2143
2144class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2145 # Base class for tests on connectionless-mode sockets. Users must
2146 # supply sockets on attributes cli and serv to be mapped to
2147 # cli_sock and serv_sock respectively.
2148
2149 @property
2150 def serv_sock(self):
2151 return self.serv
2152
2153 @property
2154 def cli_sock(self):
2155 return self.cli
2156
2157 @property
2158 def sendmsg_to_server_defaults(self):
2159 return ([], [], 0, self.serv_addr)
2160
2161 def sendToServer(self, msg):
2162 return self.cli_sock.sendto(msg, self.serv_addr)
2163
2164
2165class SendrecvmsgConnectedBase(SendrecvmsgBase):
2166 # Base class for tests on connected sockets. Users must supply
2167 # sockets on attributes serv_conn and cli_conn (representing the
2168 # connections *to* the server and the client), to be mapped to
2169 # cli_sock and serv_sock respectively.
2170
2171 @property
2172 def serv_sock(self):
2173 return self.cli_conn
2174
2175 @property
2176 def cli_sock(self):
2177 return self.serv_conn
2178
2179 def checkRecvmsgAddress(self, addr1, addr2):
2180 # Address is currently "unspecified" for a connected socket,
2181 # so we don't examine it
2182 pass
2183
2184
2185class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2186 # Base class to set a timeout on server's socket.
2187
2188 def setUp(self):
2189 super().setUp()
2190 self.serv_sock.settimeout(self.fail_timeout)
2191
2192
2193class SendmsgTests(SendrecvmsgServerTimeoutBase):
2194 # Tests for sendmsg() which can use any socket type and do not
2195 # involve recvmsg() or recvmsg_into().
2196
2197 def testSendmsg(self):
2198 # Send a simple message with sendmsg().
2199 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2200
2201 def _testSendmsg(self):
2202 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2203
2204 def testSendmsgDataGenerator(self):
2205 # Send from buffer obtained from a generator (not a sequence).
2206 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2207
2208 def _testSendmsgDataGenerator(self):
2209 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2210 len(MSG))
2211
2212 def testSendmsgAncillaryGenerator(self):
2213 # Gather (empty) ancillary data from a generator.
2214 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2215
2216 def _testSendmsgAncillaryGenerator(self):
2217 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2218 len(MSG))
2219
2220 def testSendmsgArray(self):
2221 # Send data from an array instead of the usual bytes object.
2222 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2223
2224 def _testSendmsgArray(self):
2225 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2226 len(MSG))
2227
2228 def testSendmsgGather(self):
2229 # Send message data from more than one buffer (gather write).
2230 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2231
2232 def _testSendmsgGather(self):
2233 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2234
2235 def testSendmsgBadArgs(self):
2236 # Check that sendmsg() rejects invalid arguments.
2237 self.assertEqual(self.serv_sock.recv(1000), b"done")
2238
2239 def _testSendmsgBadArgs(self):
2240 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2241 self.assertRaises(TypeError, self.sendmsgToServer,
2242 b"not in an iterable")
2243 self.assertRaises(TypeError, self.sendmsgToServer,
2244 object())
2245 self.assertRaises(TypeError, self.sendmsgToServer,
2246 [object()])
2247 self.assertRaises(TypeError, self.sendmsgToServer,
2248 [MSG, object()])
2249 self.assertRaises(TypeError, self.sendmsgToServer,
2250 [MSG], object())
2251 self.assertRaises(TypeError, self.sendmsgToServer,
2252 [MSG], [], object())
2253 self.assertRaises(TypeError, self.sendmsgToServer,
2254 [MSG], [], 0, object())
2255 self.sendToServer(b"done")
2256
2257 def testSendmsgBadCmsg(self):
2258 # Check that invalid ancillary data items are rejected.
2259 self.assertEqual(self.serv_sock.recv(1000), b"done")
2260
2261 def _testSendmsgBadCmsg(self):
2262 self.assertRaises(TypeError, self.sendmsgToServer,
2263 [MSG], [object()])
2264 self.assertRaises(TypeError, self.sendmsgToServer,
2265 [MSG], [(object(), 0, b"data")])
2266 self.assertRaises(TypeError, self.sendmsgToServer,
2267 [MSG], [(0, object(), b"data")])
2268 self.assertRaises(TypeError, self.sendmsgToServer,
2269 [MSG], [(0, 0, object())])
2270 self.assertRaises(TypeError, self.sendmsgToServer,
2271 [MSG], [(0, 0)])
2272 self.assertRaises(TypeError, self.sendmsgToServer,
2273 [MSG], [(0, 0, b"data", 42)])
2274 self.sendToServer(b"done")
2275
2276 @requireAttrs(socket, "CMSG_SPACE")
2277 def testSendmsgBadMultiCmsg(self):
2278 # Check that invalid ancillary data items are rejected when
2279 # more than one item is present.
2280 self.assertEqual(self.serv_sock.recv(1000), b"done")
2281
2282 @testSendmsgBadMultiCmsg.client_skip
2283 def _testSendmsgBadMultiCmsg(self):
2284 self.assertRaises(TypeError, self.sendmsgToServer,
2285 [MSG], [0, 0, b""])
2286 self.assertRaises(TypeError, self.sendmsgToServer,
2287 [MSG], [(0, 0, b""), object()])
2288 self.sendToServer(b"done")
2289
2290 def testSendmsgExcessCmsgReject(self):
2291 # Check that sendmsg() rejects excess ancillary data items
2292 # when the number that can be sent is limited.
2293 self.assertEqual(self.serv_sock.recv(1000), b"done")
2294
2295 def _testSendmsgExcessCmsgReject(self):
2296 if not hasattr(socket, "CMSG_SPACE"):
2297 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002298 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002299 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2300 self.assertIsNone(cm.exception.errno)
2301 self.sendToServer(b"done")
2302
2303 def testSendmsgAfterClose(self):
2304 # Check that sendmsg() fails on a closed socket.
2305 pass
2306
2307 def _testSendmsgAfterClose(self):
2308 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002309 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002310
2311
2312class SendmsgStreamTests(SendmsgTests):
2313 # Tests for sendmsg() which require a stream socket and do not
2314 # involve recvmsg() or recvmsg_into().
2315
2316 def testSendmsgExplicitNoneAddr(self):
2317 # Check that peer address can be specified as None.
2318 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2319
2320 def _testSendmsgExplicitNoneAddr(self):
2321 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2322
2323 def testSendmsgTimeout(self):
2324 # Check that timeout works with sendmsg().
2325 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2326 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2327
2328 def _testSendmsgTimeout(self):
2329 try:
2330 self.cli_sock.settimeout(0.03)
2331 with self.assertRaises(socket.timeout):
2332 while True:
2333 self.sendmsgToServer([b"a"*512])
2334 finally:
2335 self.misc_event.set()
2336
2337 # XXX: would be nice to have more tests for sendmsg flags argument.
2338
2339 # Linux supports MSG_DONTWAIT when sending, but in general, it
2340 # only works when receiving. Could add other platforms if they
2341 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002342 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002343 "MSG_DONTWAIT not known to work on this platform when "
2344 "sending")
2345 def testSendmsgDontWait(self):
2346 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2347 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2348 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2349
2350 @testSendmsgDontWait.client_skip
2351 def _testSendmsgDontWait(self):
2352 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002353 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002354 while True:
2355 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2356 self.assertIn(cm.exception.errno,
2357 (errno.EAGAIN, errno.EWOULDBLOCK))
2358 finally:
2359 self.misc_event.set()
2360
2361
2362class SendmsgConnectionlessTests(SendmsgTests):
2363 # Tests for sendmsg() which require a connectionless-mode
2364 # (e.g. datagram) socket, and do not involve recvmsg() or
2365 # recvmsg_into().
2366
2367 def testSendmsgNoDestAddr(self):
2368 # Check that sendmsg() fails when no destination address is
2369 # given for unconnected socket.
2370 pass
2371
2372 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002373 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002374 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002375 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002376 [MSG], [], 0, None)
2377
2378
2379class RecvmsgGenericTests(SendrecvmsgBase):
2380 # Tests for recvmsg() which can also be emulated using
2381 # recvmsg_into(), and can use any socket type.
2382
2383 def testRecvmsg(self):
2384 # Receive a simple message with recvmsg[_into]().
2385 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2386 self.assertEqual(msg, MSG)
2387 self.checkRecvmsgAddress(addr, self.cli_addr)
2388 self.assertEqual(ancdata, [])
2389 self.checkFlags(flags, eor=True)
2390
2391 def _testRecvmsg(self):
2392 self.sendToServer(MSG)
2393
2394 def testRecvmsgExplicitDefaults(self):
2395 # Test recvmsg[_into]() with default arguments provided explicitly.
2396 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2397 len(MSG), 0, 0)
2398 self.assertEqual(msg, MSG)
2399 self.checkRecvmsgAddress(addr, self.cli_addr)
2400 self.assertEqual(ancdata, [])
2401 self.checkFlags(flags, eor=True)
2402
2403 def _testRecvmsgExplicitDefaults(self):
2404 self.sendToServer(MSG)
2405
2406 def testRecvmsgShorter(self):
2407 # Receive a message smaller than buffer.
2408 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2409 len(MSG) + 42)
2410 self.assertEqual(msg, MSG)
2411 self.checkRecvmsgAddress(addr, self.cli_addr)
2412 self.assertEqual(ancdata, [])
2413 self.checkFlags(flags, eor=True)
2414
2415 def _testRecvmsgShorter(self):
2416 self.sendToServer(MSG)
2417
Charles-François Natali8619cd72011-10-03 19:43:15 +02002418 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2419 # datagram is received (issue #13001).
2420 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002421 def testRecvmsgTrunc(self):
2422 # Receive part of message, check for truncation indicators.
2423 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2424 len(MSG) - 3)
2425 self.assertEqual(msg, MSG[:-3])
2426 self.checkRecvmsgAddress(addr, self.cli_addr)
2427 self.assertEqual(ancdata, [])
2428 self.checkFlags(flags, eor=False)
2429
Charles-François Natali8619cd72011-10-03 19:43:15 +02002430 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002431 def _testRecvmsgTrunc(self):
2432 self.sendToServer(MSG)
2433
2434 def testRecvmsgShortAncillaryBuf(self):
2435 # Test ancillary data buffer too small to hold any ancillary data.
2436 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2437 len(MSG), 1)
2438 self.assertEqual(msg, MSG)
2439 self.checkRecvmsgAddress(addr, self.cli_addr)
2440 self.assertEqual(ancdata, [])
2441 self.checkFlags(flags, eor=True)
2442
2443 def _testRecvmsgShortAncillaryBuf(self):
2444 self.sendToServer(MSG)
2445
2446 def testRecvmsgLongAncillaryBuf(self):
2447 # Test large ancillary data buffer.
2448 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2449 len(MSG), 10240)
2450 self.assertEqual(msg, MSG)
2451 self.checkRecvmsgAddress(addr, self.cli_addr)
2452 self.assertEqual(ancdata, [])
2453 self.checkFlags(flags, eor=True)
2454
2455 def _testRecvmsgLongAncillaryBuf(self):
2456 self.sendToServer(MSG)
2457
2458 def testRecvmsgAfterClose(self):
2459 # Check that recvmsg[_into]() fails on a closed socket.
2460 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002461 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002462
2463 def _testRecvmsgAfterClose(self):
2464 pass
2465
2466 def testRecvmsgTimeout(self):
2467 # Check that timeout works.
2468 try:
2469 self.serv_sock.settimeout(0.03)
2470 self.assertRaises(socket.timeout,
2471 self.doRecvmsg, self.serv_sock, len(MSG))
2472 finally:
2473 self.misc_event.set()
2474
2475 def _testRecvmsgTimeout(self):
2476 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2477
2478 @requireAttrs(socket, "MSG_PEEK")
2479 def testRecvmsgPeek(self):
2480 # Check that MSG_PEEK in flags enables examination of pending
2481 # data without consuming it.
2482
2483 # Receive part of data with MSG_PEEK.
2484 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2485 len(MSG) - 3, 0,
2486 socket.MSG_PEEK)
2487 self.assertEqual(msg, MSG[:-3])
2488 self.checkRecvmsgAddress(addr, self.cli_addr)
2489 self.assertEqual(ancdata, [])
2490 # Ignoring MSG_TRUNC here (so this test is the same for stream
2491 # and datagram sockets). Some wording in POSIX seems to
2492 # suggest that it needn't be set when peeking, but that may
2493 # just be a slip.
2494 self.checkFlags(flags, eor=False,
2495 ignore=getattr(socket, "MSG_TRUNC", 0))
2496
2497 # Receive all data with MSG_PEEK.
2498 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2499 len(MSG), 0,
2500 socket.MSG_PEEK)
2501 self.assertEqual(msg, MSG)
2502 self.checkRecvmsgAddress(addr, self.cli_addr)
2503 self.assertEqual(ancdata, [])
2504 self.checkFlags(flags, eor=True)
2505
2506 # Check that the same data can still be received normally.
2507 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2508 self.assertEqual(msg, MSG)
2509 self.checkRecvmsgAddress(addr, self.cli_addr)
2510 self.assertEqual(ancdata, [])
2511 self.checkFlags(flags, eor=True)
2512
2513 @testRecvmsgPeek.client_skip
2514 def _testRecvmsgPeek(self):
2515 self.sendToServer(MSG)
2516
2517 @requireAttrs(socket.socket, "sendmsg")
2518 def testRecvmsgFromSendmsg(self):
2519 # Test receiving with recvmsg[_into]() when message is sent
2520 # using sendmsg().
2521 self.serv_sock.settimeout(self.fail_timeout)
2522 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2523 self.assertEqual(msg, MSG)
2524 self.checkRecvmsgAddress(addr, self.cli_addr)
2525 self.assertEqual(ancdata, [])
2526 self.checkFlags(flags, eor=True)
2527
2528 @testRecvmsgFromSendmsg.client_skip
2529 def _testRecvmsgFromSendmsg(self):
2530 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2531
2532
2533class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2534 # Tests which require a stream socket and can use either recvmsg()
2535 # or recvmsg_into().
2536
2537 def testRecvmsgEOF(self):
2538 # Receive end-of-stream indicator (b"", peer socket closed).
2539 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2540 self.assertEqual(msg, b"")
2541 self.checkRecvmsgAddress(addr, self.cli_addr)
2542 self.assertEqual(ancdata, [])
2543 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2544
2545 def _testRecvmsgEOF(self):
2546 self.cli_sock.close()
2547
2548 def testRecvmsgOverflow(self):
2549 # Receive a message in more than one chunk.
2550 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2551 len(MSG) - 3)
2552 self.checkRecvmsgAddress(addr, self.cli_addr)
2553 self.assertEqual(ancdata, [])
2554 self.checkFlags(flags, eor=False)
2555
2556 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2557 self.checkRecvmsgAddress(addr, self.cli_addr)
2558 self.assertEqual(ancdata, [])
2559 self.checkFlags(flags, eor=True)
2560
2561 msg = seg1 + seg2
2562 self.assertEqual(msg, MSG)
2563
2564 def _testRecvmsgOverflow(self):
2565 self.sendToServer(MSG)
2566
2567
2568class RecvmsgTests(RecvmsgGenericTests):
2569 # Tests for recvmsg() which can use any socket type.
2570
2571 def testRecvmsgBadArgs(self):
2572 # Check that recvmsg() rejects invalid arguments.
2573 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2574 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2575 -1, 0, 0)
2576 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2577 len(MSG), -1, 0)
2578 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2579 [bytearray(10)], 0, 0)
2580 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2581 object(), 0, 0)
2582 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2583 len(MSG), object(), 0)
2584 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2585 len(MSG), 0, object())
2586
2587 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2588 self.assertEqual(msg, MSG)
2589 self.checkRecvmsgAddress(addr, self.cli_addr)
2590 self.assertEqual(ancdata, [])
2591 self.checkFlags(flags, eor=True)
2592
2593 def _testRecvmsgBadArgs(self):
2594 self.sendToServer(MSG)
2595
2596
2597class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2598 # Tests for recvmsg_into() which can use any socket type.
2599
2600 def testRecvmsgIntoBadArgs(self):
2601 # Check that recvmsg_into() rejects invalid arguments.
2602 buf = bytearray(len(MSG))
2603 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2604 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2605 len(MSG), 0, 0)
2606 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2607 buf, 0, 0)
2608 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2609 [object()], 0, 0)
2610 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2611 [b"I'm not writable"], 0, 0)
2612 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2613 [buf, object()], 0, 0)
2614 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2615 [buf], -1, 0)
2616 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2617 [buf], object(), 0)
2618 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2619 [buf], 0, object())
2620
2621 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2622 self.assertEqual(nbytes, len(MSG))
2623 self.assertEqual(buf, bytearray(MSG))
2624 self.checkRecvmsgAddress(addr, self.cli_addr)
2625 self.assertEqual(ancdata, [])
2626 self.checkFlags(flags, eor=True)
2627
2628 def _testRecvmsgIntoBadArgs(self):
2629 self.sendToServer(MSG)
2630
2631 def testRecvmsgIntoGenerator(self):
2632 # Receive into buffer obtained from a generator (not a sequence).
2633 buf = bytearray(len(MSG))
2634 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2635 (o for o in [buf]))
2636 self.assertEqual(nbytes, len(MSG))
2637 self.assertEqual(buf, bytearray(MSG))
2638 self.checkRecvmsgAddress(addr, self.cli_addr)
2639 self.assertEqual(ancdata, [])
2640 self.checkFlags(flags, eor=True)
2641
2642 def _testRecvmsgIntoGenerator(self):
2643 self.sendToServer(MSG)
2644
2645 def testRecvmsgIntoArray(self):
2646 # Receive into an array rather than the usual bytearray.
2647 buf = array.array("B", [0] * len(MSG))
2648 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2649 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002650 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002651 self.checkRecvmsgAddress(addr, self.cli_addr)
2652 self.assertEqual(ancdata, [])
2653 self.checkFlags(flags, eor=True)
2654
2655 def _testRecvmsgIntoArray(self):
2656 self.sendToServer(MSG)
2657
2658 def testRecvmsgIntoScatter(self):
2659 # Receive into multiple buffers (scatter write).
2660 b1 = bytearray(b"----")
2661 b2 = bytearray(b"0123456789")
2662 b3 = bytearray(b"--------------")
2663 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2664 [b1, memoryview(b2)[2:9], b3])
2665 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2666 self.assertEqual(b1, bytearray(b"Mary"))
2667 self.assertEqual(b2, bytearray(b"01 had a 9"))
2668 self.assertEqual(b3, bytearray(b"little lamb---"))
2669 self.checkRecvmsgAddress(addr, self.cli_addr)
2670 self.assertEqual(ancdata, [])
2671 self.checkFlags(flags, eor=True)
2672
2673 def _testRecvmsgIntoScatter(self):
2674 self.sendToServer(b"Mary had a little lamb")
2675
2676
2677class CmsgMacroTests(unittest.TestCase):
2678 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2679 # assumptions used by sendmsg() and recvmsg[_into](), which share
2680 # code with these functions.
2681
2682 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002683 try:
2684 import _testcapi
2685 except ImportError:
2686 socklen_t_limit = 0x7fffffff
2687 else:
2688 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002689
2690 @requireAttrs(socket, "CMSG_LEN")
2691 def testCMSG_LEN(self):
2692 # Test CMSG_LEN() with various valid and invalid values,
2693 # checking the assumptions used by recvmsg() and sendmsg().
2694 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2695 values = list(range(257)) + list(range(toobig - 257, toobig))
2696
2697 # struct cmsghdr has at least three members, two of which are ints
2698 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2699 for n in values:
2700 ret = socket.CMSG_LEN(n)
2701 # This is how recvmsg() calculates the data size
2702 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2703 self.assertLessEqual(ret, self.socklen_t_limit)
2704
2705 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2706 # sendmsg() shares code with these functions, and requires
2707 # that it reject values over the limit.
2708 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2709 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2710
2711 @requireAttrs(socket, "CMSG_SPACE")
2712 def testCMSG_SPACE(self):
2713 # Test CMSG_SPACE() with various valid and invalid values,
2714 # checking the assumptions used by sendmsg().
2715 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2716 values = list(range(257)) + list(range(toobig - 257, toobig))
2717
2718 last = socket.CMSG_SPACE(0)
2719 # struct cmsghdr has at least three members, two of which are ints
2720 self.assertGreater(last, array.array("i").itemsize * 2)
2721 for n in values:
2722 ret = socket.CMSG_SPACE(n)
2723 self.assertGreaterEqual(ret, last)
2724 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2725 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2726 self.assertLessEqual(ret, self.socklen_t_limit)
2727 last = ret
2728
2729 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2730 # sendmsg() shares code with these functions, and requires
2731 # that it reject values over the limit.
2732 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2733 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2734
2735
2736class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2737 # Tests for file descriptor passing on Unix-domain sockets.
2738
2739 # Invalid file descriptor value that's unlikely to evaluate to a
2740 # real FD even if one of its bytes is replaced with a different
2741 # value (which shouldn't actually happen).
2742 badfd = -0x5555
2743
2744 def newFDs(self, n):
2745 # Return a list of n file descriptors for newly-created files
2746 # containing their list indices as ASCII numbers.
2747 fds = []
2748 for i in range(n):
2749 fd, path = tempfile.mkstemp()
2750 self.addCleanup(os.unlink, path)
2751 self.addCleanup(os.close, fd)
2752 os.write(fd, str(i).encode())
2753 fds.append(fd)
2754 return fds
2755
2756 def checkFDs(self, fds):
2757 # Check that the file descriptors in the given list contain
2758 # their correct list indices as ASCII numbers.
2759 for n, fd in enumerate(fds):
2760 os.lseek(fd, 0, os.SEEK_SET)
2761 self.assertEqual(os.read(fd, 1024), str(n).encode())
2762
2763 def registerRecvmsgResult(self, result):
2764 self.addCleanup(self.closeRecvmsgFDs, result)
2765
2766 def closeRecvmsgFDs(self, recvmsg_result):
2767 # Close all file descriptors specified in the ancillary data
2768 # of the given return value from recvmsg() or recvmsg_into().
2769 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2770 if (cmsg_level == socket.SOL_SOCKET and
2771 cmsg_type == socket.SCM_RIGHTS):
2772 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002773 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002774 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2775 for fd in fds:
2776 os.close(fd)
2777
2778 def createAndSendFDs(self, n):
2779 # Send n new file descriptors created by newFDs() to the
2780 # server, with the constant MSG as the non-ancillary data.
2781 self.assertEqual(
2782 self.sendmsgToServer([MSG],
2783 [(socket.SOL_SOCKET,
2784 socket.SCM_RIGHTS,
2785 array.array("i", self.newFDs(n)))]),
2786 len(MSG))
2787
2788 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2789 # Check that constant MSG was received with numfds file
2790 # descriptors in a maximum of maxcmsgs control messages (which
2791 # must contain only complete integers). By default, check
2792 # that MSG_CTRUNC is unset, but ignore any flags in
2793 # ignoreflags.
2794 msg, ancdata, flags, addr = result
2795 self.assertEqual(msg, MSG)
2796 self.checkRecvmsgAddress(addr, self.cli_addr)
2797 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2798 ignore=ignoreflags)
2799
2800 self.assertIsInstance(ancdata, list)
2801 self.assertLessEqual(len(ancdata), maxcmsgs)
2802 fds = array.array("i")
2803 for item in ancdata:
2804 self.assertIsInstance(item, tuple)
2805 cmsg_level, cmsg_type, cmsg_data = item
2806 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2807 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2808 self.assertIsInstance(cmsg_data, bytes)
2809 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002810 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002811
2812 self.assertEqual(len(fds), numfds)
2813 self.checkFDs(fds)
2814
2815 def testFDPassSimple(self):
2816 # Pass a single FD (array read from bytes object).
2817 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2818 len(MSG), 10240))
2819
2820 def _testFDPassSimple(self):
2821 self.assertEqual(
2822 self.sendmsgToServer(
2823 [MSG],
2824 [(socket.SOL_SOCKET,
2825 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002826 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002827 len(MSG))
2828
2829 def testMultipleFDPass(self):
2830 # Pass multiple FDs in a single array.
2831 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2832 len(MSG), 10240))
2833
2834 def _testMultipleFDPass(self):
2835 self.createAndSendFDs(4)
2836
2837 @requireAttrs(socket, "CMSG_SPACE")
2838 def testFDPassCMSG_SPACE(self):
2839 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2840 self.checkRecvmsgFDs(
2841 4, self.doRecvmsg(self.serv_sock, len(MSG),
2842 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2843
2844 @testFDPassCMSG_SPACE.client_skip
2845 def _testFDPassCMSG_SPACE(self):
2846 self.createAndSendFDs(4)
2847
2848 def testFDPassCMSG_LEN(self):
2849 # Test using CMSG_LEN() to calculate ancillary buffer size.
2850 self.checkRecvmsgFDs(1,
2851 self.doRecvmsg(self.serv_sock, len(MSG),
2852 socket.CMSG_LEN(4 * SIZEOF_INT)),
2853 # RFC 3542 says implementations may set
2854 # MSG_CTRUNC if there isn't enough space
2855 # for trailing padding.
2856 ignoreflags=socket.MSG_CTRUNC)
2857
2858 def _testFDPassCMSG_LEN(self):
2859 self.createAndSendFDs(1)
2860
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 @requireAttrs(socket, "CMSG_SPACE")
2864 def testFDPassSeparate(self):
2865 # Pass two FDs in two separate arrays. Arrays may be combined
2866 # into a single control message by the OS.
2867 self.checkRecvmsgFDs(2,
2868 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2869 maxcmsgs=2)
2870
2871 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002872 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002873 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002874 def _testFDPassSeparate(self):
2875 fd0, fd1 = self.newFDs(2)
2876 self.assertEqual(
2877 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2878 socket.SCM_RIGHTS,
2879 array.array("i", [fd0])),
2880 (socket.SOL_SOCKET,
2881 socket.SCM_RIGHTS,
2882 array.array("i", [fd1]))]),
2883 len(MSG))
2884
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002885 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002886 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002887 @requireAttrs(socket, "CMSG_SPACE")
2888 def testFDPassSeparateMinSpace(self):
2889 # Pass two FDs in two separate arrays, receiving them into the
2890 # minimum space for two arrays.
2891 self.checkRecvmsgFDs(2,
2892 self.doRecvmsg(self.serv_sock, len(MSG),
2893 socket.CMSG_SPACE(SIZEOF_INT) +
2894 socket.CMSG_LEN(SIZEOF_INT)),
2895 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2896
2897 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002898 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002899 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002900 def _testFDPassSeparateMinSpace(self):
2901 fd0, fd1 = self.newFDs(2)
2902 self.assertEqual(
2903 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2904 socket.SCM_RIGHTS,
2905 array.array("i", [fd0])),
2906 (socket.SOL_SOCKET,
2907 socket.SCM_RIGHTS,
2908 array.array("i", [fd1]))]),
2909 len(MSG))
2910
2911 def sendAncillaryIfPossible(self, msg, ancdata):
2912 # Try to send msg and ancdata to server, but if the system
2913 # call fails, just send msg with no ancillary data.
2914 try:
2915 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002916 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002917 # Check that it was the system call that failed
2918 self.assertIsInstance(e.errno, int)
2919 nbytes = self.sendmsgToServer([msg])
2920 self.assertEqual(nbytes, len(msg))
2921
Brett Cannon3bbad122015-12-28 17:21:44 -08002922 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002923 def testFDPassEmpty(self):
2924 # Try to pass an empty FD array. Can receive either no array
2925 # or an empty array.
2926 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2927 len(MSG), 10240),
2928 ignoreflags=socket.MSG_CTRUNC)
2929
2930 def _testFDPassEmpty(self):
2931 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2932 socket.SCM_RIGHTS,
2933 b"")])
2934
2935 def testFDPassPartialInt(self):
2936 # Try to pass a truncated FD array.
2937 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2938 len(MSG), 10240)
2939 self.assertEqual(msg, MSG)
2940 self.checkRecvmsgAddress(addr, self.cli_addr)
2941 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2942 self.assertLessEqual(len(ancdata), 1)
2943 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2944 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2945 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2946 self.assertLess(len(cmsg_data), SIZEOF_INT)
2947
2948 def _testFDPassPartialInt(self):
2949 self.sendAncillaryIfPossible(
2950 MSG,
2951 [(socket.SOL_SOCKET,
2952 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002953 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002954
2955 @requireAttrs(socket, "CMSG_SPACE")
2956 def testFDPassPartialIntInMiddle(self):
2957 # Try to pass two FD arrays, the first of which is truncated.
2958 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2959 len(MSG), 10240)
2960 self.assertEqual(msg, MSG)
2961 self.checkRecvmsgAddress(addr, self.cli_addr)
2962 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2963 self.assertLessEqual(len(ancdata), 2)
2964 fds = array.array("i")
2965 # Arrays may have been combined in a single control message
2966 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2967 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2968 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002969 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002970 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2971 self.assertLessEqual(len(fds), 2)
2972 self.checkFDs(fds)
2973
2974 @testFDPassPartialIntInMiddle.client_skip
2975 def _testFDPassPartialIntInMiddle(self):
2976 fd0, fd1 = self.newFDs(2)
2977 self.sendAncillaryIfPossible(
2978 MSG,
2979 [(socket.SOL_SOCKET,
2980 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002981 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002982 (socket.SOL_SOCKET,
2983 socket.SCM_RIGHTS,
2984 array.array("i", [fd1]))])
2985
2986 def checkTruncatedHeader(self, result, ignoreflags=0):
2987 # Check that no ancillary data items are returned when data is
2988 # truncated inside the cmsghdr structure.
2989 msg, ancdata, flags, addr = result
2990 self.assertEqual(msg, MSG)
2991 self.checkRecvmsgAddress(addr, self.cli_addr)
2992 self.assertEqual(ancdata, [])
2993 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2994 ignore=ignoreflags)
2995
2996 def testCmsgTruncNoBufSize(self):
2997 # Check that no ancillary data is received when no buffer size
2998 # is specified.
2999 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3000 # BSD seems to set MSG_CTRUNC only
3001 # if an item has been partially
3002 # received.
3003 ignoreflags=socket.MSG_CTRUNC)
3004
3005 def _testCmsgTruncNoBufSize(self):
3006 self.createAndSendFDs(1)
3007
3008 def testCmsgTrunc0(self):
3009 # Check that no ancillary data is received when buffer size is 0.
3010 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3011 ignoreflags=socket.MSG_CTRUNC)
3012
3013 def _testCmsgTrunc0(self):
3014 self.createAndSendFDs(1)
3015
3016 # Check that no ancillary data is returned for various non-zero
3017 # (but still too small) buffer sizes.
3018
3019 def testCmsgTrunc1(self):
3020 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3021
3022 def _testCmsgTrunc1(self):
3023 self.createAndSendFDs(1)
3024
3025 def testCmsgTrunc2Int(self):
3026 # The cmsghdr structure has at least three members, two of
3027 # which are ints, so we still shouldn't see any ancillary
3028 # data.
3029 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3030 SIZEOF_INT * 2))
3031
3032 def _testCmsgTrunc2Int(self):
3033 self.createAndSendFDs(1)
3034
3035 def testCmsgTruncLen0Minus1(self):
3036 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3037 socket.CMSG_LEN(0) - 1))
3038
3039 def _testCmsgTruncLen0Minus1(self):
3040 self.createAndSendFDs(1)
3041
3042 # The following tests try to truncate the control message in the
3043 # middle of the FD array.
3044
3045 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3046 # Check that file descriptor data is truncated to between
3047 # mindata and maxdata bytes when received with buffer size
3048 # ancbuf, and that any complete file descriptor numbers are
3049 # valid.
3050 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3051 len(MSG), ancbuf)
3052 self.assertEqual(msg, MSG)
3053 self.checkRecvmsgAddress(addr, self.cli_addr)
3054 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3055
3056 if mindata == 0 and ancdata == []:
3057 return
3058 self.assertEqual(len(ancdata), 1)
3059 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3060 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3061 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3062 self.assertGreaterEqual(len(cmsg_data), mindata)
3063 self.assertLessEqual(len(cmsg_data), maxdata)
3064 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003065 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003066 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3067 self.checkFDs(fds)
3068
3069 def testCmsgTruncLen0(self):
3070 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3071
3072 def _testCmsgTruncLen0(self):
3073 self.createAndSendFDs(1)
3074
3075 def testCmsgTruncLen0Plus1(self):
3076 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3077
3078 def _testCmsgTruncLen0Plus1(self):
3079 self.createAndSendFDs(2)
3080
3081 def testCmsgTruncLen1(self):
3082 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3083 maxdata=SIZEOF_INT)
3084
3085 def _testCmsgTruncLen1(self):
3086 self.createAndSendFDs(2)
3087
3088 def testCmsgTruncLen2Minus1(self):
3089 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3090 maxdata=(2 * SIZEOF_INT) - 1)
3091
3092 def _testCmsgTruncLen2Minus1(self):
3093 self.createAndSendFDs(2)
3094
3095
3096class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3097 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3098 # features of the RFC 3542 Advanced Sockets API for IPv6.
3099 # Currently we can only handle certain data items (e.g. traffic
3100 # class, hop limit, MTU discovery and fragmentation settings)
3101 # without resorting to unportable means such as the struct module,
3102 # but the tests here are aimed at testing the ancillary data
3103 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3104 # itself.
3105
3106 # Test value to use when setting hop limit of packet
3107 hop_limit = 2
3108
3109 # Test value to use when setting traffic class of packet.
3110 # -1 means "use kernel default".
3111 traffic_class = -1
3112
3113 def ancillaryMapping(self, ancdata):
3114 # Given ancillary data list ancdata, return a mapping from
3115 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3116 # Check that no (level, type) pair appears more than once.
3117 d = {}
3118 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3119 self.assertNotIn((cmsg_level, cmsg_type), d)
3120 d[(cmsg_level, cmsg_type)] = cmsg_data
3121 return d
3122
3123 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3124 # Receive hop limit into ancbufsize bytes of ancillary data
3125 # space. Check that data is MSG, ancillary data is not
3126 # truncated (but ignore any flags in ignoreflags), and hop
3127 # limit is between 0 and maxhop inclusive.
3128 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3129 socket.IPV6_RECVHOPLIMIT, 1)
3130 self.misc_event.set()
3131 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3132 len(MSG), ancbufsize)
3133
3134 self.assertEqual(msg, MSG)
3135 self.checkRecvmsgAddress(addr, self.cli_addr)
3136 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3137 ignore=ignoreflags)
3138
3139 self.assertEqual(len(ancdata), 1)
3140 self.assertIsInstance(ancdata[0], tuple)
3141 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3142 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3143 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3144 self.assertIsInstance(cmsg_data, bytes)
3145 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3146 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003147 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003148 self.assertGreaterEqual(a[0], 0)
3149 self.assertLessEqual(a[0], maxhop)
3150
3151 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3152 def testRecvHopLimit(self):
3153 # Test receiving the packet hop limit as ancillary data.
3154 self.checkHopLimit(ancbufsize=10240)
3155
3156 @testRecvHopLimit.client_skip
3157 def _testRecvHopLimit(self):
3158 # Need to wait until server has asked to receive ancillary
3159 # data, as implementations are not required to buffer it
3160 # otherwise.
3161 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3162 self.sendToServer(MSG)
3163
3164 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3165 def testRecvHopLimitCMSG_SPACE(self):
3166 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3167 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3168
3169 @testRecvHopLimitCMSG_SPACE.client_skip
3170 def _testRecvHopLimitCMSG_SPACE(self):
3171 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3172 self.sendToServer(MSG)
3173
3174 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3175 # 3542 says portable applications must provide space for trailing
3176 # padding. Implementations may set MSG_CTRUNC if there isn't
3177 # enough space for the padding.
3178
3179 @requireAttrs(socket.socket, "sendmsg")
3180 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3181 def testSetHopLimit(self):
3182 # Test setting hop limit on outgoing packet and receiving it
3183 # at the other end.
3184 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3185
3186 @testSetHopLimit.client_skip
3187 def _testSetHopLimit(self):
3188 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3189 self.assertEqual(
3190 self.sendmsgToServer([MSG],
3191 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3192 array.array("i", [self.hop_limit]))]),
3193 len(MSG))
3194
3195 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3196 ignoreflags=0):
3197 # Receive traffic class and hop limit into ancbufsize bytes of
3198 # ancillary data space. Check that data is MSG, ancillary
3199 # data is not truncated (but ignore any flags in ignoreflags),
3200 # and traffic class and hop limit are in range (hop limit no
3201 # more than maxhop).
3202 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3203 socket.IPV6_RECVHOPLIMIT, 1)
3204 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3205 socket.IPV6_RECVTCLASS, 1)
3206 self.misc_event.set()
3207 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3208 len(MSG), ancbufsize)
3209
3210 self.assertEqual(msg, MSG)
3211 self.checkRecvmsgAddress(addr, self.cli_addr)
3212 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3213 ignore=ignoreflags)
3214 self.assertEqual(len(ancdata), 2)
3215 ancmap = self.ancillaryMapping(ancdata)
3216
3217 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3218 self.assertEqual(len(tcdata), SIZEOF_INT)
3219 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003220 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003221 self.assertGreaterEqual(a[0], 0)
3222 self.assertLessEqual(a[0], 255)
3223
3224 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3225 self.assertEqual(len(hldata), SIZEOF_INT)
3226 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003227 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003228 self.assertGreaterEqual(a[0], 0)
3229 self.assertLessEqual(a[0], maxhop)
3230
3231 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3232 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3233 def testRecvTrafficClassAndHopLimit(self):
3234 # Test receiving traffic class and hop limit as ancillary data.
3235 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3236
3237 @testRecvTrafficClassAndHopLimit.client_skip
3238 def _testRecvTrafficClassAndHopLimit(self):
3239 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3240 self.sendToServer(MSG)
3241
3242 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3243 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3244 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3245 # Test receiving traffic class and hop limit, using
3246 # CMSG_SPACE() to calculate buffer size.
3247 self.checkTrafficClassAndHopLimit(
3248 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3249
3250 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3251 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3252 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3253 self.sendToServer(MSG)
3254
3255 @requireAttrs(socket.socket, "sendmsg")
3256 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3257 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3258 def testSetTrafficClassAndHopLimit(self):
3259 # Test setting traffic class and hop limit on outgoing packet,
3260 # and receiving them at the other end.
3261 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3262 maxhop=self.hop_limit)
3263
3264 @testSetTrafficClassAndHopLimit.client_skip
3265 def _testSetTrafficClassAndHopLimit(self):
3266 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3267 self.assertEqual(
3268 self.sendmsgToServer([MSG],
3269 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3270 array.array("i", [self.traffic_class])),
3271 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3272 array.array("i", [self.hop_limit]))]),
3273 len(MSG))
3274
3275 @requireAttrs(socket.socket, "sendmsg")
3276 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3277 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3278 def testOddCmsgSize(self):
3279 # Try to send ancillary data with first item one byte too
3280 # long. Fall back to sending with correct size if this fails,
3281 # and check that second item was handled correctly.
3282 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3283 maxhop=self.hop_limit)
3284
3285 @testOddCmsgSize.client_skip
3286 def _testOddCmsgSize(self):
3287 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3288 try:
3289 nbytes = self.sendmsgToServer(
3290 [MSG],
3291 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003292 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003293 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3294 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003295 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003296 self.assertIsInstance(e.errno, int)
3297 nbytes = self.sendmsgToServer(
3298 [MSG],
3299 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3300 array.array("i", [self.traffic_class])),
3301 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3302 array.array("i", [self.hop_limit]))])
3303 self.assertEqual(nbytes, len(MSG))
3304
3305 # Tests for proper handling of truncated ancillary data
3306
3307 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3308 # Receive hop limit into ancbufsize bytes of ancillary data
3309 # space, which should be too small to contain the ancillary
3310 # data header (if ancbufsize is None, pass no second argument
3311 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3312 # (unless included in ignoreflags), and no ancillary data is
3313 # returned.
3314 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3315 socket.IPV6_RECVHOPLIMIT, 1)
3316 self.misc_event.set()
3317 args = () if ancbufsize is None else (ancbufsize,)
3318 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3319 len(MSG), *args)
3320
3321 self.assertEqual(msg, MSG)
3322 self.checkRecvmsgAddress(addr, self.cli_addr)
3323 self.assertEqual(ancdata, [])
3324 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3325 ignore=ignoreflags)
3326
3327 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3328 def testCmsgTruncNoBufSize(self):
3329 # Check that no ancillary data is received when no ancillary
3330 # buffer size is provided.
3331 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3332 # BSD seems to set
3333 # MSG_CTRUNC only if an item
3334 # has been partially
3335 # received.
3336 ignoreflags=socket.MSG_CTRUNC)
3337
3338 @testCmsgTruncNoBufSize.client_skip
3339 def _testCmsgTruncNoBufSize(self):
3340 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3341 self.sendToServer(MSG)
3342
3343 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3344 def testSingleCmsgTrunc0(self):
3345 # Check that no ancillary data is received when ancillary
3346 # buffer size is zero.
3347 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3348 ignoreflags=socket.MSG_CTRUNC)
3349
3350 @testSingleCmsgTrunc0.client_skip
3351 def _testSingleCmsgTrunc0(self):
3352 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3353 self.sendToServer(MSG)
3354
3355 # Check that no ancillary data is returned for various non-zero
3356 # (but still too small) buffer sizes.
3357
3358 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3359 def testSingleCmsgTrunc1(self):
3360 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3361
3362 @testSingleCmsgTrunc1.client_skip
3363 def _testSingleCmsgTrunc1(self):
3364 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3365 self.sendToServer(MSG)
3366
3367 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3368 def testSingleCmsgTrunc2Int(self):
3369 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3370
3371 @testSingleCmsgTrunc2Int.client_skip
3372 def _testSingleCmsgTrunc2Int(self):
3373 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3374 self.sendToServer(MSG)
3375
3376 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3377 def testSingleCmsgTruncLen0Minus1(self):
3378 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3379
3380 @testSingleCmsgTruncLen0Minus1.client_skip
3381 def _testSingleCmsgTruncLen0Minus1(self):
3382 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3383 self.sendToServer(MSG)
3384
3385 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3386 def testSingleCmsgTruncInData(self):
3387 # Test truncation of a control message inside its associated
3388 # data. The message may be returned with its data truncated,
3389 # or not returned at all.
3390 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3391 socket.IPV6_RECVHOPLIMIT, 1)
3392 self.misc_event.set()
3393 msg, ancdata, flags, addr = self.doRecvmsg(
3394 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3395
3396 self.assertEqual(msg, MSG)
3397 self.checkRecvmsgAddress(addr, self.cli_addr)
3398 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3399
3400 self.assertLessEqual(len(ancdata), 1)
3401 if ancdata:
3402 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3403 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3404 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3405 self.assertLess(len(cmsg_data), SIZEOF_INT)
3406
3407 @testSingleCmsgTruncInData.client_skip
3408 def _testSingleCmsgTruncInData(self):
3409 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3410 self.sendToServer(MSG)
3411
3412 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3413 # Receive traffic class and hop limit into ancbufsize bytes of
3414 # ancillary data space, which should be large enough to
3415 # contain the first item, but too small to contain the header
3416 # of the second. Check that data is MSG, MSG_CTRUNC is set
3417 # (unless included in ignoreflags), and only one ancillary
3418 # data item is returned.
3419 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3420 socket.IPV6_RECVHOPLIMIT, 1)
3421 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3422 socket.IPV6_RECVTCLASS, 1)
3423 self.misc_event.set()
3424 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3425 len(MSG), ancbufsize)
3426
3427 self.assertEqual(msg, MSG)
3428 self.checkRecvmsgAddress(addr, self.cli_addr)
3429 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3430 ignore=ignoreflags)
3431
3432 self.assertEqual(len(ancdata), 1)
3433 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3434 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3435 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3436 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3437 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003438 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003439 self.assertGreaterEqual(a[0], 0)
3440 self.assertLessEqual(a[0], 255)
3441
3442 # Try the above test with various buffer sizes.
3443
3444 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3445 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3446 def testSecondCmsgTrunc0(self):
3447 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3448 ignoreflags=socket.MSG_CTRUNC)
3449
3450 @testSecondCmsgTrunc0.client_skip
3451 def _testSecondCmsgTrunc0(self):
3452 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3453 self.sendToServer(MSG)
3454
3455 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3456 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3457 def testSecondCmsgTrunc1(self):
3458 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3459
3460 @testSecondCmsgTrunc1.client_skip
3461 def _testSecondCmsgTrunc1(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 testSecondCmsgTrunc2Int(self):
3468 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3469 2 * SIZEOF_INT)
3470
3471 @testSecondCmsgTrunc2Int.client_skip
3472 def _testSecondCmsgTrunc2Int(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 testSecondCmsgTruncLen0Minus1(self):
3479 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3480 socket.CMSG_LEN(0) - 1)
3481
3482 @testSecondCmsgTruncLen0Minus1.client_skip
3483 def _testSecondCmsgTruncLen0Minus1(self):
3484 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3485 self.sendToServer(MSG)
3486
3487 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3488 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3489 def testSecomdCmsgTruncInData(self):
3490 # Test truncation of the second of two control messages inside
3491 # its associated data.
3492 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3493 socket.IPV6_RECVHOPLIMIT, 1)
3494 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3495 socket.IPV6_RECVTCLASS, 1)
3496 self.misc_event.set()
3497 msg, ancdata, flags, addr = self.doRecvmsg(
3498 self.serv_sock, len(MSG),
3499 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3500
3501 self.assertEqual(msg, MSG)
3502 self.checkRecvmsgAddress(addr, self.cli_addr)
3503 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3504
3505 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3506
3507 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3508 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3509 cmsg_types.remove(cmsg_type)
3510 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3511 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003512 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003513 self.assertGreaterEqual(a[0], 0)
3514 self.assertLessEqual(a[0], 255)
3515
3516 if ancdata:
3517 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3518 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3519 cmsg_types.remove(cmsg_type)
3520 self.assertLess(len(cmsg_data), SIZEOF_INT)
3521
3522 self.assertEqual(ancdata, [])
3523
3524 @testSecomdCmsgTruncInData.client_skip
3525 def _testSecomdCmsgTruncInData(self):
3526 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3527 self.sendToServer(MSG)
3528
3529
3530# Derive concrete test classes for different socket types.
3531
3532class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3533 SendrecvmsgConnectionlessBase,
3534 ThreadedSocketTestMixin, UDPTestBase):
3535 pass
3536
3537@requireAttrs(socket.socket, "sendmsg")
3538@unittest.skipUnless(thread, 'Threading required for this test.')
3539class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3540 pass
3541
3542@requireAttrs(socket.socket, "recvmsg")
3543@unittest.skipUnless(thread, 'Threading required for this test.')
3544class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3545 pass
3546
3547@requireAttrs(socket.socket, "recvmsg_into")
3548@unittest.skipUnless(thread, 'Threading required for this test.')
3549class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3550 pass
3551
3552
3553class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3554 SendrecvmsgConnectionlessBase,
3555 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003556
3557 def checkRecvmsgAddress(self, addr1, addr2):
3558 # Called to compare the received address with the address of
3559 # the peer, ignoring scope ID
3560 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003561
3562@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003563@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003564@requireSocket("AF_INET6", "SOCK_DGRAM")
3565@unittest.skipUnless(thread, 'Threading required for this test.')
3566class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3567 pass
3568
3569@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003570@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003571@requireSocket("AF_INET6", "SOCK_DGRAM")
3572@unittest.skipUnless(thread, 'Threading required for this test.')
3573class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3574 pass
3575
3576@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003577@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003578@requireSocket("AF_INET6", "SOCK_DGRAM")
3579@unittest.skipUnless(thread, 'Threading required for this test.')
3580class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3581 pass
3582
3583@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003584@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003585@requireAttrs(socket, "IPPROTO_IPV6")
3586@requireSocket("AF_INET6", "SOCK_DGRAM")
3587@unittest.skipUnless(thread, 'Threading required for this test.')
3588class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3589 SendrecvmsgUDP6TestBase):
3590 pass
3591
3592@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003593@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003594@requireAttrs(socket, "IPPROTO_IPV6")
3595@requireSocket("AF_INET6", "SOCK_DGRAM")
3596@unittest.skipUnless(thread, 'Threading required for this test.')
3597class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3598 RFC3542AncillaryTest,
3599 SendrecvmsgUDP6TestBase):
3600 pass
3601
3602
3603class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3604 ConnectedStreamTestMixin, TCPTestBase):
3605 pass
3606
3607@requireAttrs(socket.socket, "sendmsg")
3608@unittest.skipUnless(thread, 'Threading required for this test.')
3609class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3610 pass
3611
3612@requireAttrs(socket.socket, "recvmsg")
3613@unittest.skipUnless(thread, 'Threading required for this test.')
3614class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3615 SendrecvmsgTCPTestBase):
3616 pass
3617
3618@requireAttrs(socket.socket, "recvmsg_into")
3619@unittest.skipUnless(thread, 'Threading required for this test.')
3620class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3621 SendrecvmsgTCPTestBase):
3622 pass
3623
3624
3625class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3626 SendrecvmsgConnectedBase,
3627 ConnectedStreamTestMixin, SCTPStreamBase):
3628 pass
3629
3630@requireAttrs(socket.socket, "sendmsg")
3631@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3632@unittest.skipUnless(thread, 'Threading required for this test.')
3633class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3634 pass
3635
3636@requireAttrs(socket.socket, "recvmsg")
3637@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3638@unittest.skipUnless(thread, 'Threading required for this test.')
3639class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3640 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003641
3642 def testRecvmsgEOF(self):
3643 try:
3644 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3645 except OSError as e:
3646 if e.errno != errno.ENOTCONN:
3647 raise
3648 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003649
3650@requireAttrs(socket.socket, "recvmsg_into")
3651@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3652@unittest.skipUnless(thread, 'Threading required for this test.')
3653class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3654 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003655
3656 def testRecvmsgEOF(self):
3657 try:
3658 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3659 except OSError as e:
3660 if e.errno != errno.ENOTCONN:
3661 raise
3662 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003663
3664
3665class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3666 ConnectedStreamTestMixin, UnixStreamBase):
3667 pass
3668
3669@requireAttrs(socket.socket, "sendmsg")
3670@requireAttrs(socket, "AF_UNIX")
3671@unittest.skipUnless(thread, 'Threading required for this test.')
3672class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3673 pass
3674
3675@requireAttrs(socket.socket, "recvmsg")
3676@requireAttrs(socket, "AF_UNIX")
3677@unittest.skipUnless(thread, 'Threading required for this test.')
3678class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3679 SendrecvmsgUnixStreamTestBase):
3680 pass
3681
3682@requireAttrs(socket.socket, "recvmsg_into")
3683@requireAttrs(socket, "AF_UNIX")
3684@unittest.skipUnless(thread, 'Threading required for this test.')
3685class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3686 SendrecvmsgUnixStreamTestBase):
3687 pass
3688
3689@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3690@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3691@unittest.skipUnless(thread, 'Threading required for this test.')
3692class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3693 pass
3694
3695@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3696@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3697@unittest.skipUnless(thread, 'Threading required for this test.')
3698class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3699 SendrecvmsgUnixStreamTestBase):
3700 pass
3701
3702
3703# Test interrupting the interruptible send/receive methods with a
3704# signal when a timeout is set. These tests avoid having multiple
3705# threads alive during the test so that the OS cannot deliver the
3706# signal to the wrong one.
3707
3708class InterruptedTimeoutBase(unittest.TestCase):
3709 # Base class for interrupted send/receive tests. Installs an
3710 # empty handler for SIGALRM and removes it on teardown, along with
3711 # any scheduled alarms.
3712
3713 def setUp(self):
3714 super().setUp()
3715 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003716 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003717 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3718 self.addCleanup(self.setAlarm, 0)
3719
3720 # Timeout for socket operations
3721 timeout = 4.0
3722
3723 # Provide setAlarm() method to schedule delivery of SIGALRM after
3724 # given number of seconds, or cancel it if zero, and an
3725 # appropriate time value to use. Use setitimer() if available.
3726 if hasattr(signal, "setitimer"):
3727 alarm_time = 0.05
3728
3729 def setAlarm(self, seconds):
3730 signal.setitimer(signal.ITIMER_REAL, seconds)
3731 else:
3732 # Old systems may deliver the alarm up to one second early
3733 alarm_time = 2
3734
3735 def setAlarm(self, seconds):
3736 signal.alarm(seconds)
3737
3738
3739# Require siginterrupt() in order to ensure that system calls are
3740# interrupted by default.
3741@requireAttrs(signal, "siginterrupt")
3742@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3743 "Don't have signal.alarm or signal.setitimer")
3744class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3745 # Test interrupting the recv*() methods with signals when a
3746 # timeout is set.
3747
3748 def setUp(self):
3749 super().setUp()
3750 self.serv.settimeout(self.timeout)
3751
3752 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003753 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003754 # errno of EINTR when interrupted by a signal.
3755 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003756 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003757 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003758
3759 def testInterruptedRecvTimeout(self):
3760 self.checkInterruptedRecv(self.serv.recv, 1024)
3761
3762 def testInterruptedRecvIntoTimeout(self):
3763 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3764
3765 def testInterruptedRecvfromTimeout(self):
3766 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3767
3768 def testInterruptedRecvfromIntoTimeout(self):
3769 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3770
3771 @requireAttrs(socket.socket, "recvmsg")
3772 def testInterruptedRecvmsgTimeout(self):
3773 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3774
3775 @requireAttrs(socket.socket, "recvmsg_into")
3776 def testInterruptedRecvmsgIntoTimeout(self):
3777 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3778
3779
3780# Require siginterrupt() in order to ensure that system calls are
3781# interrupted by default.
3782@requireAttrs(signal, "siginterrupt")
3783@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3784 "Don't have signal.alarm or signal.setitimer")
3785@unittest.skipUnless(thread, 'Threading required for this test.')
3786class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3787 ThreadSafeCleanupTestCase,
3788 SocketListeningTestMixin, TCPTestBase):
3789 # Test interrupting the interruptible send*() methods with signals
3790 # when a timeout is set.
3791
3792 def setUp(self):
3793 super().setUp()
3794 self.serv_conn = self.newSocket()
3795 self.addCleanup(self.serv_conn.close)
3796 # Use a thread to complete the connection, but wait for it to
3797 # terminate before running the test, so that there is only one
3798 # thread to accept the signal.
3799 cli_thread = threading.Thread(target=self.doConnect)
3800 cli_thread.start()
3801 self.cli_conn, addr = self.serv.accept()
3802 self.addCleanup(self.cli_conn.close)
3803 cli_thread.join()
3804 self.serv_conn.settimeout(self.timeout)
3805
3806 def doConnect(self):
3807 self.serv_conn.connect(self.serv_addr)
3808
3809 def checkInterruptedSend(self, func, *args, **kwargs):
3810 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003811 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003812 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003813 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003814 while True:
3815 self.setAlarm(self.alarm_time)
3816 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003817
Ned Deilyc5640382014-02-03 13:58:31 -08003818 # Issue #12958: The following tests have problems on OS X prior to 10.7
3819 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003820 def testInterruptedSendTimeout(self):
3821 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3822
Ned Deilyc5640382014-02-03 13:58:31 -08003823 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003824 def testInterruptedSendtoTimeout(self):
3825 # Passing an actual address here as Python's wrapper for
3826 # sendto() doesn't allow passing a zero-length one; POSIX
3827 # requires that the address is ignored since the socket is
3828 # connection-mode, however.
3829 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3830 self.serv_addr)
3831
Ned Deilyc5640382014-02-03 13:58:31 -08003832 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003833 @requireAttrs(socket.socket, "sendmsg")
3834 def testInterruptedSendmsgTimeout(self):
3835 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3836
3837
Victor Stinner45df8202010-04-28 22:31:17 +00003838@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003839class TCPCloserTest(ThreadedTCPSocketTest):
3840
3841 def testClose(self):
3842 conn, addr = self.serv.accept()
3843 conn.close()
3844
3845 sd = self.cli
3846 read, write, err = select.select([sd], [], [], 1.0)
3847 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003848 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003849
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003850 # Calling close() many times should be safe.
3851 conn.close()
3852 conn.close()
3853
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003854 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003855 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003856 time.sleep(1.0)
3857
Victor Stinner45df8202010-04-28 22:31:17 +00003858@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003859class BasicSocketPairTest(SocketPairTest):
3860
3861 def __init__(self, methodName='runTest'):
3862 SocketPairTest.__init__(self, methodName=methodName)
3863
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003864 def _check_defaults(self, sock):
3865 self.assertIsInstance(sock, socket.socket)
3866 if hasattr(socket, 'AF_UNIX'):
3867 self.assertEqual(sock.family, socket.AF_UNIX)
3868 else:
3869 self.assertEqual(sock.family, socket.AF_INET)
3870 self.assertEqual(sock.type, socket.SOCK_STREAM)
3871 self.assertEqual(sock.proto, 0)
3872
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003873 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003874 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003875
3876 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003877 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003878
Dave Cole331708b2004-08-09 04:51:41 +00003879 def testRecv(self):
3880 msg = self.serv.recv(1024)
3881 self.assertEqual(msg, MSG)
3882
3883 def _testRecv(self):
3884 self.cli.send(MSG)
3885
3886 def testSend(self):
3887 self.serv.send(MSG)
3888
3889 def _testSend(self):
3890 msg = self.cli.recv(1024)
3891 self.assertEqual(msg, MSG)
3892
Victor Stinner45df8202010-04-28 22:31:17 +00003893@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003894class NonBlockingTCPTests(ThreadedTCPSocketTest):
3895
3896 def __init__(self, methodName='runTest'):
3897 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3898
3899 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003900 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003901 self.serv.setblocking(True)
3902 self.assertIsNone(self.serv.gettimeout())
3903 self.serv.setblocking(False)
3904 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003905 start = time.time()
3906 try:
3907 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003908 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003909 pass
3910 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003911 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003912
3913 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003914 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003915
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003916 @support.cpython_only
3917 def testSetBlocking_overflow(self):
3918 # Issue 15989
3919 import _testcapi
3920 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3921 self.skipTest('needs UINT_MAX < ULONG_MAX')
3922 self.serv.setblocking(False)
3923 self.assertEqual(self.serv.gettimeout(), 0.0)
3924 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3925 self.assertIsNone(self.serv.gettimeout())
3926
3927 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3928
Serhiy Storchaka43767632013-11-03 21:31:38 +02003929 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3930 'test needs socket.SOCK_NONBLOCK')
3931 @support.requires_linux_version(2, 6, 28)
3932 def testInitNonBlocking(self):
3933 # reinit server socket
3934 self.serv.close()
3935 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3936 socket.SOCK_NONBLOCK)
3937 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003938 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003939 # actual testing
3940 start = time.time()
3941 try:
3942 self.serv.accept()
3943 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003944 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003945 end = time.time()
3946 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3947
3948 def _testInitNonBlocking(self):
3949 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003950
Antoine Pitrou600232b2011-01-05 21:03:42 +00003951 def testInheritFlags(self):
3952 # Issue #7995: when calling accept() on a listening socket with a
3953 # timeout, the resulting socket should not be non-blocking.
3954 self.serv.settimeout(10)
3955 try:
3956 conn, addr = self.serv.accept()
3957 message = conn.recv(len(MSG))
3958 finally:
3959 conn.close()
3960 self.serv.settimeout(None)
3961
3962 def _testInheritFlags(self):
3963 time.sleep(0.1)
3964 self.cli.connect((HOST, self.port))
3965 time.sleep(0.5)
3966 self.cli.send(MSG)
3967
Guido van Rossum24e4af82002-06-12 19:18:08 +00003968 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003969 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003970 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003971 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003972 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003973 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003974 pass
3975 else:
3976 self.fail("Error trying to do non-blocking accept.")
3977 read, write, err = select.select([self.serv], [], [])
3978 if self.serv in read:
3979 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07003980 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00003981 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003982 else:
3983 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003984
Guido van Rossum24e4af82002-06-12 19:18:08 +00003985 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003986 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003987 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003988
3989 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003990 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003991 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003992 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003993
3994 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003995 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003996 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003997
3998 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003999 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004000 conn, addr = self.serv.accept()
4001 conn.setblocking(0)
4002 try:
4003 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02004004 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004005 pass
4006 else:
4007 self.fail("Error trying to do non-blocking recv.")
4008 read, write, err = select.select([conn], [], [])
4009 if conn in read:
4010 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004011 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00004012 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004013 else:
4014 self.fail("Error during select call to non-blocking socket.")
4015
4016 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004017 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004018 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004019 self.cli.send(MSG)
4020
Victor Stinner45df8202010-04-28 22:31:17 +00004021@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00004022class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004023 """Unit tests for the object returned by socket.makefile()
4024
Antoine Pitrou834bd812010-10-13 16:17:14 +00004025 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004026 the client connection. You can read from this file to
4027 get output from the server.
4028
Antoine Pitrou834bd812010-10-13 16:17:14 +00004029 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004030 server connection. You can write to this file to send output
4031 to the client.
4032 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004033
Guido van Rossume9f66142002-08-07 15:46:19 +00004034 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004035 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004036 errors = 'strict'
4037 newline = None
4038
4039 read_mode = 'rb'
4040 read_msg = MSG
4041 write_mode = 'wb'
4042 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004043
Guido van Rossum24e4af82002-06-12 19:18:08 +00004044 def __init__(self, methodName='runTest'):
4045 SocketConnectedTest.__init__(self, methodName=methodName)
4046
4047 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004048 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4049 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004050 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004051 self.read_file = self.cli_conn.makefile(
4052 self.read_mode, self.bufsize,
4053 encoding = self.encoding,
4054 errors = self.errors,
4055 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004056
4057 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004058 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004059 self.read_file.close()
4060 self.assertTrue(self.read_file.closed)
4061 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004062 SocketConnectedTest.tearDown(self)
4063
4064 def clientSetUp(self):
4065 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004066 self.write_file = self.serv_conn.makefile(
4067 self.write_mode, self.bufsize,
4068 encoding = self.encoding,
4069 errors = self.errors,
4070 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004071
4072 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004073 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004074 self.write_file.close()
4075 self.assertTrue(self.write_file.closed)
4076 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004077 SocketConnectedTest.clientTearDown(self)
4078
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004079 def testReadAfterTimeout(self):
4080 # Issue #7322: A file object must disallow further reads
4081 # after a timeout has occurred.
4082 self.cli_conn.settimeout(1)
4083 self.read_file.read(3)
4084 # First read raises a timeout
4085 self.assertRaises(socket.timeout, self.read_file.read, 1)
4086 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004087 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004088 self.read_file.read(1)
4089 self.assertIn("cannot read from timed out object", str(ctx.exception))
4090
4091 def _testReadAfterTimeout(self):
4092 self.write_file.write(self.write_msg[0:3])
4093 self.write_file.flush()
4094 self.serv_finished.wait()
4095
Guido van Rossum24e4af82002-06-12 19:18:08 +00004096 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004097 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004098 first_seg = self.read_file.read(len(self.read_msg)-3)
4099 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004100 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004101 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004102
4103 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004104 self.write_file.write(self.write_msg)
4105 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004106
Guido van Rossum8c943832002-08-08 01:00:28 +00004107 def testFullRead(self):
4108 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004109 msg = self.read_file.read()
4110 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004111
4112 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004113 self.write_file.write(self.write_msg)
4114 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004115
Guido van Rossum24e4af82002-06-12 19:18:08 +00004116 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004117 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004118 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004119 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004120 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004121 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004122 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004123 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004124 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004125
4126 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004127 self.write_file.write(self.write_msg)
4128 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004129
4130 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004131 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004132 line = self.read_file.readline()
4133 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004134
4135 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004136 self.write_file.write(self.write_msg)
4137 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004138
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004139 def testCloseAfterMakefile(self):
4140 # The file returned by makefile should keep the socket open.
4141 self.cli_conn.close()
4142 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004143 msg = self.read_file.read()
4144 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004145
4146 def _testCloseAfterMakefile(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
4150 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004151 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004152 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004153 if isinstance(self.read_msg, str):
4154 msg = msg.decode()
4155 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004156
4157 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004158 self.write_file.write(self.write_msg)
4159 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004160
Tim Peters116d83c2004-03-28 02:20:45 +00004161 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004162 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004163
4164 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004165 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004166
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004167 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004168 self.assertEqual(self.read_file.mode, self.read_mode)
4169 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004170
4171 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004172 self.assertEqual(self.write_file.mode, self.write_mode)
4173 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004174
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004175 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004176 self.read_file.close()
4177 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004178 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004179 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004180
4181 def _testRealClose(self):
4182 pass
4183
4184
Guido van Rossume9f66142002-08-07 15:46:19 +00004185class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4186
4187 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004188
Guido van Rossume9f66142002-08-07 15:46:19 +00004189 In this case (and in this case only), it should be possible to
4190 create a file object, read a line from it, create another file
4191 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004192 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004193 when reading multiple requests from the same socket."""
4194
4195 bufsize = 0 # Use unbuffered mode
4196
4197 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004198 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004199 line = self.read_file.readline() # first line
4200 self.assertEqual(line, b"A. " + self.write_msg) # first line
4201 self.read_file = self.cli_conn.makefile('rb', 0)
4202 line = self.read_file.readline() # second line
4203 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004204
4205 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004206 self.write_file.write(b"A. " + self.write_msg)
4207 self.write_file.write(b"B. " + self.write_msg)
4208 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004209
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004210 def testMakefileClose(self):
4211 # The file returned by makefile should keep the socket open...
4212 self.cli_conn.close()
4213 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004214 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004215 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004216 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004217 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004218
4219 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004220 self.write_file.write(self.write_msg)
4221 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004222
4223 def testMakefileCloseSocketDestroy(self):
4224 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004225 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004226 refcount_after = sys.getrefcount(self.cli_conn)
4227 self.assertEqual(refcount_before - 1, refcount_after)
4228
4229 def _testMakefileCloseSocketDestroy(self):
4230 pass
4231
Antoine Pitrou98b46702010-09-18 22:59:00 +00004232 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004233 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004234 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4235
4236 def testSmallReadNonBlocking(self):
4237 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004238 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4239 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004240 self.evt1.set()
4241 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004242 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004243 if first_seg is None:
4244 # Data not arrived (can happen under Windows), wait a bit
4245 time.sleep(0.5)
4246 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004247 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004248 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004249 self.assertEqual(n, 3)
4250 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004251 self.assertEqual(msg, self.read_msg)
4252 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4253 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004254
4255 def _testSmallReadNonBlocking(self):
4256 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004257 self.write_file.write(self.write_msg)
4258 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004259 self.evt2.set()
4260 # Avoid cloding the socket before the server test has finished,
4261 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4262 self.serv_finished.wait(5.0)
4263
4264 def testWriteNonBlocking(self):
4265 self.cli_finished.wait(5.0)
4266 # The client thread can't skip directly - the SkipTest exception
4267 # would appear as a failure.
4268 if self.serv_skipped:
4269 self.skipTest(self.serv_skipped)
4270
4271 def _testWriteNonBlocking(self):
4272 self.serv_skipped = None
4273 self.serv_conn.setblocking(False)
4274 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004275 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004276 LIMIT = 10
4277 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004278 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004279 self.assertGreater(n, 0)
4280 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004281 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004282 if n is None:
4283 # Succeeded
4284 break
4285 self.assertGreater(n, 0)
4286 else:
4287 # Let us know that this test didn't manage to establish
4288 # the expected conditions. This is not a failure in itself but,
4289 # if it happens repeatedly, the test should be fixed.
4290 self.serv_skipped = "failed to saturate the socket buffer"
4291
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004292
Guido van Rossum8c943832002-08-08 01:00:28 +00004293class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4294
4295 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4296
4297
4298class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4299
4300 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004301
Thomas Woutersb2137042007-02-01 18:02:27 +00004302
Antoine Pitrou834bd812010-10-13 16:17:14 +00004303class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4304 """Tests for socket.makefile() in text mode (rather than binary)"""
4305
4306 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004307 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004308 write_mode = 'wb'
4309 write_msg = MSG
4310 newline = ''
4311
4312
4313class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4314 """Tests for socket.makefile() in text mode (rather than binary)"""
4315
4316 read_mode = 'rb'
4317 read_msg = MSG
4318 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004319 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004320 newline = ''
4321
4322
4323class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4324 """Tests for socket.makefile() in text mode (rather than binary)"""
4325
4326 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004327 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004328 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004329 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004330 newline = ''
4331
4332
Guido van Rossumd8faa362007-04-27 19:54:29 +00004333class NetworkConnectionTest(object):
4334 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004335
Guido van Rossumd8faa362007-04-27 19:54:29 +00004336 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004337 # We're inherited below by BasicTCPTest2, which also inherits
4338 # BasicTCPTest, which defines self.port referenced below.
4339 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004340 self.serv_conn = self.cli
4341
4342class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4343 """Tests that NetworkConnection does not break existing TCP functionality.
4344 """
4345
4346class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004347
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004348 class MockSocket(socket.socket):
4349 def connect(self, *args):
4350 raise socket.timeout('timed out')
4351
4352 @contextlib.contextmanager
4353 def mocked_socket_module(self):
4354 """Return a socket which times out on connect"""
4355 old_socket = socket.socket
4356 socket.socket = self.MockSocket
4357 try:
4358 yield
4359 finally:
4360 socket.socket = old_socket
4361
4362 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004363 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004364 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004365 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004366 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004367 cli.connect((HOST, port))
4368 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4369
4370 def test_create_connection(self):
4371 # Issue #9792: errors raised by create_connection() should have
4372 # a proper errno attribute.
4373 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004374 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004375 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004376
4377 # Issue #16257: create_connection() calls getaddrinfo() against
4378 # 'localhost'. This may result in an IPV6 addr being returned
4379 # as well as an IPV4 one:
4380 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4381 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4382 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4383 #
4384 # create_connection() enumerates through all the addresses returned
4385 # and if it doesn't successfully bind to any of them, it propagates
4386 # the last exception it encountered.
4387 #
4388 # On Solaris, ENETUNREACH is returned in this circumstance instead
4389 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4390 # expected errnos.
4391 expected_errnos = [ errno.ECONNREFUSED, ]
4392 if hasattr(errno, 'ENETUNREACH'):
4393 expected_errnos.append(errno.ENETUNREACH)
4394
4395 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004396
4397 def test_create_connection_timeout(self):
4398 # Issue #9792: create_connection() should not recast timeout errors
4399 # as generic socket errors.
4400 with self.mocked_socket_module():
4401 with self.assertRaises(socket.timeout):
4402 socket.create_connection((HOST, 1234))
4403
Guido van Rossumd8faa362007-04-27 19:54:29 +00004404
Victor Stinner45df8202010-04-28 22:31:17 +00004405@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004406class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4407
4408 def __init__(self, methodName='runTest'):
4409 SocketTCPTest.__init__(self, methodName=methodName)
4410 ThreadableTest.__init__(self)
4411
4412 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004413 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004414
4415 def clientTearDown(self):
4416 self.cli.close()
4417 self.cli = None
4418 ThreadableTest.clientTearDown(self)
4419
4420 def _justAccept(self):
4421 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004422 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004423
4424 testFamily = _justAccept
4425 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004426 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004427 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004428 self.assertEqual(self.cli.family, 2)
4429
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004430 testSourceAddress = _justAccept
4431 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004432 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4433 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004434 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004435 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004436 # The port number being used is sufficient to show that the bind()
4437 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004438
Guido van Rossumd8faa362007-04-27 19:54:29 +00004439 testTimeoutDefault = _justAccept
4440 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004441 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004442 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004443 socket.setdefaulttimeout(42)
4444 try:
4445 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004446 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004447 finally:
4448 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004449 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004450
4451 testTimeoutNone = _justAccept
4452 def _testTimeoutNone(self):
4453 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004454 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004455 socket.setdefaulttimeout(30)
4456 try:
4457 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004458 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004459 finally:
4460 socket.setdefaulttimeout(None)
4461 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004462
4463 testTimeoutValueNamed = _justAccept
4464 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004465 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004466 self.assertEqual(self.cli.gettimeout(), 30)
4467
4468 testTimeoutValueNonamed = _justAccept
4469 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004470 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004471 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004472 self.assertEqual(self.cli.gettimeout(), 30)
4473
Victor Stinner45df8202010-04-28 22:31:17 +00004474@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004475class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4476
4477 def __init__(self, methodName='runTest'):
4478 SocketTCPTest.__init__(self, methodName=methodName)
4479 ThreadableTest.__init__(self)
4480
4481 def clientSetUp(self):
4482 pass
4483
4484 def clientTearDown(self):
4485 self.cli.close()
4486 self.cli = None
4487 ThreadableTest.clientTearDown(self)
4488
4489 def testInsideTimeout(self):
4490 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004491 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004492 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004493 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004494 testOutsideTimeout = testInsideTimeout
4495
4496 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004497 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004498 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004499 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004500
4501 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004502 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004503 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004504
4505
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004506class TCPTimeoutTest(SocketTCPTest):
4507
4508 def testTCPTimeout(self):
4509 def raise_timeout(*args, **kwargs):
4510 self.serv.settimeout(1.0)
4511 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004512 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004513 "Error generating a timeout exception (TCP)")
4514
4515 def testTimeoutZero(self):
4516 ok = False
4517 try:
4518 self.serv.settimeout(0.0)
4519 foo = self.serv.accept()
4520 except socket.timeout:
4521 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004522 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004523 ok = True
4524 except:
4525 self.fail("caught unexpected exception (TCP)")
4526 if not ok:
4527 self.fail("accept() returned success when we did not expect it")
4528
Serhiy Storchaka43767632013-11-03 21:31:38 +02004529 @unittest.skipUnless(hasattr(signal, 'alarm'),
4530 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004531 def testInterruptedTimeout(self):
4532 # XXX I don't know how to do this test on MSWindows or any other
4533 # plaform that doesn't support signal.alarm() or os.kill(), though
4534 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004535 self.serv.settimeout(5.0) # must be longer than alarm
4536 class Alarm(Exception):
4537 pass
4538 def alarm_handler(signal, frame):
4539 raise Alarm
4540 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4541 try:
4542 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4543 try:
4544 foo = self.serv.accept()
4545 except socket.timeout:
4546 self.fail("caught timeout instead of Alarm")
4547 except Alarm:
4548 pass
4549 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004550 self.fail("caught other exception instead of Alarm:"
4551 " %s(%s):\n%s" %
4552 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004553 else:
4554 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004555 finally:
4556 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004557 except Alarm:
4558 self.fail("got Alarm in wrong place")
4559 finally:
4560 # no alarm can be pending. Safe to restore old handler.
4561 signal.signal(signal.SIGALRM, old_alarm)
4562
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004563class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004564
4565 def testUDPTimeout(self):
4566 def raise_timeout(*args, **kwargs):
4567 self.serv.settimeout(1.0)
4568 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004569 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004570 "Error generating a timeout exception (UDP)")
4571
4572 def testTimeoutZero(self):
4573 ok = False
4574 try:
4575 self.serv.settimeout(0.0)
4576 foo = self.serv.recv(1024)
4577 except socket.timeout:
4578 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004579 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004580 ok = True
4581 except:
4582 self.fail("caught unexpected exception (UDP)")
4583 if not ok:
4584 self.fail("recv() returned success when we did not expect it")
4585
4586class TestExceptions(unittest.TestCase):
4587
4588 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004589 self.assertTrue(issubclass(OSError, Exception))
4590 self.assertTrue(issubclass(socket.herror, OSError))
4591 self.assertTrue(issubclass(socket.gaierror, OSError))
4592 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004593
Yury Selivanovfa22b292016-10-18 16:03:52 -04004594 def test_setblocking_invalidfd(self):
4595 # Regression test for issue #28471
4596
4597 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4598 sock = socket.socket(
4599 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4600 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004601 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004602
4603 with self.assertRaises(OSError):
4604 sock.setblocking(False)
4605
4606
Serhiy Storchaka43767632013-11-03 21:31:38 +02004607@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004608class TestLinuxAbstractNamespace(unittest.TestCase):
4609
4610 UNIX_PATH_MAX = 108
4611
4612 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004613 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004614 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4615 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004616 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004617 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4618 s2.connect(s1.getsockname())
4619 with s1.accept()[0] as s3:
4620 self.assertEqual(s1.getsockname(), address)
4621 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004622
4623 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004624 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004625 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4626 s.bind(address)
4627 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004628
4629 def testNameOverflow(self):
4630 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004631 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004632 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004633
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004634 def testStrName(self):
4635 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004636 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4637 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004638 s.bind("\x00python\x00test\x00")
4639 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004640 finally:
4641 s.close()
4642
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004643 def testBytearrayName(self):
4644 # Check that an abstract name can be passed as a bytearray.
4645 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4646 s.bind(bytearray(b"\x00python\x00test\x00"))
4647 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4648
Serhiy Storchaka43767632013-11-03 21:31:38 +02004649@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004650class TestUnixDomain(unittest.TestCase):
4651
4652 def setUp(self):
4653 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4654
4655 def tearDown(self):
4656 self.sock.close()
4657
4658 def encoded(self, path):
4659 # Return the given path encoded in the file system encoding,
4660 # or skip the test if this is not possible.
4661 try:
4662 return os.fsencode(path)
4663 except UnicodeEncodeError:
4664 self.skipTest(
4665 "Pathname {0!a} cannot be represented in file "
4666 "system encoding {1!r}".format(
4667 path, sys.getfilesystemencoding()))
4668
Antoine Pitrou16374872011-12-16 15:04:12 +01004669 def bind(self, sock, path):
4670 # Bind the socket
4671 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004672 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004673 except OSError as e:
4674 if str(e) == "AF_UNIX path too long":
4675 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004676 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004677 .format(path))
4678 else:
4679 raise
4680
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004681 def testStrAddr(self):
4682 # Test binding to and retrieving a normal string pathname.
4683 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004684 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004685 self.addCleanup(support.unlink, path)
4686 self.assertEqual(self.sock.getsockname(), path)
4687
4688 def testBytesAddr(self):
4689 # Test binding to a bytes pathname.
4690 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004691 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004692 self.addCleanup(support.unlink, path)
4693 self.assertEqual(self.sock.getsockname(), path)
4694
4695 def testSurrogateescapeBind(self):
4696 # Test binding to a valid non-ASCII pathname, with the
4697 # non-ASCII bytes supplied using surrogateescape encoding.
4698 path = os.path.abspath(support.TESTFN_UNICODE)
4699 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004700 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004701 self.addCleanup(support.unlink, path)
4702 self.assertEqual(self.sock.getsockname(), path)
4703
4704 def testUnencodableAddr(self):
4705 # Test binding to a pathname that cannot be encoded in the
4706 # file system encoding.
4707 if support.TESTFN_UNENCODABLE is None:
4708 self.skipTest("No unencodable filename available")
4709 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004710 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004711 self.addCleanup(support.unlink, path)
4712 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004713
Victor Stinner45df8202010-04-28 22:31:17 +00004714@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004715class BufferIOTest(SocketConnectedTest):
4716 """
4717 Test the buffer versions of socket.recv() and socket.send().
4718 """
4719 def __init__(self, methodName='runTest'):
4720 SocketConnectedTest.__init__(self, methodName=methodName)
4721
Antoine Pitrou25480782010-03-17 22:50:28 +00004722 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004723 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004724 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004725 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004726 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004727 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004728 self.assertEqual(msg, MSG)
4729
Antoine Pitrou25480782010-03-17 22:50:28 +00004730 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004731 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004732 self.serv_conn.send(buf)
4733
Antoine Pitrou25480782010-03-17 22:50:28 +00004734 def testRecvIntoBytearray(self):
4735 buf = bytearray(1024)
4736 nbytes = self.cli_conn.recv_into(buf)
4737 self.assertEqual(nbytes, len(MSG))
4738 msg = buf[:len(MSG)]
4739 self.assertEqual(msg, MSG)
4740
4741 _testRecvIntoBytearray = _testRecvIntoArray
4742
4743 def testRecvIntoMemoryview(self):
4744 buf = bytearray(1024)
4745 nbytes = self.cli_conn.recv_into(memoryview(buf))
4746 self.assertEqual(nbytes, len(MSG))
4747 msg = buf[:len(MSG)]
4748 self.assertEqual(msg, MSG)
4749
4750 _testRecvIntoMemoryview = _testRecvIntoArray
4751
4752 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004753 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004754 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004755 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004756 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004757 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004758 self.assertEqual(msg, MSG)
4759
Antoine Pitrou25480782010-03-17 22:50:28 +00004760 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004761 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004762 self.serv_conn.send(buf)
4763
Antoine Pitrou25480782010-03-17 22:50:28 +00004764 def testRecvFromIntoBytearray(self):
4765 buf = bytearray(1024)
4766 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4767 self.assertEqual(nbytes, len(MSG))
4768 msg = buf[:len(MSG)]
4769 self.assertEqual(msg, MSG)
4770
4771 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4772
4773 def testRecvFromIntoMemoryview(self):
4774 buf = bytearray(1024)
4775 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4776 self.assertEqual(nbytes, len(MSG))
4777 msg = buf[:len(MSG)]
4778 self.assertEqual(msg, MSG)
4779
4780 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4781
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004782 def testRecvFromIntoSmallBuffer(self):
4783 # See issue #20246.
4784 buf = bytearray(8)
4785 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4786
4787 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004788 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004789
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004790 def testRecvFromIntoEmptyBuffer(self):
4791 buf = bytearray()
4792 self.cli_conn.recvfrom_into(buf)
4793 self.cli_conn.recvfrom_into(buf, 0)
4794
4795 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4796
Christian Heimes043d6f62008-01-07 17:19:16 +00004797
4798TIPC_STYPE = 2000
4799TIPC_LOWER = 200
4800TIPC_UPPER = 210
4801
4802def isTipcAvailable():
4803 """Check if the TIPC module is loaded
4804
4805 The TIPC module is not loaded automatically on Ubuntu and probably
4806 other Linux distros.
4807 """
4808 if not hasattr(socket, "AF_TIPC"):
4809 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004810 try:
4811 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00004812 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00004813 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00004814 # have not the permission to read it.
4815 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004816 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00004817 for line in f:
4818 if line.startswith("tipc "):
4819 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004820 return False
4821
Serhiy Storchaka43767632013-11-03 21:31:38 +02004822@unittest.skipUnless(isTipcAvailable(),
4823 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004824class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004825 def testRDM(self):
4826 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4827 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004828 self.addCleanup(srv.close)
4829 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004830
4831 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4832 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4833 TIPC_LOWER, TIPC_UPPER)
4834 srv.bind(srvaddr)
4835
4836 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4837 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4838 cli.sendto(MSG, sendaddr)
4839
4840 msg, recvaddr = srv.recvfrom(1024)
4841
4842 self.assertEqual(cli.getsockname(), recvaddr)
4843 self.assertEqual(msg, MSG)
4844
4845
Serhiy Storchaka43767632013-11-03 21:31:38 +02004846@unittest.skipUnless(isTipcAvailable(),
4847 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004848class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004849 def __init__(self, methodName = 'runTest'):
4850 unittest.TestCase.__init__(self, methodName = methodName)
4851 ThreadableTest.__init__(self)
4852
4853 def setUp(self):
4854 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004855 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004856 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4857 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4858 TIPC_LOWER, TIPC_UPPER)
4859 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004860 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004861 self.serverExplicitReady()
4862 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004863 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004864
4865 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00004866 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00004867 # accept() call; sleep a little while to avoid it, otherwise
4868 # we could get an exception
4869 time.sleep(0.1)
4870 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004871 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004872 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4873 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4874 self.cli.connect(addr)
4875 self.cliaddr = self.cli.getsockname()
4876
4877 def testStream(self):
4878 msg = self.conn.recv(1024)
4879 self.assertEqual(msg, MSG)
4880 self.assertEqual(self.cliaddr, self.connaddr)
4881
4882 def _testStream(self):
4883 self.cli.send(MSG)
4884 self.cli.close()
4885
4886
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004887@unittest.skipUnless(thread, 'Threading required for this test.')
4888class ContextManagersTest(ThreadedTCPSocketTest):
4889
4890 def _testSocketClass(self):
4891 # base test
4892 with socket.socket() as sock:
4893 self.assertFalse(sock._closed)
4894 self.assertTrue(sock._closed)
4895 # close inside with block
4896 with socket.socket() as sock:
4897 sock.close()
4898 self.assertTrue(sock._closed)
4899 # exception inside with block
4900 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004901 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004902 self.assertTrue(sock._closed)
4903
4904 def testCreateConnectionBase(self):
4905 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004906 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004907 data = conn.recv(1024)
4908 conn.sendall(data)
4909
4910 def _testCreateConnectionBase(self):
4911 address = self.serv.getsockname()
4912 with socket.create_connection(address) as sock:
4913 self.assertFalse(sock._closed)
4914 sock.sendall(b'foo')
4915 self.assertEqual(sock.recv(1024), b'foo')
4916 self.assertTrue(sock._closed)
4917
4918 def testCreateConnectionClose(self):
4919 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004920 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004921 data = conn.recv(1024)
4922 conn.sendall(data)
4923
4924 def _testCreateConnectionClose(self):
4925 address = self.serv.getsockname()
4926 with socket.create_connection(address) as sock:
4927 sock.close()
4928 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004929 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004930
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004931
Victor Stinnerdaf45552013-08-28 00:53:59 +02004932class InheritanceTest(unittest.TestCase):
4933 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4934 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004935 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004936 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004937 with socket.socket(socket.AF_INET,
4938 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4939 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004940 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004941
4942 def test_default_inheritable(self):
4943 sock = socket.socket()
4944 with sock:
4945 self.assertEqual(sock.get_inheritable(), False)
4946
4947 def test_dup(self):
4948 sock = socket.socket()
4949 with sock:
4950 newsock = sock.dup()
4951 sock.close()
4952 with newsock:
4953 self.assertEqual(newsock.get_inheritable(), False)
4954
4955 def test_set_inheritable(self):
4956 sock = socket.socket()
4957 with sock:
4958 sock.set_inheritable(True)
4959 self.assertEqual(sock.get_inheritable(), True)
4960
4961 sock.set_inheritable(False)
4962 self.assertEqual(sock.get_inheritable(), False)
4963
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004964 @unittest.skipIf(fcntl is None, "need fcntl")
4965 def test_get_inheritable_cloexec(self):
4966 sock = socket.socket()
4967 with sock:
4968 fd = sock.fileno()
4969 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004970
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004971 # clear FD_CLOEXEC flag
4972 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4973 flags &= ~fcntl.FD_CLOEXEC
4974 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004975
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004976 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004977
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004978 @unittest.skipIf(fcntl is None, "need fcntl")
4979 def test_set_inheritable_cloexec(self):
4980 sock = socket.socket()
4981 with sock:
4982 fd = sock.fileno()
4983 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4984 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004985
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004986 sock.set_inheritable(True)
4987 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4988 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004989
4990
Victor Stinnerdaf45552013-08-28 00:53:59 +02004991 @unittest.skipUnless(hasattr(socket, "socketpair"),
4992 "need socket.socketpair()")
4993 def test_socketpair(self):
4994 s1, s2 = socket.socketpair()
4995 self.addCleanup(s1.close)
4996 self.addCleanup(s2.close)
4997 self.assertEqual(s1.get_inheritable(), False)
4998 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004999
5000
5001@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5002 "SOCK_NONBLOCK not defined")
5003class NonblockConstantTest(unittest.TestCase):
5004 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5005 if nonblock:
5006 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
5007 self.assertEqual(s.gettimeout(), timeout)
5008 else:
5009 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
5010 self.assertEqual(s.gettimeout(), None)
5011
Charles-François Natali239bb962011-06-03 12:55:15 +02005012 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005013 def test_SOCK_NONBLOCK(self):
5014 # a lot of it seems silly and redundant, but I wanted to test that
5015 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005016 with socket.socket(socket.AF_INET,
5017 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5018 self.checkNonblock(s)
5019 s.setblocking(1)
5020 self.checkNonblock(s, False)
5021 s.setblocking(0)
5022 self.checkNonblock(s)
5023 s.settimeout(None)
5024 self.checkNonblock(s, False)
5025 s.settimeout(2.0)
5026 self.checkNonblock(s, timeout=2.0)
5027 s.setblocking(1)
5028 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005029 # defaulttimeout
5030 t = socket.getdefaulttimeout()
5031 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005032 with socket.socket() as s:
5033 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005034 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005035 with socket.socket() as s:
5036 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005037 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005038 with socket.socket() as s:
5039 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005040 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005041 with socket.socket() as s:
5042 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005043 socket.setdefaulttimeout(t)
5044
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005045
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005046@unittest.skipUnless(os.name == "nt", "Windows specific")
5047@unittest.skipUnless(multiprocessing, "need multiprocessing")
5048class TestSocketSharing(SocketTCPTest):
5049 # This must be classmethod and not staticmethod or multiprocessing
5050 # won't be able to bootstrap it.
5051 @classmethod
5052 def remoteProcessServer(cls, q):
5053 # Recreate socket from shared data
5054 sdata = q.get()
5055 message = q.get()
5056
5057 s = socket.fromshare(sdata)
5058 s2, c = s.accept()
5059
5060 # Send the message
5061 s2.sendall(message)
5062 s2.close()
5063 s.close()
5064
5065 def testShare(self):
5066 # Transfer the listening server socket to another process
5067 # and service it from there.
5068
5069 # Create process:
5070 q = multiprocessing.Queue()
5071 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5072 p.start()
5073
5074 # Get the shared socket data
5075 data = self.serv.share(p.pid)
5076
5077 # Pass the shared socket to the other process
5078 addr = self.serv.getsockname()
5079 self.serv.close()
5080 q.put(data)
5081
5082 # The data that the server will send us
5083 message = b"slapmahfro"
5084 q.put(message)
5085
5086 # Connect
5087 s = socket.create_connection(addr)
5088 # listen for the data
5089 m = []
5090 while True:
5091 data = s.recv(100)
5092 if not data:
5093 break
5094 m.append(data)
5095 s.close()
5096 received = b"".join(m)
5097 self.assertEqual(received, message)
5098 p.join()
5099
5100 def testShareLength(self):
5101 data = self.serv.share(os.getpid())
5102 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5103 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5104
5105 def compareSockets(self, org, other):
5106 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005107 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005108 self.assertEqual(org.gettimeout(), None)
5109 self.assertEqual(org.gettimeout(), other.gettimeout())
5110
5111 self.assertEqual(org.family, other.family)
5112 self.assertEqual(org.type, other.type)
5113 # If the user specified "0" for proto, then
5114 # internally windows will have picked the correct value.
5115 # Python introspection on the socket however will still return
5116 # 0. For the shared socket, the python value is recreated
5117 # from the actual value, so it may not compare correctly.
5118 if org.proto != 0:
5119 self.assertEqual(org.proto, other.proto)
5120
5121 def testShareLocal(self):
5122 data = self.serv.share(os.getpid())
5123 s = socket.fromshare(data)
5124 try:
5125 self.compareSockets(self.serv, s)
5126 finally:
5127 s.close()
5128
5129 def testTypes(self):
5130 families = [socket.AF_INET, socket.AF_INET6]
5131 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5132 for f in families:
5133 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005134 try:
5135 source = socket.socket(f, t)
5136 except OSError:
5137 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005138 try:
5139 data = source.share(os.getpid())
5140 shared = socket.fromshare(data)
5141 try:
5142 self.compareSockets(source, shared)
5143 finally:
5144 shared.close()
5145 finally:
5146 source.close()
5147
5148
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005149@unittest.skipUnless(thread, 'Threading required for this test.')
5150class SendfileUsingSendTest(ThreadedTCPSocketTest):
5151 """
5152 Test the send() implementation of socket.sendfile().
5153 """
5154
5155 FILESIZE = (10 * 1024 * 1024) # 10MB
5156 BUFSIZE = 8192
5157 FILEDATA = b""
5158 TIMEOUT = 2
5159
5160 @classmethod
5161 def setUpClass(cls):
5162 def chunks(total, step):
5163 assert total >= step
5164 while total > step:
5165 yield step
5166 total -= step
5167 if total:
5168 yield total
5169
5170 chunk = b"".join([random.choice(string.ascii_letters).encode()
5171 for i in range(cls.BUFSIZE)])
5172 with open(support.TESTFN, 'wb') as f:
5173 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5174 f.write(chunk)
5175 with open(support.TESTFN, 'rb') as f:
5176 cls.FILEDATA = f.read()
5177 assert len(cls.FILEDATA) == cls.FILESIZE
5178
5179 @classmethod
5180 def tearDownClass(cls):
5181 support.unlink(support.TESTFN)
5182
5183 def accept_conn(self):
5184 self.serv.settimeout(self.TIMEOUT)
5185 conn, addr = self.serv.accept()
5186 conn.settimeout(self.TIMEOUT)
5187 self.addCleanup(conn.close)
5188 return conn
5189
5190 def recv_data(self, conn):
5191 received = []
5192 while True:
5193 chunk = conn.recv(self.BUFSIZE)
5194 if not chunk:
5195 break
5196 received.append(chunk)
5197 return b''.join(received)
5198
5199 def meth_from_sock(self, sock):
5200 # Depending on the mixin class being run return either send()
5201 # or sendfile() method implementation.
5202 return getattr(sock, "_sendfile_use_send")
5203
5204 # regular file
5205
5206 def _testRegularFile(self):
5207 address = self.serv.getsockname()
5208 file = open(support.TESTFN, 'rb')
5209 with socket.create_connection(address) as sock, file as file:
5210 meth = self.meth_from_sock(sock)
5211 sent = meth(file)
5212 self.assertEqual(sent, self.FILESIZE)
5213 self.assertEqual(file.tell(), self.FILESIZE)
5214
5215 def testRegularFile(self):
5216 conn = self.accept_conn()
5217 data = self.recv_data(conn)
5218 self.assertEqual(len(data), self.FILESIZE)
5219 self.assertEqual(data, self.FILEDATA)
5220
5221 # non regular file
5222
5223 def _testNonRegularFile(self):
5224 address = self.serv.getsockname()
5225 file = io.BytesIO(self.FILEDATA)
5226 with socket.create_connection(address) as sock, file as file:
5227 sent = sock.sendfile(file)
5228 self.assertEqual(sent, self.FILESIZE)
5229 self.assertEqual(file.tell(), self.FILESIZE)
5230 self.assertRaises(socket._GiveupOnSendfile,
5231 sock._sendfile_use_sendfile, file)
5232
5233 def testNonRegularFile(self):
5234 conn = self.accept_conn()
5235 data = self.recv_data(conn)
5236 self.assertEqual(len(data), self.FILESIZE)
5237 self.assertEqual(data, self.FILEDATA)
5238
5239 # empty file
5240
5241 def _testEmptyFileSend(self):
5242 address = self.serv.getsockname()
5243 filename = support.TESTFN + "2"
5244 with open(filename, 'wb'):
5245 self.addCleanup(support.unlink, filename)
5246 file = open(filename, 'rb')
5247 with socket.create_connection(address) as sock, file as file:
5248 meth = self.meth_from_sock(sock)
5249 sent = meth(file)
5250 self.assertEqual(sent, 0)
5251 self.assertEqual(file.tell(), 0)
5252
5253 def testEmptyFileSend(self):
5254 conn = self.accept_conn()
5255 data = self.recv_data(conn)
5256 self.assertEqual(data, b"")
5257
5258 # offset
5259
5260 def _testOffset(self):
5261 address = self.serv.getsockname()
5262 file = open(support.TESTFN, 'rb')
5263 with socket.create_connection(address) as sock, file as file:
5264 meth = self.meth_from_sock(sock)
5265 sent = meth(file, offset=5000)
5266 self.assertEqual(sent, self.FILESIZE - 5000)
5267 self.assertEqual(file.tell(), self.FILESIZE)
5268
5269 def testOffset(self):
5270 conn = self.accept_conn()
5271 data = self.recv_data(conn)
5272 self.assertEqual(len(data), self.FILESIZE - 5000)
5273 self.assertEqual(data, self.FILEDATA[5000:])
5274
5275 # count
5276
5277 def _testCount(self):
5278 address = self.serv.getsockname()
5279 file = open(support.TESTFN, 'rb')
5280 with socket.create_connection(address, timeout=2) as sock, file as file:
5281 count = 5000007
5282 meth = self.meth_from_sock(sock)
5283 sent = meth(file, count=count)
5284 self.assertEqual(sent, count)
5285 self.assertEqual(file.tell(), count)
5286
5287 def testCount(self):
5288 count = 5000007
5289 conn = self.accept_conn()
5290 data = self.recv_data(conn)
5291 self.assertEqual(len(data), count)
5292 self.assertEqual(data, self.FILEDATA[:count])
5293
5294 # count small
5295
5296 def _testCountSmall(self):
5297 address = self.serv.getsockname()
5298 file = open(support.TESTFN, 'rb')
5299 with socket.create_connection(address, timeout=2) as sock, file as file:
5300 count = 1
5301 meth = self.meth_from_sock(sock)
5302 sent = meth(file, count=count)
5303 self.assertEqual(sent, count)
5304 self.assertEqual(file.tell(), count)
5305
5306 def testCountSmall(self):
5307 count = 1
5308 conn = self.accept_conn()
5309 data = self.recv_data(conn)
5310 self.assertEqual(len(data), count)
5311 self.assertEqual(data, self.FILEDATA[:count])
5312
5313 # count + offset
5314
5315 def _testCountWithOffset(self):
5316 address = self.serv.getsockname()
5317 file = open(support.TESTFN, 'rb')
5318 with socket.create_connection(address, timeout=2) as sock, file as file:
5319 count = 100007
5320 meth = self.meth_from_sock(sock)
5321 sent = meth(file, offset=2007, count=count)
5322 self.assertEqual(sent, count)
5323 self.assertEqual(file.tell(), count + 2007)
5324
5325 def testCountWithOffset(self):
5326 count = 100007
5327 conn = self.accept_conn()
5328 data = self.recv_data(conn)
5329 self.assertEqual(len(data), count)
5330 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5331
5332 # non blocking sockets are not supposed to work
5333
5334 def _testNonBlocking(self):
5335 address = self.serv.getsockname()
5336 file = open(support.TESTFN, 'rb')
5337 with socket.create_connection(address) as sock, file as file:
5338 sock.setblocking(False)
5339 meth = self.meth_from_sock(sock)
5340 self.assertRaises(ValueError, meth, file)
5341 self.assertRaises(ValueError, sock.sendfile, file)
5342
5343 def testNonBlocking(self):
5344 conn = self.accept_conn()
5345 if conn.recv(8192):
5346 self.fail('was not supposed to receive any data')
5347
5348 # timeout (non-triggered)
5349
5350 def _testWithTimeout(self):
5351 address = self.serv.getsockname()
5352 file = open(support.TESTFN, 'rb')
5353 with socket.create_connection(address, timeout=2) as sock, file as file:
5354 meth = self.meth_from_sock(sock)
5355 sent = meth(file)
5356 self.assertEqual(sent, self.FILESIZE)
5357
5358 def testWithTimeout(self):
5359 conn = self.accept_conn()
5360 data = self.recv_data(conn)
5361 self.assertEqual(len(data), self.FILESIZE)
5362 self.assertEqual(data, self.FILEDATA)
5363
5364 # timeout (triggered)
5365
5366 def _testWithTimeoutTriggeredSend(self):
5367 address = self.serv.getsockname()
5368 file = open(support.TESTFN, 'rb')
5369 with socket.create_connection(address, timeout=0.01) as sock, \
5370 file as file:
5371 meth = self.meth_from_sock(sock)
5372 self.assertRaises(socket.timeout, meth, file)
5373
5374 def testWithTimeoutTriggeredSend(self):
5375 conn = self.accept_conn()
5376 conn.recv(88192)
5377
5378 # errors
5379
5380 def _test_errors(self):
5381 pass
5382
5383 def test_errors(self):
5384 with open(support.TESTFN, 'rb') as file:
5385 with socket.socket(type=socket.SOCK_DGRAM) as s:
5386 meth = self.meth_from_sock(s)
5387 self.assertRaisesRegex(
5388 ValueError, "SOCK_STREAM", meth, file)
5389 with open(support.TESTFN, 'rt') as file:
5390 with socket.socket() as s:
5391 meth = self.meth_from_sock(s)
5392 self.assertRaisesRegex(
5393 ValueError, "binary mode", meth, file)
5394 with open(support.TESTFN, 'rb') as file:
5395 with socket.socket() as s:
5396 meth = self.meth_from_sock(s)
5397 self.assertRaisesRegex(TypeError, "positive integer",
5398 meth, file, count='2')
5399 self.assertRaisesRegex(TypeError, "positive integer",
5400 meth, file, count=0.1)
5401 self.assertRaisesRegex(ValueError, "positive integer",
5402 meth, file, count=0)
5403 self.assertRaisesRegex(ValueError, "positive integer",
5404 meth, file, count=-1)
5405
5406
5407@unittest.skipUnless(thread, 'Threading required for this test.')
5408@unittest.skipUnless(hasattr(os, "sendfile"),
5409 'os.sendfile() required for this test.')
5410class SendfileUsingSendfileTest(SendfileUsingSendTest):
5411 """
5412 Test the sendfile() implementation of socket.sendfile().
5413 """
5414 def meth_from_sock(self, sock):
5415 return getattr(sock, "_sendfile_use_sendfile")
5416
Christian Heimes48371412016-09-06 00:37:46 +02005417
5418@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005419class LinuxKernelCryptoAPI(unittest.TestCase):
5420 # tests for AF_ALG
5421 def create_alg(self, typ, name):
5422 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005423 try:
5424 sock.bind((typ, name))
5425 except FileNotFoundError as e:
5426 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005427 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005428 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005429 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005430 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005431
5432 def test_sha256(self):
5433 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5434 "177a9cb410ff61f20015ad")
5435 with self.create_alg('hash', 'sha256') as algo:
5436 op, _ = algo.accept()
5437 with op:
5438 op.sendall(b"abc")
5439 self.assertEqual(op.recv(512), expected)
5440
5441 op, _ = algo.accept()
5442 with op:
5443 op.send(b'a', socket.MSG_MORE)
5444 op.send(b'b', socket.MSG_MORE)
5445 op.send(b'c', socket.MSG_MORE)
5446 op.send(b'')
5447 self.assertEqual(op.recv(512), expected)
5448
5449 def test_hmac_sha1(self):
5450 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5451 with self.create_alg('hash', 'hmac(sha1)') as algo:
5452 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5453 op, _ = algo.accept()
5454 with op:
5455 op.sendall(b"what do ya want for nothing?")
5456 self.assertEqual(op.recv(512), expected)
5457
Christian Heimese084f842016-09-11 20:11:30 +02005458 # Although it should work with 3.19 and newer the test blocks on
5459 # Ubuntu 15.10 with Kernel 4.2.0-19.
5460 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005461 def test_aes_cbc(self):
5462 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5463 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5464 msg = b"Single block msg"
5465 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5466 msglen = len(msg)
5467 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5468 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5469 op, _ = algo.accept()
5470 with op:
5471 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5472 flags=socket.MSG_MORE)
5473 op.sendall(msg)
5474 self.assertEqual(op.recv(msglen), ciphertext)
5475
5476 op, _ = algo.accept()
5477 with op:
5478 op.sendmsg_afalg([ciphertext],
5479 op=socket.ALG_OP_DECRYPT, iv=iv)
5480 self.assertEqual(op.recv(msglen), msg)
5481
5482 # long message
5483 multiplier = 1024
5484 longmsg = [msg] * multiplier
5485 op, _ = algo.accept()
5486 with op:
5487 op.sendmsg_afalg(longmsg,
5488 op=socket.ALG_OP_ENCRYPT, iv=iv)
5489 enc = op.recv(msglen * multiplier)
5490 self.assertEqual(len(enc), msglen * multiplier)
5491 self.assertTrue(enc[:msglen], ciphertext)
5492
5493 op, _ = algo.accept()
5494 with op:
5495 op.sendmsg_afalg([enc],
5496 op=socket.ALG_OP_DECRYPT, iv=iv)
5497 dec = op.recv(msglen * multiplier)
5498 self.assertEqual(len(dec), msglen * multiplier)
5499 self.assertEqual(dec, msg * multiplier)
5500
matejcik9764c152017-02-16 14:41:31 +01005501 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005502 def test_aead_aes_gcm(self):
5503 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5504 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5505 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5506 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5507 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5508 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5509
5510 taglen = len(expected_tag)
5511 assoclen = len(assoc)
5512
5513 with self.create_alg('aead', 'gcm(aes)') as algo:
5514 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5515 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5516 None, taglen)
5517
5518 # send assoc, plain and tag buffer in separate steps
5519 op, _ = algo.accept()
5520 with op:
5521 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5522 assoclen=assoclen, flags=socket.MSG_MORE)
5523 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005524 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005525 res = op.recv(assoclen + len(plain) + taglen)
5526 self.assertEqual(expected_ct, res[assoclen:-taglen])
5527 self.assertEqual(expected_tag, res[-taglen:])
5528
5529 # now with msg
5530 op, _ = algo.accept()
5531 with op:
matejcik9764c152017-02-16 14:41:31 +01005532 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005533 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5534 assoclen=assoclen)
5535 res = op.recv(assoclen + len(plain) + taglen)
5536 self.assertEqual(expected_ct, res[assoclen:-taglen])
5537 self.assertEqual(expected_tag, res[-taglen:])
5538
5539 # create anc data manually
5540 pack_uint32 = struct.Struct('I').pack
5541 op, _ = algo.accept()
5542 with op:
matejcik9764c152017-02-16 14:41:31 +01005543 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005544 op.sendmsg(
5545 [msg],
5546 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5547 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5548 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5549 )
5550 )
matejcik9764c152017-02-16 14:41:31 +01005551 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005552 self.assertEqual(expected_ct, res[assoclen:-taglen])
5553 self.assertEqual(expected_tag, res[-taglen:])
5554
5555 # decrypt and verify
5556 op, _ = algo.accept()
5557 with op:
5558 msg = assoc + expected_ct + expected_tag
5559 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5560 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005561 res = op.recv(len(msg) - taglen)
5562 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005563
Christian Heimese084f842016-09-11 20:11:30 +02005564 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005565 def test_drbg_pr_sha256(self):
5566 # deterministic random bit generator, prediction resistance, sha256
5567 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5568 extra_seed = os.urandom(32)
5569 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5570 op, _ = algo.accept()
5571 with op:
5572 rn = op.recv(32)
5573 self.assertEqual(len(rn), 32)
5574
5575 def test_sendmsg_afalg_args(self):
5576 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005577 with sock:
5578 with self.assertRaises(TypeError):
5579 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005580
Christian Heimes02b30352016-09-11 19:49:56 +02005581 with self.assertRaises(TypeError):
5582 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005583
Christian Heimes02b30352016-09-11 19:49:56 +02005584 with self.assertRaises(TypeError):
5585 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005586
Christian Heimes02b30352016-09-11 19:49:56 +02005587 with self.assertRaises(TypeError):
5588 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005589
Christian Heimes02b30352016-09-11 19:49:56 +02005590 with self.assertRaises(TypeError):
5591 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5592
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005593
Guido van Rossumb995eb72002-07-31 16:08:40 +00005594def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005595 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005596 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005597
5598 tests.extend([
5599 NonBlockingTCPTests,
5600 FileObjectClassTestCase,
5601 UnbufferedFileObjectClassTestCase,
5602 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005603 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005604 UnicodeReadFileObjectClassTestCase,
5605 UnicodeWriteFileObjectClassTestCase,
5606 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005607 NetworkConnectionNoServer,
5608 NetworkConnectionAttributesTest,
5609 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005610 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005611 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005612 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005613 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005614 tests.append(BasicSocketPairTest)
5615 tests.append(TestUnixDomain)
5616 tests.append(TestLinuxAbstractNamespace)
5617 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005618 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005619 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005620 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005621 tests.extend([
5622 CmsgMacroTests,
5623 SendmsgUDPTest,
5624 RecvmsgUDPTest,
5625 RecvmsgIntoUDPTest,
5626 SendmsgUDP6Test,
5627 RecvmsgUDP6Test,
5628 RecvmsgRFC3542AncillaryUDP6Test,
5629 RecvmsgIntoRFC3542AncillaryUDP6Test,
5630 RecvmsgIntoUDP6Test,
5631 SendmsgTCPTest,
5632 RecvmsgTCPTest,
5633 RecvmsgIntoTCPTest,
5634 SendmsgSCTPStreamTest,
5635 RecvmsgSCTPStreamTest,
5636 RecvmsgIntoSCTPStreamTest,
5637 SendmsgUnixStreamTest,
5638 RecvmsgUnixStreamTest,
5639 RecvmsgIntoUnixStreamTest,
5640 RecvmsgSCMRightsStreamTest,
5641 RecvmsgIntoSCMRightsStreamTest,
5642 # These are slow when setitimer() is not available
5643 InterruptedRecvTimeoutTest,
5644 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005645 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005646 SendfileUsingSendTest,
5647 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005648 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005649
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005650 thread_info = support.threading_setup()
5651 support.run_unittest(*tests)
5652 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005653
5654if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005655 test_main()