blob: 9cd9dada8fc1059417ef767f06b3307e47212577 [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 Pitrouacd0fda2010-10-23 17:01:44 +000016import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000017import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000020import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010021import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020022import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020023import random
24import string
Antoine Pitroub1c54962010-10-14 15:05:38 +000025try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000026 import multiprocessing
27except ImportError:
28 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020029try:
30 import fcntl
31except ImportError:
32 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000033
Benjamin Petersonee8712c2008-05-20 21:35:26 +000034HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000035MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000036
Victor Stinner45df8202010-04-28 22:31:17 +000037try:
38 import _thread as thread
39 import threading
40except ImportError:
41 thread = None
42 threading = None
Victor Stinnere254e532014-07-26 14:36:55 +020043try:
44 import _socket
45except ImportError:
46 _socket = None
47
Victor Stinner45df8202010-04-28 22:31:17 +000048
Charles-François Natali47413c12011-10-06 19:47:44 +020049def _have_socket_can():
50 """Check whether CAN sockets are supported on this host."""
51 try:
52 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020053 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020054 return False
55 else:
56 s.close()
57 return True
58
Charles-François Natali10b8cf42011-11-10 19:21:37 +010059def _have_socket_rds():
60 """Check whether RDS sockets are supported on this host."""
61 try:
62 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
63 except (AttributeError, OSError):
64 return False
65 else:
66 s.close()
67 return True
68
Charles-François Natali47413c12011-10-06 19:47:44 +020069HAVE_SOCKET_CAN = _have_socket_can()
70
Charles-François Natali10b8cf42011-11-10 19:21:37 +010071HAVE_SOCKET_RDS = _have_socket_rds()
72
Nick Coghlan96fe56a2011-08-22 11:55:57 +100073# Size in bytes of the int type
74SIZEOF_INT = array.array("i").itemsize
75
Guido van Rossum24e4af82002-06-12 19:18:08 +000076class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000077
Guido van Rossum24e4af82002-06-12 19:18:08 +000078 def setUp(self):
79 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000080 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +010081 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +000082
Guido van Rossum24e4af82002-06-12 19:18:08 +000083 def tearDown(self):
84 self.serv.close()
85 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000086
Guido van Rossum24e4af82002-06-12 19:18:08 +000087class SocketUDPTest(unittest.TestCase):
88
89 def setUp(self):
90 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000091 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000092
93 def tearDown(self):
94 self.serv.close()
95 self.serv = None
96
Nick Coghlan96fe56a2011-08-22 11:55:57 +100097class ThreadSafeCleanupTestCase(unittest.TestCase):
98 """Subclass of unittest.TestCase with thread-safe cleanup methods.
99
100 This subclass protects the addCleanup() and doCleanups() methods
101 with a recursive lock.
102 """
103
104 if threading:
105 def __init__(self, *args, **kwargs):
106 super().__init__(*args, **kwargs)
107 self._cleanup_lock = threading.RLock()
108
109 def addCleanup(self, *args, **kwargs):
110 with self._cleanup_lock:
111 return super().addCleanup(*args, **kwargs)
112
113 def doCleanups(self, *args, **kwargs):
114 with self._cleanup_lock:
115 return super().doCleanups(*args, **kwargs)
116
Charles-François Natali47413c12011-10-06 19:47:44 +0200117class SocketCANTest(unittest.TestCase):
118
119 """To be able to run this test, a `vcan0` CAN interface can be created with
120 the following commands:
121 # modprobe vcan
122 # ip link add dev vcan0 type vcan
123 # ifconfig vcan0 up
124 """
125 interface = 'vcan0'
126 bufsize = 128
127
Charles-François Natali773e42d2013-02-05 19:42:01 +0100128 """The CAN frame structure is defined in <linux/can.h>:
129
130 struct can_frame {
131 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
132 __u8 can_dlc; /* data length code: 0 .. 8 */
133 __u8 data[8] __attribute__((aligned(8)));
134 };
135 """
136 can_frame_fmt = "=IB3x8s"
137 can_frame_size = struct.calcsize(can_frame_fmt)
138
139 """The Broadcast Management Command frame structure is defined
140 in <linux/can/bcm.h>:
141
142 struct bcm_msg_head {
143 __u32 opcode;
144 __u32 flags;
145 __u32 count;
146 struct timeval ival1, ival2;
147 canid_t can_id;
148 __u32 nframes;
149 struct can_frame frames[0];
150 }
151
152 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
153 `struct can_frame` definition). Must use native not standard types for packing.
154 """
155 bcm_cmd_msg_fmt = "@3I4l2I"
156 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
157
Charles-François Natali47413c12011-10-06 19:47:44 +0200158 def setUp(self):
159 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200160 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200161 try:
162 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200163 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200164 self.skipTest('network interface `%s` does not exist' %
165 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200166
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100167
168class SocketRDSTest(unittest.TestCase):
169
170 """To be able to run this test, the `rds` kernel module must be loaded:
171 # modprobe rds
172 """
173 bufsize = 8192
174
175 def setUp(self):
176 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
177 self.addCleanup(self.serv.close)
178 try:
179 self.port = support.bind_port(self.serv)
180 except OSError:
181 self.skipTest('unable to bind RDS socket')
182
183
Guido van Rossum24e4af82002-06-12 19:18:08 +0000184class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000185 """Threadable Test class
186
187 The ThreadableTest class makes it easy to create a threaded
188 client/server pair from an existing unit test. To create a
189 new threaded class from an existing unit test, use multiple
190 inheritance:
191
192 class NewClass (OldClass, ThreadableTest):
193 pass
194
195 This class defines two new fixture functions with obvious
196 purposes for overriding:
197
198 clientSetUp ()
199 clientTearDown ()
200
201 Any new test functions within the class must then define
202 tests in pairs, where the test name is preceeded with a
203 '_' to indicate the client portion of the test. Ex:
204
205 def testFoo(self):
206 # Server portion
207
208 def _testFoo(self):
209 # Client portion
210
211 Any exceptions raised by the clients during their tests
212 are caught and transferred to the main thread to alert
213 the testing framework.
214
215 Note, the server setup function cannot call any blocking
216 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000217 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000218 the blocking call (such as in setting up a client/server
219 connection and performing the accept() in setUp().
220 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000221
222 def __init__(self):
223 # Swap the true setup function
224 self.__setUp = self.setUp
225 self.__tearDown = self.tearDown
226 self.setUp = self._setUp
227 self.tearDown = self._tearDown
228
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000229 def serverExplicitReady(self):
230 """This method allows the server to explicitly indicate that
231 it wants the client thread to proceed. This is useful if the
232 server is about to execute a blocking routine that is
233 dependent upon the client thread during its setup routine."""
234 self.server_ready.set()
235
Guido van Rossum24e4af82002-06-12 19:18:08 +0000236 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000237 self.server_ready = threading.Event()
238 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000239 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000240 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200241 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000242
243 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000244 methodname = self.id()
245 i = methodname.rfind('.')
246 methodname = methodname[i+1:]
247 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000248 self.client_thread = thread.start_new_thread(
249 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200251 try:
252 self.__setUp()
253 except:
254 self.server_crashed = True
255 raise
256 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000257 self.server_ready.set()
258 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000259
260 def _tearDown(self):
261 self.__tearDown()
262 self.done.wait()
263
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000264 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000265 exc = self.queue.get()
266 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000267
268 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000269 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000270 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200271 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200272 if self.server_crashed:
273 self.clientTearDown()
274 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000275 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000276 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277 try:
278 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000279 except BaseException as e:
280 self.queue.put(e)
281 finally:
282 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000283
284 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000285 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000286
287 def clientTearDown(self):
288 self.done.set()
289 thread.exit()
290
291class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
292
293 def __init__(self, methodName='runTest'):
294 SocketTCPTest.__init__(self, methodName=methodName)
295 ThreadableTest.__init__(self)
296
297 def clientSetUp(self):
298 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
299
300 def clientTearDown(self):
301 self.cli.close()
302 self.cli = None
303 ThreadableTest.clientTearDown(self)
304
305class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
306
307 def __init__(self, methodName='runTest'):
308 SocketUDPTest.__init__(self, methodName=methodName)
309 ThreadableTest.__init__(self)
310
311 def clientSetUp(self):
312 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
313
Brian Curtin3beb38f2010-11-04 03:41:43 +0000314 def clientTearDown(self):
315 self.cli.close()
316 self.cli = None
317 ThreadableTest.clientTearDown(self)
318
Charles-François Natali47413c12011-10-06 19:47:44 +0200319class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
320
321 def __init__(self, methodName='runTest'):
322 SocketCANTest.__init__(self, methodName=methodName)
323 ThreadableTest.__init__(self)
324
325 def clientSetUp(self):
326 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
327 try:
328 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200329 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200330 # skipTest should not be called here, and will be called in the
331 # server instead
332 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200333
334 def clientTearDown(self):
335 self.cli.close()
336 self.cli = None
337 ThreadableTest.clientTearDown(self)
338
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100339class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
340
341 def __init__(self, methodName='runTest'):
342 SocketRDSTest.__init__(self, methodName=methodName)
343 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100344
345 def clientSetUp(self):
346 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
347 try:
348 # RDS sockets must be bound explicitly to send or receive data
349 self.cli.bind((HOST, 0))
350 self.cli_addr = self.cli.getsockname()
351 except OSError:
352 # skipTest should not be called here, and will be called in the
353 # server instead
354 pass
355
356 def clientTearDown(self):
357 self.cli.close()
358 self.cli = None
359 ThreadableTest.clientTearDown(self)
360
Guido van Rossum24e4af82002-06-12 19:18:08 +0000361class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000362 """Socket tests for client-server connection.
363
364 self.cli_conn is a client socket connected to the server. The
365 setUp() method guarantees that it is connected to the server.
366 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000367
368 def __init__(self, methodName='runTest'):
369 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
370
371 def setUp(self):
372 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000373 # Indicate explicitly we're ready for the client thread to
374 # proceed and then perform the blocking call to accept
375 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000376 conn, addr = self.serv.accept()
377 self.cli_conn = conn
378
379 def tearDown(self):
380 self.cli_conn.close()
381 self.cli_conn = None
382 ThreadedTCPSocketTest.tearDown(self)
383
384 def clientSetUp(self):
385 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000386 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000387 self.serv_conn = self.cli
388
389 def clientTearDown(self):
390 self.serv_conn.close()
391 self.serv_conn = None
392 ThreadedTCPSocketTest.clientTearDown(self)
393
Dave Cole331708b2004-08-09 04:51:41 +0000394class SocketPairTest(unittest.TestCase, ThreadableTest):
395
396 def __init__(self, methodName='runTest'):
397 unittest.TestCase.__init__(self, methodName=methodName)
398 ThreadableTest.__init__(self)
399
400 def setUp(self):
401 self.serv, self.cli = socket.socketpair()
402
403 def tearDown(self):
404 self.serv.close()
405 self.serv = None
406
407 def clientSetUp(self):
408 pass
409
410 def clientTearDown(self):
411 self.cli.close()
412 self.cli = None
413 ThreadableTest.clientTearDown(self)
414
Tim Peters494aaee2004-08-09 18:54:11 +0000415
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000416# The following classes are used by the sendmsg()/recvmsg() tests.
417# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
418# gives a drop-in replacement for SocketConnectedTest, but different
419# address families can be used, and the attributes serv_addr and
420# cli_addr will be set to the addresses of the endpoints.
421
422class SocketTestBase(unittest.TestCase):
423 """A base class for socket tests.
424
425 Subclasses must provide methods newSocket() to return a new socket
426 and bindSock(sock) to bind it to an unused address.
427
428 Creates a socket self.serv and sets self.serv_addr to its address.
429 """
430
431 def setUp(self):
432 self.serv = self.newSocket()
433 self.bindServer()
434
435 def bindServer(self):
436 """Bind server socket and set self.serv_addr to its address."""
437 self.bindSock(self.serv)
438 self.serv_addr = self.serv.getsockname()
439
440 def tearDown(self):
441 self.serv.close()
442 self.serv = None
443
444
445class SocketListeningTestMixin(SocketTestBase):
446 """Mixin to listen on the server socket."""
447
448 def setUp(self):
449 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100450 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000451
452
453class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
454 ThreadableTest):
455 """Mixin to add client socket and allow client/server tests.
456
457 Client socket is self.cli and its address is self.cli_addr. See
458 ThreadableTest for usage information.
459 """
460
461 def __init__(self, *args, **kwargs):
462 super().__init__(*args, **kwargs)
463 ThreadableTest.__init__(self)
464
465 def clientSetUp(self):
466 self.cli = self.newClientSocket()
467 self.bindClient()
468
469 def newClientSocket(self):
470 """Return a new socket for use as client."""
471 return self.newSocket()
472
473 def bindClient(self):
474 """Bind client socket and set self.cli_addr to its address."""
475 self.bindSock(self.cli)
476 self.cli_addr = self.cli.getsockname()
477
478 def clientTearDown(self):
479 self.cli.close()
480 self.cli = None
481 ThreadableTest.clientTearDown(self)
482
483
484class ConnectedStreamTestMixin(SocketListeningTestMixin,
485 ThreadedSocketTestMixin):
486 """Mixin to allow client/server stream tests with connected client.
487
488 Server's socket representing connection to client is self.cli_conn
489 and client's connection to server is self.serv_conn. (Based on
490 SocketConnectedTest.)
491 """
492
493 def setUp(self):
494 super().setUp()
495 # Indicate explicitly we're ready for the client thread to
496 # proceed and then perform the blocking call to accept
497 self.serverExplicitReady()
498 conn, addr = self.serv.accept()
499 self.cli_conn = conn
500
501 def tearDown(self):
502 self.cli_conn.close()
503 self.cli_conn = None
504 super().tearDown()
505
506 def clientSetUp(self):
507 super().clientSetUp()
508 self.cli.connect(self.serv_addr)
509 self.serv_conn = self.cli
510
511 def clientTearDown(self):
512 self.serv_conn.close()
513 self.serv_conn = None
514 super().clientTearDown()
515
516
517class UnixSocketTestBase(SocketTestBase):
518 """Base class for Unix-domain socket tests."""
519
520 # This class is used for file descriptor passing tests, so we
521 # create the sockets in a private directory so that other users
522 # can't send anything that might be problematic for a privileged
523 # user running the tests.
524
525 def setUp(self):
526 self.dir_path = tempfile.mkdtemp()
527 self.addCleanup(os.rmdir, self.dir_path)
528 super().setUp()
529
530 def bindSock(self, sock):
531 path = tempfile.mktemp(dir=self.dir_path)
532 sock.bind(path)
533 self.addCleanup(support.unlink, path)
534
535class UnixStreamBase(UnixSocketTestBase):
536 """Base class for Unix-domain SOCK_STREAM tests."""
537
538 def newSocket(self):
539 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
540
541
542class InetTestBase(SocketTestBase):
543 """Base class for IPv4 socket tests."""
544
545 host = HOST
546
547 def setUp(self):
548 super().setUp()
549 self.port = self.serv_addr[1]
550
551 def bindSock(self, sock):
552 support.bind_port(sock, host=self.host)
553
554class TCPTestBase(InetTestBase):
555 """Base class for TCP-over-IPv4 tests."""
556
557 def newSocket(self):
558 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
559
560class UDPTestBase(InetTestBase):
561 """Base class for UDP-over-IPv4 tests."""
562
563 def newSocket(self):
564 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
565
566class SCTPStreamBase(InetTestBase):
567 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
568
569 def newSocket(self):
570 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
571 socket.IPPROTO_SCTP)
572
573
574class Inet6TestBase(InetTestBase):
575 """Base class for IPv6 socket tests."""
576
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200577 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000578
579class UDP6TestBase(Inet6TestBase):
580 """Base class for UDP-over-IPv6 tests."""
581
582 def newSocket(self):
583 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
584
585
586# Test-skipping decorators for use with ThreadableTest.
587
588def skipWithClientIf(condition, reason):
589 """Skip decorated test if condition is true, add client_skip decorator.
590
591 If the decorated object is not a class, sets its attribute
592 "client_skip" to a decorator which will return an empty function
593 if the test is to be skipped, or the original function if it is
594 not. This can be used to avoid running the client part of a
595 skipped test when using ThreadableTest.
596 """
597 def client_pass(*args, **kwargs):
598 pass
599 def skipdec(obj):
600 retval = unittest.skip(reason)(obj)
601 if not isinstance(obj, type):
602 retval.client_skip = lambda f: client_pass
603 return retval
604 def noskipdec(obj):
605 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
606 obj.client_skip = lambda f: f
607 return obj
608 return skipdec if condition else noskipdec
609
610
611def requireAttrs(obj, *attributes):
612 """Skip decorated test if obj is missing any of the given attributes.
613
614 Sets client_skip attribute as skipWithClientIf() does.
615 """
616 missing = [name for name in attributes if not hasattr(obj, name)]
617 return skipWithClientIf(
618 missing, "don't have " + ", ".join(name for name in missing))
619
620
621def requireSocket(*args):
622 """Skip decorated test if a socket cannot be created with given arguments.
623
624 When an argument is given as a string, will use the value of that
625 attribute of the socket module, or skip the test if it doesn't
626 exist. Sets client_skip attribute as skipWithClientIf() does.
627 """
628 err = None
629 missing = [obj for obj in args if
630 isinstance(obj, str) and not hasattr(socket, obj)]
631 if missing:
632 err = "don't have " + ", ".join(name for name in missing)
633 else:
634 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
635 for obj in args]
636 try:
637 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200638 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000639 # XXX: check errno?
640 err = str(e)
641 else:
642 s.close()
643 return skipWithClientIf(
644 err is not None,
645 "can't create socket({0}): {1}".format(
646 ", ".join(str(o) for o in args), err))
647
648
Guido van Rossum24e4af82002-06-12 19:18:08 +0000649#######################################################################
650## Begin Tests
651
652class GeneralModuleTests(unittest.TestCase):
653
Ethan Furman7184bac2014-10-14 18:56:53 -0700654 def test_SocketType_is_socketobject(self):
655 import _socket
656 self.assertTrue(socket.SocketType is _socket.socket)
657 s = socket.socket()
658 self.assertIsInstance(s, socket.SocketType)
659 s.close()
660
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000661 def test_repr(self):
662 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200663 with s:
664 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000665 self.assertIn('family=%s' % socket.AF_INET, repr(s))
666 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200667 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200668 self.assertNotIn('raddr', repr(s))
669 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200670 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200671 self.assertIn(str(s.getsockname()), repr(s))
672 self.assertIn('[closed]', repr(s))
673 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000674
Victor Stinnere254e532014-07-26 14:36:55 +0200675 @unittest.skipUnless(_socket is not None, 'need _socket module')
676 def test_csocket_repr(self):
677 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
678 try:
679 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
680 % (s.fileno(), s.family, s.type, s.proto))
681 self.assertEqual(repr(s), expected)
682 finally:
683 s.close()
684 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
685 % (s.family, s.type, s.proto))
686 self.assertEqual(repr(s), expected)
687
Raymond Hettinger027bb632004-05-31 03:09:25 +0000688 def test_weakref(self):
689 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
690 p = proxy(s)
691 self.assertEqual(p.fileno(), s.fileno())
692 s.close()
693 s = None
694 try:
695 p.fileno()
696 except ReferenceError:
697 pass
698 else:
699 self.fail('Socket proxy still exists')
700
Guido van Rossum24e4af82002-06-12 19:18:08 +0000701 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000702 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300703 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200704 with self.assertRaises(OSError, msg=msg % 'OSError'):
705 raise OSError
706 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000707 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200708 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000709 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000710
Ezio Melotti63e42302011-05-07 19:47:48 +0300711 def testSendtoErrors(self):
712 # Testing that sendto doens't masks failures. See #10169.
713 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
714 self.addCleanup(s.close)
715 s.bind(('', 0))
716 sockname = s.getsockname()
717 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300718 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300719 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300720 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400721 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300722 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300723 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300724 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400725 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300726 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300727 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300728 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300729 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300730 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300731 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300732 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400733 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300734 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300735 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300736 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400737 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300738 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300739 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300740 self.assertIn('not NoneType', str(cm.exception))
741 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300742 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300743 self.assertIn('an integer is required', str(cm.exception))
744 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300745 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300746 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300747 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300748 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300749 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300750 self.assertIn('(1 given)', str(cm.exception))
751 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300752 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300753 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300754
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000756 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000757 socket.AF_INET
758 socket.SOCK_STREAM
759 socket.SOCK_DGRAM
760 socket.SOCK_RAW
761 socket.SOCK_RDM
762 socket.SOCK_SEQPACKET
763 socket.SOL_SOCKET
764 socket.SO_REUSEADDR
765
Guido van Rossum654c11e2002-06-13 20:24:17 +0000766 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000767 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000768 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000769 try:
770 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200771 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000772 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600773 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000774 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000775 try:
776 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200777 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000778 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600779 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000780 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000781 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000782 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000783 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000784
Charles-François Natali0cc86852013-09-13 19:53:08 +0200785 def test_host_resolution(self):
786 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
787 '1:1:1:1:1:1:1:1:1']:
788 self.assertRaises(OSError, socket.gethostbyname, addr)
789 self.assertRaises(OSError, socket.gethostbyaddr, addr)
790
791 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
792 self.assertEqual(socket.gethostbyname(addr), addr)
793
794 # we don't test support.HOSTv6 because there's a chance it doesn't have
795 # a matching name entry (e.g. 'ip6-localhost')
796 for host in [support.HOST]:
797 self.assertIn(host, socket.gethostbyaddr(host)[2])
798
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000799 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
800 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
801 def test_sethostname(self):
802 oldhn = socket.gethostname()
803 try:
804 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200805 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000806 if e.errno == errno.EPERM:
807 self.skipTest("test should be run as root")
808 else:
809 raise
810 try:
811 # running test as root!
812 self.assertEqual(socket.gethostname(), 'new')
813 # Should work with bytes objects too
814 socket.sethostname(b'bar')
815 self.assertEqual(socket.gethostname(), 'bar')
816 finally:
817 socket.sethostname(oldhn)
818
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700819 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
820 'socket.if_nameindex() not available.')
821 def testInterfaceNameIndex(self):
822 interfaces = socket.if_nameindex()
823 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200824 self.assertIsInstance(index, int)
825 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700826 # interface indices are non-zero integers
827 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200828 _index = socket.if_nametoindex(name)
829 self.assertIsInstance(_index, int)
830 self.assertEqual(index, _index)
831 _name = socket.if_indextoname(index)
832 self.assertIsInstance(_name, str)
833 self.assertEqual(name, _name)
834
835 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
836 'socket.if_nameindex() not available.')
837 def testInvalidInterfaceNameIndex(self):
838 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200839 self.assertRaises(OSError, socket.if_indextoname, 0)
840 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200841 # test with invalid values
842 self.assertRaises(TypeError, socket.if_nametoindex, 0)
843 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700844
Serhiy Storchaka43767632013-11-03 21:31:38 +0200845 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
846 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000847 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000848 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200849 try:
850 # On some versions, this loses a reference
851 orig = sys.getrefcount(__name__)
852 socket.getnameinfo(__name__,0)
853 except TypeError:
854 if sys.getrefcount(__name__) != orig:
855 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000856
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000858 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000859 try:
860 # On some versions, this crashes the interpreter.
861 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200862 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000863 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000864
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000865 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000866 # This just checks that htons etc. are their own inverse,
867 # when looking at the lower 16 or 32 bits.
868 sizes = {socket.htonl: 32, socket.ntohl: 32,
869 socket.htons: 16, socket.ntohs: 16}
870 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000871 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000872 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
873 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000874
Guido van Rossuma2627af2002-09-14 00:58:46 +0000875 swapped = func(mask)
876 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000877 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000878
Guido van Rossum018919a2007-01-15 00:07:32 +0000879 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000880 good_values = [ 1, 2, 3, 1, 2, 3 ]
881 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000882 for k in good_values:
883 socket.ntohl(k)
884 socket.ntohs(k)
885 socket.htonl(k)
886 socket.htons(k)
887 for k in bad_values:
888 self.assertRaises(OverflowError, socket.ntohl, k)
889 self.assertRaises(OverflowError, socket.ntohs, k)
890 self.assertRaises(OverflowError, socket.htonl, k)
891 self.assertRaises(OverflowError, socket.htons, k)
892
Barry Warsaw11b91a02004-06-28 00:50:43 +0000893 def testGetServBy(self):
894 eq = self.assertEqual
895 # Find one service that exists, then check all the related interfaces.
896 # I've ordered this by protocols that have both a tcp and udp
897 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200898 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200899 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000900 # avoid the 'echo' service on this platform, as there is an
901 # assumption breaking non-standard port/protocol entry
902 services = ('daytime', 'qotd', 'domain')
903 else:
904 services = ('echo', 'daytime', 'domain')
905 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000906 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000907 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000908 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200909 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000910 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000911 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200912 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000913 # Try same call with optional protocol omitted
914 port2 = socket.getservbyname(service)
915 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400916 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000917 try:
918 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200919 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000920 udpport = None
921 else:
922 eq(udpport, port)
923 # Now make sure the lookup by port returns the same service name
924 eq(socket.getservbyport(port2), service)
925 eq(socket.getservbyport(port, 'tcp'), service)
926 if udpport is not None:
927 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000928 # Make sure getservbyport does not accept out of range ports.
929 self.assertRaises(OverflowError, socket.getservbyport, -1)
930 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000932 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000933 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000934 # The default timeout should initially be None
935 self.assertEqual(socket.getdefaulttimeout(), None)
936 s = socket.socket()
937 self.assertEqual(s.gettimeout(), None)
938 s.close()
939
940 # Set the default timeout to 10, and see if it propagates
941 socket.setdefaulttimeout(10)
942 self.assertEqual(socket.getdefaulttimeout(), 10)
943 s = socket.socket()
944 self.assertEqual(s.gettimeout(), 10)
945 s.close()
946
947 # Reset the default timeout to None, and see if it propagates
948 socket.setdefaulttimeout(None)
949 self.assertEqual(socket.getdefaulttimeout(), None)
950 s = socket.socket()
951 self.assertEqual(s.gettimeout(), None)
952 s.close()
953
954 # Check that setting it to an invalid value raises ValueError
955 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
956
957 # Check that setting it to an invalid type raises TypeError
958 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
959
Serhiy Storchaka43767632013-11-03 21:31:38 +0200960 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
961 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000962 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000963 # Test that issue1008086 and issue767150 are fixed.
964 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000965 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
966 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000967
Serhiy Storchaka43767632013-11-03 21:31:38 +0200968 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
969 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000970 def testIPv4toString(self):
971 from socket import inet_aton as f, inet_pton, AF_INET
972 g = lambda a: inet_pton(AF_INET, a)
973
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100974 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200975 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100976 )
977
Ezio Melottib3aedd42010-11-20 19:04:17 +0000978 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
979 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
980 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
981 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
982 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100983 assertInvalid(f, '0.0.0.')
984 assertInvalid(f, '300.0.0.0')
985 assertInvalid(f, 'a.0.0.0')
986 assertInvalid(f, '1.2.3.4.5')
987 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000988
Ezio Melottib3aedd42010-11-20 19:04:17 +0000989 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
990 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
991 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
992 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100993 assertInvalid(g, '0.0.0.')
994 assertInvalid(g, '300.0.0.0')
995 assertInvalid(g, 'a.0.0.0')
996 assertInvalid(g, '1.2.3.4.5')
997 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000998
Serhiy Storchaka43767632013-11-03 21:31:38 +0200999 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1000 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001001 def testIPv6toString(self):
1002 try:
1003 from socket import inet_pton, AF_INET6, has_ipv6
1004 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001005 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001006 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001007 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001008
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001009 if sys.platform == "win32":
1010 try:
1011 inet_pton(AF_INET6, '::')
1012 except OSError as e:
1013 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001014 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001015
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001016 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001017 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001018 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001019 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001020
Ezio Melottib3aedd42010-11-20 19:04:17 +00001021 self.assertEqual(b'\x00' * 16, f('::'))
1022 self.assertEqual(b'\x00' * 16, f('0::0'))
1023 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1024 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001025 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 +00001026 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1027 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001028 self.assertEqual(
1029 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1030 f('ad42:abc::127:0:254:2')
1031 )
1032 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1033 assertInvalid('0x20::')
1034 assertInvalid(':::')
1035 assertInvalid('::0::')
1036 assertInvalid('1::abc::')
1037 assertInvalid('1::abc::def')
1038 assertInvalid('1:2:3:4:5:6:')
1039 assertInvalid('1:2:3:4:5:6')
1040 assertInvalid('1:2:3:4:5:6:7:8:')
1041 assertInvalid('1:2:3:4:5:6:7:8:0')
1042
1043 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1044 f('::254.42.23.64')
1045 )
1046 self.assertEqual(
1047 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1048 f('42::a29b:254.42.23.64')
1049 )
1050 self.assertEqual(
1051 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1052 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1053 )
1054 assertInvalid('255.254.253.252')
1055 assertInvalid('1::260.2.3.0')
1056 assertInvalid('1::0.be.e.0')
1057 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1058 assertInvalid('::1.2.3.4:0')
1059 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001060
Serhiy Storchaka43767632013-11-03 21:31:38 +02001061 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1062 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001063 def testStringToIPv4(self):
1064 from socket import inet_ntoa as f, inet_ntop, AF_INET
1065 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001066 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001067 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001068 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001069
Ezio Melottib3aedd42010-11-20 19:04:17 +00001070 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1071 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1072 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1073 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001074 assertInvalid(f, b'\x00' * 3)
1075 assertInvalid(f, b'\x00' * 5)
1076 assertInvalid(f, b'\x00' * 16)
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)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001084
Serhiy Storchaka43767632013-11-03 21:31:38 +02001085 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1086 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001087 def testStringToIPv6(self):
1088 try:
1089 from socket import inet_ntop, AF_INET6, has_ipv6
1090 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001091 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001092 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001093 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001094
1095 if sys.platform == "win32":
1096 try:
1097 inet_ntop(AF_INET6, b'\x00' * 16)
1098 except OSError as e:
1099 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001100 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001101
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001102 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001103 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001104 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001105 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001106
Ezio Melottib3aedd42010-11-20 19:04:17 +00001107 self.assertEqual('::', f(b'\x00' * 16))
1108 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1109 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001110 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001111 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 +00001112 )
1113
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001114 assertInvalid(b'\x12' * 15)
1115 assertInvalid(b'\x12' * 17)
1116 assertInvalid(b'\x12' * 4)
1117
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001118 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001119
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001120 def testSockName(self):
1121 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001122 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001123 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001124 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001125 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001126 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001127 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1128 # it reasonable to get the host's addr in addition to 0.0.0.0.
1129 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001130 try:
1131 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001132 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001133 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001134 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001135 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001136 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001137
1138 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001139 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001140 # We know a socket should start without reuse==0
1141 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001142 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001143 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001144 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001145
1146 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001147 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001148 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001149 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001150 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1151 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001152 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001153
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001154 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001155 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001156 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1157 sock.settimeout(1)
1158 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001159 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001160
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001161 def testNewAttributes(self):
1162 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001163
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001164 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1165 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001166 if hasattr(socket, 'SOCK_CLOEXEC'):
1167 self.assertIn(sock.type,
1168 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1169 socket.SOCK_STREAM))
1170 else:
1171 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001172 self.assertEqual(sock.proto, 0)
1173 sock.close()
1174
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001175 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001176 sock = socket.socket()
1177 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001178 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001179 big_port = port + 65536
1180 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001181 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1182 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1183 # Since find_unused_port() is inherently subject to race conditions, we
1184 # call it a couple times if necessary.
1185 for i in itertools.count():
1186 port = support.find_unused_port()
1187 try:
1188 sock.bind((HOST, port))
1189 except OSError as e:
1190 if e.errno != errno.EADDRINUSE or i == 5:
1191 raise
1192 else:
1193 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001194
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001195 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001196 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001197 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1198 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1199 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1200 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001201 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1202 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001203 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001204 self.assertRaises(ValueError, s.ioctl, -1, None)
1205 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001206
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001207 def testGetaddrinfo(self):
1208 try:
1209 socket.getaddrinfo('localhost', 80)
1210 except socket.gaierror as err:
1211 if err.errno == socket.EAI_SERVICE:
1212 # see http://bugs.python.org/issue1282647
1213 self.skipTest("buggy libc version")
1214 raise
1215 # len of every sequence is supposed to be == 5
1216 for info in socket.getaddrinfo(HOST, None):
1217 self.assertEqual(len(info), 5)
1218 # host can be a domain name, a string representation of an
1219 # IPv4/v6 address or None
1220 socket.getaddrinfo('localhost', 80)
1221 socket.getaddrinfo('127.0.0.1', 80)
1222 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001223 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001224 socket.getaddrinfo('::1', 80)
1225 # port can be a string service name such as "http", a numeric
1226 # port number or None
1227 socket.getaddrinfo(HOST, "http")
1228 socket.getaddrinfo(HOST, 80)
1229 socket.getaddrinfo(HOST, None)
1230 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001231 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1232 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001233 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001234 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1235 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001236 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001237 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1238 for _, socktype, _, _, _ in infos:
1239 self.assertEqual(socktype, socket.SOCK_STREAM)
1240 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001241 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001242 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1243 # a server willing to support both IPv4 and IPv6 will
1244 # usually do this
1245 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1246 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001247 # test keyword arguments
1248 a = socket.getaddrinfo(HOST, None)
1249 b = socket.getaddrinfo(host=HOST, port=None)
1250 self.assertEqual(a, b)
1251 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1252 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1253 self.assertEqual(a, b)
1254 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1255 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1256 self.assertEqual(a, b)
1257 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1258 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1259 self.assertEqual(a, b)
1260 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1261 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1262 self.assertEqual(a, b)
1263 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1264 socket.AI_PASSIVE)
1265 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1266 type=socket.SOCK_STREAM, proto=0,
1267 flags=socket.AI_PASSIVE)
1268 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001269 # Issue #6697.
1270 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001271
Ned Deilyb24f4812014-02-13 22:50:42 -08001272 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001273 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001274 try:
1275 # The arguments here are undefined and the call may succeed
1276 # or fail. All we care here is that it doesn't segfault.
1277 socket.getaddrinfo("localhost", None, 0, 0, 0,
1278 socket.AI_NUMERICSERV)
1279 except socket.gaierror:
1280 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001281
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001282 def test_getnameinfo(self):
1283 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001284 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001285
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001286 @unittest.skipUnless(support.is_resource_enabled('network'),
1287 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001288 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001289 # Check for internet access before running test (issue #12804).
1290 try:
1291 socket.gethostbyname('python.org')
1292 except socket.gaierror as e:
1293 if e.errno == socket.EAI_NODATA:
1294 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001295 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001296 domain = 'испытание.pythontest.net'
1297 socket.gethostbyname(domain)
1298 socket.gethostbyname_ex(domain)
1299 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001300 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1301 # have a reverse entry yet
1302 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001303
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001304 def check_sendall_interrupted(self, with_timeout):
1305 # socketpair() is not stricly required, but it makes things easier.
1306 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1307 self.skipTest("signal.alarm and socket.socketpair required for this test")
1308 # Our signal handlers clobber the C errno by calling a math function
1309 # with an invalid domain value.
1310 def ok_handler(*args):
1311 self.assertRaises(ValueError, math.acosh, 0)
1312 def raising_handler(*args):
1313 self.assertRaises(ValueError, math.acosh, 0)
1314 1 // 0
1315 c, s = socket.socketpair()
1316 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1317 try:
1318 if with_timeout:
1319 # Just above the one second minimum for signal.alarm
1320 c.settimeout(1.5)
1321 with self.assertRaises(ZeroDivisionError):
1322 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001323 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001324 if with_timeout:
1325 signal.signal(signal.SIGALRM, ok_handler)
1326 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001327 self.assertRaises(socket.timeout, c.sendall,
1328 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001329 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001330 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001331 signal.signal(signal.SIGALRM, old_alarm)
1332 c.close()
1333 s.close()
1334
1335 def test_sendall_interrupted(self):
1336 self.check_sendall_interrupted(False)
1337
1338 def test_sendall_interrupted_with_timeout(self):
1339 self.check_sendall_interrupted(True)
1340
Antoine Pitroue033e062010-10-29 10:38:18 +00001341 def test_dealloc_warn(self):
1342 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1343 r = repr(sock)
1344 with self.assertWarns(ResourceWarning) as cm:
1345 sock = None
1346 support.gc_collect()
1347 self.assertIn(r, str(cm.warning.args[0]))
1348 # An open socket file object gets dereferenced after the socket
1349 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1350 f = sock.makefile('rb')
1351 r = repr(sock)
1352 sock = None
1353 support.gc_collect()
1354 with self.assertWarns(ResourceWarning):
1355 f = None
1356 support.gc_collect()
1357
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001358 def test_name_closed_socketio(self):
1359 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1360 fp = sock.makefile("rb")
1361 fp.close()
1362 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1363
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001364 def test_unusable_closed_socketio(self):
1365 with socket.socket() as sock:
1366 fp = sock.makefile("rb", buffering=0)
1367 self.assertTrue(fp.readable())
1368 self.assertFalse(fp.writable())
1369 self.assertFalse(fp.seekable())
1370 fp.close()
1371 self.assertRaises(ValueError, fp.readable)
1372 self.assertRaises(ValueError, fp.writable)
1373 self.assertRaises(ValueError, fp.seekable)
1374
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001375 def test_pickle(self):
1376 sock = socket.socket()
1377 with sock:
1378 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1379 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1380
Serhiy Storchaka78980432013-01-15 01:12:17 +02001381 def test_listen_backlog(self):
1382 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001383 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1384 srv.bind((HOST, 0))
1385 srv.listen(backlog)
1386
1387 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001388 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001389 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001390
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001391 @support.cpython_only
1392 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001393 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001394 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001395 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1396 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001397 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001398 srv.close()
1399
Charles-François Natali42663332012-01-02 15:57:30 +01001400 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001401 def test_flowinfo(self):
1402 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001403 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001404 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001405 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001406
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001407 def test_str_for_enums(self):
1408 # Make sure that the AF_* and SOCK_* constants have enum-like string
1409 # reprs.
1410 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1411 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001412 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001413
1414 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1415 def test_uknown_socket_family_repr(self):
1416 # Test that when created with a family that's not one of the known
1417 # AF_*/SOCK_* constants, socket.family just returns the number.
1418 #
1419 # To do this we fool socket.socket into believing it already has an
1420 # open fd because on this path it doesn't actually verify the family and
1421 # type and populates the socket object.
1422 #
1423 # On Windows this trick won't work, so the test is skipped.
1424 fd, _ = tempfile.mkstemp()
1425 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1426 self.assertEqual(s.family, 42424)
1427 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001428
Charles-François Natali47413c12011-10-06 19:47:44 +02001429@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1430class BasicCANTest(unittest.TestCase):
1431
1432 def testCrucialConstants(self):
1433 socket.AF_CAN
1434 socket.PF_CAN
1435 socket.CAN_RAW
1436
Charles-François Natali773e42d2013-02-05 19:42:01 +01001437 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1438 'socket.CAN_BCM required for this test.')
1439 def testBCMConstants(self):
1440 socket.CAN_BCM
1441
1442 # opcodes
1443 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1444 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1445 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1446 socket.CAN_BCM_TX_SEND # send one CAN frame
1447 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1448 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1449 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1450 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1451 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1452 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1453 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1454 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1455
Charles-François Natali47413c12011-10-06 19:47:44 +02001456 def testCreateSocket(self):
1457 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1458 pass
1459
Charles-François Natali773e42d2013-02-05 19:42:01 +01001460 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1461 'socket.CAN_BCM required for this test.')
1462 def testCreateBCMSocket(self):
1463 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1464 pass
1465
Charles-François Natali47413c12011-10-06 19:47:44 +02001466 def testBindAny(self):
1467 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1468 s.bind(('', ))
1469
1470 def testTooLongInterfaceName(self):
1471 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1472 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001473 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001474 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001475
1476 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1477 'socket.CAN_RAW_LOOPBACK required for this test.')
1478 def testLoopback(self):
1479 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1480 for loopback in (0, 1):
1481 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1482 loopback)
1483 self.assertEqual(loopback,
1484 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1485
1486 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1487 'socket.CAN_RAW_FILTER required for this test.')
1488 def testFilter(self):
1489 can_id, can_mask = 0x200, 0x700
1490 can_filter = struct.pack("=II", can_id, can_mask)
1491 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1492 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1493 self.assertEqual(can_filter,
1494 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1495
1496
1497@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001498@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001499class CANTest(ThreadedCANSocketTest):
1500
Charles-François Natali47413c12011-10-06 19:47:44 +02001501 def __init__(self, methodName='runTest'):
1502 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1503
1504 @classmethod
1505 def build_can_frame(cls, can_id, data):
1506 """Build a CAN frame."""
1507 can_dlc = len(data)
1508 data = data.ljust(8, b'\x00')
1509 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1510
1511 @classmethod
1512 def dissect_can_frame(cls, frame):
1513 """Dissect a CAN frame."""
1514 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1515 return (can_id, can_dlc, data[:can_dlc])
1516
1517 def testSendFrame(self):
1518 cf, addr = self.s.recvfrom(self.bufsize)
1519 self.assertEqual(self.cf, cf)
1520 self.assertEqual(addr[0], self.interface)
1521 self.assertEqual(addr[1], socket.AF_CAN)
1522
1523 def _testSendFrame(self):
1524 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1525 self.cli.send(self.cf)
1526
1527 def testSendMaxFrame(self):
1528 cf, addr = self.s.recvfrom(self.bufsize)
1529 self.assertEqual(self.cf, cf)
1530
1531 def _testSendMaxFrame(self):
1532 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1533 self.cli.send(self.cf)
1534
1535 def testSendMultiFrames(self):
1536 cf, addr = self.s.recvfrom(self.bufsize)
1537 self.assertEqual(self.cf1, cf)
1538
1539 cf, addr = self.s.recvfrom(self.bufsize)
1540 self.assertEqual(self.cf2, cf)
1541
1542 def _testSendMultiFrames(self):
1543 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1544 self.cli.send(self.cf1)
1545
1546 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1547 self.cli.send(self.cf2)
1548
Charles-François Natali773e42d2013-02-05 19:42:01 +01001549 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1550 'socket.CAN_BCM required for this test.')
1551 def _testBCM(self):
1552 cf, addr = self.cli.recvfrom(self.bufsize)
1553 self.assertEqual(self.cf, cf)
1554 can_id, can_dlc, data = self.dissect_can_frame(cf)
1555 self.assertEqual(self.can_id, can_id)
1556 self.assertEqual(self.data, data)
1557
1558 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1559 'socket.CAN_BCM required for this test.')
1560 def testBCM(self):
1561 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1562 self.addCleanup(bcm.close)
1563 bcm.connect((self.interface,))
1564 self.can_id = 0x123
1565 self.data = bytes([0xc0, 0xff, 0xee])
1566 self.cf = self.build_can_frame(self.can_id, self.data)
1567 opcode = socket.CAN_BCM_TX_SEND
1568 flags = 0
1569 count = 0
1570 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1571 bcm_can_id = 0x0222
1572 nframes = 1
1573 assert len(self.cf) == 16
1574 header = struct.pack(self.bcm_cmd_msg_fmt,
1575 opcode,
1576 flags,
1577 count,
1578 ival1_seconds,
1579 ival1_usec,
1580 ival2_seconds,
1581 ival2_usec,
1582 bcm_can_id,
1583 nframes,
1584 )
1585 header_plus_frame = header + self.cf
1586 bytes_sent = bcm.send(header_plus_frame)
1587 self.assertEqual(bytes_sent, len(header_plus_frame))
1588
Charles-François Natali47413c12011-10-06 19:47:44 +02001589
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001590@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1591class BasicRDSTest(unittest.TestCase):
1592
1593 def testCrucialConstants(self):
1594 socket.AF_RDS
1595 socket.PF_RDS
1596
1597 def testCreateSocket(self):
1598 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1599 pass
1600
1601 def testSocketBufferSize(self):
1602 bufsize = 16384
1603 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1604 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1605 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1606
1607
1608@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1609@unittest.skipUnless(thread, 'Threading required for this test.')
1610class RDSTest(ThreadedRDSSocketTest):
1611
1612 def __init__(self, methodName='runTest'):
1613 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1614
Charles-François Natali240c55f2011-11-10 20:33:36 +01001615 def setUp(self):
1616 super().setUp()
1617 self.evt = threading.Event()
1618
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001619 def testSendAndRecv(self):
1620 data, addr = self.serv.recvfrom(self.bufsize)
1621 self.assertEqual(self.data, data)
1622 self.assertEqual(self.cli_addr, addr)
1623
1624 def _testSendAndRecv(self):
1625 self.data = b'spam'
1626 self.cli.sendto(self.data, 0, (HOST, self.port))
1627
1628 def testPeek(self):
1629 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1630 self.assertEqual(self.data, data)
1631 data, addr = self.serv.recvfrom(self.bufsize)
1632 self.assertEqual(self.data, data)
1633
1634 def _testPeek(self):
1635 self.data = b'spam'
1636 self.cli.sendto(self.data, 0, (HOST, self.port))
1637
1638 @requireAttrs(socket.socket, 'recvmsg')
1639 def testSendAndRecvMsg(self):
1640 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1641 self.assertEqual(self.data, data)
1642
1643 @requireAttrs(socket.socket, 'sendmsg')
1644 def _testSendAndRecvMsg(self):
1645 self.data = b'hello ' * 10
1646 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1647
1648 def testSendAndRecvMulti(self):
1649 data, addr = self.serv.recvfrom(self.bufsize)
1650 self.assertEqual(self.data1, data)
1651
1652 data, addr = self.serv.recvfrom(self.bufsize)
1653 self.assertEqual(self.data2, data)
1654
1655 def _testSendAndRecvMulti(self):
1656 self.data1 = b'bacon'
1657 self.cli.sendto(self.data1, 0, (HOST, self.port))
1658
1659 self.data2 = b'egg'
1660 self.cli.sendto(self.data2, 0, (HOST, self.port))
1661
1662 def testSelect(self):
1663 r, w, x = select.select([self.serv], [], [], 3.0)
1664 self.assertIn(self.serv, r)
1665 data, addr = self.serv.recvfrom(self.bufsize)
1666 self.assertEqual(self.data, data)
1667
1668 def _testSelect(self):
1669 self.data = b'select'
1670 self.cli.sendto(self.data, 0, (HOST, self.port))
1671
1672 def testCongestion(self):
1673 # wait until the sender is done
1674 self.evt.wait()
1675
1676 def _testCongestion(self):
1677 # test the behavior in case of congestion
1678 self.data = b'fill'
1679 self.cli.setblocking(False)
1680 try:
1681 # try to lower the receiver's socket buffer size
1682 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1683 except OSError:
1684 pass
1685 with self.assertRaises(OSError) as cm:
1686 try:
1687 # fill the receiver's socket buffer
1688 while True:
1689 self.cli.sendto(self.data, 0, (HOST, self.port))
1690 finally:
1691 # signal the receiver we're done
1692 self.evt.set()
1693 # sendto() should have failed with ENOBUFS
1694 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1695 # and we should have received a congestion notification through poll
1696 r, w, x = select.select([self.serv], [], [], 3.0)
1697 self.assertIn(self.serv, r)
1698
1699
Victor Stinner45df8202010-04-28 22:31:17 +00001700@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001701class BasicTCPTest(SocketConnectedTest):
1702
1703 def __init__(self, methodName='runTest'):
1704 SocketConnectedTest.__init__(self, methodName=methodName)
1705
1706 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001707 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001708 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001709 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001710
1711 def _testRecv(self):
1712 self.serv_conn.send(MSG)
1713
1714 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001715 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001716 seg1 = self.cli_conn.recv(len(MSG) - 3)
1717 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001718 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001719 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001720
1721 def _testOverFlowRecv(self):
1722 self.serv_conn.send(MSG)
1723
1724 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001725 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001726 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001727 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001728
1729 def _testRecvFrom(self):
1730 self.serv_conn.send(MSG)
1731
1732 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001733 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001734 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1735 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001736 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001737 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001738
1739 def _testOverFlowRecvFrom(self):
1740 self.serv_conn.send(MSG)
1741
1742 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001743 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001744 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001745 while 1:
1746 read = self.cli_conn.recv(1024)
1747 if not read:
1748 break
Guido van Rossume531e292002-08-08 20:28:34 +00001749 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001750 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001751
1752 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001753 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001754 self.serv_conn.sendall(big_chunk)
1755
1756 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001757 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001758 fd = self.cli_conn.fileno()
1759 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001760 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001761 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001762 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001763 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001764
1765 def _testFromFd(self):
1766 self.serv_conn.send(MSG)
1767
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001768 def testDup(self):
1769 # Testing dup()
1770 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001771 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001772 msg = sock.recv(1024)
1773 self.assertEqual(msg, MSG)
1774
1775 def _testDup(self):
1776 self.serv_conn.send(MSG)
1777
Guido van Rossum24e4af82002-06-12 19:18:08 +00001778 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001779 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001780 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001781 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001782 # wait for _testShutdown to finish: on OS X, when the server
1783 # closes the connection the client also becomes disconnected,
1784 # and the client's shutdown call will fail. (Issue #4397.)
1785 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001786
1787 def _testShutdown(self):
1788 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001789 self.serv_conn.shutdown(2)
1790
1791 testShutdown_overflow = support.cpython_only(testShutdown)
1792
1793 @support.cpython_only
1794 def _testShutdown_overflow(self):
1795 import _testcapi
1796 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001797 # Issue 15989
1798 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1799 _testcapi.INT_MAX + 1)
1800 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1801 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001802 self.serv_conn.shutdown(2)
1803
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001804 def testDetach(self):
1805 # Testing detach()
1806 fileno = self.cli_conn.fileno()
1807 f = self.cli_conn.detach()
1808 self.assertEqual(f, fileno)
1809 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001810 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001811 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001812 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001813 # ...but we can create another socket using the (still open)
1814 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001815 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001816 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001817 msg = sock.recv(1024)
1818 self.assertEqual(msg, MSG)
1819
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001820 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001821 self.serv_conn.send(MSG)
1822
Victor Stinner45df8202010-04-28 22:31:17 +00001823@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001824class BasicUDPTest(ThreadedUDPSocketTest):
1825
1826 def __init__(self, methodName='runTest'):
1827 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1828
1829 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001830 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001831 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001832 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001833
1834 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001835 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001836
Guido van Rossum1c938012002-06-12 21:17:20 +00001837 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001838 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001839 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001840 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001841
Guido van Rossum1c938012002-06-12 21:17:20 +00001842 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001843 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001844
Guido van Rossumd8faa362007-04-27 19:54:29 +00001845 def testRecvFromNegative(self):
1846 # Negative lengths passed to recvfrom should give ValueError.
1847 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1848
1849 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001850 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001851
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001852# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1853# same test code is used with different families and types of socket
1854# (e.g. stream, datagram), and tests using recvmsg() are repeated
1855# using recvmsg_into().
1856#
1857# The generic test classes such as SendmsgTests and
1858# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1859# supplied with sockets cli_sock and serv_sock representing the
1860# client's and the server's end of the connection respectively, and
1861# attributes cli_addr and serv_addr holding their (numeric where
1862# appropriate) addresses.
1863#
1864# The final concrete test classes combine these with subclasses of
1865# SocketTestBase which set up client and server sockets of a specific
1866# type, and with subclasses of SendrecvmsgBase such as
1867# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1868# sockets to cli_sock and serv_sock and override the methods and
1869# attributes of SendrecvmsgBase to fill in destination addresses if
1870# needed when sending, check for specific flags in msg_flags, etc.
1871#
1872# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1873# recvmsg_into().
1874
1875# XXX: like the other datagram (UDP) tests in this module, the code
1876# here assumes that datagram delivery on the local machine will be
1877# reliable.
1878
1879class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1880 # Base class for sendmsg()/recvmsg() tests.
1881
1882 # Time in seconds to wait before considering a test failed, or
1883 # None for no timeout. Not all tests actually set a timeout.
1884 fail_timeout = 3.0
1885
1886 def setUp(self):
1887 self.misc_event = threading.Event()
1888 super().setUp()
1889
1890 def sendToServer(self, msg):
1891 # Send msg to the server.
1892 return self.cli_sock.send(msg)
1893
1894 # Tuple of alternative default arguments for sendmsg() when called
1895 # via sendmsgToServer() (e.g. to include a destination address).
1896 sendmsg_to_server_defaults = ()
1897
1898 def sendmsgToServer(self, *args):
1899 # Call sendmsg() on self.cli_sock with the given arguments,
1900 # filling in any arguments which are not supplied with the
1901 # corresponding items of self.sendmsg_to_server_defaults, if
1902 # any.
1903 return self.cli_sock.sendmsg(
1904 *(args + self.sendmsg_to_server_defaults[len(args):]))
1905
1906 def doRecvmsg(self, sock, bufsize, *args):
1907 # Call recvmsg() on sock with given arguments and return its
1908 # result. Should be used for tests which can use either
1909 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1910 # this method with one which emulates it using recvmsg_into(),
1911 # thus allowing the same test to be used for both methods.
1912 result = sock.recvmsg(bufsize, *args)
1913 self.registerRecvmsgResult(result)
1914 return result
1915
1916 def registerRecvmsgResult(self, result):
1917 # Called by doRecvmsg() with the return value of recvmsg() or
1918 # recvmsg_into(). Can be overridden to arrange cleanup based
1919 # on the returned ancillary data, for instance.
1920 pass
1921
1922 def checkRecvmsgAddress(self, addr1, addr2):
1923 # Called to compare the received address with the address of
1924 # the peer.
1925 self.assertEqual(addr1, addr2)
1926
1927 # Flags that are normally unset in msg_flags
1928 msg_flags_common_unset = 0
1929 for name in ("MSG_CTRUNC", "MSG_OOB"):
1930 msg_flags_common_unset |= getattr(socket, name, 0)
1931
1932 # Flags that are normally set
1933 msg_flags_common_set = 0
1934
1935 # Flags set when a complete record has been received (e.g. MSG_EOR
1936 # for SCTP)
1937 msg_flags_eor_indicator = 0
1938
1939 # Flags set when a complete record has not been received
1940 # (e.g. MSG_TRUNC for datagram sockets)
1941 msg_flags_non_eor_indicator = 0
1942
1943 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1944 # Method to check the value of msg_flags returned by recvmsg[_into]().
1945 #
1946 # Checks that all bits in msg_flags_common_set attribute are
1947 # set in "flags" and all bits in msg_flags_common_unset are
1948 # unset.
1949 #
1950 # The "eor" argument specifies whether the flags should
1951 # indicate that a full record (or datagram) has been received.
1952 # If "eor" is None, no checks are done; otherwise, checks
1953 # that:
1954 #
1955 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1956 # set and all bits in msg_flags_non_eor_indicator are unset
1957 #
1958 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1959 # are set and all bits in msg_flags_eor_indicator are unset
1960 #
1961 # If "checkset" and/or "checkunset" are supplied, they require
1962 # the given bits to be set or unset respectively, overriding
1963 # what the attributes require for those bits.
1964 #
1965 # If any bits are set in "ignore", they will not be checked,
1966 # regardless of the other inputs.
1967 #
1968 # Will raise Exception if the inputs require a bit to be both
1969 # set and unset, and it is not ignored.
1970
1971 defaultset = self.msg_flags_common_set
1972 defaultunset = self.msg_flags_common_unset
1973
1974 if eor:
1975 defaultset |= self.msg_flags_eor_indicator
1976 defaultunset |= self.msg_flags_non_eor_indicator
1977 elif eor is not None:
1978 defaultset |= self.msg_flags_non_eor_indicator
1979 defaultunset |= self.msg_flags_eor_indicator
1980
1981 # Function arguments override defaults
1982 defaultset &= ~checkunset
1983 defaultunset &= ~checkset
1984
1985 # Merge arguments with remaining defaults, and check for conflicts
1986 checkset |= defaultset
1987 checkunset |= defaultunset
1988 inboth = checkset & checkunset & ~ignore
1989 if inboth:
1990 raise Exception("contradictory set, unset requirements for flags "
1991 "{0:#x}".format(inboth))
1992
1993 # Compare with given msg_flags value
1994 mask = (checkset | checkunset) & ~ignore
1995 self.assertEqual(flags & mask, checkset & mask)
1996
1997
1998class RecvmsgIntoMixin(SendrecvmsgBase):
1999 # Mixin to implement doRecvmsg() using recvmsg_into().
2000
2001 def doRecvmsg(self, sock, bufsize, *args):
2002 buf = bytearray(bufsize)
2003 result = sock.recvmsg_into([buf], *args)
2004 self.registerRecvmsgResult(result)
2005 self.assertGreaterEqual(result[0], 0)
2006 self.assertLessEqual(result[0], bufsize)
2007 return (bytes(buf[:result[0]]),) + result[1:]
2008
2009
2010class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2011 # Defines flags to be checked in msg_flags for datagram sockets.
2012
2013 @property
2014 def msg_flags_non_eor_indicator(self):
2015 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2016
2017
2018class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2019 # Defines flags to be checked in msg_flags for SCTP sockets.
2020
2021 @property
2022 def msg_flags_eor_indicator(self):
2023 return super().msg_flags_eor_indicator | socket.MSG_EOR
2024
2025
2026class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2027 # Base class for tests on connectionless-mode sockets. Users must
2028 # supply sockets on attributes cli and serv to be mapped to
2029 # cli_sock and serv_sock respectively.
2030
2031 @property
2032 def serv_sock(self):
2033 return self.serv
2034
2035 @property
2036 def cli_sock(self):
2037 return self.cli
2038
2039 @property
2040 def sendmsg_to_server_defaults(self):
2041 return ([], [], 0, self.serv_addr)
2042
2043 def sendToServer(self, msg):
2044 return self.cli_sock.sendto(msg, self.serv_addr)
2045
2046
2047class SendrecvmsgConnectedBase(SendrecvmsgBase):
2048 # Base class for tests on connected sockets. Users must supply
2049 # sockets on attributes serv_conn and cli_conn (representing the
2050 # connections *to* the server and the client), to be mapped to
2051 # cli_sock and serv_sock respectively.
2052
2053 @property
2054 def serv_sock(self):
2055 return self.cli_conn
2056
2057 @property
2058 def cli_sock(self):
2059 return self.serv_conn
2060
2061 def checkRecvmsgAddress(self, addr1, addr2):
2062 # Address is currently "unspecified" for a connected socket,
2063 # so we don't examine it
2064 pass
2065
2066
2067class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2068 # Base class to set a timeout on server's socket.
2069
2070 def setUp(self):
2071 super().setUp()
2072 self.serv_sock.settimeout(self.fail_timeout)
2073
2074
2075class SendmsgTests(SendrecvmsgServerTimeoutBase):
2076 # Tests for sendmsg() which can use any socket type and do not
2077 # involve recvmsg() or recvmsg_into().
2078
2079 def testSendmsg(self):
2080 # Send a simple message with sendmsg().
2081 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2082
2083 def _testSendmsg(self):
2084 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2085
2086 def testSendmsgDataGenerator(self):
2087 # Send from buffer obtained from a generator (not a sequence).
2088 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2089
2090 def _testSendmsgDataGenerator(self):
2091 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2092 len(MSG))
2093
2094 def testSendmsgAncillaryGenerator(self):
2095 # Gather (empty) ancillary data from a generator.
2096 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2097
2098 def _testSendmsgAncillaryGenerator(self):
2099 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2100 len(MSG))
2101
2102 def testSendmsgArray(self):
2103 # Send data from an array instead of the usual bytes object.
2104 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2105
2106 def _testSendmsgArray(self):
2107 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2108 len(MSG))
2109
2110 def testSendmsgGather(self):
2111 # Send message data from more than one buffer (gather write).
2112 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2113
2114 def _testSendmsgGather(self):
2115 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2116
2117 def testSendmsgBadArgs(self):
2118 # Check that sendmsg() rejects invalid arguments.
2119 self.assertEqual(self.serv_sock.recv(1000), b"done")
2120
2121 def _testSendmsgBadArgs(self):
2122 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2123 self.assertRaises(TypeError, self.sendmsgToServer,
2124 b"not in an iterable")
2125 self.assertRaises(TypeError, self.sendmsgToServer,
2126 object())
2127 self.assertRaises(TypeError, self.sendmsgToServer,
2128 [object()])
2129 self.assertRaises(TypeError, self.sendmsgToServer,
2130 [MSG, object()])
2131 self.assertRaises(TypeError, self.sendmsgToServer,
2132 [MSG], object())
2133 self.assertRaises(TypeError, self.sendmsgToServer,
2134 [MSG], [], object())
2135 self.assertRaises(TypeError, self.sendmsgToServer,
2136 [MSG], [], 0, object())
2137 self.sendToServer(b"done")
2138
2139 def testSendmsgBadCmsg(self):
2140 # Check that invalid ancillary data items are rejected.
2141 self.assertEqual(self.serv_sock.recv(1000), b"done")
2142
2143 def _testSendmsgBadCmsg(self):
2144 self.assertRaises(TypeError, self.sendmsgToServer,
2145 [MSG], [object()])
2146 self.assertRaises(TypeError, self.sendmsgToServer,
2147 [MSG], [(object(), 0, b"data")])
2148 self.assertRaises(TypeError, self.sendmsgToServer,
2149 [MSG], [(0, object(), b"data")])
2150 self.assertRaises(TypeError, self.sendmsgToServer,
2151 [MSG], [(0, 0, object())])
2152 self.assertRaises(TypeError, self.sendmsgToServer,
2153 [MSG], [(0, 0)])
2154 self.assertRaises(TypeError, self.sendmsgToServer,
2155 [MSG], [(0, 0, b"data", 42)])
2156 self.sendToServer(b"done")
2157
2158 @requireAttrs(socket, "CMSG_SPACE")
2159 def testSendmsgBadMultiCmsg(self):
2160 # Check that invalid ancillary data items are rejected when
2161 # more than one item is present.
2162 self.assertEqual(self.serv_sock.recv(1000), b"done")
2163
2164 @testSendmsgBadMultiCmsg.client_skip
2165 def _testSendmsgBadMultiCmsg(self):
2166 self.assertRaises(TypeError, self.sendmsgToServer,
2167 [MSG], [0, 0, b""])
2168 self.assertRaises(TypeError, self.sendmsgToServer,
2169 [MSG], [(0, 0, b""), object()])
2170 self.sendToServer(b"done")
2171
2172 def testSendmsgExcessCmsgReject(self):
2173 # Check that sendmsg() rejects excess ancillary data items
2174 # when the number that can be sent is limited.
2175 self.assertEqual(self.serv_sock.recv(1000), b"done")
2176
2177 def _testSendmsgExcessCmsgReject(self):
2178 if not hasattr(socket, "CMSG_SPACE"):
2179 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002180 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002181 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2182 self.assertIsNone(cm.exception.errno)
2183 self.sendToServer(b"done")
2184
2185 def testSendmsgAfterClose(self):
2186 # Check that sendmsg() fails on a closed socket.
2187 pass
2188
2189 def _testSendmsgAfterClose(self):
2190 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002191 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002192
2193
2194class SendmsgStreamTests(SendmsgTests):
2195 # Tests for sendmsg() which require a stream socket and do not
2196 # involve recvmsg() or recvmsg_into().
2197
2198 def testSendmsgExplicitNoneAddr(self):
2199 # Check that peer address can be specified as None.
2200 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2201
2202 def _testSendmsgExplicitNoneAddr(self):
2203 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2204
2205 def testSendmsgTimeout(self):
2206 # Check that timeout works with sendmsg().
2207 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2208 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2209
2210 def _testSendmsgTimeout(self):
2211 try:
2212 self.cli_sock.settimeout(0.03)
2213 with self.assertRaises(socket.timeout):
2214 while True:
2215 self.sendmsgToServer([b"a"*512])
2216 finally:
2217 self.misc_event.set()
2218
2219 # XXX: would be nice to have more tests for sendmsg flags argument.
2220
2221 # Linux supports MSG_DONTWAIT when sending, but in general, it
2222 # only works when receiving. Could add other platforms if they
2223 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002224 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002225 "MSG_DONTWAIT not known to work on this platform when "
2226 "sending")
2227 def testSendmsgDontWait(self):
2228 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2229 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2230 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2231
2232 @testSendmsgDontWait.client_skip
2233 def _testSendmsgDontWait(self):
2234 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002235 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002236 while True:
2237 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2238 self.assertIn(cm.exception.errno,
2239 (errno.EAGAIN, errno.EWOULDBLOCK))
2240 finally:
2241 self.misc_event.set()
2242
2243
2244class SendmsgConnectionlessTests(SendmsgTests):
2245 # Tests for sendmsg() which require a connectionless-mode
2246 # (e.g. datagram) socket, and do not involve recvmsg() or
2247 # recvmsg_into().
2248
2249 def testSendmsgNoDestAddr(self):
2250 # Check that sendmsg() fails when no destination address is
2251 # given for unconnected socket.
2252 pass
2253
2254 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002255 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002256 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002257 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002258 [MSG], [], 0, None)
2259
2260
2261class RecvmsgGenericTests(SendrecvmsgBase):
2262 # Tests for recvmsg() which can also be emulated using
2263 # recvmsg_into(), and can use any socket type.
2264
2265 def testRecvmsg(self):
2266 # Receive a simple message with recvmsg[_into]().
2267 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2268 self.assertEqual(msg, MSG)
2269 self.checkRecvmsgAddress(addr, self.cli_addr)
2270 self.assertEqual(ancdata, [])
2271 self.checkFlags(flags, eor=True)
2272
2273 def _testRecvmsg(self):
2274 self.sendToServer(MSG)
2275
2276 def testRecvmsgExplicitDefaults(self):
2277 # Test recvmsg[_into]() with default arguments provided explicitly.
2278 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2279 len(MSG), 0, 0)
2280 self.assertEqual(msg, MSG)
2281 self.checkRecvmsgAddress(addr, self.cli_addr)
2282 self.assertEqual(ancdata, [])
2283 self.checkFlags(flags, eor=True)
2284
2285 def _testRecvmsgExplicitDefaults(self):
2286 self.sendToServer(MSG)
2287
2288 def testRecvmsgShorter(self):
2289 # Receive a message smaller than buffer.
2290 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2291 len(MSG) + 42)
2292 self.assertEqual(msg, MSG)
2293 self.checkRecvmsgAddress(addr, self.cli_addr)
2294 self.assertEqual(ancdata, [])
2295 self.checkFlags(flags, eor=True)
2296
2297 def _testRecvmsgShorter(self):
2298 self.sendToServer(MSG)
2299
Charles-François Natali8619cd72011-10-03 19:43:15 +02002300 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2301 # datagram is received (issue #13001).
2302 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002303 def testRecvmsgTrunc(self):
2304 # Receive part of message, check for truncation indicators.
2305 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2306 len(MSG) - 3)
2307 self.assertEqual(msg, MSG[:-3])
2308 self.checkRecvmsgAddress(addr, self.cli_addr)
2309 self.assertEqual(ancdata, [])
2310 self.checkFlags(flags, eor=False)
2311
Charles-François Natali8619cd72011-10-03 19:43:15 +02002312 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002313 def _testRecvmsgTrunc(self):
2314 self.sendToServer(MSG)
2315
2316 def testRecvmsgShortAncillaryBuf(self):
2317 # Test ancillary data buffer too small to hold any ancillary data.
2318 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2319 len(MSG), 1)
2320 self.assertEqual(msg, MSG)
2321 self.checkRecvmsgAddress(addr, self.cli_addr)
2322 self.assertEqual(ancdata, [])
2323 self.checkFlags(flags, eor=True)
2324
2325 def _testRecvmsgShortAncillaryBuf(self):
2326 self.sendToServer(MSG)
2327
2328 def testRecvmsgLongAncillaryBuf(self):
2329 # Test large ancillary data buffer.
2330 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2331 len(MSG), 10240)
2332 self.assertEqual(msg, MSG)
2333 self.checkRecvmsgAddress(addr, self.cli_addr)
2334 self.assertEqual(ancdata, [])
2335 self.checkFlags(flags, eor=True)
2336
2337 def _testRecvmsgLongAncillaryBuf(self):
2338 self.sendToServer(MSG)
2339
2340 def testRecvmsgAfterClose(self):
2341 # Check that recvmsg[_into]() fails on a closed socket.
2342 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002343 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002344
2345 def _testRecvmsgAfterClose(self):
2346 pass
2347
2348 def testRecvmsgTimeout(self):
2349 # Check that timeout works.
2350 try:
2351 self.serv_sock.settimeout(0.03)
2352 self.assertRaises(socket.timeout,
2353 self.doRecvmsg, self.serv_sock, len(MSG))
2354 finally:
2355 self.misc_event.set()
2356
2357 def _testRecvmsgTimeout(self):
2358 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2359
2360 @requireAttrs(socket, "MSG_PEEK")
2361 def testRecvmsgPeek(self):
2362 # Check that MSG_PEEK in flags enables examination of pending
2363 # data without consuming it.
2364
2365 # Receive part of data with MSG_PEEK.
2366 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2367 len(MSG) - 3, 0,
2368 socket.MSG_PEEK)
2369 self.assertEqual(msg, MSG[:-3])
2370 self.checkRecvmsgAddress(addr, self.cli_addr)
2371 self.assertEqual(ancdata, [])
2372 # Ignoring MSG_TRUNC here (so this test is the same for stream
2373 # and datagram sockets). Some wording in POSIX seems to
2374 # suggest that it needn't be set when peeking, but that may
2375 # just be a slip.
2376 self.checkFlags(flags, eor=False,
2377 ignore=getattr(socket, "MSG_TRUNC", 0))
2378
2379 # Receive all data with MSG_PEEK.
2380 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2381 len(MSG), 0,
2382 socket.MSG_PEEK)
2383 self.assertEqual(msg, MSG)
2384 self.checkRecvmsgAddress(addr, self.cli_addr)
2385 self.assertEqual(ancdata, [])
2386 self.checkFlags(flags, eor=True)
2387
2388 # Check that the same data can still be received normally.
2389 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2390 self.assertEqual(msg, MSG)
2391 self.checkRecvmsgAddress(addr, self.cli_addr)
2392 self.assertEqual(ancdata, [])
2393 self.checkFlags(flags, eor=True)
2394
2395 @testRecvmsgPeek.client_skip
2396 def _testRecvmsgPeek(self):
2397 self.sendToServer(MSG)
2398
2399 @requireAttrs(socket.socket, "sendmsg")
2400 def testRecvmsgFromSendmsg(self):
2401 # Test receiving with recvmsg[_into]() when message is sent
2402 # using sendmsg().
2403 self.serv_sock.settimeout(self.fail_timeout)
2404 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2405 self.assertEqual(msg, MSG)
2406 self.checkRecvmsgAddress(addr, self.cli_addr)
2407 self.assertEqual(ancdata, [])
2408 self.checkFlags(flags, eor=True)
2409
2410 @testRecvmsgFromSendmsg.client_skip
2411 def _testRecvmsgFromSendmsg(self):
2412 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2413
2414
2415class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2416 # Tests which require a stream socket and can use either recvmsg()
2417 # or recvmsg_into().
2418
2419 def testRecvmsgEOF(self):
2420 # Receive end-of-stream indicator (b"", peer socket closed).
2421 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2422 self.assertEqual(msg, b"")
2423 self.checkRecvmsgAddress(addr, self.cli_addr)
2424 self.assertEqual(ancdata, [])
2425 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2426
2427 def _testRecvmsgEOF(self):
2428 self.cli_sock.close()
2429
2430 def testRecvmsgOverflow(self):
2431 # Receive a message in more than one chunk.
2432 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2433 len(MSG) - 3)
2434 self.checkRecvmsgAddress(addr, self.cli_addr)
2435 self.assertEqual(ancdata, [])
2436 self.checkFlags(flags, eor=False)
2437
2438 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2439 self.checkRecvmsgAddress(addr, self.cli_addr)
2440 self.assertEqual(ancdata, [])
2441 self.checkFlags(flags, eor=True)
2442
2443 msg = seg1 + seg2
2444 self.assertEqual(msg, MSG)
2445
2446 def _testRecvmsgOverflow(self):
2447 self.sendToServer(MSG)
2448
2449
2450class RecvmsgTests(RecvmsgGenericTests):
2451 # Tests for recvmsg() which can use any socket type.
2452
2453 def testRecvmsgBadArgs(self):
2454 # Check that recvmsg() rejects invalid arguments.
2455 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2456 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2457 -1, 0, 0)
2458 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2459 len(MSG), -1, 0)
2460 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2461 [bytearray(10)], 0, 0)
2462 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2463 object(), 0, 0)
2464 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2465 len(MSG), object(), 0)
2466 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2467 len(MSG), 0, object())
2468
2469 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2470 self.assertEqual(msg, MSG)
2471 self.checkRecvmsgAddress(addr, self.cli_addr)
2472 self.assertEqual(ancdata, [])
2473 self.checkFlags(flags, eor=True)
2474
2475 def _testRecvmsgBadArgs(self):
2476 self.sendToServer(MSG)
2477
2478
2479class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2480 # Tests for recvmsg_into() which can use any socket type.
2481
2482 def testRecvmsgIntoBadArgs(self):
2483 # Check that recvmsg_into() rejects invalid arguments.
2484 buf = bytearray(len(MSG))
2485 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2486 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2487 len(MSG), 0, 0)
2488 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2489 buf, 0, 0)
2490 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2491 [object()], 0, 0)
2492 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2493 [b"I'm not writable"], 0, 0)
2494 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2495 [buf, object()], 0, 0)
2496 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2497 [buf], -1, 0)
2498 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2499 [buf], object(), 0)
2500 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2501 [buf], 0, object())
2502
2503 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2504 self.assertEqual(nbytes, len(MSG))
2505 self.assertEqual(buf, bytearray(MSG))
2506 self.checkRecvmsgAddress(addr, self.cli_addr)
2507 self.assertEqual(ancdata, [])
2508 self.checkFlags(flags, eor=True)
2509
2510 def _testRecvmsgIntoBadArgs(self):
2511 self.sendToServer(MSG)
2512
2513 def testRecvmsgIntoGenerator(self):
2514 # Receive into buffer obtained from a generator (not a sequence).
2515 buf = bytearray(len(MSG))
2516 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2517 (o for o in [buf]))
2518 self.assertEqual(nbytes, len(MSG))
2519 self.assertEqual(buf, bytearray(MSG))
2520 self.checkRecvmsgAddress(addr, self.cli_addr)
2521 self.assertEqual(ancdata, [])
2522 self.checkFlags(flags, eor=True)
2523
2524 def _testRecvmsgIntoGenerator(self):
2525 self.sendToServer(MSG)
2526
2527 def testRecvmsgIntoArray(self):
2528 # Receive into an array rather than the usual bytearray.
2529 buf = array.array("B", [0] * len(MSG))
2530 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2531 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002532 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002533 self.checkRecvmsgAddress(addr, self.cli_addr)
2534 self.assertEqual(ancdata, [])
2535 self.checkFlags(flags, eor=True)
2536
2537 def _testRecvmsgIntoArray(self):
2538 self.sendToServer(MSG)
2539
2540 def testRecvmsgIntoScatter(self):
2541 # Receive into multiple buffers (scatter write).
2542 b1 = bytearray(b"----")
2543 b2 = bytearray(b"0123456789")
2544 b3 = bytearray(b"--------------")
2545 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2546 [b1, memoryview(b2)[2:9], b3])
2547 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2548 self.assertEqual(b1, bytearray(b"Mary"))
2549 self.assertEqual(b2, bytearray(b"01 had a 9"))
2550 self.assertEqual(b3, bytearray(b"little lamb---"))
2551 self.checkRecvmsgAddress(addr, self.cli_addr)
2552 self.assertEqual(ancdata, [])
2553 self.checkFlags(flags, eor=True)
2554
2555 def _testRecvmsgIntoScatter(self):
2556 self.sendToServer(b"Mary had a little lamb")
2557
2558
2559class CmsgMacroTests(unittest.TestCase):
2560 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2561 # assumptions used by sendmsg() and recvmsg[_into](), which share
2562 # code with these functions.
2563
2564 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002565 try:
2566 import _testcapi
2567 except ImportError:
2568 socklen_t_limit = 0x7fffffff
2569 else:
2570 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002571
2572 @requireAttrs(socket, "CMSG_LEN")
2573 def testCMSG_LEN(self):
2574 # Test CMSG_LEN() with various valid and invalid values,
2575 # checking the assumptions used by recvmsg() and sendmsg().
2576 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2577 values = list(range(257)) + list(range(toobig - 257, toobig))
2578
2579 # struct cmsghdr has at least three members, two of which are ints
2580 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2581 for n in values:
2582 ret = socket.CMSG_LEN(n)
2583 # This is how recvmsg() calculates the data size
2584 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2585 self.assertLessEqual(ret, self.socklen_t_limit)
2586
2587 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2588 # sendmsg() shares code with these functions, and requires
2589 # that it reject values over the limit.
2590 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2591 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2592
2593 @requireAttrs(socket, "CMSG_SPACE")
2594 def testCMSG_SPACE(self):
2595 # Test CMSG_SPACE() with various valid and invalid values,
2596 # checking the assumptions used by sendmsg().
2597 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2598 values = list(range(257)) + list(range(toobig - 257, toobig))
2599
2600 last = socket.CMSG_SPACE(0)
2601 # struct cmsghdr has at least three members, two of which are ints
2602 self.assertGreater(last, array.array("i").itemsize * 2)
2603 for n in values:
2604 ret = socket.CMSG_SPACE(n)
2605 self.assertGreaterEqual(ret, last)
2606 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2607 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2608 self.assertLessEqual(ret, self.socklen_t_limit)
2609 last = ret
2610
2611 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2612 # sendmsg() shares code with these functions, and requires
2613 # that it reject values over the limit.
2614 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2615 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2616
2617
2618class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2619 # Tests for file descriptor passing on Unix-domain sockets.
2620
2621 # Invalid file descriptor value that's unlikely to evaluate to a
2622 # real FD even if one of its bytes is replaced with a different
2623 # value (which shouldn't actually happen).
2624 badfd = -0x5555
2625
2626 def newFDs(self, n):
2627 # Return a list of n file descriptors for newly-created files
2628 # containing their list indices as ASCII numbers.
2629 fds = []
2630 for i in range(n):
2631 fd, path = tempfile.mkstemp()
2632 self.addCleanup(os.unlink, path)
2633 self.addCleanup(os.close, fd)
2634 os.write(fd, str(i).encode())
2635 fds.append(fd)
2636 return fds
2637
2638 def checkFDs(self, fds):
2639 # Check that the file descriptors in the given list contain
2640 # their correct list indices as ASCII numbers.
2641 for n, fd in enumerate(fds):
2642 os.lseek(fd, 0, os.SEEK_SET)
2643 self.assertEqual(os.read(fd, 1024), str(n).encode())
2644
2645 def registerRecvmsgResult(self, result):
2646 self.addCleanup(self.closeRecvmsgFDs, result)
2647
2648 def closeRecvmsgFDs(self, recvmsg_result):
2649 # Close all file descriptors specified in the ancillary data
2650 # of the given return value from recvmsg() or recvmsg_into().
2651 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2652 if (cmsg_level == socket.SOL_SOCKET and
2653 cmsg_type == socket.SCM_RIGHTS):
2654 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002655 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002656 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2657 for fd in fds:
2658 os.close(fd)
2659
2660 def createAndSendFDs(self, n):
2661 # Send n new file descriptors created by newFDs() to the
2662 # server, with the constant MSG as the non-ancillary data.
2663 self.assertEqual(
2664 self.sendmsgToServer([MSG],
2665 [(socket.SOL_SOCKET,
2666 socket.SCM_RIGHTS,
2667 array.array("i", self.newFDs(n)))]),
2668 len(MSG))
2669
2670 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2671 # Check that constant MSG was received with numfds file
2672 # descriptors in a maximum of maxcmsgs control messages (which
2673 # must contain only complete integers). By default, check
2674 # that MSG_CTRUNC is unset, but ignore any flags in
2675 # ignoreflags.
2676 msg, ancdata, flags, addr = result
2677 self.assertEqual(msg, MSG)
2678 self.checkRecvmsgAddress(addr, self.cli_addr)
2679 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2680 ignore=ignoreflags)
2681
2682 self.assertIsInstance(ancdata, list)
2683 self.assertLessEqual(len(ancdata), maxcmsgs)
2684 fds = array.array("i")
2685 for item in ancdata:
2686 self.assertIsInstance(item, tuple)
2687 cmsg_level, cmsg_type, cmsg_data = item
2688 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2689 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2690 self.assertIsInstance(cmsg_data, bytes)
2691 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002692 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002693
2694 self.assertEqual(len(fds), numfds)
2695 self.checkFDs(fds)
2696
2697 def testFDPassSimple(self):
2698 # Pass a single FD (array read from bytes object).
2699 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2700 len(MSG), 10240))
2701
2702 def _testFDPassSimple(self):
2703 self.assertEqual(
2704 self.sendmsgToServer(
2705 [MSG],
2706 [(socket.SOL_SOCKET,
2707 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002708 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002709 len(MSG))
2710
2711 def testMultipleFDPass(self):
2712 # Pass multiple FDs in a single array.
2713 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2714 len(MSG), 10240))
2715
2716 def _testMultipleFDPass(self):
2717 self.createAndSendFDs(4)
2718
2719 @requireAttrs(socket, "CMSG_SPACE")
2720 def testFDPassCMSG_SPACE(self):
2721 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2722 self.checkRecvmsgFDs(
2723 4, self.doRecvmsg(self.serv_sock, len(MSG),
2724 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2725
2726 @testFDPassCMSG_SPACE.client_skip
2727 def _testFDPassCMSG_SPACE(self):
2728 self.createAndSendFDs(4)
2729
2730 def testFDPassCMSG_LEN(self):
2731 # Test using CMSG_LEN() to calculate ancillary buffer size.
2732 self.checkRecvmsgFDs(1,
2733 self.doRecvmsg(self.serv_sock, len(MSG),
2734 socket.CMSG_LEN(4 * SIZEOF_INT)),
2735 # RFC 3542 says implementations may set
2736 # MSG_CTRUNC if there isn't enough space
2737 # for trailing padding.
2738 ignoreflags=socket.MSG_CTRUNC)
2739
2740 def _testFDPassCMSG_LEN(self):
2741 self.createAndSendFDs(1)
2742
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002743 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002744 @requireAttrs(socket, "CMSG_SPACE")
2745 def testFDPassSeparate(self):
2746 # Pass two FDs in two separate arrays. Arrays may be combined
2747 # into a single control message by the OS.
2748 self.checkRecvmsgFDs(2,
2749 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2750 maxcmsgs=2)
2751
2752 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002753 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002754 def _testFDPassSeparate(self):
2755 fd0, fd1 = self.newFDs(2)
2756 self.assertEqual(
2757 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2758 socket.SCM_RIGHTS,
2759 array.array("i", [fd0])),
2760 (socket.SOL_SOCKET,
2761 socket.SCM_RIGHTS,
2762 array.array("i", [fd1]))]),
2763 len(MSG))
2764
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002765 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002766 @requireAttrs(socket, "CMSG_SPACE")
2767 def testFDPassSeparateMinSpace(self):
2768 # Pass two FDs in two separate arrays, receiving them into the
2769 # minimum space for two arrays.
2770 self.checkRecvmsgFDs(2,
2771 self.doRecvmsg(self.serv_sock, len(MSG),
2772 socket.CMSG_SPACE(SIZEOF_INT) +
2773 socket.CMSG_LEN(SIZEOF_INT)),
2774 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2775
2776 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002777 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002778 def _testFDPassSeparateMinSpace(self):
2779 fd0, fd1 = self.newFDs(2)
2780 self.assertEqual(
2781 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2782 socket.SCM_RIGHTS,
2783 array.array("i", [fd0])),
2784 (socket.SOL_SOCKET,
2785 socket.SCM_RIGHTS,
2786 array.array("i", [fd1]))]),
2787 len(MSG))
2788
2789 def sendAncillaryIfPossible(self, msg, ancdata):
2790 # Try to send msg and ancdata to server, but if the system
2791 # call fails, just send msg with no ancillary data.
2792 try:
2793 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002794 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002795 # Check that it was the system call that failed
2796 self.assertIsInstance(e.errno, int)
2797 nbytes = self.sendmsgToServer([msg])
2798 self.assertEqual(nbytes, len(msg))
2799
2800 def testFDPassEmpty(self):
2801 # Try to pass an empty FD array. Can receive either no array
2802 # or an empty array.
2803 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2804 len(MSG), 10240),
2805 ignoreflags=socket.MSG_CTRUNC)
2806
2807 def _testFDPassEmpty(self):
2808 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2809 socket.SCM_RIGHTS,
2810 b"")])
2811
2812 def testFDPassPartialInt(self):
2813 # Try to pass a truncated FD array.
2814 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2815 len(MSG), 10240)
2816 self.assertEqual(msg, MSG)
2817 self.checkRecvmsgAddress(addr, self.cli_addr)
2818 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2819 self.assertLessEqual(len(ancdata), 1)
2820 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2821 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2822 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2823 self.assertLess(len(cmsg_data), SIZEOF_INT)
2824
2825 def _testFDPassPartialInt(self):
2826 self.sendAncillaryIfPossible(
2827 MSG,
2828 [(socket.SOL_SOCKET,
2829 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002830 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002831
2832 @requireAttrs(socket, "CMSG_SPACE")
2833 def testFDPassPartialIntInMiddle(self):
2834 # Try to pass two FD arrays, the first of which is truncated.
2835 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2836 len(MSG), 10240)
2837 self.assertEqual(msg, MSG)
2838 self.checkRecvmsgAddress(addr, self.cli_addr)
2839 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2840 self.assertLessEqual(len(ancdata), 2)
2841 fds = array.array("i")
2842 # Arrays may have been combined in a single control message
2843 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2844 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2845 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002846 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002847 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2848 self.assertLessEqual(len(fds), 2)
2849 self.checkFDs(fds)
2850
2851 @testFDPassPartialIntInMiddle.client_skip
2852 def _testFDPassPartialIntInMiddle(self):
2853 fd0, fd1 = self.newFDs(2)
2854 self.sendAncillaryIfPossible(
2855 MSG,
2856 [(socket.SOL_SOCKET,
2857 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002858 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002859 (socket.SOL_SOCKET,
2860 socket.SCM_RIGHTS,
2861 array.array("i", [fd1]))])
2862
2863 def checkTruncatedHeader(self, result, ignoreflags=0):
2864 # Check that no ancillary data items are returned when data is
2865 # truncated inside the cmsghdr structure.
2866 msg, ancdata, flags, addr = result
2867 self.assertEqual(msg, MSG)
2868 self.checkRecvmsgAddress(addr, self.cli_addr)
2869 self.assertEqual(ancdata, [])
2870 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2871 ignore=ignoreflags)
2872
2873 def testCmsgTruncNoBufSize(self):
2874 # Check that no ancillary data is received when no buffer size
2875 # is specified.
2876 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2877 # BSD seems to set MSG_CTRUNC only
2878 # if an item has been partially
2879 # received.
2880 ignoreflags=socket.MSG_CTRUNC)
2881
2882 def _testCmsgTruncNoBufSize(self):
2883 self.createAndSendFDs(1)
2884
2885 def testCmsgTrunc0(self):
2886 # Check that no ancillary data is received when buffer size is 0.
2887 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2888 ignoreflags=socket.MSG_CTRUNC)
2889
2890 def _testCmsgTrunc0(self):
2891 self.createAndSendFDs(1)
2892
2893 # Check that no ancillary data is returned for various non-zero
2894 # (but still too small) buffer sizes.
2895
2896 def testCmsgTrunc1(self):
2897 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2898
2899 def _testCmsgTrunc1(self):
2900 self.createAndSendFDs(1)
2901
2902 def testCmsgTrunc2Int(self):
2903 # The cmsghdr structure has at least three members, two of
2904 # which are ints, so we still shouldn't see any ancillary
2905 # data.
2906 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2907 SIZEOF_INT * 2))
2908
2909 def _testCmsgTrunc2Int(self):
2910 self.createAndSendFDs(1)
2911
2912 def testCmsgTruncLen0Minus1(self):
2913 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2914 socket.CMSG_LEN(0) - 1))
2915
2916 def _testCmsgTruncLen0Minus1(self):
2917 self.createAndSendFDs(1)
2918
2919 # The following tests try to truncate the control message in the
2920 # middle of the FD array.
2921
2922 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2923 # Check that file descriptor data is truncated to between
2924 # mindata and maxdata bytes when received with buffer size
2925 # ancbuf, and that any complete file descriptor numbers are
2926 # valid.
2927 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2928 len(MSG), ancbuf)
2929 self.assertEqual(msg, MSG)
2930 self.checkRecvmsgAddress(addr, self.cli_addr)
2931 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2932
2933 if mindata == 0 and ancdata == []:
2934 return
2935 self.assertEqual(len(ancdata), 1)
2936 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2937 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2938 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2939 self.assertGreaterEqual(len(cmsg_data), mindata)
2940 self.assertLessEqual(len(cmsg_data), maxdata)
2941 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002942 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002943 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2944 self.checkFDs(fds)
2945
2946 def testCmsgTruncLen0(self):
2947 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2948
2949 def _testCmsgTruncLen0(self):
2950 self.createAndSendFDs(1)
2951
2952 def testCmsgTruncLen0Plus1(self):
2953 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2954
2955 def _testCmsgTruncLen0Plus1(self):
2956 self.createAndSendFDs(2)
2957
2958 def testCmsgTruncLen1(self):
2959 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2960 maxdata=SIZEOF_INT)
2961
2962 def _testCmsgTruncLen1(self):
2963 self.createAndSendFDs(2)
2964
2965 def testCmsgTruncLen2Minus1(self):
2966 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2967 maxdata=(2 * SIZEOF_INT) - 1)
2968
2969 def _testCmsgTruncLen2Minus1(self):
2970 self.createAndSendFDs(2)
2971
2972
2973class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2974 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2975 # features of the RFC 3542 Advanced Sockets API for IPv6.
2976 # Currently we can only handle certain data items (e.g. traffic
2977 # class, hop limit, MTU discovery and fragmentation settings)
2978 # without resorting to unportable means such as the struct module,
2979 # but the tests here are aimed at testing the ancillary data
2980 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2981 # itself.
2982
2983 # Test value to use when setting hop limit of packet
2984 hop_limit = 2
2985
2986 # Test value to use when setting traffic class of packet.
2987 # -1 means "use kernel default".
2988 traffic_class = -1
2989
2990 def ancillaryMapping(self, ancdata):
2991 # Given ancillary data list ancdata, return a mapping from
2992 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2993 # Check that no (level, type) pair appears more than once.
2994 d = {}
2995 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2996 self.assertNotIn((cmsg_level, cmsg_type), d)
2997 d[(cmsg_level, cmsg_type)] = cmsg_data
2998 return d
2999
3000 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3001 # Receive hop limit into ancbufsize bytes of ancillary data
3002 # space. Check that data is MSG, ancillary data is not
3003 # truncated (but ignore any flags in ignoreflags), and hop
3004 # limit is between 0 and maxhop inclusive.
3005 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3006 socket.IPV6_RECVHOPLIMIT, 1)
3007 self.misc_event.set()
3008 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3009 len(MSG), ancbufsize)
3010
3011 self.assertEqual(msg, MSG)
3012 self.checkRecvmsgAddress(addr, self.cli_addr)
3013 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3014 ignore=ignoreflags)
3015
3016 self.assertEqual(len(ancdata), 1)
3017 self.assertIsInstance(ancdata[0], tuple)
3018 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3019 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3020 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3021 self.assertIsInstance(cmsg_data, bytes)
3022 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3023 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003024 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003025 self.assertGreaterEqual(a[0], 0)
3026 self.assertLessEqual(a[0], maxhop)
3027
3028 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3029 def testRecvHopLimit(self):
3030 # Test receiving the packet hop limit as ancillary data.
3031 self.checkHopLimit(ancbufsize=10240)
3032
3033 @testRecvHopLimit.client_skip
3034 def _testRecvHopLimit(self):
3035 # Need to wait until server has asked to receive ancillary
3036 # data, as implementations are not required to buffer it
3037 # otherwise.
3038 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3039 self.sendToServer(MSG)
3040
3041 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3042 def testRecvHopLimitCMSG_SPACE(self):
3043 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3044 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3045
3046 @testRecvHopLimitCMSG_SPACE.client_skip
3047 def _testRecvHopLimitCMSG_SPACE(self):
3048 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3049 self.sendToServer(MSG)
3050
3051 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3052 # 3542 says portable applications must provide space for trailing
3053 # padding. Implementations may set MSG_CTRUNC if there isn't
3054 # enough space for the padding.
3055
3056 @requireAttrs(socket.socket, "sendmsg")
3057 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3058 def testSetHopLimit(self):
3059 # Test setting hop limit on outgoing packet and receiving it
3060 # at the other end.
3061 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3062
3063 @testSetHopLimit.client_skip
3064 def _testSetHopLimit(self):
3065 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3066 self.assertEqual(
3067 self.sendmsgToServer([MSG],
3068 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3069 array.array("i", [self.hop_limit]))]),
3070 len(MSG))
3071
3072 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3073 ignoreflags=0):
3074 # Receive traffic class and hop limit into ancbufsize bytes of
3075 # ancillary data space. Check that data is MSG, ancillary
3076 # data is not truncated (but ignore any flags in ignoreflags),
3077 # and traffic class and hop limit are in range (hop limit no
3078 # more than maxhop).
3079 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3080 socket.IPV6_RECVHOPLIMIT, 1)
3081 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3082 socket.IPV6_RECVTCLASS, 1)
3083 self.misc_event.set()
3084 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3085 len(MSG), ancbufsize)
3086
3087 self.assertEqual(msg, MSG)
3088 self.checkRecvmsgAddress(addr, self.cli_addr)
3089 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3090 ignore=ignoreflags)
3091 self.assertEqual(len(ancdata), 2)
3092 ancmap = self.ancillaryMapping(ancdata)
3093
3094 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3095 self.assertEqual(len(tcdata), SIZEOF_INT)
3096 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003097 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003098 self.assertGreaterEqual(a[0], 0)
3099 self.assertLessEqual(a[0], 255)
3100
3101 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3102 self.assertEqual(len(hldata), SIZEOF_INT)
3103 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003104 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003105 self.assertGreaterEqual(a[0], 0)
3106 self.assertLessEqual(a[0], maxhop)
3107
3108 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3109 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3110 def testRecvTrafficClassAndHopLimit(self):
3111 # Test receiving traffic class and hop limit as ancillary data.
3112 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3113
3114 @testRecvTrafficClassAndHopLimit.client_skip
3115 def _testRecvTrafficClassAndHopLimit(self):
3116 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3117 self.sendToServer(MSG)
3118
3119 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3120 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3121 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3122 # Test receiving traffic class and hop limit, using
3123 # CMSG_SPACE() to calculate buffer size.
3124 self.checkTrafficClassAndHopLimit(
3125 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3126
3127 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3128 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3129 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3130 self.sendToServer(MSG)
3131
3132 @requireAttrs(socket.socket, "sendmsg")
3133 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3134 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3135 def testSetTrafficClassAndHopLimit(self):
3136 # Test setting traffic class and hop limit on outgoing packet,
3137 # and receiving them at the other end.
3138 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3139 maxhop=self.hop_limit)
3140
3141 @testSetTrafficClassAndHopLimit.client_skip
3142 def _testSetTrafficClassAndHopLimit(self):
3143 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3144 self.assertEqual(
3145 self.sendmsgToServer([MSG],
3146 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3147 array.array("i", [self.traffic_class])),
3148 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3149 array.array("i", [self.hop_limit]))]),
3150 len(MSG))
3151
3152 @requireAttrs(socket.socket, "sendmsg")
3153 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3154 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3155 def testOddCmsgSize(self):
3156 # Try to send ancillary data with first item one byte too
3157 # long. Fall back to sending with correct size if this fails,
3158 # and check that second item was handled correctly.
3159 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3160 maxhop=self.hop_limit)
3161
3162 @testOddCmsgSize.client_skip
3163 def _testOddCmsgSize(self):
3164 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3165 try:
3166 nbytes = self.sendmsgToServer(
3167 [MSG],
3168 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003169 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003170 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3171 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003172 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003173 self.assertIsInstance(e.errno, int)
3174 nbytes = self.sendmsgToServer(
3175 [MSG],
3176 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3177 array.array("i", [self.traffic_class])),
3178 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3179 array.array("i", [self.hop_limit]))])
3180 self.assertEqual(nbytes, len(MSG))
3181
3182 # Tests for proper handling of truncated ancillary data
3183
3184 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3185 # Receive hop limit into ancbufsize bytes of ancillary data
3186 # space, which should be too small to contain the ancillary
3187 # data header (if ancbufsize is None, pass no second argument
3188 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3189 # (unless included in ignoreflags), and no ancillary data is
3190 # returned.
3191 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3192 socket.IPV6_RECVHOPLIMIT, 1)
3193 self.misc_event.set()
3194 args = () if ancbufsize is None else (ancbufsize,)
3195 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3196 len(MSG), *args)
3197
3198 self.assertEqual(msg, MSG)
3199 self.checkRecvmsgAddress(addr, self.cli_addr)
3200 self.assertEqual(ancdata, [])
3201 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3202 ignore=ignoreflags)
3203
3204 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3205 def testCmsgTruncNoBufSize(self):
3206 # Check that no ancillary data is received when no ancillary
3207 # buffer size is provided.
3208 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3209 # BSD seems to set
3210 # MSG_CTRUNC only if an item
3211 # has been partially
3212 # received.
3213 ignoreflags=socket.MSG_CTRUNC)
3214
3215 @testCmsgTruncNoBufSize.client_skip
3216 def _testCmsgTruncNoBufSize(self):
3217 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3218 self.sendToServer(MSG)
3219
3220 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3221 def testSingleCmsgTrunc0(self):
3222 # Check that no ancillary data is received when ancillary
3223 # buffer size is zero.
3224 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3225 ignoreflags=socket.MSG_CTRUNC)
3226
3227 @testSingleCmsgTrunc0.client_skip
3228 def _testSingleCmsgTrunc0(self):
3229 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3230 self.sendToServer(MSG)
3231
3232 # Check that no ancillary data is returned for various non-zero
3233 # (but still too small) buffer sizes.
3234
3235 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3236 def testSingleCmsgTrunc1(self):
3237 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3238
3239 @testSingleCmsgTrunc1.client_skip
3240 def _testSingleCmsgTrunc1(self):
3241 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3242 self.sendToServer(MSG)
3243
3244 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3245 def testSingleCmsgTrunc2Int(self):
3246 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3247
3248 @testSingleCmsgTrunc2Int.client_skip
3249 def _testSingleCmsgTrunc2Int(self):
3250 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3251 self.sendToServer(MSG)
3252
3253 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3254 def testSingleCmsgTruncLen0Minus1(self):
3255 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3256
3257 @testSingleCmsgTruncLen0Minus1.client_skip
3258 def _testSingleCmsgTruncLen0Minus1(self):
3259 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3260 self.sendToServer(MSG)
3261
3262 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3263 def testSingleCmsgTruncInData(self):
3264 # Test truncation of a control message inside its associated
3265 # data. The message may be returned with its data truncated,
3266 # or not returned at all.
3267 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3268 socket.IPV6_RECVHOPLIMIT, 1)
3269 self.misc_event.set()
3270 msg, ancdata, flags, addr = self.doRecvmsg(
3271 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3272
3273 self.assertEqual(msg, MSG)
3274 self.checkRecvmsgAddress(addr, self.cli_addr)
3275 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3276
3277 self.assertLessEqual(len(ancdata), 1)
3278 if ancdata:
3279 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3280 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3281 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3282 self.assertLess(len(cmsg_data), SIZEOF_INT)
3283
3284 @testSingleCmsgTruncInData.client_skip
3285 def _testSingleCmsgTruncInData(self):
3286 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3287 self.sendToServer(MSG)
3288
3289 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3290 # Receive traffic class and hop limit into ancbufsize bytes of
3291 # ancillary data space, which should be large enough to
3292 # contain the first item, but too small to contain the header
3293 # of the second. Check that data is MSG, MSG_CTRUNC is set
3294 # (unless included in ignoreflags), and only one ancillary
3295 # data item is returned.
3296 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3297 socket.IPV6_RECVHOPLIMIT, 1)
3298 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3299 socket.IPV6_RECVTCLASS, 1)
3300 self.misc_event.set()
3301 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3302 len(MSG), ancbufsize)
3303
3304 self.assertEqual(msg, MSG)
3305 self.checkRecvmsgAddress(addr, self.cli_addr)
3306 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3307 ignore=ignoreflags)
3308
3309 self.assertEqual(len(ancdata), 1)
3310 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3311 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3312 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3313 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3314 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003315 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003316 self.assertGreaterEqual(a[0], 0)
3317 self.assertLessEqual(a[0], 255)
3318
3319 # Try the above test with various buffer sizes.
3320
3321 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3322 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3323 def testSecondCmsgTrunc0(self):
3324 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3325 ignoreflags=socket.MSG_CTRUNC)
3326
3327 @testSecondCmsgTrunc0.client_skip
3328 def _testSecondCmsgTrunc0(self):
3329 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3330 self.sendToServer(MSG)
3331
3332 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3333 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3334 def testSecondCmsgTrunc1(self):
3335 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3336
3337 @testSecondCmsgTrunc1.client_skip
3338 def _testSecondCmsgTrunc1(self):
3339 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3340 self.sendToServer(MSG)
3341
3342 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3343 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3344 def testSecondCmsgTrunc2Int(self):
3345 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3346 2 * SIZEOF_INT)
3347
3348 @testSecondCmsgTrunc2Int.client_skip
3349 def _testSecondCmsgTrunc2Int(self):
3350 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3351 self.sendToServer(MSG)
3352
3353 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3354 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3355 def testSecondCmsgTruncLen0Minus1(self):
3356 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3357 socket.CMSG_LEN(0) - 1)
3358
3359 @testSecondCmsgTruncLen0Minus1.client_skip
3360 def _testSecondCmsgTruncLen0Minus1(self):
3361 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3362 self.sendToServer(MSG)
3363
3364 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3365 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3366 def testSecomdCmsgTruncInData(self):
3367 # Test truncation of the second of two control messages inside
3368 # its associated data.
3369 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3370 socket.IPV6_RECVHOPLIMIT, 1)
3371 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3372 socket.IPV6_RECVTCLASS, 1)
3373 self.misc_event.set()
3374 msg, ancdata, flags, addr = self.doRecvmsg(
3375 self.serv_sock, len(MSG),
3376 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3377
3378 self.assertEqual(msg, MSG)
3379 self.checkRecvmsgAddress(addr, self.cli_addr)
3380 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3381
3382 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3383
3384 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3385 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3386 cmsg_types.remove(cmsg_type)
3387 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3388 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003389 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003390 self.assertGreaterEqual(a[0], 0)
3391 self.assertLessEqual(a[0], 255)
3392
3393 if ancdata:
3394 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3395 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3396 cmsg_types.remove(cmsg_type)
3397 self.assertLess(len(cmsg_data), SIZEOF_INT)
3398
3399 self.assertEqual(ancdata, [])
3400
3401 @testSecomdCmsgTruncInData.client_skip
3402 def _testSecomdCmsgTruncInData(self):
3403 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3404 self.sendToServer(MSG)
3405
3406
3407# Derive concrete test classes for different socket types.
3408
3409class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3410 SendrecvmsgConnectionlessBase,
3411 ThreadedSocketTestMixin, UDPTestBase):
3412 pass
3413
3414@requireAttrs(socket.socket, "sendmsg")
3415@unittest.skipUnless(thread, 'Threading required for this test.')
3416class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3417 pass
3418
3419@requireAttrs(socket.socket, "recvmsg")
3420@unittest.skipUnless(thread, 'Threading required for this test.')
3421class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3422 pass
3423
3424@requireAttrs(socket.socket, "recvmsg_into")
3425@unittest.skipUnless(thread, 'Threading required for this test.')
3426class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3427 pass
3428
3429
3430class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3431 SendrecvmsgConnectionlessBase,
3432 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003433
3434 def checkRecvmsgAddress(self, addr1, addr2):
3435 # Called to compare the received address with the address of
3436 # the peer, ignoring scope ID
3437 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003438
3439@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003440@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003441@requireSocket("AF_INET6", "SOCK_DGRAM")
3442@unittest.skipUnless(thread, 'Threading required for this test.')
3443class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3444 pass
3445
3446@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003447@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003448@requireSocket("AF_INET6", "SOCK_DGRAM")
3449@unittest.skipUnless(thread, 'Threading required for this test.')
3450class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3451 pass
3452
3453@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003454@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003455@requireSocket("AF_INET6", "SOCK_DGRAM")
3456@unittest.skipUnless(thread, 'Threading required for this test.')
3457class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3458 pass
3459
3460@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003461@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003462@requireAttrs(socket, "IPPROTO_IPV6")
3463@requireSocket("AF_INET6", "SOCK_DGRAM")
3464@unittest.skipUnless(thread, 'Threading required for this test.')
3465class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3466 SendrecvmsgUDP6TestBase):
3467 pass
3468
3469@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003470@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003471@requireAttrs(socket, "IPPROTO_IPV6")
3472@requireSocket("AF_INET6", "SOCK_DGRAM")
3473@unittest.skipUnless(thread, 'Threading required for this test.')
3474class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3475 RFC3542AncillaryTest,
3476 SendrecvmsgUDP6TestBase):
3477 pass
3478
3479
3480class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3481 ConnectedStreamTestMixin, TCPTestBase):
3482 pass
3483
3484@requireAttrs(socket.socket, "sendmsg")
3485@unittest.skipUnless(thread, 'Threading required for this test.')
3486class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3487 pass
3488
3489@requireAttrs(socket.socket, "recvmsg")
3490@unittest.skipUnless(thread, 'Threading required for this test.')
3491class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3492 SendrecvmsgTCPTestBase):
3493 pass
3494
3495@requireAttrs(socket.socket, "recvmsg_into")
3496@unittest.skipUnless(thread, 'Threading required for this test.')
3497class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3498 SendrecvmsgTCPTestBase):
3499 pass
3500
3501
3502class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3503 SendrecvmsgConnectedBase,
3504 ConnectedStreamTestMixin, SCTPStreamBase):
3505 pass
3506
3507@requireAttrs(socket.socket, "sendmsg")
3508@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3509@unittest.skipUnless(thread, 'Threading required for this test.')
3510class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3511 pass
3512
3513@requireAttrs(socket.socket, "recvmsg")
3514@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3515@unittest.skipUnless(thread, 'Threading required for this test.')
3516class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3517 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003518
3519 def testRecvmsgEOF(self):
3520 try:
3521 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3522 except OSError as e:
3523 if e.errno != errno.ENOTCONN:
3524 raise
3525 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003526
3527@requireAttrs(socket.socket, "recvmsg_into")
3528@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3529@unittest.skipUnless(thread, 'Threading required for this test.')
3530class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3531 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003532
3533 def testRecvmsgEOF(self):
3534 try:
3535 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3536 except OSError as e:
3537 if e.errno != errno.ENOTCONN:
3538 raise
3539 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003540
3541
3542class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3543 ConnectedStreamTestMixin, UnixStreamBase):
3544 pass
3545
3546@requireAttrs(socket.socket, "sendmsg")
3547@requireAttrs(socket, "AF_UNIX")
3548@unittest.skipUnless(thread, 'Threading required for this test.')
3549class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3550 pass
3551
3552@requireAttrs(socket.socket, "recvmsg")
3553@requireAttrs(socket, "AF_UNIX")
3554@unittest.skipUnless(thread, 'Threading required for this test.')
3555class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3556 SendrecvmsgUnixStreamTestBase):
3557 pass
3558
3559@requireAttrs(socket.socket, "recvmsg_into")
3560@requireAttrs(socket, "AF_UNIX")
3561@unittest.skipUnless(thread, 'Threading required for this test.')
3562class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3563 SendrecvmsgUnixStreamTestBase):
3564 pass
3565
3566@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3567@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3568@unittest.skipUnless(thread, 'Threading required for this test.')
3569class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3570 pass
3571
3572@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3573@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3574@unittest.skipUnless(thread, 'Threading required for this test.')
3575class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3576 SendrecvmsgUnixStreamTestBase):
3577 pass
3578
3579
3580# Test interrupting the interruptible send/receive methods with a
3581# signal when a timeout is set. These tests avoid having multiple
3582# threads alive during the test so that the OS cannot deliver the
3583# signal to the wrong one.
3584
3585class InterruptedTimeoutBase(unittest.TestCase):
3586 # Base class for interrupted send/receive tests. Installs an
3587 # empty handler for SIGALRM and removes it on teardown, along with
3588 # any scheduled alarms.
3589
3590 def setUp(self):
3591 super().setUp()
3592 orig_alrm_handler = signal.signal(signal.SIGALRM,
3593 lambda signum, frame: None)
3594 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3595 self.addCleanup(self.setAlarm, 0)
3596
3597 # Timeout for socket operations
3598 timeout = 4.0
3599
3600 # Provide setAlarm() method to schedule delivery of SIGALRM after
3601 # given number of seconds, or cancel it if zero, and an
3602 # appropriate time value to use. Use setitimer() if available.
3603 if hasattr(signal, "setitimer"):
3604 alarm_time = 0.05
3605
3606 def setAlarm(self, seconds):
3607 signal.setitimer(signal.ITIMER_REAL, seconds)
3608 else:
3609 # Old systems may deliver the alarm up to one second early
3610 alarm_time = 2
3611
3612 def setAlarm(self, seconds):
3613 signal.alarm(seconds)
3614
3615
3616# Require siginterrupt() in order to ensure that system calls are
3617# interrupted by default.
3618@requireAttrs(signal, "siginterrupt")
3619@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3620 "Don't have signal.alarm or signal.setitimer")
3621class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3622 # Test interrupting the recv*() methods with signals when a
3623 # timeout is set.
3624
3625 def setUp(self):
3626 super().setUp()
3627 self.serv.settimeout(self.timeout)
3628
3629 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003630 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003631 # errno of EINTR when interrupted by a signal.
3632 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003633 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003634 func(*args, **kwargs)
3635 self.assertNotIsInstance(cm.exception, socket.timeout)
3636 self.assertEqual(cm.exception.errno, errno.EINTR)
3637
3638 def testInterruptedRecvTimeout(self):
3639 self.checkInterruptedRecv(self.serv.recv, 1024)
3640
3641 def testInterruptedRecvIntoTimeout(self):
3642 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3643
3644 def testInterruptedRecvfromTimeout(self):
3645 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3646
3647 def testInterruptedRecvfromIntoTimeout(self):
3648 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3649
3650 @requireAttrs(socket.socket, "recvmsg")
3651 def testInterruptedRecvmsgTimeout(self):
3652 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3653
3654 @requireAttrs(socket.socket, "recvmsg_into")
3655 def testInterruptedRecvmsgIntoTimeout(self):
3656 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3657
3658
3659# Require siginterrupt() in order to ensure that system calls are
3660# interrupted by default.
3661@requireAttrs(signal, "siginterrupt")
3662@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3663 "Don't have signal.alarm or signal.setitimer")
3664@unittest.skipUnless(thread, 'Threading required for this test.')
3665class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3666 ThreadSafeCleanupTestCase,
3667 SocketListeningTestMixin, TCPTestBase):
3668 # Test interrupting the interruptible send*() methods with signals
3669 # when a timeout is set.
3670
3671 def setUp(self):
3672 super().setUp()
3673 self.serv_conn = self.newSocket()
3674 self.addCleanup(self.serv_conn.close)
3675 # Use a thread to complete the connection, but wait for it to
3676 # terminate before running the test, so that there is only one
3677 # thread to accept the signal.
3678 cli_thread = threading.Thread(target=self.doConnect)
3679 cli_thread.start()
3680 self.cli_conn, addr = self.serv.accept()
3681 self.addCleanup(self.cli_conn.close)
3682 cli_thread.join()
3683 self.serv_conn.settimeout(self.timeout)
3684
3685 def doConnect(self):
3686 self.serv_conn.connect(self.serv_addr)
3687
3688 def checkInterruptedSend(self, func, *args, **kwargs):
3689 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003690 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003691 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003692 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003693 while True:
3694 self.setAlarm(self.alarm_time)
3695 func(*args, **kwargs)
3696 self.assertNotIsInstance(cm.exception, socket.timeout)
3697 self.assertEqual(cm.exception.errno, errno.EINTR)
3698
Ned Deilyc5640382014-02-03 13:58:31 -08003699 # Issue #12958: The following tests have problems on OS X prior to 10.7
3700 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003701 def testInterruptedSendTimeout(self):
3702 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3703
Ned Deilyc5640382014-02-03 13:58:31 -08003704 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003705 def testInterruptedSendtoTimeout(self):
3706 # Passing an actual address here as Python's wrapper for
3707 # sendto() doesn't allow passing a zero-length one; POSIX
3708 # requires that the address is ignored since the socket is
3709 # connection-mode, however.
3710 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3711 self.serv_addr)
3712
Ned Deilyc5640382014-02-03 13:58:31 -08003713 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003714 @requireAttrs(socket.socket, "sendmsg")
3715 def testInterruptedSendmsgTimeout(self):
3716 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3717
3718
Victor Stinner45df8202010-04-28 22:31:17 +00003719@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003720class TCPCloserTest(ThreadedTCPSocketTest):
3721
3722 def testClose(self):
3723 conn, addr = self.serv.accept()
3724 conn.close()
3725
3726 sd = self.cli
3727 read, write, err = select.select([sd], [], [], 1.0)
3728 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003729 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003730
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003731 # Calling close() many times should be safe.
3732 conn.close()
3733 conn.close()
3734
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003735 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003736 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003737 time.sleep(1.0)
3738
Victor Stinner45df8202010-04-28 22:31:17 +00003739@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003740class BasicSocketPairTest(SocketPairTest):
3741
3742 def __init__(self, methodName='runTest'):
3743 SocketPairTest.__init__(self, methodName=methodName)
3744
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003745 def _check_defaults(self, sock):
3746 self.assertIsInstance(sock, socket.socket)
3747 if hasattr(socket, 'AF_UNIX'):
3748 self.assertEqual(sock.family, socket.AF_UNIX)
3749 else:
3750 self.assertEqual(sock.family, socket.AF_INET)
3751 self.assertEqual(sock.type, socket.SOCK_STREAM)
3752 self.assertEqual(sock.proto, 0)
3753
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003754 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003755 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003756
3757 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003758 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003759
Dave Cole331708b2004-08-09 04:51:41 +00003760 def testRecv(self):
3761 msg = self.serv.recv(1024)
3762 self.assertEqual(msg, MSG)
3763
3764 def _testRecv(self):
3765 self.cli.send(MSG)
3766
3767 def testSend(self):
3768 self.serv.send(MSG)
3769
3770 def _testSend(self):
3771 msg = self.cli.recv(1024)
3772 self.assertEqual(msg, MSG)
3773
Victor Stinner45df8202010-04-28 22:31:17 +00003774@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003775class NonBlockingTCPTests(ThreadedTCPSocketTest):
3776
3777 def __init__(self, methodName='runTest'):
3778 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3779
3780 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003781 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003782 self.serv.setblocking(True)
3783 self.assertIsNone(self.serv.gettimeout())
3784 self.serv.setblocking(False)
3785 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003786 start = time.time()
3787 try:
3788 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003789 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003790 pass
3791 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003792 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003793
3794 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003795 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003796
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003797 @support.cpython_only
3798 def testSetBlocking_overflow(self):
3799 # Issue 15989
3800 import _testcapi
3801 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3802 self.skipTest('needs UINT_MAX < ULONG_MAX')
3803 self.serv.setblocking(False)
3804 self.assertEqual(self.serv.gettimeout(), 0.0)
3805 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3806 self.assertIsNone(self.serv.gettimeout())
3807
3808 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3809
Serhiy Storchaka43767632013-11-03 21:31:38 +02003810 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3811 'test needs socket.SOCK_NONBLOCK')
3812 @support.requires_linux_version(2, 6, 28)
3813 def testInitNonBlocking(self):
3814 # reinit server socket
3815 self.serv.close()
3816 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3817 socket.SOCK_NONBLOCK)
3818 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003819 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003820 # actual testing
3821 start = time.time()
3822 try:
3823 self.serv.accept()
3824 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003825 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003826 end = time.time()
3827 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3828
3829 def _testInitNonBlocking(self):
3830 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003831
Antoine Pitrou600232b2011-01-05 21:03:42 +00003832 def testInheritFlags(self):
3833 # Issue #7995: when calling accept() on a listening socket with a
3834 # timeout, the resulting socket should not be non-blocking.
3835 self.serv.settimeout(10)
3836 try:
3837 conn, addr = self.serv.accept()
3838 message = conn.recv(len(MSG))
3839 finally:
3840 conn.close()
3841 self.serv.settimeout(None)
3842
3843 def _testInheritFlags(self):
3844 time.sleep(0.1)
3845 self.cli.connect((HOST, self.port))
3846 time.sleep(0.5)
3847 self.cli.send(MSG)
3848
Guido van Rossum24e4af82002-06-12 19:18:08 +00003849 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003850 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003851 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003852 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003853 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003854 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003855 pass
3856 else:
3857 self.fail("Error trying to do non-blocking accept.")
3858 read, write, err = select.select([self.serv], [], [])
3859 if self.serv in read:
3860 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003861 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003862 else:
3863 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003864
Guido van Rossum24e4af82002-06-12 19:18:08 +00003865 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003866 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003867 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003868
3869 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003870 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003871 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003872 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003873
3874 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003875 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003876 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003877
3878 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003879 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003880 conn, addr = self.serv.accept()
3881 conn.setblocking(0)
3882 try:
3883 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003884 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003885 pass
3886 else:
3887 self.fail("Error trying to do non-blocking recv.")
3888 read, write, err = select.select([conn], [], [])
3889 if conn in read:
3890 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003891 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003892 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003893 else:
3894 self.fail("Error during select call to non-blocking socket.")
3895
3896 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003897 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003898 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003899 self.cli.send(MSG)
3900
Victor Stinner45df8202010-04-28 22:31:17 +00003901@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003902class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003903 """Unit tests for the object returned by socket.makefile()
3904
Antoine Pitrou834bd812010-10-13 16:17:14 +00003905 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003906 the client connection. You can read from this file to
3907 get output from the server.
3908
Antoine Pitrou834bd812010-10-13 16:17:14 +00003909 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003910 server connection. You can write to this file to send output
3911 to the client.
3912 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003913
Guido van Rossume9f66142002-08-07 15:46:19 +00003914 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003915 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003916 errors = 'strict'
3917 newline = None
3918
3919 read_mode = 'rb'
3920 read_msg = MSG
3921 write_mode = 'wb'
3922 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003923
Guido van Rossum24e4af82002-06-12 19:18:08 +00003924 def __init__(self, methodName='runTest'):
3925 SocketConnectedTest.__init__(self, methodName=methodName)
3926
3927 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003928 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3929 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003930 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003931 self.read_file = self.cli_conn.makefile(
3932 self.read_mode, self.bufsize,
3933 encoding = self.encoding,
3934 errors = self.errors,
3935 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003936
3937 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003938 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003939 self.read_file.close()
3940 self.assertTrue(self.read_file.closed)
3941 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003942 SocketConnectedTest.tearDown(self)
3943
3944 def clientSetUp(self):
3945 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003946 self.write_file = self.serv_conn.makefile(
3947 self.write_mode, self.bufsize,
3948 encoding = self.encoding,
3949 errors = self.errors,
3950 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003951
3952 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003953 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003954 self.write_file.close()
3955 self.assertTrue(self.write_file.closed)
3956 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003957 SocketConnectedTest.clientTearDown(self)
3958
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003959 def testReadAfterTimeout(self):
3960 # Issue #7322: A file object must disallow further reads
3961 # after a timeout has occurred.
3962 self.cli_conn.settimeout(1)
3963 self.read_file.read(3)
3964 # First read raises a timeout
3965 self.assertRaises(socket.timeout, self.read_file.read, 1)
3966 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003967 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003968 self.read_file.read(1)
3969 self.assertIn("cannot read from timed out object", str(ctx.exception))
3970
3971 def _testReadAfterTimeout(self):
3972 self.write_file.write(self.write_msg[0:3])
3973 self.write_file.flush()
3974 self.serv_finished.wait()
3975
Guido van Rossum24e4af82002-06-12 19:18:08 +00003976 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003977 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003978 first_seg = self.read_file.read(len(self.read_msg)-3)
3979 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003980 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003981 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003982
3983 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003984 self.write_file.write(self.write_msg)
3985 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003986
Guido van Rossum8c943832002-08-08 01:00:28 +00003987 def testFullRead(self):
3988 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003989 msg = self.read_file.read()
3990 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003991
3992 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003993 self.write_file.write(self.write_msg)
3994 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003995
Guido van Rossum24e4af82002-06-12 19:18:08 +00003996 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003997 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003998 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003999 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004000 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004001 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004002 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004003 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004004 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004005
4006 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004007 self.write_file.write(self.write_msg)
4008 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004009
4010 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004011 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004012 line = self.read_file.readline()
4013 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004014
4015 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004016 self.write_file.write(self.write_msg)
4017 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004018
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004019 def testCloseAfterMakefile(self):
4020 # The file returned by makefile should keep the socket open.
4021 self.cli_conn.close()
4022 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004023 msg = self.read_file.read()
4024 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004025
4026 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004027 self.write_file.write(self.write_msg)
4028 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004029
4030 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004031 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004032 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004033 if isinstance(self.read_msg, str):
4034 msg = msg.decode()
4035 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004036
4037 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004038 self.write_file.write(self.write_msg)
4039 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004040
Tim Peters116d83c2004-03-28 02:20:45 +00004041 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004042 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004043
4044 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004045 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004046
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004047 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004048 self.assertEqual(self.read_file.mode, self.read_mode)
4049 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004050
4051 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004052 self.assertEqual(self.write_file.mode, self.write_mode)
4053 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004054
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004055 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004056 self.read_file.close()
4057 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004058 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004059 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004060
4061 def _testRealClose(self):
4062 pass
4063
4064
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004065class FileObjectInterruptedTestCase(unittest.TestCase):
4066 """Test that the file object correctly handles EINTR internally."""
4067
4068 class MockSocket(object):
4069 def __init__(self, recv_funcs=()):
4070 # A generator that returns callables that we'll call for each
4071 # call to recv().
4072 self._recv_step = iter(recv_funcs)
4073
4074 def recv_into(self, buffer):
4075 data = next(self._recv_step)()
4076 assert len(buffer) >= len(data)
4077 buffer[:len(data)] = data
4078 return len(data)
4079
4080 def _decref_socketios(self):
4081 pass
4082
4083 def _textiowrap_for_test(self, buffering=-1):
4084 raw = socket.SocketIO(self, "r")
4085 if buffering < 0:
4086 buffering = io.DEFAULT_BUFFER_SIZE
4087 if buffering == 0:
4088 return raw
4089 buffer = io.BufferedReader(raw, buffering)
4090 text = io.TextIOWrapper(buffer, None, None)
4091 text.mode = "rb"
4092 return text
4093
4094 @staticmethod
4095 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02004096 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004097
4098 def _textiowrap_mock_socket(self, mock, buffering=-1):
4099 raw = socket.SocketIO(mock, "r")
4100 if buffering < 0:
4101 buffering = io.DEFAULT_BUFFER_SIZE
4102 if buffering == 0:
4103 return raw
4104 buffer = io.BufferedReader(raw, buffering)
4105 text = io.TextIOWrapper(buffer, None, None)
4106 text.mode = "rb"
4107 return text
4108
4109 def _test_readline(self, size=-1, buffering=-1):
4110 mock_sock = self.MockSocket(recv_funcs=[
4111 lambda : b"This is the first line\nAnd the sec",
4112 self._raise_eintr,
4113 lambda : b"ond line is here\n",
4114 lambda : b"",
4115 lambda : b"", # XXX(gps): io library does an extra EOF read
4116 ])
4117 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004118 self.assertEqual(fo.readline(size), "This is the first line\n")
4119 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004120
4121 def _test_read(self, size=-1, buffering=-1):
4122 mock_sock = self.MockSocket(recv_funcs=[
4123 lambda : b"This is the first line\nAnd the sec",
4124 self._raise_eintr,
4125 lambda : b"ond line is here\n",
4126 lambda : b"",
4127 lambda : b"", # XXX(gps): io library does an extra EOF read
4128 ])
4129 expecting = (b"This is the first line\n"
4130 b"And the second line is here\n")
4131 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4132 if buffering == 0:
4133 data = b''
4134 else:
4135 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004136 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004137 while len(data) != len(expecting):
4138 part = fo.read(size)
4139 if not part:
4140 break
4141 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004142 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004143
4144 def test_default(self):
4145 self._test_readline()
4146 self._test_readline(size=100)
4147 self._test_read()
4148 self._test_read(size=100)
4149
4150 def test_with_1k_buffer(self):
4151 self._test_readline(buffering=1024)
4152 self._test_readline(size=100, buffering=1024)
4153 self._test_read(buffering=1024)
4154 self._test_read(size=100, buffering=1024)
4155
4156 def _test_readline_no_buffer(self, size=-1):
4157 mock_sock = self.MockSocket(recv_funcs=[
4158 lambda : b"a",
4159 lambda : b"\n",
4160 lambda : b"B",
4161 self._raise_eintr,
4162 lambda : b"b",
4163 lambda : b"",
4164 ])
4165 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004166 self.assertEqual(fo.readline(size), b"a\n")
4167 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004168
4169 def test_no_buffer(self):
4170 self._test_readline_no_buffer()
4171 self._test_readline_no_buffer(size=4)
4172 self._test_read(buffering=0)
4173 self._test_read(size=100, buffering=0)
4174
4175
Guido van Rossume9f66142002-08-07 15:46:19 +00004176class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4177
4178 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004179
Guido van Rossume9f66142002-08-07 15:46:19 +00004180 In this case (and in this case only), it should be possible to
4181 create a file object, read a line from it, create another file
4182 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004183 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004184 when reading multiple requests from the same socket."""
4185
4186 bufsize = 0 # Use unbuffered mode
4187
4188 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004189 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004190 line = self.read_file.readline() # first line
4191 self.assertEqual(line, b"A. " + self.write_msg) # first line
4192 self.read_file = self.cli_conn.makefile('rb', 0)
4193 line = self.read_file.readline() # second line
4194 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004195
4196 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004197 self.write_file.write(b"A. " + self.write_msg)
4198 self.write_file.write(b"B. " + self.write_msg)
4199 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004200
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004201 def testMakefileClose(self):
4202 # The file returned by makefile should keep the socket open...
4203 self.cli_conn.close()
4204 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004205 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004206 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004207 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004208 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004209
4210 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004211 self.write_file.write(self.write_msg)
4212 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004213
4214 def testMakefileCloseSocketDestroy(self):
4215 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004216 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004217 refcount_after = sys.getrefcount(self.cli_conn)
4218 self.assertEqual(refcount_before - 1, refcount_after)
4219
4220 def _testMakefileCloseSocketDestroy(self):
4221 pass
4222
Antoine Pitrou98b46702010-09-18 22:59:00 +00004223 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004224 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004225 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4226
4227 def testSmallReadNonBlocking(self):
4228 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004229 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4230 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004231 self.evt1.set()
4232 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004233 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004234 if first_seg is None:
4235 # Data not arrived (can happen under Windows), wait a bit
4236 time.sleep(0.5)
4237 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004238 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004239 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004240 self.assertEqual(n, 3)
4241 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004242 self.assertEqual(msg, self.read_msg)
4243 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4244 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004245
4246 def _testSmallReadNonBlocking(self):
4247 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004248 self.write_file.write(self.write_msg)
4249 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004250 self.evt2.set()
4251 # Avoid cloding the socket before the server test has finished,
4252 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4253 self.serv_finished.wait(5.0)
4254
4255 def testWriteNonBlocking(self):
4256 self.cli_finished.wait(5.0)
4257 # The client thread can't skip directly - the SkipTest exception
4258 # would appear as a failure.
4259 if self.serv_skipped:
4260 self.skipTest(self.serv_skipped)
4261
4262 def _testWriteNonBlocking(self):
4263 self.serv_skipped = None
4264 self.serv_conn.setblocking(False)
4265 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004266 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004267 LIMIT = 10
4268 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004269 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004270 self.assertGreater(n, 0)
4271 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004272 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004273 if n is None:
4274 # Succeeded
4275 break
4276 self.assertGreater(n, 0)
4277 else:
4278 # Let us know that this test didn't manage to establish
4279 # the expected conditions. This is not a failure in itself but,
4280 # if it happens repeatedly, the test should be fixed.
4281 self.serv_skipped = "failed to saturate the socket buffer"
4282
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004283
Guido van Rossum8c943832002-08-08 01:00:28 +00004284class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4285
4286 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4287
4288
4289class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4290
4291 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004292
Thomas Woutersb2137042007-02-01 18:02:27 +00004293
Antoine Pitrou834bd812010-10-13 16:17:14 +00004294class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4295 """Tests for socket.makefile() in text mode (rather than binary)"""
4296
4297 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004298 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004299 write_mode = 'wb'
4300 write_msg = MSG
4301 newline = ''
4302
4303
4304class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4305 """Tests for socket.makefile() in text mode (rather than binary)"""
4306
4307 read_mode = 'rb'
4308 read_msg = MSG
4309 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004310 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004311 newline = ''
4312
4313
4314class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4315 """Tests for socket.makefile() in text mode (rather than binary)"""
4316
4317 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004318 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004319 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004320 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004321 newline = ''
4322
4323
Guido van Rossumd8faa362007-04-27 19:54:29 +00004324class NetworkConnectionTest(object):
4325 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004326
Guido van Rossumd8faa362007-04-27 19:54:29 +00004327 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004328 # We're inherited below by BasicTCPTest2, which also inherits
4329 # BasicTCPTest, which defines self.port referenced below.
4330 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004331 self.serv_conn = self.cli
4332
4333class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4334 """Tests that NetworkConnection does not break existing TCP functionality.
4335 """
4336
4337class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004338
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004339 class MockSocket(socket.socket):
4340 def connect(self, *args):
4341 raise socket.timeout('timed out')
4342
4343 @contextlib.contextmanager
4344 def mocked_socket_module(self):
4345 """Return a socket which times out on connect"""
4346 old_socket = socket.socket
4347 socket.socket = self.MockSocket
4348 try:
4349 yield
4350 finally:
4351 socket.socket = old_socket
4352
4353 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004354 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004355 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004356 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004357 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004358 cli.connect((HOST, port))
4359 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4360
4361 def test_create_connection(self):
4362 # Issue #9792: errors raised by create_connection() should have
4363 # a proper errno attribute.
4364 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004365 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004366 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004367
4368 # Issue #16257: create_connection() calls getaddrinfo() against
4369 # 'localhost'. This may result in an IPV6 addr being returned
4370 # as well as an IPV4 one:
4371 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4372 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4373 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4374 #
4375 # create_connection() enumerates through all the addresses returned
4376 # and if it doesn't successfully bind to any of them, it propagates
4377 # the last exception it encountered.
4378 #
4379 # On Solaris, ENETUNREACH is returned in this circumstance instead
4380 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4381 # expected errnos.
4382 expected_errnos = [ errno.ECONNREFUSED, ]
4383 if hasattr(errno, 'ENETUNREACH'):
4384 expected_errnos.append(errno.ENETUNREACH)
4385
4386 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004387
4388 def test_create_connection_timeout(self):
4389 # Issue #9792: create_connection() should not recast timeout errors
4390 # as generic socket errors.
4391 with self.mocked_socket_module():
4392 with self.assertRaises(socket.timeout):
4393 socket.create_connection((HOST, 1234))
4394
Guido van Rossumd8faa362007-04-27 19:54:29 +00004395
Victor Stinner45df8202010-04-28 22:31:17 +00004396@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004397class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4398
4399 def __init__(self, methodName='runTest'):
4400 SocketTCPTest.__init__(self, methodName=methodName)
4401 ThreadableTest.__init__(self)
4402
4403 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004404 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004405
4406 def clientTearDown(self):
4407 self.cli.close()
4408 self.cli = None
4409 ThreadableTest.clientTearDown(self)
4410
4411 def _justAccept(self):
4412 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004413 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004414
4415 testFamily = _justAccept
4416 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004417 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004418 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004419 self.assertEqual(self.cli.family, 2)
4420
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004421 testSourceAddress = _justAccept
4422 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004423 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4424 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004425 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004426 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004427 # The port number being used is sufficient to show that the bind()
4428 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004429
Guido van Rossumd8faa362007-04-27 19:54:29 +00004430 testTimeoutDefault = _justAccept
4431 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004432 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004433 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004434 socket.setdefaulttimeout(42)
4435 try:
4436 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004437 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004438 finally:
4439 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004440 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004441
4442 testTimeoutNone = _justAccept
4443 def _testTimeoutNone(self):
4444 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004445 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004446 socket.setdefaulttimeout(30)
4447 try:
4448 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004449 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004450 finally:
4451 socket.setdefaulttimeout(None)
4452 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004453
4454 testTimeoutValueNamed = _justAccept
4455 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004456 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004457 self.assertEqual(self.cli.gettimeout(), 30)
4458
4459 testTimeoutValueNonamed = _justAccept
4460 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004461 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004462 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004463 self.assertEqual(self.cli.gettimeout(), 30)
4464
Victor Stinner45df8202010-04-28 22:31:17 +00004465@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004466class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4467
4468 def __init__(self, methodName='runTest'):
4469 SocketTCPTest.__init__(self, methodName=methodName)
4470 ThreadableTest.__init__(self)
4471
4472 def clientSetUp(self):
4473 pass
4474
4475 def clientTearDown(self):
4476 self.cli.close()
4477 self.cli = None
4478 ThreadableTest.clientTearDown(self)
4479
4480 def testInsideTimeout(self):
4481 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004482 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004483 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004484 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004485 testOutsideTimeout = testInsideTimeout
4486
4487 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004488 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004489 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004490 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004491
4492 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004493 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004494 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004495
4496
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004497class TCPTimeoutTest(SocketTCPTest):
4498
4499 def testTCPTimeout(self):
4500 def raise_timeout(*args, **kwargs):
4501 self.serv.settimeout(1.0)
4502 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004503 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004504 "Error generating a timeout exception (TCP)")
4505
4506 def testTimeoutZero(self):
4507 ok = False
4508 try:
4509 self.serv.settimeout(0.0)
4510 foo = self.serv.accept()
4511 except socket.timeout:
4512 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004513 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004514 ok = True
4515 except:
4516 self.fail("caught unexpected exception (TCP)")
4517 if not ok:
4518 self.fail("accept() returned success when we did not expect it")
4519
Serhiy Storchaka43767632013-11-03 21:31:38 +02004520 @unittest.skipUnless(hasattr(signal, 'alarm'),
4521 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004522 def testInterruptedTimeout(self):
4523 # XXX I don't know how to do this test on MSWindows or any other
4524 # plaform that doesn't support signal.alarm() or os.kill(), though
4525 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004526 self.serv.settimeout(5.0) # must be longer than alarm
4527 class Alarm(Exception):
4528 pass
4529 def alarm_handler(signal, frame):
4530 raise Alarm
4531 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4532 try:
4533 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4534 try:
4535 foo = self.serv.accept()
4536 except socket.timeout:
4537 self.fail("caught timeout instead of Alarm")
4538 except Alarm:
4539 pass
4540 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004541 self.fail("caught other exception instead of Alarm:"
4542 " %s(%s):\n%s" %
4543 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004544 else:
4545 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004546 finally:
4547 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004548 except Alarm:
4549 self.fail("got Alarm in wrong place")
4550 finally:
4551 # no alarm can be pending. Safe to restore old handler.
4552 signal.signal(signal.SIGALRM, old_alarm)
4553
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004554class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004555
4556 def testUDPTimeout(self):
4557 def raise_timeout(*args, **kwargs):
4558 self.serv.settimeout(1.0)
4559 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004560 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004561 "Error generating a timeout exception (UDP)")
4562
4563 def testTimeoutZero(self):
4564 ok = False
4565 try:
4566 self.serv.settimeout(0.0)
4567 foo = self.serv.recv(1024)
4568 except socket.timeout:
4569 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004570 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004571 ok = True
4572 except:
4573 self.fail("caught unexpected exception (UDP)")
4574 if not ok:
4575 self.fail("recv() returned success when we did not expect it")
4576
4577class TestExceptions(unittest.TestCase):
4578
4579 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004580 self.assertTrue(issubclass(OSError, Exception))
4581 self.assertTrue(issubclass(socket.herror, OSError))
4582 self.assertTrue(issubclass(socket.gaierror, OSError))
4583 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004584
Serhiy Storchaka43767632013-11-03 21:31:38 +02004585@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004586class TestLinuxAbstractNamespace(unittest.TestCase):
4587
4588 UNIX_PATH_MAX = 108
4589
4590 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004591 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004592 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4593 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004594 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004595 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4596 s2.connect(s1.getsockname())
4597 with s1.accept()[0] as s3:
4598 self.assertEqual(s1.getsockname(), address)
4599 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004600
4601 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004602 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004603 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4604 s.bind(address)
4605 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004606
4607 def testNameOverflow(self):
4608 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004609 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004610 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004611
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004612 def testStrName(self):
4613 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004614 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4615 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004616 s.bind("\x00python\x00test\x00")
4617 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004618 finally:
4619 s.close()
4620
Serhiy Storchaka43767632013-11-03 21:31:38 +02004621@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004622class TestUnixDomain(unittest.TestCase):
4623
4624 def setUp(self):
4625 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4626
4627 def tearDown(self):
4628 self.sock.close()
4629
4630 def encoded(self, path):
4631 # Return the given path encoded in the file system encoding,
4632 # or skip the test if this is not possible.
4633 try:
4634 return os.fsencode(path)
4635 except UnicodeEncodeError:
4636 self.skipTest(
4637 "Pathname {0!a} cannot be represented in file "
4638 "system encoding {1!r}".format(
4639 path, sys.getfilesystemencoding()))
4640
Antoine Pitrou16374872011-12-16 15:04:12 +01004641 def bind(self, sock, path):
4642 # Bind the socket
4643 try:
4644 sock.bind(path)
4645 except OSError as e:
4646 if str(e) == "AF_UNIX path too long":
4647 self.skipTest(
4648 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4649 .format(path))
4650 else:
4651 raise
4652
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004653 def testStrAddr(self):
4654 # Test binding to and retrieving a normal string pathname.
4655 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004656 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004657 self.addCleanup(support.unlink, path)
4658 self.assertEqual(self.sock.getsockname(), path)
4659
4660 def testBytesAddr(self):
4661 # Test binding to a bytes pathname.
4662 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004663 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004664 self.addCleanup(support.unlink, path)
4665 self.assertEqual(self.sock.getsockname(), path)
4666
4667 def testSurrogateescapeBind(self):
4668 # Test binding to a valid non-ASCII pathname, with the
4669 # non-ASCII bytes supplied using surrogateescape encoding.
4670 path = os.path.abspath(support.TESTFN_UNICODE)
4671 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004672 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004673 self.addCleanup(support.unlink, path)
4674 self.assertEqual(self.sock.getsockname(), path)
4675
4676 def testUnencodableAddr(self):
4677 # Test binding to a pathname that cannot be encoded in the
4678 # file system encoding.
4679 if support.TESTFN_UNENCODABLE is None:
4680 self.skipTest("No unencodable filename available")
4681 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004682 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004683 self.addCleanup(support.unlink, path)
4684 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004685
Victor Stinner45df8202010-04-28 22:31:17 +00004686@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004687class BufferIOTest(SocketConnectedTest):
4688 """
4689 Test the buffer versions of socket.recv() and socket.send().
4690 """
4691 def __init__(self, methodName='runTest'):
4692 SocketConnectedTest.__init__(self, methodName=methodName)
4693
Antoine Pitrou25480782010-03-17 22:50:28 +00004694 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004695 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004696 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004697 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004698 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004699 self.assertEqual(msg, MSG)
4700
Antoine Pitrou25480782010-03-17 22:50:28 +00004701 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004702 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004703 self.serv_conn.send(buf)
4704
Antoine Pitrou25480782010-03-17 22:50:28 +00004705 def testRecvIntoBytearray(self):
4706 buf = bytearray(1024)
4707 nbytes = self.cli_conn.recv_into(buf)
4708 self.assertEqual(nbytes, len(MSG))
4709 msg = buf[:len(MSG)]
4710 self.assertEqual(msg, MSG)
4711
4712 _testRecvIntoBytearray = _testRecvIntoArray
4713
4714 def testRecvIntoMemoryview(self):
4715 buf = bytearray(1024)
4716 nbytes = self.cli_conn.recv_into(memoryview(buf))
4717 self.assertEqual(nbytes, len(MSG))
4718 msg = buf[:len(MSG)]
4719 self.assertEqual(msg, MSG)
4720
4721 _testRecvIntoMemoryview = _testRecvIntoArray
4722
4723 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004724 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004725 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004726 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004727 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004728 self.assertEqual(msg, MSG)
4729
Antoine Pitrou25480782010-03-17 22:50:28 +00004730 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004731 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004732 self.serv_conn.send(buf)
4733
Antoine Pitrou25480782010-03-17 22:50:28 +00004734 def testRecvFromIntoBytearray(self):
4735 buf = bytearray(1024)
4736 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4737 self.assertEqual(nbytes, len(MSG))
4738 msg = buf[:len(MSG)]
4739 self.assertEqual(msg, MSG)
4740
4741 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4742
4743 def testRecvFromIntoMemoryview(self):
4744 buf = bytearray(1024)
4745 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4746 self.assertEqual(nbytes, len(MSG))
4747 msg = buf[:len(MSG)]
4748 self.assertEqual(msg, MSG)
4749
4750 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4751
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004752 def testRecvFromIntoSmallBuffer(self):
4753 # See issue #20246.
4754 buf = bytearray(8)
4755 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4756
4757 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004758 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004759
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004760 def testRecvFromIntoEmptyBuffer(self):
4761 buf = bytearray()
4762 self.cli_conn.recvfrom_into(buf)
4763 self.cli_conn.recvfrom_into(buf, 0)
4764
4765 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4766
Christian Heimes043d6f62008-01-07 17:19:16 +00004767
4768TIPC_STYPE = 2000
4769TIPC_LOWER = 200
4770TIPC_UPPER = 210
4771
4772def isTipcAvailable():
4773 """Check if the TIPC module is loaded
4774
4775 The TIPC module is not loaded automatically on Ubuntu and probably
4776 other Linux distros.
4777 """
4778 if not hasattr(socket, "AF_TIPC"):
4779 return False
4780 if not os.path.isfile("/proc/modules"):
4781 return False
4782 with open("/proc/modules") as f:
4783 for line in f:
4784 if line.startswith("tipc "):
4785 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004786 return False
4787
Serhiy Storchaka43767632013-11-03 21:31:38 +02004788@unittest.skipUnless(isTipcAvailable(),
4789 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004790class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004791 def testRDM(self):
4792 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4793 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004794 self.addCleanup(srv.close)
4795 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004796
4797 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4798 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4799 TIPC_LOWER, TIPC_UPPER)
4800 srv.bind(srvaddr)
4801
4802 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4803 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4804 cli.sendto(MSG, sendaddr)
4805
4806 msg, recvaddr = srv.recvfrom(1024)
4807
4808 self.assertEqual(cli.getsockname(), recvaddr)
4809 self.assertEqual(msg, MSG)
4810
4811
Serhiy Storchaka43767632013-11-03 21:31:38 +02004812@unittest.skipUnless(isTipcAvailable(),
4813 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004814class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004815 def __init__(self, methodName = 'runTest'):
4816 unittest.TestCase.__init__(self, methodName = methodName)
4817 ThreadableTest.__init__(self)
4818
4819 def setUp(self):
4820 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004821 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004822 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4823 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4824 TIPC_LOWER, TIPC_UPPER)
4825 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004826 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004827 self.serverExplicitReady()
4828 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004829 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004830
4831 def clientSetUp(self):
4832 # The is a hittable race between serverExplicitReady() and the
4833 # accept() call; sleep a little while to avoid it, otherwise
4834 # we could get an exception
4835 time.sleep(0.1)
4836 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004837 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004838 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4839 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4840 self.cli.connect(addr)
4841 self.cliaddr = self.cli.getsockname()
4842
4843 def testStream(self):
4844 msg = self.conn.recv(1024)
4845 self.assertEqual(msg, MSG)
4846 self.assertEqual(self.cliaddr, self.connaddr)
4847
4848 def _testStream(self):
4849 self.cli.send(MSG)
4850 self.cli.close()
4851
4852
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004853@unittest.skipUnless(thread, 'Threading required for this test.')
4854class ContextManagersTest(ThreadedTCPSocketTest):
4855
4856 def _testSocketClass(self):
4857 # base test
4858 with socket.socket() as sock:
4859 self.assertFalse(sock._closed)
4860 self.assertTrue(sock._closed)
4861 # close inside with block
4862 with socket.socket() as sock:
4863 sock.close()
4864 self.assertTrue(sock._closed)
4865 # exception inside with block
4866 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004867 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004868 self.assertTrue(sock._closed)
4869
4870 def testCreateConnectionBase(self):
4871 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004872 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004873 data = conn.recv(1024)
4874 conn.sendall(data)
4875
4876 def _testCreateConnectionBase(self):
4877 address = self.serv.getsockname()
4878 with socket.create_connection(address) as sock:
4879 self.assertFalse(sock._closed)
4880 sock.sendall(b'foo')
4881 self.assertEqual(sock.recv(1024), b'foo')
4882 self.assertTrue(sock._closed)
4883
4884 def testCreateConnectionClose(self):
4885 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004886 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004887 data = conn.recv(1024)
4888 conn.sendall(data)
4889
4890 def _testCreateConnectionClose(self):
4891 address = self.serv.getsockname()
4892 with socket.create_connection(address) as sock:
4893 sock.close()
4894 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004895 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004896
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004897
Victor Stinnerdaf45552013-08-28 00:53:59 +02004898class InheritanceTest(unittest.TestCase):
4899 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4900 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004901 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004902 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004903 with socket.socket(socket.AF_INET,
4904 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4905 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004906 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004907
4908 def test_default_inheritable(self):
4909 sock = socket.socket()
4910 with sock:
4911 self.assertEqual(sock.get_inheritable(), False)
4912
4913 def test_dup(self):
4914 sock = socket.socket()
4915 with sock:
4916 newsock = sock.dup()
4917 sock.close()
4918 with newsock:
4919 self.assertEqual(newsock.get_inheritable(), False)
4920
4921 def test_set_inheritable(self):
4922 sock = socket.socket()
4923 with sock:
4924 sock.set_inheritable(True)
4925 self.assertEqual(sock.get_inheritable(), True)
4926
4927 sock.set_inheritable(False)
4928 self.assertEqual(sock.get_inheritable(), False)
4929
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004930 @unittest.skipIf(fcntl is None, "need fcntl")
4931 def test_get_inheritable_cloexec(self):
4932 sock = socket.socket()
4933 with sock:
4934 fd = sock.fileno()
4935 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004936
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004937 # clear FD_CLOEXEC flag
4938 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4939 flags &= ~fcntl.FD_CLOEXEC
4940 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004941
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004942 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004943
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004944 @unittest.skipIf(fcntl is None, "need fcntl")
4945 def test_set_inheritable_cloexec(self):
4946 sock = socket.socket()
4947 with sock:
4948 fd = sock.fileno()
4949 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4950 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004951
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004952 sock.set_inheritable(True)
4953 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4954 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004955
4956
Victor Stinnerdaf45552013-08-28 00:53:59 +02004957 @unittest.skipUnless(hasattr(socket, "socketpair"),
4958 "need socket.socketpair()")
4959 def test_socketpair(self):
4960 s1, s2 = socket.socketpair()
4961 self.addCleanup(s1.close)
4962 self.addCleanup(s2.close)
4963 self.assertEqual(s1.get_inheritable(), False)
4964 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004965
4966
4967@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4968 "SOCK_NONBLOCK not defined")
4969class NonblockConstantTest(unittest.TestCase):
4970 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4971 if nonblock:
4972 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4973 self.assertEqual(s.gettimeout(), timeout)
4974 else:
4975 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4976 self.assertEqual(s.gettimeout(), None)
4977
Charles-François Natali239bb962011-06-03 12:55:15 +02004978 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004979 def test_SOCK_NONBLOCK(self):
4980 # a lot of it seems silly and redundant, but I wanted to test that
4981 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004982 with socket.socket(socket.AF_INET,
4983 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4984 self.checkNonblock(s)
4985 s.setblocking(1)
4986 self.checkNonblock(s, False)
4987 s.setblocking(0)
4988 self.checkNonblock(s)
4989 s.settimeout(None)
4990 self.checkNonblock(s, False)
4991 s.settimeout(2.0)
4992 self.checkNonblock(s, timeout=2.0)
4993 s.setblocking(1)
4994 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004995 # defaulttimeout
4996 t = socket.getdefaulttimeout()
4997 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004998 with socket.socket() as s:
4999 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005000 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005001 with socket.socket() as s:
5002 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005003 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005004 with socket.socket() as s:
5005 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005006 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005007 with socket.socket() as s:
5008 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005009 socket.setdefaulttimeout(t)
5010
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005011
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005012@unittest.skipUnless(os.name == "nt", "Windows specific")
5013@unittest.skipUnless(multiprocessing, "need multiprocessing")
5014class TestSocketSharing(SocketTCPTest):
5015 # This must be classmethod and not staticmethod or multiprocessing
5016 # won't be able to bootstrap it.
5017 @classmethod
5018 def remoteProcessServer(cls, q):
5019 # Recreate socket from shared data
5020 sdata = q.get()
5021 message = q.get()
5022
5023 s = socket.fromshare(sdata)
5024 s2, c = s.accept()
5025
5026 # Send the message
5027 s2.sendall(message)
5028 s2.close()
5029 s.close()
5030
5031 def testShare(self):
5032 # Transfer the listening server socket to another process
5033 # and service it from there.
5034
5035 # Create process:
5036 q = multiprocessing.Queue()
5037 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5038 p.start()
5039
5040 # Get the shared socket data
5041 data = self.serv.share(p.pid)
5042
5043 # Pass the shared socket to the other process
5044 addr = self.serv.getsockname()
5045 self.serv.close()
5046 q.put(data)
5047
5048 # The data that the server will send us
5049 message = b"slapmahfro"
5050 q.put(message)
5051
5052 # Connect
5053 s = socket.create_connection(addr)
5054 # listen for the data
5055 m = []
5056 while True:
5057 data = s.recv(100)
5058 if not data:
5059 break
5060 m.append(data)
5061 s.close()
5062 received = b"".join(m)
5063 self.assertEqual(received, message)
5064 p.join()
5065
5066 def testShareLength(self):
5067 data = self.serv.share(os.getpid())
5068 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5069 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5070
5071 def compareSockets(self, org, other):
5072 # socket sharing is expected to work only for blocking socket
5073 # since the internal python timout value isn't transfered.
5074 self.assertEqual(org.gettimeout(), None)
5075 self.assertEqual(org.gettimeout(), other.gettimeout())
5076
5077 self.assertEqual(org.family, other.family)
5078 self.assertEqual(org.type, other.type)
5079 # If the user specified "0" for proto, then
5080 # internally windows will have picked the correct value.
5081 # Python introspection on the socket however will still return
5082 # 0. For the shared socket, the python value is recreated
5083 # from the actual value, so it may not compare correctly.
5084 if org.proto != 0:
5085 self.assertEqual(org.proto, other.proto)
5086
5087 def testShareLocal(self):
5088 data = self.serv.share(os.getpid())
5089 s = socket.fromshare(data)
5090 try:
5091 self.compareSockets(self.serv, s)
5092 finally:
5093 s.close()
5094
5095 def testTypes(self):
5096 families = [socket.AF_INET, socket.AF_INET6]
5097 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5098 for f in families:
5099 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005100 try:
5101 source = socket.socket(f, t)
5102 except OSError:
5103 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005104 try:
5105 data = source.share(os.getpid())
5106 shared = socket.fromshare(data)
5107 try:
5108 self.compareSockets(source, shared)
5109 finally:
5110 shared.close()
5111 finally:
5112 source.close()
5113
5114
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005115@unittest.skipUnless(thread, 'Threading required for this test.')
5116class SendfileUsingSendTest(ThreadedTCPSocketTest):
5117 """
5118 Test the send() implementation of socket.sendfile().
5119 """
5120
5121 FILESIZE = (10 * 1024 * 1024) # 10MB
5122 BUFSIZE = 8192
5123 FILEDATA = b""
5124 TIMEOUT = 2
5125
5126 @classmethod
5127 def setUpClass(cls):
5128 def chunks(total, step):
5129 assert total >= step
5130 while total > step:
5131 yield step
5132 total -= step
5133 if total:
5134 yield total
5135
5136 chunk = b"".join([random.choice(string.ascii_letters).encode()
5137 for i in range(cls.BUFSIZE)])
5138 with open(support.TESTFN, 'wb') as f:
5139 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5140 f.write(chunk)
5141 with open(support.TESTFN, 'rb') as f:
5142 cls.FILEDATA = f.read()
5143 assert len(cls.FILEDATA) == cls.FILESIZE
5144
5145 @classmethod
5146 def tearDownClass(cls):
5147 support.unlink(support.TESTFN)
5148
5149 def accept_conn(self):
5150 self.serv.settimeout(self.TIMEOUT)
5151 conn, addr = self.serv.accept()
5152 conn.settimeout(self.TIMEOUT)
5153 self.addCleanup(conn.close)
5154 return conn
5155
5156 def recv_data(self, conn):
5157 received = []
5158 while True:
5159 chunk = conn.recv(self.BUFSIZE)
5160 if not chunk:
5161 break
5162 received.append(chunk)
5163 return b''.join(received)
5164
5165 def meth_from_sock(self, sock):
5166 # Depending on the mixin class being run return either send()
5167 # or sendfile() method implementation.
5168 return getattr(sock, "_sendfile_use_send")
5169
5170 # regular file
5171
5172 def _testRegularFile(self):
5173 address = self.serv.getsockname()
5174 file = open(support.TESTFN, 'rb')
5175 with socket.create_connection(address) as sock, file as file:
5176 meth = self.meth_from_sock(sock)
5177 sent = meth(file)
5178 self.assertEqual(sent, self.FILESIZE)
5179 self.assertEqual(file.tell(), self.FILESIZE)
5180
5181 def testRegularFile(self):
5182 conn = self.accept_conn()
5183 data = self.recv_data(conn)
5184 self.assertEqual(len(data), self.FILESIZE)
5185 self.assertEqual(data, self.FILEDATA)
5186
5187 # non regular file
5188
5189 def _testNonRegularFile(self):
5190 address = self.serv.getsockname()
5191 file = io.BytesIO(self.FILEDATA)
5192 with socket.create_connection(address) as sock, file as file:
5193 sent = sock.sendfile(file)
5194 self.assertEqual(sent, self.FILESIZE)
5195 self.assertEqual(file.tell(), self.FILESIZE)
5196 self.assertRaises(socket._GiveupOnSendfile,
5197 sock._sendfile_use_sendfile, file)
5198
5199 def testNonRegularFile(self):
5200 conn = self.accept_conn()
5201 data = self.recv_data(conn)
5202 self.assertEqual(len(data), self.FILESIZE)
5203 self.assertEqual(data, self.FILEDATA)
5204
5205 # empty file
5206
5207 def _testEmptyFileSend(self):
5208 address = self.serv.getsockname()
5209 filename = support.TESTFN + "2"
5210 with open(filename, 'wb'):
5211 self.addCleanup(support.unlink, filename)
5212 file = open(filename, 'rb')
5213 with socket.create_connection(address) as sock, file as file:
5214 meth = self.meth_from_sock(sock)
5215 sent = meth(file)
5216 self.assertEqual(sent, 0)
5217 self.assertEqual(file.tell(), 0)
5218
5219 def testEmptyFileSend(self):
5220 conn = self.accept_conn()
5221 data = self.recv_data(conn)
5222 self.assertEqual(data, b"")
5223
5224 # offset
5225
5226 def _testOffset(self):
5227 address = self.serv.getsockname()
5228 file = open(support.TESTFN, 'rb')
5229 with socket.create_connection(address) as sock, file as file:
5230 meth = self.meth_from_sock(sock)
5231 sent = meth(file, offset=5000)
5232 self.assertEqual(sent, self.FILESIZE - 5000)
5233 self.assertEqual(file.tell(), self.FILESIZE)
5234
5235 def testOffset(self):
5236 conn = self.accept_conn()
5237 data = self.recv_data(conn)
5238 self.assertEqual(len(data), self.FILESIZE - 5000)
5239 self.assertEqual(data, self.FILEDATA[5000:])
5240
5241 # count
5242
5243 def _testCount(self):
5244 address = self.serv.getsockname()
5245 file = open(support.TESTFN, 'rb')
5246 with socket.create_connection(address, timeout=2) as sock, file as file:
5247 count = 5000007
5248 meth = self.meth_from_sock(sock)
5249 sent = meth(file, count=count)
5250 self.assertEqual(sent, count)
5251 self.assertEqual(file.tell(), count)
5252
5253 def testCount(self):
5254 count = 5000007
5255 conn = self.accept_conn()
5256 data = self.recv_data(conn)
5257 self.assertEqual(len(data), count)
5258 self.assertEqual(data, self.FILEDATA[:count])
5259
5260 # count small
5261
5262 def _testCountSmall(self):
5263 address = self.serv.getsockname()
5264 file = open(support.TESTFN, 'rb')
5265 with socket.create_connection(address, timeout=2) as sock, file as file:
5266 count = 1
5267 meth = self.meth_from_sock(sock)
5268 sent = meth(file, count=count)
5269 self.assertEqual(sent, count)
5270 self.assertEqual(file.tell(), count)
5271
5272 def testCountSmall(self):
5273 count = 1
5274 conn = self.accept_conn()
5275 data = self.recv_data(conn)
5276 self.assertEqual(len(data), count)
5277 self.assertEqual(data, self.FILEDATA[:count])
5278
5279 # count + offset
5280
5281 def _testCountWithOffset(self):
5282 address = self.serv.getsockname()
5283 file = open(support.TESTFN, 'rb')
5284 with socket.create_connection(address, timeout=2) as sock, file as file:
5285 count = 100007
5286 meth = self.meth_from_sock(sock)
5287 sent = meth(file, offset=2007, count=count)
5288 self.assertEqual(sent, count)
5289 self.assertEqual(file.tell(), count + 2007)
5290
5291 def testCountWithOffset(self):
5292 count = 100007
5293 conn = self.accept_conn()
5294 data = self.recv_data(conn)
5295 self.assertEqual(len(data), count)
5296 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5297
5298 # non blocking sockets are not supposed to work
5299
5300 def _testNonBlocking(self):
5301 address = self.serv.getsockname()
5302 file = open(support.TESTFN, 'rb')
5303 with socket.create_connection(address) as sock, file as file:
5304 sock.setblocking(False)
5305 meth = self.meth_from_sock(sock)
5306 self.assertRaises(ValueError, meth, file)
5307 self.assertRaises(ValueError, sock.sendfile, file)
5308
5309 def testNonBlocking(self):
5310 conn = self.accept_conn()
5311 if conn.recv(8192):
5312 self.fail('was not supposed to receive any data')
5313
5314 # timeout (non-triggered)
5315
5316 def _testWithTimeout(self):
5317 address = self.serv.getsockname()
5318 file = open(support.TESTFN, 'rb')
5319 with socket.create_connection(address, timeout=2) as sock, file as file:
5320 meth = self.meth_from_sock(sock)
5321 sent = meth(file)
5322 self.assertEqual(sent, self.FILESIZE)
5323
5324 def testWithTimeout(self):
5325 conn = self.accept_conn()
5326 data = self.recv_data(conn)
5327 self.assertEqual(len(data), self.FILESIZE)
5328 self.assertEqual(data, self.FILEDATA)
5329
5330 # timeout (triggered)
5331
5332 def _testWithTimeoutTriggeredSend(self):
5333 address = self.serv.getsockname()
5334 file = open(support.TESTFN, 'rb')
5335 with socket.create_connection(address, timeout=0.01) as sock, \
5336 file as file:
5337 meth = self.meth_from_sock(sock)
5338 self.assertRaises(socket.timeout, meth, file)
5339
5340 def testWithTimeoutTriggeredSend(self):
5341 conn = self.accept_conn()
5342 conn.recv(88192)
5343
5344 # errors
5345
5346 def _test_errors(self):
5347 pass
5348
5349 def test_errors(self):
5350 with open(support.TESTFN, 'rb') as file:
5351 with socket.socket(type=socket.SOCK_DGRAM) as s:
5352 meth = self.meth_from_sock(s)
5353 self.assertRaisesRegex(
5354 ValueError, "SOCK_STREAM", meth, file)
5355 with open(support.TESTFN, 'rt') as file:
5356 with socket.socket() as s:
5357 meth = self.meth_from_sock(s)
5358 self.assertRaisesRegex(
5359 ValueError, "binary mode", meth, file)
5360 with open(support.TESTFN, 'rb') as file:
5361 with socket.socket() as s:
5362 meth = self.meth_from_sock(s)
5363 self.assertRaisesRegex(TypeError, "positive integer",
5364 meth, file, count='2')
5365 self.assertRaisesRegex(TypeError, "positive integer",
5366 meth, file, count=0.1)
5367 self.assertRaisesRegex(ValueError, "positive integer",
5368 meth, file, count=0)
5369 self.assertRaisesRegex(ValueError, "positive integer",
5370 meth, file, count=-1)
5371
5372
5373@unittest.skipUnless(thread, 'Threading required for this test.')
5374@unittest.skipUnless(hasattr(os, "sendfile"),
5375 'os.sendfile() required for this test.')
5376class SendfileUsingSendfileTest(SendfileUsingSendTest):
5377 """
5378 Test the sendfile() implementation of socket.sendfile().
5379 """
5380 def meth_from_sock(self, sock):
5381 return getattr(sock, "_sendfile_use_sendfile")
5382
5383
Guido van Rossumb995eb72002-07-31 16:08:40 +00005384def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005385 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005386 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005387
5388 tests.extend([
5389 NonBlockingTCPTests,
5390 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005391 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00005392 UnbufferedFileObjectClassTestCase,
5393 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005394 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005395 UnicodeReadFileObjectClassTestCase,
5396 UnicodeWriteFileObjectClassTestCase,
5397 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005398 NetworkConnectionNoServer,
5399 NetworkConnectionAttributesTest,
5400 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005401 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005402 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005403 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005404 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005405 tests.append(BasicSocketPairTest)
5406 tests.append(TestUnixDomain)
5407 tests.append(TestLinuxAbstractNamespace)
5408 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005409 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005410 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005411 tests.extend([
5412 CmsgMacroTests,
5413 SendmsgUDPTest,
5414 RecvmsgUDPTest,
5415 RecvmsgIntoUDPTest,
5416 SendmsgUDP6Test,
5417 RecvmsgUDP6Test,
5418 RecvmsgRFC3542AncillaryUDP6Test,
5419 RecvmsgIntoRFC3542AncillaryUDP6Test,
5420 RecvmsgIntoUDP6Test,
5421 SendmsgTCPTest,
5422 RecvmsgTCPTest,
5423 RecvmsgIntoTCPTest,
5424 SendmsgSCTPStreamTest,
5425 RecvmsgSCTPStreamTest,
5426 RecvmsgIntoSCTPStreamTest,
5427 SendmsgUnixStreamTest,
5428 RecvmsgUnixStreamTest,
5429 RecvmsgIntoUnixStreamTest,
5430 RecvmsgSCMRightsStreamTest,
5431 RecvmsgIntoSCMRightsStreamTest,
5432 # These are slow when setitimer() is not available
5433 InterruptedRecvTimeoutTest,
5434 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005435 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005436 SendfileUsingSendTest,
5437 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005438 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005439
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005440 thread_info = support.threading_setup()
5441 support.run_unittest(*tests)
5442 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005443
5444if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005445 test_main()