blob: c5d5d258b9bc4451b34bc5685985a1eeccf3c27c [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()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000281 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200282 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200283 if self.server_crashed:
284 self.clientTearDown()
285 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000286 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000287 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000288 try:
289 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000290 except BaseException as e:
291 self.queue.put(e)
292 finally:
293 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000294
295 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000296 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000297
298 def clientTearDown(self):
299 self.done.set()
300 thread.exit()
301
302class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
303
304 def __init__(self, methodName='runTest'):
305 SocketTCPTest.__init__(self, methodName=methodName)
306 ThreadableTest.__init__(self)
307
308 def clientSetUp(self):
309 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
310
311 def clientTearDown(self):
312 self.cli.close()
313 self.cli = None
314 ThreadableTest.clientTearDown(self)
315
316class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
317
318 def __init__(self, methodName='runTest'):
319 SocketUDPTest.__init__(self, methodName=methodName)
320 ThreadableTest.__init__(self)
321
322 def clientSetUp(self):
323 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
324
Brian Curtin3beb38f2010-11-04 03:41:43 +0000325 def clientTearDown(self):
326 self.cli.close()
327 self.cli = None
328 ThreadableTest.clientTearDown(self)
329
Charles-François Natali47413c12011-10-06 19:47:44 +0200330class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
331
332 def __init__(self, methodName='runTest'):
333 SocketCANTest.__init__(self, methodName=methodName)
334 ThreadableTest.__init__(self)
335
336 def clientSetUp(self):
337 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
338 try:
339 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200340 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200341 # skipTest should not be called here, and will be called in the
342 # server instead
343 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200344
345 def clientTearDown(self):
346 self.cli.close()
347 self.cli = None
348 ThreadableTest.clientTearDown(self)
349
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100350class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
351
352 def __init__(self, methodName='runTest'):
353 SocketRDSTest.__init__(self, methodName=methodName)
354 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100355
356 def clientSetUp(self):
357 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
358 try:
359 # RDS sockets must be bound explicitly to send or receive data
360 self.cli.bind((HOST, 0))
361 self.cli_addr = self.cli.getsockname()
362 except OSError:
363 # skipTest should not be called here, and will be called in the
364 # server instead
365 pass
366
367 def clientTearDown(self):
368 self.cli.close()
369 self.cli = None
370 ThreadableTest.clientTearDown(self)
371
Guido van Rossum24e4af82002-06-12 19:18:08 +0000372class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000373 """Socket tests for client-server connection.
374
375 self.cli_conn is a client socket connected to the server. The
376 setUp() method guarantees that it is connected to the server.
377 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000378
379 def __init__(self, methodName='runTest'):
380 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
381
382 def setUp(self):
383 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000384 # Indicate explicitly we're ready for the client thread to
385 # proceed and then perform the blocking call to accept
386 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000387 conn, addr = self.serv.accept()
388 self.cli_conn = conn
389
390 def tearDown(self):
391 self.cli_conn.close()
392 self.cli_conn = None
393 ThreadedTCPSocketTest.tearDown(self)
394
395 def clientSetUp(self):
396 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000397 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000398 self.serv_conn = self.cli
399
400 def clientTearDown(self):
401 self.serv_conn.close()
402 self.serv_conn = None
403 ThreadedTCPSocketTest.clientTearDown(self)
404
Dave Cole331708b2004-08-09 04:51:41 +0000405class SocketPairTest(unittest.TestCase, ThreadableTest):
406
407 def __init__(self, methodName='runTest'):
408 unittest.TestCase.__init__(self, methodName=methodName)
409 ThreadableTest.__init__(self)
410
411 def setUp(self):
412 self.serv, self.cli = socket.socketpair()
413
414 def tearDown(self):
415 self.serv.close()
416 self.serv = None
417
418 def clientSetUp(self):
419 pass
420
421 def clientTearDown(self):
422 self.cli.close()
423 self.cli = None
424 ThreadableTest.clientTearDown(self)
425
Tim Peters494aaee2004-08-09 18:54:11 +0000426
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000427# The following classes are used by the sendmsg()/recvmsg() tests.
428# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
429# gives a drop-in replacement for SocketConnectedTest, but different
430# address families can be used, and the attributes serv_addr and
431# cli_addr will be set to the addresses of the endpoints.
432
433class SocketTestBase(unittest.TestCase):
434 """A base class for socket tests.
435
436 Subclasses must provide methods newSocket() to return a new socket
437 and bindSock(sock) to bind it to an unused address.
438
439 Creates a socket self.serv and sets self.serv_addr to its address.
440 """
441
442 def setUp(self):
443 self.serv = self.newSocket()
444 self.bindServer()
445
446 def bindServer(self):
447 """Bind server socket and set self.serv_addr to its address."""
448 self.bindSock(self.serv)
449 self.serv_addr = self.serv.getsockname()
450
451 def tearDown(self):
452 self.serv.close()
453 self.serv = None
454
455
456class SocketListeningTestMixin(SocketTestBase):
457 """Mixin to listen on the server socket."""
458
459 def setUp(self):
460 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100461 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000462
463
464class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
465 ThreadableTest):
466 """Mixin to add client socket and allow client/server tests.
467
468 Client socket is self.cli and its address is self.cli_addr. See
469 ThreadableTest for usage information.
470 """
471
472 def __init__(self, *args, **kwargs):
473 super().__init__(*args, **kwargs)
474 ThreadableTest.__init__(self)
475
476 def clientSetUp(self):
477 self.cli = self.newClientSocket()
478 self.bindClient()
479
480 def newClientSocket(self):
481 """Return a new socket for use as client."""
482 return self.newSocket()
483
484 def bindClient(self):
485 """Bind client socket and set self.cli_addr to its address."""
486 self.bindSock(self.cli)
487 self.cli_addr = self.cli.getsockname()
488
489 def clientTearDown(self):
490 self.cli.close()
491 self.cli = None
492 ThreadableTest.clientTearDown(self)
493
494
495class ConnectedStreamTestMixin(SocketListeningTestMixin,
496 ThreadedSocketTestMixin):
497 """Mixin to allow client/server stream tests with connected client.
498
499 Server's socket representing connection to client is self.cli_conn
500 and client's connection to server is self.serv_conn. (Based on
501 SocketConnectedTest.)
502 """
503
504 def setUp(self):
505 super().setUp()
506 # Indicate explicitly we're ready for the client thread to
507 # proceed and then perform the blocking call to accept
508 self.serverExplicitReady()
509 conn, addr = self.serv.accept()
510 self.cli_conn = conn
511
512 def tearDown(self):
513 self.cli_conn.close()
514 self.cli_conn = None
515 super().tearDown()
516
517 def clientSetUp(self):
518 super().clientSetUp()
519 self.cli.connect(self.serv_addr)
520 self.serv_conn = self.cli
521
522 def clientTearDown(self):
523 self.serv_conn.close()
524 self.serv_conn = None
525 super().clientTearDown()
526
527
528class UnixSocketTestBase(SocketTestBase):
529 """Base class for Unix-domain socket tests."""
530
531 # This class is used for file descriptor passing tests, so we
532 # create the sockets in a private directory so that other users
533 # can't send anything that might be problematic for a privileged
534 # user running the tests.
535
536 def setUp(self):
537 self.dir_path = tempfile.mkdtemp()
538 self.addCleanup(os.rmdir, self.dir_path)
539 super().setUp()
540
541 def bindSock(self, sock):
542 path = tempfile.mktemp(dir=self.dir_path)
543 sock.bind(path)
544 self.addCleanup(support.unlink, path)
545
546class UnixStreamBase(UnixSocketTestBase):
547 """Base class for Unix-domain SOCK_STREAM tests."""
548
549 def newSocket(self):
550 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
551
552
553class InetTestBase(SocketTestBase):
554 """Base class for IPv4 socket tests."""
555
556 host = HOST
557
558 def setUp(self):
559 super().setUp()
560 self.port = self.serv_addr[1]
561
562 def bindSock(self, sock):
563 support.bind_port(sock, host=self.host)
564
565class TCPTestBase(InetTestBase):
566 """Base class for TCP-over-IPv4 tests."""
567
568 def newSocket(self):
569 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
570
571class UDPTestBase(InetTestBase):
572 """Base class for UDP-over-IPv4 tests."""
573
574 def newSocket(self):
575 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
576
577class SCTPStreamBase(InetTestBase):
578 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
579
580 def newSocket(self):
581 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
582 socket.IPPROTO_SCTP)
583
584
585class Inet6TestBase(InetTestBase):
586 """Base class for IPv6 socket tests."""
587
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200588 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000589
590class UDP6TestBase(Inet6TestBase):
591 """Base class for UDP-over-IPv6 tests."""
592
593 def newSocket(self):
594 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
595
596
597# Test-skipping decorators for use with ThreadableTest.
598
599def skipWithClientIf(condition, reason):
600 """Skip decorated test if condition is true, add client_skip decorator.
601
602 If the decorated object is not a class, sets its attribute
603 "client_skip" to a decorator which will return an empty function
604 if the test is to be skipped, or the original function if it is
605 not. This can be used to avoid running the client part of a
606 skipped test when using ThreadableTest.
607 """
608 def client_pass(*args, **kwargs):
609 pass
610 def skipdec(obj):
611 retval = unittest.skip(reason)(obj)
612 if not isinstance(obj, type):
613 retval.client_skip = lambda f: client_pass
614 return retval
615 def noskipdec(obj):
616 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
617 obj.client_skip = lambda f: f
618 return obj
619 return skipdec if condition else noskipdec
620
621
622def requireAttrs(obj, *attributes):
623 """Skip decorated test if obj is missing any of the given attributes.
624
625 Sets client_skip attribute as skipWithClientIf() does.
626 """
627 missing = [name for name in attributes if not hasattr(obj, name)]
628 return skipWithClientIf(
629 missing, "don't have " + ", ".join(name for name in missing))
630
631
632def requireSocket(*args):
633 """Skip decorated test if a socket cannot be created with given arguments.
634
635 When an argument is given as a string, will use the value of that
636 attribute of the socket module, or skip the test if it doesn't
637 exist. Sets client_skip attribute as skipWithClientIf() does.
638 """
639 err = None
640 missing = [obj for obj in args if
641 isinstance(obj, str) and not hasattr(socket, obj)]
642 if missing:
643 err = "don't have " + ", ".join(name for name in missing)
644 else:
645 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
646 for obj in args]
647 try:
648 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200649 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000650 # XXX: check errno?
651 err = str(e)
652 else:
653 s.close()
654 return skipWithClientIf(
655 err is not None,
656 "can't create socket({0}): {1}".format(
657 ", ".join(str(o) for o in args), err))
658
659
Guido van Rossum24e4af82002-06-12 19:18:08 +0000660#######################################################################
661## Begin Tests
662
663class GeneralModuleTests(unittest.TestCase):
664
Ethan Furman7184bac2014-10-14 18:56:53 -0700665 def test_SocketType_is_socketobject(self):
666 import _socket
667 self.assertTrue(socket.SocketType is _socket.socket)
668 s = socket.socket()
669 self.assertIsInstance(s, socket.SocketType)
670 s.close()
671
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000672 def test_repr(self):
673 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200674 with s:
675 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000676 self.assertIn('family=%s' % socket.AF_INET, repr(s))
677 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200678 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200679 self.assertNotIn('raddr', repr(s))
680 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200681 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200682 self.assertIn(str(s.getsockname()), repr(s))
683 self.assertIn('[closed]', repr(s))
684 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000685
Victor Stinnere254e532014-07-26 14:36:55 +0200686 @unittest.skipUnless(_socket is not None, 'need _socket module')
687 def test_csocket_repr(self):
688 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
689 try:
690 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
691 % (s.fileno(), s.family, s.type, s.proto))
692 self.assertEqual(repr(s), expected)
693 finally:
694 s.close()
695 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
696 % (s.family, s.type, s.proto))
697 self.assertEqual(repr(s), expected)
698
Raymond Hettinger027bb632004-05-31 03:09:25 +0000699 def test_weakref(self):
700 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
701 p = proxy(s)
702 self.assertEqual(p.fileno(), s.fileno())
703 s.close()
704 s = None
705 try:
706 p.fileno()
707 except ReferenceError:
708 pass
709 else:
710 self.fail('Socket proxy still exists')
711
Guido van Rossum24e4af82002-06-12 19:18:08 +0000712 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000713 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300714 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200715 with self.assertRaises(OSError, msg=msg % 'OSError'):
716 raise OSError
717 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000718 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200719 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000720 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000721
Ezio Melotti63e42302011-05-07 19:47:48 +0300722 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000723 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300724 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
725 self.addCleanup(s.close)
726 s.bind(('', 0))
727 sockname = s.getsockname()
728 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300729 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300730 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300731 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400732 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300733 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300734 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300735 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400736 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300737 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300738 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300739 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300740 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300741 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300742 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300743 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400744 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300745 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300746 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300747 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400748 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300749 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300750 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300751 self.assertIn('not NoneType', str(cm.exception))
752 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300753 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300754 self.assertIn('an integer is required', str(cm.exception))
755 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300756 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300757 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300758 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300759 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300760 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300761 self.assertIn('(1 given)', str(cm.exception))
762 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300763 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300764 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300765
Guido van Rossum24e4af82002-06-12 19:18:08 +0000766 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000767 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000768 socket.AF_INET
769 socket.SOCK_STREAM
770 socket.SOCK_DGRAM
771 socket.SOCK_RAW
772 socket.SOCK_RDM
773 socket.SOCK_SEQPACKET
774 socket.SOL_SOCKET
775 socket.SO_REUSEADDR
776
Guido van Rossum654c11e2002-06-13 20:24:17 +0000777 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000778 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000779 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000780 try:
781 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200782 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000783 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600784 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000785 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000786 try:
787 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200788 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000789 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600790 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000791 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000792 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000793 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000794 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000795
Charles-François Natali0cc86852013-09-13 19:53:08 +0200796 def test_host_resolution(self):
797 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
798 '1:1:1:1:1:1:1:1:1']:
799 self.assertRaises(OSError, socket.gethostbyname, addr)
800 self.assertRaises(OSError, socket.gethostbyaddr, addr)
801
802 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
803 self.assertEqual(socket.gethostbyname(addr), addr)
804
805 # we don't test support.HOSTv6 because there's a chance it doesn't have
806 # a matching name entry (e.g. 'ip6-localhost')
807 for host in [support.HOST]:
808 self.assertIn(host, socket.gethostbyaddr(host)[2])
809
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000810 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
811 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
812 def test_sethostname(self):
813 oldhn = socket.gethostname()
814 try:
815 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200816 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000817 if e.errno == errno.EPERM:
818 self.skipTest("test should be run as root")
819 else:
820 raise
821 try:
822 # running test as root!
823 self.assertEqual(socket.gethostname(), 'new')
824 # Should work with bytes objects too
825 socket.sethostname(b'bar')
826 self.assertEqual(socket.gethostname(), 'bar')
827 finally:
828 socket.sethostname(oldhn)
829
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700830 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
831 'socket.if_nameindex() not available.')
832 def testInterfaceNameIndex(self):
833 interfaces = socket.if_nameindex()
834 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200835 self.assertIsInstance(index, int)
836 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700837 # interface indices are non-zero integers
838 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200839 _index = socket.if_nametoindex(name)
840 self.assertIsInstance(_index, int)
841 self.assertEqual(index, _index)
842 _name = socket.if_indextoname(index)
843 self.assertIsInstance(_name, str)
844 self.assertEqual(name, _name)
845
846 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
847 'socket.if_nameindex() not available.')
848 def testInvalidInterfaceNameIndex(self):
849 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200850 self.assertRaises(OSError, socket.if_indextoname, 0)
851 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200852 # test with invalid values
853 self.assertRaises(TypeError, socket.if_nametoindex, 0)
854 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700855
Serhiy Storchaka43767632013-11-03 21:31:38 +0200856 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
857 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000858 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000859 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200860 try:
861 # On some versions, this loses a reference
862 orig = sys.getrefcount(__name__)
863 socket.getnameinfo(__name__,0)
864 except TypeError:
865 if sys.getrefcount(__name__) != orig:
866 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000867
Guido van Rossum24e4af82002-06-12 19:18:08 +0000868 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000869 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870 try:
871 # On some versions, this crashes the interpreter.
872 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200873 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000874 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000875
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000876 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000877 # This just checks that htons etc. are their own inverse,
878 # when looking at the lower 16 or 32 bits.
879 sizes = {socket.htonl: 32, socket.ntohl: 32,
880 socket.htons: 16, socket.ntohs: 16}
881 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000882 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000883 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
884 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000885
Guido van Rossuma2627af2002-09-14 00:58:46 +0000886 swapped = func(mask)
887 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000888 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000889
Guido van Rossum018919a2007-01-15 00:07:32 +0000890 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000891 good_values = [ 1, 2, 3, 1, 2, 3 ]
892 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000893 for k in good_values:
894 socket.ntohl(k)
895 socket.ntohs(k)
896 socket.htonl(k)
897 socket.htons(k)
898 for k in bad_values:
899 self.assertRaises(OverflowError, socket.ntohl, k)
900 self.assertRaises(OverflowError, socket.ntohs, k)
901 self.assertRaises(OverflowError, socket.htonl, k)
902 self.assertRaises(OverflowError, socket.htons, k)
903
Barry Warsaw11b91a02004-06-28 00:50:43 +0000904 def testGetServBy(self):
905 eq = self.assertEqual
906 # Find one service that exists, then check all the related interfaces.
907 # I've ordered this by protocols that have both a tcp and udp
908 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200909 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200910 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000911 # avoid the 'echo' service on this platform, as there is an
912 # assumption breaking non-standard port/protocol entry
913 services = ('daytime', 'qotd', 'domain')
914 else:
915 services = ('echo', 'daytime', 'domain')
916 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000917 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000918 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000919 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200920 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000921 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000922 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200923 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000924 # Try same call with optional protocol omitted
925 port2 = socket.getservbyname(service)
926 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400927 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000928 try:
929 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200930 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000931 udpport = None
932 else:
933 eq(udpport, port)
934 # Now make sure the lookup by port returns the same service name
935 eq(socket.getservbyport(port2), service)
936 eq(socket.getservbyport(port, 'tcp'), service)
937 if udpport is not None:
938 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000939 # Make sure getservbyport does not accept out of range ports.
940 self.assertRaises(OverflowError, socket.getservbyport, -1)
941 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000942
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000943 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000944 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000945 # The default timeout should initially be None
946 self.assertEqual(socket.getdefaulttimeout(), None)
947 s = socket.socket()
948 self.assertEqual(s.gettimeout(), None)
949 s.close()
950
951 # Set the default timeout to 10, and see if it propagates
952 socket.setdefaulttimeout(10)
953 self.assertEqual(socket.getdefaulttimeout(), 10)
954 s = socket.socket()
955 self.assertEqual(s.gettimeout(), 10)
956 s.close()
957
958 # Reset the default timeout to None, and see if it propagates
959 socket.setdefaulttimeout(None)
960 self.assertEqual(socket.getdefaulttimeout(), None)
961 s = socket.socket()
962 self.assertEqual(s.gettimeout(), None)
963 s.close()
964
965 # Check that setting it to an invalid value raises ValueError
966 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
967
968 # Check that setting it to an invalid type raises TypeError
969 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
970
Serhiy Storchaka43767632013-11-03 21:31:38 +0200971 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
972 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000973 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000974 # Test that issue1008086 and issue767150 are fixed.
975 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000976 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
977 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000978
Serhiy Storchaka43767632013-11-03 21:31:38 +0200979 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
980 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000981 def testIPv4toString(self):
982 from socket import inet_aton as f, inet_pton, AF_INET
983 g = lambda a: inet_pton(AF_INET, a)
984
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100985 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200986 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100987 )
988
Ezio Melottib3aedd42010-11-20 19:04:17 +0000989 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
990 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
991 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
992 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
993 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100994 assertInvalid(f, '0.0.0.')
995 assertInvalid(f, '300.0.0.0')
996 assertInvalid(f, 'a.0.0.0')
997 assertInvalid(f, '1.2.3.4.5')
998 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000999
Ezio Melottib3aedd42010-11-20 19:04:17 +00001000 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1001 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1002 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1003 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001004 assertInvalid(g, '0.0.0.')
1005 assertInvalid(g, '300.0.0.0')
1006 assertInvalid(g, 'a.0.0.0')
1007 assertInvalid(g, '1.2.3.4.5')
1008 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001009
Serhiy Storchaka43767632013-11-03 21:31:38 +02001010 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1011 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001012 def testIPv6toString(self):
1013 try:
1014 from socket import inet_pton, AF_INET6, has_ipv6
1015 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001016 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001017 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001018 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001019
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001020 if sys.platform == "win32":
1021 try:
1022 inet_pton(AF_INET6, '::')
1023 except OSError as e:
1024 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001025 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001026
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001027 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001028 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001029 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001030 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001031
Ezio Melottib3aedd42010-11-20 19:04:17 +00001032 self.assertEqual(b'\x00' * 16, f('::'))
1033 self.assertEqual(b'\x00' * 16, f('0::0'))
1034 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1035 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001036 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 +00001037 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1038 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001039 self.assertEqual(
1040 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1041 f('ad42:abc::127:0:254:2')
1042 )
1043 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1044 assertInvalid('0x20::')
1045 assertInvalid(':::')
1046 assertInvalid('::0::')
1047 assertInvalid('1::abc::')
1048 assertInvalid('1::abc::def')
1049 assertInvalid('1:2:3:4:5:6:')
1050 assertInvalid('1:2:3:4:5:6')
1051 assertInvalid('1:2:3:4:5:6:7:8:')
1052 assertInvalid('1:2:3:4:5:6:7:8:0')
1053
1054 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1055 f('::254.42.23.64')
1056 )
1057 self.assertEqual(
1058 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1059 f('42::a29b:254.42.23.64')
1060 )
1061 self.assertEqual(
1062 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1063 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1064 )
1065 assertInvalid('255.254.253.252')
1066 assertInvalid('1::260.2.3.0')
1067 assertInvalid('1::0.be.e.0')
1068 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1069 assertInvalid('::1.2.3.4:0')
1070 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001071
Serhiy Storchaka43767632013-11-03 21:31:38 +02001072 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1073 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001074 def testStringToIPv4(self):
1075 from socket import inet_ntoa as f, inet_ntop, AF_INET
1076 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001077 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001078 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001079 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001080
Ezio Melottib3aedd42010-11-20 19:04:17 +00001081 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1082 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1083 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1084 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001085 assertInvalid(f, b'\x00' * 3)
1086 assertInvalid(f, b'\x00' * 5)
1087 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001088 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001089
Ezio Melottib3aedd42010-11-20 19:04:17 +00001090 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1091 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1092 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001093 assertInvalid(g, b'\x00' * 3)
1094 assertInvalid(g, b'\x00' * 5)
1095 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001096 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001097
Serhiy Storchaka43767632013-11-03 21:31:38 +02001098 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1099 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001100 def testStringToIPv6(self):
1101 try:
1102 from socket import inet_ntop, AF_INET6, has_ipv6
1103 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001104 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001105 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001106 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001107
1108 if sys.platform == "win32":
1109 try:
1110 inet_ntop(AF_INET6, b'\x00' * 16)
1111 except OSError as e:
1112 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001113 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001114
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001115 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001116 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001117 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001118 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001119
Ezio Melottib3aedd42010-11-20 19:04:17 +00001120 self.assertEqual('::', f(b'\x00' * 16))
1121 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1122 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001123 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001124 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 +00001125 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001126 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001127
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001128 assertInvalid(b'\x12' * 15)
1129 assertInvalid(b'\x12' * 17)
1130 assertInvalid(b'\x12' * 4)
1131
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001132 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001133
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001134 def testSockName(self):
1135 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001136 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001137 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001138 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001139 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001140 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001141 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1142 # it reasonable to get the host's addr in addition to 0.0.0.0.
1143 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001144 try:
1145 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001146 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001147 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001148 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001149 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001150 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001151
1152 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001153 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001154 # We know a socket should start without reuse==0
1155 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001156 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001157 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001158 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001159
1160 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001161 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001162 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001163 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001164 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1165 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001166 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001167
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001168 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001169 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001170 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1171 sock.settimeout(1)
1172 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001173 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001174
Martin Panter50ab1a32016-04-11 00:38:12 +00001175 def testCloseException(self):
1176 sock = socket.socket()
1177 socket.socket(fileno=sock.fileno()).close()
1178 try:
1179 sock.close()
1180 except OSError as err:
1181 # Winsock apparently raises ENOTSOCK
1182 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1183 else:
1184 self.fail("close() should raise EBADF/ENOTSOCK")
1185
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001186 def testNewAttributes(self):
1187 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001188
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001189 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1190 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001191 if hasattr(socket, 'SOCK_CLOEXEC'):
1192 self.assertIn(sock.type,
1193 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1194 socket.SOCK_STREAM))
1195 else:
1196 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001197 self.assertEqual(sock.proto, 0)
1198 sock.close()
1199
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001200 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001201 sock = socket.socket()
1202 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001203 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001204 big_port = port + 65536
1205 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001206 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1207 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1208 # Since find_unused_port() is inherently subject to race conditions, we
1209 # call it a couple times if necessary.
1210 for i in itertools.count():
1211 port = support.find_unused_port()
1212 try:
1213 sock.bind((HOST, port))
1214 except OSError as e:
1215 if e.errno != errno.EADDRINUSE or i == 5:
1216 raise
1217 else:
1218 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001219
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001220 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001221 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001222 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1223 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1224 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1225 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001226 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1227 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001228 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001229 self.assertRaises(ValueError, s.ioctl, -1, None)
1230 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001231
Steve Dowerea93ac02016-06-17 12:52:18 -07001232 @unittest.skipUnless(os.name == "nt", "Windows specific")
1233 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1234 'Loopback fast path support required for this test')
1235 def test_sio_loopback_fast_path(self):
1236 s = socket.socket()
1237 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001238 try:
1239 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1240 except OSError as exc:
1241 WSAEOPNOTSUPP = 10045
1242 if exc.winerror == WSAEOPNOTSUPP:
1243 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1244 "doesn't implemented in this Windows version")
1245 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001246 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1247
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001248 def testGetaddrinfo(self):
1249 try:
1250 socket.getaddrinfo('localhost', 80)
1251 except socket.gaierror as err:
1252 if err.errno == socket.EAI_SERVICE:
1253 # see http://bugs.python.org/issue1282647
1254 self.skipTest("buggy libc version")
1255 raise
1256 # len of every sequence is supposed to be == 5
1257 for info in socket.getaddrinfo(HOST, None):
1258 self.assertEqual(len(info), 5)
1259 # host can be a domain name, a string representation of an
1260 # IPv4/v6 address or None
1261 socket.getaddrinfo('localhost', 80)
1262 socket.getaddrinfo('127.0.0.1', 80)
1263 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001264 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001265 socket.getaddrinfo('::1', 80)
1266 # port can be a string service name such as "http", a numeric
1267 # port number or None
1268 socket.getaddrinfo(HOST, "http")
1269 socket.getaddrinfo(HOST, 80)
1270 socket.getaddrinfo(HOST, None)
1271 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001272 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1273 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001274 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001275 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1276 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001277 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001278 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1279 for _, socktype, _, _, _ in infos:
1280 self.assertEqual(socktype, socket.SOCK_STREAM)
1281 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001282 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001283 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1284 # a server willing to support both IPv4 and IPv6 will
1285 # usually do this
1286 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1287 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001288 # test keyword arguments
1289 a = socket.getaddrinfo(HOST, None)
1290 b = socket.getaddrinfo(host=HOST, port=None)
1291 self.assertEqual(a, b)
1292 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1293 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1294 self.assertEqual(a, b)
1295 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1296 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1297 self.assertEqual(a, b)
1298 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1299 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1300 self.assertEqual(a, b)
1301 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1302 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1303 self.assertEqual(a, b)
1304 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1305 socket.AI_PASSIVE)
1306 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1307 type=socket.SOCK_STREAM, proto=0,
1308 flags=socket.AI_PASSIVE)
1309 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001310 # Issue #6697.
1311 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001312
Ned Deilyb24f4812014-02-13 22:50:42 -08001313 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001314 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001315 try:
1316 # The arguments here are undefined and the call may succeed
1317 # or fail. All we care here is that it doesn't segfault.
1318 socket.getaddrinfo("localhost", None, 0, 0, 0,
1319 socket.AI_NUMERICSERV)
1320 except socket.gaierror:
1321 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001322
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001323 def test_getnameinfo(self):
1324 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001325 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001326
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001327 @unittest.skipUnless(support.is_resource_enabled('network'),
1328 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001329 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001330 # Check for internet access before running test
1331 # (issue #12804, issue #25138).
1332 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001333 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001334
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001335 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001336 domain = 'испытание.pythontest.net'
1337 socket.gethostbyname(domain)
1338 socket.gethostbyname_ex(domain)
1339 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001340 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1341 # have a reverse entry yet
1342 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001343
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001344 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001345 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001346 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1347 self.skipTest("signal.alarm and socket.socketpair required for this test")
1348 # Our signal handlers clobber the C errno by calling a math function
1349 # with an invalid domain value.
1350 def ok_handler(*args):
1351 self.assertRaises(ValueError, math.acosh, 0)
1352 def raising_handler(*args):
1353 self.assertRaises(ValueError, math.acosh, 0)
1354 1 // 0
1355 c, s = socket.socketpair()
1356 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1357 try:
1358 if with_timeout:
1359 # Just above the one second minimum for signal.alarm
1360 c.settimeout(1.5)
1361 with self.assertRaises(ZeroDivisionError):
1362 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001363 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001364 if with_timeout:
1365 signal.signal(signal.SIGALRM, ok_handler)
1366 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001367 self.assertRaises(socket.timeout, c.sendall,
1368 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001369 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001370 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001371 signal.signal(signal.SIGALRM, old_alarm)
1372 c.close()
1373 s.close()
1374
1375 def test_sendall_interrupted(self):
1376 self.check_sendall_interrupted(False)
1377
1378 def test_sendall_interrupted_with_timeout(self):
1379 self.check_sendall_interrupted(True)
1380
Antoine Pitroue033e062010-10-29 10:38:18 +00001381 def test_dealloc_warn(self):
1382 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1383 r = repr(sock)
1384 with self.assertWarns(ResourceWarning) as cm:
1385 sock = None
1386 support.gc_collect()
1387 self.assertIn(r, str(cm.warning.args[0]))
1388 # An open socket file object gets dereferenced after the socket
1389 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1390 f = sock.makefile('rb')
1391 r = repr(sock)
1392 sock = None
1393 support.gc_collect()
1394 with self.assertWarns(ResourceWarning):
1395 f = None
1396 support.gc_collect()
1397
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001398 def test_name_closed_socketio(self):
1399 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1400 fp = sock.makefile("rb")
1401 fp.close()
1402 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1403
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001404 def test_unusable_closed_socketio(self):
1405 with socket.socket() as sock:
1406 fp = sock.makefile("rb", buffering=0)
1407 self.assertTrue(fp.readable())
1408 self.assertFalse(fp.writable())
1409 self.assertFalse(fp.seekable())
1410 fp.close()
1411 self.assertRaises(ValueError, fp.readable)
1412 self.assertRaises(ValueError, fp.writable)
1413 self.assertRaises(ValueError, fp.seekable)
1414
Berker Peksag3fe64d02016-02-18 17:34:00 +02001415 def test_makefile_mode(self):
1416 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1417 with self.subTest(mode=mode):
1418 with socket.socket() as sock:
1419 with sock.makefile(mode) as fp:
1420 self.assertEqual(fp.mode, mode)
1421
1422 def test_makefile_invalid_mode(self):
1423 for mode in 'rt', 'x', '+', 'a':
1424 with self.subTest(mode=mode):
1425 with socket.socket() as sock:
1426 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1427 sock.makefile(mode)
1428
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001429 def test_pickle(self):
1430 sock = socket.socket()
1431 with sock:
1432 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1433 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001434 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1435 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1436 self.assertEqual(family, socket.AF_INET)
1437 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1438 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001439
Serhiy Storchaka78980432013-01-15 01:12:17 +02001440 def test_listen_backlog(self):
1441 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001442 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1443 srv.bind((HOST, 0))
1444 srv.listen(backlog)
1445
1446 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001447 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001448 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001449
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001450 @support.cpython_only
1451 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001452 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001453 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001454 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1455 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001456 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001457 srv.close()
1458
Charles-François Natali42663332012-01-02 15:57:30 +01001459 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001460 def test_flowinfo(self):
1461 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001462 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001463 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001464 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001465
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001466 def test_str_for_enums(self):
1467 # Make sure that the AF_* and SOCK_* constants have enum-like string
1468 # reprs.
1469 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1470 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001471 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001472
1473 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1474 def test_uknown_socket_family_repr(self):
1475 # Test that when created with a family that's not one of the known
1476 # AF_*/SOCK_* constants, socket.family just returns the number.
1477 #
1478 # To do this we fool socket.socket into believing it already has an
1479 # open fd because on this path it doesn't actually verify the family and
1480 # type and populates the socket object.
1481 #
1482 # On Windows this trick won't work, so the test is skipped.
1483 fd, _ = tempfile.mkstemp()
1484 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1485 self.assertEqual(s.family, 42424)
1486 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001487
Charles-François Natali47413c12011-10-06 19:47:44 +02001488@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1489class BasicCANTest(unittest.TestCase):
1490
1491 def testCrucialConstants(self):
1492 socket.AF_CAN
1493 socket.PF_CAN
1494 socket.CAN_RAW
1495
Charles-François Natali773e42d2013-02-05 19:42:01 +01001496 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1497 'socket.CAN_BCM required for this test.')
1498 def testBCMConstants(self):
1499 socket.CAN_BCM
1500
1501 # opcodes
1502 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1503 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1504 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1505 socket.CAN_BCM_TX_SEND # send one CAN frame
1506 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1507 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1508 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1509 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1510 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1511 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1512 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1513 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1514
Charles-François Natali47413c12011-10-06 19:47:44 +02001515 def testCreateSocket(self):
1516 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1517 pass
1518
Charles-François Natali773e42d2013-02-05 19:42:01 +01001519 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1520 'socket.CAN_BCM required for this test.')
1521 def testCreateBCMSocket(self):
1522 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1523 pass
1524
Charles-François Natali47413c12011-10-06 19:47:44 +02001525 def testBindAny(self):
1526 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1527 s.bind(('', ))
1528
1529 def testTooLongInterfaceName(self):
1530 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1531 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001532 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001533 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001534
1535 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1536 'socket.CAN_RAW_LOOPBACK required for this test.')
1537 def testLoopback(self):
1538 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1539 for loopback in (0, 1):
1540 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1541 loopback)
1542 self.assertEqual(loopback,
1543 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1544
1545 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1546 'socket.CAN_RAW_FILTER required for this test.')
1547 def testFilter(self):
1548 can_id, can_mask = 0x200, 0x700
1549 can_filter = struct.pack("=II", can_id, can_mask)
1550 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1551 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1552 self.assertEqual(can_filter,
1553 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001554 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001555
1556
1557@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001558@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001559class CANTest(ThreadedCANSocketTest):
1560
Charles-François Natali47413c12011-10-06 19:47:44 +02001561 def __init__(self, methodName='runTest'):
1562 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1563
1564 @classmethod
1565 def build_can_frame(cls, can_id, data):
1566 """Build a CAN frame."""
1567 can_dlc = len(data)
1568 data = data.ljust(8, b'\x00')
1569 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1570
1571 @classmethod
1572 def dissect_can_frame(cls, frame):
1573 """Dissect a CAN frame."""
1574 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1575 return (can_id, can_dlc, data[:can_dlc])
1576
1577 def testSendFrame(self):
1578 cf, addr = self.s.recvfrom(self.bufsize)
1579 self.assertEqual(self.cf, cf)
1580 self.assertEqual(addr[0], self.interface)
1581 self.assertEqual(addr[1], socket.AF_CAN)
1582
1583 def _testSendFrame(self):
1584 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1585 self.cli.send(self.cf)
1586
1587 def testSendMaxFrame(self):
1588 cf, addr = self.s.recvfrom(self.bufsize)
1589 self.assertEqual(self.cf, cf)
1590
1591 def _testSendMaxFrame(self):
1592 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1593 self.cli.send(self.cf)
1594
1595 def testSendMultiFrames(self):
1596 cf, addr = self.s.recvfrom(self.bufsize)
1597 self.assertEqual(self.cf1, cf)
1598
1599 cf, addr = self.s.recvfrom(self.bufsize)
1600 self.assertEqual(self.cf2, cf)
1601
1602 def _testSendMultiFrames(self):
1603 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1604 self.cli.send(self.cf1)
1605
1606 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1607 self.cli.send(self.cf2)
1608
Charles-François Natali773e42d2013-02-05 19:42:01 +01001609 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1610 'socket.CAN_BCM required for this test.')
1611 def _testBCM(self):
1612 cf, addr = self.cli.recvfrom(self.bufsize)
1613 self.assertEqual(self.cf, cf)
1614 can_id, can_dlc, data = self.dissect_can_frame(cf)
1615 self.assertEqual(self.can_id, can_id)
1616 self.assertEqual(self.data, data)
1617
1618 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1619 'socket.CAN_BCM required for this test.')
1620 def testBCM(self):
1621 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1622 self.addCleanup(bcm.close)
1623 bcm.connect((self.interface,))
1624 self.can_id = 0x123
1625 self.data = bytes([0xc0, 0xff, 0xee])
1626 self.cf = self.build_can_frame(self.can_id, self.data)
1627 opcode = socket.CAN_BCM_TX_SEND
1628 flags = 0
1629 count = 0
1630 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1631 bcm_can_id = 0x0222
1632 nframes = 1
1633 assert len(self.cf) == 16
1634 header = struct.pack(self.bcm_cmd_msg_fmt,
1635 opcode,
1636 flags,
1637 count,
1638 ival1_seconds,
1639 ival1_usec,
1640 ival2_seconds,
1641 ival2_usec,
1642 bcm_can_id,
1643 nframes,
1644 )
1645 header_plus_frame = header + self.cf
1646 bytes_sent = bcm.send(header_plus_frame)
1647 self.assertEqual(bytes_sent, len(header_plus_frame))
1648
Charles-François Natali47413c12011-10-06 19:47:44 +02001649
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001650@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1651class BasicRDSTest(unittest.TestCase):
1652
1653 def testCrucialConstants(self):
1654 socket.AF_RDS
1655 socket.PF_RDS
1656
1657 def testCreateSocket(self):
1658 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1659 pass
1660
1661 def testSocketBufferSize(self):
1662 bufsize = 16384
1663 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1664 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1665 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1666
1667
1668@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1669@unittest.skipUnless(thread, 'Threading required for this test.')
1670class RDSTest(ThreadedRDSSocketTest):
1671
1672 def __init__(self, methodName='runTest'):
1673 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1674
Charles-François Natali240c55f2011-11-10 20:33:36 +01001675 def setUp(self):
1676 super().setUp()
1677 self.evt = threading.Event()
1678
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001679 def testSendAndRecv(self):
1680 data, addr = self.serv.recvfrom(self.bufsize)
1681 self.assertEqual(self.data, data)
1682 self.assertEqual(self.cli_addr, addr)
1683
1684 def _testSendAndRecv(self):
1685 self.data = b'spam'
1686 self.cli.sendto(self.data, 0, (HOST, self.port))
1687
1688 def testPeek(self):
1689 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1690 self.assertEqual(self.data, data)
1691 data, addr = self.serv.recvfrom(self.bufsize)
1692 self.assertEqual(self.data, data)
1693
1694 def _testPeek(self):
1695 self.data = b'spam'
1696 self.cli.sendto(self.data, 0, (HOST, self.port))
1697
1698 @requireAttrs(socket.socket, 'recvmsg')
1699 def testSendAndRecvMsg(self):
1700 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1701 self.assertEqual(self.data, data)
1702
1703 @requireAttrs(socket.socket, 'sendmsg')
1704 def _testSendAndRecvMsg(self):
1705 self.data = b'hello ' * 10
1706 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1707
1708 def testSendAndRecvMulti(self):
1709 data, addr = self.serv.recvfrom(self.bufsize)
1710 self.assertEqual(self.data1, data)
1711
1712 data, addr = self.serv.recvfrom(self.bufsize)
1713 self.assertEqual(self.data2, data)
1714
1715 def _testSendAndRecvMulti(self):
1716 self.data1 = b'bacon'
1717 self.cli.sendto(self.data1, 0, (HOST, self.port))
1718
1719 self.data2 = b'egg'
1720 self.cli.sendto(self.data2, 0, (HOST, self.port))
1721
1722 def testSelect(self):
1723 r, w, x = select.select([self.serv], [], [], 3.0)
1724 self.assertIn(self.serv, r)
1725 data, addr = self.serv.recvfrom(self.bufsize)
1726 self.assertEqual(self.data, data)
1727
1728 def _testSelect(self):
1729 self.data = b'select'
1730 self.cli.sendto(self.data, 0, (HOST, self.port))
1731
1732 def testCongestion(self):
1733 # wait until the sender is done
1734 self.evt.wait()
1735
1736 def _testCongestion(self):
1737 # test the behavior in case of congestion
1738 self.data = b'fill'
1739 self.cli.setblocking(False)
1740 try:
1741 # try to lower the receiver's socket buffer size
1742 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1743 except OSError:
1744 pass
1745 with self.assertRaises(OSError) as cm:
1746 try:
1747 # fill the receiver's socket buffer
1748 while True:
1749 self.cli.sendto(self.data, 0, (HOST, self.port))
1750 finally:
1751 # signal the receiver we're done
1752 self.evt.set()
1753 # sendto() should have failed with ENOBUFS
1754 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1755 # and we should have received a congestion notification through poll
1756 r, w, x = select.select([self.serv], [], [], 3.0)
1757 self.assertIn(self.serv, r)
1758
1759
Victor Stinner45df8202010-04-28 22:31:17 +00001760@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001761class BasicTCPTest(SocketConnectedTest):
1762
1763 def __init__(self, methodName='runTest'):
1764 SocketConnectedTest.__init__(self, methodName=methodName)
1765
1766 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001767 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001768 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001769 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001770
1771 def _testRecv(self):
1772 self.serv_conn.send(MSG)
1773
1774 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001775 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001776 seg1 = self.cli_conn.recv(len(MSG) - 3)
1777 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001778 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001779 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001780
1781 def _testOverFlowRecv(self):
1782 self.serv_conn.send(MSG)
1783
1784 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001785 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001786 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001787 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001788
1789 def _testRecvFrom(self):
1790 self.serv_conn.send(MSG)
1791
1792 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001793 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001794 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1795 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001796 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001797 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001798
1799 def _testOverFlowRecvFrom(self):
1800 self.serv_conn.send(MSG)
1801
1802 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001803 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001804 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001805 while 1:
1806 read = self.cli_conn.recv(1024)
1807 if not read:
1808 break
Guido van Rossume531e292002-08-08 20:28:34 +00001809 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001810 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001811
1812 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001813 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001814 self.serv_conn.sendall(big_chunk)
1815
1816 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001817 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001818 fd = self.cli_conn.fileno()
1819 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001820 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001821 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001822 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001823 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001824
1825 def _testFromFd(self):
1826 self.serv_conn.send(MSG)
1827
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001828 def testDup(self):
1829 # Testing dup()
1830 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001831 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001832 msg = sock.recv(1024)
1833 self.assertEqual(msg, MSG)
1834
1835 def _testDup(self):
1836 self.serv_conn.send(MSG)
1837
Guido van Rossum24e4af82002-06-12 19:18:08 +00001838 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001839 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001840 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001841 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001842 # wait for _testShutdown to finish: on OS X, when the server
1843 # closes the connection the client also becomes disconnected,
1844 # and the client's shutdown call will fail. (Issue #4397.)
1845 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001846
1847 def _testShutdown(self):
1848 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001849 self.serv_conn.shutdown(2)
1850
1851 testShutdown_overflow = support.cpython_only(testShutdown)
1852
1853 @support.cpython_only
1854 def _testShutdown_overflow(self):
1855 import _testcapi
1856 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001857 # Issue 15989
1858 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1859 _testcapi.INT_MAX + 1)
1860 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1861 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001862 self.serv_conn.shutdown(2)
1863
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001864 def testDetach(self):
1865 # Testing detach()
1866 fileno = self.cli_conn.fileno()
1867 f = self.cli_conn.detach()
1868 self.assertEqual(f, fileno)
1869 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001870 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001871 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001872 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001873 # ...but we can create another socket using the (still open)
1874 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001875 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001876 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001877 msg = sock.recv(1024)
1878 self.assertEqual(msg, MSG)
1879
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001880 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001881 self.serv_conn.send(MSG)
1882
Victor Stinner45df8202010-04-28 22:31:17 +00001883@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001884class BasicUDPTest(ThreadedUDPSocketTest):
1885
1886 def __init__(self, methodName='runTest'):
1887 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1888
1889 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001890 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001891 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001892 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001893
1894 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001895 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001896
Guido van Rossum1c938012002-06-12 21:17:20 +00001897 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001898 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001899 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001900 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001901
Guido van Rossum1c938012002-06-12 21:17:20 +00001902 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001903 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001904
Guido van Rossumd8faa362007-04-27 19:54:29 +00001905 def testRecvFromNegative(self):
1906 # Negative lengths passed to recvfrom should give ValueError.
1907 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1908
1909 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001910 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001911
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001912# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1913# same test code is used with different families and types of socket
1914# (e.g. stream, datagram), and tests using recvmsg() are repeated
1915# using recvmsg_into().
1916#
1917# The generic test classes such as SendmsgTests and
1918# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1919# supplied with sockets cli_sock and serv_sock representing the
1920# client's and the server's end of the connection respectively, and
1921# attributes cli_addr and serv_addr holding their (numeric where
1922# appropriate) addresses.
1923#
1924# The final concrete test classes combine these with subclasses of
1925# SocketTestBase which set up client and server sockets of a specific
1926# type, and with subclasses of SendrecvmsgBase such as
1927# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1928# sockets to cli_sock and serv_sock and override the methods and
1929# attributes of SendrecvmsgBase to fill in destination addresses if
1930# needed when sending, check for specific flags in msg_flags, etc.
1931#
1932# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1933# recvmsg_into().
1934
1935# XXX: like the other datagram (UDP) tests in this module, the code
1936# here assumes that datagram delivery on the local machine will be
1937# reliable.
1938
1939class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1940 # Base class for sendmsg()/recvmsg() tests.
1941
1942 # Time in seconds to wait before considering a test failed, or
1943 # None for no timeout. Not all tests actually set a timeout.
1944 fail_timeout = 3.0
1945
1946 def setUp(self):
1947 self.misc_event = threading.Event()
1948 super().setUp()
1949
1950 def sendToServer(self, msg):
1951 # Send msg to the server.
1952 return self.cli_sock.send(msg)
1953
1954 # Tuple of alternative default arguments for sendmsg() when called
1955 # via sendmsgToServer() (e.g. to include a destination address).
1956 sendmsg_to_server_defaults = ()
1957
1958 def sendmsgToServer(self, *args):
1959 # Call sendmsg() on self.cli_sock with the given arguments,
1960 # filling in any arguments which are not supplied with the
1961 # corresponding items of self.sendmsg_to_server_defaults, if
1962 # any.
1963 return self.cli_sock.sendmsg(
1964 *(args + self.sendmsg_to_server_defaults[len(args):]))
1965
1966 def doRecvmsg(self, sock, bufsize, *args):
1967 # Call recvmsg() on sock with given arguments and return its
1968 # result. Should be used for tests which can use either
1969 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1970 # this method with one which emulates it using recvmsg_into(),
1971 # thus allowing the same test to be used for both methods.
1972 result = sock.recvmsg(bufsize, *args)
1973 self.registerRecvmsgResult(result)
1974 return result
1975
1976 def registerRecvmsgResult(self, result):
1977 # Called by doRecvmsg() with the return value of recvmsg() or
1978 # recvmsg_into(). Can be overridden to arrange cleanup based
1979 # on the returned ancillary data, for instance.
1980 pass
1981
1982 def checkRecvmsgAddress(self, addr1, addr2):
1983 # Called to compare the received address with the address of
1984 # the peer.
1985 self.assertEqual(addr1, addr2)
1986
1987 # Flags that are normally unset in msg_flags
1988 msg_flags_common_unset = 0
1989 for name in ("MSG_CTRUNC", "MSG_OOB"):
1990 msg_flags_common_unset |= getattr(socket, name, 0)
1991
1992 # Flags that are normally set
1993 msg_flags_common_set = 0
1994
1995 # Flags set when a complete record has been received (e.g. MSG_EOR
1996 # for SCTP)
1997 msg_flags_eor_indicator = 0
1998
1999 # Flags set when a complete record has not been received
2000 # (e.g. MSG_TRUNC for datagram sockets)
2001 msg_flags_non_eor_indicator = 0
2002
2003 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2004 # Method to check the value of msg_flags returned by recvmsg[_into]().
2005 #
2006 # Checks that all bits in msg_flags_common_set attribute are
2007 # set in "flags" and all bits in msg_flags_common_unset are
2008 # unset.
2009 #
2010 # The "eor" argument specifies whether the flags should
2011 # indicate that a full record (or datagram) has been received.
2012 # If "eor" is None, no checks are done; otherwise, checks
2013 # that:
2014 #
2015 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2016 # set and all bits in msg_flags_non_eor_indicator are unset
2017 #
2018 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2019 # are set and all bits in msg_flags_eor_indicator are unset
2020 #
2021 # If "checkset" and/or "checkunset" are supplied, they require
2022 # the given bits to be set or unset respectively, overriding
2023 # what the attributes require for those bits.
2024 #
2025 # If any bits are set in "ignore", they will not be checked,
2026 # regardless of the other inputs.
2027 #
2028 # Will raise Exception if the inputs require a bit to be both
2029 # set and unset, and it is not ignored.
2030
2031 defaultset = self.msg_flags_common_set
2032 defaultunset = self.msg_flags_common_unset
2033
2034 if eor:
2035 defaultset |= self.msg_flags_eor_indicator
2036 defaultunset |= self.msg_flags_non_eor_indicator
2037 elif eor is not None:
2038 defaultset |= self.msg_flags_non_eor_indicator
2039 defaultunset |= self.msg_flags_eor_indicator
2040
2041 # Function arguments override defaults
2042 defaultset &= ~checkunset
2043 defaultunset &= ~checkset
2044
2045 # Merge arguments with remaining defaults, and check for conflicts
2046 checkset |= defaultset
2047 checkunset |= defaultunset
2048 inboth = checkset & checkunset & ~ignore
2049 if inboth:
2050 raise Exception("contradictory set, unset requirements for flags "
2051 "{0:#x}".format(inboth))
2052
2053 # Compare with given msg_flags value
2054 mask = (checkset | checkunset) & ~ignore
2055 self.assertEqual(flags & mask, checkset & mask)
2056
2057
2058class RecvmsgIntoMixin(SendrecvmsgBase):
2059 # Mixin to implement doRecvmsg() using recvmsg_into().
2060
2061 def doRecvmsg(self, sock, bufsize, *args):
2062 buf = bytearray(bufsize)
2063 result = sock.recvmsg_into([buf], *args)
2064 self.registerRecvmsgResult(result)
2065 self.assertGreaterEqual(result[0], 0)
2066 self.assertLessEqual(result[0], bufsize)
2067 return (bytes(buf[:result[0]]),) + result[1:]
2068
2069
2070class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2071 # Defines flags to be checked in msg_flags for datagram sockets.
2072
2073 @property
2074 def msg_flags_non_eor_indicator(self):
2075 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2076
2077
2078class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2079 # Defines flags to be checked in msg_flags for SCTP sockets.
2080
2081 @property
2082 def msg_flags_eor_indicator(self):
2083 return super().msg_flags_eor_indicator | socket.MSG_EOR
2084
2085
2086class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2087 # Base class for tests on connectionless-mode sockets. Users must
2088 # supply sockets on attributes cli and serv to be mapped to
2089 # cli_sock and serv_sock respectively.
2090
2091 @property
2092 def serv_sock(self):
2093 return self.serv
2094
2095 @property
2096 def cli_sock(self):
2097 return self.cli
2098
2099 @property
2100 def sendmsg_to_server_defaults(self):
2101 return ([], [], 0, self.serv_addr)
2102
2103 def sendToServer(self, msg):
2104 return self.cli_sock.sendto(msg, self.serv_addr)
2105
2106
2107class SendrecvmsgConnectedBase(SendrecvmsgBase):
2108 # Base class for tests on connected sockets. Users must supply
2109 # sockets on attributes serv_conn and cli_conn (representing the
2110 # connections *to* the server and the client), to be mapped to
2111 # cli_sock and serv_sock respectively.
2112
2113 @property
2114 def serv_sock(self):
2115 return self.cli_conn
2116
2117 @property
2118 def cli_sock(self):
2119 return self.serv_conn
2120
2121 def checkRecvmsgAddress(self, addr1, addr2):
2122 # Address is currently "unspecified" for a connected socket,
2123 # so we don't examine it
2124 pass
2125
2126
2127class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2128 # Base class to set a timeout on server's socket.
2129
2130 def setUp(self):
2131 super().setUp()
2132 self.serv_sock.settimeout(self.fail_timeout)
2133
2134
2135class SendmsgTests(SendrecvmsgServerTimeoutBase):
2136 # Tests for sendmsg() which can use any socket type and do not
2137 # involve recvmsg() or recvmsg_into().
2138
2139 def testSendmsg(self):
2140 # Send a simple message with sendmsg().
2141 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2142
2143 def _testSendmsg(self):
2144 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2145
2146 def testSendmsgDataGenerator(self):
2147 # Send from buffer obtained from a generator (not a sequence).
2148 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2149
2150 def _testSendmsgDataGenerator(self):
2151 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2152 len(MSG))
2153
2154 def testSendmsgAncillaryGenerator(self):
2155 # Gather (empty) ancillary data from a generator.
2156 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2157
2158 def _testSendmsgAncillaryGenerator(self):
2159 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2160 len(MSG))
2161
2162 def testSendmsgArray(self):
2163 # Send data from an array instead of the usual bytes object.
2164 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2165
2166 def _testSendmsgArray(self):
2167 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2168 len(MSG))
2169
2170 def testSendmsgGather(self):
2171 # Send message data from more than one buffer (gather write).
2172 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2173
2174 def _testSendmsgGather(self):
2175 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2176
2177 def testSendmsgBadArgs(self):
2178 # Check that sendmsg() rejects invalid arguments.
2179 self.assertEqual(self.serv_sock.recv(1000), b"done")
2180
2181 def _testSendmsgBadArgs(self):
2182 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2183 self.assertRaises(TypeError, self.sendmsgToServer,
2184 b"not in an iterable")
2185 self.assertRaises(TypeError, self.sendmsgToServer,
2186 object())
2187 self.assertRaises(TypeError, self.sendmsgToServer,
2188 [object()])
2189 self.assertRaises(TypeError, self.sendmsgToServer,
2190 [MSG, object()])
2191 self.assertRaises(TypeError, self.sendmsgToServer,
2192 [MSG], object())
2193 self.assertRaises(TypeError, self.sendmsgToServer,
2194 [MSG], [], object())
2195 self.assertRaises(TypeError, self.sendmsgToServer,
2196 [MSG], [], 0, object())
2197 self.sendToServer(b"done")
2198
2199 def testSendmsgBadCmsg(self):
2200 # Check that invalid ancillary data items are rejected.
2201 self.assertEqual(self.serv_sock.recv(1000), b"done")
2202
2203 def _testSendmsgBadCmsg(self):
2204 self.assertRaises(TypeError, self.sendmsgToServer,
2205 [MSG], [object()])
2206 self.assertRaises(TypeError, self.sendmsgToServer,
2207 [MSG], [(object(), 0, b"data")])
2208 self.assertRaises(TypeError, self.sendmsgToServer,
2209 [MSG], [(0, object(), b"data")])
2210 self.assertRaises(TypeError, self.sendmsgToServer,
2211 [MSG], [(0, 0, object())])
2212 self.assertRaises(TypeError, self.sendmsgToServer,
2213 [MSG], [(0, 0)])
2214 self.assertRaises(TypeError, self.sendmsgToServer,
2215 [MSG], [(0, 0, b"data", 42)])
2216 self.sendToServer(b"done")
2217
2218 @requireAttrs(socket, "CMSG_SPACE")
2219 def testSendmsgBadMultiCmsg(self):
2220 # Check that invalid ancillary data items are rejected when
2221 # more than one item is present.
2222 self.assertEqual(self.serv_sock.recv(1000), b"done")
2223
2224 @testSendmsgBadMultiCmsg.client_skip
2225 def _testSendmsgBadMultiCmsg(self):
2226 self.assertRaises(TypeError, self.sendmsgToServer,
2227 [MSG], [0, 0, b""])
2228 self.assertRaises(TypeError, self.sendmsgToServer,
2229 [MSG], [(0, 0, b""), object()])
2230 self.sendToServer(b"done")
2231
2232 def testSendmsgExcessCmsgReject(self):
2233 # Check that sendmsg() rejects excess ancillary data items
2234 # when the number that can be sent is limited.
2235 self.assertEqual(self.serv_sock.recv(1000), b"done")
2236
2237 def _testSendmsgExcessCmsgReject(self):
2238 if not hasattr(socket, "CMSG_SPACE"):
2239 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002240 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002241 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2242 self.assertIsNone(cm.exception.errno)
2243 self.sendToServer(b"done")
2244
2245 def testSendmsgAfterClose(self):
2246 # Check that sendmsg() fails on a closed socket.
2247 pass
2248
2249 def _testSendmsgAfterClose(self):
2250 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002251 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002252
2253
2254class SendmsgStreamTests(SendmsgTests):
2255 # Tests for sendmsg() which require a stream socket and do not
2256 # involve recvmsg() or recvmsg_into().
2257
2258 def testSendmsgExplicitNoneAddr(self):
2259 # Check that peer address can be specified as None.
2260 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2261
2262 def _testSendmsgExplicitNoneAddr(self):
2263 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2264
2265 def testSendmsgTimeout(self):
2266 # Check that timeout works with sendmsg().
2267 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2268 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2269
2270 def _testSendmsgTimeout(self):
2271 try:
2272 self.cli_sock.settimeout(0.03)
2273 with self.assertRaises(socket.timeout):
2274 while True:
2275 self.sendmsgToServer([b"a"*512])
2276 finally:
2277 self.misc_event.set()
2278
2279 # XXX: would be nice to have more tests for sendmsg flags argument.
2280
2281 # Linux supports MSG_DONTWAIT when sending, but in general, it
2282 # only works when receiving. Could add other platforms if they
2283 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002284 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002285 "MSG_DONTWAIT not known to work on this platform when "
2286 "sending")
2287 def testSendmsgDontWait(self):
2288 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2289 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2290 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2291
2292 @testSendmsgDontWait.client_skip
2293 def _testSendmsgDontWait(self):
2294 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002295 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002296 while True:
2297 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2298 self.assertIn(cm.exception.errno,
2299 (errno.EAGAIN, errno.EWOULDBLOCK))
2300 finally:
2301 self.misc_event.set()
2302
2303
2304class SendmsgConnectionlessTests(SendmsgTests):
2305 # Tests for sendmsg() which require a connectionless-mode
2306 # (e.g. datagram) socket, and do not involve recvmsg() or
2307 # recvmsg_into().
2308
2309 def testSendmsgNoDestAddr(self):
2310 # Check that sendmsg() fails when no destination address is
2311 # given for unconnected socket.
2312 pass
2313
2314 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002315 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002316 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002317 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002318 [MSG], [], 0, None)
2319
2320
2321class RecvmsgGenericTests(SendrecvmsgBase):
2322 # Tests for recvmsg() which can also be emulated using
2323 # recvmsg_into(), and can use any socket type.
2324
2325 def testRecvmsg(self):
2326 # Receive a simple message with recvmsg[_into]().
2327 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2328 self.assertEqual(msg, MSG)
2329 self.checkRecvmsgAddress(addr, self.cli_addr)
2330 self.assertEqual(ancdata, [])
2331 self.checkFlags(flags, eor=True)
2332
2333 def _testRecvmsg(self):
2334 self.sendToServer(MSG)
2335
2336 def testRecvmsgExplicitDefaults(self):
2337 # Test recvmsg[_into]() with default arguments provided explicitly.
2338 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2339 len(MSG), 0, 0)
2340 self.assertEqual(msg, MSG)
2341 self.checkRecvmsgAddress(addr, self.cli_addr)
2342 self.assertEqual(ancdata, [])
2343 self.checkFlags(flags, eor=True)
2344
2345 def _testRecvmsgExplicitDefaults(self):
2346 self.sendToServer(MSG)
2347
2348 def testRecvmsgShorter(self):
2349 # Receive a message smaller than buffer.
2350 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2351 len(MSG) + 42)
2352 self.assertEqual(msg, MSG)
2353 self.checkRecvmsgAddress(addr, self.cli_addr)
2354 self.assertEqual(ancdata, [])
2355 self.checkFlags(flags, eor=True)
2356
2357 def _testRecvmsgShorter(self):
2358 self.sendToServer(MSG)
2359
Charles-François Natali8619cd72011-10-03 19:43:15 +02002360 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2361 # datagram is received (issue #13001).
2362 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002363 def testRecvmsgTrunc(self):
2364 # Receive part of message, check for truncation indicators.
2365 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2366 len(MSG) - 3)
2367 self.assertEqual(msg, MSG[:-3])
2368 self.checkRecvmsgAddress(addr, self.cli_addr)
2369 self.assertEqual(ancdata, [])
2370 self.checkFlags(flags, eor=False)
2371
Charles-François Natali8619cd72011-10-03 19:43:15 +02002372 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002373 def _testRecvmsgTrunc(self):
2374 self.sendToServer(MSG)
2375
2376 def testRecvmsgShortAncillaryBuf(self):
2377 # Test ancillary data buffer too small to hold any ancillary data.
2378 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2379 len(MSG), 1)
2380 self.assertEqual(msg, MSG)
2381 self.checkRecvmsgAddress(addr, self.cli_addr)
2382 self.assertEqual(ancdata, [])
2383 self.checkFlags(flags, eor=True)
2384
2385 def _testRecvmsgShortAncillaryBuf(self):
2386 self.sendToServer(MSG)
2387
2388 def testRecvmsgLongAncillaryBuf(self):
2389 # Test large ancillary data buffer.
2390 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2391 len(MSG), 10240)
2392 self.assertEqual(msg, MSG)
2393 self.checkRecvmsgAddress(addr, self.cli_addr)
2394 self.assertEqual(ancdata, [])
2395 self.checkFlags(flags, eor=True)
2396
2397 def _testRecvmsgLongAncillaryBuf(self):
2398 self.sendToServer(MSG)
2399
2400 def testRecvmsgAfterClose(self):
2401 # Check that recvmsg[_into]() fails on a closed socket.
2402 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002403 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002404
2405 def _testRecvmsgAfterClose(self):
2406 pass
2407
2408 def testRecvmsgTimeout(self):
2409 # Check that timeout works.
2410 try:
2411 self.serv_sock.settimeout(0.03)
2412 self.assertRaises(socket.timeout,
2413 self.doRecvmsg, self.serv_sock, len(MSG))
2414 finally:
2415 self.misc_event.set()
2416
2417 def _testRecvmsgTimeout(self):
2418 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2419
2420 @requireAttrs(socket, "MSG_PEEK")
2421 def testRecvmsgPeek(self):
2422 # Check that MSG_PEEK in flags enables examination of pending
2423 # data without consuming it.
2424
2425 # Receive part of data with MSG_PEEK.
2426 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2427 len(MSG) - 3, 0,
2428 socket.MSG_PEEK)
2429 self.assertEqual(msg, MSG[:-3])
2430 self.checkRecvmsgAddress(addr, self.cli_addr)
2431 self.assertEqual(ancdata, [])
2432 # Ignoring MSG_TRUNC here (so this test is the same for stream
2433 # and datagram sockets). Some wording in POSIX seems to
2434 # suggest that it needn't be set when peeking, but that may
2435 # just be a slip.
2436 self.checkFlags(flags, eor=False,
2437 ignore=getattr(socket, "MSG_TRUNC", 0))
2438
2439 # Receive all data with MSG_PEEK.
2440 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2441 len(MSG), 0,
2442 socket.MSG_PEEK)
2443 self.assertEqual(msg, MSG)
2444 self.checkRecvmsgAddress(addr, self.cli_addr)
2445 self.assertEqual(ancdata, [])
2446 self.checkFlags(flags, eor=True)
2447
2448 # Check that the same data can still be received normally.
2449 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2450 self.assertEqual(msg, MSG)
2451 self.checkRecvmsgAddress(addr, self.cli_addr)
2452 self.assertEqual(ancdata, [])
2453 self.checkFlags(flags, eor=True)
2454
2455 @testRecvmsgPeek.client_skip
2456 def _testRecvmsgPeek(self):
2457 self.sendToServer(MSG)
2458
2459 @requireAttrs(socket.socket, "sendmsg")
2460 def testRecvmsgFromSendmsg(self):
2461 # Test receiving with recvmsg[_into]() when message is sent
2462 # using sendmsg().
2463 self.serv_sock.settimeout(self.fail_timeout)
2464 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2465 self.assertEqual(msg, MSG)
2466 self.checkRecvmsgAddress(addr, self.cli_addr)
2467 self.assertEqual(ancdata, [])
2468 self.checkFlags(flags, eor=True)
2469
2470 @testRecvmsgFromSendmsg.client_skip
2471 def _testRecvmsgFromSendmsg(self):
2472 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2473
2474
2475class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2476 # Tests which require a stream socket and can use either recvmsg()
2477 # or recvmsg_into().
2478
2479 def testRecvmsgEOF(self):
2480 # Receive end-of-stream indicator (b"", peer socket closed).
2481 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2482 self.assertEqual(msg, b"")
2483 self.checkRecvmsgAddress(addr, self.cli_addr)
2484 self.assertEqual(ancdata, [])
2485 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2486
2487 def _testRecvmsgEOF(self):
2488 self.cli_sock.close()
2489
2490 def testRecvmsgOverflow(self):
2491 # Receive a message in more than one chunk.
2492 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2493 len(MSG) - 3)
2494 self.checkRecvmsgAddress(addr, self.cli_addr)
2495 self.assertEqual(ancdata, [])
2496 self.checkFlags(flags, eor=False)
2497
2498 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2499 self.checkRecvmsgAddress(addr, self.cli_addr)
2500 self.assertEqual(ancdata, [])
2501 self.checkFlags(flags, eor=True)
2502
2503 msg = seg1 + seg2
2504 self.assertEqual(msg, MSG)
2505
2506 def _testRecvmsgOverflow(self):
2507 self.sendToServer(MSG)
2508
2509
2510class RecvmsgTests(RecvmsgGenericTests):
2511 # Tests for recvmsg() which can use any socket type.
2512
2513 def testRecvmsgBadArgs(self):
2514 # Check that recvmsg() rejects invalid arguments.
2515 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2516 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2517 -1, 0, 0)
2518 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2519 len(MSG), -1, 0)
2520 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2521 [bytearray(10)], 0, 0)
2522 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2523 object(), 0, 0)
2524 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2525 len(MSG), object(), 0)
2526 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2527 len(MSG), 0, object())
2528
2529 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2530 self.assertEqual(msg, MSG)
2531 self.checkRecvmsgAddress(addr, self.cli_addr)
2532 self.assertEqual(ancdata, [])
2533 self.checkFlags(flags, eor=True)
2534
2535 def _testRecvmsgBadArgs(self):
2536 self.sendToServer(MSG)
2537
2538
2539class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2540 # Tests for recvmsg_into() which can use any socket type.
2541
2542 def testRecvmsgIntoBadArgs(self):
2543 # Check that recvmsg_into() rejects invalid arguments.
2544 buf = bytearray(len(MSG))
2545 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2546 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2547 len(MSG), 0, 0)
2548 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2549 buf, 0, 0)
2550 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2551 [object()], 0, 0)
2552 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2553 [b"I'm not writable"], 0, 0)
2554 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2555 [buf, object()], 0, 0)
2556 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2557 [buf], -1, 0)
2558 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2559 [buf], object(), 0)
2560 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2561 [buf], 0, object())
2562
2563 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2564 self.assertEqual(nbytes, len(MSG))
2565 self.assertEqual(buf, bytearray(MSG))
2566 self.checkRecvmsgAddress(addr, self.cli_addr)
2567 self.assertEqual(ancdata, [])
2568 self.checkFlags(flags, eor=True)
2569
2570 def _testRecvmsgIntoBadArgs(self):
2571 self.sendToServer(MSG)
2572
2573 def testRecvmsgIntoGenerator(self):
2574 # Receive into buffer obtained from a generator (not a sequence).
2575 buf = bytearray(len(MSG))
2576 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2577 (o for o in [buf]))
2578 self.assertEqual(nbytes, len(MSG))
2579 self.assertEqual(buf, bytearray(MSG))
2580 self.checkRecvmsgAddress(addr, self.cli_addr)
2581 self.assertEqual(ancdata, [])
2582 self.checkFlags(flags, eor=True)
2583
2584 def _testRecvmsgIntoGenerator(self):
2585 self.sendToServer(MSG)
2586
2587 def testRecvmsgIntoArray(self):
2588 # Receive into an array rather than the usual bytearray.
2589 buf = array.array("B", [0] * len(MSG))
2590 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2591 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002592 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002593 self.checkRecvmsgAddress(addr, self.cli_addr)
2594 self.assertEqual(ancdata, [])
2595 self.checkFlags(flags, eor=True)
2596
2597 def _testRecvmsgIntoArray(self):
2598 self.sendToServer(MSG)
2599
2600 def testRecvmsgIntoScatter(self):
2601 # Receive into multiple buffers (scatter write).
2602 b1 = bytearray(b"----")
2603 b2 = bytearray(b"0123456789")
2604 b3 = bytearray(b"--------------")
2605 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2606 [b1, memoryview(b2)[2:9], b3])
2607 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2608 self.assertEqual(b1, bytearray(b"Mary"))
2609 self.assertEqual(b2, bytearray(b"01 had a 9"))
2610 self.assertEqual(b3, bytearray(b"little lamb---"))
2611 self.checkRecvmsgAddress(addr, self.cli_addr)
2612 self.assertEqual(ancdata, [])
2613 self.checkFlags(flags, eor=True)
2614
2615 def _testRecvmsgIntoScatter(self):
2616 self.sendToServer(b"Mary had a little lamb")
2617
2618
2619class CmsgMacroTests(unittest.TestCase):
2620 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2621 # assumptions used by sendmsg() and recvmsg[_into](), which share
2622 # code with these functions.
2623
2624 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002625 try:
2626 import _testcapi
2627 except ImportError:
2628 socklen_t_limit = 0x7fffffff
2629 else:
2630 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002631
2632 @requireAttrs(socket, "CMSG_LEN")
2633 def testCMSG_LEN(self):
2634 # Test CMSG_LEN() with various valid and invalid values,
2635 # checking the assumptions used by recvmsg() and sendmsg().
2636 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2637 values = list(range(257)) + list(range(toobig - 257, toobig))
2638
2639 # struct cmsghdr has at least three members, two of which are ints
2640 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2641 for n in values:
2642 ret = socket.CMSG_LEN(n)
2643 # This is how recvmsg() calculates the data size
2644 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2645 self.assertLessEqual(ret, self.socklen_t_limit)
2646
2647 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2648 # sendmsg() shares code with these functions, and requires
2649 # that it reject values over the limit.
2650 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2651 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2652
2653 @requireAttrs(socket, "CMSG_SPACE")
2654 def testCMSG_SPACE(self):
2655 # Test CMSG_SPACE() with various valid and invalid values,
2656 # checking the assumptions used by sendmsg().
2657 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2658 values = list(range(257)) + list(range(toobig - 257, toobig))
2659
2660 last = socket.CMSG_SPACE(0)
2661 # struct cmsghdr has at least three members, two of which are ints
2662 self.assertGreater(last, array.array("i").itemsize * 2)
2663 for n in values:
2664 ret = socket.CMSG_SPACE(n)
2665 self.assertGreaterEqual(ret, last)
2666 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2667 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2668 self.assertLessEqual(ret, self.socklen_t_limit)
2669 last = ret
2670
2671 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2672 # sendmsg() shares code with these functions, and requires
2673 # that it reject values over the limit.
2674 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2675 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2676
2677
2678class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2679 # Tests for file descriptor passing on Unix-domain sockets.
2680
2681 # Invalid file descriptor value that's unlikely to evaluate to a
2682 # real FD even if one of its bytes is replaced with a different
2683 # value (which shouldn't actually happen).
2684 badfd = -0x5555
2685
2686 def newFDs(self, n):
2687 # Return a list of n file descriptors for newly-created files
2688 # containing their list indices as ASCII numbers.
2689 fds = []
2690 for i in range(n):
2691 fd, path = tempfile.mkstemp()
2692 self.addCleanup(os.unlink, path)
2693 self.addCleanup(os.close, fd)
2694 os.write(fd, str(i).encode())
2695 fds.append(fd)
2696 return fds
2697
2698 def checkFDs(self, fds):
2699 # Check that the file descriptors in the given list contain
2700 # their correct list indices as ASCII numbers.
2701 for n, fd in enumerate(fds):
2702 os.lseek(fd, 0, os.SEEK_SET)
2703 self.assertEqual(os.read(fd, 1024), str(n).encode())
2704
2705 def registerRecvmsgResult(self, result):
2706 self.addCleanup(self.closeRecvmsgFDs, result)
2707
2708 def closeRecvmsgFDs(self, recvmsg_result):
2709 # Close all file descriptors specified in the ancillary data
2710 # of the given return value from recvmsg() or recvmsg_into().
2711 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2712 if (cmsg_level == socket.SOL_SOCKET and
2713 cmsg_type == socket.SCM_RIGHTS):
2714 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002715 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002716 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2717 for fd in fds:
2718 os.close(fd)
2719
2720 def createAndSendFDs(self, n):
2721 # Send n new file descriptors created by newFDs() to the
2722 # server, with the constant MSG as the non-ancillary data.
2723 self.assertEqual(
2724 self.sendmsgToServer([MSG],
2725 [(socket.SOL_SOCKET,
2726 socket.SCM_RIGHTS,
2727 array.array("i", self.newFDs(n)))]),
2728 len(MSG))
2729
2730 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2731 # Check that constant MSG was received with numfds file
2732 # descriptors in a maximum of maxcmsgs control messages (which
2733 # must contain only complete integers). By default, check
2734 # that MSG_CTRUNC is unset, but ignore any flags in
2735 # ignoreflags.
2736 msg, ancdata, flags, addr = result
2737 self.assertEqual(msg, MSG)
2738 self.checkRecvmsgAddress(addr, self.cli_addr)
2739 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2740 ignore=ignoreflags)
2741
2742 self.assertIsInstance(ancdata, list)
2743 self.assertLessEqual(len(ancdata), maxcmsgs)
2744 fds = array.array("i")
2745 for item in ancdata:
2746 self.assertIsInstance(item, tuple)
2747 cmsg_level, cmsg_type, cmsg_data = item
2748 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2749 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2750 self.assertIsInstance(cmsg_data, bytes)
2751 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002752 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002753
2754 self.assertEqual(len(fds), numfds)
2755 self.checkFDs(fds)
2756
2757 def testFDPassSimple(self):
2758 # Pass a single FD (array read from bytes object).
2759 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2760 len(MSG), 10240))
2761
2762 def _testFDPassSimple(self):
2763 self.assertEqual(
2764 self.sendmsgToServer(
2765 [MSG],
2766 [(socket.SOL_SOCKET,
2767 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002768 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002769 len(MSG))
2770
2771 def testMultipleFDPass(self):
2772 # Pass multiple FDs in a single array.
2773 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2774 len(MSG), 10240))
2775
2776 def _testMultipleFDPass(self):
2777 self.createAndSendFDs(4)
2778
2779 @requireAttrs(socket, "CMSG_SPACE")
2780 def testFDPassCMSG_SPACE(self):
2781 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2782 self.checkRecvmsgFDs(
2783 4, self.doRecvmsg(self.serv_sock, len(MSG),
2784 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2785
2786 @testFDPassCMSG_SPACE.client_skip
2787 def _testFDPassCMSG_SPACE(self):
2788 self.createAndSendFDs(4)
2789
2790 def testFDPassCMSG_LEN(self):
2791 # Test using CMSG_LEN() to calculate ancillary buffer size.
2792 self.checkRecvmsgFDs(1,
2793 self.doRecvmsg(self.serv_sock, len(MSG),
2794 socket.CMSG_LEN(4 * SIZEOF_INT)),
2795 # RFC 3542 says implementations may set
2796 # MSG_CTRUNC if there isn't enough space
2797 # for trailing padding.
2798 ignoreflags=socket.MSG_CTRUNC)
2799
2800 def _testFDPassCMSG_LEN(self):
2801 self.createAndSendFDs(1)
2802
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002803 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002804 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002805 @requireAttrs(socket, "CMSG_SPACE")
2806 def testFDPassSeparate(self):
2807 # Pass two FDs in two separate arrays. Arrays may be combined
2808 # into a single control message by the OS.
2809 self.checkRecvmsgFDs(2,
2810 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2811 maxcmsgs=2)
2812
2813 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002814 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002815 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002816 def _testFDPassSeparate(self):
2817 fd0, fd1 = self.newFDs(2)
2818 self.assertEqual(
2819 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2820 socket.SCM_RIGHTS,
2821 array.array("i", [fd0])),
2822 (socket.SOL_SOCKET,
2823 socket.SCM_RIGHTS,
2824 array.array("i", [fd1]))]),
2825 len(MSG))
2826
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002827 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002828 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002829 @requireAttrs(socket, "CMSG_SPACE")
2830 def testFDPassSeparateMinSpace(self):
2831 # Pass two FDs in two separate arrays, receiving them into the
2832 # minimum space for two arrays.
2833 self.checkRecvmsgFDs(2,
2834 self.doRecvmsg(self.serv_sock, len(MSG),
2835 socket.CMSG_SPACE(SIZEOF_INT) +
2836 socket.CMSG_LEN(SIZEOF_INT)),
2837 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2838
2839 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002840 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002841 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002842 def _testFDPassSeparateMinSpace(self):
2843 fd0, fd1 = self.newFDs(2)
2844 self.assertEqual(
2845 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2846 socket.SCM_RIGHTS,
2847 array.array("i", [fd0])),
2848 (socket.SOL_SOCKET,
2849 socket.SCM_RIGHTS,
2850 array.array("i", [fd1]))]),
2851 len(MSG))
2852
2853 def sendAncillaryIfPossible(self, msg, ancdata):
2854 # Try to send msg and ancdata to server, but if the system
2855 # call fails, just send msg with no ancillary data.
2856 try:
2857 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002858 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002859 # Check that it was the system call that failed
2860 self.assertIsInstance(e.errno, int)
2861 nbytes = self.sendmsgToServer([msg])
2862 self.assertEqual(nbytes, len(msg))
2863
Brett Cannon3bbad122015-12-28 17:21:44 -08002864 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002865 def testFDPassEmpty(self):
2866 # Try to pass an empty FD array. Can receive either no array
2867 # or an empty array.
2868 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2869 len(MSG), 10240),
2870 ignoreflags=socket.MSG_CTRUNC)
2871
2872 def _testFDPassEmpty(self):
2873 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2874 socket.SCM_RIGHTS,
2875 b"")])
2876
2877 def testFDPassPartialInt(self):
2878 # Try to pass a truncated FD array.
2879 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2880 len(MSG), 10240)
2881 self.assertEqual(msg, MSG)
2882 self.checkRecvmsgAddress(addr, self.cli_addr)
2883 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2884 self.assertLessEqual(len(ancdata), 1)
2885 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2886 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2887 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2888 self.assertLess(len(cmsg_data), SIZEOF_INT)
2889
2890 def _testFDPassPartialInt(self):
2891 self.sendAncillaryIfPossible(
2892 MSG,
2893 [(socket.SOL_SOCKET,
2894 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002895 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002896
2897 @requireAttrs(socket, "CMSG_SPACE")
2898 def testFDPassPartialIntInMiddle(self):
2899 # Try to pass two FD arrays, the first of which is truncated.
2900 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2901 len(MSG), 10240)
2902 self.assertEqual(msg, MSG)
2903 self.checkRecvmsgAddress(addr, self.cli_addr)
2904 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2905 self.assertLessEqual(len(ancdata), 2)
2906 fds = array.array("i")
2907 # Arrays may have been combined in a single control message
2908 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2909 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2910 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002911 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002912 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2913 self.assertLessEqual(len(fds), 2)
2914 self.checkFDs(fds)
2915
2916 @testFDPassPartialIntInMiddle.client_skip
2917 def _testFDPassPartialIntInMiddle(self):
2918 fd0, fd1 = self.newFDs(2)
2919 self.sendAncillaryIfPossible(
2920 MSG,
2921 [(socket.SOL_SOCKET,
2922 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002923 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002924 (socket.SOL_SOCKET,
2925 socket.SCM_RIGHTS,
2926 array.array("i", [fd1]))])
2927
2928 def checkTruncatedHeader(self, result, ignoreflags=0):
2929 # Check that no ancillary data items are returned when data is
2930 # truncated inside the cmsghdr structure.
2931 msg, ancdata, flags, addr = result
2932 self.assertEqual(msg, MSG)
2933 self.checkRecvmsgAddress(addr, self.cli_addr)
2934 self.assertEqual(ancdata, [])
2935 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2936 ignore=ignoreflags)
2937
2938 def testCmsgTruncNoBufSize(self):
2939 # Check that no ancillary data is received when no buffer size
2940 # is specified.
2941 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2942 # BSD seems to set MSG_CTRUNC only
2943 # if an item has been partially
2944 # received.
2945 ignoreflags=socket.MSG_CTRUNC)
2946
2947 def _testCmsgTruncNoBufSize(self):
2948 self.createAndSendFDs(1)
2949
2950 def testCmsgTrunc0(self):
2951 # Check that no ancillary data is received when buffer size is 0.
2952 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2953 ignoreflags=socket.MSG_CTRUNC)
2954
2955 def _testCmsgTrunc0(self):
2956 self.createAndSendFDs(1)
2957
2958 # Check that no ancillary data is returned for various non-zero
2959 # (but still too small) buffer sizes.
2960
2961 def testCmsgTrunc1(self):
2962 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2963
2964 def _testCmsgTrunc1(self):
2965 self.createAndSendFDs(1)
2966
2967 def testCmsgTrunc2Int(self):
2968 # The cmsghdr structure has at least three members, two of
2969 # which are ints, so we still shouldn't see any ancillary
2970 # data.
2971 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2972 SIZEOF_INT * 2))
2973
2974 def _testCmsgTrunc2Int(self):
2975 self.createAndSendFDs(1)
2976
2977 def testCmsgTruncLen0Minus1(self):
2978 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2979 socket.CMSG_LEN(0) - 1))
2980
2981 def _testCmsgTruncLen0Minus1(self):
2982 self.createAndSendFDs(1)
2983
2984 # The following tests try to truncate the control message in the
2985 # middle of the FD array.
2986
2987 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2988 # Check that file descriptor data is truncated to between
2989 # mindata and maxdata bytes when received with buffer size
2990 # ancbuf, and that any complete file descriptor numbers are
2991 # valid.
2992 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2993 len(MSG), ancbuf)
2994 self.assertEqual(msg, MSG)
2995 self.checkRecvmsgAddress(addr, self.cli_addr)
2996 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2997
2998 if mindata == 0 and ancdata == []:
2999 return
3000 self.assertEqual(len(ancdata), 1)
3001 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3002 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3003 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3004 self.assertGreaterEqual(len(cmsg_data), mindata)
3005 self.assertLessEqual(len(cmsg_data), maxdata)
3006 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003007 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003008 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3009 self.checkFDs(fds)
3010
3011 def testCmsgTruncLen0(self):
3012 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3013
3014 def _testCmsgTruncLen0(self):
3015 self.createAndSendFDs(1)
3016
3017 def testCmsgTruncLen0Plus1(self):
3018 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3019
3020 def _testCmsgTruncLen0Plus1(self):
3021 self.createAndSendFDs(2)
3022
3023 def testCmsgTruncLen1(self):
3024 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3025 maxdata=SIZEOF_INT)
3026
3027 def _testCmsgTruncLen1(self):
3028 self.createAndSendFDs(2)
3029
3030 def testCmsgTruncLen2Minus1(self):
3031 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3032 maxdata=(2 * SIZEOF_INT) - 1)
3033
3034 def _testCmsgTruncLen2Minus1(self):
3035 self.createAndSendFDs(2)
3036
3037
3038class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3039 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3040 # features of the RFC 3542 Advanced Sockets API for IPv6.
3041 # Currently we can only handle certain data items (e.g. traffic
3042 # class, hop limit, MTU discovery and fragmentation settings)
3043 # without resorting to unportable means such as the struct module,
3044 # but the tests here are aimed at testing the ancillary data
3045 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3046 # itself.
3047
3048 # Test value to use when setting hop limit of packet
3049 hop_limit = 2
3050
3051 # Test value to use when setting traffic class of packet.
3052 # -1 means "use kernel default".
3053 traffic_class = -1
3054
3055 def ancillaryMapping(self, ancdata):
3056 # Given ancillary data list ancdata, return a mapping from
3057 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3058 # Check that no (level, type) pair appears more than once.
3059 d = {}
3060 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3061 self.assertNotIn((cmsg_level, cmsg_type), d)
3062 d[(cmsg_level, cmsg_type)] = cmsg_data
3063 return d
3064
3065 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3066 # Receive hop limit into ancbufsize bytes of ancillary data
3067 # space. Check that data is MSG, ancillary data is not
3068 # truncated (but ignore any flags in ignoreflags), and hop
3069 # limit is between 0 and maxhop inclusive.
3070 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3071 socket.IPV6_RECVHOPLIMIT, 1)
3072 self.misc_event.set()
3073 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3074 len(MSG), ancbufsize)
3075
3076 self.assertEqual(msg, MSG)
3077 self.checkRecvmsgAddress(addr, self.cli_addr)
3078 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3079 ignore=ignoreflags)
3080
3081 self.assertEqual(len(ancdata), 1)
3082 self.assertIsInstance(ancdata[0], tuple)
3083 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3084 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3085 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3086 self.assertIsInstance(cmsg_data, bytes)
3087 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3088 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003089 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003090 self.assertGreaterEqual(a[0], 0)
3091 self.assertLessEqual(a[0], maxhop)
3092
3093 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3094 def testRecvHopLimit(self):
3095 # Test receiving the packet hop limit as ancillary data.
3096 self.checkHopLimit(ancbufsize=10240)
3097
3098 @testRecvHopLimit.client_skip
3099 def _testRecvHopLimit(self):
3100 # Need to wait until server has asked to receive ancillary
3101 # data, as implementations are not required to buffer it
3102 # otherwise.
3103 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3104 self.sendToServer(MSG)
3105
3106 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3107 def testRecvHopLimitCMSG_SPACE(self):
3108 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3109 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3110
3111 @testRecvHopLimitCMSG_SPACE.client_skip
3112 def _testRecvHopLimitCMSG_SPACE(self):
3113 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3114 self.sendToServer(MSG)
3115
3116 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3117 # 3542 says portable applications must provide space for trailing
3118 # padding. Implementations may set MSG_CTRUNC if there isn't
3119 # enough space for the padding.
3120
3121 @requireAttrs(socket.socket, "sendmsg")
3122 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3123 def testSetHopLimit(self):
3124 # Test setting hop limit on outgoing packet and receiving it
3125 # at the other end.
3126 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3127
3128 @testSetHopLimit.client_skip
3129 def _testSetHopLimit(self):
3130 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3131 self.assertEqual(
3132 self.sendmsgToServer([MSG],
3133 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3134 array.array("i", [self.hop_limit]))]),
3135 len(MSG))
3136
3137 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3138 ignoreflags=0):
3139 # Receive traffic class and hop limit into ancbufsize bytes of
3140 # ancillary data space. Check that data is MSG, ancillary
3141 # data is not truncated (but ignore any flags in ignoreflags),
3142 # and traffic class and hop limit are in range (hop limit no
3143 # more than maxhop).
3144 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3145 socket.IPV6_RECVHOPLIMIT, 1)
3146 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3147 socket.IPV6_RECVTCLASS, 1)
3148 self.misc_event.set()
3149 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3150 len(MSG), ancbufsize)
3151
3152 self.assertEqual(msg, MSG)
3153 self.checkRecvmsgAddress(addr, self.cli_addr)
3154 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3155 ignore=ignoreflags)
3156 self.assertEqual(len(ancdata), 2)
3157 ancmap = self.ancillaryMapping(ancdata)
3158
3159 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3160 self.assertEqual(len(tcdata), SIZEOF_INT)
3161 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003162 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003163 self.assertGreaterEqual(a[0], 0)
3164 self.assertLessEqual(a[0], 255)
3165
3166 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3167 self.assertEqual(len(hldata), SIZEOF_INT)
3168 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003169 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003170 self.assertGreaterEqual(a[0], 0)
3171 self.assertLessEqual(a[0], maxhop)
3172
3173 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3174 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3175 def testRecvTrafficClassAndHopLimit(self):
3176 # Test receiving traffic class and hop limit as ancillary data.
3177 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3178
3179 @testRecvTrafficClassAndHopLimit.client_skip
3180 def _testRecvTrafficClassAndHopLimit(self):
3181 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3182 self.sendToServer(MSG)
3183
3184 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3185 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3186 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3187 # Test receiving traffic class and hop limit, using
3188 # CMSG_SPACE() to calculate buffer size.
3189 self.checkTrafficClassAndHopLimit(
3190 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3191
3192 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3193 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3194 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3195 self.sendToServer(MSG)
3196
3197 @requireAttrs(socket.socket, "sendmsg")
3198 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3199 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3200 def testSetTrafficClassAndHopLimit(self):
3201 # Test setting traffic class and hop limit on outgoing packet,
3202 # and receiving them at the other end.
3203 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3204 maxhop=self.hop_limit)
3205
3206 @testSetTrafficClassAndHopLimit.client_skip
3207 def _testSetTrafficClassAndHopLimit(self):
3208 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3209 self.assertEqual(
3210 self.sendmsgToServer([MSG],
3211 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3212 array.array("i", [self.traffic_class])),
3213 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3214 array.array("i", [self.hop_limit]))]),
3215 len(MSG))
3216
3217 @requireAttrs(socket.socket, "sendmsg")
3218 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3219 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3220 def testOddCmsgSize(self):
3221 # Try to send ancillary data with first item one byte too
3222 # long. Fall back to sending with correct size if this fails,
3223 # and check that second item was handled correctly.
3224 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3225 maxhop=self.hop_limit)
3226
3227 @testOddCmsgSize.client_skip
3228 def _testOddCmsgSize(self):
3229 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3230 try:
3231 nbytes = self.sendmsgToServer(
3232 [MSG],
3233 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003234 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003235 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3236 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003237 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003238 self.assertIsInstance(e.errno, int)
3239 nbytes = self.sendmsgToServer(
3240 [MSG],
3241 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3242 array.array("i", [self.traffic_class])),
3243 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3244 array.array("i", [self.hop_limit]))])
3245 self.assertEqual(nbytes, len(MSG))
3246
3247 # Tests for proper handling of truncated ancillary data
3248
3249 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3250 # Receive hop limit into ancbufsize bytes of ancillary data
3251 # space, which should be too small to contain the ancillary
3252 # data header (if ancbufsize is None, pass no second argument
3253 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3254 # (unless included in ignoreflags), and no ancillary data is
3255 # returned.
3256 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3257 socket.IPV6_RECVHOPLIMIT, 1)
3258 self.misc_event.set()
3259 args = () if ancbufsize is None else (ancbufsize,)
3260 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3261 len(MSG), *args)
3262
3263 self.assertEqual(msg, MSG)
3264 self.checkRecvmsgAddress(addr, self.cli_addr)
3265 self.assertEqual(ancdata, [])
3266 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3267 ignore=ignoreflags)
3268
3269 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3270 def testCmsgTruncNoBufSize(self):
3271 # Check that no ancillary data is received when no ancillary
3272 # buffer size is provided.
3273 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3274 # BSD seems to set
3275 # MSG_CTRUNC only if an item
3276 # has been partially
3277 # received.
3278 ignoreflags=socket.MSG_CTRUNC)
3279
3280 @testCmsgTruncNoBufSize.client_skip
3281 def _testCmsgTruncNoBufSize(self):
3282 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3283 self.sendToServer(MSG)
3284
3285 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3286 def testSingleCmsgTrunc0(self):
3287 # Check that no ancillary data is received when ancillary
3288 # buffer size is zero.
3289 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3290 ignoreflags=socket.MSG_CTRUNC)
3291
3292 @testSingleCmsgTrunc0.client_skip
3293 def _testSingleCmsgTrunc0(self):
3294 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3295 self.sendToServer(MSG)
3296
3297 # Check that no ancillary data is returned for various non-zero
3298 # (but still too small) buffer sizes.
3299
3300 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3301 def testSingleCmsgTrunc1(self):
3302 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3303
3304 @testSingleCmsgTrunc1.client_skip
3305 def _testSingleCmsgTrunc1(self):
3306 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3307 self.sendToServer(MSG)
3308
3309 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3310 def testSingleCmsgTrunc2Int(self):
3311 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3312
3313 @testSingleCmsgTrunc2Int.client_skip
3314 def _testSingleCmsgTrunc2Int(self):
3315 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3316 self.sendToServer(MSG)
3317
3318 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3319 def testSingleCmsgTruncLen0Minus1(self):
3320 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3321
3322 @testSingleCmsgTruncLen0Minus1.client_skip
3323 def _testSingleCmsgTruncLen0Minus1(self):
3324 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3325 self.sendToServer(MSG)
3326
3327 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3328 def testSingleCmsgTruncInData(self):
3329 # Test truncation of a control message inside its associated
3330 # data. The message may be returned with its data truncated,
3331 # or not returned at all.
3332 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3333 socket.IPV6_RECVHOPLIMIT, 1)
3334 self.misc_event.set()
3335 msg, ancdata, flags, addr = self.doRecvmsg(
3336 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3337
3338 self.assertEqual(msg, MSG)
3339 self.checkRecvmsgAddress(addr, self.cli_addr)
3340 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3341
3342 self.assertLessEqual(len(ancdata), 1)
3343 if ancdata:
3344 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3345 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3346 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3347 self.assertLess(len(cmsg_data), SIZEOF_INT)
3348
3349 @testSingleCmsgTruncInData.client_skip
3350 def _testSingleCmsgTruncInData(self):
3351 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3352 self.sendToServer(MSG)
3353
3354 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3355 # Receive traffic class and hop limit into ancbufsize bytes of
3356 # ancillary data space, which should be large enough to
3357 # contain the first item, but too small to contain the header
3358 # of the second. Check that data is MSG, MSG_CTRUNC is set
3359 # (unless included in ignoreflags), and only one ancillary
3360 # data item is returned.
3361 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3362 socket.IPV6_RECVHOPLIMIT, 1)
3363 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3364 socket.IPV6_RECVTCLASS, 1)
3365 self.misc_event.set()
3366 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3367 len(MSG), ancbufsize)
3368
3369 self.assertEqual(msg, MSG)
3370 self.checkRecvmsgAddress(addr, self.cli_addr)
3371 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3372 ignore=ignoreflags)
3373
3374 self.assertEqual(len(ancdata), 1)
3375 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3376 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3377 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3378 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3379 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003380 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003381 self.assertGreaterEqual(a[0], 0)
3382 self.assertLessEqual(a[0], 255)
3383
3384 # Try the above test with various buffer sizes.
3385
3386 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3387 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3388 def testSecondCmsgTrunc0(self):
3389 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3390 ignoreflags=socket.MSG_CTRUNC)
3391
3392 @testSecondCmsgTrunc0.client_skip
3393 def _testSecondCmsgTrunc0(self):
3394 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3395 self.sendToServer(MSG)
3396
3397 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3398 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3399 def testSecondCmsgTrunc1(self):
3400 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3401
3402 @testSecondCmsgTrunc1.client_skip
3403 def _testSecondCmsgTrunc1(self):
3404 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3405 self.sendToServer(MSG)
3406
3407 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3408 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3409 def testSecondCmsgTrunc2Int(self):
3410 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3411 2 * SIZEOF_INT)
3412
3413 @testSecondCmsgTrunc2Int.client_skip
3414 def _testSecondCmsgTrunc2Int(self):
3415 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3416 self.sendToServer(MSG)
3417
3418 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3419 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3420 def testSecondCmsgTruncLen0Minus1(self):
3421 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3422 socket.CMSG_LEN(0) - 1)
3423
3424 @testSecondCmsgTruncLen0Minus1.client_skip
3425 def _testSecondCmsgTruncLen0Minus1(self):
3426 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3427 self.sendToServer(MSG)
3428
3429 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3430 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3431 def testSecomdCmsgTruncInData(self):
3432 # Test truncation of the second of two control messages inside
3433 # its associated data.
3434 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3435 socket.IPV6_RECVHOPLIMIT, 1)
3436 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3437 socket.IPV6_RECVTCLASS, 1)
3438 self.misc_event.set()
3439 msg, ancdata, flags, addr = self.doRecvmsg(
3440 self.serv_sock, len(MSG),
3441 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3442
3443 self.assertEqual(msg, MSG)
3444 self.checkRecvmsgAddress(addr, self.cli_addr)
3445 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3446
3447 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3448
3449 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3450 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3451 cmsg_types.remove(cmsg_type)
3452 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3453 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003454 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003455 self.assertGreaterEqual(a[0], 0)
3456 self.assertLessEqual(a[0], 255)
3457
3458 if ancdata:
3459 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3460 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3461 cmsg_types.remove(cmsg_type)
3462 self.assertLess(len(cmsg_data), SIZEOF_INT)
3463
3464 self.assertEqual(ancdata, [])
3465
3466 @testSecomdCmsgTruncInData.client_skip
3467 def _testSecomdCmsgTruncInData(self):
3468 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3469 self.sendToServer(MSG)
3470
3471
3472# Derive concrete test classes for different socket types.
3473
3474class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3475 SendrecvmsgConnectionlessBase,
3476 ThreadedSocketTestMixin, UDPTestBase):
3477 pass
3478
3479@requireAttrs(socket.socket, "sendmsg")
3480@unittest.skipUnless(thread, 'Threading required for this test.')
3481class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3482 pass
3483
3484@requireAttrs(socket.socket, "recvmsg")
3485@unittest.skipUnless(thread, 'Threading required for this test.')
3486class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3487 pass
3488
3489@requireAttrs(socket.socket, "recvmsg_into")
3490@unittest.skipUnless(thread, 'Threading required for this test.')
3491class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3492 pass
3493
3494
3495class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3496 SendrecvmsgConnectionlessBase,
3497 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003498
3499 def checkRecvmsgAddress(self, addr1, addr2):
3500 # Called to compare the received address with the address of
3501 # the peer, ignoring scope ID
3502 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003503
3504@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003505@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003506@requireSocket("AF_INET6", "SOCK_DGRAM")
3507@unittest.skipUnless(thread, 'Threading required for this test.')
3508class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3509 pass
3510
3511@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003512@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003513@requireSocket("AF_INET6", "SOCK_DGRAM")
3514@unittest.skipUnless(thread, 'Threading required for this test.')
3515class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3516 pass
3517
3518@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003519@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003520@requireSocket("AF_INET6", "SOCK_DGRAM")
3521@unittest.skipUnless(thread, 'Threading required for this test.')
3522class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3523 pass
3524
3525@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003526@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003527@requireAttrs(socket, "IPPROTO_IPV6")
3528@requireSocket("AF_INET6", "SOCK_DGRAM")
3529@unittest.skipUnless(thread, 'Threading required for this test.')
3530class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3531 SendrecvmsgUDP6TestBase):
3532 pass
3533
3534@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003535@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003536@requireAttrs(socket, "IPPROTO_IPV6")
3537@requireSocket("AF_INET6", "SOCK_DGRAM")
3538@unittest.skipUnless(thread, 'Threading required for this test.')
3539class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3540 RFC3542AncillaryTest,
3541 SendrecvmsgUDP6TestBase):
3542 pass
3543
3544
3545class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3546 ConnectedStreamTestMixin, TCPTestBase):
3547 pass
3548
3549@requireAttrs(socket.socket, "sendmsg")
3550@unittest.skipUnless(thread, 'Threading required for this test.')
3551class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3552 pass
3553
3554@requireAttrs(socket.socket, "recvmsg")
3555@unittest.skipUnless(thread, 'Threading required for this test.')
3556class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3557 SendrecvmsgTCPTestBase):
3558 pass
3559
3560@requireAttrs(socket.socket, "recvmsg_into")
3561@unittest.skipUnless(thread, 'Threading required for this test.')
3562class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3563 SendrecvmsgTCPTestBase):
3564 pass
3565
3566
3567class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3568 SendrecvmsgConnectedBase,
3569 ConnectedStreamTestMixin, SCTPStreamBase):
3570 pass
3571
3572@requireAttrs(socket.socket, "sendmsg")
3573@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3574@unittest.skipUnless(thread, 'Threading required for this test.')
3575class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3576 pass
3577
3578@requireAttrs(socket.socket, "recvmsg")
3579@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3580@unittest.skipUnless(thread, 'Threading required for this test.')
3581class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3582 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003583
3584 def testRecvmsgEOF(self):
3585 try:
3586 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3587 except OSError as e:
3588 if e.errno != errno.ENOTCONN:
3589 raise
3590 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003591
3592@requireAttrs(socket.socket, "recvmsg_into")
3593@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3594@unittest.skipUnless(thread, 'Threading required for this test.')
3595class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3596 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003597
3598 def testRecvmsgEOF(self):
3599 try:
3600 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3601 except OSError as e:
3602 if e.errno != errno.ENOTCONN:
3603 raise
3604 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003605
3606
3607class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3608 ConnectedStreamTestMixin, UnixStreamBase):
3609 pass
3610
3611@requireAttrs(socket.socket, "sendmsg")
3612@requireAttrs(socket, "AF_UNIX")
3613@unittest.skipUnless(thread, 'Threading required for this test.')
3614class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3615 pass
3616
3617@requireAttrs(socket.socket, "recvmsg")
3618@requireAttrs(socket, "AF_UNIX")
3619@unittest.skipUnless(thread, 'Threading required for this test.')
3620class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3621 SendrecvmsgUnixStreamTestBase):
3622 pass
3623
3624@requireAttrs(socket.socket, "recvmsg_into")
3625@requireAttrs(socket, "AF_UNIX")
3626@unittest.skipUnless(thread, 'Threading required for this test.')
3627class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3628 SendrecvmsgUnixStreamTestBase):
3629 pass
3630
3631@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3632@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3633@unittest.skipUnless(thread, 'Threading required for this test.')
3634class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3635 pass
3636
3637@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3638@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3639@unittest.skipUnless(thread, 'Threading required for this test.')
3640class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3641 SendrecvmsgUnixStreamTestBase):
3642 pass
3643
3644
3645# Test interrupting the interruptible send/receive methods with a
3646# signal when a timeout is set. These tests avoid having multiple
3647# threads alive during the test so that the OS cannot deliver the
3648# signal to the wrong one.
3649
3650class InterruptedTimeoutBase(unittest.TestCase):
3651 # Base class for interrupted send/receive tests. Installs an
3652 # empty handler for SIGALRM and removes it on teardown, along with
3653 # any scheduled alarms.
3654
3655 def setUp(self):
3656 super().setUp()
3657 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003658 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003659 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3660 self.addCleanup(self.setAlarm, 0)
3661
3662 # Timeout for socket operations
3663 timeout = 4.0
3664
3665 # Provide setAlarm() method to schedule delivery of SIGALRM after
3666 # given number of seconds, or cancel it if zero, and an
3667 # appropriate time value to use. Use setitimer() if available.
3668 if hasattr(signal, "setitimer"):
3669 alarm_time = 0.05
3670
3671 def setAlarm(self, seconds):
3672 signal.setitimer(signal.ITIMER_REAL, seconds)
3673 else:
3674 # Old systems may deliver the alarm up to one second early
3675 alarm_time = 2
3676
3677 def setAlarm(self, seconds):
3678 signal.alarm(seconds)
3679
3680
3681# Require siginterrupt() in order to ensure that system calls are
3682# interrupted by default.
3683@requireAttrs(signal, "siginterrupt")
3684@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3685 "Don't have signal.alarm or signal.setitimer")
3686class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3687 # Test interrupting the recv*() methods with signals when a
3688 # timeout is set.
3689
3690 def setUp(self):
3691 super().setUp()
3692 self.serv.settimeout(self.timeout)
3693
3694 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003695 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003696 # errno of EINTR when interrupted by a signal.
3697 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003698 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003699 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003700
3701 def testInterruptedRecvTimeout(self):
3702 self.checkInterruptedRecv(self.serv.recv, 1024)
3703
3704 def testInterruptedRecvIntoTimeout(self):
3705 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3706
3707 def testInterruptedRecvfromTimeout(self):
3708 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3709
3710 def testInterruptedRecvfromIntoTimeout(self):
3711 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3712
3713 @requireAttrs(socket.socket, "recvmsg")
3714 def testInterruptedRecvmsgTimeout(self):
3715 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3716
3717 @requireAttrs(socket.socket, "recvmsg_into")
3718 def testInterruptedRecvmsgIntoTimeout(self):
3719 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3720
3721
3722# Require siginterrupt() in order to ensure that system calls are
3723# interrupted by default.
3724@requireAttrs(signal, "siginterrupt")
3725@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3726 "Don't have signal.alarm or signal.setitimer")
3727@unittest.skipUnless(thread, 'Threading required for this test.')
3728class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3729 ThreadSafeCleanupTestCase,
3730 SocketListeningTestMixin, TCPTestBase):
3731 # Test interrupting the interruptible send*() methods with signals
3732 # when a timeout is set.
3733
3734 def setUp(self):
3735 super().setUp()
3736 self.serv_conn = self.newSocket()
3737 self.addCleanup(self.serv_conn.close)
3738 # Use a thread to complete the connection, but wait for it to
3739 # terminate before running the test, so that there is only one
3740 # thread to accept the signal.
3741 cli_thread = threading.Thread(target=self.doConnect)
3742 cli_thread.start()
3743 self.cli_conn, addr = self.serv.accept()
3744 self.addCleanup(self.cli_conn.close)
3745 cli_thread.join()
3746 self.serv_conn.settimeout(self.timeout)
3747
3748 def doConnect(self):
3749 self.serv_conn.connect(self.serv_addr)
3750
3751 def checkInterruptedSend(self, func, *args, **kwargs):
3752 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003753 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003754 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003755 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003756 while True:
3757 self.setAlarm(self.alarm_time)
3758 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003759
Ned Deilyc5640382014-02-03 13:58:31 -08003760 # Issue #12958: The following tests have problems on OS X prior to 10.7
3761 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003762 def testInterruptedSendTimeout(self):
3763 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3764
Ned Deilyc5640382014-02-03 13:58:31 -08003765 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003766 def testInterruptedSendtoTimeout(self):
3767 # Passing an actual address here as Python's wrapper for
3768 # sendto() doesn't allow passing a zero-length one; POSIX
3769 # requires that the address is ignored since the socket is
3770 # connection-mode, however.
3771 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3772 self.serv_addr)
3773
Ned Deilyc5640382014-02-03 13:58:31 -08003774 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003775 @requireAttrs(socket.socket, "sendmsg")
3776 def testInterruptedSendmsgTimeout(self):
3777 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3778
3779
Victor Stinner45df8202010-04-28 22:31:17 +00003780@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003781class TCPCloserTest(ThreadedTCPSocketTest):
3782
3783 def testClose(self):
3784 conn, addr = self.serv.accept()
3785 conn.close()
3786
3787 sd = self.cli
3788 read, write, err = select.select([sd], [], [], 1.0)
3789 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003790 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003791
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003792 # Calling close() many times should be safe.
3793 conn.close()
3794 conn.close()
3795
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003796 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003797 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003798 time.sleep(1.0)
3799
Victor Stinner45df8202010-04-28 22:31:17 +00003800@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003801class BasicSocketPairTest(SocketPairTest):
3802
3803 def __init__(self, methodName='runTest'):
3804 SocketPairTest.__init__(self, methodName=methodName)
3805
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003806 def _check_defaults(self, sock):
3807 self.assertIsInstance(sock, socket.socket)
3808 if hasattr(socket, 'AF_UNIX'):
3809 self.assertEqual(sock.family, socket.AF_UNIX)
3810 else:
3811 self.assertEqual(sock.family, socket.AF_INET)
3812 self.assertEqual(sock.type, socket.SOCK_STREAM)
3813 self.assertEqual(sock.proto, 0)
3814
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003815 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003816 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003817
3818 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003819 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003820
Dave Cole331708b2004-08-09 04:51:41 +00003821 def testRecv(self):
3822 msg = self.serv.recv(1024)
3823 self.assertEqual(msg, MSG)
3824
3825 def _testRecv(self):
3826 self.cli.send(MSG)
3827
3828 def testSend(self):
3829 self.serv.send(MSG)
3830
3831 def _testSend(self):
3832 msg = self.cli.recv(1024)
3833 self.assertEqual(msg, MSG)
3834
Victor Stinner45df8202010-04-28 22:31:17 +00003835@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003836class NonBlockingTCPTests(ThreadedTCPSocketTest):
3837
3838 def __init__(self, methodName='runTest'):
3839 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3840
3841 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003842 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003843 self.serv.setblocking(True)
3844 self.assertIsNone(self.serv.gettimeout())
3845 self.serv.setblocking(False)
3846 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003847 start = time.time()
3848 try:
3849 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003850 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003851 pass
3852 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003853 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003854
3855 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003856 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003857
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003858 @support.cpython_only
3859 def testSetBlocking_overflow(self):
3860 # Issue 15989
3861 import _testcapi
3862 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3863 self.skipTest('needs UINT_MAX < ULONG_MAX')
3864 self.serv.setblocking(False)
3865 self.assertEqual(self.serv.gettimeout(), 0.0)
3866 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3867 self.assertIsNone(self.serv.gettimeout())
3868
3869 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3870
Serhiy Storchaka43767632013-11-03 21:31:38 +02003871 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3872 'test needs socket.SOCK_NONBLOCK')
3873 @support.requires_linux_version(2, 6, 28)
3874 def testInitNonBlocking(self):
3875 # reinit server socket
3876 self.serv.close()
3877 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3878 socket.SOCK_NONBLOCK)
3879 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003880 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003881 # actual testing
3882 start = time.time()
3883 try:
3884 self.serv.accept()
3885 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003886 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003887 end = time.time()
3888 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3889
3890 def _testInitNonBlocking(self):
3891 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003892
Antoine Pitrou600232b2011-01-05 21:03:42 +00003893 def testInheritFlags(self):
3894 # Issue #7995: when calling accept() on a listening socket with a
3895 # timeout, the resulting socket should not be non-blocking.
3896 self.serv.settimeout(10)
3897 try:
3898 conn, addr = self.serv.accept()
3899 message = conn.recv(len(MSG))
3900 finally:
3901 conn.close()
3902 self.serv.settimeout(None)
3903
3904 def _testInheritFlags(self):
3905 time.sleep(0.1)
3906 self.cli.connect((HOST, self.port))
3907 time.sleep(0.5)
3908 self.cli.send(MSG)
3909
Guido van Rossum24e4af82002-06-12 19:18:08 +00003910 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003911 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003912 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003913 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003914 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003915 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003916 pass
3917 else:
3918 self.fail("Error trying to do non-blocking accept.")
3919 read, write, err = select.select([self.serv], [], [])
3920 if self.serv in read:
3921 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07003922 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00003923 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003924 else:
3925 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003926
Guido van Rossum24e4af82002-06-12 19:18:08 +00003927 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003928 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003929 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003930
3931 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003932 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003933 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003934 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003935
3936 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003937 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003938 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003939
3940 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003941 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003942 conn, addr = self.serv.accept()
3943 conn.setblocking(0)
3944 try:
3945 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003946 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003947 pass
3948 else:
3949 self.fail("Error trying to do non-blocking recv.")
3950 read, write, err = select.select([conn], [], [])
3951 if conn in read:
3952 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003953 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003954 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003955 else:
3956 self.fail("Error during select call to non-blocking socket.")
3957
3958 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003959 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003960 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003961 self.cli.send(MSG)
3962
Victor Stinner45df8202010-04-28 22:31:17 +00003963@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003964class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003965 """Unit tests for the object returned by socket.makefile()
3966
Antoine Pitrou834bd812010-10-13 16:17:14 +00003967 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003968 the client connection. You can read from this file to
3969 get output from the server.
3970
Antoine Pitrou834bd812010-10-13 16:17:14 +00003971 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003972 server connection. You can write to this file to send output
3973 to the client.
3974 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003975
Guido van Rossume9f66142002-08-07 15:46:19 +00003976 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003977 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003978 errors = 'strict'
3979 newline = None
3980
3981 read_mode = 'rb'
3982 read_msg = MSG
3983 write_mode = 'wb'
3984 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003985
Guido van Rossum24e4af82002-06-12 19:18:08 +00003986 def __init__(self, methodName='runTest'):
3987 SocketConnectedTest.__init__(self, methodName=methodName)
3988
3989 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003990 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3991 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003992 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003993 self.read_file = self.cli_conn.makefile(
3994 self.read_mode, self.bufsize,
3995 encoding = self.encoding,
3996 errors = self.errors,
3997 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003998
3999 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004000 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004001 self.read_file.close()
4002 self.assertTrue(self.read_file.closed)
4003 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004004 SocketConnectedTest.tearDown(self)
4005
4006 def clientSetUp(self):
4007 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004008 self.write_file = self.serv_conn.makefile(
4009 self.write_mode, self.bufsize,
4010 encoding = self.encoding,
4011 errors = self.errors,
4012 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004013
4014 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004015 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004016 self.write_file.close()
4017 self.assertTrue(self.write_file.closed)
4018 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004019 SocketConnectedTest.clientTearDown(self)
4020
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004021 def testReadAfterTimeout(self):
4022 # Issue #7322: A file object must disallow further reads
4023 # after a timeout has occurred.
4024 self.cli_conn.settimeout(1)
4025 self.read_file.read(3)
4026 # First read raises a timeout
4027 self.assertRaises(socket.timeout, self.read_file.read, 1)
4028 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004029 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004030 self.read_file.read(1)
4031 self.assertIn("cannot read from timed out object", str(ctx.exception))
4032
4033 def _testReadAfterTimeout(self):
4034 self.write_file.write(self.write_msg[0:3])
4035 self.write_file.flush()
4036 self.serv_finished.wait()
4037
Guido van Rossum24e4af82002-06-12 19:18:08 +00004038 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004039 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004040 first_seg = self.read_file.read(len(self.read_msg)-3)
4041 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004042 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004043 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004044
4045 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004046 self.write_file.write(self.write_msg)
4047 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004048
Guido van Rossum8c943832002-08-08 01:00:28 +00004049 def testFullRead(self):
4050 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004051 msg = self.read_file.read()
4052 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004053
4054 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004055 self.write_file.write(self.write_msg)
4056 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004057
Guido van Rossum24e4af82002-06-12 19:18:08 +00004058 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004059 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004060 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004061 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004062 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004063 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004064 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004065 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004066 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004067
4068 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004069 self.write_file.write(self.write_msg)
4070 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004071
4072 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004073 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004074 line = self.read_file.readline()
4075 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004076
4077 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004078 self.write_file.write(self.write_msg)
4079 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004080
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004081 def testCloseAfterMakefile(self):
4082 # The file returned by makefile should keep the socket open.
4083 self.cli_conn.close()
4084 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004085 msg = self.read_file.read()
4086 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004087
4088 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004089 self.write_file.write(self.write_msg)
4090 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004091
4092 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004093 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004094 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004095 if isinstance(self.read_msg, str):
4096 msg = msg.decode()
4097 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004098
4099 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004100 self.write_file.write(self.write_msg)
4101 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004102
Tim Peters116d83c2004-03-28 02:20:45 +00004103 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004104 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004105
4106 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004107 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004108
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004109 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004110 self.assertEqual(self.read_file.mode, self.read_mode)
4111 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004112
4113 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004114 self.assertEqual(self.write_file.mode, self.write_mode)
4115 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004116
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004117 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004118 self.read_file.close()
4119 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004120 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004121 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004122
4123 def _testRealClose(self):
4124 pass
4125
4126
Guido van Rossume9f66142002-08-07 15:46:19 +00004127class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4128
4129 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004130
Guido van Rossume9f66142002-08-07 15:46:19 +00004131 In this case (and in this case only), it should be possible to
4132 create a file object, read a line from it, create another file
4133 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004134 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004135 when reading multiple requests from the same socket."""
4136
4137 bufsize = 0 # Use unbuffered mode
4138
4139 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004140 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004141 line = self.read_file.readline() # first line
4142 self.assertEqual(line, b"A. " + self.write_msg) # first line
4143 self.read_file = self.cli_conn.makefile('rb', 0)
4144 line = self.read_file.readline() # second line
4145 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004146
4147 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004148 self.write_file.write(b"A. " + self.write_msg)
4149 self.write_file.write(b"B. " + self.write_msg)
4150 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004151
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004152 def testMakefileClose(self):
4153 # The file returned by makefile should keep the socket open...
4154 self.cli_conn.close()
4155 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004156 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004157 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004158 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004159 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004160
4161 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004162 self.write_file.write(self.write_msg)
4163 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004164
4165 def testMakefileCloseSocketDestroy(self):
4166 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004167 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004168 refcount_after = sys.getrefcount(self.cli_conn)
4169 self.assertEqual(refcount_before - 1, refcount_after)
4170
4171 def _testMakefileCloseSocketDestroy(self):
4172 pass
4173
Antoine Pitrou98b46702010-09-18 22:59:00 +00004174 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004175 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004176 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4177
4178 def testSmallReadNonBlocking(self):
4179 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004180 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4181 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004182 self.evt1.set()
4183 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004184 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004185 if first_seg is None:
4186 # Data not arrived (can happen under Windows), wait a bit
4187 time.sleep(0.5)
4188 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004189 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004190 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004191 self.assertEqual(n, 3)
4192 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004193 self.assertEqual(msg, self.read_msg)
4194 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4195 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004196
4197 def _testSmallReadNonBlocking(self):
4198 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004199 self.write_file.write(self.write_msg)
4200 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004201 self.evt2.set()
4202 # Avoid cloding the socket before the server test has finished,
4203 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4204 self.serv_finished.wait(5.0)
4205
4206 def testWriteNonBlocking(self):
4207 self.cli_finished.wait(5.0)
4208 # The client thread can't skip directly - the SkipTest exception
4209 # would appear as a failure.
4210 if self.serv_skipped:
4211 self.skipTest(self.serv_skipped)
4212
4213 def _testWriteNonBlocking(self):
4214 self.serv_skipped = None
4215 self.serv_conn.setblocking(False)
4216 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004217 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004218 LIMIT = 10
4219 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004220 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004221 self.assertGreater(n, 0)
4222 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004223 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004224 if n is None:
4225 # Succeeded
4226 break
4227 self.assertGreater(n, 0)
4228 else:
4229 # Let us know that this test didn't manage to establish
4230 # the expected conditions. This is not a failure in itself but,
4231 # if it happens repeatedly, the test should be fixed.
4232 self.serv_skipped = "failed to saturate the socket buffer"
4233
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004234
Guido van Rossum8c943832002-08-08 01:00:28 +00004235class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4236
4237 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4238
4239
4240class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4241
4242 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004243
Thomas Woutersb2137042007-02-01 18:02:27 +00004244
Antoine Pitrou834bd812010-10-13 16:17:14 +00004245class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4246 """Tests for socket.makefile() in text mode (rather than binary)"""
4247
4248 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004249 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004250 write_mode = 'wb'
4251 write_msg = MSG
4252 newline = ''
4253
4254
4255class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4256 """Tests for socket.makefile() in text mode (rather than binary)"""
4257
4258 read_mode = 'rb'
4259 read_msg = MSG
4260 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004261 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004262 newline = ''
4263
4264
4265class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4266 """Tests for socket.makefile() in text mode (rather than binary)"""
4267
4268 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004269 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004270 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004271 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004272 newline = ''
4273
4274
Guido van Rossumd8faa362007-04-27 19:54:29 +00004275class NetworkConnectionTest(object):
4276 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004277
Guido van Rossumd8faa362007-04-27 19:54:29 +00004278 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004279 # We're inherited below by BasicTCPTest2, which also inherits
4280 # BasicTCPTest, which defines self.port referenced below.
4281 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004282 self.serv_conn = self.cli
4283
4284class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4285 """Tests that NetworkConnection does not break existing TCP functionality.
4286 """
4287
4288class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004289
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004290 class MockSocket(socket.socket):
4291 def connect(self, *args):
4292 raise socket.timeout('timed out')
4293
4294 @contextlib.contextmanager
4295 def mocked_socket_module(self):
4296 """Return a socket which times out on connect"""
4297 old_socket = socket.socket
4298 socket.socket = self.MockSocket
4299 try:
4300 yield
4301 finally:
4302 socket.socket = old_socket
4303
4304 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004305 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004306 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004307 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004308 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004309 cli.connect((HOST, port))
4310 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4311
4312 def test_create_connection(self):
4313 # Issue #9792: errors raised by create_connection() should have
4314 # a proper errno attribute.
4315 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004316 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004317 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004318
4319 # Issue #16257: create_connection() calls getaddrinfo() against
4320 # 'localhost'. This may result in an IPV6 addr being returned
4321 # as well as an IPV4 one:
4322 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4323 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4324 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4325 #
4326 # create_connection() enumerates through all the addresses returned
4327 # and if it doesn't successfully bind to any of them, it propagates
4328 # the last exception it encountered.
4329 #
4330 # On Solaris, ENETUNREACH is returned in this circumstance instead
4331 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4332 # expected errnos.
4333 expected_errnos = [ errno.ECONNREFUSED, ]
4334 if hasattr(errno, 'ENETUNREACH'):
4335 expected_errnos.append(errno.ENETUNREACH)
4336
4337 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004338
4339 def test_create_connection_timeout(self):
4340 # Issue #9792: create_connection() should not recast timeout errors
4341 # as generic socket errors.
4342 with self.mocked_socket_module():
4343 with self.assertRaises(socket.timeout):
4344 socket.create_connection((HOST, 1234))
4345
Guido van Rossumd8faa362007-04-27 19:54:29 +00004346
Victor Stinner45df8202010-04-28 22:31:17 +00004347@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004348class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4349
4350 def __init__(self, methodName='runTest'):
4351 SocketTCPTest.__init__(self, methodName=methodName)
4352 ThreadableTest.__init__(self)
4353
4354 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004355 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004356
4357 def clientTearDown(self):
4358 self.cli.close()
4359 self.cli = None
4360 ThreadableTest.clientTearDown(self)
4361
4362 def _justAccept(self):
4363 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004364 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004365
4366 testFamily = _justAccept
4367 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004368 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004369 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004370 self.assertEqual(self.cli.family, 2)
4371
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004372 testSourceAddress = _justAccept
4373 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004374 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4375 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004376 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004377 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004378 # The port number being used is sufficient to show that the bind()
4379 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004380
Guido van Rossumd8faa362007-04-27 19:54:29 +00004381 testTimeoutDefault = _justAccept
4382 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004383 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004384 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004385 socket.setdefaulttimeout(42)
4386 try:
4387 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004388 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004389 finally:
4390 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004391 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004392
4393 testTimeoutNone = _justAccept
4394 def _testTimeoutNone(self):
4395 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004396 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004397 socket.setdefaulttimeout(30)
4398 try:
4399 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004400 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004401 finally:
4402 socket.setdefaulttimeout(None)
4403 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004404
4405 testTimeoutValueNamed = _justAccept
4406 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004407 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004408 self.assertEqual(self.cli.gettimeout(), 30)
4409
4410 testTimeoutValueNonamed = _justAccept
4411 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004412 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004413 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004414 self.assertEqual(self.cli.gettimeout(), 30)
4415
Victor Stinner45df8202010-04-28 22:31:17 +00004416@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004417class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4418
4419 def __init__(self, methodName='runTest'):
4420 SocketTCPTest.__init__(self, methodName=methodName)
4421 ThreadableTest.__init__(self)
4422
4423 def clientSetUp(self):
4424 pass
4425
4426 def clientTearDown(self):
4427 self.cli.close()
4428 self.cli = None
4429 ThreadableTest.clientTearDown(self)
4430
4431 def testInsideTimeout(self):
4432 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004433 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004434 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004435 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004436 testOutsideTimeout = testInsideTimeout
4437
4438 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004439 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004440 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004441 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004442
4443 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004444 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004445 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004446
4447
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004448class TCPTimeoutTest(SocketTCPTest):
4449
4450 def testTCPTimeout(self):
4451 def raise_timeout(*args, **kwargs):
4452 self.serv.settimeout(1.0)
4453 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004454 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004455 "Error generating a timeout exception (TCP)")
4456
4457 def testTimeoutZero(self):
4458 ok = False
4459 try:
4460 self.serv.settimeout(0.0)
4461 foo = self.serv.accept()
4462 except socket.timeout:
4463 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004464 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004465 ok = True
4466 except:
4467 self.fail("caught unexpected exception (TCP)")
4468 if not ok:
4469 self.fail("accept() returned success when we did not expect it")
4470
Serhiy Storchaka43767632013-11-03 21:31:38 +02004471 @unittest.skipUnless(hasattr(signal, 'alarm'),
4472 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004473 def testInterruptedTimeout(self):
4474 # XXX I don't know how to do this test on MSWindows or any other
4475 # plaform that doesn't support signal.alarm() or os.kill(), though
4476 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004477 self.serv.settimeout(5.0) # must be longer than alarm
4478 class Alarm(Exception):
4479 pass
4480 def alarm_handler(signal, frame):
4481 raise Alarm
4482 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4483 try:
4484 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4485 try:
4486 foo = self.serv.accept()
4487 except socket.timeout:
4488 self.fail("caught timeout instead of Alarm")
4489 except Alarm:
4490 pass
4491 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004492 self.fail("caught other exception instead of Alarm:"
4493 " %s(%s):\n%s" %
4494 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004495 else:
4496 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004497 finally:
4498 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004499 except Alarm:
4500 self.fail("got Alarm in wrong place")
4501 finally:
4502 # no alarm can be pending. Safe to restore old handler.
4503 signal.signal(signal.SIGALRM, old_alarm)
4504
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004505class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004506
4507 def testUDPTimeout(self):
4508 def raise_timeout(*args, **kwargs):
4509 self.serv.settimeout(1.0)
4510 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004511 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004512 "Error generating a timeout exception (UDP)")
4513
4514 def testTimeoutZero(self):
4515 ok = False
4516 try:
4517 self.serv.settimeout(0.0)
4518 foo = self.serv.recv(1024)
4519 except socket.timeout:
4520 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004521 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004522 ok = True
4523 except:
4524 self.fail("caught unexpected exception (UDP)")
4525 if not ok:
4526 self.fail("recv() returned success when we did not expect it")
4527
4528class TestExceptions(unittest.TestCase):
4529
4530 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004531 self.assertTrue(issubclass(OSError, Exception))
4532 self.assertTrue(issubclass(socket.herror, OSError))
4533 self.assertTrue(issubclass(socket.gaierror, OSError))
4534 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004535
Serhiy Storchaka43767632013-11-03 21:31:38 +02004536@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004537class TestLinuxAbstractNamespace(unittest.TestCase):
4538
4539 UNIX_PATH_MAX = 108
4540
4541 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004542 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004543 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4544 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004545 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004546 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4547 s2.connect(s1.getsockname())
4548 with s1.accept()[0] as s3:
4549 self.assertEqual(s1.getsockname(), address)
4550 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004551
4552 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004553 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004554 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4555 s.bind(address)
4556 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004557
4558 def testNameOverflow(self):
4559 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004560 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004561 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004562
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004563 def testStrName(self):
4564 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004565 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4566 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004567 s.bind("\x00python\x00test\x00")
4568 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004569 finally:
4570 s.close()
4571
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004572 def testBytearrayName(self):
4573 # Check that an abstract name can be passed as a bytearray.
4574 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4575 s.bind(bytearray(b"\x00python\x00test\x00"))
4576 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4577
Serhiy Storchaka43767632013-11-03 21:31:38 +02004578@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004579class TestUnixDomain(unittest.TestCase):
4580
4581 def setUp(self):
4582 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4583
4584 def tearDown(self):
4585 self.sock.close()
4586
4587 def encoded(self, path):
4588 # Return the given path encoded in the file system encoding,
4589 # or skip the test if this is not possible.
4590 try:
4591 return os.fsencode(path)
4592 except UnicodeEncodeError:
4593 self.skipTest(
4594 "Pathname {0!a} cannot be represented in file "
4595 "system encoding {1!r}".format(
4596 path, sys.getfilesystemencoding()))
4597
Antoine Pitrou16374872011-12-16 15:04:12 +01004598 def bind(self, sock, path):
4599 # Bind the socket
4600 try:
4601 sock.bind(path)
4602 except OSError as e:
4603 if str(e) == "AF_UNIX path too long":
4604 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004605 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004606 .format(path))
4607 else:
4608 raise
4609
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004610 def testStrAddr(self):
4611 # Test binding to and retrieving a normal string pathname.
4612 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004613 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004614 self.addCleanup(support.unlink, path)
4615 self.assertEqual(self.sock.getsockname(), path)
4616
4617 def testBytesAddr(self):
4618 # Test binding to a bytes pathname.
4619 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004620 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004621 self.addCleanup(support.unlink, path)
4622 self.assertEqual(self.sock.getsockname(), path)
4623
4624 def testSurrogateescapeBind(self):
4625 # Test binding to a valid non-ASCII pathname, with the
4626 # non-ASCII bytes supplied using surrogateescape encoding.
4627 path = os.path.abspath(support.TESTFN_UNICODE)
4628 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004629 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004630 self.addCleanup(support.unlink, path)
4631 self.assertEqual(self.sock.getsockname(), path)
4632
4633 def testUnencodableAddr(self):
4634 # Test binding to a pathname that cannot be encoded in the
4635 # file system encoding.
4636 if support.TESTFN_UNENCODABLE is None:
4637 self.skipTest("No unencodable filename available")
4638 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004639 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004640 self.addCleanup(support.unlink, path)
4641 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004642
Victor Stinner45df8202010-04-28 22:31:17 +00004643@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004644class BufferIOTest(SocketConnectedTest):
4645 """
4646 Test the buffer versions of socket.recv() and socket.send().
4647 """
4648 def __init__(self, methodName='runTest'):
4649 SocketConnectedTest.__init__(self, methodName=methodName)
4650
Antoine Pitrou25480782010-03-17 22:50:28 +00004651 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004652 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004653 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004654 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004655 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004656 self.assertEqual(msg, MSG)
4657
Antoine Pitrou25480782010-03-17 22:50:28 +00004658 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004659 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004660 self.serv_conn.send(buf)
4661
Antoine Pitrou25480782010-03-17 22:50:28 +00004662 def testRecvIntoBytearray(self):
4663 buf = bytearray(1024)
4664 nbytes = self.cli_conn.recv_into(buf)
4665 self.assertEqual(nbytes, len(MSG))
4666 msg = buf[:len(MSG)]
4667 self.assertEqual(msg, MSG)
4668
4669 _testRecvIntoBytearray = _testRecvIntoArray
4670
4671 def testRecvIntoMemoryview(self):
4672 buf = bytearray(1024)
4673 nbytes = self.cli_conn.recv_into(memoryview(buf))
4674 self.assertEqual(nbytes, len(MSG))
4675 msg = buf[:len(MSG)]
4676 self.assertEqual(msg, MSG)
4677
4678 _testRecvIntoMemoryview = _testRecvIntoArray
4679
4680 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004681 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004682 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004683 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004684 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004685 self.assertEqual(msg, MSG)
4686
Antoine Pitrou25480782010-03-17 22:50:28 +00004687 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004688 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004689 self.serv_conn.send(buf)
4690
Antoine Pitrou25480782010-03-17 22:50:28 +00004691 def testRecvFromIntoBytearray(self):
4692 buf = bytearray(1024)
4693 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4694 self.assertEqual(nbytes, len(MSG))
4695 msg = buf[:len(MSG)]
4696 self.assertEqual(msg, MSG)
4697
4698 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4699
4700 def testRecvFromIntoMemoryview(self):
4701 buf = bytearray(1024)
4702 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4703 self.assertEqual(nbytes, len(MSG))
4704 msg = buf[:len(MSG)]
4705 self.assertEqual(msg, MSG)
4706
4707 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4708
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004709 def testRecvFromIntoSmallBuffer(self):
4710 # See issue #20246.
4711 buf = bytearray(8)
4712 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4713
4714 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004715 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004716
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004717 def testRecvFromIntoEmptyBuffer(self):
4718 buf = bytearray()
4719 self.cli_conn.recvfrom_into(buf)
4720 self.cli_conn.recvfrom_into(buf, 0)
4721
4722 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4723
Christian Heimes043d6f62008-01-07 17:19:16 +00004724
4725TIPC_STYPE = 2000
4726TIPC_LOWER = 200
4727TIPC_UPPER = 210
4728
4729def isTipcAvailable():
4730 """Check if the TIPC module is loaded
4731
4732 The TIPC module is not loaded automatically on Ubuntu and probably
4733 other Linux distros.
4734 """
4735 if not hasattr(socket, "AF_TIPC"):
4736 return False
4737 if not os.path.isfile("/proc/modules"):
4738 return False
4739 with open("/proc/modules") as f:
4740 for line in f:
4741 if line.startswith("tipc "):
4742 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004743 return False
4744
Serhiy Storchaka43767632013-11-03 21:31:38 +02004745@unittest.skipUnless(isTipcAvailable(),
4746 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004747class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004748 def testRDM(self):
4749 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4750 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004751 self.addCleanup(srv.close)
4752 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004753
4754 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4755 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4756 TIPC_LOWER, TIPC_UPPER)
4757 srv.bind(srvaddr)
4758
4759 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4760 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4761 cli.sendto(MSG, sendaddr)
4762
4763 msg, recvaddr = srv.recvfrom(1024)
4764
4765 self.assertEqual(cli.getsockname(), recvaddr)
4766 self.assertEqual(msg, MSG)
4767
4768
Serhiy Storchaka43767632013-11-03 21:31:38 +02004769@unittest.skipUnless(isTipcAvailable(),
4770 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004771class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004772 def __init__(self, methodName = 'runTest'):
4773 unittest.TestCase.__init__(self, methodName = methodName)
4774 ThreadableTest.__init__(self)
4775
4776 def setUp(self):
4777 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004778 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004779 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4780 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4781 TIPC_LOWER, TIPC_UPPER)
4782 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004783 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004784 self.serverExplicitReady()
4785 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004786 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004787
4788 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00004789 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00004790 # accept() call; sleep a little while to avoid it, otherwise
4791 # we could get an exception
4792 time.sleep(0.1)
4793 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004794 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004795 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4796 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4797 self.cli.connect(addr)
4798 self.cliaddr = self.cli.getsockname()
4799
4800 def testStream(self):
4801 msg = self.conn.recv(1024)
4802 self.assertEqual(msg, MSG)
4803 self.assertEqual(self.cliaddr, self.connaddr)
4804
4805 def _testStream(self):
4806 self.cli.send(MSG)
4807 self.cli.close()
4808
4809
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004810@unittest.skipUnless(thread, 'Threading required for this test.')
4811class ContextManagersTest(ThreadedTCPSocketTest):
4812
4813 def _testSocketClass(self):
4814 # base test
4815 with socket.socket() as sock:
4816 self.assertFalse(sock._closed)
4817 self.assertTrue(sock._closed)
4818 # close inside with block
4819 with socket.socket() as sock:
4820 sock.close()
4821 self.assertTrue(sock._closed)
4822 # exception inside with block
4823 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004824 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004825 self.assertTrue(sock._closed)
4826
4827 def testCreateConnectionBase(self):
4828 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004829 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004830 data = conn.recv(1024)
4831 conn.sendall(data)
4832
4833 def _testCreateConnectionBase(self):
4834 address = self.serv.getsockname()
4835 with socket.create_connection(address) as sock:
4836 self.assertFalse(sock._closed)
4837 sock.sendall(b'foo')
4838 self.assertEqual(sock.recv(1024), b'foo')
4839 self.assertTrue(sock._closed)
4840
4841 def testCreateConnectionClose(self):
4842 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004843 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004844 data = conn.recv(1024)
4845 conn.sendall(data)
4846
4847 def _testCreateConnectionClose(self):
4848 address = self.serv.getsockname()
4849 with socket.create_connection(address) as sock:
4850 sock.close()
4851 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004852 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004853
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004854
Victor Stinnerdaf45552013-08-28 00:53:59 +02004855class InheritanceTest(unittest.TestCase):
4856 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4857 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004858 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004859 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004860 with socket.socket(socket.AF_INET,
4861 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4862 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004863 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004864
4865 def test_default_inheritable(self):
4866 sock = socket.socket()
4867 with sock:
4868 self.assertEqual(sock.get_inheritable(), False)
4869
4870 def test_dup(self):
4871 sock = socket.socket()
4872 with sock:
4873 newsock = sock.dup()
4874 sock.close()
4875 with newsock:
4876 self.assertEqual(newsock.get_inheritable(), False)
4877
4878 def test_set_inheritable(self):
4879 sock = socket.socket()
4880 with sock:
4881 sock.set_inheritable(True)
4882 self.assertEqual(sock.get_inheritable(), True)
4883
4884 sock.set_inheritable(False)
4885 self.assertEqual(sock.get_inheritable(), False)
4886
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004887 @unittest.skipIf(fcntl is None, "need fcntl")
4888 def test_get_inheritable_cloexec(self):
4889 sock = socket.socket()
4890 with sock:
4891 fd = sock.fileno()
4892 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004893
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004894 # clear FD_CLOEXEC flag
4895 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4896 flags &= ~fcntl.FD_CLOEXEC
4897 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004898
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004899 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004900
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004901 @unittest.skipIf(fcntl is None, "need fcntl")
4902 def test_set_inheritable_cloexec(self):
4903 sock = socket.socket()
4904 with sock:
4905 fd = sock.fileno()
4906 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4907 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004908
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004909 sock.set_inheritable(True)
4910 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4911 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004912
4913
Victor Stinnerdaf45552013-08-28 00:53:59 +02004914 @unittest.skipUnless(hasattr(socket, "socketpair"),
4915 "need socket.socketpair()")
4916 def test_socketpair(self):
4917 s1, s2 = socket.socketpair()
4918 self.addCleanup(s1.close)
4919 self.addCleanup(s2.close)
4920 self.assertEqual(s1.get_inheritable(), False)
4921 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004922
4923
4924@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4925 "SOCK_NONBLOCK not defined")
4926class NonblockConstantTest(unittest.TestCase):
4927 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4928 if nonblock:
4929 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4930 self.assertEqual(s.gettimeout(), timeout)
4931 else:
4932 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4933 self.assertEqual(s.gettimeout(), None)
4934
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_NONBLOCK(self):
4937 # a lot of it seems silly and redundant, but I wanted to test that
4938 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004939 with socket.socket(socket.AF_INET,
4940 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4941 self.checkNonblock(s)
4942 s.setblocking(1)
4943 self.checkNonblock(s, False)
4944 s.setblocking(0)
4945 self.checkNonblock(s)
4946 s.settimeout(None)
4947 self.checkNonblock(s, False)
4948 s.settimeout(2.0)
4949 self.checkNonblock(s, timeout=2.0)
4950 s.setblocking(1)
4951 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004952 # defaulttimeout
4953 t = socket.getdefaulttimeout()
4954 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004955 with socket.socket() as s:
4956 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004957 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004958 with socket.socket() as s:
4959 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004960 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004961 with socket.socket() as s:
4962 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004963 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004964 with socket.socket() as s:
4965 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004966 socket.setdefaulttimeout(t)
4967
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004968
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004969@unittest.skipUnless(os.name == "nt", "Windows specific")
4970@unittest.skipUnless(multiprocessing, "need multiprocessing")
4971class TestSocketSharing(SocketTCPTest):
4972 # This must be classmethod and not staticmethod or multiprocessing
4973 # won't be able to bootstrap it.
4974 @classmethod
4975 def remoteProcessServer(cls, q):
4976 # Recreate socket from shared data
4977 sdata = q.get()
4978 message = q.get()
4979
4980 s = socket.fromshare(sdata)
4981 s2, c = s.accept()
4982
4983 # Send the message
4984 s2.sendall(message)
4985 s2.close()
4986 s.close()
4987
4988 def testShare(self):
4989 # Transfer the listening server socket to another process
4990 # and service it from there.
4991
4992 # Create process:
4993 q = multiprocessing.Queue()
4994 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4995 p.start()
4996
4997 # Get the shared socket data
4998 data = self.serv.share(p.pid)
4999
5000 # Pass the shared socket to the other process
5001 addr = self.serv.getsockname()
5002 self.serv.close()
5003 q.put(data)
5004
5005 # The data that the server will send us
5006 message = b"slapmahfro"
5007 q.put(message)
5008
5009 # Connect
5010 s = socket.create_connection(addr)
5011 # listen for the data
5012 m = []
5013 while True:
5014 data = s.recv(100)
5015 if not data:
5016 break
5017 m.append(data)
5018 s.close()
5019 received = b"".join(m)
5020 self.assertEqual(received, message)
5021 p.join()
5022
5023 def testShareLength(self):
5024 data = self.serv.share(os.getpid())
5025 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5026 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5027
5028 def compareSockets(self, org, other):
5029 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005030 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005031 self.assertEqual(org.gettimeout(), None)
5032 self.assertEqual(org.gettimeout(), other.gettimeout())
5033
5034 self.assertEqual(org.family, other.family)
5035 self.assertEqual(org.type, other.type)
5036 # If the user specified "0" for proto, then
5037 # internally windows will have picked the correct value.
5038 # Python introspection on the socket however will still return
5039 # 0. For the shared socket, the python value is recreated
5040 # from the actual value, so it may not compare correctly.
5041 if org.proto != 0:
5042 self.assertEqual(org.proto, other.proto)
5043
5044 def testShareLocal(self):
5045 data = self.serv.share(os.getpid())
5046 s = socket.fromshare(data)
5047 try:
5048 self.compareSockets(self.serv, s)
5049 finally:
5050 s.close()
5051
5052 def testTypes(self):
5053 families = [socket.AF_INET, socket.AF_INET6]
5054 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5055 for f in families:
5056 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005057 try:
5058 source = socket.socket(f, t)
5059 except OSError:
5060 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005061 try:
5062 data = source.share(os.getpid())
5063 shared = socket.fromshare(data)
5064 try:
5065 self.compareSockets(source, shared)
5066 finally:
5067 shared.close()
5068 finally:
5069 source.close()
5070
5071
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005072@unittest.skipUnless(thread, 'Threading required for this test.')
5073class SendfileUsingSendTest(ThreadedTCPSocketTest):
5074 """
5075 Test the send() implementation of socket.sendfile().
5076 """
5077
5078 FILESIZE = (10 * 1024 * 1024) # 10MB
5079 BUFSIZE = 8192
5080 FILEDATA = b""
5081 TIMEOUT = 2
5082
5083 @classmethod
5084 def setUpClass(cls):
5085 def chunks(total, step):
5086 assert total >= step
5087 while total > step:
5088 yield step
5089 total -= step
5090 if total:
5091 yield total
5092
5093 chunk = b"".join([random.choice(string.ascii_letters).encode()
5094 for i in range(cls.BUFSIZE)])
5095 with open(support.TESTFN, 'wb') as f:
5096 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5097 f.write(chunk)
5098 with open(support.TESTFN, 'rb') as f:
5099 cls.FILEDATA = f.read()
5100 assert len(cls.FILEDATA) == cls.FILESIZE
5101
5102 @classmethod
5103 def tearDownClass(cls):
5104 support.unlink(support.TESTFN)
5105
5106 def accept_conn(self):
5107 self.serv.settimeout(self.TIMEOUT)
5108 conn, addr = self.serv.accept()
5109 conn.settimeout(self.TIMEOUT)
5110 self.addCleanup(conn.close)
5111 return conn
5112
5113 def recv_data(self, conn):
5114 received = []
5115 while True:
5116 chunk = conn.recv(self.BUFSIZE)
5117 if not chunk:
5118 break
5119 received.append(chunk)
5120 return b''.join(received)
5121
5122 def meth_from_sock(self, sock):
5123 # Depending on the mixin class being run return either send()
5124 # or sendfile() method implementation.
5125 return getattr(sock, "_sendfile_use_send")
5126
5127 # regular file
5128
5129 def _testRegularFile(self):
5130 address = self.serv.getsockname()
5131 file = open(support.TESTFN, 'rb')
5132 with socket.create_connection(address) as sock, file as file:
5133 meth = self.meth_from_sock(sock)
5134 sent = meth(file)
5135 self.assertEqual(sent, self.FILESIZE)
5136 self.assertEqual(file.tell(), self.FILESIZE)
5137
5138 def testRegularFile(self):
5139 conn = self.accept_conn()
5140 data = self.recv_data(conn)
5141 self.assertEqual(len(data), self.FILESIZE)
5142 self.assertEqual(data, self.FILEDATA)
5143
5144 # non regular file
5145
5146 def _testNonRegularFile(self):
5147 address = self.serv.getsockname()
5148 file = io.BytesIO(self.FILEDATA)
5149 with socket.create_connection(address) as sock, file as file:
5150 sent = sock.sendfile(file)
5151 self.assertEqual(sent, self.FILESIZE)
5152 self.assertEqual(file.tell(), self.FILESIZE)
5153 self.assertRaises(socket._GiveupOnSendfile,
5154 sock._sendfile_use_sendfile, file)
5155
5156 def testNonRegularFile(self):
5157 conn = self.accept_conn()
5158 data = self.recv_data(conn)
5159 self.assertEqual(len(data), self.FILESIZE)
5160 self.assertEqual(data, self.FILEDATA)
5161
5162 # empty file
5163
5164 def _testEmptyFileSend(self):
5165 address = self.serv.getsockname()
5166 filename = support.TESTFN + "2"
5167 with open(filename, 'wb'):
5168 self.addCleanup(support.unlink, filename)
5169 file = open(filename, 'rb')
5170 with socket.create_connection(address) as sock, file as file:
5171 meth = self.meth_from_sock(sock)
5172 sent = meth(file)
5173 self.assertEqual(sent, 0)
5174 self.assertEqual(file.tell(), 0)
5175
5176 def testEmptyFileSend(self):
5177 conn = self.accept_conn()
5178 data = self.recv_data(conn)
5179 self.assertEqual(data, b"")
5180
5181 # offset
5182
5183 def _testOffset(self):
5184 address = self.serv.getsockname()
5185 file = open(support.TESTFN, 'rb')
5186 with socket.create_connection(address) as sock, file as file:
5187 meth = self.meth_from_sock(sock)
5188 sent = meth(file, offset=5000)
5189 self.assertEqual(sent, self.FILESIZE - 5000)
5190 self.assertEqual(file.tell(), self.FILESIZE)
5191
5192 def testOffset(self):
5193 conn = self.accept_conn()
5194 data = self.recv_data(conn)
5195 self.assertEqual(len(data), self.FILESIZE - 5000)
5196 self.assertEqual(data, self.FILEDATA[5000:])
5197
5198 # count
5199
5200 def _testCount(self):
5201 address = self.serv.getsockname()
5202 file = open(support.TESTFN, 'rb')
5203 with socket.create_connection(address, timeout=2) as sock, file as file:
5204 count = 5000007
5205 meth = self.meth_from_sock(sock)
5206 sent = meth(file, count=count)
5207 self.assertEqual(sent, count)
5208 self.assertEqual(file.tell(), count)
5209
5210 def testCount(self):
5211 count = 5000007
5212 conn = self.accept_conn()
5213 data = self.recv_data(conn)
5214 self.assertEqual(len(data), count)
5215 self.assertEqual(data, self.FILEDATA[:count])
5216
5217 # count small
5218
5219 def _testCountSmall(self):
5220 address = self.serv.getsockname()
5221 file = open(support.TESTFN, 'rb')
5222 with socket.create_connection(address, timeout=2) as sock, file as file:
5223 count = 1
5224 meth = self.meth_from_sock(sock)
5225 sent = meth(file, count=count)
5226 self.assertEqual(sent, count)
5227 self.assertEqual(file.tell(), count)
5228
5229 def testCountSmall(self):
5230 count = 1
5231 conn = self.accept_conn()
5232 data = self.recv_data(conn)
5233 self.assertEqual(len(data), count)
5234 self.assertEqual(data, self.FILEDATA[:count])
5235
5236 # count + offset
5237
5238 def _testCountWithOffset(self):
5239 address = self.serv.getsockname()
5240 file = open(support.TESTFN, 'rb')
5241 with socket.create_connection(address, timeout=2) as sock, file as file:
5242 count = 100007
5243 meth = self.meth_from_sock(sock)
5244 sent = meth(file, offset=2007, count=count)
5245 self.assertEqual(sent, count)
5246 self.assertEqual(file.tell(), count + 2007)
5247
5248 def testCountWithOffset(self):
5249 count = 100007
5250 conn = self.accept_conn()
5251 data = self.recv_data(conn)
5252 self.assertEqual(len(data), count)
5253 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5254
5255 # non blocking sockets are not supposed to work
5256
5257 def _testNonBlocking(self):
5258 address = self.serv.getsockname()
5259 file = open(support.TESTFN, 'rb')
5260 with socket.create_connection(address) as sock, file as file:
5261 sock.setblocking(False)
5262 meth = self.meth_from_sock(sock)
5263 self.assertRaises(ValueError, meth, file)
5264 self.assertRaises(ValueError, sock.sendfile, file)
5265
5266 def testNonBlocking(self):
5267 conn = self.accept_conn()
5268 if conn.recv(8192):
5269 self.fail('was not supposed to receive any data')
5270
5271 # timeout (non-triggered)
5272
5273 def _testWithTimeout(self):
5274 address = self.serv.getsockname()
5275 file = open(support.TESTFN, 'rb')
5276 with socket.create_connection(address, timeout=2) as sock, file as file:
5277 meth = self.meth_from_sock(sock)
5278 sent = meth(file)
5279 self.assertEqual(sent, self.FILESIZE)
5280
5281 def testWithTimeout(self):
5282 conn = self.accept_conn()
5283 data = self.recv_data(conn)
5284 self.assertEqual(len(data), self.FILESIZE)
5285 self.assertEqual(data, self.FILEDATA)
5286
5287 # timeout (triggered)
5288
5289 def _testWithTimeoutTriggeredSend(self):
5290 address = self.serv.getsockname()
5291 file = open(support.TESTFN, 'rb')
5292 with socket.create_connection(address, timeout=0.01) as sock, \
5293 file as file:
5294 meth = self.meth_from_sock(sock)
5295 self.assertRaises(socket.timeout, meth, file)
5296
5297 def testWithTimeoutTriggeredSend(self):
5298 conn = self.accept_conn()
5299 conn.recv(88192)
5300
5301 # errors
5302
5303 def _test_errors(self):
5304 pass
5305
5306 def test_errors(self):
5307 with open(support.TESTFN, 'rb') as file:
5308 with socket.socket(type=socket.SOCK_DGRAM) as s:
5309 meth = self.meth_from_sock(s)
5310 self.assertRaisesRegex(
5311 ValueError, "SOCK_STREAM", meth, file)
5312 with open(support.TESTFN, 'rt') as file:
5313 with socket.socket() as s:
5314 meth = self.meth_from_sock(s)
5315 self.assertRaisesRegex(
5316 ValueError, "binary mode", meth, file)
5317 with open(support.TESTFN, 'rb') as file:
5318 with socket.socket() as s:
5319 meth = self.meth_from_sock(s)
5320 self.assertRaisesRegex(TypeError, "positive integer",
5321 meth, file, count='2')
5322 self.assertRaisesRegex(TypeError, "positive integer",
5323 meth, file, count=0.1)
5324 self.assertRaisesRegex(ValueError, "positive integer",
5325 meth, file, count=0)
5326 self.assertRaisesRegex(ValueError, "positive integer",
5327 meth, file, count=-1)
5328
5329
5330@unittest.skipUnless(thread, 'Threading required for this test.')
5331@unittest.skipUnless(hasattr(os, "sendfile"),
5332 'os.sendfile() required for this test.')
5333class SendfileUsingSendfileTest(SendfileUsingSendTest):
5334 """
5335 Test the sendfile() implementation of socket.sendfile().
5336 """
5337 def meth_from_sock(self, sock):
5338 return getattr(sock, "_sendfile_use_sendfile")
5339
Christian Heimes48371412016-09-06 00:37:46 +02005340
5341@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005342class LinuxKernelCryptoAPI(unittest.TestCase):
5343 # tests for AF_ALG
5344 def create_alg(self, typ, name):
5345 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005346 try:
5347 sock.bind((typ, name))
5348 except FileNotFoundError as e:
5349 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005350 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005351 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005352 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005353 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005354
5355 def test_sha256(self):
5356 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5357 "177a9cb410ff61f20015ad")
5358 with self.create_alg('hash', 'sha256') as algo:
5359 op, _ = algo.accept()
5360 with op:
5361 op.sendall(b"abc")
5362 self.assertEqual(op.recv(512), expected)
5363
5364 op, _ = algo.accept()
5365 with op:
5366 op.send(b'a', socket.MSG_MORE)
5367 op.send(b'b', socket.MSG_MORE)
5368 op.send(b'c', socket.MSG_MORE)
5369 op.send(b'')
5370 self.assertEqual(op.recv(512), expected)
5371
5372 def test_hmac_sha1(self):
5373 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5374 with self.create_alg('hash', 'hmac(sha1)') as algo:
5375 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5376 op, _ = algo.accept()
5377 with op:
5378 op.sendall(b"what do ya want for nothing?")
5379 self.assertEqual(op.recv(512), expected)
5380
Christian Heimes04960a22016-09-06 00:58:47 +02005381 @support.requires_linux_version(3, 19)
Christian Heimesdffa3942016-09-05 23:54:41 +02005382 def test_aes_cbc(self):
5383 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5384 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5385 msg = b"Single block msg"
5386 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5387 msglen = len(msg)
5388 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5389 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5390 op, _ = algo.accept()
5391 with op:
5392 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5393 flags=socket.MSG_MORE)
5394 op.sendall(msg)
5395 self.assertEqual(op.recv(msglen), ciphertext)
5396
5397 op, _ = algo.accept()
5398 with op:
5399 op.sendmsg_afalg([ciphertext],
5400 op=socket.ALG_OP_DECRYPT, iv=iv)
5401 self.assertEqual(op.recv(msglen), msg)
5402
5403 # long message
5404 multiplier = 1024
5405 longmsg = [msg] * multiplier
5406 op, _ = algo.accept()
5407 with op:
5408 op.sendmsg_afalg(longmsg,
5409 op=socket.ALG_OP_ENCRYPT, iv=iv)
5410 enc = op.recv(msglen * multiplier)
5411 self.assertEqual(len(enc), msglen * multiplier)
5412 self.assertTrue(enc[:msglen], ciphertext)
5413
5414 op, _ = algo.accept()
5415 with op:
5416 op.sendmsg_afalg([enc],
5417 op=socket.ALG_OP_DECRYPT, iv=iv)
5418 dec = op.recv(msglen * multiplier)
5419 self.assertEqual(len(dec), msglen * multiplier)
5420 self.assertEqual(dec, msg * multiplier)
5421
5422 @support.requires_linux_version(3, 19)
5423 def test_aead_aes_gcm(self):
5424 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5425 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5426 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5427 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5428 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5429 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5430
5431 taglen = len(expected_tag)
5432 assoclen = len(assoc)
5433
5434 with self.create_alg('aead', 'gcm(aes)') as algo:
5435 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5436 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5437 None, taglen)
5438
5439 # send assoc, plain and tag buffer in separate steps
5440 op, _ = algo.accept()
5441 with op:
5442 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5443 assoclen=assoclen, flags=socket.MSG_MORE)
5444 op.sendall(assoc, socket.MSG_MORE)
5445 op.sendall(plain, socket.MSG_MORE)
5446 op.sendall(b'\x00' * taglen)
5447 res = op.recv(assoclen + len(plain) + taglen)
5448 self.assertEqual(expected_ct, res[assoclen:-taglen])
5449 self.assertEqual(expected_tag, res[-taglen:])
5450
5451 # now with msg
5452 op, _ = algo.accept()
5453 with op:
5454 msg = assoc + plain + b'\x00' * taglen
5455 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5456 assoclen=assoclen)
5457 res = op.recv(assoclen + len(plain) + taglen)
5458 self.assertEqual(expected_ct, res[assoclen:-taglen])
5459 self.assertEqual(expected_tag, res[-taglen:])
5460
5461 # create anc data manually
5462 pack_uint32 = struct.Struct('I').pack
5463 op, _ = algo.accept()
5464 with op:
5465 msg = assoc + plain + b'\x00' * taglen
5466 op.sendmsg(
5467 [msg],
5468 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5469 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5470 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5471 )
5472 )
5473 res = op.recv(len(msg))
5474 self.assertEqual(expected_ct, res[assoclen:-taglen])
5475 self.assertEqual(expected_tag, res[-taglen:])
5476
5477 # decrypt and verify
5478 op, _ = algo.accept()
5479 with op:
5480 msg = assoc + expected_ct + expected_tag
5481 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5482 assoclen=assoclen)
5483 res = op.recv(len(msg))
5484 self.assertEqual(plain, res[assoclen:-taglen])
5485
Christian Heimes04960a22016-09-06 00:58:47 +02005486 @support.requires_linux_version(3, 19)
Christian Heimesdffa3942016-09-05 23:54:41 +02005487 def test_drbg_pr_sha256(self):
5488 # deterministic random bit generator, prediction resistance, sha256
5489 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5490 extra_seed = os.urandom(32)
5491 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5492 op, _ = algo.accept()
5493 with op:
5494 rn = op.recv(32)
5495 self.assertEqual(len(rn), 32)
5496
5497 def test_sendmsg_afalg_args(self):
5498 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005499 with sock:
5500 with self.assertRaises(TypeError):
5501 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005502
Christian Heimes02b30352016-09-11 19:49:56 +02005503 with self.assertRaises(TypeError):
5504 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005505
Christian Heimes02b30352016-09-11 19:49:56 +02005506 with self.assertRaises(TypeError):
5507 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005508
Christian Heimes02b30352016-09-11 19:49:56 +02005509 with self.assertRaises(TypeError):
5510 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005511
Christian Heimes02b30352016-09-11 19:49:56 +02005512 with self.assertRaises(TypeError):
5513 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5514
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005515
Guido van Rossumb995eb72002-07-31 16:08:40 +00005516def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005517 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005518 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005519
5520 tests.extend([
5521 NonBlockingTCPTests,
5522 FileObjectClassTestCase,
5523 UnbufferedFileObjectClassTestCase,
5524 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005525 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005526 UnicodeReadFileObjectClassTestCase,
5527 UnicodeWriteFileObjectClassTestCase,
5528 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005529 NetworkConnectionNoServer,
5530 NetworkConnectionAttributesTest,
5531 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005532 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005533 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005534 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005535 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005536 tests.append(BasicSocketPairTest)
5537 tests.append(TestUnixDomain)
5538 tests.append(TestLinuxAbstractNamespace)
5539 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005540 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005541 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005542 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005543 tests.extend([
5544 CmsgMacroTests,
5545 SendmsgUDPTest,
5546 RecvmsgUDPTest,
5547 RecvmsgIntoUDPTest,
5548 SendmsgUDP6Test,
5549 RecvmsgUDP6Test,
5550 RecvmsgRFC3542AncillaryUDP6Test,
5551 RecvmsgIntoRFC3542AncillaryUDP6Test,
5552 RecvmsgIntoUDP6Test,
5553 SendmsgTCPTest,
5554 RecvmsgTCPTest,
5555 RecvmsgIntoTCPTest,
5556 SendmsgSCTPStreamTest,
5557 RecvmsgSCTPStreamTest,
5558 RecvmsgIntoSCTPStreamTest,
5559 SendmsgUnixStreamTest,
5560 RecvmsgUnixStreamTest,
5561 RecvmsgIntoUnixStreamTest,
5562 RecvmsgSCMRightsStreamTest,
5563 RecvmsgIntoSCMRightsStreamTest,
5564 # These are slow when setitimer() is not available
5565 InterruptedRecvTimeoutTest,
5566 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005567 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005568 SendfileUsingSendTest,
5569 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005570 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005571
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005572 thread_info = support.threading_setup()
5573 support.run_unittest(*tests)
5574 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005575
5576if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005577 test_main()