blob: 2764e6146de119bc8bca03fa2fc035ce37877d64 [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
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001220 def testGetaddrinfo(self):
1221 try:
1222 socket.getaddrinfo('localhost', 80)
1223 except socket.gaierror as err:
1224 if err.errno == socket.EAI_SERVICE:
1225 # see http://bugs.python.org/issue1282647
1226 self.skipTest("buggy libc version")
1227 raise
1228 # len of every sequence is supposed to be == 5
1229 for info in socket.getaddrinfo(HOST, None):
1230 self.assertEqual(len(info), 5)
1231 # host can be a domain name, a string representation of an
1232 # IPv4/v6 address or None
1233 socket.getaddrinfo('localhost', 80)
1234 socket.getaddrinfo('127.0.0.1', 80)
1235 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001236 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001237 socket.getaddrinfo('::1', 80)
1238 # port can be a string service name such as "http", a numeric
1239 # port number or None
1240 socket.getaddrinfo(HOST, "http")
1241 socket.getaddrinfo(HOST, 80)
1242 socket.getaddrinfo(HOST, None)
1243 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001244 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1245 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001246 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001247 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1248 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001249 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001250 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1251 for _, socktype, _, _, _ in infos:
1252 self.assertEqual(socktype, socket.SOCK_STREAM)
1253 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001254 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001255 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1256 # a server willing to support both IPv4 and IPv6 will
1257 # usually do this
1258 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1259 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001260 # test keyword arguments
1261 a = socket.getaddrinfo(HOST, None)
1262 b = socket.getaddrinfo(host=HOST, port=None)
1263 self.assertEqual(a, b)
1264 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1265 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1266 self.assertEqual(a, b)
1267 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1268 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1269 self.assertEqual(a, b)
1270 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1271 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1272 self.assertEqual(a, b)
1273 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1274 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1275 self.assertEqual(a, b)
1276 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1277 socket.AI_PASSIVE)
1278 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1279 type=socket.SOCK_STREAM, proto=0,
1280 flags=socket.AI_PASSIVE)
1281 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001282 # Issue #6697.
1283 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001284
Ned Deilyb24f4812014-02-13 22:50:42 -08001285 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001286 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001287 try:
1288 # The arguments here are undefined and the call may succeed
1289 # or fail. All we care here is that it doesn't segfault.
1290 socket.getaddrinfo("localhost", None, 0, 0, 0,
1291 socket.AI_NUMERICSERV)
1292 except socket.gaierror:
1293 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001294
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001295 def test_getnameinfo(self):
1296 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001297 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001298
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001299 @unittest.skipUnless(support.is_resource_enabled('network'),
1300 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001301 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001302 # Check for internet access before running test
1303 # (issue #12804, issue #25138).
1304 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001305 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001306
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001307 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001308 domain = 'испытание.pythontest.net'
1309 socket.gethostbyname(domain)
1310 socket.gethostbyname_ex(domain)
1311 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001312 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1313 # have a reverse entry yet
1314 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001315
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001316 def check_sendall_interrupted(self, with_timeout):
1317 # socketpair() is not stricly required, but it makes things easier.
1318 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1319 self.skipTest("signal.alarm and socket.socketpair required for this test")
1320 # Our signal handlers clobber the C errno by calling a math function
1321 # with an invalid domain value.
1322 def ok_handler(*args):
1323 self.assertRaises(ValueError, math.acosh, 0)
1324 def raising_handler(*args):
1325 self.assertRaises(ValueError, math.acosh, 0)
1326 1 // 0
1327 c, s = socket.socketpair()
1328 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1329 try:
1330 if with_timeout:
1331 # Just above the one second minimum for signal.alarm
1332 c.settimeout(1.5)
1333 with self.assertRaises(ZeroDivisionError):
1334 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001335 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001336 if with_timeout:
1337 signal.signal(signal.SIGALRM, ok_handler)
1338 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001339 self.assertRaises(socket.timeout, c.sendall,
1340 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001341 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001342 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001343 signal.signal(signal.SIGALRM, old_alarm)
1344 c.close()
1345 s.close()
1346
1347 def test_sendall_interrupted(self):
1348 self.check_sendall_interrupted(False)
1349
1350 def test_sendall_interrupted_with_timeout(self):
1351 self.check_sendall_interrupted(True)
1352
Antoine Pitroue033e062010-10-29 10:38:18 +00001353 def test_dealloc_warn(self):
1354 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1355 r = repr(sock)
1356 with self.assertWarns(ResourceWarning) as cm:
1357 sock = None
1358 support.gc_collect()
1359 self.assertIn(r, str(cm.warning.args[0]))
1360 # An open socket file object gets dereferenced after the socket
1361 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1362 f = sock.makefile('rb')
1363 r = repr(sock)
1364 sock = None
1365 support.gc_collect()
1366 with self.assertWarns(ResourceWarning):
1367 f = None
1368 support.gc_collect()
1369
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001370 def test_name_closed_socketio(self):
1371 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1372 fp = sock.makefile("rb")
1373 fp.close()
1374 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1375
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001376 def test_unusable_closed_socketio(self):
1377 with socket.socket() as sock:
1378 fp = sock.makefile("rb", buffering=0)
1379 self.assertTrue(fp.readable())
1380 self.assertFalse(fp.writable())
1381 self.assertFalse(fp.seekable())
1382 fp.close()
1383 self.assertRaises(ValueError, fp.readable)
1384 self.assertRaises(ValueError, fp.writable)
1385 self.assertRaises(ValueError, fp.seekable)
1386
Berker Peksag3fe64d02016-02-18 17:34:00 +02001387 def test_makefile_mode(self):
1388 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1389 with self.subTest(mode=mode):
1390 with socket.socket() as sock:
1391 with sock.makefile(mode) as fp:
1392 self.assertEqual(fp.mode, mode)
1393
1394 def test_makefile_invalid_mode(self):
1395 for mode in 'rt', 'x', '+', 'a':
1396 with self.subTest(mode=mode):
1397 with socket.socket() as sock:
1398 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1399 sock.makefile(mode)
1400
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001401 def test_pickle(self):
1402 sock = socket.socket()
1403 with sock:
1404 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1405 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001406 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1407 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1408 self.assertEqual(family, socket.AF_INET)
1409 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1410 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001411
Serhiy Storchaka78980432013-01-15 01:12:17 +02001412 def test_listen_backlog(self):
1413 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001414 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1415 srv.bind((HOST, 0))
1416 srv.listen(backlog)
1417
1418 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001419 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001420 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001421
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001422 @support.cpython_only
1423 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001424 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001425 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001426 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1427 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001428 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001429 srv.close()
1430
Charles-François Natali42663332012-01-02 15:57:30 +01001431 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001432 def test_flowinfo(self):
1433 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001434 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001435 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001436 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001437
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001438 def test_str_for_enums(self):
1439 # Make sure that the AF_* and SOCK_* constants have enum-like string
1440 # reprs.
1441 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1442 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001443 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001444
1445 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1446 def test_uknown_socket_family_repr(self):
1447 # Test that when created with a family that's not one of the known
1448 # AF_*/SOCK_* constants, socket.family just returns the number.
1449 #
1450 # To do this we fool socket.socket into believing it already has an
1451 # open fd because on this path it doesn't actually verify the family and
1452 # type and populates the socket object.
1453 #
1454 # On Windows this trick won't work, so the test is skipped.
1455 fd, _ = tempfile.mkstemp()
1456 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1457 self.assertEqual(s.family, 42424)
1458 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001459
Charles-François Natali47413c12011-10-06 19:47:44 +02001460@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1461class BasicCANTest(unittest.TestCase):
1462
1463 def testCrucialConstants(self):
1464 socket.AF_CAN
1465 socket.PF_CAN
1466 socket.CAN_RAW
1467
Charles-François Natali773e42d2013-02-05 19:42:01 +01001468 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1469 'socket.CAN_BCM required for this test.')
1470 def testBCMConstants(self):
1471 socket.CAN_BCM
1472
1473 # opcodes
1474 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1475 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1476 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1477 socket.CAN_BCM_TX_SEND # send one CAN frame
1478 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1479 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1480 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1481 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1482 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1483 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1484 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1485 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1486
Charles-François Natali47413c12011-10-06 19:47:44 +02001487 def testCreateSocket(self):
1488 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1489 pass
1490
Charles-François Natali773e42d2013-02-05 19:42:01 +01001491 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1492 'socket.CAN_BCM required for this test.')
1493 def testCreateBCMSocket(self):
1494 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1495 pass
1496
Charles-François Natali47413c12011-10-06 19:47:44 +02001497 def testBindAny(self):
1498 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1499 s.bind(('', ))
1500
1501 def testTooLongInterfaceName(self):
1502 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1503 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001504 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001505 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001506
1507 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1508 'socket.CAN_RAW_LOOPBACK required for this test.')
1509 def testLoopback(self):
1510 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1511 for loopback in (0, 1):
1512 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1513 loopback)
1514 self.assertEqual(loopback,
1515 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1516
1517 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1518 'socket.CAN_RAW_FILTER required for this test.')
1519 def testFilter(self):
1520 can_id, can_mask = 0x200, 0x700
1521 can_filter = struct.pack("=II", can_id, can_mask)
1522 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1523 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1524 self.assertEqual(can_filter,
1525 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001526 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001527
1528
1529@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001530@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001531class CANTest(ThreadedCANSocketTest):
1532
Charles-François Natali47413c12011-10-06 19:47:44 +02001533 def __init__(self, methodName='runTest'):
1534 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1535
1536 @classmethod
1537 def build_can_frame(cls, can_id, data):
1538 """Build a CAN frame."""
1539 can_dlc = len(data)
1540 data = data.ljust(8, b'\x00')
1541 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1542
1543 @classmethod
1544 def dissect_can_frame(cls, frame):
1545 """Dissect a CAN frame."""
1546 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1547 return (can_id, can_dlc, data[:can_dlc])
1548
1549 def testSendFrame(self):
1550 cf, addr = self.s.recvfrom(self.bufsize)
1551 self.assertEqual(self.cf, cf)
1552 self.assertEqual(addr[0], self.interface)
1553 self.assertEqual(addr[1], socket.AF_CAN)
1554
1555 def _testSendFrame(self):
1556 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1557 self.cli.send(self.cf)
1558
1559 def testSendMaxFrame(self):
1560 cf, addr = self.s.recvfrom(self.bufsize)
1561 self.assertEqual(self.cf, cf)
1562
1563 def _testSendMaxFrame(self):
1564 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1565 self.cli.send(self.cf)
1566
1567 def testSendMultiFrames(self):
1568 cf, addr = self.s.recvfrom(self.bufsize)
1569 self.assertEqual(self.cf1, cf)
1570
1571 cf, addr = self.s.recvfrom(self.bufsize)
1572 self.assertEqual(self.cf2, cf)
1573
1574 def _testSendMultiFrames(self):
1575 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1576 self.cli.send(self.cf1)
1577
1578 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1579 self.cli.send(self.cf2)
1580
Charles-François Natali773e42d2013-02-05 19:42:01 +01001581 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1582 'socket.CAN_BCM required for this test.')
1583 def _testBCM(self):
1584 cf, addr = self.cli.recvfrom(self.bufsize)
1585 self.assertEqual(self.cf, cf)
1586 can_id, can_dlc, data = self.dissect_can_frame(cf)
1587 self.assertEqual(self.can_id, can_id)
1588 self.assertEqual(self.data, data)
1589
1590 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1591 'socket.CAN_BCM required for this test.')
1592 def testBCM(self):
1593 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1594 self.addCleanup(bcm.close)
1595 bcm.connect((self.interface,))
1596 self.can_id = 0x123
1597 self.data = bytes([0xc0, 0xff, 0xee])
1598 self.cf = self.build_can_frame(self.can_id, self.data)
1599 opcode = socket.CAN_BCM_TX_SEND
1600 flags = 0
1601 count = 0
1602 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1603 bcm_can_id = 0x0222
1604 nframes = 1
1605 assert len(self.cf) == 16
1606 header = struct.pack(self.bcm_cmd_msg_fmt,
1607 opcode,
1608 flags,
1609 count,
1610 ival1_seconds,
1611 ival1_usec,
1612 ival2_seconds,
1613 ival2_usec,
1614 bcm_can_id,
1615 nframes,
1616 )
1617 header_plus_frame = header + self.cf
1618 bytes_sent = bcm.send(header_plus_frame)
1619 self.assertEqual(bytes_sent, len(header_plus_frame))
1620
Charles-François Natali47413c12011-10-06 19:47:44 +02001621
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001622@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1623class BasicRDSTest(unittest.TestCase):
1624
1625 def testCrucialConstants(self):
1626 socket.AF_RDS
1627 socket.PF_RDS
1628
1629 def testCreateSocket(self):
1630 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1631 pass
1632
1633 def testSocketBufferSize(self):
1634 bufsize = 16384
1635 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1636 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1637 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1638
1639
1640@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1641@unittest.skipUnless(thread, 'Threading required for this test.')
1642class RDSTest(ThreadedRDSSocketTest):
1643
1644 def __init__(self, methodName='runTest'):
1645 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1646
Charles-François Natali240c55f2011-11-10 20:33:36 +01001647 def setUp(self):
1648 super().setUp()
1649 self.evt = threading.Event()
1650
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001651 def testSendAndRecv(self):
1652 data, addr = self.serv.recvfrom(self.bufsize)
1653 self.assertEqual(self.data, data)
1654 self.assertEqual(self.cli_addr, addr)
1655
1656 def _testSendAndRecv(self):
1657 self.data = b'spam'
1658 self.cli.sendto(self.data, 0, (HOST, self.port))
1659
1660 def testPeek(self):
1661 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1662 self.assertEqual(self.data, data)
1663 data, addr = self.serv.recvfrom(self.bufsize)
1664 self.assertEqual(self.data, data)
1665
1666 def _testPeek(self):
1667 self.data = b'spam'
1668 self.cli.sendto(self.data, 0, (HOST, self.port))
1669
1670 @requireAttrs(socket.socket, 'recvmsg')
1671 def testSendAndRecvMsg(self):
1672 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1673 self.assertEqual(self.data, data)
1674
1675 @requireAttrs(socket.socket, 'sendmsg')
1676 def _testSendAndRecvMsg(self):
1677 self.data = b'hello ' * 10
1678 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1679
1680 def testSendAndRecvMulti(self):
1681 data, addr = self.serv.recvfrom(self.bufsize)
1682 self.assertEqual(self.data1, data)
1683
1684 data, addr = self.serv.recvfrom(self.bufsize)
1685 self.assertEqual(self.data2, data)
1686
1687 def _testSendAndRecvMulti(self):
1688 self.data1 = b'bacon'
1689 self.cli.sendto(self.data1, 0, (HOST, self.port))
1690
1691 self.data2 = b'egg'
1692 self.cli.sendto(self.data2, 0, (HOST, self.port))
1693
1694 def testSelect(self):
1695 r, w, x = select.select([self.serv], [], [], 3.0)
1696 self.assertIn(self.serv, r)
1697 data, addr = self.serv.recvfrom(self.bufsize)
1698 self.assertEqual(self.data, data)
1699
1700 def _testSelect(self):
1701 self.data = b'select'
1702 self.cli.sendto(self.data, 0, (HOST, self.port))
1703
1704 def testCongestion(self):
1705 # wait until the sender is done
1706 self.evt.wait()
1707
1708 def _testCongestion(self):
1709 # test the behavior in case of congestion
1710 self.data = b'fill'
1711 self.cli.setblocking(False)
1712 try:
1713 # try to lower the receiver's socket buffer size
1714 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1715 except OSError:
1716 pass
1717 with self.assertRaises(OSError) as cm:
1718 try:
1719 # fill the receiver's socket buffer
1720 while True:
1721 self.cli.sendto(self.data, 0, (HOST, self.port))
1722 finally:
1723 # signal the receiver we're done
1724 self.evt.set()
1725 # sendto() should have failed with ENOBUFS
1726 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1727 # and we should have received a congestion notification through poll
1728 r, w, x = select.select([self.serv], [], [], 3.0)
1729 self.assertIn(self.serv, r)
1730
1731
Victor Stinner45df8202010-04-28 22:31:17 +00001732@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001733class BasicTCPTest(SocketConnectedTest):
1734
1735 def __init__(self, methodName='runTest'):
1736 SocketConnectedTest.__init__(self, methodName=methodName)
1737
1738 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001739 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001740 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001741 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001742
1743 def _testRecv(self):
1744 self.serv_conn.send(MSG)
1745
1746 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001747 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001748 seg1 = self.cli_conn.recv(len(MSG) - 3)
1749 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001750 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001751 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001752
1753 def _testOverFlowRecv(self):
1754 self.serv_conn.send(MSG)
1755
1756 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001757 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001758 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001759 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001760
1761 def _testRecvFrom(self):
1762 self.serv_conn.send(MSG)
1763
1764 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001765 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001766 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1767 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001768 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001769 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001770
1771 def _testOverFlowRecvFrom(self):
1772 self.serv_conn.send(MSG)
1773
1774 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001775 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001776 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001777 while 1:
1778 read = self.cli_conn.recv(1024)
1779 if not read:
1780 break
Guido van Rossume531e292002-08-08 20:28:34 +00001781 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001782 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001783
1784 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001785 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001786 self.serv_conn.sendall(big_chunk)
1787
1788 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001789 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001790 fd = self.cli_conn.fileno()
1791 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001792 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001793 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001794 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001795 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001796
1797 def _testFromFd(self):
1798 self.serv_conn.send(MSG)
1799
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001800 def testDup(self):
1801 # Testing dup()
1802 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001803 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001804 msg = sock.recv(1024)
1805 self.assertEqual(msg, MSG)
1806
1807 def _testDup(self):
1808 self.serv_conn.send(MSG)
1809
Guido van Rossum24e4af82002-06-12 19:18:08 +00001810 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001811 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001812 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001813 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001814 # wait for _testShutdown to finish: on OS X, when the server
1815 # closes the connection the client also becomes disconnected,
1816 # and the client's shutdown call will fail. (Issue #4397.)
1817 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001818
1819 def _testShutdown(self):
1820 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001821 self.serv_conn.shutdown(2)
1822
1823 testShutdown_overflow = support.cpython_only(testShutdown)
1824
1825 @support.cpython_only
1826 def _testShutdown_overflow(self):
1827 import _testcapi
1828 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001829 # Issue 15989
1830 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1831 _testcapi.INT_MAX + 1)
1832 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1833 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001834 self.serv_conn.shutdown(2)
1835
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001836 def testDetach(self):
1837 # Testing detach()
1838 fileno = self.cli_conn.fileno()
1839 f = self.cli_conn.detach()
1840 self.assertEqual(f, fileno)
1841 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001842 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001843 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001844 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001845 # ...but we can create another socket using the (still open)
1846 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001847 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001848 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001849 msg = sock.recv(1024)
1850 self.assertEqual(msg, MSG)
1851
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001852 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001853 self.serv_conn.send(MSG)
1854
Victor Stinner45df8202010-04-28 22:31:17 +00001855@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001856class BasicUDPTest(ThreadedUDPSocketTest):
1857
1858 def __init__(self, methodName='runTest'):
1859 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1860
1861 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001862 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001863 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001864 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001865
1866 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001867 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001868
Guido van Rossum1c938012002-06-12 21:17:20 +00001869 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001870 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001871 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001872 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001873
Guido van Rossum1c938012002-06-12 21:17:20 +00001874 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001875 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001876
Guido van Rossumd8faa362007-04-27 19:54:29 +00001877 def testRecvFromNegative(self):
1878 # Negative lengths passed to recvfrom should give ValueError.
1879 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1880
1881 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001882 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001883
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001884# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1885# same test code is used with different families and types of socket
1886# (e.g. stream, datagram), and tests using recvmsg() are repeated
1887# using recvmsg_into().
1888#
1889# The generic test classes such as SendmsgTests and
1890# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1891# supplied with sockets cli_sock and serv_sock representing the
1892# client's and the server's end of the connection respectively, and
1893# attributes cli_addr and serv_addr holding their (numeric where
1894# appropriate) addresses.
1895#
1896# The final concrete test classes combine these with subclasses of
1897# SocketTestBase which set up client and server sockets of a specific
1898# type, and with subclasses of SendrecvmsgBase such as
1899# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1900# sockets to cli_sock and serv_sock and override the methods and
1901# attributes of SendrecvmsgBase to fill in destination addresses if
1902# needed when sending, check for specific flags in msg_flags, etc.
1903#
1904# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1905# recvmsg_into().
1906
1907# XXX: like the other datagram (UDP) tests in this module, the code
1908# here assumes that datagram delivery on the local machine will be
1909# reliable.
1910
1911class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1912 # Base class for sendmsg()/recvmsg() tests.
1913
1914 # Time in seconds to wait before considering a test failed, or
1915 # None for no timeout. Not all tests actually set a timeout.
1916 fail_timeout = 3.0
1917
1918 def setUp(self):
1919 self.misc_event = threading.Event()
1920 super().setUp()
1921
1922 def sendToServer(self, msg):
1923 # Send msg to the server.
1924 return self.cli_sock.send(msg)
1925
1926 # Tuple of alternative default arguments for sendmsg() when called
1927 # via sendmsgToServer() (e.g. to include a destination address).
1928 sendmsg_to_server_defaults = ()
1929
1930 def sendmsgToServer(self, *args):
1931 # Call sendmsg() on self.cli_sock with the given arguments,
1932 # filling in any arguments which are not supplied with the
1933 # corresponding items of self.sendmsg_to_server_defaults, if
1934 # any.
1935 return self.cli_sock.sendmsg(
1936 *(args + self.sendmsg_to_server_defaults[len(args):]))
1937
1938 def doRecvmsg(self, sock, bufsize, *args):
1939 # Call recvmsg() on sock with given arguments and return its
1940 # result. Should be used for tests which can use either
1941 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1942 # this method with one which emulates it using recvmsg_into(),
1943 # thus allowing the same test to be used for both methods.
1944 result = sock.recvmsg(bufsize, *args)
1945 self.registerRecvmsgResult(result)
1946 return result
1947
1948 def registerRecvmsgResult(self, result):
1949 # Called by doRecvmsg() with the return value of recvmsg() or
1950 # recvmsg_into(). Can be overridden to arrange cleanup based
1951 # on the returned ancillary data, for instance.
1952 pass
1953
1954 def checkRecvmsgAddress(self, addr1, addr2):
1955 # Called to compare the received address with the address of
1956 # the peer.
1957 self.assertEqual(addr1, addr2)
1958
1959 # Flags that are normally unset in msg_flags
1960 msg_flags_common_unset = 0
1961 for name in ("MSG_CTRUNC", "MSG_OOB"):
1962 msg_flags_common_unset |= getattr(socket, name, 0)
1963
1964 # Flags that are normally set
1965 msg_flags_common_set = 0
1966
1967 # Flags set when a complete record has been received (e.g. MSG_EOR
1968 # for SCTP)
1969 msg_flags_eor_indicator = 0
1970
1971 # Flags set when a complete record has not been received
1972 # (e.g. MSG_TRUNC for datagram sockets)
1973 msg_flags_non_eor_indicator = 0
1974
1975 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1976 # Method to check the value of msg_flags returned by recvmsg[_into]().
1977 #
1978 # Checks that all bits in msg_flags_common_set attribute are
1979 # set in "flags" and all bits in msg_flags_common_unset are
1980 # unset.
1981 #
1982 # The "eor" argument specifies whether the flags should
1983 # indicate that a full record (or datagram) has been received.
1984 # If "eor" is None, no checks are done; otherwise, checks
1985 # that:
1986 #
1987 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1988 # set and all bits in msg_flags_non_eor_indicator are unset
1989 #
1990 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1991 # are set and all bits in msg_flags_eor_indicator are unset
1992 #
1993 # If "checkset" and/or "checkunset" are supplied, they require
1994 # the given bits to be set or unset respectively, overriding
1995 # what the attributes require for those bits.
1996 #
1997 # If any bits are set in "ignore", they will not be checked,
1998 # regardless of the other inputs.
1999 #
2000 # Will raise Exception if the inputs require a bit to be both
2001 # set and unset, and it is not ignored.
2002
2003 defaultset = self.msg_flags_common_set
2004 defaultunset = self.msg_flags_common_unset
2005
2006 if eor:
2007 defaultset |= self.msg_flags_eor_indicator
2008 defaultunset |= self.msg_flags_non_eor_indicator
2009 elif eor is not None:
2010 defaultset |= self.msg_flags_non_eor_indicator
2011 defaultunset |= self.msg_flags_eor_indicator
2012
2013 # Function arguments override defaults
2014 defaultset &= ~checkunset
2015 defaultunset &= ~checkset
2016
2017 # Merge arguments with remaining defaults, and check for conflicts
2018 checkset |= defaultset
2019 checkunset |= defaultunset
2020 inboth = checkset & checkunset & ~ignore
2021 if inboth:
2022 raise Exception("contradictory set, unset requirements for flags "
2023 "{0:#x}".format(inboth))
2024
2025 # Compare with given msg_flags value
2026 mask = (checkset | checkunset) & ~ignore
2027 self.assertEqual(flags & mask, checkset & mask)
2028
2029
2030class RecvmsgIntoMixin(SendrecvmsgBase):
2031 # Mixin to implement doRecvmsg() using recvmsg_into().
2032
2033 def doRecvmsg(self, sock, bufsize, *args):
2034 buf = bytearray(bufsize)
2035 result = sock.recvmsg_into([buf], *args)
2036 self.registerRecvmsgResult(result)
2037 self.assertGreaterEqual(result[0], 0)
2038 self.assertLessEqual(result[0], bufsize)
2039 return (bytes(buf[:result[0]]),) + result[1:]
2040
2041
2042class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2043 # Defines flags to be checked in msg_flags for datagram sockets.
2044
2045 @property
2046 def msg_flags_non_eor_indicator(self):
2047 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2048
2049
2050class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2051 # Defines flags to be checked in msg_flags for SCTP sockets.
2052
2053 @property
2054 def msg_flags_eor_indicator(self):
2055 return super().msg_flags_eor_indicator | socket.MSG_EOR
2056
2057
2058class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2059 # Base class for tests on connectionless-mode sockets. Users must
2060 # supply sockets on attributes cli and serv to be mapped to
2061 # cli_sock and serv_sock respectively.
2062
2063 @property
2064 def serv_sock(self):
2065 return self.serv
2066
2067 @property
2068 def cli_sock(self):
2069 return self.cli
2070
2071 @property
2072 def sendmsg_to_server_defaults(self):
2073 return ([], [], 0, self.serv_addr)
2074
2075 def sendToServer(self, msg):
2076 return self.cli_sock.sendto(msg, self.serv_addr)
2077
2078
2079class SendrecvmsgConnectedBase(SendrecvmsgBase):
2080 # Base class for tests on connected sockets. Users must supply
2081 # sockets on attributes serv_conn and cli_conn (representing the
2082 # connections *to* the server and the client), to be mapped to
2083 # cli_sock and serv_sock respectively.
2084
2085 @property
2086 def serv_sock(self):
2087 return self.cli_conn
2088
2089 @property
2090 def cli_sock(self):
2091 return self.serv_conn
2092
2093 def checkRecvmsgAddress(self, addr1, addr2):
2094 # Address is currently "unspecified" for a connected socket,
2095 # so we don't examine it
2096 pass
2097
2098
2099class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2100 # Base class to set a timeout on server's socket.
2101
2102 def setUp(self):
2103 super().setUp()
2104 self.serv_sock.settimeout(self.fail_timeout)
2105
2106
2107class SendmsgTests(SendrecvmsgServerTimeoutBase):
2108 # Tests for sendmsg() which can use any socket type and do not
2109 # involve recvmsg() or recvmsg_into().
2110
2111 def testSendmsg(self):
2112 # Send a simple message with sendmsg().
2113 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2114
2115 def _testSendmsg(self):
2116 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2117
2118 def testSendmsgDataGenerator(self):
2119 # Send from buffer obtained from a generator (not a sequence).
2120 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2121
2122 def _testSendmsgDataGenerator(self):
2123 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2124 len(MSG))
2125
2126 def testSendmsgAncillaryGenerator(self):
2127 # Gather (empty) ancillary data from a generator.
2128 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2129
2130 def _testSendmsgAncillaryGenerator(self):
2131 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2132 len(MSG))
2133
2134 def testSendmsgArray(self):
2135 # Send data from an array instead of the usual bytes object.
2136 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2137
2138 def _testSendmsgArray(self):
2139 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2140 len(MSG))
2141
2142 def testSendmsgGather(self):
2143 # Send message data from more than one buffer (gather write).
2144 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2145
2146 def _testSendmsgGather(self):
2147 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2148
2149 def testSendmsgBadArgs(self):
2150 # Check that sendmsg() rejects invalid arguments.
2151 self.assertEqual(self.serv_sock.recv(1000), b"done")
2152
2153 def _testSendmsgBadArgs(self):
2154 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2155 self.assertRaises(TypeError, self.sendmsgToServer,
2156 b"not in an iterable")
2157 self.assertRaises(TypeError, self.sendmsgToServer,
2158 object())
2159 self.assertRaises(TypeError, self.sendmsgToServer,
2160 [object()])
2161 self.assertRaises(TypeError, self.sendmsgToServer,
2162 [MSG, object()])
2163 self.assertRaises(TypeError, self.sendmsgToServer,
2164 [MSG], object())
2165 self.assertRaises(TypeError, self.sendmsgToServer,
2166 [MSG], [], object())
2167 self.assertRaises(TypeError, self.sendmsgToServer,
2168 [MSG], [], 0, object())
2169 self.sendToServer(b"done")
2170
2171 def testSendmsgBadCmsg(self):
2172 # Check that invalid ancillary data items are rejected.
2173 self.assertEqual(self.serv_sock.recv(1000), b"done")
2174
2175 def _testSendmsgBadCmsg(self):
2176 self.assertRaises(TypeError, self.sendmsgToServer,
2177 [MSG], [object()])
2178 self.assertRaises(TypeError, self.sendmsgToServer,
2179 [MSG], [(object(), 0, b"data")])
2180 self.assertRaises(TypeError, self.sendmsgToServer,
2181 [MSG], [(0, object(), b"data")])
2182 self.assertRaises(TypeError, self.sendmsgToServer,
2183 [MSG], [(0, 0, object())])
2184 self.assertRaises(TypeError, self.sendmsgToServer,
2185 [MSG], [(0, 0)])
2186 self.assertRaises(TypeError, self.sendmsgToServer,
2187 [MSG], [(0, 0, b"data", 42)])
2188 self.sendToServer(b"done")
2189
2190 @requireAttrs(socket, "CMSG_SPACE")
2191 def testSendmsgBadMultiCmsg(self):
2192 # Check that invalid ancillary data items are rejected when
2193 # more than one item is present.
2194 self.assertEqual(self.serv_sock.recv(1000), b"done")
2195
2196 @testSendmsgBadMultiCmsg.client_skip
2197 def _testSendmsgBadMultiCmsg(self):
2198 self.assertRaises(TypeError, self.sendmsgToServer,
2199 [MSG], [0, 0, b""])
2200 self.assertRaises(TypeError, self.sendmsgToServer,
2201 [MSG], [(0, 0, b""), object()])
2202 self.sendToServer(b"done")
2203
2204 def testSendmsgExcessCmsgReject(self):
2205 # Check that sendmsg() rejects excess ancillary data items
2206 # when the number that can be sent is limited.
2207 self.assertEqual(self.serv_sock.recv(1000), b"done")
2208
2209 def _testSendmsgExcessCmsgReject(self):
2210 if not hasattr(socket, "CMSG_SPACE"):
2211 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002212 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002213 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2214 self.assertIsNone(cm.exception.errno)
2215 self.sendToServer(b"done")
2216
2217 def testSendmsgAfterClose(self):
2218 # Check that sendmsg() fails on a closed socket.
2219 pass
2220
2221 def _testSendmsgAfterClose(self):
2222 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002223 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002224
2225
2226class SendmsgStreamTests(SendmsgTests):
2227 # Tests for sendmsg() which require a stream socket and do not
2228 # involve recvmsg() or recvmsg_into().
2229
2230 def testSendmsgExplicitNoneAddr(self):
2231 # Check that peer address can be specified as None.
2232 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2233
2234 def _testSendmsgExplicitNoneAddr(self):
2235 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2236
2237 def testSendmsgTimeout(self):
2238 # Check that timeout works with sendmsg().
2239 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2240 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2241
2242 def _testSendmsgTimeout(self):
2243 try:
2244 self.cli_sock.settimeout(0.03)
2245 with self.assertRaises(socket.timeout):
2246 while True:
2247 self.sendmsgToServer([b"a"*512])
2248 finally:
2249 self.misc_event.set()
2250
2251 # XXX: would be nice to have more tests for sendmsg flags argument.
2252
2253 # Linux supports MSG_DONTWAIT when sending, but in general, it
2254 # only works when receiving. Could add other platforms if they
2255 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002256 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002257 "MSG_DONTWAIT not known to work on this platform when "
2258 "sending")
2259 def testSendmsgDontWait(self):
2260 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2261 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2262 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2263
2264 @testSendmsgDontWait.client_skip
2265 def _testSendmsgDontWait(self):
2266 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002267 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002268 while True:
2269 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2270 self.assertIn(cm.exception.errno,
2271 (errno.EAGAIN, errno.EWOULDBLOCK))
2272 finally:
2273 self.misc_event.set()
2274
2275
2276class SendmsgConnectionlessTests(SendmsgTests):
2277 # Tests for sendmsg() which require a connectionless-mode
2278 # (e.g. datagram) socket, and do not involve recvmsg() or
2279 # recvmsg_into().
2280
2281 def testSendmsgNoDestAddr(self):
2282 # Check that sendmsg() fails when no destination address is
2283 # given for unconnected socket.
2284 pass
2285
2286 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002287 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002288 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002289 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002290 [MSG], [], 0, None)
2291
2292
2293class RecvmsgGenericTests(SendrecvmsgBase):
2294 # Tests for recvmsg() which can also be emulated using
2295 # recvmsg_into(), and can use any socket type.
2296
2297 def testRecvmsg(self):
2298 # Receive a simple message with recvmsg[_into]().
2299 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2300 self.assertEqual(msg, MSG)
2301 self.checkRecvmsgAddress(addr, self.cli_addr)
2302 self.assertEqual(ancdata, [])
2303 self.checkFlags(flags, eor=True)
2304
2305 def _testRecvmsg(self):
2306 self.sendToServer(MSG)
2307
2308 def testRecvmsgExplicitDefaults(self):
2309 # Test recvmsg[_into]() with default arguments provided explicitly.
2310 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2311 len(MSG), 0, 0)
2312 self.assertEqual(msg, MSG)
2313 self.checkRecvmsgAddress(addr, self.cli_addr)
2314 self.assertEqual(ancdata, [])
2315 self.checkFlags(flags, eor=True)
2316
2317 def _testRecvmsgExplicitDefaults(self):
2318 self.sendToServer(MSG)
2319
2320 def testRecvmsgShorter(self):
2321 # Receive a message smaller than buffer.
2322 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2323 len(MSG) + 42)
2324 self.assertEqual(msg, MSG)
2325 self.checkRecvmsgAddress(addr, self.cli_addr)
2326 self.assertEqual(ancdata, [])
2327 self.checkFlags(flags, eor=True)
2328
2329 def _testRecvmsgShorter(self):
2330 self.sendToServer(MSG)
2331
Charles-François Natali8619cd72011-10-03 19:43:15 +02002332 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2333 # datagram is received (issue #13001).
2334 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002335 def testRecvmsgTrunc(self):
2336 # Receive part of message, check for truncation indicators.
2337 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2338 len(MSG) - 3)
2339 self.assertEqual(msg, MSG[:-3])
2340 self.checkRecvmsgAddress(addr, self.cli_addr)
2341 self.assertEqual(ancdata, [])
2342 self.checkFlags(flags, eor=False)
2343
Charles-François Natali8619cd72011-10-03 19:43:15 +02002344 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002345 def _testRecvmsgTrunc(self):
2346 self.sendToServer(MSG)
2347
2348 def testRecvmsgShortAncillaryBuf(self):
2349 # Test ancillary data buffer too small to hold any ancillary data.
2350 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2351 len(MSG), 1)
2352 self.assertEqual(msg, MSG)
2353 self.checkRecvmsgAddress(addr, self.cli_addr)
2354 self.assertEqual(ancdata, [])
2355 self.checkFlags(flags, eor=True)
2356
2357 def _testRecvmsgShortAncillaryBuf(self):
2358 self.sendToServer(MSG)
2359
2360 def testRecvmsgLongAncillaryBuf(self):
2361 # Test large ancillary data buffer.
2362 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2363 len(MSG), 10240)
2364 self.assertEqual(msg, MSG)
2365 self.checkRecvmsgAddress(addr, self.cli_addr)
2366 self.assertEqual(ancdata, [])
2367 self.checkFlags(flags, eor=True)
2368
2369 def _testRecvmsgLongAncillaryBuf(self):
2370 self.sendToServer(MSG)
2371
2372 def testRecvmsgAfterClose(self):
2373 # Check that recvmsg[_into]() fails on a closed socket.
2374 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002375 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002376
2377 def _testRecvmsgAfterClose(self):
2378 pass
2379
2380 def testRecvmsgTimeout(self):
2381 # Check that timeout works.
2382 try:
2383 self.serv_sock.settimeout(0.03)
2384 self.assertRaises(socket.timeout,
2385 self.doRecvmsg, self.serv_sock, len(MSG))
2386 finally:
2387 self.misc_event.set()
2388
2389 def _testRecvmsgTimeout(self):
2390 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2391
2392 @requireAttrs(socket, "MSG_PEEK")
2393 def testRecvmsgPeek(self):
2394 # Check that MSG_PEEK in flags enables examination of pending
2395 # data without consuming it.
2396
2397 # Receive part of data with MSG_PEEK.
2398 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2399 len(MSG) - 3, 0,
2400 socket.MSG_PEEK)
2401 self.assertEqual(msg, MSG[:-3])
2402 self.checkRecvmsgAddress(addr, self.cli_addr)
2403 self.assertEqual(ancdata, [])
2404 # Ignoring MSG_TRUNC here (so this test is the same for stream
2405 # and datagram sockets). Some wording in POSIX seems to
2406 # suggest that it needn't be set when peeking, but that may
2407 # just be a slip.
2408 self.checkFlags(flags, eor=False,
2409 ignore=getattr(socket, "MSG_TRUNC", 0))
2410
2411 # Receive all data with MSG_PEEK.
2412 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2413 len(MSG), 0,
2414 socket.MSG_PEEK)
2415 self.assertEqual(msg, MSG)
2416 self.checkRecvmsgAddress(addr, self.cli_addr)
2417 self.assertEqual(ancdata, [])
2418 self.checkFlags(flags, eor=True)
2419
2420 # Check that the same data can still be received normally.
2421 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2422 self.assertEqual(msg, MSG)
2423 self.checkRecvmsgAddress(addr, self.cli_addr)
2424 self.assertEqual(ancdata, [])
2425 self.checkFlags(flags, eor=True)
2426
2427 @testRecvmsgPeek.client_skip
2428 def _testRecvmsgPeek(self):
2429 self.sendToServer(MSG)
2430
2431 @requireAttrs(socket.socket, "sendmsg")
2432 def testRecvmsgFromSendmsg(self):
2433 # Test receiving with recvmsg[_into]() when message is sent
2434 # using sendmsg().
2435 self.serv_sock.settimeout(self.fail_timeout)
2436 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2437 self.assertEqual(msg, MSG)
2438 self.checkRecvmsgAddress(addr, self.cli_addr)
2439 self.assertEqual(ancdata, [])
2440 self.checkFlags(flags, eor=True)
2441
2442 @testRecvmsgFromSendmsg.client_skip
2443 def _testRecvmsgFromSendmsg(self):
2444 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2445
2446
2447class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2448 # Tests which require a stream socket and can use either recvmsg()
2449 # or recvmsg_into().
2450
2451 def testRecvmsgEOF(self):
2452 # Receive end-of-stream indicator (b"", peer socket closed).
2453 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2454 self.assertEqual(msg, b"")
2455 self.checkRecvmsgAddress(addr, self.cli_addr)
2456 self.assertEqual(ancdata, [])
2457 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2458
2459 def _testRecvmsgEOF(self):
2460 self.cli_sock.close()
2461
2462 def testRecvmsgOverflow(self):
2463 # Receive a message in more than one chunk.
2464 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2465 len(MSG) - 3)
2466 self.checkRecvmsgAddress(addr, self.cli_addr)
2467 self.assertEqual(ancdata, [])
2468 self.checkFlags(flags, eor=False)
2469
2470 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2471 self.checkRecvmsgAddress(addr, self.cli_addr)
2472 self.assertEqual(ancdata, [])
2473 self.checkFlags(flags, eor=True)
2474
2475 msg = seg1 + seg2
2476 self.assertEqual(msg, MSG)
2477
2478 def _testRecvmsgOverflow(self):
2479 self.sendToServer(MSG)
2480
2481
2482class RecvmsgTests(RecvmsgGenericTests):
2483 # Tests for recvmsg() which can use any socket type.
2484
2485 def testRecvmsgBadArgs(self):
2486 # Check that recvmsg() rejects invalid arguments.
2487 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2488 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2489 -1, 0, 0)
2490 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2491 len(MSG), -1, 0)
2492 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2493 [bytearray(10)], 0, 0)
2494 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2495 object(), 0, 0)
2496 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2497 len(MSG), object(), 0)
2498 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2499 len(MSG), 0, object())
2500
2501 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2502 self.assertEqual(msg, MSG)
2503 self.checkRecvmsgAddress(addr, self.cli_addr)
2504 self.assertEqual(ancdata, [])
2505 self.checkFlags(flags, eor=True)
2506
2507 def _testRecvmsgBadArgs(self):
2508 self.sendToServer(MSG)
2509
2510
2511class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2512 # Tests for recvmsg_into() which can use any socket type.
2513
2514 def testRecvmsgIntoBadArgs(self):
2515 # Check that recvmsg_into() rejects invalid arguments.
2516 buf = bytearray(len(MSG))
2517 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2518 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2519 len(MSG), 0, 0)
2520 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2521 buf, 0, 0)
2522 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2523 [object()], 0, 0)
2524 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2525 [b"I'm not writable"], 0, 0)
2526 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2527 [buf, object()], 0, 0)
2528 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2529 [buf], -1, 0)
2530 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2531 [buf], object(), 0)
2532 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2533 [buf], 0, object())
2534
2535 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2536 self.assertEqual(nbytes, len(MSG))
2537 self.assertEqual(buf, bytearray(MSG))
2538 self.checkRecvmsgAddress(addr, self.cli_addr)
2539 self.assertEqual(ancdata, [])
2540 self.checkFlags(flags, eor=True)
2541
2542 def _testRecvmsgIntoBadArgs(self):
2543 self.sendToServer(MSG)
2544
2545 def testRecvmsgIntoGenerator(self):
2546 # Receive into buffer obtained from a generator (not a sequence).
2547 buf = bytearray(len(MSG))
2548 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2549 (o for o in [buf]))
2550 self.assertEqual(nbytes, len(MSG))
2551 self.assertEqual(buf, bytearray(MSG))
2552 self.checkRecvmsgAddress(addr, self.cli_addr)
2553 self.assertEqual(ancdata, [])
2554 self.checkFlags(flags, eor=True)
2555
2556 def _testRecvmsgIntoGenerator(self):
2557 self.sendToServer(MSG)
2558
2559 def testRecvmsgIntoArray(self):
2560 # Receive into an array rather than the usual bytearray.
2561 buf = array.array("B", [0] * len(MSG))
2562 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2563 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002564 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002565 self.checkRecvmsgAddress(addr, self.cli_addr)
2566 self.assertEqual(ancdata, [])
2567 self.checkFlags(flags, eor=True)
2568
2569 def _testRecvmsgIntoArray(self):
2570 self.sendToServer(MSG)
2571
2572 def testRecvmsgIntoScatter(self):
2573 # Receive into multiple buffers (scatter write).
2574 b1 = bytearray(b"----")
2575 b2 = bytearray(b"0123456789")
2576 b3 = bytearray(b"--------------")
2577 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2578 [b1, memoryview(b2)[2:9], b3])
2579 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2580 self.assertEqual(b1, bytearray(b"Mary"))
2581 self.assertEqual(b2, bytearray(b"01 had a 9"))
2582 self.assertEqual(b3, bytearray(b"little lamb---"))
2583 self.checkRecvmsgAddress(addr, self.cli_addr)
2584 self.assertEqual(ancdata, [])
2585 self.checkFlags(flags, eor=True)
2586
2587 def _testRecvmsgIntoScatter(self):
2588 self.sendToServer(b"Mary had a little lamb")
2589
2590
2591class CmsgMacroTests(unittest.TestCase):
2592 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2593 # assumptions used by sendmsg() and recvmsg[_into](), which share
2594 # code with these functions.
2595
2596 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002597 try:
2598 import _testcapi
2599 except ImportError:
2600 socklen_t_limit = 0x7fffffff
2601 else:
2602 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002603
2604 @requireAttrs(socket, "CMSG_LEN")
2605 def testCMSG_LEN(self):
2606 # Test CMSG_LEN() with various valid and invalid values,
2607 # checking the assumptions used by recvmsg() and sendmsg().
2608 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2609 values = list(range(257)) + list(range(toobig - 257, toobig))
2610
2611 # struct cmsghdr has at least three members, two of which are ints
2612 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2613 for n in values:
2614 ret = socket.CMSG_LEN(n)
2615 # This is how recvmsg() calculates the data size
2616 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2617 self.assertLessEqual(ret, self.socklen_t_limit)
2618
2619 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2620 # sendmsg() shares code with these functions, and requires
2621 # that it reject values over the limit.
2622 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2623 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2624
2625 @requireAttrs(socket, "CMSG_SPACE")
2626 def testCMSG_SPACE(self):
2627 # Test CMSG_SPACE() with various valid and invalid values,
2628 # checking the assumptions used by sendmsg().
2629 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2630 values = list(range(257)) + list(range(toobig - 257, toobig))
2631
2632 last = socket.CMSG_SPACE(0)
2633 # struct cmsghdr has at least three members, two of which are ints
2634 self.assertGreater(last, array.array("i").itemsize * 2)
2635 for n in values:
2636 ret = socket.CMSG_SPACE(n)
2637 self.assertGreaterEqual(ret, last)
2638 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2639 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2640 self.assertLessEqual(ret, self.socklen_t_limit)
2641 last = ret
2642
2643 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2644 # sendmsg() shares code with these functions, and requires
2645 # that it reject values over the limit.
2646 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2647 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2648
2649
2650class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2651 # Tests for file descriptor passing on Unix-domain sockets.
2652
2653 # Invalid file descriptor value that's unlikely to evaluate to a
2654 # real FD even if one of its bytes is replaced with a different
2655 # value (which shouldn't actually happen).
2656 badfd = -0x5555
2657
2658 def newFDs(self, n):
2659 # Return a list of n file descriptors for newly-created files
2660 # containing their list indices as ASCII numbers.
2661 fds = []
2662 for i in range(n):
2663 fd, path = tempfile.mkstemp()
2664 self.addCleanup(os.unlink, path)
2665 self.addCleanup(os.close, fd)
2666 os.write(fd, str(i).encode())
2667 fds.append(fd)
2668 return fds
2669
2670 def checkFDs(self, fds):
2671 # Check that the file descriptors in the given list contain
2672 # their correct list indices as ASCII numbers.
2673 for n, fd in enumerate(fds):
2674 os.lseek(fd, 0, os.SEEK_SET)
2675 self.assertEqual(os.read(fd, 1024), str(n).encode())
2676
2677 def registerRecvmsgResult(self, result):
2678 self.addCleanup(self.closeRecvmsgFDs, result)
2679
2680 def closeRecvmsgFDs(self, recvmsg_result):
2681 # Close all file descriptors specified in the ancillary data
2682 # of the given return value from recvmsg() or recvmsg_into().
2683 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2684 if (cmsg_level == socket.SOL_SOCKET and
2685 cmsg_type == socket.SCM_RIGHTS):
2686 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002687 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002688 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2689 for fd in fds:
2690 os.close(fd)
2691
2692 def createAndSendFDs(self, n):
2693 # Send n new file descriptors created by newFDs() to the
2694 # server, with the constant MSG as the non-ancillary data.
2695 self.assertEqual(
2696 self.sendmsgToServer([MSG],
2697 [(socket.SOL_SOCKET,
2698 socket.SCM_RIGHTS,
2699 array.array("i", self.newFDs(n)))]),
2700 len(MSG))
2701
2702 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2703 # Check that constant MSG was received with numfds file
2704 # descriptors in a maximum of maxcmsgs control messages (which
2705 # must contain only complete integers). By default, check
2706 # that MSG_CTRUNC is unset, but ignore any flags in
2707 # ignoreflags.
2708 msg, ancdata, flags, addr = result
2709 self.assertEqual(msg, MSG)
2710 self.checkRecvmsgAddress(addr, self.cli_addr)
2711 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2712 ignore=ignoreflags)
2713
2714 self.assertIsInstance(ancdata, list)
2715 self.assertLessEqual(len(ancdata), maxcmsgs)
2716 fds = array.array("i")
2717 for item in ancdata:
2718 self.assertIsInstance(item, tuple)
2719 cmsg_level, cmsg_type, cmsg_data = item
2720 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2721 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2722 self.assertIsInstance(cmsg_data, bytes)
2723 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002724 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002725
2726 self.assertEqual(len(fds), numfds)
2727 self.checkFDs(fds)
2728
2729 def testFDPassSimple(self):
2730 # Pass a single FD (array read from bytes object).
2731 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2732 len(MSG), 10240))
2733
2734 def _testFDPassSimple(self):
2735 self.assertEqual(
2736 self.sendmsgToServer(
2737 [MSG],
2738 [(socket.SOL_SOCKET,
2739 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002740 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002741 len(MSG))
2742
2743 def testMultipleFDPass(self):
2744 # Pass multiple FDs in a single array.
2745 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2746 len(MSG), 10240))
2747
2748 def _testMultipleFDPass(self):
2749 self.createAndSendFDs(4)
2750
2751 @requireAttrs(socket, "CMSG_SPACE")
2752 def testFDPassCMSG_SPACE(self):
2753 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2754 self.checkRecvmsgFDs(
2755 4, self.doRecvmsg(self.serv_sock, len(MSG),
2756 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2757
2758 @testFDPassCMSG_SPACE.client_skip
2759 def _testFDPassCMSG_SPACE(self):
2760 self.createAndSendFDs(4)
2761
2762 def testFDPassCMSG_LEN(self):
2763 # Test using CMSG_LEN() to calculate ancillary buffer size.
2764 self.checkRecvmsgFDs(1,
2765 self.doRecvmsg(self.serv_sock, len(MSG),
2766 socket.CMSG_LEN(4 * SIZEOF_INT)),
2767 # RFC 3542 says implementations may set
2768 # MSG_CTRUNC if there isn't enough space
2769 # for trailing padding.
2770 ignoreflags=socket.MSG_CTRUNC)
2771
2772 def _testFDPassCMSG_LEN(self):
2773 self.createAndSendFDs(1)
2774
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002775 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002776 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002777 @requireAttrs(socket, "CMSG_SPACE")
2778 def testFDPassSeparate(self):
2779 # Pass two FDs in two separate arrays. Arrays may be combined
2780 # into a single control message by the OS.
2781 self.checkRecvmsgFDs(2,
2782 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2783 maxcmsgs=2)
2784
2785 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002786 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002787 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002788 def _testFDPassSeparate(self):
2789 fd0, fd1 = self.newFDs(2)
2790 self.assertEqual(
2791 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2792 socket.SCM_RIGHTS,
2793 array.array("i", [fd0])),
2794 (socket.SOL_SOCKET,
2795 socket.SCM_RIGHTS,
2796 array.array("i", [fd1]))]),
2797 len(MSG))
2798
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002799 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002800 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002801 @requireAttrs(socket, "CMSG_SPACE")
2802 def testFDPassSeparateMinSpace(self):
2803 # Pass two FDs in two separate arrays, receiving them into the
2804 # minimum space for two arrays.
2805 self.checkRecvmsgFDs(2,
2806 self.doRecvmsg(self.serv_sock, len(MSG),
2807 socket.CMSG_SPACE(SIZEOF_INT) +
2808 socket.CMSG_LEN(SIZEOF_INT)),
2809 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2810
2811 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002812 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002813 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002814 def _testFDPassSeparateMinSpace(self):
2815 fd0, fd1 = self.newFDs(2)
2816 self.assertEqual(
2817 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2818 socket.SCM_RIGHTS,
2819 array.array("i", [fd0])),
2820 (socket.SOL_SOCKET,
2821 socket.SCM_RIGHTS,
2822 array.array("i", [fd1]))]),
2823 len(MSG))
2824
2825 def sendAncillaryIfPossible(self, msg, ancdata):
2826 # Try to send msg and ancdata to server, but if the system
2827 # call fails, just send msg with no ancillary data.
2828 try:
2829 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002830 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002831 # Check that it was the system call that failed
2832 self.assertIsInstance(e.errno, int)
2833 nbytes = self.sendmsgToServer([msg])
2834 self.assertEqual(nbytes, len(msg))
2835
Brett Cannon3bbad122015-12-28 17:21:44 -08002836 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002837 def testFDPassEmpty(self):
2838 # Try to pass an empty FD array. Can receive either no array
2839 # or an empty array.
2840 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2841 len(MSG), 10240),
2842 ignoreflags=socket.MSG_CTRUNC)
2843
2844 def _testFDPassEmpty(self):
2845 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2846 socket.SCM_RIGHTS,
2847 b"")])
2848
2849 def testFDPassPartialInt(self):
2850 # Try to pass a truncated FD array.
2851 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2852 len(MSG), 10240)
2853 self.assertEqual(msg, MSG)
2854 self.checkRecvmsgAddress(addr, self.cli_addr)
2855 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2856 self.assertLessEqual(len(ancdata), 1)
2857 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2858 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2859 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2860 self.assertLess(len(cmsg_data), SIZEOF_INT)
2861
2862 def _testFDPassPartialInt(self):
2863 self.sendAncillaryIfPossible(
2864 MSG,
2865 [(socket.SOL_SOCKET,
2866 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002867 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002868
2869 @requireAttrs(socket, "CMSG_SPACE")
2870 def testFDPassPartialIntInMiddle(self):
2871 # Try to pass two FD arrays, the first of which is truncated.
2872 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2873 len(MSG), 10240)
2874 self.assertEqual(msg, MSG)
2875 self.checkRecvmsgAddress(addr, self.cli_addr)
2876 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2877 self.assertLessEqual(len(ancdata), 2)
2878 fds = array.array("i")
2879 # Arrays may have been combined in a single control message
2880 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2881 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2882 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002883 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002884 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2885 self.assertLessEqual(len(fds), 2)
2886 self.checkFDs(fds)
2887
2888 @testFDPassPartialIntInMiddle.client_skip
2889 def _testFDPassPartialIntInMiddle(self):
2890 fd0, fd1 = self.newFDs(2)
2891 self.sendAncillaryIfPossible(
2892 MSG,
2893 [(socket.SOL_SOCKET,
2894 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002895 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002896 (socket.SOL_SOCKET,
2897 socket.SCM_RIGHTS,
2898 array.array("i", [fd1]))])
2899
2900 def checkTruncatedHeader(self, result, ignoreflags=0):
2901 # Check that no ancillary data items are returned when data is
2902 # truncated inside the cmsghdr structure.
2903 msg, ancdata, flags, addr = result
2904 self.assertEqual(msg, MSG)
2905 self.checkRecvmsgAddress(addr, self.cli_addr)
2906 self.assertEqual(ancdata, [])
2907 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2908 ignore=ignoreflags)
2909
2910 def testCmsgTruncNoBufSize(self):
2911 # Check that no ancillary data is received when no buffer size
2912 # is specified.
2913 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2914 # BSD seems to set MSG_CTRUNC only
2915 # if an item has been partially
2916 # received.
2917 ignoreflags=socket.MSG_CTRUNC)
2918
2919 def _testCmsgTruncNoBufSize(self):
2920 self.createAndSendFDs(1)
2921
2922 def testCmsgTrunc0(self):
2923 # Check that no ancillary data is received when buffer size is 0.
2924 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2925 ignoreflags=socket.MSG_CTRUNC)
2926
2927 def _testCmsgTrunc0(self):
2928 self.createAndSendFDs(1)
2929
2930 # Check that no ancillary data is returned for various non-zero
2931 # (but still too small) buffer sizes.
2932
2933 def testCmsgTrunc1(self):
2934 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2935
2936 def _testCmsgTrunc1(self):
2937 self.createAndSendFDs(1)
2938
2939 def testCmsgTrunc2Int(self):
2940 # The cmsghdr structure has at least three members, two of
2941 # which are ints, so we still shouldn't see any ancillary
2942 # data.
2943 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2944 SIZEOF_INT * 2))
2945
2946 def _testCmsgTrunc2Int(self):
2947 self.createAndSendFDs(1)
2948
2949 def testCmsgTruncLen0Minus1(self):
2950 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2951 socket.CMSG_LEN(0) - 1))
2952
2953 def _testCmsgTruncLen0Minus1(self):
2954 self.createAndSendFDs(1)
2955
2956 # The following tests try to truncate the control message in the
2957 # middle of the FD array.
2958
2959 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2960 # Check that file descriptor data is truncated to between
2961 # mindata and maxdata bytes when received with buffer size
2962 # ancbuf, and that any complete file descriptor numbers are
2963 # valid.
2964 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2965 len(MSG), ancbuf)
2966 self.assertEqual(msg, MSG)
2967 self.checkRecvmsgAddress(addr, self.cli_addr)
2968 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2969
2970 if mindata == 0 and ancdata == []:
2971 return
2972 self.assertEqual(len(ancdata), 1)
2973 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2974 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2975 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2976 self.assertGreaterEqual(len(cmsg_data), mindata)
2977 self.assertLessEqual(len(cmsg_data), maxdata)
2978 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002979 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002980 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2981 self.checkFDs(fds)
2982
2983 def testCmsgTruncLen0(self):
2984 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2985
2986 def _testCmsgTruncLen0(self):
2987 self.createAndSendFDs(1)
2988
2989 def testCmsgTruncLen0Plus1(self):
2990 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2991
2992 def _testCmsgTruncLen0Plus1(self):
2993 self.createAndSendFDs(2)
2994
2995 def testCmsgTruncLen1(self):
2996 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2997 maxdata=SIZEOF_INT)
2998
2999 def _testCmsgTruncLen1(self):
3000 self.createAndSendFDs(2)
3001
3002 def testCmsgTruncLen2Minus1(self):
3003 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3004 maxdata=(2 * SIZEOF_INT) - 1)
3005
3006 def _testCmsgTruncLen2Minus1(self):
3007 self.createAndSendFDs(2)
3008
3009
3010class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3011 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3012 # features of the RFC 3542 Advanced Sockets API for IPv6.
3013 # Currently we can only handle certain data items (e.g. traffic
3014 # class, hop limit, MTU discovery and fragmentation settings)
3015 # without resorting to unportable means such as the struct module,
3016 # but the tests here are aimed at testing the ancillary data
3017 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3018 # itself.
3019
3020 # Test value to use when setting hop limit of packet
3021 hop_limit = 2
3022
3023 # Test value to use when setting traffic class of packet.
3024 # -1 means "use kernel default".
3025 traffic_class = -1
3026
3027 def ancillaryMapping(self, ancdata):
3028 # Given ancillary data list ancdata, return a mapping from
3029 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3030 # Check that no (level, type) pair appears more than once.
3031 d = {}
3032 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3033 self.assertNotIn((cmsg_level, cmsg_type), d)
3034 d[(cmsg_level, cmsg_type)] = cmsg_data
3035 return d
3036
3037 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3038 # Receive hop limit into ancbufsize bytes of ancillary data
3039 # space. Check that data is MSG, ancillary data is not
3040 # truncated (but ignore any flags in ignoreflags), and hop
3041 # limit is between 0 and maxhop inclusive.
3042 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3043 socket.IPV6_RECVHOPLIMIT, 1)
3044 self.misc_event.set()
3045 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3046 len(MSG), ancbufsize)
3047
3048 self.assertEqual(msg, MSG)
3049 self.checkRecvmsgAddress(addr, self.cli_addr)
3050 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3051 ignore=ignoreflags)
3052
3053 self.assertEqual(len(ancdata), 1)
3054 self.assertIsInstance(ancdata[0], tuple)
3055 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3056 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3057 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3058 self.assertIsInstance(cmsg_data, bytes)
3059 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3060 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003061 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003062 self.assertGreaterEqual(a[0], 0)
3063 self.assertLessEqual(a[0], maxhop)
3064
3065 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3066 def testRecvHopLimit(self):
3067 # Test receiving the packet hop limit as ancillary data.
3068 self.checkHopLimit(ancbufsize=10240)
3069
3070 @testRecvHopLimit.client_skip
3071 def _testRecvHopLimit(self):
3072 # Need to wait until server has asked to receive ancillary
3073 # data, as implementations are not required to buffer it
3074 # otherwise.
3075 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3076 self.sendToServer(MSG)
3077
3078 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3079 def testRecvHopLimitCMSG_SPACE(self):
3080 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3081 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3082
3083 @testRecvHopLimitCMSG_SPACE.client_skip
3084 def _testRecvHopLimitCMSG_SPACE(self):
3085 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3086 self.sendToServer(MSG)
3087
3088 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3089 # 3542 says portable applications must provide space for trailing
3090 # padding. Implementations may set MSG_CTRUNC if there isn't
3091 # enough space for the padding.
3092
3093 @requireAttrs(socket.socket, "sendmsg")
3094 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3095 def testSetHopLimit(self):
3096 # Test setting hop limit on outgoing packet and receiving it
3097 # at the other end.
3098 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3099
3100 @testSetHopLimit.client_skip
3101 def _testSetHopLimit(self):
3102 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3103 self.assertEqual(
3104 self.sendmsgToServer([MSG],
3105 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3106 array.array("i", [self.hop_limit]))]),
3107 len(MSG))
3108
3109 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3110 ignoreflags=0):
3111 # Receive traffic class and hop limit into ancbufsize bytes of
3112 # ancillary data space. Check that data is MSG, ancillary
3113 # data is not truncated (but ignore any flags in ignoreflags),
3114 # and traffic class and hop limit are in range (hop limit no
3115 # more than maxhop).
3116 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3117 socket.IPV6_RECVHOPLIMIT, 1)
3118 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3119 socket.IPV6_RECVTCLASS, 1)
3120 self.misc_event.set()
3121 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3122 len(MSG), ancbufsize)
3123
3124 self.assertEqual(msg, MSG)
3125 self.checkRecvmsgAddress(addr, self.cli_addr)
3126 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3127 ignore=ignoreflags)
3128 self.assertEqual(len(ancdata), 2)
3129 ancmap = self.ancillaryMapping(ancdata)
3130
3131 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3132 self.assertEqual(len(tcdata), SIZEOF_INT)
3133 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003134 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003135 self.assertGreaterEqual(a[0], 0)
3136 self.assertLessEqual(a[0], 255)
3137
3138 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3139 self.assertEqual(len(hldata), SIZEOF_INT)
3140 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003141 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003142 self.assertGreaterEqual(a[0], 0)
3143 self.assertLessEqual(a[0], maxhop)
3144
3145 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3146 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3147 def testRecvTrafficClassAndHopLimit(self):
3148 # Test receiving traffic class and hop limit as ancillary data.
3149 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3150
3151 @testRecvTrafficClassAndHopLimit.client_skip
3152 def _testRecvTrafficClassAndHopLimit(self):
3153 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3154 self.sendToServer(MSG)
3155
3156 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3157 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3158 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3159 # Test receiving traffic class and hop limit, using
3160 # CMSG_SPACE() to calculate buffer size.
3161 self.checkTrafficClassAndHopLimit(
3162 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3163
3164 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3165 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3166 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3167 self.sendToServer(MSG)
3168
3169 @requireAttrs(socket.socket, "sendmsg")
3170 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3171 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3172 def testSetTrafficClassAndHopLimit(self):
3173 # Test setting traffic class and hop limit on outgoing packet,
3174 # and receiving them at the other end.
3175 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3176 maxhop=self.hop_limit)
3177
3178 @testSetTrafficClassAndHopLimit.client_skip
3179 def _testSetTrafficClassAndHopLimit(self):
3180 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3181 self.assertEqual(
3182 self.sendmsgToServer([MSG],
3183 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3184 array.array("i", [self.traffic_class])),
3185 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3186 array.array("i", [self.hop_limit]))]),
3187 len(MSG))
3188
3189 @requireAttrs(socket.socket, "sendmsg")
3190 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3191 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3192 def testOddCmsgSize(self):
3193 # Try to send ancillary data with first item one byte too
3194 # long. Fall back to sending with correct size if this fails,
3195 # and check that second item was handled correctly.
3196 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3197 maxhop=self.hop_limit)
3198
3199 @testOddCmsgSize.client_skip
3200 def _testOddCmsgSize(self):
3201 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3202 try:
3203 nbytes = self.sendmsgToServer(
3204 [MSG],
3205 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003206 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003207 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3208 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003209 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003210 self.assertIsInstance(e.errno, int)
3211 nbytes = self.sendmsgToServer(
3212 [MSG],
3213 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3214 array.array("i", [self.traffic_class])),
3215 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3216 array.array("i", [self.hop_limit]))])
3217 self.assertEqual(nbytes, len(MSG))
3218
3219 # Tests for proper handling of truncated ancillary data
3220
3221 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3222 # Receive hop limit into ancbufsize bytes of ancillary data
3223 # space, which should be too small to contain the ancillary
3224 # data header (if ancbufsize is None, pass no second argument
3225 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3226 # (unless included in ignoreflags), and no ancillary data is
3227 # returned.
3228 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3229 socket.IPV6_RECVHOPLIMIT, 1)
3230 self.misc_event.set()
3231 args = () if ancbufsize is None else (ancbufsize,)
3232 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3233 len(MSG), *args)
3234
3235 self.assertEqual(msg, MSG)
3236 self.checkRecvmsgAddress(addr, self.cli_addr)
3237 self.assertEqual(ancdata, [])
3238 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3239 ignore=ignoreflags)
3240
3241 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3242 def testCmsgTruncNoBufSize(self):
3243 # Check that no ancillary data is received when no ancillary
3244 # buffer size is provided.
3245 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3246 # BSD seems to set
3247 # MSG_CTRUNC only if an item
3248 # has been partially
3249 # received.
3250 ignoreflags=socket.MSG_CTRUNC)
3251
3252 @testCmsgTruncNoBufSize.client_skip
3253 def _testCmsgTruncNoBufSize(self):
3254 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3255 self.sendToServer(MSG)
3256
3257 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3258 def testSingleCmsgTrunc0(self):
3259 # Check that no ancillary data is received when ancillary
3260 # buffer size is zero.
3261 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3262 ignoreflags=socket.MSG_CTRUNC)
3263
3264 @testSingleCmsgTrunc0.client_skip
3265 def _testSingleCmsgTrunc0(self):
3266 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3267 self.sendToServer(MSG)
3268
3269 # Check that no ancillary data is returned for various non-zero
3270 # (but still too small) buffer sizes.
3271
3272 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3273 def testSingleCmsgTrunc1(self):
3274 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3275
3276 @testSingleCmsgTrunc1.client_skip
3277 def _testSingleCmsgTrunc1(self):
3278 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3279 self.sendToServer(MSG)
3280
3281 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3282 def testSingleCmsgTrunc2Int(self):
3283 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3284
3285 @testSingleCmsgTrunc2Int.client_skip
3286 def _testSingleCmsgTrunc2Int(self):
3287 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3288 self.sendToServer(MSG)
3289
3290 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3291 def testSingleCmsgTruncLen0Minus1(self):
3292 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3293
3294 @testSingleCmsgTruncLen0Minus1.client_skip
3295 def _testSingleCmsgTruncLen0Minus1(self):
3296 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3297 self.sendToServer(MSG)
3298
3299 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3300 def testSingleCmsgTruncInData(self):
3301 # Test truncation of a control message inside its associated
3302 # data. The message may be returned with its data truncated,
3303 # or not returned at all.
3304 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3305 socket.IPV6_RECVHOPLIMIT, 1)
3306 self.misc_event.set()
3307 msg, ancdata, flags, addr = self.doRecvmsg(
3308 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3309
3310 self.assertEqual(msg, MSG)
3311 self.checkRecvmsgAddress(addr, self.cli_addr)
3312 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3313
3314 self.assertLessEqual(len(ancdata), 1)
3315 if ancdata:
3316 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3317 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3318 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3319 self.assertLess(len(cmsg_data), SIZEOF_INT)
3320
3321 @testSingleCmsgTruncInData.client_skip
3322 def _testSingleCmsgTruncInData(self):
3323 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3324 self.sendToServer(MSG)
3325
3326 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3327 # Receive traffic class and hop limit into ancbufsize bytes of
3328 # ancillary data space, which should be large enough to
3329 # contain the first item, but too small to contain the header
3330 # of the second. Check that data is MSG, MSG_CTRUNC is set
3331 # (unless included in ignoreflags), and only one ancillary
3332 # data item is returned.
3333 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3334 socket.IPV6_RECVHOPLIMIT, 1)
3335 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3336 socket.IPV6_RECVTCLASS, 1)
3337 self.misc_event.set()
3338 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3339 len(MSG), ancbufsize)
3340
3341 self.assertEqual(msg, MSG)
3342 self.checkRecvmsgAddress(addr, self.cli_addr)
3343 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3344 ignore=ignoreflags)
3345
3346 self.assertEqual(len(ancdata), 1)
3347 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3348 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3349 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3350 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3351 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003352 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003353 self.assertGreaterEqual(a[0], 0)
3354 self.assertLessEqual(a[0], 255)
3355
3356 # Try the above test with various buffer sizes.
3357
3358 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3359 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3360 def testSecondCmsgTrunc0(self):
3361 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3362 ignoreflags=socket.MSG_CTRUNC)
3363
3364 @testSecondCmsgTrunc0.client_skip
3365 def _testSecondCmsgTrunc0(self):
3366 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3367 self.sendToServer(MSG)
3368
3369 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3370 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3371 def testSecondCmsgTrunc1(self):
3372 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3373
3374 @testSecondCmsgTrunc1.client_skip
3375 def _testSecondCmsgTrunc1(self):
3376 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3377 self.sendToServer(MSG)
3378
3379 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3380 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3381 def testSecondCmsgTrunc2Int(self):
3382 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3383 2 * SIZEOF_INT)
3384
3385 @testSecondCmsgTrunc2Int.client_skip
3386 def _testSecondCmsgTrunc2Int(self):
3387 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3388 self.sendToServer(MSG)
3389
3390 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3391 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3392 def testSecondCmsgTruncLen0Minus1(self):
3393 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3394 socket.CMSG_LEN(0) - 1)
3395
3396 @testSecondCmsgTruncLen0Minus1.client_skip
3397 def _testSecondCmsgTruncLen0Minus1(self):
3398 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3399 self.sendToServer(MSG)
3400
3401 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3402 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3403 def testSecomdCmsgTruncInData(self):
3404 # Test truncation of the second of two control messages inside
3405 # its associated data.
3406 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3407 socket.IPV6_RECVHOPLIMIT, 1)
3408 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3409 socket.IPV6_RECVTCLASS, 1)
3410 self.misc_event.set()
3411 msg, ancdata, flags, addr = self.doRecvmsg(
3412 self.serv_sock, len(MSG),
3413 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3414
3415 self.assertEqual(msg, MSG)
3416 self.checkRecvmsgAddress(addr, self.cli_addr)
3417 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3418
3419 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3420
3421 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3422 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3423 cmsg_types.remove(cmsg_type)
3424 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3425 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003426 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003427 self.assertGreaterEqual(a[0], 0)
3428 self.assertLessEqual(a[0], 255)
3429
3430 if ancdata:
3431 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3432 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3433 cmsg_types.remove(cmsg_type)
3434 self.assertLess(len(cmsg_data), SIZEOF_INT)
3435
3436 self.assertEqual(ancdata, [])
3437
3438 @testSecomdCmsgTruncInData.client_skip
3439 def _testSecomdCmsgTruncInData(self):
3440 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3441 self.sendToServer(MSG)
3442
3443
3444# Derive concrete test classes for different socket types.
3445
3446class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3447 SendrecvmsgConnectionlessBase,
3448 ThreadedSocketTestMixin, UDPTestBase):
3449 pass
3450
3451@requireAttrs(socket.socket, "sendmsg")
3452@unittest.skipUnless(thread, 'Threading required for this test.')
3453class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3454 pass
3455
3456@requireAttrs(socket.socket, "recvmsg")
3457@unittest.skipUnless(thread, 'Threading required for this test.')
3458class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3459 pass
3460
3461@requireAttrs(socket.socket, "recvmsg_into")
3462@unittest.skipUnless(thread, 'Threading required for this test.')
3463class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3464 pass
3465
3466
3467class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3468 SendrecvmsgConnectionlessBase,
3469 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003470
3471 def checkRecvmsgAddress(self, addr1, addr2):
3472 # Called to compare the received address with the address of
3473 # the peer, ignoring scope ID
3474 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003475
3476@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003477@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003478@requireSocket("AF_INET6", "SOCK_DGRAM")
3479@unittest.skipUnless(thread, 'Threading required for this test.')
3480class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3481 pass
3482
3483@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003484@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003485@requireSocket("AF_INET6", "SOCK_DGRAM")
3486@unittest.skipUnless(thread, 'Threading required for this test.')
3487class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3488 pass
3489
3490@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003491@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003492@requireSocket("AF_INET6", "SOCK_DGRAM")
3493@unittest.skipUnless(thread, 'Threading required for this test.')
3494class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3495 pass
3496
3497@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003498@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003499@requireAttrs(socket, "IPPROTO_IPV6")
3500@requireSocket("AF_INET6", "SOCK_DGRAM")
3501@unittest.skipUnless(thread, 'Threading required for this test.')
3502class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3503 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@requireAttrs(socket, "IPPROTO_IPV6")
3509@requireSocket("AF_INET6", "SOCK_DGRAM")
3510@unittest.skipUnless(thread, 'Threading required for this test.')
3511class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3512 RFC3542AncillaryTest,
3513 SendrecvmsgUDP6TestBase):
3514 pass
3515
3516
3517class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3518 ConnectedStreamTestMixin, TCPTestBase):
3519 pass
3520
3521@requireAttrs(socket.socket, "sendmsg")
3522@unittest.skipUnless(thread, 'Threading required for this test.')
3523class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3524 pass
3525
3526@requireAttrs(socket.socket, "recvmsg")
3527@unittest.skipUnless(thread, 'Threading required for this test.')
3528class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3529 SendrecvmsgTCPTestBase):
3530 pass
3531
3532@requireAttrs(socket.socket, "recvmsg_into")
3533@unittest.skipUnless(thread, 'Threading required for this test.')
3534class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3535 SendrecvmsgTCPTestBase):
3536 pass
3537
3538
3539class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3540 SendrecvmsgConnectedBase,
3541 ConnectedStreamTestMixin, SCTPStreamBase):
3542 pass
3543
3544@requireAttrs(socket.socket, "sendmsg")
3545@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3546@unittest.skipUnless(thread, 'Threading required for this test.')
3547class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3548 pass
3549
3550@requireAttrs(socket.socket, "recvmsg")
3551@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3552@unittest.skipUnless(thread, 'Threading required for this test.')
3553class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3554 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003555
3556 def testRecvmsgEOF(self):
3557 try:
3558 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3559 except OSError as e:
3560 if e.errno != errno.ENOTCONN:
3561 raise
3562 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003563
3564@requireAttrs(socket.socket, "recvmsg_into")
3565@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3566@unittest.skipUnless(thread, 'Threading required for this test.')
3567class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3568 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003569
3570 def testRecvmsgEOF(self):
3571 try:
3572 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3573 except OSError as e:
3574 if e.errno != errno.ENOTCONN:
3575 raise
3576 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003577
3578
3579class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3580 ConnectedStreamTestMixin, UnixStreamBase):
3581 pass
3582
3583@requireAttrs(socket.socket, "sendmsg")
3584@requireAttrs(socket, "AF_UNIX")
3585@unittest.skipUnless(thread, 'Threading required for this test.')
3586class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3587 pass
3588
3589@requireAttrs(socket.socket, "recvmsg")
3590@requireAttrs(socket, "AF_UNIX")
3591@unittest.skipUnless(thread, 'Threading required for this test.')
3592class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3593 SendrecvmsgUnixStreamTestBase):
3594 pass
3595
3596@requireAttrs(socket.socket, "recvmsg_into")
3597@requireAttrs(socket, "AF_UNIX")
3598@unittest.skipUnless(thread, 'Threading required for this test.')
3599class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3600 SendrecvmsgUnixStreamTestBase):
3601 pass
3602
3603@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3604@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3605@unittest.skipUnless(thread, 'Threading required for this test.')
3606class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3607 pass
3608
3609@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3610@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3611@unittest.skipUnless(thread, 'Threading required for this test.')
3612class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3613 SendrecvmsgUnixStreamTestBase):
3614 pass
3615
3616
3617# Test interrupting the interruptible send/receive methods with a
3618# signal when a timeout is set. These tests avoid having multiple
3619# threads alive during the test so that the OS cannot deliver the
3620# signal to the wrong one.
3621
3622class InterruptedTimeoutBase(unittest.TestCase):
3623 # Base class for interrupted send/receive tests. Installs an
3624 # empty handler for SIGALRM and removes it on teardown, along with
3625 # any scheduled alarms.
3626
3627 def setUp(self):
3628 super().setUp()
3629 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003630 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003631 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3632 self.addCleanup(self.setAlarm, 0)
3633
3634 # Timeout for socket operations
3635 timeout = 4.0
3636
3637 # Provide setAlarm() method to schedule delivery of SIGALRM after
3638 # given number of seconds, or cancel it if zero, and an
3639 # appropriate time value to use. Use setitimer() if available.
3640 if hasattr(signal, "setitimer"):
3641 alarm_time = 0.05
3642
3643 def setAlarm(self, seconds):
3644 signal.setitimer(signal.ITIMER_REAL, seconds)
3645 else:
3646 # Old systems may deliver the alarm up to one second early
3647 alarm_time = 2
3648
3649 def setAlarm(self, seconds):
3650 signal.alarm(seconds)
3651
3652
3653# Require siginterrupt() in order to ensure that system calls are
3654# interrupted by default.
3655@requireAttrs(signal, "siginterrupt")
3656@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3657 "Don't have signal.alarm or signal.setitimer")
3658class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3659 # Test interrupting the recv*() methods with signals when a
3660 # timeout is set.
3661
3662 def setUp(self):
3663 super().setUp()
3664 self.serv.settimeout(self.timeout)
3665
3666 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003667 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003668 # errno of EINTR when interrupted by a signal.
3669 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003670 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003671 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003672
3673 def testInterruptedRecvTimeout(self):
3674 self.checkInterruptedRecv(self.serv.recv, 1024)
3675
3676 def testInterruptedRecvIntoTimeout(self):
3677 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3678
3679 def testInterruptedRecvfromTimeout(self):
3680 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3681
3682 def testInterruptedRecvfromIntoTimeout(self):
3683 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3684
3685 @requireAttrs(socket.socket, "recvmsg")
3686 def testInterruptedRecvmsgTimeout(self):
3687 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3688
3689 @requireAttrs(socket.socket, "recvmsg_into")
3690 def testInterruptedRecvmsgIntoTimeout(self):
3691 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3692
3693
3694# Require siginterrupt() in order to ensure that system calls are
3695# interrupted by default.
3696@requireAttrs(signal, "siginterrupt")
3697@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3698 "Don't have signal.alarm or signal.setitimer")
3699@unittest.skipUnless(thread, 'Threading required for this test.')
3700class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3701 ThreadSafeCleanupTestCase,
3702 SocketListeningTestMixin, TCPTestBase):
3703 # Test interrupting the interruptible send*() methods with signals
3704 # when a timeout is set.
3705
3706 def setUp(self):
3707 super().setUp()
3708 self.serv_conn = self.newSocket()
3709 self.addCleanup(self.serv_conn.close)
3710 # Use a thread to complete the connection, but wait for it to
3711 # terminate before running the test, so that there is only one
3712 # thread to accept the signal.
3713 cli_thread = threading.Thread(target=self.doConnect)
3714 cli_thread.start()
3715 self.cli_conn, addr = self.serv.accept()
3716 self.addCleanup(self.cli_conn.close)
3717 cli_thread.join()
3718 self.serv_conn.settimeout(self.timeout)
3719
3720 def doConnect(self):
3721 self.serv_conn.connect(self.serv_addr)
3722
3723 def checkInterruptedSend(self, func, *args, **kwargs):
3724 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003725 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003726 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003727 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003728 while True:
3729 self.setAlarm(self.alarm_time)
3730 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003731
Ned Deilyc5640382014-02-03 13:58:31 -08003732 # Issue #12958: The following tests have problems on OS X prior to 10.7
3733 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003734 def testInterruptedSendTimeout(self):
3735 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3736
Ned Deilyc5640382014-02-03 13:58:31 -08003737 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003738 def testInterruptedSendtoTimeout(self):
3739 # Passing an actual address here as Python's wrapper for
3740 # sendto() doesn't allow passing a zero-length one; POSIX
3741 # requires that the address is ignored since the socket is
3742 # connection-mode, however.
3743 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3744 self.serv_addr)
3745
Ned Deilyc5640382014-02-03 13:58:31 -08003746 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003747 @requireAttrs(socket.socket, "sendmsg")
3748 def testInterruptedSendmsgTimeout(self):
3749 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3750
3751
Victor Stinner45df8202010-04-28 22:31:17 +00003752@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003753class TCPCloserTest(ThreadedTCPSocketTest):
3754
3755 def testClose(self):
3756 conn, addr = self.serv.accept()
3757 conn.close()
3758
3759 sd = self.cli
3760 read, write, err = select.select([sd], [], [], 1.0)
3761 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003762 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003763
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003764 # Calling close() many times should be safe.
3765 conn.close()
3766 conn.close()
3767
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003768 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003769 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003770 time.sleep(1.0)
3771
Victor Stinner45df8202010-04-28 22:31:17 +00003772@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003773class BasicSocketPairTest(SocketPairTest):
3774
3775 def __init__(self, methodName='runTest'):
3776 SocketPairTest.__init__(self, methodName=methodName)
3777
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003778 def _check_defaults(self, sock):
3779 self.assertIsInstance(sock, socket.socket)
3780 if hasattr(socket, 'AF_UNIX'):
3781 self.assertEqual(sock.family, socket.AF_UNIX)
3782 else:
3783 self.assertEqual(sock.family, socket.AF_INET)
3784 self.assertEqual(sock.type, socket.SOCK_STREAM)
3785 self.assertEqual(sock.proto, 0)
3786
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003787 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003788 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003789
3790 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003791 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003792
Dave Cole331708b2004-08-09 04:51:41 +00003793 def testRecv(self):
3794 msg = self.serv.recv(1024)
3795 self.assertEqual(msg, MSG)
3796
3797 def _testRecv(self):
3798 self.cli.send(MSG)
3799
3800 def testSend(self):
3801 self.serv.send(MSG)
3802
3803 def _testSend(self):
3804 msg = self.cli.recv(1024)
3805 self.assertEqual(msg, MSG)
3806
Victor Stinner45df8202010-04-28 22:31:17 +00003807@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003808class NonBlockingTCPTests(ThreadedTCPSocketTest):
3809
3810 def __init__(self, methodName='runTest'):
3811 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3812
3813 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003814 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003815 self.serv.setblocking(True)
3816 self.assertIsNone(self.serv.gettimeout())
3817 self.serv.setblocking(False)
3818 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003819 start = time.time()
3820 try:
3821 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003822 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003823 pass
3824 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003825 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003826
3827 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003828 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003829
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003830 @support.cpython_only
3831 def testSetBlocking_overflow(self):
3832 # Issue 15989
3833 import _testcapi
3834 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3835 self.skipTest('needs UINT_MAX < ULONG_MAX')
3836 self.serv.setblocking(False)
3837 self.assertEqual(self.serv.gettimeout(), 0.0)
3838 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3839 self.assertIsNone(self.serv.gettimeout())
3840
3841 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3842
Serhiy Storchaka43767632013-11-03 21:31:38 +02003843 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3844 'test needs socket.SOCK_NONBLOCK')
3845 @support.requires_linux_version(2, 6, 28)
3846 def testInitNonBlocking(self):
3847 # reinit server socket
3848 self.serv.close()
3849 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3850 socket.SOCK_NONBLOCK)
3851 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003852 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003853 # actual testing
3854 start = time.time()
3855 try:
3856 self.serv.accept()
3857 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003858 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003859 end = time.time()
3860 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3861
3862 def _testInitNonBlocking(self):
3863 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003864
Antoine Pitrou600232b2011-01-05 21:03:42 +00003865 def testInheritFlags(self):
3866 # Issue #7995: when calling accept() on a listening socket with a
3867 # timeout, the resulting socket should not be non-blocking.
3868 self.serv.settimeout(10)
3869 try:
3870 conn, addr = self.serv.accept()
3871 message = conn.recv(len(MSG))
3872 finally:
3873 conn.close()
3874 self.serv.settimeout(None)
3875
3876 def _testInheritFlags(self):
3877 time.sleep(0.1)
3878 self.cli.connect((HOST, self.port))
3879 time.sleep(0.5)
3880 self.cli.send(MSG)
3881
Guido van Rossum24e4af82002-06-12 19:18:08 +00003882 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003883 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003884 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003885 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003886 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003887 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003888 pass
3889 else:
3890 self.fail("Error trying to do non-blocking accept.")
3891 read, write, err = select.select([self.serv], [], [])
3892 if self.serv in read:
3893 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07003894 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00003895 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003896 else:
3897 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003898
Guido van Rossum24e4af82002-06-12 19:18:08 +00003899 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003900 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003901 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003902
3903 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003904 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003905 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003906 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003907
3908 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003909 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003910 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003911
3912 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003913 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003914 conn, addr = self.serv.accept()
3915 conn.setblocking(0)
3916 try:
3917 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003918 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003919 pass
3920 else:
3921 self.fail("Error trying to do non-blocking recv.")
3922 read, write, err = select.select([conn], [], [])
3923 if conn in read:
3924 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003925 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003926 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003927 else:
3928 self.fail("Error during select call to non-blocking socket.")
3929
3930 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003931 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003932 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003933 self.cli.send(MSG)
3934
Victor Stinner45df8202010-04-28 22:31:17 +00003935@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003936class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003937 """Unit tests for the object returned by socket.makefile()
3938
Antoine Pitrou834bd812010-10-13 16:17:14 +00003939 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003940 the client connection. You can read from this file to
3941 get output from the server.
3942
Antoine Pitrou834bd812010-10-13 16:17:14 +00003943 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003944 server connection. You can write to this file to send output
3945 to the client.
3946 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003947
Guido van Rossume9f66142002-08-07 15:46:19 +00003948 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003949 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003950 errors = 'strict'
3951 newline = None
3952
3953 read_mode = 'rb'
3954 read_msg = MSG
3955 write_mode = 'wb'
3956 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003957
Guido van Rossum24e4af82002-06-12 19:18:08 +00003958 def __init__(self, methodName='runTest'):
3959 SocketConnectedTest.__init__(self, methodName=methodName)
3960
3961 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003962 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3963 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003964 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003965 self.read_file = self.cli_conn.makefile(
3966 self.read_mode, self.bufsize,
3967 encoding = self.encoding,
3968 errors = self.errors,
3969 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003970
3971 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003972 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003973 self.read_file.close()
3974 self.assertTrue(self.read_file.closed)
3975 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003976 SocketConnectedTest.tearDown(self)
3977
3978 def clientSetUp(self):
3979 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003980 self.write_file = self.serv_conn.makefile(
3981 self.write_mode, self.bufsize,
3982 encoding = self.encoding,
3983 errors = self.errors,
3984 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003985
3986 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003987 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003988 self.write_file.close()
3989 self.assertTrue(self.write_file.closed)
3990 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003991 SocketConnectedTest.clientTearDown(self)
3992
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003993 def testReadAfterTimeout(self):
3994 # Issue #7322: A file object must disallow further reads
3995 # after a timeout has occurred.
3996 self.cli_conn.settimeout(1)
3997 self.read_file.read(3)
3998 # First read raises a timeout
3999 self.assertRaises(socket.timeout, self.read_file.read, 1)
4000 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004001 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004002 self.read_file.read(1)
4003 self.assertIn("cannot read from timed out object", str(ctx.exception))
4004
4005 def _testReadAfterTimeout(self):
4006 self.write_file.write(self.write_msg[0:3])
4007 self.write_file.flush()
4008 self.serv_finished.wait()
4009
Guido van Rossum24e4af82002-06-12 19:18:08 +00004010 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004011 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004012 first_seg = self.read_file.read(len(self.read_msg)-3)
4013 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004014 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004015 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004016
4017 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004018 self.write_file.write(self.write_msg)
4019 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004020
Guido van Rossum8c943832002-08-08 01:00:28 +00004021 def testFullRead(self):
4022 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004023 msg = self.read_file.read()
4024 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004025
4026 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004027 self.write_file.write(self.write_msg)
4028 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004029
Guido van Rossum24e4af82002-06-12 19:18:08 +00004030 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004031 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004032 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004033 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004034 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004035 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004036 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004037 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004038 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004039
4040 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004041 self.write_file.write(self.write_msg)
4042 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004043
4044 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004045 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004046 line = self.read_file.readline()
4047 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004048
4049 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004050 self.write_file.write(self.write_msg)
4051 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004052
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004053 def testCloseAfterMakefile(self):
4054 # The file returned by makefile should keep the socket open.
4055 self.cli_conn.close()
4056 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004057 msg = self.read_file.read()
4058 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004059
4060 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004061 self.write_file.write(self.write_msg)
4062 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004063
4064 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004065 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004066 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004067 if isinstance(self.read_msg, str):
4068 msg = msg.decode()
4069 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004070
4071 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004072 self.write_file.write(self.write_msg)
4073 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004074
Tim Peters116d83c2004-03-28 02:20:45 +00004075 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004076 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004077
4078 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004079 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004080
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004081 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004082 self.assertEqual(self.read_file.mode, self.read_mode)
4083 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004084
4085 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004086 self.assertEqual(self.write_file.mode, self.write_mode)
4087 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004088
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004089 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004090 self.read_file.close()
4091 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004092 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004093 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004094
4095 def _testRealClose(self):
4096 pass
4097
4098
Guido van Rossume9f66142002-08-07 15:46:19 +00004099class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4100
4101 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004102
Guido van Rossume9f66142002-08-07 15:46:19 +00004103 In this case (and in this case only), it should be possible to
4104 create a file object, read a line from it, create another file
4105 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004106 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004107 when reading multiple requests from the same socket."""
4108
4109 bufsize = 0 # Use unbuffered mode
4110
4111 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004112 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004113 line = self.read_file.readline() # first line
4114 self.assertEqual(line, b"A. " + self.write_msg) # first line
4115 self.read_file = self.cli_conn.makefile('rb', 0)
4116 line = self.read_file.readline() # second line
4117 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004118
4119 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004120 self.write_file.write(b"A. " + self.write_msg)
4121 self.write_file.write(b"B. " + self.write_msg)
4122 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004123
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004124 def testMakefileClose(self):
4125 # The file returned by makefile should keep the socket open...
4126 self.cli_conn.close()
4127 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004128 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004129 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004130 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004131 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004132
4133 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004134 self.write_file.write(self.write_msg)
4135 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004136
4137 def testMakefileCloseSocketDestroy(self):
4138 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004139 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004140 refcount_after = sys.getrefcount(self.cli_conn)
4141 self.assertEqual(refcount_before - 1, refcount_after)
4142
4143 def _testMakefileCloseSocketDestroy(self):
4144 pass
4145
Antoine Pitrou98b46702010-09-18 22:59:00 +00004146 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004147 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004148 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4149
4150 def testSmallReadNonBlocking(self):
4151 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004152 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4153 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004154 self.evt1.set()
4155 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004156 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004157 if first_seg is None:
4158 # Data not arrived (can happen under Windows), wait a bit
4159 time.sleep(0.5)
4160 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004161 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004162 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004163 self.assertEqual(n, 3)
4164 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004165 self.assertEqual(msg, self.read_msg)
4166 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4167 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004168
4169 def _testSmallReadNonBlocking(self):
4170 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004171 self.write_file.write(self.write_msg)
4172 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004173 self.evt2.set()
4174 # Avoid cloding the socket before the server test has finished,
4175 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4176 self.serv_finished.wait(5.0)
4177
4178 def testWriteNonBlocking(self):
4179 self.cli_finished.wait(5.0)
4180 # The client thread can't skip directly - the SkipTest exception
4181 # would appear as a failure.
4182 if self.serv_skipped:
4183 self.skipTest(self.serv_skipped)
4184
4185 def _testWriteNonBlocking(self):
4186 self.serv_skipped = None
4187 self.serv_conn.setblocking(False)
4188 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004189 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004190 LIMIT = 10
4191 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004192 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004193 self.assertGreater(n, 0)
4194 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004195 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004196 if n is None:
4197 # Succeeded
4198 break
4199 self.assertGreater(n, 0)
4200 else:
4201 # Let us know that this test didn't manage to establish
4202 # the expected conditions. This is not a failure in itself but,
4203 # if it happens repeatedly, the test should be fixed.
4204 self.serv_skipped = "failed to saturate the socket buffer"
4205
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004206
Guido van Rossum8c943832002-08-08 01:00:28 +00004207class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4208
4209 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4210
4211
4212class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4213
4214 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004215
Thomas Woutersb2137042007-02-01 18:02:27 +00004216
Antoine Pitrou834bd812010-10-13 16:17:14 +00004217class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4218 """Tests for socket.makefile() in text mode (rather than binary)"""
4219
4220 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004221 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004222 write_mode = 'wb'
4223 write_msg = MSG
4224 newline = ''
4225
4226
4227class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4228 """Tests for socket.makefile() in text mode (rather than binary)"""
4229
4230 read_mode = 'rb'
4231 read_msg = MSG
4232 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004233 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004234 newline = ''
4235
4236
4237class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4238 """Tests for socket.makefile() in text mode (rather than binary)"""
4239
4240 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004241 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004242 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004243 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004244 newline = ''
4245
4246
Guido van Rossumd8faa362007-04-27 19:54:29 +00004247class NetworkConnectionTest(object):
4248 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004249
Guido van Rossumd8faa362007-04-27 19:54:29 +00004250 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004251 # We're inherited below by BasicTCPTest2, which also inherits
4252 # BasicTCPTest, which defines self.port referenced below.
4253 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004254 self.serv_conn = self.cli
4255
4256class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4257 """Tests that NetworkConnection does not break existing TCP functionality.
4258 """
4259
4260class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004261
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004262 class MockSocket(socket.socket):
4263 def connect(self, *args):
4264 raise socket.timeout('timed out')
4265
4266 @contextlib.contextmanager
4267 def mocked_socket_module(self):
4268 """Return a socket which times out on connect"""
4269 old_socket = socket.socket
4270 socket.socket = self.MockSocket
4271 try:
4272 yield
4273 finally:
4274 socket.socket = old_socket
4275
4276 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004277 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004278 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004279 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004280 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004281 cli.connect((HOST, port))
4282 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4283
4284 def test_create_connection(self):
4285 # Issue #9792: errors raised by create_connection() should have
4286 # a proper errno attribute.
4287 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004288 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004289 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004290
4291 # Issue #16257: create_connection() calls getaddrinfo() against
4292 # 'localhost'. This may result in an IPV6 addr being returned
4293 # as well as an IPV4 one:
4294 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4295 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4296 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4297 #
4298 # create_connection() enumerates through all the addresses returned
4299 # and if it doesn't successfully bind to any of them, it propagates
4300 # the last exception it encountered.
4301 #
4302 # On Solaris, ENETUNREACH is returned in this circumstance instead
4303 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4304 # expected errnos.
4305 expected_errnos = [ errno.ECONNREFUSED, ]
4306 if hasattr(errno, 'ENETUNREACH'):
4307 expected_errnos.append(errno.ENETUNREACH)
4308
4309 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004310
4311 def test_create_connection_timeout(self):
4312 # Issue #9792: create_connection() should not recast timeout errors
4313 # as generic socket errors.
4314 with self.mocked_socket_module():
4315 with self.assertRaises(socket.timeout):
4316 socket.create_connection((HOST, 1234))
4317
Guido van Rossumd8faa362007-04-27 19:54:29 +00004318
Victor Stinner45df8202010-04-28 22:31:17 +00004319@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004320class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4321
4322 def __init__(self, methodName='runTest'):
4323 SocketTCPTest.__init__(self, methodName=methodName)
4324 ThreadableTest.__init__(self)
4325
4326 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004327 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004328
4329 def clientTearDown(self):
4330 self.cli.close()
4331 self.cli = None
4332 ThreadableTest.clientTearDown(self)
4333
4334 def _justAccept(self):
4335 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004336 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004337
4338 testFamily = _justAccept
4339 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004340 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004341 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004342 self.assertEqual(self.cli.family, 2)
4343
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004344 testSourceAddress = _justAccept
4345 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004346 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4347 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004348 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004349 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004350 # The port number being used is sufficient to show that the bind()
4351 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004352
Guido van Rossumd8faa362007-04-27 19:54:29 +00004353 testTimeoutDefault = _justAccept
4354 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004355 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004356 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004357 socket.setdefaulttimeout(42)
4358 try:
4359 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004360 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004361 finally:
4362 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004363 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004364
4365 testTimeoutNone = _justAccept
4366 def _testTimeoutNone(self):
4367 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004368 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004369 socket.setdefaulttimeout(30)
4370 try:
4371 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004372 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004373 finally:
4374 socket.setdefaulttimeout(None)
4375 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004376
4377 testTimeoutValueNamed = _justAccept
4378 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004379 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004380 self.assertEqual(self.cli.gettimeout(), 30)
4381
4382 testTimeoutValueNonamed = _justAccept
4383 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004384 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004385 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004386 self.assertEqual(self.cli.gettimeout(), 30)
4387
Victor Stinner45df8202010-04-28 22:31:17 +00004388@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004389class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4390
4391 def __init__(self, methodName='runTest'):
4392 SocketTCPTest.__init__(self, methodName=methodName)
4393 ThreadableTest.__init__(self)
4394
4395 def clientSetUp(self):
4396 pass
4397
4398 def clientTearDown(self):
4399 self.cli.close()
4400 self.cli = None
4401 ThreadableTest.clientTearDown(self)
4402
4403 def testInsideTimeout(self):
4404 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004405 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004406 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004407 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004408 testOutsideTimeout = testInsideTimeout
4409
4410 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004411 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004412 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004413 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004414
4415 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004416 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004417 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004418
4419
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004420class TCPTimeoutTest(SocketTCPTest):
4421
4422 def testTCPTimeout(self):
4423 def raise_timeout(*args, **kwargs):
4424 self.serv.settimeout(1.0)
4425 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004426 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004427 "Error generating a timeout exception (TCP)")
4428
4429 def testTimeoutZero(self):
4430 ok = False
4431 try:
4432 self.serv.settimeout(0.0)
4433 foo = self.serv.accept()
4434 except socket.timeout:
4435 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004436 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004437 ok = True
4438 except:
4439 self.fail("caught unexpected exception (TCP)")
4440 if not ok:
4441 self.fail("accept() returned success when we did not expect it")
4442
Serhiy Storchaka43767632013-11-03 21:31:38 +02004443 @unittest.skipUnless(hasattr(signal, 'alarm'),
4444 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004445 def testInterruptedTimeout(self):
4446 # XXX I don't know how to do this test on MSWindows or any other
4447 # plaform that doesn't support signal.alarm() or os.kill(), though
4448 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004449 self.serv.settimeout(5.0) # must be longer than alarm
4450 class Alarm(Exception):
4451 pass
4452 def alarm_handler(signal, frame):
4453 raise Alarm
4454 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4455 try:
4456 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4457 try:
4458 foo = self.serv.accept()
4459 except socket.timeout:
4460 self.fail("caught timeout instead of Alarm")
4461 except Alarm:
4462 pass
4463 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004464 self.fail("caught other exception instead of Alarm:"
4465 " %s(%s):\n%s" %
4466 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004467 else:
4468 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004469 finally:
4470 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004471 except Alarm:
4472 self.fail("got Alarm in wrong place")
4473 finally:
4474 # no alarm can be pending. Safe to restore old handler.
4475 signal.signal(signal.SIGALRM, old_alarm)
4476
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004477class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004478
4479 def testUDPTimeout(self):
4480 def raise_timeout(*args, **kwargs):
4481 self.serv.settimeout(1.0)
4482 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004483 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004484 "Error generating a timeout exception (UDP)")
4485
4486 def testTimeoutZero(self):
4487 ok = False
4488 try:
4489 self.serv.settimeout(0.0)
4490 foo = self.serv.recv(1024)
4491 except socket.timeout:
4492 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004493 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004494 ok = True
4495 except:
4496 self.fail("caught unexpected exception (UDP)")
4497 if not ok:
4498 self.fail("recv() returned success when we did not expect it")
4499
4500class TestExceptions(unittest.TestCase):
4501
4502 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004503 self.assertTrue(issubclass(OSError, Exception))
4504 self.assertTrue(issubclass(socket.herror, OSError))
4505 self.assertTrue(issubclass(socket.gaierror, OSError))
4506 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004507
Serhiy Storchaka43767632013-11-03 21:31:38 +02004508@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004509class TestLinuxAbstractNamespace(unittest.TestCase):
4510
4511 UNIX_PATH_MAX = 108
4512
4513 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004514 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004515 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4516 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004517 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004518 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4519 s2.connect(s1.getsockname())
4520 with s1.accept()[0] as s3:
4521 self.assertEqual(s1.getsockname(), address)
4522 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004523
4524 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004525 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004526 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4527 s.bind(address)
4528 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004529
4530 def testNameOverflow(self):
4531 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004532 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004533 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004534
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004535 def testStrName(self):
4536 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004537 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4538 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004539 s.bind("\x00python\x00test\x00")
4540 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004541 finally:
4542 s.close()
4543
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004544 def testBytearrayName(self):
4545 # Check that an abstract name can be passed as a bytearray.
4546 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4547 s.bind(bytearray(b"\x00python\x00test\x00"))
4548 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4549
Serhiy Storchaka43767632013-11-03 21:31:38 +02004550@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004551class TestUnixDomain(unittest.TestCase):
4552
4553 def setUp(self):
4554 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4555
4556 def tearDown(self):
4557 self.sock.close()
4558
4559 def encoded(self, path):
4560 # Return the given path encoded in the file system encoding,
4561 # or skip the test if this is not possible.
4562 try:
4563 return os.fsencode(path)
4564 except UnicodeEncodeError:
4565 self.skipTest(
4566 "Pathname {0!a} cannot be represented in file "
4567 "system encoding {1!r}".format(
4568 path, sys.getfilesystemencoding()))
4569
Antoine Pitrou16374872011-12-16 15:04:12 +01004570 def bind(self, sock, path):
4571 # Bind the socket
4572 try:
4573 sock.bind(path)
4574 except OSError as e:
4575 if str(e) == "AF_UNIX path too long":
4576 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004577 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004578 .format(path))
4579 else:
4580 raise
4581
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004582 def testStrAddr(self):
4583 # Test binding to and retrieving a normal string pathname.
4584 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004585 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004586 self.addCleanup(support.unlink, path)
4587 self.assertEqual(self.sock.getsockname(), path)
4588
4589 def testBytesAddr(self):
4590 # Test binding to a bytes pathname.
4591 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004592 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004593 self.addCleanup(support.unlink, path)
4594 self.assertEqual(self.sock.getsockname(), path)
4595
4596 def testSurrogateescapeBind(self):
4597 # Test binding to a valid non-ASCII pathname, with the
4598 # non-ASCII bytes supplied using surrogateescape encoding.
4599 path = os.path.abspath(support.TESTFN_UNICODE)
4600 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004601 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004602 self.addCleanup(support.unlink, path)
4603 self.assertEqual(self.sock.getsockname(), path)
4604
4605 def testUnencodableAddr(self):
4606 # Test binding to a pathname that cannot be encoded in the
4607 # file system encoding.
4608 if support.TESTFN_UNENCODABLE is None:
4609 self.skipTest("No unencodable filename available")
4610 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004611 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004612 self.addCleanup(support.unlink, path)
4613 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004614
Victor Stinner45df8202010-04-28 22:31:17 +00004615@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004616class BufferIOTest(SocketConnectedTest):
4617 """
4618 Test the buffer versions of socket.recv() and socket.send().
4619 """
4620 def __init__(self, methodName='runTest'):
4621 SocketConnectedTest.__init__(self, methodName=methodName)
4622
Antoine Pitrou25480782010-03-17 22:50:28 +00004623 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004624 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004625 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004626 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004627 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004628 self.assertEqual(msg, MSG)
4629
Antoine Pitrou25480782010-03-17 22:50:28 +00004630 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004631 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004632 self.serv_conn.send(buf)
4633
Antoine Pitrou25480782010-03-17 22:50:28 +00004634 def testRecvIntoBytearray(self):
4635 buf = bytearray(1024)
4636 nbytes = self.cli_conn.recv_into(buf)
4637 self.assertEqual(nbytes, len(MSG))
4638 msg = buf[:len(MSG)]
4639 self.assertEqual(msg, MSG)
4640
4641 _testRecvIntoBytearray = _testRecvIntoArray
4642
4643 def testRecvIntoMemoryview(self):
4644 buf = bytearray(1024)
4645 nbytes = self.cli_conn.recv_into(memoryview(buf))
4646 self.assertEqual(nbytes, len(MSG))
4647 msg = buf[:len(MSG)]
4648 self.assertEqual(msg, MSG)
4649
4650 _testRecvIntoMemoryview = _testRecvIntoArray
4651
4652 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004653 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004654 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004655 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004656 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004657 self.assertEqual(msg, MSG)
4658
Antoine Pitrou25480782010-03-17 22:50:28 +00004659 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004660 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004661 self.serv_conn.send(buf)
4662
Antoine Pitrou25480782010-03-17 22:50:28 +00004663 def testRecvFromIntoBytearray(self):
4664 buf = bytearray(1024)
4665 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4666 self.assertEqual(nbytes, len(MSG))
4667 msg = buf[:len(MSG)]
4668 self.assertEqual(msg, MSG)
4669
4670 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4671
4672 def testRecvFromIntoMemoryview(self):
4673 buf = bytearray(1024)
4674 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4675 self.assertEqual(nbytes, len(MSG))
4676 msg = buf[:len(MSG)]
4677 self.assertEqual(msg, MSG)
4678
4679 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4680
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004681 def testRecvFromIntoSmallBuffer(self):
4682 # See issue #20246.
4683 buf = bytearray(8)
4684 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4685
4686 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004687 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004688
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004689 def testRecvFromIntoEmptyBuffer(self):
4690 buf = bytearray()
4691 self.cli_conn.recvfrom_into(buf)
4692 self.cli_conn.recvfrom_into(buf, 0)
4693
4694 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4695
Christian Heimes043d6f62008-01-07 17:19:16 +00004696
4697TIPC_STYPE = 2000
4698TIPC_LOWER = 200
4699TIPC_UPPER = 210
4700
4701def isTipcAvailable():
4702 """Check if the TIPC module is loaded
4703
4704 The TIPC module is not loaded automatically on Ubuntu and probably
4705 other Linux distros.
4706 """
4707 if not hasattr(socket, "AF_TIPC"):
4708 return False
4709 if not os.path.isfile("/proc/modules"):
4710 return False
4711 with open("/proc/modules") as f:
4712 for line in f:
4713 if line.startswith("tipc "):
4714 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004715 return False
4716
Serhiy Storchaka43767632013-11-03 21:31:38 +02004717@unittest.skipUnless(isTipcAvailable(),
4718 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004719class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004720 def testRDM(self):
4721 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4722 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004723 self.addCleanup(srv.close)
4724 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004725
4726 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4727 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4728 TIPC_LOWER, TIPC_UPPER)
4729 srv.bind(srvaddr)
4730
4731 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4732 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4733 cli.sendto(MSG, sendaddr)
4734
4735 msg, recvaddr = srv.recvfrom(1024)
4736
4737 self.assertEqual(cli.getsockname(), recvaddr)
4738 self.assertEqual(msg, MSG)
4739
4740
Serhiy Storchaka43767632013-11-03 21:31:38 +02004741@unittest.skipUnless(isTipcAvailable(),
4742 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004743class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004744 def __init__(self, methodName = 'runTest'):
4745 unittest.TestCase.__init__(self, methodName = methodName)
4746 ThreadableTest.__init__(self)
4747
4748 def setUp(self):
4749 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004750 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004751 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4752 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4753 TIPC_LOWER, TIPC_UPPER)
4754 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004755 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004756 self.serverExplicitReady()
4757 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004758 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004759
4760 def clientSetUp(self):
4761 # The is a hittable race between serverExplicitReady() and the
4762 # accept() call; sleep a little while to avoid it, otherwise
4763 # we could get an exception
4764 time.sleep(0.1)
4765 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004766 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004767 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4768 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4769 self.cli.connect(addr)
4770 self.cliaddr = self.cli.getsockname()
4771
4772 def testStream(self):
4773 msg = self.conn.recv(1024)
4774 self.assertEqual(msg, MSG)
4775 self.assertEqual(self.cliaddr, self.connaddr)
4776
4777 def _testStream(self):
4778 self.cli.send(MSG)
4779 self.cli.close()
4780
4781
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004782@unittest.skipUnless(thread, 'Threading required for this test.')
4783class ContextManagersTest(ThreadedTCPSocketTest):
4784
4785 def _testSocketClass(self):
4786 # base test
4787 with socket.socket() as sock:
4788 self.assertFalse(sock._closed)
4789 self.assertTrue(sock._closed)
4790 # close inside with block
4791 with socket.socket() as sock:
4792 sock.close()
4793 self.assertTrue(sock._closed)
4794 # exception inside with block
4795 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004796 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004797 self.assertTrue(sock._closed)
4798
4799 def testCreateConnectionBase(self):
4800 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004801 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004802 data = conn.recv(1024)
4803 conn.sendall(data)
4804
4805 def _testCreateConnectionBase(self):
4806 address = self.serv.getsockname()
4807 with socket.create_connection(address) as sock:
4808 self.assertFalse(sock._closed)
4809 sock.sendall(b'foo')
4810 self.assertEqual(sock.recv(1024), b'foo')
4811 self.assertTrue(sock._closed)
4812
4813 def testCreateConnectionClose(self):
4814 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004815 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004816 data = conn.recv(1024)
4817 conn.sendall(data)
4818
4819 def _testCreateConnectionClose(self):
4820 address = self.serv.getsockname()
4821 with socket.create_connection(address) as sock:
4822 sock.close()
4823 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004824 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004825
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004826
Victor Stinnerdaf45552013-08-28 00:53:59 +02004827class InheritanceTest(unittest.TestCase):
4828 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4829 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004830 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004831 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004832 with socket.socket(socket.AF_INET,
4833 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4834 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004835 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004836
4837 def test_default_inheritable(self):
4838 sock = socket.socket()
4839 with sock:
4840 self.assertEqual(sock.get_inheritable(), False)
4841
4842 def test_dup(self):
4843 sock = socket.socket()
4844 with sock:
4845 newsock = sock.dup()
4846 sock.close()
4847 with newsock:
4848 self.assertEqual(newsock.get_inheritable(), False)
4849
4850 def test_set_inheritable(self):
4851 sock = socket.socket()
4852 with sock:
4853 sock.set_inheritable(True)
4854 self.assertEqual(sock.get_inheritable(), True)
4855
4856 sock.set_inheritable(False)
4857 self.assertEqual(sock.get_inheritable(), False)
4858
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004859 @unittest.skipIf(fcntl is None, "need fcntl")
4860 def test_get_inheritable_cloexec(self):
4861 sock = socket.socket()
4862 with sock:
4863 fd = sock.fileno()
4864 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004865
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004866 # clear FD_CLOEXEC flag
4867 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4868 flags &= ~fcntl.FD_CLOEXEC
4869 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004870
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004871 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004872
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004873 @unittest.skipIf(fcntl is None, "need fcntl")
4874 def test_set_inheritable_cloexec(self):
4875 sock = socket.socket()
4876 with sock:
4877 fd = sock.fileno()
4878 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4879 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004880
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004881 sock.set_inheritable(True)
4882 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4883 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004884
4885
Victor Stinnerdaf45552013-08-28 00:53:59 +02004886 @unittest.skipUnless(hasattr(socket, "socketpair"),
4887 "need socket.socketpair()")
4888 def test_socketpair(self):
4889 s1, s2 = socket.socketpair()
4890 self.addCleanup(s1.close)
4891 self.addCleanup(s2.close)
4892 self.assertEqual(s1.get_inheritable(), False)
4893 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004894
4895
4896@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4897 "SOCK_NONBLOCK not defined")
4898class NonblockConstantTest(unittest.TestCase):
4899 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4900 if nonblock:
4901 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4902 self.assertEqual(s.gettimeout(), timeout)
4903 else:
4904 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4905 self.assertEqual(s.gettimeout(), None)
4906
Charles-François Natali239bb962011-06-03 12:55:15 +02004907 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004908 def test_SOCK_NONBLOCK(self):
4909 # a lot of it seems silly and redundant, but I wanted to test that
4910 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004911 with socket.socket(socket.AF_INET,
4912 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4913 self.checkNonblock(s)
4914 s.setblocking(1)
4915 self.checkNonblock(s, False)
4916 s.setblocking(0)
4917 self.checkNonblock(s)
4918 s.settimeout(None)
4919 self.checkNonblock(s, False)
4920 s.settimeout(2.0)
4921 self.checkNonblock(s, timeout=2.0)
4922 s.setblocking(1)
4923 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004924 # defaulttimeout
4925 t = socket.getdefaulttimeout()
4926 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004927 with socket.socket() as s:
4928 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004929 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004930 with socket.socket() as s:
4931 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004932 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004933 with socket.socket() as s:
4934 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004935 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004936 with socket.socket() as s:
4937 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004938 socket.setdefaulttimeout(t)
4939
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004940
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004941@unittest.skipUnless(os.name == "nt", "Windows specific")
4942@unittest.skipUnless(multiprocessing, "need multiprocessing")
4943class TestSocketSharing(SocketTCPTest):
4944 # This must be classmethod and not staticmethod or multiprocessing
4945 # won't be able to bootstrap it.
4946 @classmethod
4947 def remoteProcessServer(cls, q):
4948 # Recreate socket from shared data
4949 sdata = q.get()
4950 message = q.get()
4951
4952 s = socket.fromshare(sdata)
4953 s2, c = s.accept()
4954
4955 # Send the message
4956 s2.sendall(message)
4957 s2.close()
4958 s.close()
4959
4960 def testShare(self):
4961 # Transfer the listening server socket to another process
4962 # and service it from there.
4963
4964 # Create process:
4965 q = multiprocessing.Queue()
4966 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4967 p.start()
4968
4969 # Get the shared socket data
4970 data = self.serv.share(p.pid)
4971
4972 # Pass the shared socket to the other process
4973 addr = self.serv.getsockname()
4974 self.serv.close()
4975 q.put(data)
4976
4977 # The data that the server will send us
4978 message = b"slapmahfro"
4979 q.put(message)
4980
4981 # Connect
4982 s = socket.create_connection(addr)
4983 # listen for the data
4984 m = []
4985 while True:
4986 data = s.recv(100)
4987 if not data:
4988 break
4989 m.append(data)
4990 s.close()
4991 received = b"".join(m)
4992 self.assertEqual(received, message)
4993 p.join()
4994
4995 def testShareLength(self):
4996 data = self.serv.share(os.getpid())
4997 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4998 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4999
5000 def compareSockets(self, org, other):
5001 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005002 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005003 self.assertEqual(org.gettimeout(), None)
5004 self.assertEqual(org.gettimeout(), other.gettimeout())
5005
5006 self.assertEqual(org.family, other.family)
5007 self.assertEqual(org.type, other.type)
5008 # If the user specified "0" for proto, then
5009 # internally windows will have picked the correct value.
5010 # Python introspection on the socket however will still return
5011 # 0. For the shared socket, the python value is recreated
5012 # from the actual value, so it may not compare correctly.
5013 if org.proto != 0:
5014 self.assertEqual(org.proto, other.proto)
5015
5016 def testShareLocal(self):
5017 data = self.serv.share(os.getpid())
5018 s = socket.fromshare(data)
5019 try:
5020 self.compareSockets(self.serv, s)
5021 finally:
5022 s.close()
5023
5024 def testTypes(self):
5025 families = [socket.AF_INET, socket.AF_INET6]
5026 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5027 for f in families:
5028 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005029 try:
5030 source = socket.socket(f, t)
5031 except OSError:
5032 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005033 try:
5034 data = source.share(os.getpid())
5035 shared = socket.fromshare(data)
5036 try:
5037 self.compareSockets(source, shared)
5038 finally:
5039 shared.close()
5040 finally:
5041 source.close()
5042
5043
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005044@unittest.skipUnless(thread, 'Threading required for this test.')
5045class SendfileUsingSendTest(ThreadedTCPSocketTest):
5046 """
5047 Test the send() implementation of socket.sendfile().
5048 """
5049
5050 FILESIZE = (10 * 1024 * 1024) # 10MB
5051 BUFSIZE = 8192
5052 FILEDATA = b""
5053 TIMEOUT = 2
5054
5055 @classmethod
5056 def setUpClass(cls):
5057 def chunks(total, step):
5058 assert total >= step
5059 while total > step:
5060 yield step
5061 total -= step
5062 if total:
5063 yield total
5064
5065 chunk = b"".join([random.choice(string.ascii_letters).encode()
5066 for i in range(cls.BUFSIZE)])
5067 with open(support.TESTFN, 'wb') as f:
5068 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5069 f.write(chunk)
5070 with open(support.TESTFN, 'rb') as f:
5071 cls.FILEDATA = f.read()
5072 assert len(cls.FILEDATA) == cls.FILESIZE
5073
5074 @classmethod
5075 def tearDownClass(cls):
5076 support.unlink(support.TESTFN)
5077
5078 def accept_conn(self):
5079 self.serv.settimeout(self.TIMEOUT)
5080 conn, addr = self.serv.accept()
5081 conn.settimeout(self.TIMEOUT)
5082 self.addCleanup(conn.close)
5083 return conn
5084
5085 def recv_data(self, conn):
5086 received = []
5087 while True:
5088 chunk = conn.recv(self.BUFSIZE)
5089 if not chunk:
5090 break
5091 received.append(chunk)
5092 return b''.join(received)
5093
5094 def meth_from_sock(self, sock):
5095 # Depending on the mixin class being run return either send()
5096 # or sendfile() method implementation.
5097 return getattr(sock, "_sendfile_use_send")
5098
5099 # regular file
5100
5101 def _testRegularFile(self):
5102 address = self.serv.getsockname()
5103 file = open(support.TESTFN, 'rb')
5104 with socket.create_connection(address) as sock, file as file:
5105 meth = self.meth_from_sock(sock)
5106 sent = meth(file)
5107 self.assertEqual(sent, self.FILESIZE)
5108 self.assertEqual(file.tell(), self.FILESIZE)
5109
5110 def testRegularFile(self):
5111 conn = self.accept_conn()
5112 data = self.recv_data(conn)
5113 self.assertEqual(len(data), self.FILESIZE)
5114 self.assertEqual(data, self.FILEDATA)
5115
5116 # non regular file
5117
5118 def _testNonRegularFile(self):
5119 address = self.serv.getsockname()
5120 file = io.BytesIO(self.FILEDATA)
5121 with socket.create_connection(address) as sock, file as file:
5122 sent = sock.sendfile(file)
5123 self.assertEqual(sent, self.FILESIZE)
5124 self.assertEqual(file.tell(), self.FILESIZE)
5125 self.assertRaises(socket._GiveupOnSendfile,
5126 sock._sendfile_use_sendfile, file)
5127
5128 def testNonRegularFile(self):
5129 conn = self.accept_conn()
5130 data = self.recv_data(conn)
5131 self.assertEqual(len(data), self.FILESIZE)
5132 self.assertEqual(data, self.FILEDATA)
5133
5134 # empty file
5135
5136 def _testEmptyFileSend(self):
5137 address = self.serv.getsockname()
5138 filename = support.TESTFN + "2"
5139 with open(filename, 'wb'):
5140 self.addCleanup(support.unlink, filename)
5141 file = open(filename, 'rb')
5142 with socket.create_connection(address) as sock, file as file:
5143 meth = self.meth_from_sock(sock)
5144 sent = meth(file)
5145 self.assertEqual(sent, 0)
5146 self.assertEqual(file.tell(), 0)
5147
5148 def testEmptyFileSend(self):
5149 conn = self.accept_conn()
5150 data = self.recv_data(conn)
5151 self.assertEqual(data, b"")
5152
5153 # offset
5154
5155 def _testOffset(self):
5156 address = self.serv.getsockname()
5157 file = open(support.TESTFN, 'rb')
5158 with socket.create_connection(address) as sock, file as file:
5159 meth = self.meth_from_sock(sock)
5160 sent = meth(file, offset=5000)
5161 self.assertEqual(sent, self.FILESIZE - 5000)
5162 self.assertEqual(file.tell(), self.FILESIZE)
5163
5164 def testOffset(self):
5165 conn = self.accept_conn()
5166 data = self.recv_data(conn)
5167 self.assertEqual(len(data), self.FILESIZE - 5000)
5168 self.assertEqual(data, self.FILEDATA[5000:])
5169
5170 # count
5171
5172 def _testCount(self):
5173 address = self.serv.getsockname()
5174 file = open(support.TESTFN, 'rb')
5175 with socket.create_connection(address, timeout=2) as sock, file as file:
5176 count = 5000007
5177 meth = self.meth_from_sock(sock)
5178 sent = meth(file, count=count)
5179 self.assertEqual(sent, count)
5180 self.assertEqual(file.tell(), count)
5181
5182 def testCount(self):
5183 count = 5000007
5184 conn = self.accept_conn()
5185 data = self.recv_data(conn)
5186 self.assertEqual(len(data), count)
5187 self.assertEqual(data, self.FILEDATA[:count])
5188
5189 # count small
5190
5191 def _testCountSmall(self):
5192 address = self.serv.getsockname()
5193 file = open(support.TESTFN, 'rb')
5194 with socket.create_connection(address, timeout=2) as sock, file as file:
5195 count = 1
5196 meth = self.meth_from_sock(sock)
5197 sent = meth(file, count=count)
5198 self.assertEqual(sent, count)
5199 self.assertEqual(file.tell(), count)
5200
5201 def testCountSmall(self):
5202 count = 1
5203 conn = self.accept_conn()
5204 data = self.recv_data(conn)
5205 self.assertEqual(len(data), count)
5206 self.assertEqual(data, self.FILEDATA[:count])
5207
5208 # count + offset
5209
5210 def _testCountWithOffset(self):
5211 address = self.serv.getsockname()
5212 file = open(support.TESTFN, 'rb')
5213 with socket.create_connection(address, timeout=2) as sock, file as file:
5214 count = 100007
5215 meth = self.meth_from_sock(sock)
5216 sent = meth(file, offset=2007, count=count)
5217 self.assertEqual(sent, count)
5218 self.assertEqual(file.tell(), count + 2007)
5219
5220 def testCountWithOffset(self):
5221 count = 100007
5222 conn = self.accept_conn()
5223 data = self.recv_data(conn)
5224 self.assertEqual(len(data), count)
5225 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5226
5227 # non blocking sockets are not supposed to work
5228
5229 def _testNonBlocking(self):
5230 address = self.serv.getsockname()
5231 file = open(support.TESTFN, 'rb')
5232 with socket.create_connection(address) as sock, file as file:
5233 sock.setblocking(False)
5234 meth = self.meth_from_sock(sock)
5235 self.assertRaises(ValueError, meth, file)
5236 self.assertRaises(ValueError, sock.sendfile, file)
5237
5238 def testNonBlocking(self):
5239 conn = self.accept_conn()
5240 if conn.recv(8192):
5241 self.fail('was not supposed to receive any data')
5242
5243 # timeout (non-triggered)
5244
5245 def _testWithTimeout(self):
5246 address = self.serv.getsockname()
5247 file = open(support.TESTFN, 'rb')
5248 with socket.create_connection(address, timeout=2) as sock, file as file:
5249 meth = self.meth_from_sock(sock)
5250 sent = meth(file)
5251 self.assertEqual(sent, self.FILESIZE)
5252
5253 def testWithTimeout(self):
5254 conn = self.accept_conn()
5255 data = self.recv_data(conn)
5256 self.assertEqual(len(data), self.FILESIZE)
5257 self.assertEqual(data, self.FILEDATA)
5258
5259 # timeout (triggered)
5260
5261 def _testWithTimeoutTriggeredSend(self):
5262 address = self.serv.getsockname()
5263 file = open(support.TESTFN, 'rb')
5264 with socket.create_connection(address, timeout=0.01) as sock, \
5265 file as file:
5266 meth = self.meth_from_sock(sock)
5267 self.assertRaises(socket.timeout, meth, file)
5268
5269 def testWithTimeoutTriggeredSend(self):
5270 conn = self.accept_conn()
5271 conn.recv(88192)
5272
5273 # errors
5274
5275 def _test_errors(self):
5276 pass
5277
5278 def test_errors(self):
5279 with open(support.TESTFN, 'rb') as file:
5280 with socket.socket(type=socket.SOCK_DGRAM) as s:
5281 meth = self.meth_from_sock(s)
5282 self.assertRaisesRegex(
5283 ValueError, "SOCK_STREAM", meth, file)
5284 with open(support.TESTFN, 'rt') as file:
5285 with socket.socket() as s:
5286 meth = self.meth_from_sock(s)
5287 self.assertRaisesRegex(
5288 ValueError, "binary mode", meth, file)
5289 with open(support.TESTFN, 'rb') as file:
5290 with socket.socket() as s:
5291 meth = self.meth_from_sock(s)
5292 self.assertRaisesRegex(TypeError, "positive integer",
5293 meth, file, count='2')
5294 self.assertRaisesRegex(TypeError, "positive integer",
5295 meth, file, count=0.1)
5296 self.assertRaisesRegex(ValueError, "positive integer",
5297 meth, file, count=0)
5298 self.assertRaisesRegex(ValueError, "positive integer",
5299 meth, file, count=-1)
5300
5301
5302@unittest.skipUnless(thread, 'Threading required for this test.')
5303@unittest.skipUnless(hasattr(os, "sendfile"),
5304 'os.sendfile() required for this test.')
5305class SendfileUsingSendfileTest(SendfileUsingSendTest):
5306 """
5307 Test the sendfile() implementation of socket.sendfile().
5308 """
5309 def meth_from_sock(self, sock):
5310 return getattr(sock, "_sendfile_use_sendfile")
5311
5312
Guido van Rossumb995eb72002-07-31 16:08:40 +00005313def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005314 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005315 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005316
5317 tests.extend([
5318 NonBlockingTCPTests,
5319 FileObjectClassTestCase,
5320 UnbufferedFileObjectClassTestCase,
5321 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005322 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005323 UnicodeReadFileObjectClassTestCase,
5324 UnicodeWriteFileObjectClassTestCase,
5325 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005326 NetworkConnectionNoServer,
5327 NetworkConnectionAttributesTest,
5328 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005329 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005330 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005331 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005332 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005333 tests.append(BasicSocketPairTest)
5334 tests.append(TestUnixDomain)
5335 tests.append(TestLinuxAbstractNamespace)
5336 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005337 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005338 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005339 tests.extend([
5340 CmsgMacroTests,
5341 SendmsgUDPTest,
5342 RecvmsgUDPTest,
5343 RecvmsgIntoUDPTest,
5344 SendmsgUDP6Test,
5345 RecvmsgUDP6Test,
5346 RecvmsgRFC3542AncillaryUDP6Test,
5347 RecvmsgIntoRFC3542AncillaryUDP6Test,
5348 RecvmsgIntoUDP6Test,
5349 SendmsgTCPTest,
5350 RecvmsgTCPTest,
5351 RecvmsgIntoTCPTest,
5352 SendmsgSCTPStreamTest,
5353 RecvmsgSCTPStreamTest,
5354 RecvmsgIntoSCTPStreamTest,
5355 SendmsgUnixStreamTest,
5356 RecvmsgUnixStreamTest,
5357 RecvmsgIntoUnixStreamTest,
5358 RecvmsgSCMRightsStreamTest,
5359 RecvmsgIntoSCMRightsStreamTest,
5360 # These are slow when setitimer() is not available
5361 InterruptedRecvTimeoutTest,
5362 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005363 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005364 SendfileUsingSendTest,
5365 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005366 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005367
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005368 thread_info = support.threading_setup()
5369 support.run_unittest(*tests)
5370 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005371
5372if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005373 test_main()