blob: faacd61fc104054fb474cac43730850de9c1a457 [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
Charles-François Natali47413c12011-10-06 19:47:44 +020068HAVE_SOCKET_CAN = _have_socket_can()
69
Charles-François Natali10b8cf42011-11-10 19:21:37 +010070HAVE_SOCKET_RDS = _have_socket_rds()
71
Nick Coghlan96fe56a2011-08-22 11:55:57 +100072# Size in bytes of the int type
73SIZEOF_INT = array.array("i").itemsize
74
Guido van Rossum24e4af82002-06-12 19:18:08 +000075class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000076
Guido van Rossum24e4af82002-06-12 19:18:08 +000077 def setUp(self):
78 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000079 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +010080 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +000081
Guido van Rossum24e4af82002-06-12 19:18:08 +000082 def tearDown(self):
83 self.serv.close()
84 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000085
Guido van Rossum24e4af82002-06-12 19:18:08 +000086class SocketUDPTest(unittest.TestCase):
87
88 def setUp(self):
89 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000090 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000091
92 def tearDown(self):
93 self.serv.close()
94 self.serv = None
95
Nick Coghlan96fe56a2011-08-22 11:55:57 +100096class ThreadSafeCleanupTestCase(unittest.TestCase):
97 """Subclass of unittest.TestCase with thread-safe cleanup methods.
98
99 This subclass protects the addCleanup() and doCleanups() methods
100 with a recursive lock.
101 """
102
103 if threading:
104 def __init__(self, *args, **kwargs):
105 super().__init__(*args, **kwargs)
106 self._cleanup_lock = threading.RLock()
107
108 def addCleanup(self, *args, **kwargs):
109 with self._cleanup_lock:
110 return super().addCleanup(*args, **kwargs)
111
112 def doCleanups(self, *args, **kwargs):
113 with self._cleanup_lock:
114 return super().doCleanups(*args, **kwargs)
115
Charles-François Natali47413c12011-10-06 19:47:44 +0200116class SocketCANTest(unittest.TestCase):
117
118 """To be able to run this test, a `vcan0` CAN interface can be created with
119 the following commands:
120 # modprobe vcan
121 # ip link add dev vcan0 type vcan
122 # ifconfig vcan0 up
123 """
124 interface = 'vcan0'
125 bufsize = 128
126
Charles-François Natali773e42d2013-02-05 19:42:01 +0100127 """The CAN frame structure is defined in <linux/can.h>:
128
129 struct can_frame {
130 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
131 __u8 can_dlc; /* data length code: 0 .. 8 */
132 __u8 data[8] __attribute__((aligned(8)));
133 };
134 """
135 can_frame_fmt = "=IB3x8s"
136 can_frame_size = struct.calcsize(can_frame_fmt)
137
138 """The Broadcast Management Command frame structure is defined
139 in <linux/can/bcm.h>:
140
141 struct bcm_msg_head {
142 __u32 opcode;
143 __u32 flags;
144 __u32 count;
145 struct timeval ival1, ival2;
146 canid_t can_id;
147 __u32 nframes;
148 struct can_frame frames[0];
149 }
150
151 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
152 `struct can_frame` definition). Must use native not standard types for packing.
153 """
154 bcm_cmd_msg_fmt = "@3I4l2I"
155 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
156
Charles-François Natali47413c12011-10-06 19:47:44 +0200157 def setUp(self):
158 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200159 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200160 try:
161 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200162 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200163 self.skipTest('network interface `%s` does not exist' %
164 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200165
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100166
167class SocketRDSTest(unittest.TestCase):
168
169 """To be able to run this test, the `rds` kernel module must be loaded:
170 # modprobe rds
171 """
172 bufsize = 8192
173
174 def setUp(self):
175 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
176 self.addCleanup(self.serv.close)
177 try:
178 self.port = support.bind_port(self.serv)
179 except OSError:
180 self.skipTest('unable to bind RDS socket')
181
182
Guido van Rossum24e4af82002-06-12 19:18:08 +0000183class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000184 """Threadable Test class
185
186 The ThreadableTest class makes it easy to create a threaded
187 client/server pair from an existing unit test. To create a
188 new threaded class from an existing unit test, use multiple
189 inheritance:
190
191 class NewClass (OldClass, ThreadableTest):
192 pass
193
194 This class defines two new fixture functions with obvious
195 purposes for overriding:
196
197 clientSetUp ()
198 clientTearDown ()
199
200 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000201 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000202 '_' to indicate the client portion of the test. Ex:
203
204 def testFoo(self):
205 # Server portion
206
207 def _testFoo(self):
208 # Client portion
209
210 Any exceptions raised by the clients during their tests
211 are caught and transferred to the main thread to alert
212 the testing framework.
213
214 Note, the server setup function cannot call any blocking
215 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000216 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000217 the blocking call (such as in setting up a client/server
218 connection and performing the accept() in setUp().
219 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000220
221 def __init__(self):
222 # Swap the true setup function
223 self.__setUp = self.setUp
224 self.__tearDown = self.tearDown
225 self.setUp = self._setUp
226 self.tearDown = self._tearDown
227
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000228 def serverExplicitReady(self):
229 """This method allows the server to explicitly indicate that
230 it wants the client thread to proceed. This is useful if the
231 server is about to execute a blocking routine that is
232 dependent upon the client thread during its setup routine."""
233 self.server_ready.set()
234
Guido van Rossum24e4af82002-06-12 19:18:08 +0000235 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000236 self.server_ready = threading.Event()
237 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000238 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000239 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200240 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000241
242 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000243 methodname = self.id()
244 i = methodname.rfind('.')
245 methodname = methodname[i+1:]
246 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000247 self.client_thread = thread.start_new_thread(
248 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000249
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200250 try:
251 self.__setUp()
252 except:
253 self.server_crashed = True
254 raise
255 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000256 self.server_ready.set()
257 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000258
259 def _tearDown(self):
260 self.__tearDown()
261 self.done.wait()
262
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000263 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000264 exc = self.queue.get()
265 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000266
267 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000268 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000269 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200270 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200271 if self.server_crashed:
272 self.clientTearDown()
273 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000274 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000275 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000276 try:
277 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000278 except BaseException as e:
279 self.queue.put(e)
280 finally:
281 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000282
283 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000284 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000285
286 def clientTearDown(self):
287 self.done.set()
288 thread.exit()
289
290class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
291
292 def __init__(self, methodName='runTest'):
293 SocketTCPTest.__init__(self, methodName=methodName)
294 ThreadableTest.__init__(self)
295
296 def clientSetUp(self):
297 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
298
299 def clientTearDown(self):
300 self.cli.close()
301 self.cli = None
302 ThreadableTest.clientTearDown(self)
303
304class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
305
306 def __init__(self, methodName='runTest'):
307 SocketUDPTest.__init__(self, methodName=methodName)
308 ThreadableTest.__init__(self)
309
310 def clientSetUp(self):
311 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
312
Brian Curtin3beb38f2010-11-04 03:41:43 +0000313 def clientTearDown(self):
314 self.cli.close()
315 self.cli = None
316 ThreadableTest.clientTearDown(self)
317
Charles-François Natali47413c12011-10-06 19:47:44 +0200318class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
319
320 def __init__(self, methodName='runTest'):
321 SocketCANTest.__init__(self, methodName=methodName)
322 ThreadableTest.__init__(self)
323
324 def clientSetUp(self):
325 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
326 try:
327 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200328 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200329 # skipTest should not be called here, and will be called in the
330 # server instead
331 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200332
333 def clientTearDown(self):
334 self.cli.close()
335 self.cli = None
336 ThreadableTest.clientTearDown(self)
337
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100338class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
339
340 def __init__(self, methodName='runTest'):
341 SocketRDSTest.__init__(self, methodName=methodName)
342 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100343
344 def clientSetUp(self):
345 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
346 try:
347 # RDS sockets must be bound explicitly to send or receive data
348 self.cli.bind((HOST, 0))
349 self.cli_addr = self.cli.getsockname()
350 except OSError:
351 # skipTest should not be called here, and will be called in the
352 # server instead
353 pass
354
355 def clientTearDown(self):
356 self.cli.close()
357 self.cli = None
358 ThreadableTest.clientTearDown(self)
359
Guido van Rossum24e4af82002-06-12 19:18:08 +0000360class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000361 """Socket tests for client-server connection.
362
363 self.cli_conn is a client socket connected to the server. The
364 setUp() method guarantees that it is connected to the server.
365 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000366
367 def __init__(self, methodName='runTest'):
368 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
369
370 def setUp(self):
371 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000372 # Indicate explicitly we're ready for the client thread to
373 # proceed and then perform the blocking call to accept
374 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000375 conn, addr = self.serv.accept()
376 self.cli_conn = conn
377
378 def tearDown(self):
379 self.cli_conn.close()
380 self.cli_conn = None
381 ThreadedTCPSocketTest.tearDown(self)
382
383 def clientSetUp(self):
384 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000385 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000386 self.serv_conn = self.cli
387
388 def clientTearDown(self):
389 self.serv_conn.close()
390 self.serv_conn = None
391 ThreadedTCPSocketTest.clientTearDown(self)
392
Dave Cole331708b2004-08-09 04:51:41 +0000393class SocketPairTest(unittest.TestCase, ThreadableTest):
394
395 def __init__(self, methodName='runTest'):
396 unittest.TestCase.__init__(self, methodName=methodName)
397 ThreadableTest.__init__(self)
398
399 def setUp(self):
400 self.serv, self.cli = socket.socketpair()
401
402 def tearDown(self):
403 self.serv.close()
404 self.serv = None
405
406 def clientSetUp(self):
407 pass
408
409 def clientTearDown(self):
410 self.cli.close()
411 self.cli = None
412 ThreadableTest.clientTearDown(self)
413
Tim Peters494aaee2004-08-09 18:54:11 +0000414
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000415# The following classes are used by the sendmsg()/recvmsg() tests.
416# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
417# gives a drop-in replacement for SocketConnectedTest, but different
418# address families can be used, and the attributes serv_addr and
419# cli_addr will be set to the addresses of the endpoints.
420
421class SocketTestBase(unittest.TestCase):
422 """A base class for socket tests.
423
424 Subclasses must provide methods newSocket() to return a new socket
425 and bindSock(sock) to bind it to an unused address.
426
427 Creates a socket self.serv and sets self.serv_addr to its address.
428 """
429
430 def setUp(self):
431 self.serv = self.newSocket()
432 self.bindServer()
433
434 def bindServer(self):
435 """Bind server socket and set self.serv_addr to its address."""
436 self.bindSock(self.serv)
437 self.serv_addr = self.serv.getsockname()
438
439 def tearDown(self):
440 self.serv.close()
441 self.serv = None
442
443
444class SocketListeningTestMixin(SocketTestBase):
445 """Mixin to listen on the server socket."""
446
447 def setUp(self):
448 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100449 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000450
451
452class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
453 ThreadableTest):
454 """Mixin to add client socket and allow client/server tests.
455
456 Client socket is self.cli and its address is self.cli_addr. See
457 ThreadableTest for usage information.
458 """
459
460 def __init__(self, *args, **kwargs):
461 super().__init__(*args, **kwargs)
462 ThreadableTest.__init__(self)
463
464 def clientSetUp(self):
465 self.cli = self.newClientSocket()
466 self.bindClient()
467
468 def newClientSocket(self):
469 """Return a new socket for use as client."""
470 return self.newSocket()
471
472 def bindClient(self):
473 """Bind client socket and set self.cli_addr to its address."""
474 self.bindSock(self.cli)
475 self.cli_addr = self.cli.getsockname()
476
477 def clientTearDown(self):
478 self.cli.close()
479 self.cli = None
480 ThreadableTest.clientTearDown(self)
481
482
483class ConnectedStreamTestMixin(SocketListeningTestMixin,
484 ThreadedSocketTestMixin):
485 """Mixin to allow client/server stream tests with connected client.
486
487 Server's socket representing connection to client is self.cli_conn
488 and client's connection to server is self.serv_conn. (Based on
489 SocketConnectedTest.)
490 """
491
492 def setUp(self):
493 super().setUp()
494 # Indicate explicitly we're ready for the client thread to
495 # proceed and then perform the blocking call to accept
496 self.serverExplicitReady()
497 conn, addr = self.serv.accept()
498 self.cli_conn = conn
499
500 def tearDown(self):
501 self.cli_conn.close()
502 self.cli_conn = None
503 super().tearDown()
504
505 def clientSetUp(self):
506 super().clientSetUp()
507 self.cli.connect(self.serv_addr)
508 self.serv_conn = self.cli
509
510 def clientTearDown(self):
511 self.serv_conn.close()
512 self.serv_conn = None
513 super().clientTearDown()
514
515
516class UnixSocketTestBase(SocketTestBase):
517 """Base class for Unix-domain socket tests."""
518
519 # This class is used for file descriptor passing tests, so we
520 # create the sockets in a private directory so that other users
521 # can't send anything that might be problematic for a privileged
522 # user running the tests.
523
524 def setUp(self):
525 self.dir_path = tempfile.mkdtemp()
526 self.addCleanup(os.rmdir, self.dir_path)
527 super().setUp()
528
529 def bindSock(self, sock):
530 path = tempfile.mktemp(dir=self.dir_path)
531 sock.bind(path)
532 self.addCleanup(support.unlink, path)
533
534class UnixStreamBase(UnixSocketTestBase):
535 """Base class for Unix-domain SOCK_STREAM tests."""
536
537 def newSocket(self):
538 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
539
540
541class InetTestBase(SocketTestBase):
542 """Base class for IPv4 socket tests."""
543
544 host = HOST
545
546 def setUp(self):
547 super().setUp()
548 self.port = self.serv_addr[1]
549
550 def bindSock(self, sock):
551 support.bind_port(sock, host=self.host)
552
553class TCPTestBase(InetTestBase):
554 """Base class for TCP-over-IPv4 tests."""
555
556 def newSocket(self):
557 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
558
559class UDPTestBase(InetTestBase):
560 """Base class for UDP-over-IPv4 tests."""
561
562 def newSocket(self):
563 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
564
565class SCTPStreamBase(InetTestBase):
566 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
567
568 def newSocket(self):
569 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
570 socket.IPPROTO_SCTP)
571
572
573class Inet6TestBase(InetTestBase):
574 """Base class for IPv6 socket tests."""
575
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200576 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000577
578class UDP6TestBase(Inet6TestBase):
579 """Base class for UDP-over-IPv6 tests."""
580
581 def newSocket(self):
582 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
583
584
585# Test-skipping decorators for use with ThreadableTest.
586
587def skipWithClientIf(condition, reason):
588 """Skip decorated test if condition is true, add client_skip decorator.
589
590 If the decorated object is not a class, sets its attribute
591 "client_skip" to a decorator which will return an empty function
592 if the test is to be skipped, or the original function if it is
593 not. This can be used to avoid running the client part of a
594 skipped test when using ThreadableTest.
595 """
596 def client_pass(*args, **kwargs):
597 pass
598 def skipdec(obj):
599 retval = unittest.skip(reason)(obj)
600 if not isinstance(obj, type):
601 retval.client_skip = lambda f: client_pass
602 return retval
603 def noskipdec(obj):
604 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
605 obj.client_skip = lambda f: f
606 return obj
607 return skipdec if condition else noskipdec
608
609
610def requireAttrs(obj, *attributes):
611 """Skip decorated test if obj is missing any of the given attributes.
612
613 Sets client_skip attribute as skipWithClientIf() does.
614 """
615 missing = [name for name in attributes if not hasattr(obj, name)]
616 return skipWithClientIf(
617 missing, "don't have " + ", ".join(name for name in missing))
618
619
620def requireSocket(*args):
621 """Skip decorated test if a socket cannot be created with given arguments.
622
623 When an argument is given as a string, will use the value of that
624 attribute of the socket module, or skip the test if it doesn't
625 exist. Sets client_skip attribute as skipWithClientIf() does.
626 """
627 err = None
628 missing = [obj for obj in args if
629 isinstance(obj, str) and not hasattr(socket, obj)]
630 if missing:
631 err = "don't have " + ", ".join(name for name in missing)
632 else:
633 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
634 for obj in args]
635 try:
636 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200637 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000638 # XXX: check errno?
639 err = str(e)
640 else:
641 s.close()
642 return skipWithClientIf(
643 err is not None,
644 "can't create socket({0}): {1}".format(
645 ", ".join(str(o) for o in args), err))
646
647
Guido van Rossum24e4af82002-06-12 19:18:08 +0000648#######################################################################
649## Begin Tests
650
651class GeneralModuleTests(unittest.TestCase):
652
Ethan Furman7184bac2014-10-14 18:56:53 -0700653 def test_SocketType_is_socketobject(self):
654 import _socket
655 self.assertTrue(socket.SocketType is _socket.socket)
656 s = socket.socket()
657 self.assertIsInstance(s, socket.SocketType)
658 s.close()
659
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000660 def test_repr(self):
661 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200662 with s:
663 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000664 self.assertIn('family=%s' % socket.AF_INET, repr(s))
665 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200666 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200667 self.assertNotIn('raddr', repr(s))
668 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200669 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200670 self.assertIn(str(s.getsockname()), repr(s))
671 self.assertIn('[closed]', repr(s))
672 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000673
Victor Stinnere254e532014-07-26 14:36:55 +0200674 @unittest.skipUnless(_socket is not None, 'need _socket module')
675 def test_csocket_repr(self):
676 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
677 try:
678 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
679 % (s.fileno(), s.family, s.type, s.proto))
680 self.assertEqual(repr(s), expected)
681 finally:
682 s.close()
683 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
684 % (s.family, s.type, s.proto))
685 self.assertEqual(repr(s), expected)
686
Raymond Hettinger027bb632004-05-31 03:09:25 +0000687 def test_weakref(self):
688 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
689 p = proxy(s)
690 self.assertEqual(p.fileno(), s.fileno())
691 s.close()
692 s = None
693 try:
694 p.fileno()
695 except ReferenceError:
696 pass
697 else:
698 self.fail('Socket proxy still exists')
699
Guido van Rossum24e4af82002-06-12 19:18:08 +0000700 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000701 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300702 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200703 with self.assertRaises(OSError, msg=msg % 'OSError'):
704 raise OSError
705 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000706 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200707 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000708 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000709
Ezio Melotti63e42302011-05-07 19:47:48 +0300710 def testSendtoErrors(self):
Berker Peksag4882cac2015-04-14 09:30:01 +0300711 # Testing that sendto doesn't masks failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300712 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
713 self.addCleanup(s.close)
714 s.bind(('', 0))
715 sockname = s.getsockname()
716 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300717 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300718 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300719 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400720 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300721 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300722 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300723 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400724 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300725 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300726 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300727 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300728 # 3 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', 0, 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, 0, 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', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300739 self.assertIn('not NoneType', str(cm.exception))
740 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300741 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300742 self.assertIn('an integer is required', str(cm.exception))
743 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300744 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300745 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300746 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300747 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300748 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300749 self.assertIn('(1 given)', str(cm.exception))
750 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300751 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300752 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300753
Guido van Rossum24e4af82002-06-12 19:18:08 +0000754 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000755 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000756 socket.AF_INET
757 socket.SOCK_STREAM
758 socket.SOCK_DGRAM
759 socket.SOCK_RAW
760 socket.SOCK_RDM
761 socket.SOCK_SEQPACKET
762 socket.SOL_SOCKET
763 socket.SO_REUSEADDR
764
Guido van Rossum654c11e2002-06-13 20:24:17 +0000765 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000766 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000767 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000768 try:
769 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200770 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000771 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600772 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000773 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000774 try:
775 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200776 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000777 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600778 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000779 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000780 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000781 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000782 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000783
Charles-François Natali0cc86852013-09-13 19:53:08 +0200784 def test_host_resolution(self):
785 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
786 '1:1:1:1:1:1:1:1:1']:
787 self.assertRaises(OSError, socket.gethostbyname, addr)
788 self.assertRaises(OSError, socket.gethostbyaddr, addr)
789
790 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
791 self.assertEqual(socket.gethostbyname(addr), addr)
792
793 # we don't test support.HOSTv6 because there's a chance it doesn't have
794 # a matching name entry (e.g. 'ip6-localhost')
795 for host in [support.HOST]:
796 self.assertIn(host, socket.gethostbyaddr(host)[2])
797
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000798 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
799 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
800 def test_sethostname(self):
801 oldhn = socket.gethostname()
802 try:
803 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200804 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000805 if e.errno == errno.EPERM:
806 self.skipTest("test should be run as root")
807 else:
808 raise
809 try:
810 # running test as root!
811 self.assertEqual(socket.gethostname(), 'new')
812 # Should work with bytes objects too
813 socket.sethostname(b'bar')
814 self.assertEqual(socket.gethostname(), 'bar')
815 finally:
816 socket.sethostname(oldhn)
817
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700818 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
819 'socket.if_nameindex() not available.')
820 def testInterfaceNameIndex(self):
821 interfaces = socket.if_nameindex()
822 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200823 self.assertIsInstance(index, int)
824 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700825 # interface indices are non-zero integers
826 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200827 _index = socket.if_nametoindex(name)
828 self.assertIsInstance(_index, int)
829 self.assertEqual(index, _index)
830 _name = socket.if_indextoname(index)
831 self.assertIsInstance(_name, str)
832 self.assertEqual(name, _name)
833
834 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
835 'socket.if_nameindex() not available.')
836 def testInvalidInterfaceNameIndex(self):
837 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200838 self.assertRaises(OSError, socket.if_indextoname, 0)
839 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200840 # test with invalid values
841 self.assertRaises(TypeError, socket.if_nametoindex, 0)
842 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700843
Serhiy Storchaka43767632013-11-03 21:31:38 +0200844 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
845 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000846 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000847 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200848 try:
849 # On some versions, this loses a reference
850 orig = sys.getrefcount(__name__)
851 socket.getnameinfo(__name__,0)
852 except TypeError:
853 if sys.getrefcount(__name__) != orig:
854 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000855
Guido van Rossum24e4af82002-06-12 19:18:08 +0000856 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000857 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000858 try:
859 # On some versions, this crashes the interpreter.
860 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200861 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000862 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000863
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000864 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000865 # This just checks that htons etc. are their own inverse,
866 # when looking at the lower 16 or 32 bits.
867 sizes = {socket.htonl: 32, socket.ntohl: 32,
868 socket.htons: 16, socket.ntohs: 16}
869 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000870 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000871 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
872 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000873
Guido van Rossuma2627af2002-09-14 00:58:46 +0000874 swapped = func(mask)
875 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000876 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000877
Guido van Rossum018919a2007-01-15 00:07:32 +0000878 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000879 good_values = [ 1, 2, 3, 1, 2, 3 ]
880 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000881 for k in good_values:
882 socket.ntohl(k)
883 socket.ntohs(k)
884 socket.htonl(k)
885 socket.htons(k)
886 for k in bad_values:
887 self.assertRaises(OverflowError, socket.ntohl, k)
888 self.assertRaises(OverflowError, socket.ntohs, k)
889 self.assertRaises(OverflowError, socket.htonl, k)
890 self.assertRaises(OverflowError, socket.htons, k)
891
Barry Warsaw11b91a02004-06-28 00:50:43 +0000892 def testGetServBy(self):
893 eq = self.assertEqual
894 # Find one service that exists, then check all the related interfaces.
895 # I've ordered this by protocols that have both a tcp and udp
896 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200897 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200898 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000899 # avoid the 'echo' service on this platform, as there is an
900 # assumption breaking non-standard port/protocol entry
901 services = ('daytime', 'qotd', 'domain')
902 else:
903 services = ('echo', 'daytime', 'domain')
904 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000905 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000906 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000907 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200908 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000909 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000910 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200911 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000912 # Try same call with optional protocol omitted
913 port2 = socket.getservbyname(service)
914 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400915 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000916 try:
917 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200918 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000919 udpport = None
920 else:
921 eq(udpport, port)
922 # Now make sure the lookup by port returns the same service name
923 eq(socket.getservbyport(port2), service)
924 eq(socket.getservbyport(port, 'tcp'), service)
925 if udpport is not None:
926 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000927 # Make sure getservbyport does not accept out of range ports.
928 self.assertRaises(OverflowError, socket.getservbyport, -1)
929 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000930
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000931 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000932 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000933 # The default timeout should initially be None
934 self.assertEqual(socket.getdefaulttimeout(), None)
935 s = socket.socket()
936 self.assertEqual(s.gettimeout(), None)
937 s.close()
938
939 # Set the default timeout to 10, and see if it propagates
940 socket.setdefaulttimeout(10)
941 self.assertEqual(socket.getdefaulttimeout(), 10)
942 s = socket.socket()
943 self.assertEqual(s.gettimeout(), 10)
944 s.close()
945
946 # Reset the default timeout to None, and see if it propagates
947 socket.setdefaulttimeout(None)
948 self.assertEqual(socket.getdefaulttimeout(), None)
949 s = socket.socket()
950 self.assertEqual(s.gettimeout(), None)
951 s.close()
952
953 # Check that setting it to an invalid value raises ValueError
954 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
955
956 # Check that setting it to an invalid type raises TypeError
957 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
958
Serhiy Storchaka43767632013-11-03 21:31:38 +0200959 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
960 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000961 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000962 # Test that issue1008086 and issue767150 are fixed.
963 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000964 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
965 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000966
Serhiy Storchaka43767632013-11-03 21:31:38 +0200967 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
968 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000969 def testIPv4toString(self):
970 from socket import inet_aton as f, inet_pton, AF_INET
971 g = lambda a: inet_pton(AF_INET, a)
972
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100973 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200974 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100975 )
976
Ezio Melottib3aedd42010-11-20 19:04:17 +0000977 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
978 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
979 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
980 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
981 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100982 assertInvalid(f, '0.0.0.')
983 assertInvalid(f, '300.0.0.0')
984 assertInvalid(f, 'a.0.0.0')
985 assertInvalid(f, '1.2.3.4.5')
986 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000987
Ezio Melottib3aedd42010-11-20 19:04:17 +0000988 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
989 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
990 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
991 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100992 assertInvalid(g, '0.0.0.')
993 assertInvalid(g, '300.0.0.0')
994 assertInvalid(g, 'a.0.0.0')
995 assertInvalid(g, '1.2.3.4.5')
996 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000997
Serhiy Storchaka43767632013-11-03 21:31:38 +0200998 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
999 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001000 def testIPv6toString(self):
1001 try:
1002 from socket import inet_pton, AF_INET6, has_ipv6
1003 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001004 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001005 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001006 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001007
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001008 if sys.platform == "win32":
1009 try:
1010 inet_pton(AF_INET6, '::')
1011 except OSError as e:
1012 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001013 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001014
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001015 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001016 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001017 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001018 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001019
Ezio Melottib3aedd42010-11-20 19:04:17 +00001020 self.assertEqual(b'\x00' * 16, f('::'))
1021 self.assertEqual(b'\x00' * 16, f('0::0'))
1022 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1023 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001024 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 +00001025 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1026 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001027 self.assertEqual(
1028 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1029 f('ad42:abc::127:0:254:2')
1030 )
1031 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1032 assertInvalid('0x20::')
1033 assertInvalid(':::')
1034 assertInvalid('::0::')
1035 assertInvalid('1::abc::')
1036 assertInvalid('1::abc::def')
1037 assertInvalid('1:2:3:4:5:6:')
1038 assertInvalid('1:2:3:4:5:6')
1039 assertInvalid('1:2:3:4:5:6:7:8:')
1040 assertInvalid('1:2:3:4:5:6:7:8:0')
1041
1042 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1043 f('::254.42.23.64')
1044 )
1045 self.assertEqual(
1046 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1047 f('42::a29b:254.42.23.64')
1048 )
1049 self.assertEqual(
1050 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1051 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1052 )
1053 assertInvalid('255.254.253.252')
1054 assertInvalid('1::260.2.3.0')
1055 assertInvalid('1::0.be.e.0')
1056 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1057 assertInvalid('::1.2.3.4:0')
1058 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001059
Serhiy Storchaka43767632013-11-03 21:31:38 +02001060 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1061 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001062 def testStringToIPv4(self):
1063 from socket import inet_ntoa as f, inet_ntop, AF_INET
1064 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001065 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001066 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001067 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001068
Ezio Melottib3aedd42010-11-20 19:04:17 +00001069 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1070 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1071 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1072 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001073 assertInvalid(f, b'\x00' * 3)
1074 assertInvalid(f, b'\x00' * 5)
1075 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001076 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001077
Ezio Melottib3aedd42010-11-20 19:04:17 +00001078 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1079 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1080 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001081 assertInvalid(g, b'\x00' * 3)
1082 assertInvalid(g, b'\x00' * 5)
1083 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001084 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001085
Serhiy Storchaka43767632013-11-03 21:31:38 +02001086 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1087 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001088 def testStringToIPv6(self):
1089 try:
1090 from socket import inet_ntop, AF_INET6, has_ipv6
1091 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001092 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001093 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001094 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001095
1096 if sys.platform == "win32":
1097 try:
1098 inet_ntop(AF_INET6, b'\x00' * 16)
1099 except OSError as e:
1100 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001101 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001102
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001103 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001104 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001105 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001106 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001107
Ezio Melottib3aedd42010-11-20 19:04:17 +00001108 self.assertEqual('::', f(b'\x00' * 16))
1109 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1110 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001111 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001112 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 +00001113 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001114 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001115
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001116 assertInvalid(b'\x12' * 15)
1117 assertInvalid(b'\x12' * 17)
1118 assertInvalid(b'\x12' * 4)
1119
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001120 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001121
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001122 def testSockName(self):
1123 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001124 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001125 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001126 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001127 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001128 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001129 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1130 # it reasonable to get the host's addr in addition to 0.0.0.0.
1131 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001132 try:
1133 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001134 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001135 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001136 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001137 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001138 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001139
1140 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001141 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001142 # We know a socket should start without reuse==0
1143 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001144 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001145 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001146 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001147
1148 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001149 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001150 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001151 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001152 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1153 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001154 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001155
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001156 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001157 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001158 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1159 sock.settimeout(1)
1160 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001161 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001162
Martin Panter50ab1a32016-04-11 00:38:12 +00001163 def testCloseException(self):
1164 sock = socket.socket()
1165 socket.socket(fileno=sock.fileno()).close()
1166 try:
1167 sock.close()
1168 except OSError as err:
1169 # Winsock apparently raises ENOTSOCK
1170 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1171 else:
1172 self.fail("close() should raise EBADF/ENOTSOCK")
1173
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001174 def testNewAttributes(self):
1175 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001176
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001177 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1178 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001179 if hasattr(socket, 'SOCK_CLOEXEC'):
1180 self.assertIn(sock.type,
1181 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1182 socket.SOCK_STREAM))
1183 else:
1184 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001185 self.assertEqual(sock.proto, 0)
1186 sock.close()
1187
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001188 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001189 sock = socket.socket()
1190 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001191 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001192 big_port = port + 65536
1193 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001194 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1195 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1196 # Since find_unused_port() is inherently subject to race conditions, we
1197 # call it a couple times if necessary.
1198 for i in itertools.count():
1199 port = support.find_unused_port()
1200 try:
1201 sock.bind((HOST, port))
1202 except OSError as e:
1203 if e.errno != errno.EADDRINUSE or i == 5:
1204 raise
1205 else:
1206 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001207
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001208 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001209 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001210 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1211 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1212 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1213 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001214 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1215 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001216 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001217 self.assertRaises(ValueError, s.ioctl, -1, None)
1218 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001219
Steve Dowerea93ac02016-06-17 12:52:18 -07001220 @unittest.skipUnless(os.name == "nt", "Windows specific")
1221 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1222 'Loopback fast path support required for this test')
1223 def test_sio_loopback_fast_path(self):
1224 s = socket.socket()
1225 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001226 try:
1227 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1228 except OSError as exc:
1229 WSAEOPNOTSUPP = 10045
1230 if exc.winerror == WSAEOPNOTSUPP:
1231 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1232 "doesn't implemented in this Windows version")
1233 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001234 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1235
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001236 def testGetaddrinfo(self):
1237 try:
1238 socket.getaddrinfo('localhost', 80)
1239 except socket.gaierror as err:
1240 if err.errno == socket.EAI_SERVICE:
1241 # see http://bugs.python.org/issue1282647
1242 self.skipTest("buggy libc version")
1243 raise
1244 # len of every sequence is supposed to be == 5
1245 for info in socket.getaddrinfo(HOST, None):
1246 self.assertEqual(len(info), 5)
1247 # host can be a domain name, a string representation of an
1248 # IPv4/v6 address or None
1249 socket.getaddrinfo('localhost', 80)
1250 socket.getaddrinfo('127.0.0.1', 80)
1251 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001252 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001253 socket.getaddrinfo('::1', 80)
1254 # port can be a string service name such as "http", a numeric
1255 # port number or None
1256 socket.getaddrinfo(HOST, "http")
1257 socket.getaddrinfo(HOST, 80)
1258 socket.getaddrinfo(HOST, None)
1259 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001260 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1261 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001262 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001263 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1264 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001265 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001266 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1267 for _, socktype, _, _, _ in infos:
1268 self.assertEqual(socktype, socket.SOCK_STREAM)
1269 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001270 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001271 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1272 # a server willing to support both IPv4 and IPv6 will
1273 # usually do this
1274 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1275 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001276 # test keyword arguments
1277 a = socket.getaddrinfo(HOST, None)
1278 b = socket.getaddrinfo(host=HOST, port=None)
1279 self.assertEqual(a, b)
1280 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1281 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1282 self.assertEqual(a, b)
1283 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1284 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1285 self.assertEqual(a, b)
1286 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1287 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1288 self.assertEqual(a, b)
1289 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1290 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1291 self.assertEqual(a, b)
1292 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1293 socket.AI_PASSIVE)
1294 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1295 type=socket.SOCK_STREAM, proto=0,
1296 flags=socket.AI_PASSIVE)
1297 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001298 # Issue #6697.
1299 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001300
Ned Deilyb24f4812014-02-13 22:50:42 -08001301 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001302 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001303 try:
1304 # The arguments here are undefined and the call may succeed
1305 # or fail. All we care here is that it doesn't segfault.
1306 socket.getaddrinfo("localhost", None, 0, 0, 0,
1307 socket.AI_NUMERICSERV)
1308 except socket.gaierror:
1309 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001310
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001311 def test_getnameinfo(self):
1312 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001313 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001314
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001315 @unittest.skipUnless(support.is_resource_enabled('network'),
1316 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001317 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001318 # Check for internet access before running test
1319 # (issue #12804, issue #25138).
1320 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001321 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001322
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001323 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001324 domain = 'испытание.pythontest.net'
1325 socket.gethostbyname(domain)
1326 socket.gethostbyname_ex(domain)
1327 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001328 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1329 # have a reverse entry yet
1330 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001331
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001332 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001333 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001334 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1335 self.skipTest("signal.alarm and socket.socketpair required for this test")
1336 # Our signal handlers clobber the C errno by calling a math function
1337 # with an invalid domain value.
1338 def ok_handler(*args):
1339 self.assertRaises(ValueError, math.acosh, 0)
1340 def raising_handler(*args):
1341 self.assertRaises(ValueError, math.acosh, 0)
1342 1 // 0
1343 c, s = socket.socketpair()
1344 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1345 try:
1346 if with_timeout:
1347 # Just above the one second minimum for signal.alarm
1348 c.settimeout(1.5)
1349 with self.assertRaises(ZeroDivisionError):
1350 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001351 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001352 if with_timeout:
1353 signal.signal(signal.SIGALRM, ok_handler)
1354 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001355 self.assertRaises(socket.timeout, c.sendall,
1356 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001357 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001358 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001359 signal.signal(signal.SIGALRM, old_alarm)
1360 c.close()
1361 s.close()
1362
1363 def test_sendall_interrupted(self):
1364 self.check_sendall_interrupted(False)
1365
1366 def test_sendall_interrupted_with_timeout(self):
1367 self.check_sendall_interrupted(True)
1368
Antoine Pitroue033e062010-10-29 10:38:18 +00001369 def test_dealloc_warn(self):
1370 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1371 r = repr(sock)
1372 with self.assertWarns(ResourceWarning) as cm:
1373 sock = None
1374 support.gc_collect()
1375 self.assertIn(r, str(cm.warning.args[0]))
1376 # An open socket file object gets dereferenced after the socket
1377 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1378 f = sock.makefile('rb')
1379 r = repr(sock)
1380 sock = None
1381 support.gc_collect()
1382 with self.assertWarns(ResourceWarning):
1383 f = None
1384 support.gc_collect()
1385
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001386 def test_name_closed_socketio(self):
1387 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1388 fp = sock.makefile("rb")
1389 fp.close()
1390 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1391
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001392 def test_unusable_closed_socketio(self):
1393 with socket.socket() as sock:
1394 fp = sock.makefile("rb", buffering=0)
1395 self.assertTrue(fp.readable())
1396 self.assertFalse(fp.writable())
1397 self.assertFalse(fp.seekable())
1398 fp.close()
1399 self.assertRaises(ValueError, fp.readable)
1400 self.assertRaises(ValueError, fp.writable)
1401 self.assertRaises(ValueError, fp.seekable)
1402
Berker Peksag3fe64d02016-02-18 17:34:00 +02001403 def test_makefile_mode(self):
1404 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1405 with self.subTest(mode=mode):
1406 with socket.socket() as sock:
1407 with sock.makefile(mode) as fp:
1408 self.assertEqual(fp.mode, mode)
1409
1410 def test_makefile_invalid_mode(self):
1411 for mode in 'rt', 'x', '+', 'a':
1412 with self.subTest(mode=mode):
1413 with socket.socket() as sock:
1414 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1415 sock.makefile(mode)
1416
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001417 def test_pickle(self):
1418 sock = socket.socket()
1419 with sock:
1420 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1421 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001422 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1423 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1424 self.assertEqual(family, socket.AF_INET)
1425 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1426 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001427
Serhiy Storchaka78980432013-01-15 01:12:17 +02001428 def test_listen_backlog(self):
1429 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001430 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1431 srv.bind((HOST, 0))
1432 srv.listen(backlog)
1433
1434 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001435 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001436 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001437
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001438 @support.cpython_only
1439 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001440 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001441 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001442 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1443 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001444 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001445 srv.close()
1446
Charles-François Natali42663332012-01-02 15:57:30 +01001447 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001448 def test_flowinfo(self):
1449 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001450 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001451 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001452 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001453
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001454 def test_str_for_enums(self):
1455 # Make sure that the AF_* and SOCK_* constants have enum-like string
1456 # reprs.
1457 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1458 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001459 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001460
1461 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1462 def test_uknown_socket_family_repr(self):
1463 # Test that when created with a family that's not one of the known
1464 # AF_*/SOCK_* constants, socket.family just returns the number.
1465 #
1466 # To do this we fool socket.socket into believing it already has an
1467 # open fd because on this path it doesn't actually verify the family and
1468 # type and populates the socket object.
1469 #
1470 # On Windows this trick won't work, so the test is skipped.
1471 fd, _ = tempfile.mkstemp()
1472 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1473 self.assertEqual(s.family, 42424)
1474 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001475
Charles-François Natali47413c12011-10-06 19:47:44 +02001476@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1477class BasicCANTest(unittest.TestCase):
1478
1479 def testCrucialConstants(self):
1480 socket.AF_CAN
1481 socket.PF_CAN
1482 socket.CAN_RAW
1483
Charles-François Natali773e42d2013-02-05 19:42:01 +01001484 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1485 'socket.CAN_BCM required for this test.')
1486 def testBCMConstants(self):
1487 socket.CAN_BCM
1488
1489 # opcodes
1490 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1491 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1492 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1493 socket.CAN_BCM_TX_SEND # send one CAN frame
1494 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1495 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1496 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1497 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1498 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1499 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1500 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1501 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1502
Charles-François Natali47413c12011-10-06 19:47:44 +02001503 def testCreateSocket(self):
1504 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1505 pass
1506
Charles-François Natali773e42d2013-02-05 19:42:01 +01001507 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1508 'socket.CAN_BCM required for this test.')
1509 def testCreateBCMSocket(self):
1510 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1511 pass
1512
Charles-François Natali47413c12011-10-06 19:47:44 +02001513 def testBindAny(self):
1514 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1515 s.bind(('', ))
1516
1517 def testTooLongInterfaceName(self):
1518 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1519 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001520 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001521 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001522
1523 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1524 'socket.CAN_RAW_LOOPBACK required for this test.')
1525 def testLoopback(self):
1526 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1527 for loopback in (0, 1):
1528 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1529 loopback)
1530 self.assertEqual(loopback,
1531 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1532
1533 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1534 'socket.CAN_RAW_FILTER required for this test.')
1535 def testFilter(self):
1536 can_id, can_mask = 0x200, 0x700
1537 can_filter = struct.pack("=II", can_id, can_mask)
1538 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1539 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1540 self.assertEqual(can_filter,
1541 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001542 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001543
1544
1545@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001546@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001547class CANTest(ThreadedCANSocketTest):
1548
Charles-François Natali47413c12011-10-06 19:47:44 +02001549 def __init__(self, methodName='runTest'):
1550 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1551
1552 @classmethod
1553 def build_can_frame(cls, can_id, data):
1554 """Build a CAN frame."""
1555 can_dlc = len(data)
1556 data = data.ljust(8, b'\x00')
1557 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1558
1559 @classmethod
1560 def dissect_can_frame(cls, frame):
1561 """Dissect a CAN frame."""
1562 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1563 return (can_id, can_dlc, data[:can_dlc])
1564
1565 def testSendFrame(self):
1566 cf, addr = self.s.recvfrom(self.bufsize)
1567 self.assertEqual(self.cf, cf)
1568 self.assertEqual(addr[0], self.interface)
1569 self.assertEqual(addr[1], socket.AF_CAN)
1570
1571 def _testSendFrame(self):
1572 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1573 self.cli.send(self.cf)
1574
1575 def testSendMaxFrame(self):
1576 cf, addr = self.s.recvfrom(self.bufsize)
1577 self.assertEqual(self.cf, cf)
1578
1579 def _testSendMaxFrame(self):
1580 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1581 self.cli.send(self.cf)
1582
1583 def testSendMultiFrames(self):
1584 cf, addr = self.s.recvfrom(self.bufsize)
1585 self.assertEqual(self.cf1, cf)
1586
1587 cf, addr = self.s.recvfrom(self.bufsize)
1588 self.assertEqual(self.cf2, cf)
1589
1590 def _testSendMultiFrames(self):
1591 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1592 self.cli.send(self.cf1)
1593
1594 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1595 self.cli.send(self.cf2)
1596
Charles-François Natali773e42d2013-02-05 19:42:01 +01001597 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1598 'socket.CAN_BCM required for this test.')
1599 def _testBCM(self):
1600 cf, addr = self.cli.recvfrom(self.bufsize)
1601 self.assertEqual(self.cf, cf)
1602 can_id, can_dlc, data = self.dissect_can_frame(cf)
1603 self.assertEqual(self.can_id, can_id)
1604 self.assertEqual(self.data, data)
1605
1606 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1607 'socket.CAN_BCM required for this test.')
1608 def testBCM(self):
1609 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1610 self.addCleanup(bcm.close)
1611 bcm.connect((self.interface,))
1612 self.can_id = 0x123
1613 self.data = bytes([0xc0, 0xff, 0xee])
1614 self.cf = self.build_can_frame(self.can_id, self.data)
1615 opcode = socket.CAN_BCM_TX_SEND
1616 flags = 0
1617 count = 0
1618 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1619 bcm_can_id = 0x0222
1620 nframes = 1
1621 assert len(self.cf) == 16
1622 header = struct.pack(self.bcm_cmd_msg_fmt,
1623 opcode,
1624 flags,
1625 count,
1626 ival1_seconds,
1627 ival1_usec,
1628 ival2_seconds,
1629 ival2_usec,
1630 bcm_can_id,
1631 nframes,
1632 )
1633 header_plus_frame = header + self.cf
1634 bytes_sent = bcm.send(header_plus_frame)
1635 self.assertEqual(bytes_sent, len(header_plus_frame))
1636
Charles-François Natali47413c12011-10-06 19:47:44 +02001637
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001638@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1639class BasicRDSTest(unittest.TestCase):
1640
1641 def testCrucialConstants(self):
1642 socket.AF_RDS
1643 socket.PF_RDS
1644
1645 def testCreateSocket(self):
1646 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1647 pass
1648
1649 def testSocketBufferSize(self):
1650 bufsize = 16384
1651 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1652 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1653 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1654
1655
1656@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1657@unittest.skipUnless(thread, 'Threading required for this test.')
1658class RDSTest(ThreadedRDSSocketTest):
1659
1660 def __init__(self, methodName='runTest'):
1661 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1662
Charles-François Natali240c55f2011-11-10 20:33:36 +01001663 def setUp(self):
1664 super().setUp()
1665 self.evt = threading.Event()
1666
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001667 def testSendAndRecv(self):
1668 data, addr = self.serv.recvfrom(self.bufsize)
1669 self.assertEqual(self.data, data)
1670 self.assertEqual(self.cli_addr, addr)
1671
1672 def _testSendAndRecv(self):
1673 self.data = b'spam'
1674 self.cli.sendto(self.data, 0, (HOST, self.port))
1675
1676 def testPeek(self):
1677 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1678 self.assertEqual(self.data, data)
1679 data, addr = self.serv.recvfrom(self.bufsize)
1680 self.assertEqual(self.data, data)
1681
1682 def _testPeek(self):
1683 self.data = b'spam'
1684 self.cli.sendto(self.data, 0, (HOST, self.port))
1685
1686 @requireAttrs(socket.socket, 'recvmsg')
1687 def testSendAndRecvMsg(self):
1688 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1689 self.assertEqual(self.data, data)
1690
1691 @requireAttrs(socket.socket, 'sendmsg')
1692 def _testSendAndRecvMsg(self):
1693 self.data = b'hello ' * 10
1694 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1695
1696 def testSendAndRecvMulti(self):
1697 data, addr = self.serv.recvfrom(self.bufsize)
1698 self.assertEqual(self.data1, data)
1699
1700 data, addr = self.serv.recvfrom(self.bufsize)
1701 self.assertEqual(self.data2, data)
1702
1703 def _testSendAndRecvMulti(self):
1704 self.data1 = b'bacon'
1705 self.cli.sendto(self.data1, 0, (HOST, self.port))
1706
1707 self.data2 = b'egg'
1708 self.cli.sendto(self.data2, 0, (HOST, self.port))
1709
1710 def testSelect(self):
1711 r, w, x = select.select([self.serv], [], [], 3.0)
1712 self.assertIn(self.serv, r)
1713 data, addr = self.serv.recvfrom(self.bufsize)
1714 self.assertEqual(self.data, data)
1715
1716 def _testSelect(self):
1717 self.data = b'select'
1718 self.cli.sendto(self.data, 0, (HOST, self.port))
1719
1720 def testCongestion(self):
1721 # wait until the sender is done
1722 self.evt.wait()
1723
1724 def _testCongestion(self):
1725 # test the behavior in case of congestion
1726 self.data = b'fill'
1727 self.cli.setblocking(False)
1728 try:
1729 # try to lower the receiver's socket buffer size
1730 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1731 except OSError:
1732 pass
1733 with self.assertRaises(OSError) as cm:
1734 try:
1735 # fill the receiver's socket buffer
1736 while True:
1737 self.cli.sendto(self.data, 0, (HOST, self.port))
1738 finally:
1739 # signal the receiver we're done
1740 self.evt.set()
1741 # sendto() should have failed with ENOBUFS
1742 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1743 # and we should have received a congestion notification through poll
1744 r, w, x = select.select([self.serv], [], [], 3.0)
1745 self.assertIn(self.serv, r)
1746
1747
Victor Stinner45df8202010-04-28 22:31:17 +00001748@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001749class BasicTCPTest(SocketConnectedTest):
1750
1751 def __init__(self, methodName='runTest'):
1752 SocketConnectedTest.__init__(self, methodName=methodName)
1753
1754 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001755 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001756 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001757 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001758
1759 def _testRecv(self):
1760 self.serv_conn.send(MSG)
1761
1762 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001763 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001764 seg1 = self.cli_conn.recv(len(MSG) - 3)
1765 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001766 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001767 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001768
1769 def _testOverFlowRecv(self):
1770 self.serv_conn.send(MSG)
1771
1772 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001773 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001774 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001775 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001776
1777 def _testRecvFrom(self):
1778 self.serv_conn.send(MSG)
1779
1780 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001781 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001782 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1783 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001784 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001785 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001786
1787 def _testOverFlowRecvFrom(self):
1788 self.serv_conn.send(MSG)
1789
1790 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001791 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001792 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001793 while 1:
1794 read = self.cli_conn.recv(1024)
1795 if not read:
1796 break
Guido van Rossume531e292002-08-08 20:28:34 +00001797 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001798 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001799
1800 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001801 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001802 self.serv_conn.sendall(big_chunk)
1803
1804 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001805 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001806 fd = self.cli_conn.fileno()
1807 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001808 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001809 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001810 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001811 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001812
1813 def _testFromFd(self):
1814 self.serv_conn.send(MSG)
1815
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001816 def testDup(self):
1817 # Testing dup()
1818 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001819 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001820 msg = sock.recv(1024)
1821 self.assertEqual(msg, MSG)
1822
1823 def _testDup(self):
1824 self.serv_conn.send(MSG)
1825
Guido van Rossum24e4af82002-06-12 19:18:08 +00001826 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001827 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001828 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001829 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001830 # wait for _testShutdown to finish: on OS X, when the server
1831 # closes the connection the client also becomes disconnected,
1832 # and the client's shutdown call will fail. (Issue #4397.)
1833 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001834
1835 def _testShutdown(self):
1836 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001837 self.serv_conn.shutdown(2)
1838
1839 testShutdown_overflow = support.cpython_only(testShutdown)
1840
1841 @support.cpython_only
1842 def _testShutdown_overflow(self):
1843 import _testcapi
1844 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001845 # Issue 15989
1846 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1847 _testcapi.INT_MAX + 1)
1848 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1849 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001850 self.serv_conn.shutdown(2)
1851
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001852 def testDetach(self):
1853 # Testing detach()
1854 fileno = self.cli_conn.fileno()
1855 f = self.cli_conn.detach()
1856 self.assertEqual(f, fileno)
1857 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001858 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001859 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001860 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001861 # ...but we can create another socket using the (still open)
1862 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001863 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001864 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001865 msg = sock.recv(1024)
1866 self.assertEqual(msg, MSG)
1867
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001868 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001869 self.serv_conn.send(MSG)
1870
Victor Stinner45df8202010-04-28 22:31:17 +00001871@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001872class BasicUDPTest(ThreadedUDPSocketTest):
1873
1874 def __init__(self, methodName='runTest'):
1875 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1876
1877 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001878 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001879 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001880 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001881
1882 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001883 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001884
Guido van Rossum1c938012002-06-12 21:17:20 +00001885 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001886 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001887 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001888 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001889
Guido van Rossum1c938012002-06-12 21:17:20 +00001890 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001891 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001892
Guido van Rossumd8faa362007-04-27 19:54:29 +00001893 def testRecvFromNegative(self):
1894 # Negative lengths passed to recvfrom should give ValueError.
1895 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1896
1897 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001898 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001899
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001900# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1901# same test code is used with different families and types of socket
1902# (e.g. stream, datagram), and tests using recvmsg() are repeated
1903# using recvmsg_into().
1904#
1905# The generic test classes such as SendmsgTests and
1906# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1907# supplied with sockets cli_sock and serv_sock representing the
1908# client's and the server's end of the connection respectively, and
1909# attributes cli_addr and serv_addr holding their (numeric where
1910# appropriate) addresses.
1911#
1912# The final concrete test classes combine these with subclasses of
1913# SocketTestBase which set up client and server sockets of a specific
1914# type, and with subclasses of SendrecvmsgBase such as
1915# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1916# sockets to cli_sock and serv_sock and override the methods and
1917# attributes of SendrecvmsgBase to fill in destination addresses if
1918# needed when sending, check for specific flags in msg_flags, etc.
1919#
1920# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1921# recvmsg_into().
1922
1923# XXX: like the other datagram (UDP) tests in this module, the code
1924# here assumes that datagram delivery on the local machine will be
1925# reliable.
1926
1927class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1928 # Base class for sendmsg()/recvmsg() tests.
1929
1930 # Time in seconds to wait before considering a test failed, or
1931 # None for no timeout. Not all tests actually set a timeout.
1932 fail_timeout = 3.0
1933
1934 def setUp(self):
1935 self.misc_event = threading.Event()
1936 super().setUp()
1937
1938 def sendToServer(self, msg):
1939 # Send msg to the server.
1940 return self.cli_sock.send(msg)
1941
1942 # Tuple of alternative default arguments for sendmsg() when called
1943 # via sendmsgToServer() (e.g. to include a destination address).
1944 sendmsg_to_server_defaults = ()
1945
1946 def sendmsgToServer(self, *args):
1947 # Call sendmsg() on self.cli_sock with the given arguments,
1948 # filling in any arguments which are not supplied with the
1949 # corresponding items of self.sendmsg_to_server_defaults, if
1950 # any.
1951 return self.cli_sock.sendmsg(
1952 *(args + self.sendmsg_to_server_defaults[len(args):]))
1953
1954 def doRecvmsg(self, sock, bufsize, *args):
1955 # Call recvmsg() on sock with given arguments and return its
1956 # result. Should be used for tests which can use either
1957 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1958 # this method with one which emulates it using recvmsg_into(),
1959 # thus allowing the same test to be used for both methods.
1960 result = sock.recvmsg(bufsize, *args)
1961 self.registerRecvmsgResult(result)
1962 return result
1963
1964 def registerRecvmsgResult(self, result):
1965 # Called by doRecvmsg() with the return value of recvmsg() or
1966 # recvmsg_into(). Can be overridden to arrange cleanup based
1967 # on the returned ancillary data, for instance.
1968 pass
1969
1970 def checkRecvmsgAddress(self, addr1, addr2):
1971 # Called to compare the received address with the address of
1972 # the peer.
1973 self.assertEqual(addr1, addr2)
1974
1975 # Flags that are normally unset in msg_flags
1976 msg_flags_common_unset = 0
1977 for name in ("MSG_CTRUNC", "MSG_OOB"):
1978 msg_flags_common_unset |= getattr(socket, name, 0)
1979
1980 # Flags that are normally set
1981 msg_flags_common_set = 0
1982
1983 # Flags set when a complete record has been received (e.g. MSG_EOR
1984 # for SCTP)
1985 msg_flags_eor_indicator = 0
1986
1987 # Flags set when a complete record has not been received
1988 # (e.g. MSG_TRUNC for datagram sockets)
1989 msg_flags_non_eor_indicator = 0
1990
1991 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1992 # Method to check the value of msg_flags returned by recvmsg[_into]().
1993 #
1994 # Checks that all bits in msg_flags_common_set attribute are
1995 # set in "flags" and all bits in msg_flags_common_unset are
1996 # unset.
1997 #
1998 # The "eor" argument specifies whether the flags should
1999 # indicate that a full record (or datagram) has been received.
2000 # If "eor" is None, no checks are done; otherwise, checks
2001 # that:
2002 #
2003 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2004 # set and all bits in msg_flags_non_eor_indicator are unset
2005 #
2006 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2007 # are set and all bits in msg_flags_eor_indicator are unset
2008 #
2009 # If "checkset" and/or "checkunset" are supplied, they require
2010 # the given bits to be set or unset respectively, overriding
2011 # what the attributes require for those bits.
2012 #
2013 # If any bits are set in "ignore", they will not be checked,
2014 # regardless of the other inputs.
2015 #
2016 # Will raise Exception if the inputs require a bit to be both
2017 # set and unset, and it is not ignored.
2018
2019 defaultset = self.msg_flags_common_set
2020 defaultunset = self.msg_flags_common_unset
2021
2022 if eor:
2023 defaultset |= self.msg_flags_eor_indicator
2024 defaultunset |= self.msg_flags_non_eor_indicator
2025 elif eor is not None:
2026 defaultset |= self.msg_flags_non_eor_indicator
2027 defaultunset |= self.msg_flags_eor_indicator
2028
2029 # Function arguments override defaults
2030 defaultset &= ~checkunset
2031 defaultunset &= ~checkset
2032
2033 # Merge arguments with remaining defaults, and check for conflicts
2034 checkset |= defaultset
2035 checkunset |= defaultunset
2036 inboth = checkset & checkunset & ~ignore
2037 if inboth:
2038 raise Exception("contradictory set, unset requirements for flags "
2039 "{0:#x}".format(inboth))
2040
2041 # Compare with given msg_flags value
2042 mask = (checkset | checkunset) & ~ignore
2043 self.assertEqual(flags & mask, checkset & mask)
2044
2045
2046class RecvmsgIntoMixin(SendrecvmsgBase):
2047 # Mixin to implement doRecvmsg() using recvmsg_into().
2048
2049 def doRecvmsg(self, sock, bufsize, *args):
2050 buf = bytearray(bufsize)
2051 result = sock.recvmsg_into([buf], *args)
2052 self.registerRecvmsgResult(result)
2053 self.assertGreaterEqual(result[0], 0)
2054 self.assertLessEqual(result[0], bufsize)
2055 return (bytes(buf[:result[0]]),) + result[1:]
2056
2057
2058class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2059 # Defines flags to be checked in msg_flags for datagram sockets.
2060
2061 @property
2062 def msg_flags_non_eor_indicator(self):
2063 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2064
2065
2066class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2067 # Defines flags to be checked in msg_flags for SCTP sockets.
2068
2069 @property
2070 def msg_flags_eor_indicator(self):
2071 return super().msg_flags_eor_indicator | socket.MSG_EOR
2072
2073
2074class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2075 # Base class for tests on connectionless-mode sockets. Users must
2076 # supply sockets on attributes cli and serv to be mapped to
2077 # cli_sock and serv_sock respectively.
2078
2079 @property
2080 def serv_sock(self):
2081 return self.serv
2082
2083 @property
2084 def cli_sock(self):
2085 return self.cli
2086
2087 @property
2088 def sendmsg_to_server_defaults(self):
2089 return ([], [], 0, self.serv_addr)
2090
2091 def sendToServer(self, msg):
2092 return self.cli_sock.sendto(msg, self.serv_addr)
2093
2094
2095class SendrecvmsgConnectedBase(SendrecvmsgBase):
2096 # Base class for tests on connected sockets. Users must supply
2097 # sockets on attributes serv_conn and cli_conn (representing the
2098 # connections *to* the server and the client), to be mapped to
2099 # cli_sock and serv_sock respectively.
2100
2101 @property
2102 def serv_sock(self):
2103 return self.cli_conn
2104
2105 @property
2106 def cli_sock(self):
2107 return self.serv_conn
2108
2109 def checkRecvmsgAddress(self, addr1, addr2):
2110 # Address is currently "unspecified" for a connected socket,
2111 # so we don't examine it
2112 pass
2113
2114
2115class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2116 # Base class to set a timeout on server's socket.
2117
2118 def setUp(self):
2119 super().setUp()
2120 self.serv_sock.settimeout(self.fail_timeout)
2121
2122
2123class SendmsgTests(SendrecvmsgServerTimeoutBase):
2124 # Tests for sendmsg() which can use any socket type and do not
2125 # involve recvmsg() or recvmsg_into().
2126
2127 def testSendmsg(self):
2128 # Send a simple message with sendmsg().
2129 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2130
2131 def _testSendmsg(self):
2132 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2133
2134 def testSendmsgDataGenerator(self):
2135 # Send from buffer obtained from a generator (not a sequence).
2136 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2137
2138 def _testSendmsgDataGenerator(self):
2139 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2140 len(MSG))
2141
2142 def testSendmsgAncillaryGenerator(self):
2143 # Gather (empty) ancillary data from a generator.
2144 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2145
2146 def _testSendmsgAncillaryGenerator(self):
2147 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2148 len(MSG))
2149
2150 def testSendmsgArray(self):
2151 # Send data from an array instead of the usual bytes object.
2152 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2153
2154 def _testSendmsgArray(self):
2155 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2156 len(MSG))
2157
2158 def testSendmsgGather(self):
2159 # Send message data from more than one buffer (gather write).
2160 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2161
2162 def _testSendmsgGather(self):
2163 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2164
2165 def testSendmsgBadArgs(self):
2166 # Check that sendmsg() rejects invalid arguments.
2167 self.assertEqual(self.serv_sock.recv(1000), b"done")
2168
2169 def _testSendmsgBadArgs(self):
2170 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2171 self.assertRaises(TypeError, self.sendmsgToServer,
2172 b"not in an iterable")
2173 self.assertRaises(TypeError, self.sendmsgToServer,
2174 object())
2175 self.assertRaises(TypeError, self.sendmsgToServer,
2176 [object()])
2177 self.assertRaises(TypeError, self.sendmsgToServer,
2178 [MSG, object()])
2179 self.assertRaises(TypeError, self.sendmsgToServer,
2180 [MSG], object())
2181 self.assertRaises(TypeError, self.sendmsgToServer,
2182 [MSG], [], object())
2183 self.assertRaises(TypeError, self.sendmsgToServer,
2184 [MSG], [], 0, object())
2185 self.sendToServer(b"done")
2186
2187 def testSendmsgBadCmsg(self):
2188 # Check that invalid ancillary data items are rejected.
2189 self.assertEqual(self.serv_sock.recv(1000), b"done")
2190
2191 def _testSendmsgBadCmsg(self):
2192 self.assertRaises(TypeError, self.sendmsgToServer,
2193 [MSG], [object()])
2194 self.assertRaises(TypeError, self.sendmsgToServer,
2195 [MSG], [(object(), 0, b"data")])
2196 self.assertRaises(TypeError, self.sendmsgToServer,
2197 [MSG], [(0, object(), b"data")])
2198 self.assertRaises(TypeError, self.sendmsgToServer,
2199 [MSG], [(0, 0, object())])
2200 self.assertRaises(TypeError, self.sendmsgToServer,
2201 [MSG], [(0, 0)])
2202 self.assertRaises(TypeError, self.sendmsgToServer,
2203 [MSG], [(0, 0, b"data", 42)])
2204 self.sendToServer(b"done")
2205
2206 @requireAttrs(socket, "CMSG_SPACE")
2207 def testSendmsgBadMultiCmsg(self):
2208 # Check that invalid ancillary data items are rejected when
2209 # more than one item is present.
2210 self.assertEqual(self.serv_sock.recv(1000), b"done")
2211
2212 @testSendmsgBadMultiCmsg.client_skip
2213 def _testSendmsgBadMultiCmsg(self):
2214 self.assertRaises(TypeError, self.sendmsgToServer,
2215 [MSG], [0, 0, b""])
2216 self.assertRaises(TypeError, self.sendmsgToServer,
2217 [MSG], [(0, 0, b""), object()])
2218 self.sendToServer(b"done")
2219
2220 def testSendmsgExcessCmsgReject(self):
2221 # Check that sendmsg() rejects excess ancillary data items
2222 # when the number that can be sent is limited.
2223 self.assertEqual(self.serv_sock.recv(1000), b"done")
2224
2225 def _testSendmsgExcessCmsgReject(self):
2226 if not hasattr(socket, "CMSG_SPACE"):
2227 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002228 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002229 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2230 self.assertIsNone(cm.exception.errno)
2231 self.sendToServer(b"done")
2232
2233 def testSendmsgAfterClose(self):
2234 # Check that sendmsg() fails on a closed socket.
2235 pass
2236
2237 def _testSendmsgAfterClose(self):
2238 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002239 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002240
2241
2242class SendmsgStreamTests(SendmsgTests):
2243 # Tests for sendmsg() which require a stream socket and do not
2244 # involve recvmsg() or recvmsg_into().
2245
2246 def testSendmsgExplicitNoneAddr(self):
2247 # Check that peer address can be specified as None.
2248 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2249
2250 def _testSendmsgExplicitNoneAddr(self):
2251 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2252
2253 def testSendmsgTimeout(self):
2254 # Check that timeout works with sendmsg().
2255 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2256 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2257
2258 def _testSendmsgTimeout(self):
2259 try:
2260 self.cli_sock.settimeout(0.03)
2261 with self.assertRaises(socket.timeout):
2262 while True:
2263 self.sendmsgToServer([b"a"*512])
2264 finally:
2265 self.misc_event.set()
2266
2267 # XXX: would be nice to have more tests for sendmsg flags argument.
2268
2269 # Linux supports MSG_DONTWAIT when sending, but in general, it
2270 # only works when receiving. Could add other platforms if they
2271 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002272 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002273 "MSG_DONTWAIT not known to work on this platform when "
2274 "sending")
2275 def testSendmsgDontWait(self):
2276 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2277 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2278 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2279
2280 @testSendmsgDontWait.client_skip
2281 def _testSendmsgDontWait(self):
2282 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002283 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002284 while True:
2285 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2286 self.assertIn(cm.exception.errno,
2287 (errno.EAGAIN, errno.EWOULDBLOCK))
2288 finally:
2289 self.misc_event.set()
2290
2291
2292class SendmsgConnectionlessTests(SendmsgTests):
2293 # Tests for sendmsg() which require a connectionless-mode
2294 # (e.g. datagram) socket, and do not involve recvmsg() or
2295 # recvmsg_into().
2296
2297 def testSendmsgNoDestAddr(self):
2298 # Check that sendmsg() fails when no destination address is
2299 # given for unconnected socket.
2300 pass
2301
2302 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002303 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002304 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002305 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002306 [MSG], [], 0, None)
2307
2308
2309class RecvmsgGenericTests(SendrecvmsgBase):
2310 # Tests for recvmsg() which can also be emulated using
2311 # recvmsg_into(), and can use any socket type.
2312
2313 def testRecvmsg(self):
2314 # Receive a simple message with recvmsg[_into]().
2315 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2316 self.assertEqual(msg, MSG)
2317 self.checkRecvmsgAddress(addr, self.cli_addr)
2318 self.assertEqual(ancdata, [])
2319 self.checkFlags(flags, eor=True)
2320
2321 def _testRecvmsg(self):
2322 self.sendToServer(MSG)
2323
2324 def testRecvmsgExplicitDefaults(self):
2325 # Test recvmsg[_into]() with default arguments provided explicitly.
2326 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2327 len(MSG), 0, 0)
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 _testRecvmsgExplicitDefaults(self):
2334 self.sendToServer(MSG)
2335
2336 def testRecvmsgShorter(self):
2337 # Receive a message smaller than buffer.
2338 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2339 len(MSG) + 42)
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 _testRecvmsgShorter(self):
2346 self.sendToServer(MSG)
2347
Charles-François Natali8619cd72011-10-03 19:43:15 +02002348 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2349 # datagram is received (issue #13001).
2350 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002351 def testRecvmsgTrunc(self):
2352 # Receive part of message, check for truncation indicators.
2353 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2354 len(MSG) - 3)
2355 self.assertEqual(msg, MSG[:-3])
2356 self.checkRecvmsgAddress(addr, self.cli_addr)
2357 self.assertEqual(ancdata, [])
2358 self.checkFlags(flags, eor=False)
2359
Charles-François Natali8619cd72011-10-03 19:43:15 +02002360 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002361 def _testRecvmsgTrunc(self):
2362 self.sendToServer(MSG)
2363
2364 def testRecvmsgShortAncillaryBuf(self):
2365 # Test ancillary data buffer too small to hold any ancillary data.
2366 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2367 len(MSG), 1)
2368 self.assertEqual(msg, MSG)
2369 self.checkRecvmsgAddress(addr, self.cli_addr)
2370 self.assertEqual(ancdata, [])
2371 self.checkFlags(flags, eor=True)
2372
2373 def _testRecvmsgShortAncillaryBuf(self):
2374 self.sendToServer(MSG)
2375
2376 def testRecvmsgLongAncillaryBuf(self):
2377 # Test large ancillary data buffer.
2378 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2379 len(MSG), 10240)
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 _testRecvmsgLongAncillaryBuf(self):
2386 self.sendToServer(MSG)
2387
2388 def testRecvmsgAfterClose(self):
2389 # Check that recvmsg[_into]() fails on a closed socket.
2390 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002391 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002392
2393 def _testRecvmsgAfterClose(self):
2394 pass
2395
2396 def testRecvmsgTimeout(self):
2397 # Check that timeout works.
2398 try:
2399 self.serv_sock.settimeout(0.03)
2400 self.assertRaises(socket.timeout,
2401 self.doRecvmsg, self.serv_sock, len(MSG))
2402 finally:
2403 self.misc_event.set()
2404
2405 def _testRecvmsgTimeout(self):
2406 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2407
2408 @requireAttrs(socket, "MSG_PEEK")
2409 def testRecvmsgPeek(self):
2410 # Check that MSG_PEEK in flags enables examination of pending
2411 # data without consuming it.
2412
2413 # Receive part of data with MSG_PEEK.
2414 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2415 len(MSG) - 3, 0,
2416 socket.MSG_PEEK)
2417 self.assertEqual(msg, MSG[:-3])
2418 self.checkRecvmsgAddress(addr, self.cli_addr)
2419 self.assertEqual(ancdata, [])
2420 # Ignoring MSG_TRUNC here (so this test is the same for stream
2421 # and datagram sockets). Some wording in POSIX seems to
2422 # suggest that it needn't be set when peeking, but that may
2423 # just be a slip.
2424 self.checkFlags(flags, eor=False,
2425 ignore=getattr(socket, "MSG_TRUNC", 0))
2426
2427 # Receive all data with MSG_PEEK.
2428 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2429 len(MSG), 0,
2430 socket.MSG_PEEK)
2431 self.assertEqual(msg, MSG)
2432 self.checkRecvmsgAddress(addr, self.cli_addr)
2433 self.assertEqual(ancdata, [])
2434 self.checkFlags(flags, eor=True)
2435
2436 # Check that the same data can still be received normally.
2437 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2438 self.assertEqual(msg, MSG)
2439 self.checkRecvmsgAddress(addr, self.cli_addr)
2440 self.assertEqual(ancdata, [])
2441 self.checkFlags(flags, eor=True)
2442
2443 @testRecvmsgPeek.client_skip
2444 def _testRecvmsgPeek(self):
2445 self.sendToServer(MSG)
2446
2447 @requireAttrs(socket.socket, "sendmsg")
2448 def testRecvmsgFromSendmsg(self):
2449 # Test receiving with recvmsg[_into]() when message is sent
2450 # using sendmsg().
2451 self.serv_sock.settimeout(self.fail_timeout)
2452 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2453 self.assertEqual(msg, MSG)
2454 self.checkRecvmsgAddress(addr, self.cli_addr)
2455 self.assertEqual(ancdata, [])
2456 self.checkFlags(flags, eor=True)
2457
2458 @testRecvmsgFromSendmsg.client_skip
2459 def _testRecvmsgFromSendmsg(self):
2460 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2461
2462
2463class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2464 # Tests which require a stream socket and can use either recvmsg()
2465 # or recvmsg_into().
2466
2467 def testRecvmsgEOF(self):
2468 # Receive end-of-stream indicator (b"", peer socket closed).
2469 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2470 self.assertEqual(msg, b"")
2471 self.checkRecvmsgAddress(addr, self.cli_addr)
2472 self.assertEqual(ancdata, [])
2473 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2474
2475 def _testRecvmsgEOF(self):
2476 self.cli_sock.close()
2477
2478 def testRecvmsgOverflow(self):
2479 # Receive a message in more than one chunk.
2480 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2481 len(MSG) - 3)
2482 self.checkRecvmsgAddress(addr, self.cli_addr)
2483 self.assertEqual(ancdata, [])
2484 self.checkFlags(flags, eor=False)
2485
2486 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2487 self.checkRecvmsgAddress(addr, self.cli_addr)
2488 self.assertEqual(ancdata, [])
2489 self.checkFlags(flags, eor=True)
2490
2491 msg = seg1 + seg2
2492 self.assertEqual(msg, MSG)
2493
2494 def _testRecvmsgOverflow(self):
2495 self.sendToServer(MSG)
2496
2497
2498class RecvmsgTests(RecvmsgGenericTests):
2499 # Tests for recvmsg() which can use any socket type.
2500
2501 def testRecvmsgBadArgs(self):
2502 # Check that recvmsg() rejects invalid arguments.
2503 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2504 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2505 -1, 0, 0)
2506 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2507 len(MSG), -1, 0)
2508 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2509 [bytearray(10)], 0, 0)
2510 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2511 object(), 0, 0)
2512 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2513 len(MSG), object(), 0)
2514 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2515 len(MSG), 0, object())
2516
2517 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2518 self.assertEqual(msg, MSG)
2519 self.checkRecvmsgAddress(addr, self.cli_addr)
2520 self.assertEqual(ancdata, [])
2521 self.checkFlags(flags, eor=True)
2522
2523 def _testRecvmsgBadArgs(self):
2524 self.sendToServer(MSG)
2525
2526
2527class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2528 # Tests for recvmsg_into() which can use any socket type.
2529
2530 def testRecvmsgIntoBadArgs(self):
2531 # Check that recvmsg_into() rejects invalid arguments.
2532 buf = bytearray(len(MSG))
2533 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2534 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2535 len(MSG), 0, 0)
2536 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2537 buf, 0, 0)
2538 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2539 [object()], 0, 0)
2540 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2541 [b"I'm not writable"], 0, 0)
2542 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2543 [buf, object()], 0, 0)
2544 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2545 [buf], -1, 0)
2546 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2547 [buf], object(), 0)
2548 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2549 [buf], 0, object())
2550
2551 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2552 self.assertEqual(nbytes, len(MSG))
2553 self.assertEqual(buf, bytearray(MSG))
2554 self.checkRecvmsgAddress(addr, self.cli_addr)
2555 self.assertEqual(ancdata, [])
2556 self.checkFlags(flags, eor=True)
2557
2558 def _testRecvmsgIntoBadArgs(self):
2559 self.sendToServer(MSG)
2560
2561 def testRecvmsgIntoGenerator(self):
2562 # Receive into buffer obtained from a generator (not a sequence).
2563 buf = bytearray(len(MSG))
2564 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2565 (o for o in [buf]))
2566 self.assertEqual(nbytes, len(MSG))
2567 self.assertEqual(buf, bytearray(MSG))
2568 self.checkRecvmsgAddress(addr, self.cli_addr)
2569 self.assertEqual(ancdata, [])
2570 self.checkFlags(flags, eor=True)
2571
2572 def _testRecvmsgIntoGenerator(self):
2573 self.sendToServer(MSG)
2574
2575 def testRecvmsgIntoArray(self):
2576 # Receive into an array rather than the usual bytearray.
2577 buf = array.array("B", [0] * len(MSG))
2578 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2579 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002580 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002581 self.checkRecvmsgAddress(addr, self.cli_addr)
2582 self.assertEqual(ancdata, [])
2583 self.checkFlags(flags, eor=True)
2584
2585 def _testRecvmsgIntoArray(self):
2586 self.sendToServer(MSG)
2587
2588 def testRecvmsgIntoScatter(self):
2589 # Receive into multiple buffers (scatter write).
2590 b1 = bytearray(b"----")
2591 b2 = bytearray(b"0123456789")
2592 b3 = bytearray(b"--------------")
2593 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2594 [b1, memoryview(b2)[2:9], b3])
2595 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2596 self.assertEqual(b1, bytearray(b"Mary"))
2597 self.assertEqual(b2, bytearray(b"01 had a 9"))
2598 self.assertEqual(b3, bytearray(b"little lamb---"))
2599 self.checkRecvmsgAddress(addr, self.cli_addr)
2600 self.assertEqual(ancdata, [])
2601 self.checkFlags(flags, eor=True)
2602
2603 def _testRecvmsgIntoScatter(self):
2604 self.sendToServer(b"Mary had a little lamb")
2605
2606
2607class CmsgMacroTests(unittest.TestCase):
2608 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2609 # assumptions used by sendmsg() and recvmsg[_into](), which share
2610 # code with these functions.
2611
2612 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002613 try:
2614 import _testcapi
2615 except ImportError:
2616 socklen_t_limit = 0x7fffffff
2617 else:
2618 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002619
2620 @requireAttrs(socket, "CMSG_LEN")
2621 def testCMSG_LEN(self):
2622 # Test CMSG_LEN() with various valid and invalid values,
2623 # checking the assumptions used by recvmsg() and sendmsg().
2624 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2625 values = list(range(257)) + list(range(toobig - 257, toobig))
2626
2627 # struct cmsghdr has at least three members, two of which are ints
2628 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2629 for n in values:
2630 ret = socket.CMSG_LEN(n)
2631 # This is how recvmsg() calculates the data size
2632 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2633 self.assertLessEqual(ret, self.socklen_t_limit)
2634
2635 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2636 # sendmsg() shares code with these functions, and requires
2637 # that it reject values over the limit.
2638 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2639 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2640
2641 @requireAttrs(socket, "CMSG_SPACE")
2642 def testCMSG_SPACE(self):
2643 # Test CMSG_SPACE() with various valid and invalid values,
2644 # checking the assumptions used by sendmsg().
2645 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2646 values = list(range(257)) + list(range(toobig - 257, toobig))
2647
2648 last = socket.CMSG_SPACE(0)
2649 # struct cmsghdr has at least three members, two of which are ints
2650 self.assertGreater(last, array.array("i").itemsize * 2)
2651 for n in values:
2652 ret = socket.CMSG_SPACE(n)
2653 self.assertGreaterEqual(ret, last)
2654 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2655 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2656 self.assertLessEqual(ret, self.socklen_t_limit)
2657 last = ret
2658
2659 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2660 # sendmsg() shares code with these functions, and requires
2661 # that it reject values over the limit.
2662 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2663 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2664
2665
2666class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2667 # Tests for file descriptor passing on Unix-domain sockets.
2668
2669 # Invalid file descriptor value that's unlikely to evaluate to a
2670 # real FD even if one of its bytes is replaced with a different
2671 # value (which shouldn't actually happen).
2672 badfd = -0x5555
2673
2674 def newFDs(self, n):
2675 # Return a list of n file descriptors for newly-created files
2676 # containing their list indices as ASCII numbers.
2677 fds = []
2678 for i in range(n):
2679 fd, path = tempfile.mkstemp()
2680 self.addCleanup(os.unlink, path)
2681 self.addCleanup(os.close, fd)
2682 os.write(fd, str(i).encode())
2683 fds.append(fd)
2684 return fds
2685
2686 def checkFDs(self, fds):
2687 # Check that the file descriptors in the given list contain
2688 # their correct list indices as ASCII numbers.
2689 for n, fd in enumerate(fds):
2690 os.lseek(fd, 0, os.SEEK_SET)
2691 self.assertEqual(os.read(fd, 1024), str(n).encode())
2692
2693 def registerRecvmsgResult(self, result):
2694 self.addCleanup(self.closeRecvmsgFDs, result)
2695
2696 def closeRecvmsgFDs(self, recvmsg_result):
2697 # Close all file descriptors specified in the ancillary data
2698 # of the given return value from recvmsg() or recvmsg_into().
2699 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2700 if (cmsg_level == socket.SOL_SOCKET and
2701 cmsg_type == socket.SCM_RIGHTS):
2702 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002703 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002704 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2705 for fd in fds:
2706 os.close(fd)
2707
2708 def createAndSendFDs(self, n):
2709 # Send n new file descriptors created by newFDs() to the
2710 # server, with the constant MSG as the non-ancillary data.
2711 self.assertEqual(
2712 self.sendmsgToServer([MSG],
2713 [(socket.SOL_SOCKET,
2714 socket.SCM_RIGHTS,
2715 array.array("i", self.newFDs(n)))]),
2716 len(MSG))
2717
2718 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2719 # Check that constant MSG was received with numfds file
2720 # descriptors in a maximum of maxcmsgs control messages (which
2721 # must contain only complete integers). By default, check
2722 # that MSG_CTRUNC is unset, but ignore any flags in
2723 # ignoreflags.
2724 msg, ancdata, flags, addr = result
2725 self.assertEqual(msg, MSG)
2726 self.checkRecvmsgAddress(addr, self.cli_addr)
2727 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2728 ignore=ignoreflags)
2729
2730 self.assertIsInstance(ancdata, list)
2731 self.assertLessEqual(len(ancdata), maxcmsgs)
2732 fds = array.array("i")
2733 for item in ancdata:
2734 self.assertIsInstance(item, tuple)
2735 cmsg_level, cmsg_type, cmsg_data = item
2736 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2737 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2738 self.assertIsInstance(cmsg_data, bytes)
2739 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002740 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002741
2742 self.assertEqual(len(fds), numfds)
2743 self.checkFDs(fds)
2744
2745 def testFDPassSimple(self):
2746 # Pass a single FD (array read from bytes object).
2747 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2748 len(MSG), 10240))
2749
2750 def _testFDPassSimple(self):
2751 self.assertEqual(
2752 self.sendmsgToServer(
2753 [MSG],
2754 [(socket.SOL_SOCKET,
2755 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002756 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002757 len(MSG))
2758
2759 def testMultipleFDPass(self):
2760 # Pass multiple FDs in a single array.
2761 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2762 len(MSG), 10240))
2763
2764 def _testMultipleFDPass(self):
2765 self.createAndSendFDs(4)
2766
2767 @requireAttrs(socket, "CMSG_SPACE")
2768 def testFDPassCMSG_SPACE(self):
2769 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2770 self.checkRecvmsgFDs(
2771 4, self.doRecvmsg(self.serv_sock, len(MSG),
2772 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2773
2774 @testFDPassCMSG_SPACE.client_skip
2775 def _testFDPassCMSG_SPACE(self):
2776 self.createAndSendFDs(4)
2777
2778 def testFDPassCMSG_LEN(self):
2779 # Test using CMSG_LEN() to calculate ancillary buffer size.
2780 self.checkRecvmsgFDs(1,
2781 self.doRecvmsg(self.serv_sock, len(MSG),
2782 socket.CMSG_LEN(4 * SIZEOF_INT)),
2783 # RFC 3542 says implementations may set
2784 # MSG_CTRUNC if there isn't enough space
2785 # for trailing padding.
2786 ignoreflags=socket.MSG_CTRUNC)
2787
2788 def _testFDPassCMSG_LEN(self):
2789 self.createAndSendFDs(1)
2790
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002791 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002792 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002793 @requireAttrs(socket, "CMSG_SPACE")
2794 def testFDPassSeparate(self):
2795 # Pass two FDs in two separate arrays. Arrays may be combined
2796 # into a single control message by the OS.
2797 self.checkRecvmsgFDs(2,
2798 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2799 maxcmsgs=2)
2800
2801 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002802 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002803 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002804 def _testFDPassSeparate(self):
2805 fd0, fd1 = self.newFDs(2)
2806 self.assertEqual(
2807 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2808 socket.SCM_RIGHTS,
2809 array.array("i", [fd0])),
2810 (socket.SOL_SOCKET,
2811 socket.SCM_RIGHTS,
2812 array.array("i", [fd1]))]),
2813 len(MSG))
2814
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002815 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002816 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002817 @requireAttrs(socket, "CMSG_SPACE")
2818 def testFDPassSeparateMinSpace(self):
2819 # Pass two FDs in two separate arrays, receiving them into the
2820 # minimum space for two arrays.
2821 self.checkRecvmsgFDs(2,
2822 self.doRecvmsg(self.serv_sock, len(MSG),
2823 socket.CMSG_SPACE(SIZEOF_INT) +
2824 socket.CMSG_LEN(SIZEOF_INT)),
2825 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2826
2827 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002828 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002829 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002830 def _testFDPassSeparateMinSpace(self):
2831 fd0, fd1 = self.newFDs(2)
2832 self.assertEqual(
2833 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2834 socket.SCM_RIGHTS,
2835 array.array("i", [fd0])),
2836 (socket.SOL_SOCKET,
2837 socket.SCM_RIGHTS,
2838 array.array("i", [fd1]))]),
2839 len(MSG))
2840
2841 def sendAncillaryIfPossible(self, msg, ancdata):
2842 # Try to send msg and ancdata to server, but if the system
2843 # call fails, just send msg with no ancillary data.
2844 try:
2845 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002846 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002847 # Check that it was the system call that failed
2848 self.assertIsInstance(e.errno, int)
2849 nbytes = self.sendmsgToServer([msg])
2850 self.assertEqual(nbytes, len(msg))
2851
Brett Cannon3bbad122015-12-28 17:21:44 -08002852 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002853 def testFDPassEmpty(self):
2854 # Try to pass an empty FD array. Can receive either no array
2855 # or an empty array.
2856 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2857 len(MSG), 10240),
2858 ignoreflags=socket.MSG_CTRUNC)
2859
2860 def _testFDPassEmpty(self):
2861 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2862 socket.SCM_RIGHTS,
2863 b"")])
2864
2865 def testFDPassPartialInt(self):
2866 # Try to pass a truncated FD array.
2867 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2868 len(MSG), 10240)
2869 self.assertEqual(msg, MSG)
2870 self.checkRecvmsgAddress(addr, self.cli_addr)
2871 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2872 self.assertLessEqual(len(ancdata), 1)
2873 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2874 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2875 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2876 self.assertLess(len(cmsg_data), SIZEOF_INT)
2877
2878 def _testFDPassPartialInt(self):
2879 self.sendAncillaryIfPossible(
2880 MSG,
2881 [(socket.SOL_SOCKET,
2882 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002883 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002884
2885 @requireAttrs(socket, "CMSG_SPACE")
2886 def testFDPassPartialIntInMiddle(self):
2887 # Try to pass two FD arrays, the first of which is truncated.
2888 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2889 len(MSG), 10240)
2890 self.assertEqual(msg, MSG)
2891 self.checkRecvmsgAddress(addr, self.cli_addr)
2892 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2893 self.assertLessEqual(len(ancdata), 2)
2894 fds = array.array("i")
2895 # Arrays may have been combined in a single control message
2896 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2897 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2898 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002899 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002900 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2901 self.assertLessEqual(len(fds), 2)
2902 self.checkFDs(fds)
2903
2904 @testFDPassPartialIntInMiddle.client_skip
2905 def _testFDPassPartialIntInMiddle(self):
2906 fd0, fd1 = self.newFDs(2)
2907 self.sendAncillaryIfPossible(
2908 MSG,
2909 [(socket.SOL_SOCKET,
2910 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002911 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002912 (socket.SOL_SOCKET,
2913 socket.SCM_RIGHTS,
2914 array.array("i", [fd1]))])
2915
2916 def checkTruncatedHeader(self, result, ignoreflags=0):
2917 # Check that no ancillary data items are returned when data is
2918 # truncated inside the cmsghdr structure.
2919 msg, ancdata, flags, addr = result
2920 self.assertEqual(msg, MSG)
2921 self.checkRecvmsgAddress(addr, self.cli_addr)
2922 self.assertEqual(ancdata, [])
2923 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2924 ignore=ignoreflags)
2925
2926 def testCmsgTruncNoBufSize(self):
2927 # Check that no ancillary data is received when no buffer size
2928 # is specified.
2929 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2930 # BSD seems to set MSG_CTRUNC only
2931 # if an item has been partially
2932 # received.
2933 ignoreflags=socket.MSG_CTRUNC)
2934
2935 def _testCmsgTruncNoBufSize(self):
2936 self.createAndSendFDs(1)
2937
2938 def testCmsgTrunc0(self):
2939 # Check that no ancillary data is received when buffer size is 0.
2940 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2941 ignoreflags=socket.MSG_CTRUNC)
2942
2943 def _testCmsgTrunc0(self):
2944 self.createAndSendFDs(1)
2945
2946 # Check that no ancillary data is returned for various non-zero
2947 # (but still too small) buffer sizes.
2948
2949 def testCmsgTrunc1(self):
2950 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2951
2952 def _testCmsgTrunc1(self):
2953 self.createAndSendFDs(1)
2954
2955 def testCmsgTrunc2Int(self):
2956 # The cmsghdr structure has at least three members, two of
2957 # which are ints, so we still shouldn't see any ancillary
2958 # data.
2959 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2960 SIZEOF_INT * 2))
2961
2962 def _testCmsgTrunc2Int(self):
2963 self.createAndSendFDs(1)
2964
2965 def testCmsgTruncLen0Minus1(self):
2966 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2967 socket.CMSG_LEN(0) - 1))
2968
2969 def _testCmsgTruncLen0Minus1(self):
2970 self.createAndSendFDs(1)
2971
2972 # The following tests try to truncate the control message in the
2973 # middle of the FD array.
2974
2975 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2976 # Check that file descriptor data is truncated to between
2977 # mindata and maxdata bytes when received with buffer size
2978 # ancbuf, and that any complete file descriptor numbers are
2979 # valid.
2980 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2981 len(MSG), ancbuf)
2982 self.assertEqual(msg, MSG)
2983 self.checkRecvmsgAddress(addr, self.cli_addr)
2984 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2985
2986 if mindata == 0 and ancdata == []:
2987 return
2988 self.assertEqual(len(ancdata), 1)
2989 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2990 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2991 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2992 self.assertGreaterEqual(len(cmsg_data), mindata)
2993 self.assertLessEqual(len(cmsg_data), maxdata)
2994 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002995 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002996 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2997 self.checkFDs(fds)
2998
2999 def testCmsgTruncLen0(self):
3000 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3001
3002 def _testCmsgTruncLen0(self):
3003 self.createAndSendFDs(1)
3004
3005 def testCmsgTruncLen0Plus1(self):
3006 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3007
3008 def _testCmsgTruncLen0Plus1(self):
3009 self.createAndSendFDs(2)
3010
3011 def testCmsgTruncLen1(self):
3012 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3013 maxdata=SIZEOF_INT)
3014
3015 def _testCmsgTruncLen1(self):
3016 self.createAndSendFDs(2)
3017
3018 def testCmsgTruncLen2Minus1(self):
3019 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3020 maxdata=(2 * SIZEOF_INT) - 1)
3021
3022 def _testCmsgTruncLen2Minus1(self):
3023 self.createAndSendFDs(2)
3024
3025
3026class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3027 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3028 # features of the RFC 3542 Advanced Sockets API for IPv6.
3029 # Currently we can only handle certain data items (e.g. traffic
3030 # class, hop limit, MTU discovery and fragmentation settings)
3031 # without resorting to unportable means such as the struct module,
3032 # but the tests here are aimed at testing the ancillary data
3033 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3034 # itself.
3035
3036 # Test value to use when setting hop limit of packet
3037 hop_limit = 2
3038
3039 # Test value to use when setting traffic class of packet.
3040 # -1 means "use kernel default".
3041 traffic_class = -1
3042
3043 def ancillaryMapping(self, ancdata):
3044 # Given ancillary data list ancdata, return a mapping from
3045 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3046 # Check that no (level, type) pair appears more than once.
3047 d = {}
3048 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3049 self.assertNotIn((cmsg_level, cmsg_type), d)
3050 d[(cmsg_level, cmsg_type)] = cmsg_data
3051 return d
3052
3053 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3054 # Receive hop limit into ancbufsize bytes of ancillary data
3055 # space. Check that data is MSG, ancillary data is not
3056 # truncated (but ignore any flags in ignoreflags), and hop
3057 # limit is between 0 and maxhop inclusive.
3058 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3059 socket.IPV6_RECVHOPLIMIT, 1)
3060 self.misc_event.set()
3061 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3062 len(MSG), ancbufsize)
3063
3064 self.assertEqual(msg, MSG)
3065 self.checkRecvmsgAddress(addr, self.cli_addr)
3066 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3067 ignore=ignoreflags)
3068
3069 self.assertEqual(len(ancdata), 1)
3070 self.assertIsInstance(ancdata[0], tuple)
3071 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3072 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3073 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3074 self.assertIsInstance(cmsg_data, bytes)
3075 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3076 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003077 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003078 self.assertGreaterEqual(a[0], 0)
3079 self.assertLessEqual(a[0], maxhop)
3080
3081 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3082 def testRecvHopLimit(self):
3083 # Test receiving the packet hop limit as ancillary data.
3084 self.checkHopLimit(ancbufsize=10240)
3085
3086 @testRecvHopLimit.client_skip
3087 def _testRecvHopLimit(self):
3088 # Need to wait until server has asked to receive ancillary
3089 # data, as implementations are not required to buffer it
3090 # otherwise.
3091 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3092 self.sendToServer(MSG)
3093
3094 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3095 def testRecvHopLimitCMSG_SPACE(self):
3096 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3097 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3098
3099 @testRecvHopLimitCMSG_SPACE.client_skip
3100 def _testRecvHopLimitCMSG_SPACE(self):
3101 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3102 self.sendToServer(MSG)
3103
3104 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3105 # 3542 says portable applications must provide space for trailing
3106 # padding. Implementations may set MSG_CTRUNC if there isn't
3107 # enough space for the padding.
3108
3109 @requireAttrs(socket.socket, "sendmsg")
3110 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3111 def testSetHopLimit(self):
3112 # Test setting hop limit on outgoing packet and receiving it
3113 # at the other end.
3114 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3115
3116 @testSetHopLimit.client_skip
3117 def _testSetHopLimit(self):
3118 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3119 self.assertEqual(
3120 self.sendmsgToServer([MSG],
3121 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3122 array.array("i", [self.hop_limit]))]),
3123 len(MSG))
3124
3125 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3126 ignoreflags=0):
3127 # Receive traffic class and hop limit into ancbufsize bytes of
3128 # ancillary data space. Check that data is MSG, ancillary
3129 # data is not truncated (but ignore any flags in ignoreflags),
3130 # and traffic class and hop limit are in range (hop limit no
3131 # more than maxhop).
3132 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3133 socket.IPV6_RECVHOPLIMIT, 1)
3134 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3135 socket.IPV6_RECVTCLASS, 1)
3136 self.misc_event.set()
3137 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3138 len(MSG), ancbufsize)
3139
3140 self.assertEqual(msg, MSG)
3141 self.checkRecvmsgAddress(addr, self.cli_addr)
3142 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3143 ignore=ignoreflags)
3144 self.assertEqual(len(ancdata), 2)
3145 ancmap = self.ancillaryMapping(ancdata)
3146
3147 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3148 self.assertEqual(len(tcdata), SIZEOF_INT)
3149 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003150 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003151 self.assertGreaterEqual(a[0], 0)
3152 self.assertLessEqual(a[0], 255)
3153
3154 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3155 self.assertEqual(len(hldata), SIZEOF_INT)
3156 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003157 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003158 self.assertGreaterEqual(a[0], 0)
3159 self.assertLessEqual(a[0], maxhop)
3160
3161 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3162 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3163 def testRecvTrafficClassAndHopLimit(self):
3164 # Test receiving traffic class and hop limit as ancillary data.
3165 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3166
3167 @testRecvTrafficClassAndHopLimit.client_skip
3168 def _testRecvTrafficClassAndHopLimit(self):
3169 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3170 self.sendToServer(MSG)
3171
3172 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3173 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3174 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3175 # Test receiving traffic class and hop limit, using
3176 # CMSG_SPACE() to calculate buffer size.
3177 self.checkTrafficClassAndHopLimit(
3178 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3179
3180 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3181 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3182 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3183 self.sendToServer(MSG)
3184
3185 @requireAttrs(socket.socket, "sendmsg")
3186 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3187 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3188 def testSetTrafficClassAndHopLimit(self):
3189 # Test setting traffic class and hop limit on outgoing packet,
3190 # and receiving them at the other end.
3191 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3192 maxhop=self.hop_limit)
3193
3194 @testSetTrafficClassAndHopLimit.client_skip
3195 def _testSetTrafficClassAndHopLimit(self):
3196 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3197 self.assertEqual(
3198 self.sendmsgToServer([MSG],
3199 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3200 array.array("i", [self.traffic_class])),
3201 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3202 array.array("i", [self.hop_limit]))]),
3203 len(MSG))
3204
3205 @requireAttrs(socket.socket, "sendmsg")
3206 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3207 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3208 def testOddCmsgSize(self):
3209 # Try to send ancillary data with first item one byte too
3210 # long. Fall back to sending with correct size if this fails,
3211 # and check that second item was handled correctly.
3212 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3213 maxhop=self.hop_limit)
3214
3215 @testOddCmsgSize.client_skip
3216 def _testOddCmsgSize(self):
3217 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3218 try:
3219 nbytes = self.sendmsgToServer(
3220 [MSG],
3221 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003222 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003223 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3224 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003225 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003226 self.assertIsInstance(e.errno, int)
3227 nbytes = self.sendmsgToServer(
3228 [MSG],
3229 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3230 array.array("i", [self.traffic_class])),
3231 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3232 array.array("i", [self.hop_limit]))])
3233 self.assertEqual(nbytes, len(MSG))
3234
3235 # Tests for proper handling of truncated ancillary data
3236
3237 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3238 # Receive hop limit into ancbufsize bytes of ancillary data
3239 # space, which should be too small to contain the ancillary
3240 # data header (if ancbufsize is None, pass no second argument
3241 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3242 # (unless included in ignoreflags), and no ancillary data is
3243 # returned.
3244 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3245 socket.IPV6_RECVHOPLIMIT, 1)
3246 self.misc_event.set()
3247 args = () if ancbufsize is None else (ancbufsize,)
3248 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3249 len(MSG), *args)
3250
3251 self.assertEqual(msg, MSG)
3252 self.checkRecvmsgAddress(addr, self.cli_addr)
3253 self.assertEqual(ancdata, [])
3254 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3255 ignore=ignoreflags)
3256
3257 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3258 def testCmsgTruncNoBufSize(self):
3259 # Check that no ancillary data is received when no ancillary
3260 # buffer size is provided.
3261 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3262 # BSD seems to set
3263 # MSG_CTRUNC only if an item
3264 # has been partially
3265 # received.
3266 ignoreflags=socket.MSG_CTRUNC)
3267
3268 @testCmsgTruncNoBufSize.client_skip
3269 def _testCmsgTruncNoBufSize(self):
3270 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3271 self.sendToServer(MSG)
3272
3273 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3274 def testSingleCmsgTrunc0(self):
3275 # Check that no ancillary data is received when ancillary
3276 # buffer size is zero.
3277 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3278 ignoreflags=socket.MSG_CTRUNC)
3279
3280 @testSingleCmsgTrunc0.client_skip
3281 def _testSingleCmsgTrunc0(self):
3282 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3283 self.sendToServer(MSG)
3284
3285 # Check that no ancillary data is returned for various non-zero
3286 # (but still too small) buffer sizes.
3287
3288 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3289 def testSingleCmsgTrunc1(self):
3290 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3291
3292 @testSingleCmsgTrunc1.client_skip
3293 def _testSingleCmsgTrunc1(self):
3294 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3295 self.sendToServer(MSG)
3296
3297 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3298 def testSingleCmsgTrunc2Int(self):
3299 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3300
3301 @testSingleCmsgTrunc2Int.client_skip
3302 def _testSingleCmsgTrunc2Int(self):
3303 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3304 self.sendToServer(MSG)
3305
3306 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3307 def testSingleCmsgTruncLen0Minus1(self):
3308 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3309
3310 @testSingleCmsgTruncLen0Minus1.client_skip
3311 def _testSingleCmsgTruncLen0Minus1(self):
3312 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3313 self.sendToServer(MSG)
3314
3315 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3316 def testSingleCmsgTruncInData(self):
3317 # Test truncation of a control message inside its associated
3318 # data. The message may be returned with its data truncated,
3319 # or not returned at all.
3320 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3321 socket.IPV6_RECVHOPLIMIT, 1)
3322 self.misc_event.set()
3323 msg, ancdata, flags, addr = self.doRecvmsg(
3324 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3325
3326 self.assertEqual(msg, MSG)
3327 self.checkRecvmsgAddress(addr, self.cli_addr)
3328 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3329
3330 self.assertLessEqual(len(ancdata), 1)
3331 if ancdata:
3332 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3333 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3334 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3335 self.assertLess(len(cmsg_data), SIZEOF_INT)
3336
3337 @testSingleCmsgTruncInData.client_skip
3338 def _testSingleCmsgTruncInData(self):
3339 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3340 self.sendToServer(MSG)
3341
3342 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3343 # Receive traffic class and hop limit into ancbufsize bytes of
3344 # ancillary data space, which should be large enough to
3345 # contain the first item, but too small to contain the header
3346 # of the second. Check that data is MSG, MSG_CTRUNC is set
3347 # (unless included in ignoreflags), and only one ancillary
3348 # data item is returned.
3349 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3350 socket.IPV6_RECVHOPLIMIT, 1)
3351 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3352 socket.IPV6_RECVTCLASS, 1)
3353 self.misc_event.set()
3354 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3355 len(MSG), ancbufsize)
3356
3357 self.assertEqual(msg, MSG)
3358 self.checkRecvmsgAddress(addr, self.cli_addr)
3359 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3360 ignore=ignoreflags)
3361
3362 self.assertEqual(len(ancdata), 1)
3363 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3364 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3365 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3366 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3367 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003368 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003369 self.assertGreaterEqual(a[0], 0)
3370 self.assertLessEqual(a[0], 255)
3371
3372 # Try the above test with various buffer sizes.
3373
3374 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3375 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3376 def testSecondCmsgTrunc0(self):
3377 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3378 ignoreflags=socket.MSG_CTRUNC)
3379
3380 @testSecondCmsgTrunc0.client_skip
3381 def _testSecondCmsgTrunc0(self):
3382 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3383 self.sendToServer(MSG)
3384
3385 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3386 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3387 def testSecondCmsgTrunc1(self):
3388 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3389
3390 @testSecondCmsgTrunc1.client_skip
3391 def _testSecondCmsgTrunc1(self):
3392 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3393 self.sendToServer(MSG)
3394
3395 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3396 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3397 def testSecondCmsgTrunc2Int(self):
3398 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3399 2 * SIZEOF_INT)
3400
3401 @testSecondCmsgTrunc2Int.client_skip
3402 def _testSecondCmsgTrunc2Int(self):
3403 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3404 self.sendToServer(MSG)
3405
3406 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3407 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3408 def testSecondCmsgTruncLen0Minus1(self):
3409 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3410 socket.CMSG_LEN(0) - 1)
3411
3412 @testSecondCmsgTruncLen0Minus1.client_skip
3413 def _testSecondCmsgTruncLen0Minus1(self):
3414 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3415 self.sendToServer(MSG)
3416
3417 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3418 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3419 def testSecomdCmsgTruncInData(self):
3420 # Test truncation of the second of two control messages inside
3421 # its associated data.
3422 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3423 socket.IPV6_RECVHOPLIMIT, 1)
3424 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3425 socket.IPV6_RECVTCLASS, 1)
3426 self.misc_event.set()
3427 msg, ancdata, flags, addr = self.doRecvmsg(
3428 self.serv_sock, len(MSG),
3429 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3430
3431 self.assertEqual(msg, MSG)
3432 self.checkRecvmsgAddress(addr, self.cli_addr)
3433 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3434
3435 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3436
3437 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3438 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3439 cmsg_types.remove(cmsg_type)
3440 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3441 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003442 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003443 self.assertGreaterEqual(a[0], 0)
3444 self.assertLessEqual(a[0], 255)
3445
3446 if ancdata:
3447 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3448 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3449 cmsg_types.remove(cmsg_type)
3450 self.assertLess(len(cmsg_data), SIZEOF_INT)
3451
3452 self.assertEqual(ancdata, [])
3453
3454 @testSecomdCmsgTruncInData.client_skip
3455 def _testSecomdCmsgTruncInData(self):
3456 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3457 self.sendToServer(MSG)
3458
3459
3460# Derive concrete test classes for different socket types.
3461
3462class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3463 SendrecvmsgConnectionlessBase,
3464 ThreadedSocketTestMixin, UDPTestBase):
3465 pass
3466
3467@requireAttrs(socket.socket, "sendmsg")
3468@unittest.skipUnless(thread, 'Threading required for this test.')
3469class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3470 pass
3471
3472@requireAttrs(socket.socket, "recvmsg")
3473@unittest.skipUnless(thread, 'Threading required for this test.')
3474class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3475 pass
3476
3477@requireAttrs(socket.socket, "recvmsg_into")
3478@unittest.skipUnless(thread, 'Threading required for this test.')
3479class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3480 pass
3481
3482
3483class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3484 SendrecvmsgConnectionlessBase,
3485 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003486
3487 def checkRecvmsgAddress(self, addr1, addr2):
3488 # Called to compare the received address with the address of
3489 # the peer, ignoring scope ID
3490 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003491
3492@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003493@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003494@requireSocket("AF_INET6", "SOCK_DGRAM")
3495@unittest.skipUnless(thread, 'Threading required for this test.')
3496class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3497 pass
3498
3499@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003500@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003501@requireSocket("AF_INET6", "SOCK_DGRAM")
3502@unittest.skipUnless(thread, 'Threading required for this test.')
3503class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3504 pass
3505
3506@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003507@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003508@requireSocket("AF_INET6", "SOCK_DGRAM")
3509@unittest.skipUnless(thread, 'Threading required for this test.')
3510class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3511 pass
3512
3513@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003514@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003515@requireAttrs(socket, "IPPROTO_IPV6")
3516@requireSocket("AF_INET6", "SOCK_DGRAM")
3517@unittest.skipUnless(thread, 'Threading required for this test.')
3518class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3519 SendrecvmsgUDP6TestBase):
3520 pass
3521
3522@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003523@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003524@requireAttrs(socket, "IPPROTO_IPV6")
3525@requireSocket("AF_INET6", "SOCK_DGRAM")
3526@unittest.skipUnless(thread, 'Threading required for this test.')
3527class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3528 RFC3542AncillaryTest,
3529 SendrecvmsgUDP6TestBase):
3530 pass
3531
3532
3533class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3534 ConnectedStreamTestMixin, TCPTestBase):
3535 pass
3536
3537@requireAttrs(socket.socket, "sendmsg")
3538@unittest.skipUnless(thread, 'Threading required for this test.')
3539class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3540 pass
3541
3542@requireAttrs(socket.socket, "recvmsg")
3543@unittest.skipUnless(thread, 'Threading required for this test.')
3544class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3545 SendrecvmsgTCPTestBase):
3546 pass
3547
3548@requireAttrs(socket.socket, "recvmsg_into")
3549@unittest.skipUnless(thread, 'Threading required for this test.')
3550class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3551 SendrecvmsgTCPTestBase):
3552 pass
3553
3554
3555class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3556 SendrecvmsgConnectedBase,
3557 ConnectedStreamTestMixin, SCTPStreamBase):
3558 pass
3559
3560@requireAttrs(socket.socket, "sendmsg")
3561@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3562@unittest.skipUnless(thread, 'Threading required for this test.')
3563class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3564 pass
3565
3566@requireAttrs(socket.socket, "recvmsg")
3567@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3568@unittest.skipUnless(thread, 'Threading required for this test.')
3569class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3570 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003571
3572 def testRecvmsgEOF(self):
3573 try:
3574 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3575 except OSError as e:
3576 if e.errno != errno.ENOTCONN:
3577 raise
3578 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003579
3580@requireAttrs(socket.socket, "recvmsg_into")
3581@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3582@unittest.skipUnless(thread, 'Threading required for this test.')
3583class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3584 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003585
3586 def testRecvmsgEOF(self):
3587 try:
3588 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3589 except OSError as e:
3590 if e.errno != errno.ENOTCONN:
3591 raise
3592 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003593
3594
3595class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3596 ConnectedStreamTestMixin, UnixStreamBase):
3597 pass
3598
3599@requireAttrs(socket.socket, "sendmsg")
3600@requireAttrs(socket, "AF_UNIX")
3601@unittest.skipUnless(thread, 'Threading required for this test.')
3602class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3603 pass
3604
3605@requireAttrs(socket.socket, "recvmsg")
3606@requireAttrs(socket, "AF_UNIX")
3607@unittest.skipUnless(thread, 'Threading required for this test.')
3608class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3609 SendrecvmsgUnixStreamTestBase):
3610 pass
3611
3612@requireAttrs(socket.socket, "recvmsg_into")
3613@requireAttrs(socket, "AF_UNIX")
3614@unittest.skipUnless(thread, 'Threading required for this test.')
3615class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3616 SendrecvmsgUnixStreamTestBase):
3617 pass
3618
3619@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3620@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3621@unittest.skipUnless(thread, 'Threading required for this test.')
3622class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3623 pass
3624
3625@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3626@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3627@unittest.skipUnless(thread, 'Threading required for this test.')
3628class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3629 SendrecvmsgUnixStreamTestBase):
3630 pass
3631
3632
3633# Test interrupting the interruptible send/receive methods with a
3634# signal when a timeout is set. These tests avoid having multiple
3635# threads alive during the test so that the OS cannot deliver the
3636# signal to the wrong one.
3637
3638class InterruptedTimeoutBase(unittest.TestCase):
3639 # Base class for interrupted send/receive tests. Installs an
3640 # empty handler for SIGALRM and removes it on teardown, along with
3641 # any scheduled alarms.
3642
3643 def setUp(self):
3644 super().setUp()
3645 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003646 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003647 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3648 self.addCleanup(self.setAlarm, 0)
3649
3650 # Timeout for socket operations
3651 timeout = 4.0
3652
3653 # Provide setAlarm() method to schedule delivery of SIGALRM after
3654 # given number of seconds, or cancel it if zero, and an
3655 # appropriate time value to use. Use setitimer() if available.
3656 if hasattr(signal, "setitimer"):
3657 alarm_time = 0.05
3658
3659 def setAlarm(self, seconds):
3660 signal.setitimer(signal.ITIMER_REAL, seconds)
3661 else:
3662 # Old systems may deliver the alarm up to one second early
3663 alarm_time = 2
3664
3665 def setAlarm(self, seconds):
3666 signal.alarm(seconds)
3667
3668
3669# Require siginterrupt() in order to ensure that system calls are
3670# interrupted by default.
3671@requireAttrs(signal, "siginterrupt")
3672@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3673 "Don't have signal.alarm or signal.setitimer")
3674class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3675 # Test interrupting the recv*() methods with signals when a
3676 # timeout is set.
3677
3678 def setUp(self):
3679 super().setUp()
3680 self.serv.settimeout(self.timeout)
3681
3682 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003683 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003684 # errno of EINTR when interrupted by a signal.
3685 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003686 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003687 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003688
3689 def testInterruptedRecvTimeout(self):
3690 self.checkInterruptedRecv(self.serv.recv, 1024)
3691
3692 def testInterruptedRecvIntoTimeout(self):
3693 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3694
3695 def testInterruptedRecvfromTimeout(self):
3696 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3697
3698 def testInterruptedRecvfromIntoTimeout(self):
3699 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3700
3701 @requireAttrs(socket.socket, "recvmsg")
3702 def testInterruptedRecvmsgTimeout(self):
3703 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3704
3705 @requireAttrs(socket.socket, "recvmsg_into")
3706 def testInterruptedRecvmsgIntoTimeout(self):
3707 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3708
3709
3710# Require siginterrupt() in order to ensure that system calls are
3711# interrupted by default.
3712@requireAttrs(signal, "siginterrupt")
3713@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3714 "Don't have signal.alarm or signal.setitimer")
3715@unittest.skipUnless(thread, 'Threading required for this test.')
3716class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3717 ThreadSafeCleanupTestCase,
3718 SocketListeningTestMixin, TCPTestBase):
3719 # Test interrupting the interruptible send*() methods with signals
3720 # when a timeout is set.
3721
3722 def setUp(self):
3723 super().setUp()
3724 self.serv_conn = self.newSocket()
3725 self.addCleanup(self.serv_conn.close)
3726 # Use a thread to complete the connection, but wait for it to
3727 # terminate before running the test, so that there is only one
3728 # thread to accept the signal.
3729 cli_thread = threading.Thread(target=self.doConnect)
3730 cli_thread.start()
3731 self.cli_conn, addr = self.serv.accept()
3732 self.addCleanup(self.cli_conn.close)
3733 cli_thread.join()
3734 self.serv_conn.settimeout(self.timeout)
3735
3736 def doConnect(self):
3737 self.serv_conn.connect(self.serv_addr)
3738
3739 def checkInterruptedSend(self, func, *args, **kwargs):
3740 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003741 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003742 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003743 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003744 while True:
3745 self.setAlarm(self.alarm_time)
3746 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003747
Ned Deilyc5640382014-02-03 13:58:31 -08003748 # Issue #12958: The following tests have problems on OS X prior to 10.7
3749 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003750 def testInterruptedSendTimeout(self):
3751 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3752
Ned Deilyc5640382014-02-03 13:58:31 -08003753 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003754 def testInterruptedSendtoTimeout(self):
3755 # Passing an actual address here as Python's wrapper for
3756 # sendto() doesn't allow passing a zero-length one; POSIX
3757 # requires that the address is ignored since the socket is
3758 # connection-mode, however.
3759 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3760 self.serv_addr)
3761
Ned Deilyc5640382014-02-03 13:58:31 -08003762 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003763 @requireAttrs(socket.socket, "sendmsg")
3764 def testInterruptedSendmsgTimeout(self):
3765 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3766
3767
Victor Stinner45df8202010-04-28 22:31:17 +00003768@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003769class TCPCloserTest(ThreadedTCPSocketTest):
3770
3771 def testClose(self):
3772 conn, addr = self.serv.accept()
3773 conn.close()
3774
3775 sd = self.cli
3776 read, write, err = select.select([sd], [], [], 1.0)
3777 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003778 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003779
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003780 # Calling close() many times should be safe.
3781 conn.close()
3782 conn.close()
3783
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003784 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003785 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003786 time.sleep(1.0)
3787
Victor Stinner45df8202010-04-28 22:31:17 +00003788@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003789class BasicSocketPairTest(SocketPairTest):
3790
3791 def __init__(self, methodName='runTest'):
3792 SocketPairTest.__init__(self, methodName=methodName)
3793
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003794 def _check_defaults(self, sock):
3795 self.assertIsInstance(sock, socket.socket)
3796 if hasattr(socket, 'AF_UNIX'):
3797 self.assertEqual(sock.family, socket.AF_UNIX)
3798 else:
3799 self.assertEqual(sock.family, socket.AF_INET)
3800 self.assertEqual(sock.type, socket.SOCK_STREAM)
3801 self.assertEqual(sock.proto, 0)
3802
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003803 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003804 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003805
3806 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003807 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003808
Dave Cole331708b2004-08-09 04:51:41 +00003809 def testRecv(self):
3810 msg = self.serv.recv(1024)
3811 self.assertEqual(msg, MSG)
3812
3813 def _testRecv(self):
3814 self.cli.send(MSG)
3815
3816 def testSend(self):
3817 self.serv.send(MSG)
3818
3819 def _testSend(self):
3820 msg = self.cli.recv(1024)
3821 self.assertEqual(msg, MSG)
3822
Victor Stinner45df8202010-04-28 22:31:17 +00003823@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003824class NonBlockingTCPTests(ThreadedTCPSocketTest):
3825
3826 def __init__(self, methodName='runTest'):
3827 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3828
3829 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003830 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003831 self.serv.setblocking(True)
3832 self.assertIsNone(self.serv.gettimeout())
3833 self.serv.setblocking(False)
3834 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003835 start = time.time()
3836 try:
3837 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003838 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003839 pass
3840 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003841 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003842
3843 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003844 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003845
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003846 @support.cpython_only
3847 def testSetBlocking_overflow(self):
3848 # Issue 15989
3849 import _testcapi
3850 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3851 self.skipTest('needs UINT_MAX < ULONG_MAX')
3852 self.serv.setblocking(False)
3853 self.assertEqual(self.serv.gettimeout(), 0.0)
3854 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3855 self.assertIsNone(self.serv.gettimeout())
3856
3857 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3858
Serhiy Storchaka43767632013-11-03 21:31:38 +02003859 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3860 'test needs socket.SOCK_NONBLOCK')
3861 @support.requires_linux_version(2, 6, 28)
3862 def testInitNonBlocking(self):
3863 # reinit server socket
3864 self.serv.close()
3865 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3866 socket.SOCK_NONBLOCK)
3867 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003868 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003869 # actual testing
3870 start = time.time()
3871 try:
3872 self.serv.accept()
3873 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003874 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003875 end = time.time()
3876 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3877
3878 def _testInitNonBlocking(self):
3879 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003880
Antoine Pitrou600232b2011-01-05 21:03:42 +00003881 def testInheritFlags(self):
3882 # Issue #7995: when calling accept() on a listening socket with a
3883 # timeout, the resulting socket should not be non-blocking.
3884 self.serv.settimeout(10)
3885 try:
3886 conn, addr = self.serv.accept()
3887 message = conn.recv(len(MSG))
3888 finally:
3889 conn.close()
3890 self.serv.settimeout(None)
3891
3892 def _testInheritFlags(self):
3893 time.sleep(0.1)
3894 self.cli.connect((HOST, self.port))
3895 time.sleep(0.5)
3896 self.cli.send(MSG)
3897
Guido van Rossum24e4af82002-06-12 19:18:08 +00003898 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003899 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003900 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003901 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003902 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003903 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003904 pass
3905 else:
3906 self.fail("Error trying to do non-blocking accept.")
3907 read, write, err = select.select([self.serv], [], [])
3908 if self.serv in read:
3909 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07003910 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00003911 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003912 else:
3913 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003914
Guido van Rossum24e4af82002-06-12 19:18:08 +00003915 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003916 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003917 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003918
3919 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003920 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003921 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003922 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003923
3924 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003925 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003926 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003927
3928 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003929 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003930 conn, addr = self.serv.accept()
3931 conn.setblocking(0)
3932 try:
3933 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003934 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003935 pass
3936 else:
3937 self.fail("Error trying to do non-blocking recv.")
3938 read, write, err = select.select([conn], [], [])
3939 if conn in read:
3940 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003941 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003942 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003943 else:
3944 self.fail("Error during select call to non-blocking socket.")
3945
3946 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003947 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003948 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003949 self.cli.send(MSG)
3950
Victor Stinner45df8202010-04-28 22:31:17 +00003951@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003952class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003953 """Unit tests for the object returned by socket.makefile()
3954
Antoine Pitrou834bd812010-10-13 16:17:14 +00003955 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003956 the client connection. You can read from this file to
3957 get output from the server.
3958
Antoine Pitrou834bd812010-10-13 16:17:14 +00003959 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003960 server connection. You can write to this file to send output
3961 to the client.
3962 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003963
Guido van Rossume9f66142002-08-07 15:46:19 +00003964 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003965 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003966 errors = 'strict'
3967 newline = None
3968
3969 read_mode = 'rb'
3970 read_msg = MSG
3971 write_mode = 'wb'
3972 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003973
Guido van Rossum24e4af82002-06-12 19:18:08 +00003974 def __init__(self, methodName='runTest'):
3975 SocketConnectedTest.__init__(self, methodName=methodName)
3976
3977 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003978 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3979 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003980 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003981 self.read_file = self.cli_conn.makefile(
3982 self.read_mode, self.bufsize,
3983 encoding = self.encoding,
3984 errors = self.errors,
3985 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003986
3987 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003988 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003989 self.read_file.close()
3990 self.assertTrue(self.read_file.closed)
3991 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003992 SocketConnectedTest.tearDown(self)
3993
3994 def clientSetUp(self):
3995 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003996 self.write_file = self.serv_conn.makefile(
3997 self.write_mode, self.bufsize,
3998 encoding = self.encoding,
3999 errors = self.errors,
4000 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004001
4002 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004003 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004004 self.write_file.close()
4005 self.assertTrue(self.write_file.closed)
4006 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004007 SocketConnectedTest.clientTearDown(self)
4008
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004009 def testReadAfterTimeout(self):
4010 # Issue #7322: A file object must disallow further reads
4011 # after a timeout has occurred.
4012 self.cli_conn.settimeout(1)
4013 self.read_file.read(3)
4014 # First read raises a timeout
4015 self.assertRaises(socket.timeout, self.read_file.read, 1)
4016 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004017 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004018 self.read_file.read(1)
4019 self.assertIn("cannot read from timed out object", str(ctx.exception))
4020
4021 def _testReadAfterTimeout(self):
4022 self.write_file.write(self.write_msg[0:3])
4023 self.write_file.flush()
4024 self.serv_finished.wait()
4025
Guido van Rossum24e4af82002-06-12 19:18:08 +00004026 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004027 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004028 first_seg = self.read_file.read(len(self.read_msg)-3)
4029 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004030 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004031 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004032
4033 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004034 self.write_file.write(self.write_msg)
4035 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004036
Guido van Rossum8c943832002-08-08 01:00:28 +00004037 def testFullRead(self):
4038 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004039 msg = self.read_file.read()
4040 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004041
4042 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004043 self.write_file.write(self.write_msg)
4044 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004045
Guido van Rossum24e4af82002-06-12 19:18:08 +00004046 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004047 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004048 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004049 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004050 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004051 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004052 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004053 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004054 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004055
4056 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004057 self.write_file.write(self.write_msg)
4058 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004059
4060 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004061 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004062 line = self.read_file.readline()
4063 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004064
4065 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004066 self.write_file.write(self.write_msg)
4067 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004068
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004069 def testCloseAfterMakefile(self):
4070 # The file returned by makefile should keep the socket open.
4071 self.cli_conn.close()
4072 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004073 msg = self.read_file.read()
4074 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004075
4076 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004077 self.write_file.write(self.write_msg)
4078 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004079
4080 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004081 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004082 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004083 if isinstance(self.read_msg, str):
4084 msg = msg.decode()
4085 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004086
4087 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004088 self.write_file.write(self.write_msg)
4089 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004090
Tim Peters116d83c2004-03-28 02:20:45 +00004091 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004092 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004093
4094 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004095 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004096
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004097 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004098 self.assertEqual(self.read_file.mode, self.read_mode)
4099 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004100
4101 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004102 self.assertEqual(self.write_file.mode, self.write_mode)
4103 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004104
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004105 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004106 self.read_file.close()
4107 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004108 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004109 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004110
4111 def _testRealClose(self):
4112 pass
4113
4114
Guido van Rossume9f66142002-08-07 15:46:19 +00004115class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4116
4117 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004118
Guido van Rossume9f66142002-08-07 15:46:19 +00004119 In this case (and in this case only), it should be possible to
4120 create a file object, read a line from it, create another file
4121 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004122 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004123 when reading multiple requests from the same socket."""
4124
4125 bufsize = 0 # Use unbuffered mode
4126
4127 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004128 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004129 line = self.read_file.readline() # first line
4130 self.assertEqual(line, b"A. " + self.write_msg) # first line
4131 self.read_file = self.cli_conn.makefile('rb', 0)
4132 line = self.read_file.readline() # second line
4133 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004134
4135 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004136 self.write_file.write(b"A. " + self.write_msg)
4137 self.write_file.write(b"B. " + self.write_msg)
4138 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004139
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004140 def testMakefileClose(self):
4141 # The file returned by makefile should keep the socket open...
4142 self.cli_conn.close()
4143 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004144 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004145 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004146 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004147 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004148
4149 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004150 self.write_file.write(self.write_msg)
4151 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004152
4153 def testMakefileCloseSocketDestroy(self):
4154 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004155 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004156 refcount_after = sys.getrefcount(self.cli_conn)
4157 self.assertEqual(refcount_before - 1, refcount_after)
4158
4159 def _testMakefileCloseSocketDestroy(self):
4160 pass
4161
Antoine Pitrou98b46702010-09-18 22:59:00 +00004162 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004163 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004164 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4165
4166 def testSmallReadNonBlocking(self):
4167 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004168 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4169 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004170 self.evt1.set()
4171 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004172 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004173 if first_seg is None:
4174 # Data not arrived (can happen under Windows), wait a bit
4175 time.sleep(0.5)
4176 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004177 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004178 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004179 self.assertEqual(n, 3)
4180 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004181 self.assertEqual(msg, self.read_msg)
4182 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4183 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004184
4185 def _testSmallReadNonBlocking(self):
4186 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004187 self.write_file.write(self.write_msg)
4188 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004189 self.evt2.set()
4190 # Avoid cloding the socket before the server test has finished,
4191 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4192 self.serv_finished.wait(5.0)
4193
4194 def testWriteNonBlocking(self):
4195 self.cli_finished.wait(5.0)
4196 # The client thread can't skip directly - the SkipTest exception
4197 # would appear as a failure.
4198 if self.serv_skipped:
4199 self.skipTest(self.serv_skipped)
4200
4201 def _testWriteNonBlocking(self):
4202 self.serv_skipped = None
4203 self.serv_conn.setblocking(False)
4204 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004205 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004206 LIMIT = 10
4207 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004208 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004209 self.assertGreater(n, 0)
4210 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004211 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004212 if n is None:
4213 # Succeeded
4214 break
4215 self.assertGreater(n, 0)
4216 else:
4217 # Let us know that this test didn't manage to establish
4218 # the expected conditions. This is not a failure in itself but,
4219 # if it happens repeatedly, the test should be fixed.
4220 self.serv_skipped = "failed to saturate the socket buffer"
4221
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004222
Guido van Rossum8c943832002-08-08 01:00:28 +00004223class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4224
4225 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4226
4227
4228class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4229
4230 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004231
Thomas Woutersb2137042007-02-01 18:02:27 +00004232
Antoine Pitrou834bd812010-10-13 16:17:14 +00004233class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4234 """Tests for socket.makefile() in text mode (rather than binary)"""
4235
4236 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004237 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004238 write_mode = 'wb'
4239 write_msg = MSG
4240 newline = ''
4241
4242
4243class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4244 """Tests for socket.makefile() in text mode (rather than binary)"""
4245
4246 read_mode = 'rb'
4247 read_msg = MSG
4248 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004249 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004250 newline = ''
4251
4252
4253class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4254 """Tests for socket.makefile() in text mode (rather than binary)"""
4255
4256 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004257 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004258 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004259 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004260 newline = ''
4261
4262
Guido van Rossumd8faa362007-04-27 19:54:29 +00004263class NetworkConnectionTest(object):
4264 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004265
Guido van Rossumd8faa362007-04-27 19:54:29 +00004266 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004267 # We're inherited below by BasicTCPTest2, which also inherits
4268 # BasicTCPTest, which defines self.port referenced below.
4269 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004270 self.serv_conn = self.cli
4271
4272class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4273 """Tests that NetworkConnection does not break existing TCP functionality.
4274 """
4275
4276class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004277
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004278 class MockSocket(socket.socket):
4279 def connect(self, *args):
4280 raise socket.timeout('timed out')
4281
4282 @contextlib.contextmanager
4283 def mocked_socket_module(self):
4284 """Return a socket which times out on connect"""
4285 old_socket = socket.socket
4286 socket.socket = self.MockSocket
4287 try:
4288 yield
4289 finally:
4290 socket.socket = old_socket
4291
4292 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004293 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004294 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004295 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004296 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004297 cli.connect((HOST, port))
4298 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4299
4300 def test_create_connection(self):
4301 # Issue #9792: errors raised by create_connection() should have
4302 # a proper errno attribute.
4303 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004304 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004305 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004306
4307 # Issue #16257: create_connection() calls getaddrinfo() against
4308 # 'localhost'. This may result in an IPV6 addr being returned
4309 # as well as an IPV4 one:
4310 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4311 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4312 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4313 #
4314 # create_connection() enumerates through all the addresses returned
4315 # and if it doesn't successfully bind to any of them, it propagates
4316 # the last exception it encountered.
4317 #
4318 # On Solaris, ENETUNREACH is returned in this circumstance instead
4319 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4320 # expected errnos.
4321 expected_errnos = [ errno.ECONNREFUSED, ]
4322 if hasattr(errno, 'ENETUNREACH'):
4323 expected_errnos.append(errno.ENETUNREACH)
4324
4325 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004326
4327 def test_create_connection_timeout(self):
4328 # Issue #9792: create_connection() should not recast timeout errors
4329 # as generic socket errors.
4330 with self.mocked_socket_module():
4331 with self.assertRaises(socket.timeout):
4332 socket.create_connection((HOST, 1234))
4333
Guido van Rossumd8faa362007-04-27 19:54:29 +00004334
Victor Stinner45df8202010-04-28 22:31:17 +00004335@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004336class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4337
4338 def __init__(self, methodName='runTest'):
4339 SocketTCPTest.__init__(self, methodName=methodName)
4340 ThreadableTest.__init__(self)
4341
4342 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004343 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004344
4345 def clientTearDown(self):
4346 self.cli.close()
4347 self.cli = None
4348 ThreadableTest.clientTearDown(self)
4349
4350 def _justAccept(self):
4351 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004352 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004353
4354 testFamily = _justAccept
4355 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004356 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004357 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004358 self.assertEqual(self.cli.family, 2)
4359
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004360 testSourceAddress = _justAccept
4361 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004362 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4363 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004364 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004365 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004366 # The port number being used is sufficient to show that the bind()
4367 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004368
Guido van Rossumd8faa362007-04-27 19:54:29 +00004369 testTimeoutDefault = _justAccept
4370 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004371 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004372 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004373 socket.setdefaulttimeout(42)
4374 try:
4375 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004376 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004377 finally:
4378 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004379 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004380
4381 testTimeoutNone = _justAccept
4382 def _testTimeoutNone(self):
4383 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004384 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004385 socket.setdefaulttimeout(30)
4386 try:
4387 self.cli = socket.create_connection((HOST, self.port), timeout=None)
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)
4391 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004392
4393 testTimeoutValueNamed = _justAccept
4394 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004395 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004396 self.assertEqual(self.cli.gettimeout(), 30)
4397
4398 testTimeoutValueNonamed = _justAccept
4399 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004400 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004401 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004402 self.assertEqual(self.cli.gettimeout(), 30)
4403
Victor Stinner45df8202010-04-28 22:31:17 +00004404@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004405class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4406
4407 def __init__(self, methodName='runTest'):
4408 SocketTCPTest.__init__(self, methodName=methodName)
4409 ThreadableTest.__init__(self)
4410
4411 def clientSetUp(self):
4412 pass
4413
4414 def clientTearDown(self):
4415 self.cli.close()
4416 self.cli = None
4417 ThreadableTest.clientTearDown(self)
4418
4419 def testInsideTimeout(self):
4420 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004421 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004422 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004423 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004424 testOutsideTimeout = testInsideTimeout
4425
4426 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004427 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004428 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004429 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004430
4431 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004432 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004433 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004434
4435
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004436class TCPTimeoutTest(SocketTCPTest):
4437
4438 def testTCPTimeout(self):
4439 def raise_timeout(*args, **kwargs):
4440 self.serv.settimeout(1.0)
4441 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004442 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004443 "Error generating a timeout exception (TCP)")
4444
4445 def testTimeoutZero(self):
4446 ok = False
4447 try:
4448 self.serv.settimeout(0.0)
4449 foo = self.serv.accept()
4450 except socket.timeout:
4451 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004452 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004453 ok = True
4454 except:
4455 self.fail("caught unexpected exception (TCP)")
4456 if not ok:
4457 self.fail("accept() returned success when we did not expect it")
4458
Serhiy Storchaka43767632013-11-03 21:31:38 +02004459 @unittest.skipUnless(hasattr(signal, 'alarm'),
4460 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004461 def testInterruptedTimeout(self):
4462 # XXX I don't know how to do this test on MSWindows or any other
4463 # plaform that doesn't support signal.alarm() or os.kill(), though
4464 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004465 self.serv.settimeout(5.0) # must be longer than alarm
4466 class Alarm(Exception):
4467 pass
4468 def alarm_handler(signal, frame):
4469 raise Alarm
4470 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4471 try:
4472 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4473 try:
4474 foo = self.serv.accept()
4475 except socket.timeout:
4476 self.fail("caught timeout instead of Alarm")
4477 except Alarm:
4478 pass
4479 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004480 self.fail("caught other exception instead of Alarm:"
4481 " %s(%s):\n%s" %
4482 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004483 else:
4484 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004485 finally:
4486 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004487 except Alarm:
4488 self.fail("got Alarm in wrong place")
4489 finally:
4490 # no alarm can be pending. Safe to restore old handler.
4491 signal.signal(signal.SIGALRM, old_alarm)
4492
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004493class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004494
4495 def testUDPTimeout(self):
4496 def raise_timeout(*args, **kwargs):
4497 self.serv.settimeout(1.0)
4498 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004499 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004500 "Error generating a timeout exception (UDP)")
4501
4502 def testTimeoutZero(self):
4503 ok = False
4504 try:
4505 self.serv.settimeout(0.0)
4506 foo = self.serv.recv(1024)
4507 except socket.timeout:
4508 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004509 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004510 ok = True
4511 except:
4512 self.fail("caught unexpected exception (UDP)")
4513 if not ok:
4514 self.fail("recv() returned success when we did not expect it")
4515
4516class TestExceptions(unittest.TestCase):
4517
4518 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004519 self.assertTrue(issubclass(OSError, Exception))
4520 self.assertTrue(issubclass(socket.herror, OSError))
4521 self.assertTrue(issubclass(socket.gaierror, OSError))
4522 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004523
Serhiy Storchaka43767632013-11-03 21:31:38 +02004524@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004525class TestLinuxAbstractNamespace(unittest.TestCase):
4526
4527 UNIX_PATH_MAX = 108
4528
4529 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004530 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004531 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4532 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004533 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004534 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4535 s2.connect(s1.getsockname())
4536 with s1.accept()[0] as s3:
4537 self.assertEqual(s1.getsockname(), address)
4538 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004539
4540 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004541 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004542 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4543 s.bind(address)
4544 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004545
4546 def testNameOverflow(self):
4547 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004548 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004549 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004550
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004551 def testStrName(self):
4552 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004553 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4554 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004555 s.bind("\x00python\x00test\x00")
4556 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004557 finally:
4558 s.close()
4559
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004560 def testBytearrayName(self):
4561 # Check that an abstract name can be passed as a bytearray.
4562 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4563 s.bind(bytearray(b"\x00python\x00test\x00"))
4564 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4565
Serhiy Storchaka43767632013-11-03 21:31:38 +02004566@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004567class TestUnixDomain(unittest.TestCase):
4568
4569 def setUp(self):
4570 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4571
4572 def tearDown(self):
4573 self.sock.close()
4574
4575 def encoded(self, path):
4576 # Return the given path encoded in the file system encoding,
4577 # or skip the test if this is not possible.
4578 try:
4579 return os.fsencode(path)
4580 except UnicodeEncodeError:
4581 self.skipTest(
4582 "Pathname {0!a} cannot be represented in file "
4583 "system encoding {1!r}".format(
4584 path, sys.getfilesystemencoding()))
4585
Antoine Pitrou16374872011-12-16 15:04:12 +01004586 def bind(self, sock, path):
4587 # Bind the socket
4588 try:
4589 sock.bind(path)
4590 except OSError as e:
4591 if str(e) == "AF_UNIX path too long":
4592 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004593 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004594 .format(path))
4595 else:
4596 raise
4597
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004598 def testStrAddr(self):
4599 # Test binding to and retrieving a normal string pathname.
4600 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004601 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004602 self.addCleanup(support.unlink, path)
4603 self.assertEqual(self.sock.getsockname(), path)
4604
4605 def testBytesAddr(self):
4606 # Test binding to a bytes pathname.
4607 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004608 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004609 self.addCleanup(support.unlink, path)
4610 self.assertEqual(self.sock.getsockname(), path)
4611
4612 def testSurrogateescapeBind(self):
4613 # Test binding to a valid non-ASCII pathname, with the
4614 # non-ASCII bytes supplied using surrogateescape encoding.
4615 path = os.path.abspath(support.TESTFN_UNICODE)
4616 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004617 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004618 self.addCleanup(support.unlink, path)
4619 self.assertEqual(self.sock.getsockname(), path)
4620
4621 def testUnencodableAddr(self):
4622 # Test binding to a pathname that cannot be encoded in the
4623 # file system encoding.
4624 if support.TESTFN_UNENCODABLE is None:
4625 self.skipTest("No unencodable filename available")
4626 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004627 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004628 self.addCleanup(support.unlink, path)
4629 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004630
Victor Stinner45df8202010-04-28 22:31:17 +00004631@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004632class BufferIOTest(SocketConnectedTest):
4633 """
4634 Test the buffer versions of socket.recv() and socket.send().
4635 """
4636 def __init__(self, methodName='runTest'):
4637 SocketConnectedTest.__init__(self, methodName=methodName)
4638
Antoine Pitrou25480782010-03-17 22:50:28 +00004639 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004640 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004641 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004642 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004643 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004644 self.assertEqual(msg, MSG)
4645
Antoine Pitrou25480782010-03-17 22:50:28 +00004646 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004647 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004648 self.serv_conn.send(buf)
4649
Antoine Pitrou25480782010-03-17 22:50:28 +00004650 def testRecvIntoBytearray(self):
4651 buf = bytearray(1024)
4652 nbytes = self.cli_conn.recv_into(buf)
4653 self.assertEqual(nbytes, len(MSG))
4654 msg = buf[:len(MSG)]
4655 self.assertEqual(msg, MSG)
4656
4657 _testRecvIntoBytearray = _testRecvIntoArray
4658
4659 def testRecvIntoMemoryview(self):
4660 buf = bytearray(1024)
4661 nbytes = self.cli_conn.recv_into(memoryview(buf))
4662 self.assertEqual(nbytes, len(MSG))
4663 msg = buf[:len(MSG)]
4664 self.assertEqual(msg, MSG)
4665
4666 _testRecvIntoMemoryview = _testRecvIntoArray
4667
4668 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004669 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004670 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004671 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004672 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004673 self.assertEqual(msg, MSG)
4674
Antoine Pitrou25480782010-03-17 22:50:28 +00004675 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004676 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004677 self.serv_conn.send(buf)
4678
Antoine Pitrou25480782010-03-17 22:50:28 +00004679 def testRecvFromIntoBytearray(self):
4680 buf = bytearray(1024)
4681 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4682 self.assertEqual(nbytes, len(MSG))
4683 msg = buf[:len(MSG)]
4684 self.assertEqual(msg, MSG)
4685
4686 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4687
4688 def testRecvFromIntoMemoryview(self):
4689 buf = bytearray(1024)
4690 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4691 self.assertEqual(nbytes, len(MSG))
4692 msg = buf[:len(MSG)]
4693 self.assertEqual(msg, MSG)
4694
4695 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4696
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004697 def testRecvFromIntoSmallBuffer(self):
4698 # See issue #20246.
4699 buf = bytearray(8)
4700 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4701
4702 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004703 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004704
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004705 def testRecvFromIntoEmptyBuffer(self):
4706 buf = bytearray()
4707 self.cli_conn.recvfrom_into(buf)
4708 self.cli_conn.recvfrom_into(buf, 0)
4709
4710 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4711
Christian Heimes043d6f62008-01-07 17:19:16 +00004712
4713TIPC_STYPE = 2000
4714TIPC_LOWER = 200
4715TIPC_UPPER = 210
4716
4717def isTipcAvailable():
4718 """Check if the TIPC module is loaded
4719
4720 The TIPC module is not loaded automatically on Ubuntu and probably
4721 other Linux distros.
4722 """
4723 if not hasattr(socket, "AF_TIPC"):
4724 return False
4725 if not os.path.isfile("/proc/modules"):
4726 return False
4727 with open("/proc/modules") as f:
4728 for line in f:
4729 if line.startswith("tipc "):
4730 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004731 return False
4732
Serhiy Storchaka43767632013-11-03 21:31:38 +02004733@unittest.skipUnless(isTipcAvailable(),
4734 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004735class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004736 def testRDM(self):
4737 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4738 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004739 self.addCleanup(srv.close)
4740 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004741
4742 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4743 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4744 TIPC_LOWER, TIPC_UPPER)
4745 srv.bind(srvaddr)
4746
4747 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4748 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4749 cli.sendto(MSG, sendaddr)
4750
4751 msg, recvaddr = srv.recvfrom(1024)
4752
4753 self.assertEqual(cli.getsockname(), recvaddr)
4754 self.assertEqual(msg, MSG)
4755
4756
Serhiy Storchaka43767632013-11-03 21:31:38 +02004757@unittest.skipUnless(isTipcAvailable(),
4758 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004759class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004760 def __init__(self, methodName = 'runTest'):
4761 unittest.TestCase.__init__(self, methodName = methodName)
4762 ThreadableTest.__init__(self)
4763
4764 def setUp(self):
4765 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004766 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004767 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4768 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4769 TIPC_LOWER, TIPC_UPPER)
4770 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004771 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004772 self.serverExplicitReady()
4773 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004774 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004775
4776 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00004777 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00004778 # accept() call; sleep a little while to avoid it, otherwise
4779 # we could get an exception
4780 time.sleep(0.1)
4781 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004782 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004783 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4784 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4785 self.cli.connect(addr)
4786 self.cliaddr = self.cli.getsockname()
4787
4788 def testStream(self):
4789 msg = self.conn.recv(1024)
4790 self.assertEqual(msg, MSG)
4791 self.assertEqual(self.cliaddr, self.connaddr)
4792
4793 def _testStream(self):
4794 self.cli.send(MSG)
4795 self.cli.close()
4796
4797
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004798@unittest.skipUnless(thread, 'Threading required for this test.')
4799class ContextManagersTest(ThreadedTCPSocketTest):
4800
4801 def _testSocketClass(self):
4802 # base test
4803 with socket.socket() as sock:
4804 self.assertFalse(sock._closed)
4805 self.assertTrue(sock._closed)
4806 # close inside with block
4807 with socket.socket() as sock:
4808 sock.close()
4809 self.assertTrue(sock._closed)
4810 # exception inside with block
4811 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004812 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004813 self.assertTrue(sock._closed)
4814
4815 def testCreateConnectionBase(self):
4816 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004817 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004818 data = conn.recv(1024)
4819 conn.sendall(data)
4820
4821 def _testCreateConnectionBase(self):
4822 address = self.serv.getsockname()
4823 with socket.create_connection(address) as sock:
4824 self.assertFalse(sock._closed)
4825 sock.sendall(b'foo')
4826 self.assertEqual(sock.recv(1024), b'foo')
4827 self.assertTrue(sock._closed)
4828
4829 def testCreateConnectionClose(self):
4830 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004831 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004832 data = conn.recv(1024)
4833 conn.sendall(data)
4834
4835 def _testCreateConnectionClose(self):
4836 address = self.serv.getsockname()
4837 with socket.create_connection(address) as sock:
4838 sock.close()
4839 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004840 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004841
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004842
Victor Stinnerdaf45552013-08-28 00:53:59 +02004843class InheritanceTest(unittest.TestCase):
4844 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4845 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004846 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004847 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004848 with socket.socket(socket.AF_INET,
4849 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4850 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004851 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004852
4853 def test_default_inheritable(self):
4854 sock = socket.socket()
4855 with sock:
4856 self.assertEqual(sock.get_inheritable(), False)
4857
4858 def test_dup(self):
4859 sock = socket.socket()
4860 with sock:
4861 newsock = sock.dup()
4862 sock.close()
4863 with newsock:
4864 self.assertEqual(newsock.get_inheritable(), False)
4865
4866 def test_set_inheritable(self):
4867 sock = socket.socket()
4868 with sock:
4869 sock.set_inheritable(True)
4870 self.assertEqual(sock.get_inheritable(), True)
4871
4872 sock.set_inheritable(False)
4873 self.assertEqual(sock.get_inheritable(), False)
4874
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004875 @unittest.skipIf(fcntl is None, "need fcntl")
4876 def test_get_inheritable_cloexec(self):
4877 sock = socket.socket()
4878 with sock:
4879 fd = sock.fileno()
4880 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004881
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004882 # clear FD_CLOEXEC flag
4883 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4884 flags &= ~fcntl.FD_CLOEXEC
4885 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004886
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004887 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004888
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004889 @unittest.skipIf(fcntl is None, "need fcntl")
4890 def test_set_inheritable_cloexec(self):
4891 sock = socket.socket()
4892 with sock:
4893 fd = sock.fileno()
4894 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4895 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004896
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004897 sock.set_inheritable(True)
4898 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4899 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004900
4901
Victor Stinnerdaf45552013-08-28 00:53:59 +02004902 @unittest.skipUnless(hasattr(socket, "socketpair"),
4903 "need socket.socketpair()")
4904 def test_socketpair(self):
4905 s1, s2 = socket.socketpair()
4906 self.addCleanup(s1.close)
4907 self.addCleanup(s2.close)
4908 self.assertEqual(s1.get_inheritable(), False)
4909 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004910
4911
4912@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4913 "SOCK_NONBLOCK not defined")
4914class NonblockConstantTest(unittest.TestCase):
4915 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4916 if nonblock:
4917 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4918 self.assertEqual(s.gettimeout(), timeout)
4919 else:
4920 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4921 self.assertEqual(s.gettimeout(), None)
4922
Charles-François Natali239bb962011-06-03 12:55:15 +02004923 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004924 def test_SOCK_NONBLOCK(self):
4925 # a lot of it seems silly and redundant, but I wanted to test that
4926 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004927 with socket.socket(socket.AF_INET,
4928 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4929 self.checkNonblock(s)
4930 s.setblocking(1)
4931 self.checkNonblock(s, False)
4932 s.setblocking(0)
4933 self.checkNonblock(s)
4934 s.settimeout(None)
4935 self.checkNonblock(s, False)
4936 s.settimeout(2.0)
4937 self.checkNonblock(s, timeout=2.0)
4938 s.setblocking(1)
4939 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004940 # defaulttimeout
4941 t = socket.getdefaulttimeout()
4942 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004943 with socket.socket() as s:
4944 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004945 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004946 with socket.socket() as s:
4947 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004948 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004949 with socket.socket() as s:
4950 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004951 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004952 with socket.socket() as s:
4953 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004954 socket.setdefaulttimeout(t)
4955
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004956
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004957@unittest.skipUnless(os.name == "nt", "Windows specific")
4958@unittest.skipUnless(multiprocessing, "need multiprocessing")
4959class TestSocketSharing(SocketTCPTest):
4960 # This must be classmethod and not staticmethod or multiprocessing
4961 # won't be able to bootstrap it.
4962 @classmethod
4963 def remoteProcessServer(cls, q):
4964 # Recreate socket from shared data
4965 sdata = q.get()
4966 message = q.get()
4967
4968 s = socket.fromshare(sdata)
4969 s2, c = s.accept()
4970
4971 # Send the message
4972 s2.sendall(message)
4973 s2.close()
4974 s.close()
4975
4976 def testShare(self):
4977 # Transfer the listening server socket to another process
4978 # and service it from there.
4979
4980 # Create process:
4981 q = multiprocessing.Queue()
4982 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4983 p.start()
4984
4985 # Get the shared socket data
4986 data = self.serv.share(p.pid)
4987
4988 # Pass the shared socket to the other process
4989 addr = self.serv.getsockname()
4990 self.serv.close()
4991 q.put(data)
4992
4993 # The data that the server will send us
4994 message = b"slapmahfro"
4995 q.put(message)
4996
4997 # Connect
4998 s = socket.create_connection(addr)
4999 # listen for the data
5000 m = []
5001 while True:
5002 data = s.recv(100)
5003 if not data:
5004 break
5005 m.append(data)
5006 s.close()
5007 received = b"".join(m)
5008 self.assertEqual(received, message)
5009 p.join()
5010
5011 def testShareLength(self):
5012 data = self.serv.share(os.getpid())
5013 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5014 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5015
5016 def compareSockets(self, org, other):
5017 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005018 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005019 self.assertEqual(org.gettimeout(), None)
5020 self.assertEqual(org.gettimeout(), other.gettimeout())
5021
5022 self.assertEqual(org.family, other.family)
5023 self.assertEqual(org.type, other.type)
5024 # If the user specified "0" for proto, then
5025 # internally windows will have picked the correct value.
5026 # Python introspection on the socket however will still return
5027 # 0. For the shared socket, the python value is recreated
5028 # from the actual value, so it may not compare correctly.
5029 if org.proto != 0:
5030 self.assertEqual(org.proto, other.proto)
5031
5032 def testShareLocal(self):
5033 data = self.serv.share(os.getpid())
5034 s = socket.fromshare(data)
5035 try:
5036 self.compareSockets(self.serv, s)
5037 finally:
5038 s.close()
5039
5040 def testTypes(self):
5041 families = [socket.AF_INET, socket.AF_INET6]
5042 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5043 for f in families:
5044 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005045 try:
5046 source = socket.socket(f, t)
5047 except OSError:
5048 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005049 try:
5050 data = source.share(os.getpid())
5051 shared = socket.fromshare(data)
5052 try:
5053 self.compareSockets(source, shared)
5054 finally:
5055 shared.close()
5056 finally:
5057 source.close()
5058
5059
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005060@unittest.skipUnless(thread, 'Threading required for this test.')
5061class SendfileUsingSendTest(ThreadedTCPSocketTest):
5062 """
5063 Test the send() implementation of socket.sendfile().
5064 """
5065
5066 FILESIZE = (10 * 1024 * 1024) # 10MB
5067 BUFSIZE = 8192
5068 FILEDATA = b""
5069 TIMEOUT = 2
5070
5071 @classmethod
5072 def setUpClass(cls):
5073 def chunks(total, step):
5074 assert total >= step
5075 while total > step:
5076 yield step
5077 total -= step
5078 if total:
5079 yield total
5080
5081 chunk = b"".join([random.choice(string.ascii_letters).encode()
5082 for i in range(cls.BUFSIZE)])
5083 with open(support.TESTFN, 'wb') as f:
5084 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5085 f.write(chunk)
5086 with open(support.TESTFN, 'rb') as f:
5087 cls.FILEDATA = f.read()
5088 assert len(cls.FILEDATA) == cls.FILESIZE
5089
5090 @classmethod
5091 def tearDownClass(cls):
5092 support.unlink(support.TESTFN)
5093
5094 def accept_conn(self):
5095 self.serv.settimeout(self.TIMEOUT)
5096 conn, addr = self.serv.accept()
5097 conn.settimeout(self.TIMEOUT)
5098 self.addCleanup(conn.close)
5099 return conn
5100
5101 def recv_data(self, conn):
5102 received = []
5103 while True:
5104 chunk = conn.recv(self.BUFSIZE)
5105 if not chunk:
5106 break
5107 received.append(chunk)
5108 return b''.join(received)
5109
5110 def meth_from_sock(self, sock):
5111 # Depending on the mixin class being run return either send()
5112 # or sendfile() method implementation.
5113 return getattr(sock, "_sendfile_use_send")
5114
5115 # regular file
5116
5117 def _testRegularFile(self):
5118 address = self.serv.getsockname()
5119 file = open(support.TESTFN, 'rb')
5120 with socket.create_connection(address) as sock, file as file:
5121 meth = self.meth_from_sock(sock)
5122 sent = meth(file)
5123 self.assertEqual(sent, self.FILESIZE)
5124 self.assertEqual(file.tell(), self.FILESIZE)
5125
5126 def testRegularFile(self):
5127 conn = self.accept_conn()
5128 data = self.recv_data(conn)
5129 self.assertEqual(len(data), self.FILESIZE)
5130 self.assertEqual(data, self.FILEDATA)
5131
5132 # non regular file
5133
5134 def _testNonRegularFile(self):
5135 address = self.serv.getsockname()
5136 file = io.BytesIO(self.FILEDATA)
5137 with socket.create_connection(address) as sock, file as file:
5138 sent = sock.sendfile(file)
5139 self.assertEqual(sent, self.FILESIZE)
5140 self.assertEqual(file.tell(), self.FILESIZE)
5141 self.assertRaises(socket._GiveupOnSendfile,
5142 sock._sendfile_use_sendfile, file)
5143
5144 def testNonRegularFile(self):
5145 conn = self.accept_conn()
5146 data = self.recv_data(conn)
5147 self.assertEqual(len(data), self.FILESIZE)
5148 self.assertEqual(data, self.FILEDATA)
5149
5150 # empty file
5151
5152 def _testEmptyFileSend(self):
5153 address = self.serv.getsockname()
5154 filename = support.TESTFN + "2"
5155 with open(filename, 'wb'):
5156 self.addCleanup(support.unlink, filename)
5157 file = open(filename, 'rb')
5158 with socket.create_connection(address) as sock, file as file:
5159 meth = self.meth_from_sock(sock)
5160 sent = meth(file)
5161 self.assertEqual(sent, 0)
5162 self.assertEqual(file.tell(), 0)
5163
5164 def testEmptyFileSend(self):
5165 conn = self.accept_conn()
5166 data = self.recv_data(conn)
5167 self.assertEqual(data, b"")
5168
5169 # offset
5170
5171 def _testOffset(self):
5172 address = self.serv.getsockname()
5173 file = open(support.TESTFN, 'rb')
5174 with socket.create_connection(address) as sock, file as file:
5175 meth = self.meth_from_sock(sock)
5176 sent = meth(file, offset=5000)
5177 self.assertEqual(sent, self.FILESIZE - 5000)
5178 self.assertEqual(file.tell(), self.FILESIZE)
5179
5180 def testOffset(self):
5181 conn = self.accept_conn()
5182 data = self.recv_data(conn)
5183 self.assertEqual(len(data), self.FILESIZE - 5000)
5184 self.assertEqual(data, self.FILEDATA[5000:])
5185
5186 # count
5187
5188 def _testCount(self):
5189 address = self.serv.getsockname()
5190 file = open(support.TESTFN, 'rb')
5191 with socket.create_connection(address, timeout=2) as sock, file as file:
5192 count = 5000007
5193 meth = self.meth_from_sock(sock)
5194 sent = meth(file, count=count)
5195 self.assertEqual(sent, count)
5196 self.assertEqual(file.tell(), count)
5197
5198 def testCount(self):
5199 count = 5000007
5200 conn = self.accept_conn()
5201 data = self.recv_data(conn)
5202 self.assertEqual(len(data), count)
5203 self.assertEqual(data, self.FILEDATA[:count])
5204
5205 # count small
5206
5207 def _testCountSmall(self):
5208 address = self.serv.getsockname()
5209 file = open(support.TESTFN, 'rb')
5210 with socket.create_connection(address, timeout=2) as sock, file as file:
5211 count = 1
5212 meth = self.meth_from_sock(sock)
5213 sent = meth(file, count=count)
5214 self.assertEqual(sent, count)
5215 self.assertEqual(file.tell(), count)
5216
5217 def testCountSmall(self):
5218 count = 1
5219 conn = self.accept_conn()
5220 data = self.recv_data(conn)
5221 self.assertEqual(len(data), count)
5222 self.assertEqual(data, self.FILEDATA[:count])
5223
5224 # count + offset
5225
5226 def _testCountWithOffset(self):
5227 address = self.serv.getsockname()
5228 file = open(support.TESTFN, 'rb')
5229 with socket.create_connection(address, timeout=2) as sock, file as file:
5230 count = 100007
5231 meth = self.meth_from_sock(sock)
5232 sent = meth(file, offset=2007, count=count)
5233 self.assertEqual(sent, count)
5234 self.assertEqual(file.tell(), count + 2007)
5235
5236 def testCountWithOffset(self):
5237 count = 100007
5238 conn = self.accept_conn()
5239 data = self.recv_data(conn)
5240 self.assertEqual(len(data), count)
5241 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5242
5243 # non blocking sockets are not supposed to work
5244
5245 def _testNonBlocking(self):
5246 address = self.serv.getsockname()
5247 file = open(support.TESTFN, 'rb')
5248 with socket.create_connection(address) as sock, file as file:
5249 sock.setblocking(False)
5250 meth = self.meth_from_sock(sock)
5251 self.assertRaises(ValueError, meth, file)
5252 self.assertRaises(ValueError, sock.sendfile, file)
5253
5254 def testNonBlocking(self):
5255 conn = self.accept_conn()
5256 if conn.recv(8192):
5257 self.fail('was not supposed to receive any data')
5258
5259 # timeout (non-triggered)
5260
5261 def _testWithTimeout(self):
5262 address = self.serv.getsockname()
5263 file = open(support.TESTFN, 'rb')
5264 with socket.create_connection(address, timeout=2) as sock, file as file:
5265 meth = self.meth_from_sock(sock)
5266 sent = meth(file)
5267 self.assertEqual(sent, self.FILESIZE)
5268
5269 def testWithTimeout(self):
5270 conn = self.accept_conn()
5271 data = self.recv_data(conn)
5272 self.assertEqual(len(data), self.FILESIZE)
5273 self.assertEqual(data, self.FILEDATA)
5274
5275 # timeout (triggered)
5276
5277 def _testWithTimeoutTriggeredSend(self):
5278 address = self.serv.getsockname()
5279 file = open(support.TESTFN, 'rb')
5280 with socket.create_connection(address, timeout=0.01) as sock, \
5281 file as file:
5282 meth = self.meth_from_sock(sock)
5283 self.assertRaises(socket.timeout, meth, file)
5284
5285 def testWithTimeoutTriggeredSend(self):
5286 conn = self.accept_conn()
5287 conn.recv(88192)
5288
5289 # errors
5290
5291 def _test_errors(self):
5292 pass
5293
5294 def test_errors(self):
5295 with open(support.TESTFN, 'rb') as file:
5296 with socket.socket(type=socket.SOCK_DGRAM) as s:
5297 meth = self.meth_from_sock(s)
5298 self.assertRaisesRegex(
5299 ValueError, "SOCK_STREAM", meth, file)
5300 with open(support.TESTFN, 'rt') as file:
5301 with socket.socket() as s:
5302 meth = self.meth_from_sock(s)
5303 self.assertRaisesRegex(
5304 ValueError, "binary mode", meth, file)
5305 with open(support.TESTFN, 'rb') as file:
5306 with socket.socket() as s:
5307 meth = self.meth_from_sock(s)
5308 self.assertRaisesRegex(TypeError, "positive integer",
5309 meth, file, count='2')
5310 self.assertRaisesRegex(TypeError, "positive integer",
5311 meth, file, count=0.1)
5312 self.assertRaisesRegex(ValueError, "positive integer",
5313 meth, file, count=0)
5314 self.assertRaisesRegex(ValueError, "positive integer",
5315 meth, file, count=-1)
5316
5317
5318@unittest.skipUnless(thread, 'Threading required for this test.')
5319@unittest.skipUnless(hasattr(os, "sendfile"),
5320 'os.sendfile() required for this test.')
5321class SendfileUsingSendfileTest(SendfileUsingSendTest):
5322 """
5323 Test the sendfile() implementation of socket.sendfile().
5324 """
5325 def meth_from_sock(self, sock):
5326 return getattr(sock, "_sendfile_use_sendfile")
5327
5328
Guido van Rossumb995eb72002-07-31 16:08:40 +00005329def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005330 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005331 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005332
5333 tests.extend([
5334 NonBlockingTCPTests,
5335 FileObjectClassTestCase,
5336 UnbufferedFileObjectClassTestCase,
5337 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005338 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005339 UnicodeReadFileObjectClassTestCase,
5340 UnicodeWriteFileObjectClassTestCase,
5341 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005342 NetworkConnectionNoServer,
5343 NetworkConnectionAttributesTest,
5344 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005345 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005346 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005347 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005348 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005349 tests.append(BasicSocketPairTest)
5350 tests.append(TestUnixDomain)
5351 tests.append(TestLinuxAbstractNamespace)
5352 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005353 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005354 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005355 tests.extend([
5356 CmsgMacroTests,
5357 SendmsgUDPTest,
5358 RecvmsgUDPTest,
5359 RecvmsgIntoUDPTest,
5360 SendmsgUDP6Test,
5361 RecvmsgUDP6Test,
5362 RecvmsgRFC3542AncillaryUDP6Test,
5363 RecvmsgIntoRFC3542AncillaryUDP6Test,
5364 RecvmsgIntoUDP6Test,
5365 SendmsgTCPTest,
5366 RecvmsgTCPTest,
5367 RecvmsgIntoTCPTest,
5368 SendmsgSCTPStreamTest,
5369 RecvmsgSCTPStreamTest,
5370 RecvmsgIntoSCTPStreamTest,
5371 SendmsgUnixStreamTest,
5372 RecvmsgUnixStreamTest,
5373 RecvmsgIntoUnixStreamTest,
5374 RecvmsgSCMRightsStreamTest,
5375 RecvmsgIntoSCMRightsStreamTest,
5376 # These are slow when setitimer() is not available
5377 InterruptedRecvTimeoutTest,
5378 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005379 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005380 SendfileUsingSendTest,
5381 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005382 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005383
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005384 thread_info = support.threading_setup()
5385 support.run_unittest(*tests)
5386 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005387
5388if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005389 test_main()