blob: 82b79cd7152dd7e77bc24ab7af578fbdf8a340aa [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
Barry Warsawcf3d4b51997-01-03 20:03:32 +00006import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00007import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +10008import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +00009import time
10import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000011import queue
Jack Jansen522e7692002-09-06 21:57:50 +000012import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000013import os
14import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000015import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000016import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000017from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000018import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000019import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010020import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020021import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020022import random
23import string
Antoine Pitroub1c54962010-10-14 15:05:38 +000024try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000025 import multiprocessing
26except ImportError:
27 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020028try:
29 import fcntl
30except ImportError:
31 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000032
Benjamin Petersonee8712c2008-05-20 21:35:26 +000033HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000034MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000035
Victor Stinner45df8202010-04-28 22:31:17 +000036try:
37 import _thread as thread
38 import threading
39except ImportError:
40 thread = None
41 threading = None
42
Charles-François Natali47413c12011-10-06 19:47:44 +020043def _have_socket_can():
44 """Check whether CAN sockets are supported on this host."""
45 try:
46 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020047 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020048 return False
49 else:
50 s.close()
51 return True
52
Charles-François Natali10b8cf42011-11-10 19:21:37 +010053def _have_socket_rds():
54 """Check whether RDS sockets are supported on this host."""
55 try:
56 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
57 except (AttributeError, OSError):
58 return False
59 else:
60 s.close()
61 return True
62
Charles-François Natali47413c12011-10-06 19:47:44 +020063HAVE_SOCKET_CAN = _have_socket_can()
64
Charles-François Natali10b8cf42011-11-10 19:21:37 +010065HAVE_SOCKET_RDS = _have_socket_rds()
66
Nick Coghlan96fe56a2011-08-22 11:55:57 +100067# Size in bytes of the int type
68SIZEOF_INT = array.array("i").itemsize
69
Guido van Rossum24e4af82002-06-12 19:18:08 +000070class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000071
Guido van Rossum24e4af82002-06-12 19:18:08 +000072 def setUp(self):
73 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000074 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000075 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000076
Guido van Rossum24e4af82002-06-12 19:18:08 +000077 def tearDown(self):
78 self.serv.close()
79 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000080
Guido van Rossum24e4af82002-06-12 19:18:08 +000081class SocketUDPTest(unittest.TestCase):
82
83 def setUp(self):
84 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000085 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000086
87 def tearDown(self):
88 self.serv.close()
89 self.serv = None
90
Nick Coghlan96fe56a2011-08-22 11:55:57 +100091class ThreadSafeCleanupTestCase(unittest.TestCase):
92 """Subclass of unittest.TestCase with thread-safe cleanup methods.
93
94 This subclass protects the addCleanup() and doCleanups() methods
95 with a recursive lock.
96 """
97
98 if threading:
99 def __init__(self, *args, **kwargs):
100 super().__init__(*args, **kwargs)
101 self._cleanup_lock = threading.RLock()
102
103 def addCleanup(self, *args, **kwargs):
104 with self._cleanup_lock:
105 return super().addCleanup(*args, **kwargs)
106
107 def doCleanups(self, *args, **kwargs):
108 with self._cleanup_lock:
109 return super().doCleanups(*args, **kwargs)
110
Charles-François Natali47413c12011-10-06 19:47:44 +0200111class SocketCANTest(unittest.TestCase):
112
113 """To be able to run this test, a `vcan0` CAN interface can be created with
114 the following commands:
115 # modprobe vcan
116 # ip link add dev vcan0 type vcan
117 # ifconfig vcan0 up
118 """
119 interface = 'vcan0'
120 bufsize = 128
121
Charles-François Natali773e42d2013-02-05 19:42:01 +0100122 """The CAN frame structure is defined in <linux/can.h>:
123
124 struct can_frame {
125 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
126 __u8 can_dlc; /* data length code: 0 .. 8 */
127 __u8 data[8] __attribute__((aligned(8)));
128 };
129 """
130 can_frame_fmt = "=IB3x8s"
131 can_frame_size = struct.calcsize(can_frame_fmt)
132
133 """The Broadcast Management Command frame structure is defined
134 in <linux/can/bcm.h>:
135
136 struct bcm_msg_head {
137 __u32 opcode;
138 __u32 flags;
139 __u32 count;
140 struct timeval ival1, ival2;
141 canid_t can_id;
142 __u32 nframes;
143 struct can_frame frames[0];
144 }
145
146 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
147 `struct can_frame` definition). Must use native not standard types for packing.
148 """
149 bcm_cmd_msg_fmt = "@3I4l2I"
150 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
151
Charles-François Natali47413c12011-10-06 19:47:44 +0200152 def setUp(self):
153 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200154 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200155 try:
156 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200157 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200158 self.skipTest('network interface `%s` does not exist' %
159 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200160
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100161
162class SocketRDSTest(unittest.TestCase):
163
164 """To be able to run this test, the `rds` kernel module must be loaded:
165 # modprobe rds
166 """
167 bufsize = 8192
168
169 def setUp(self):
170 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
171 self.addCleanup(self.serv.close)
172 try:
173 self.port = support.bind_port(self.serv)
174 except OSError:
175 self.skipTest('unable to bind RDS socket')
176
177
Guido van Rossum24e4af82002-06-12 19:18:08 +0000178class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000179 """Threadable Test class
180
181 The ThreadableTest class makes it easy to create a threaded
182 client/server pair from an existing unit test. To create a
183 new threaded class from an existing unit test, use multiple
184 inheritance:
185
186 class NewClass (OldClass, ThreadableTest):
187 pass
188
189 This class defines two new fixture functions with obvious
190 purposes for overriding:
191
192 clientSetUp ()
193 clientTearDown ()
194
195 Any new test functions within the class must then define
196 tests in pairs, where the test name is preceeded with a
197 '_' to indicate the client portion of the test. Ex:
198
199 def testFoo(self):
200 # Server portion
201
202 def _testFoo(self):
203 # Client portion
204
205 Any exceptions raised by the clients during their tests
206 are caught and transferred to the main thread to alert
207 the testing framework.
208
209 Note, the server setup function cannot call any blocking
210 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000211 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000212 the blocking call (such as in setting up a client/server
213 connection and performing the accept() in setUp().
214 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000215
216 def __init__(self):
217 # Swap the true setup function
218 self.__setUp = self.setUp
219 self.__tearDown = self.tearDown
220 self.setUp = self._setUp
221 self.tearDown = self._tearDown
222
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000223 def serverExplicitReady(self):
224 """This method allows the server to explicitly indicate that
225 it wants the client thread to proceed. This is useful if the
226 server is about to execute a blocking routine that is
227 dependent upon the client thread during its setup routine."""
228 self.server_ready.set()
229
Guido van Rossum24e4af82002-06-12 19:18:08 +0000230 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000231 self.server_ready = threading.Event()
232 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000233 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000234 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200235 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000236
237 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000238 methodname = self.id()
239 i = methodname.rfind('.')
240 methodname = methodname[i+1:]
241 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000242 self.client_thread = thread.start_new_thread(
243 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000244
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200245 try:
246 self.__setUp()
247 except:
248 self.server_crashed = True
249 raise
250 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000251 self.server_ready.set()
252 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000253
254 def _tearDown(self):
255 self.__tearDown()
256 self.done.wait()
257
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000258 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000259 exc = self.queue.get()
260 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000261
262 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000263 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000264 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200265 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200266 if self.server_crashed:
267 self.clientTearDown()
268 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000269 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000270 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000271 try:
272 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000273 except BaseException as e:
274 self.queue.put(e)
275 finally:
276 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277
278 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000279 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280
281 def clientTearDown(self):
282 self.done.set()
283 thread.exit()
284
285class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
286
287 def __init__(self, methodName='runTest'):
288 SocketTCPTest.__init__(self, methodName=methodName)
289 ThreadableTest.__init__(self)
290
291 def clientSetUp(self):
292 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
293
294 def clientTearDown(self):
295 self.cli.close()
296 self.cli = None
297 ThreadableTest.clientTearDown(self)
298
299class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
300
301 def __init__(self, methodName='runTest'):
302 SocketUDPTest.__init__(self, methodName=methodName)
303 ThreadableTest.__init__(self)
304
305 def clientSetUp(self):
306 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
307
Brian Curtin3beb38f2010-11-04 03:41:43 +0000308 def clientTearDown(self):
309 self.cli.close()
310 self.cli = None
311 ThreadableTest.clientTearDown(self)
312
Charles-François Natali47413c12011-10-06 19:47:44 +0200313class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
314
315 def __init__(self, methodName='runTest'):
316 SocketCANTest.__init__(self, methodName=methodName)
317 ThreadableTest.__init__(self)
318
319 def clientSetUp(self):
320 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
321 try:
322 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200323 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200324 # skipTest should not be called here, and will be called in the
325 # server instead
326 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200327
328 def clientTearDown(self):
329 self.cli.close()
330 self.cli = None
331 ThreadableTest.clientTearDown(self)
332
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100333class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
334
335 def __init__(self, methodName='runTest'):
336 SocketRDSTest.__init__(self, methodName=methodName)
337 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100338
339 def clientSetUp(self):
340 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
341 try:
342 # RDS sockets must be bound explicitly to send or receive data
343 self.cli.bind((HOST, 0))
344 self.cli_addr = self.cli.getsockname()
345 except OSError:
346 # skipTest should not be called here, and will be called in the
347 # server instead
348 pass
349
350 def clientTearDown(self):
351 self.cli.close()
352 self.cli = None
353 ThreadableTest.clientTearDown(self)
354
Guido van Rossum24e4af82002-06-12 19:18:08 +0000355class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000356 """Socket tests for client-server connection.
357
358 self.cli_conn is a client socket connected to the server. The
359 setUp() method guarantees that it is connected to the server.
360 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000361
362 def __init__(self, methodName='runTest'):
363 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
364
365 def setUp(self):
366 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000367 # Indicate explicitly we're ready for the client thread to
368 # proceed and then perform the blocking call to accept
369 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000370 conn, addr = self.serv.accept()
371 self.cli_conn = conn
372
373 def tearDown(self):
374 self.cli_conn.close()
375 self.cli_conn = None
376 ThreadedTCPSocketTest.tearDown(self)
377
378 def clientSetUp(self):
379 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000380 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000381 self.serv_conn = self.cli
382
383 def clientTearDown(self):
384 self.serv_conn.close()
385 self.serv_conn = None
386 ThreadedTCPSocketTest.clientTearDown(self)
387
Dave Cole331708b2004-08-09 04:51:41 +0000388class SocketPairTest(unittest.TestCase, ThreadableTest):
389
390 def __init__(self, methodName='runTest'):
391 unittest.TestCase.__init__(self, methodName=methodName)
392 ThreadableTest.__init__(self)
393
394 def setUp(self):
395 self.serv, self.cli = socket.socketpair()
396
397 def tearDown(self):
398 self.serv.close()
399 self.serv = None
400
401 def clientSetUp(self):
402 pass
403
404 def clientTearDown(self):
405 self.cli.close()
406 self.cli = None
407 ThreadableTest.clientTearDown(self)
408
Tim Peters494aaee2004-08-09 18:54:11 +0000409
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000410# The following classes are used by the sendmsg()/recvmsg() tests.
411# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
412# gives a drop-in replacement for SocketConnectedTest, but different
413# address families can be used, and the attributes serv_addr and
414# cli_addr will be set to the addresses of the endpoints.
415
416class SocketTestBase(unittest.TestCase):
417 """A base class for socket tests.
418
419 Subclasses must provide methods newSocket() to return a new socket
420 and bindSock(sock) to bind it to an unused address.
421
422 Creates a socket self.serv and sets self.serv_addr to its address.
423 """
424
425 def setUp(self):
426 self.serv = self.newSocket()
427 self.bindServer()
428
429 def bindServer(self):
430 """Bind server socket and set self.serv_addr to its address."""
431 self.bindSock(self.serv)
432 self.serv_addr = self.serv.getsockname()
433
434 def tearDown(self):
435 self.serv.close()
436 self.serv = None
437
438
439class SocketListeningTestMixin(SocketTestBase):
440 """Mixin to listen on the server socket."""
441
442 def setUp(self):
443 super().setUp()
444 self.serv.listen(1)
445
446
447class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
448 ThreadableTest):
449 """Mixin to add client socket and allow client/server tests.
450
451 Client socket is self.cli and its address is self.cli_addr. See
452 ThreadableTest for usage information.
453 """
454
455 def __init__(self, *args, **kwargs):
456 super().__init__(*args, **kwargs)
457 ThreadableTest.__init__(self)
458
459 def clientSetUp(self):
460 self.cli = self.newClientSocket()
461 self.bindClient()
462
463 def newClientSocket(self):
464 """Return a new socket for use as client."""
465 return self.newSocket()
466
467 def bindClient(self):
468 """Bind client socket and set self.cli_addr to its address."""
469 self.bindSock(self.cli)
470 self.cli_addr = self.cli.getsockname()
471
472 def clientTearDown(self):
473 self.cli.close()
474 self.cli = None
475 ThreadableTest.clientTearDown(self)
476
477
478class ConnectedStreamTestMixin(SocketListeningTestMixin,
479 ThreadedSocketTestMixin):
480 """Mixin to allow client/server stream tests with connected client.
481
482 Server's socket representing connection to client is self.cli_conn
483 and client's connection to server is self.serv_conn. (Based on
484 SocketConnectedTest.)
485 """
486
487 def setUp(self):
488 super().setUp()
489 # Indicate explicitly we're ready for the client thread to
490 # proceed and then perform the blocking call to accept
491 self.serverExplicitReady()
492 conn, addr = self.serv.accept()
493 self.cli_conn = conn
494
495 def tearDown(self):
496 self.cli_conn.close()
497 self.cli_conn = None
498 super().tearDown()
499
500 def clientSetUp(self):
501 super().clientSetUp()
502 self.cli.connect(self.serv_addr)
503 self.serv_conn = self.cli
504
505 def clientTearDown(self):
506 self.serv_conn.close()
507 self.serv_conn = None
508 super().clientTearDown()
509
510
511class UnixSocketTestBase(SocketTestBase):
512 """Base class for Unix-domain socket tests."""
513
514 # This class is used for file descriptor passing tests, so we
515 # create the sockets in a private directory so that other users
516 # can't send anything that might be problematic for a privileged
517 # user running the tests.
518
519 def setUp(self):
520 self.dir_path = tempfile.mkdtemp()
521 self.addCleanup(os.rmdir, self.dir_path)
522 super().setUp()
523
524 def bindSock(self, sock):
525 path = tempfile.mktemp(dir=self.dir_path)
526 sock.bind(path)
527 self.addCleanup(support.unlink, path)
528
529class UnixStreamBase(UnixSocketTestBase):
530 """Base class for Unix-domain SOCK_STREAM tests."""
531
532 def newSocket(self):
533 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
534
535
536class InetTestBase(SocketTestBase):
537 """Base class for IPv4 socket tests."""
538
539 host = HOST
540
541 def setUp(self):
542 super().setUp()
543 self.port = self.serv_addr[1]
544
545 def bindSock(self, sock):
546 support.bind_port(sock, host=self.host)
547
548class TCPTestBase(InetTestBase):
549 """Base class for TCP-over-IPv4 tests."""
550
551 def newSocket(self):
552 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
553
554class UDPTestBase(InetTestBase):
555 """Base class for UDP-over-IPv4 tests."""
556
557 def newSocket(self):
558 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
559
560class SCTPStreamBase(InetTestBase):
561 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
562
563 def newSocket(self):
564 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
565 socket.IPPROTO_SCTP)
566
567
568class Inet6TestBase(InetTestBase):
569 """Base class for IPv6 socket tests."""
570
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200571 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000572
573class UDP6TestBase(Inet6TestBase):
574 """Base class for UDP-over-IPv6 tests."""
575
576 def newSocket(self):
577 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
578
579
580# Test-skipping decorators for use with ThreadableTest.
581
582def skipWithClientIf(condition, reason):
583 """Skip decorated test if condition is true, add client_skip decorator.
584
585 If the decorated object is not a class, sets its attribute
586 "client_skip" to a decorator which will return an empty function
587 if the test is to be skipped, or the original function if it is
588 not. This can be used to avoid running the client part of a
589 skipped test when using ThreadableTest.
590 """
591 def client_pass(*args, **kwargs):
592 pass
593 def skipdec(obj):
594 retval = unittest.skip(reason)(obj)
595 if not isinstance(obj, type):
596 retval.client_skip = lambda f: client_pass
597 return retval
598 def noskipdec(obj):
599 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
600 obj.client_skip = lambda f: f
601 return obj
602 return skipdec if condition else noskipdec
603
604
605def requireAttrs(obj, *attributes):
606 """Skip decorated test if obj is missing any of the given attributes.
607
608 Sets client_skip attribute as skipWithClientIf() does.
609 """
610 missing = [name for name in attributes if not hasattr(obj, name)]
611 return skipWithClientIf(
612 missing, "don't have " + ", ".join(name for name in missing))
613
614
615def requireSocket(*args):
616 """Skip decorated test if a socket cannot be created with given arguments.
617
618 When an argument is given as a string, will use the value of that
619 attribute of the socket module, or skip the test if it doesn't
620 exist. Sets client_skip attribute as skipWithClientIf() does.
621 """
622 err = None
623 missing = [obj for obj in args if
624 isinstance(obj, str) and not hasattr(socket, obj)]
625 if missing:
626 err = "don't have " + ", ".join(name for name in missing)
627 else:
628 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
629 for obj in args]
630 try:
631 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200632 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000633 # XXX: check errno?
634 err = str(e)
635 else:
636 s.close()
637 return skipWithClientIf(
638 err is not None,
639 "can't create socket({0}): {1}".format(
640 ", ".join(str(o) for o in args), err))
641
642
Guido van Rossum24e4af82002-06-12 19:18:08 +0000643#######################################################################
644## Begin Tests
645
646class GeneralModuleTests(unittest.TestCase):
647
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000648 def test_repr(self):
649 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200650 with s:
651 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000652 self.assertIn('family=%s' % socket.AF_INET, repr(s))
653 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200654 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200655 self.assertNotIn('raddr', repr(s))
656 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200657 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200658 self.assertIn(str(s.getsockname()), repr(s))
659 self.assertIn('[closed]', repr(s))
660 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000661
Raymond Hettinger027bb632004-05-31 03:09:25 +0000662 def test_weakref(self):
663 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
664 p = proxy(s)
665 self.assertEqual(p.fileno(), s.fileno())
666 s.close()
667 s = None
668 try:
669 p.fileno()
670 except ReferenceError:
671 pass
672 else:
673 self.fail('Socket proxy still exists')
674
Guido van Rossum24e4af82002-06-12 19:18:08 +0000675 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000676 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300677 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200678 with self.assertRaises(OSError, msg=msg % 'OSError'):
679 raise OSError
680 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000681 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200682 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000683 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000684
Ezio Melotti63e42302011-05-07 19:47:48 +0300685 def testSendtoErrors(self):
686 # Testing that sendto doens't masks failures. See #10169.
687 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
688 self.addCleanup(s.close)
689 s.bind(('', 0))
690 sockname = s.getsockname()
691 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300692 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300693 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300694 self.assertEqual(str(cm.exception),
695 "'str' does not support the buffer interface")
696 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300697 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300698 self.assertEqual(str(cm.exception),
699 "'complex' does not support the buffer interface")
700 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300701 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300702 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300703 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300704 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300705 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300706 self.assertEqual(str(cm.exception),
707 "'str' does not support the buffer interface")
708 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300709 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300710 self.assertEqual(str(cm.exception),
711 "'complex' does not support the buffer interface")
712 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300713 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300714 self.assertIn('not NoneType', str(cm.exception))
715 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300716 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300717 self.assertIn('an integer is required', str(cm.exception))
718 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300719 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300720 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300721 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300722 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300723 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300724 self.assertIn('(1 given)', str(cm.exception))
725 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300726 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300727 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300728
Guido van Rossum24e4af82002-06-12 19:18:08 +0000729 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000730 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000731 socket.AF_INET
732 socket.SOCK_STREAM
733 socket.SOCK_DGRAM
734 socket.SOCK_RAW
735 socket.SOCK_RDM
736 socket.SOCK_SEQPACKET
737 socket.SOL_SOCKET
738 socket.SO_REUSEADDR
739
Guido van Rossum654c11e2002-06-13 20:24:17 +0000740 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000741 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000742 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000743 try:
744 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200745 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000746 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600747 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000748 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000749 try:
750 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200751 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000752 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600753 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000754 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000755 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000756 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000757 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000758
Charles-François Natali0cc86852013-09-13 19:53:08 +0200759 def test_host_resolution(self):
760 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
761 '1:1:1:1:1:1:1:1:1']:
762 self.assertRaises(OSError, socket.gethostbyname, addr)
763 self.assertRaises(OSError, socket.gethostbyaddr, addr)
764
765 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
766 self.assertEqual(socket.gethostbyname(addr), addr)
767
768 # we don't test support.HOSTv6 because there's a chance it doesn't have
769 # a matching name entry (e.g. 'ip6-localhost')
770 for host in [support.HOST]:
771 self.assertIn(host, socket.gethostbyaddr(host)[2])
772
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000773 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
774 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
775 def test_sethostname(self):
776 oldhn = socket.gethostname()
777 try:
778 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200779 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000780 if e.errno == errno.EPERM:
781 self.skipTest("test should be run as root")
782 else:
783 raise
784 try:
785 # running test as root!
786 self.assertEqual(socket.gethostname(), 'new')
787 # Should work with bytes objects too
788 socket.sethostname(b'bar')
789 self.assertEqual(socket.gethostname(), 'bar')
790 finally:
791 socket.sethostname(oldhn)
792
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700793 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
794 'socket.if_nameindex() not available.')
795 def testInterfaceNameIndex(self):
796 interfaces = socket.if_nameindex()
797 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200798 self.assertIsInstance(index, int)
799 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700800 # interface indices are non-zero integers
801 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200802 _index = socket.if_nametoindex(name)
803 self.assertIsInstance(_index, int)
804 self.assertEqual(index, _index)
805 _name = socket.if_indextoname(index)
806 self.assertIsInstance(_name, str)
807 self.assertEqual(name, _name)
808
809 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
810 'socket.if_nameindex() not available.')
811 def testInvalidInterfaceNameIndex(self):
812 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200813 self.assertRaises(OSError, socket.if_indextoname, 0)
814 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200815 # test with invalid values
816 self.assertRaises(TypeError, socket.if_nametoindex, 0)
817 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700818
Serhiy Storchaka43767632013-11-03 21:31:38 +0200819 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
820 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000821 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000822 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200823 try:
824 # On some versions, this loses a reference
825 orig = sys.getrefcount(__name__)
826 socket.getnameinfo(__name__,0)
827 except TypeError:
828 if sys.getrefcount(__name__) != orig:
829 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000830
Guido van Rossum24e4af82002-06-12 19:18:08 +0000831 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000832 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000833 try:
834 # On some versions, this crashes the interpreter.
835 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200836 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000837 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000838
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000839 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000840 # This just checks that htons etc. are their own inverse,
841 # when looking at the lower 16 or 32 bits.
842 sizes = {socket.htonl: 32, socket.ntohl: 32,
843 socket.htons: 16, socket.ntohs: 16}
844 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000845 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000846 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
847 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000848
Guido van Rossuma2627af2002-09-14 00:58:46 +0000849 swapped = func(mask)
850 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000851 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000852
Guido van Rossum018919a2007-01-15 00:07:32 +0000853 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000854 good_values = [ 1, 2, 3, 1, 2, 3 ]
855 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000856 for k in good_values:
857 socket.ntohl(k)
858 socket.ntohs(k)
859 socket.htonl(k)
860 socket.htons(k)
861 for k in bad_values:
862 self.assertRaises(OverflowError, socket.ntohl, k)
863 self.assertRaises(OverflowError, socket.ntohs, k)
864 self.assertRaises(OverflowError, socket.htonl, k)
865 self.assertRaises(OverflowError, socket.htons, k)
866
Barry Warsaw11b91a02004-06-28 00:50:43 +0000867 def testGetServBy(self):
868 eq = self.assertEqual
869 # Find one service that exists, then check all the related interfaces.
870 # I've ordered this by protocols that have both a tcp and udp
871 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200872 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200873 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000874 # avoid the 'echo' service on this platform, as there is an
875 # assumption breaking non-standard port/protocol entry
876 services = ('daytime', 'qotd', 'domain')
877 else:
878 services = ('echo', 'daytime', 'domain')
879 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000880 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000881 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000882 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200883 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000884 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000885 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200886 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000887 # Try same call with optional protocol omitted
888 port2 = socket.getservbyname(service)
889 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400890 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000891 try:
892 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200893 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000894 udpport = None
895 else:
896 eq(udpport, port)
897 # Now make sure the lookup by port returns the same service name
898 eq(socket.getservbyport(port2), service)
899 eq(socket.getservbyport(port, 'tcp'), service)
900 if udpport is not None:
901 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000902 # Make sure getservbyport does not accept out of range ports.
903 self.assertRaises(OverflowError, socket.getservbyport, -1)
904 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000905
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000906 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000907 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000908 # The default timeout should initially be None
909 self.assertEqual(socket.getdefaulttimeout(), None)
910 s = socket.socket()
911 self.assertEqual(s.gettimeout(), None)
912 s.close()
913
914 # Set the default timeout to 10, and see if it propagates
915 socket.setdefaulttimeout(10)
916 self.assertEqual(socket.getdefaulttimeout(), 10)
917 s = socket.socket()
918 self.assertEqual(s.gettimeout(), 10)
919 s.close()
920
921 # Reset the default timeout to None, and see if it propagates
922 socket.setdefaulttimeout(None)
923 self.assertEqual(socket.getdefaulttimeout(), None)
924 s = socket.socket()
925 self.assertEqual(s.gettimeout(), None)
926 s.close()
927
928 # Check that setting it to an invalid value raises ValueError
929 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
930
931 # Check that setting it to an invalid type raises TypeError
932 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
933
Serhiy Storchaka43767632013-11-03 21:31:38 +0200934 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
935 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000936 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000937 # Test that issue1008086 and issue767150 are fixed.
938 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000939 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
940 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000941
Serhiy Storchaka43767632013-11-03 21:31:38 +0200942 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
943 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000944 def testIPv4toString(self):
945 from socket import inet_aton as f, inet_pton, AF_INET
946 g = lambda a: inet_pton(AF_INET, a)
947
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100948 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200949 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100950 )
951
Ezio Melottib3aedd42010-11-20 19:04:17 +0000952 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
953 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
954 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
955 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
956 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100957 assertInvalid(f, '0.0.0.')
958 assertInvalid(f, '300.0.0.0')
959 assertInvalid(f, 'a.0.0.0')
960 assertInvalid(f, '1.2.3.4.5')
961 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000962
Ezio Melottib3aedd42010-11-20 19:04:17 +0000963 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
964 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
965 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
966 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100967 assertInvalid(g, '0.0.0.')
968 assertInvalid(g, '300.0.0.0')
969 assertInvalid(g, 'a.0.0.0')
970 assertInvalid(g, '1.2.3.4.5')
971 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000972
Serhiy Storchaka43767632013-11-03 21:31:38 +0200973 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
974 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000975 def testIPv6toString(self):
976 try:
977 from socket import inet_pton, AF_INET6, has_ipv6
978 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600979 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000980 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600981 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -0500982
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +0900983 if sys.platform == "win32":
984 try:
985 inet_pton(AF_INET6, '::')
986 except OSError as e:
987 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -0600988 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -0500989
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000990 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100991 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200992 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100993 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000994
Ezio Melottib3aedd42010-11-20 19:04:17 +0000995 self.assertEqual(b'\x00' * 16, f('::'))
996 self.assertEqual(b'\x00' * 16, f('0::0'))
997 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
998 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000999 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 +00001000 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1001 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001002 self.assertEqual(
1003 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1004 f('ad42:abc::127:0:254:2')
1005 )
1006 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1007 assertInvalid('0x20::')
1008 assertInvalid(':::')
1009 assertInvalid('::0::')
1010 assertInvalid('1::abc::')
1011 assertInvalid('1::abc::def')
1012 assertInvalid('1:2:3:4:5:6:')
1013 assertInvalid('1:2:3:4:5:6')
1014 assertInvalid('1:2:3:4:5:6:7:8:')
1015 assertInvalid('1:2:3:4:5:6:7:8:0')
1016
1017 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1018 f('::254.42.23.64')
1019 )
1020 self.assertEqual(
1021 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1022 f('42::a29b:254.42.23.64')
1023 )
1024 self.assertEqual(
1025 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1026 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1027 )
1028 assertInvalid('255.254.253.252')
1029 assertInvalid('1::260.2.3.0')
1030 assertInvalid('1::0.be.e.0')
1031 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1032 assertInvalid('::1.2.3.4:0')
1033 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001034
Serhiy Storchaka43767632013-11-03 21:31:38 +02001035 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1036 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001037 def testStringToIPv4(self):
1038 from socket import inet_ntoa as f, inet_ntop, AF_INET
1039 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001040 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001041 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001042 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001043
Ezio Melottib3aedd42010-11-20 19:04:17 +00001044 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1045 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1046 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1047 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001048 assertInvalid(f, b'\x00' * 3)
1049 assertInvalid(f, b'\x00' * 5)
1050 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +00001051
Ezio Melottib3aedd42010-11-20 19:04:17 +00001052 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1053 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1054 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001055 assertInvalid(g, b'\x00' * 3)
1056 assertInvalid(g, b'\x00' * 5)
1057 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001058
Serhiy Storchaka43767632013-11-03 21:31:38 +02001059 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1060 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001061 def testStringToIPv6(self):
1062 try:
1063 from socket import inet_ntop, AF_INET6, has_ipv6
1064 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001065 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001066 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001067 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001068
1069 if sys.platform == "win32":
1070 try:
1071 inet_ntop(AF_INET6, b'\x00' * 16)
1072 except OSError as e:
1073 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001074 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001075
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001076 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001077 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001078 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001079 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001080
Ezio Melottib3aedd42010-11-20 19:04:17 +00001081 self.assertEqual('::', f(b'\x00' * 16))
1082 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1083 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001084 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001085 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 +00001086 )
1087
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001088 assertInvalid(b'\x12' * 15)
1089 assertInvalid(b'\x12' * 17)
1090 assertInvalid(b'\x12' * 4)
1091
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001092 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001093
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001094 def testSockName(self):
1095 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001096 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001097 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001098 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001099 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001100 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001101 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1102 # it reasonable to get the host's addr in addition to 0.0.0.0.
1103 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001104 try:
1105 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001106 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001107 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001108 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001109 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001110 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001111
1112 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001113 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001114 # We know a socket should start without reuse==0
1115 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001116 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001117 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001118 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001119
1120 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001121 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001122 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001123 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001124 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1125 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001126 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001127
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001128 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001129 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001130 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1131 sock.settimeout(1)
1132 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001133 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001134
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001135 def testNewAttributes(self):
1136 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001137
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001138 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1139 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001140 if hasattr(socket, 'SOCK_CLOEXEC'):
1141 self.assertIn(sock.type,
1142 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1143 socket.SOCK_STREAM))
1144 else:
1145 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001146 self.assertEqual(sock.proto, 0)
1147 sock.close()
1148
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001149 def test_getsockaddrarg(self):
1150 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001151 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001152 big_port = port + 65536
1153 neg_port = port - 65536
1154 sock = socket.socket()
1155 try:
1156 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1157 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1158 sock.bind((host, port))
1159 finally:
1160 sock.close()
1161
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001162 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001163 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001164 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1165 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1166 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1167 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001168 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1169 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001170 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001171 self.assertRaises(ValueError, s.ioctl, -1, None)
1172 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001173
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001174 def testGetaddrinfo(self):
1175 try:
1176 socket.getaddrinfo('localhost', 80)
1177 except socket.gaierror as err:
1178 if err.errno == socket.EAI_SERVICE:
1179 # see http://bugs.python.org/issue1282647
1180 self.skipTest("buggy libc version")
1181 raise
1182 # len of every sequence is supposed to be == 5
1183 for info in socket.getaddrinfo(HOST, None):
1184 self.assertEqual(len(info), 5)
1185 # host can be a domain name, a string representation of an
1186 # IPv4/v6 address or None
1187 socket.getaddrinfo('localhost', 80)
1188 socket.getaddrinfo('127.0.0.1', 80)
1189 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001190 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001191 socket.getaddrinfo('::1', 80)
1192 # port can be a string service name such as "http", a numeric
1193 # port number or None
1194 socket.getaddrinfo(HOST, "http")
1195 socket.getaddrinfo(HOST, 80)
1196 socket.getaddrinfo(HOST, None)
1197 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001198 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1199 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001200 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001201 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1202 self.assertEqual(type, socket.SOCK_STREAM)
1203 self.assertEqual(str(type), 'SocketType.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001204 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1205 for _, socktype, _, _, _ in infos:
1206 self.assertEqual(socktype, socket.SOCK_STREAM)
1207 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001208 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001209 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1210 # a server willing to support both IPv4 and IPv6 will
1211 # usually do this
1212 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1213 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001214 # test keyword arguments
1215 a = socket.getaddrinfo(HOST, None)
1216 b = socket.getaddrinfo(host=HOST, port=None)
1217 self.assertEqual(a, b)
1218 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1219 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1220 self.assertEqual(a, b)
1221 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1222 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1223 self.assertEqual(a, b)
1224 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1225 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1226 self.assertEqual(a, b)
1227 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1228 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1229 self.assertEqual(a, b)
1230 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1231 socket.AI_PASSIVE)
1232 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1233 type=socket.SOCK_STREAM, proto=0,
1234 flags=socket.AI_PASSIVE)
1235 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001236 # Issue #6697.
1237 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001238
Ned Deilyb24f4812014-02-13 22:50:42 -08001239 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001240 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001241 try:
1242 # The arguments here are undefined and the call may succeed
1243 # or fail. All we care here is that it doesn't segfault.
1244 socket.getaddrinfo("localhost", None, 0, 0, 0,
1245 socket.AI_NUMERICSERV)
1246 except socket.gaierror:
1247 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001248
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001249 def test_getnameinfo(self):
1250 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001251 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001252
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001253 @unittest.skipUnless(support.is_resource_enabled('network'),
1254 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001255 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001256 # Check for internet access before running test (issue #12804).
1257 try:
1258 socket.gethostbyname('python.org')
1259 except socket.gaierror as e:
1260 if e.errno == socket.EAI_NODATA:
1261 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001262 # these should all be successful
1263 socket.gethostbyname('испытание.python.org')
1264 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001265 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1266 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1267 # have a reverse entry yet
1268 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001269
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001270 def check_sendall_interrupted(self, with_timeout):
1271 # socketpair() is not stricly required, but it makes things easier.
1272 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1273 self.skipTest("signal.alarm and socket.socketpair required for this test")
1274 # Our signal handlers clobber the C errno by calling a math function
1275 # with an invalid domain value.
1276 def ok_handler(*args):
1277 self.assertRaises(ValueError, math.acosh, 0)
1278 def raising_handler(*args):
1279 self.assertRaises(ValueError, math.acosh, 0)
1280 1 // 0
1281 c, s = socket.socketpair()
1282 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1283 try:
1284 if with_timeout:
1285 # Just above the one second minimum for signal.alarm
1286 c.settimeout(1.5)
1287 with self.assertRaises(ZeroDivisionError):
1288 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001289 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001290 if with_timeout:
1291 signal.signal(signal.SIGALRM, ok_handler)
1292 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001293 self.assertRaises(socket.timeout, c.sendall,
1294 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001295 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001296 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001297 signal.signal(signal.SIGALRM, old_alarm)
1298 c.close()
1299 s.close()
1300
1301 def test_sendall_interrupted(self):
1302 self.check_sendall_interrupted(False)
1303
1304 def test_sendall_interrupted_with_timeout(self):
1305 self.check_sendall_interrupted(True)
1306
Antoine Pitroue033e062010-10-29 10:38:18 +00001307 def test_dealloc_warn(self):
1308 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1309 r = repr(sock)
1310 with self.assertWarns(ResourceWarning) as cm:
1311 sock = None
1312 support.gc_collect()
1313 self.assertIn(r, str(cm.warning.args[0]))
1314 # An open socket file object gets dereferenced after the socket
1315 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1316 f = sock.makefile('rb')
1317 r = repr(sock)
1318 sock = None
1319 support.gc_collect()
1320 with self.assertWarns(ResourceWarning):
1321 f = None
1322 support.gc_collect()
1323
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001324 def test_name_closed_socketio(self):
1325 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1326 fp = sock.makefile("rb")
1327 fp.close()
1328 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1329
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001330 def test_unusable_closed_socketio(self):
1331 with socket.socket() as sock:
1332 fp = sock.makefile("rb", buffering=0)
1333 self.assertTrue(fp.readable())
1334 self.assertFalse(fp.writable())
1335 self.assertFalse(fp.seekable())
1336 fp.close()
1337 self.assertRaises(ValueError, fp.readable)
1338 self.assertRaises(ValueError, fp.writable)
1339 self.assertRaises(ValueError, fp.seekable)
1340
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001341 def test_pickle(self):
1342 sock = socket.socket()
1343 with sock:
1344 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1345 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1346
Serhiy Storchaka78980432013-01-15 01:12:17 +02001347 def test_listen_backlog(self):
1348 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001349 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1350 srv.bind((HOST, 0))
1351 srv.listen(backlog)
1352
1353 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001354 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001355 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001356
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001357 @support.cpython_only
1358 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001359 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001360 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001361 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1362 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001363 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001364 srv.close()
1365
Charles-François Natali42663332012-01-02 15:57:30 +01001366 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001367 def test_flowinfo(self):
1368 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001369 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001370 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001371 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001372
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001373 def test_str_for_enums(self):
1374 # Make sure that the AF_* and SOCK_* constants have enum-like string
1375 # reprs.
1376 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1377 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
1378 self.assertEqual(str(s.type), 'SocketType.SOCK_STREAM')
1379
1380 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1381 def test_uknown_socket_family_repr(self):
1382 # Test that when created with a family that's not one of the known
1383 # AF_*/SOCK_* constants, socket.family just returns the number.
1384 #
1385 # To do this we fool socket.socket into believing it already has an
1386 # open fd because on this path it doesn't actually verify the family and
1387 # type and populates the socket object.
1388 #
1389 # On Windows this trick won't work, so the test is skipped.
1390 fd, _ = tempfile.mkstemp()
1391 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1392 self.assertEqual(s.family, 42424)
1393 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001394
Charles-François Natali47413c12011-10-06 19:47:44 +02001395@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1396class BasicCANTest(unittest.TestCase):
1397
1398 def testCrucialConstants(self):
1399 socket.AF_CAN
1400 socket.PF_CAN
1401 socket.CAN_RAW
1402
Charles-François Natali773e42d2013-02-05 19:42:01 +01001403 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1404 'socket.CAN_BCM required for this test.')
1405 def testBCMConstants(self):
1406 socket.CAN_BCM
1407
1408 # opcodes
1409 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1410 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1411 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1412 socket.CAN_BCM_TX_SEND # send one CAN frame
1413 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1414 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1415 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1416 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1417 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1418 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1419 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1420 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1421
Charles-François Natali47413c12011-10-06 19:47:44 +02001422 def testCreateSocket(self):
1423 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1424 pass
1425
Charles-François Natali773e42d2013-02-05 19:42:01 +01001426 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1427 'socket.CAN_BCM required for this test.')
1428 def testCreateBCMSocket(self):
1429 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1430 pass
1431
Charles-François Natali47413c12011-10-06 19:47:44 +02001432 def testBindAny(self):
1433 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1434 s.bind(('', ))
1435
1436 def testTooLongInterfaceName(self):
1437 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1438 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001439 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001440 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001441
1442 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1443 'socket.CAN_RAW_LOOPBACK required for this test.')
1444 def testLoopback(self):
1445 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1446 for loopback in (0, 1):
1447 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1448 loopback)
1449 self.assertEqual(loopback,
1450 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1451
1452 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1453 'socket.CAN_RAW_FILTER required for this test.')
1454 def testFilter(self):
1455 can_id, can_mask = 0x200, 0x700
1456 can_filter = struct.pack("=II", can_id, can_mask)
1457 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1458 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1459 self.assertEqual(can_filter,
1460 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1461
1462
1463@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001464class CANTest(ThreadedCANSocketTest):
1465
Charles-François Natali47413c12011-10-06 19:47:44 +02001466 def __init__(self, methodName='runTest'):
1467 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1468
1469 @classmethod
1470 def build_can_frame(cls, can_id, data):
1471 """Build a CAN frame."""
1472 can_dlc = len(data)
1473 data = data.ljust(8, b'\x00')
1474 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1475
1476 @classmethod
1477 def dissect_can_frame(cls, frame):
1478 """Dissect a CAN frame."""
1479 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1480 return (can_id, can_dlc, data[:can_dlc])
1481
1482 def testSendFrame(self):
1483 cf, addr = self.s.recvfrom(self.bufsize)
1484 self.assertEqual(self.cf, cf)
1485 self.assertEqual(addr[0], self.interface)
1486 self.assertEqual(addr[1], socket.AF_CAN)
1487
1488 def _testSendFrame(self):
1489 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1490 self.cli.send(self.cf)
1491
1492 def testSendMaxFrame(self):
1493 cf, addr = self.s.recvfrom(self.bufsize)
1494 self.assertEqual(self.cf, cf)
1495
1496 def _testSendMaxFrame(self):
1497 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1498 self.cli.send(self.cf)
1499
1500 def testSendMultiFrames(self):
1501 cf, addr = self.s.recvfrom(self.bufsize)
1502 self.assertEqual(self.cf1, cf)
1503
1504 cf, addr = self.s.recvfrom(self.bufsize)
1505 self.assertEqual(self.cf2, cf)
1506
1507 def _testSendMultiFrames(self):
1508 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1509 self.cli.send(self.cf1)
1510
1511 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1512 self.cli.send(self.cf2)
1513
Charles-François Natali773e42d2013-02-05 19:42:01 +01001514 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1515 'socket.CAN_BCM required for this test.')
1516 def _testBCM(self):
1517 cf, addr = self.cli.recvfrom(self.bufsize)
1518 self.assertEqual(self.cf, cf)
1519 can_id, can_dlc, data = self.dissect_can_frame(cf)
1520 self.assertEqual(self.can_id, can_id)
1521 self.assertEqual(self.data, data)
1522
1523 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1524 'socket.CAN_BCM required for this test.')
1525 def testBCM(self):
1526 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1527 self.addCleanup(bcm.close)
1528 bcm.connect((self.interface,))
1529 self.can_id = 0x123
1530 self.data = bytes([0xc0, 0xff, 0xee])
1531 self.cf = self.build_can_frame(self.can_id, self.data)
1532 opcode = socket.CAN_BCM_TX_SEND
1533 flags = 0
1534 count = 0
1535 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1536 bcm_can_id = 0x0222
1537 nframes = 1
1538 assert len(self.cf) == 16
1539 header = struct.pack(self.bcm_cmd_msg_fmt,
1540 opcode,
1541 flags,
1542 count,
1543 ival1_seconds,
1544 ival1_usec,
1545 ival2_seconds,
1546 ival2_usec,
1547 bcm_can_id,
1548 nframes,
1549 )
1550 header_plus_frame = header + self.cf
1551 bytes_sent = bcm.send(header_plus_frame)
1552 self.assertEqual(bytes_sent, len(header_plus_frame))
1553
Charles-François Natali47413c12011-10-06 19:47:44 +02001554
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001555@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1556class BasicRDSTest(unittest.TestCase):
1557
1558 def testCrucialConstants(self):
1559 socket.AF_RDS
1560 socket.PF_RDS
1561
1562 def testCreateSocket(self):
1563 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1564 pass
1565
1566 def testSocketBufferSize(self):
1567 bufsize = 16384
1568 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1569 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1570 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1571
1572
1573@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1574@unittest.skipUnless(thread, 'Threading required for this test.')
1575class RDSTest(ThreadedRDSSocketTest):
1576
1577 def __init__(self, methodName='runTest'):
1578 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1579
Charles-François Natali240c55f2011-11-10 20:33:36 +01001580 def setUp(self):
1581 super().setUp()
1582 self.evt = threading.Event()
1583
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001584 def testSendAndRecv(self):
1585 data, addr = self.serv.recvfrom(self.bufsize)
1586 self.assertEqual(self.data, data)
1587 self.assertEqual(self.cli_addr, addr)
1588
1589 def _testSendAndRecv(self):
1590 self.data = b'spam'
1591 self.cli.sendto(self.data, 0, (HOST, self.port))
1592
1593 def testPeek(self):
1594 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1595 self.assertEqual(self.data, data)
1596 data, addr = self.serv.recvfrom(self.bufsize)
1597 self.assertEqual(self.data, data)
1598
1599 def _testPeek(self):
1600 self.data = b'spam'
1601 self.cli.sendto(self.data, 0, (HOST, self.port))
1602
1603 @requireAttrs(socket.socket, 'recvmsg')
1604 def testSendAndRecvMsg(self):
1605 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1606 self.assertEqual(self.data, data)
1607
1608 @requireAttrs(socket.socket, 'sendmsg')
1609 def _testSendAndRecvMsg(self):
1610 self.data = b'hello ' * 10
1611 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1612
1613 def testSendAndRecvMulti(self):
1614 data, addr = self.serv.recvfrom(self.bufsize)
1615 self.assertEqual(self.data1, data)
1616
1617 data, addr = self.serv.recvfrom(self.bufsize)
1618 self.assertEqual(self.data2, data)
1619
1620 def _testSendAndRecvMulti(self):
1621 self.data1 = b'bacon'
1622 self.cli.sendto(self.data1, 0, (HOST, self.port))
1623
1624 self.data2 = b'egg'
1625 self.cli.sendto(self.data2, 0, (HOST, self.port))
1626
1627 def testSelect(self):
1628 r, w, x = select.select([self.serv], [], [], 3.0)
1629 self.assertIn(self.serv, r)
1630 data, addr = self.serv.recvfrom(self.bufsize)
1631 self.assertEqual(self.data, data)
1632
1633 def _testSelect(self):
1634 self.data = b'select'
1635 self.cli.sendto(self.data, 0, (HOST, self.port))
1636
1637 def testCongestion(self):
1638 # wait until the sender is done
1639 self.evt.wait()
1640
1641 def _testCongestion(self):
1642 # test the behavior in case of congestion
1643 self.data = b'fill'
1644 self.cli.setblocking(False)
1645 try:
1646 # try to lower the receiver's socket buffer size
1647 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1648 except OSError:
1649 pass
1650 with self.assertRaises(OSError) as cm:
1651 try:
1652 # fill the receiver's socket buffer
1653 while True:
1654 self.cli.sendto(self.data, 0, (HOST, self.port))
1655 finally:
1656 # signal the receiver we're done
1657 self.evt.set()
1658 # sendto() should have failed with ENOBUFS
1659 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1660 # and we should have received a congestion notification through poll
1661 r, w, x = select.select([self.serv], [], [], 3.0)
1662 self.assertIn(self.serv, r)
1663
1664
Victor Stinner45df8202010-04-28 22:31:17 +00001665@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001666class BasicTCPTest(SocketConnectedTest):
1667
1668 def __init__(self, methodName='runTest'):
1669 SocketConnectedTest.__init__(self, methodName=methodName)
1670
1671 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001672 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001673 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001674 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001675
1676 def _testRecv(self):
1677 self.serv_conn.send(MSG)
1678
1679 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001680 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001681 seg1 = self.cli_conn.recv(len(MSG) - 3)
1682 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001683 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001684 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001685
1686 def _testOverFlowRecv(self):
1687 self.serv_conn.send(MSG)
1688
1689 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001690 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001691 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001692 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001693
1694 def _testRecvFrom(self):
1695 self.serv_conn.send(MSG)
1696
1697 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001698 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001699 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1700 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001701 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001702 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001703
1704 def _testOverFlowRecvFrom(self):
1705 self.serv_conn.send(MSG)
1706
1707 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001708 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001709 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001710 while 1:
1711 read = self.cli_conn.recv(1024)
1712 if not read:
1713 break
Guido van Rossume531e292002-08-08 20:28:34 +00001714 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001715 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001716
1717 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001718 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001719 self.serv_conn.sendall(big_chunk)
1720
1721 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001722 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001723 fd = self.cli_conn.fileno()
1724 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001725 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001726 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001727 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001728 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001729
1730 def _testFromFd(self):
1731 self.serv_conn.send(MSG)
1732
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001733 def testDup(self):
1734 # Testing dup()
1735 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001736 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001737 msg = sock.recv(1024)
1738 self.assertEqual(msg, MSG)
1739
1740 def _testDup(self):
1741 self.serv_conn.send(MSG)
1742
Guido van Rossum24e4af82002-06-12 19:18:08 +00001743 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001744 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001745 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001746 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001747 # wait for _testShutdown to finish: on OS X, when the server
1748 # closes the connection the client also becomes disconnected,
1749 # and the client's shutdown call will fail. (Issue #4397.)
1750 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001751
1752 def _testShutdown(self):
1753 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001754 self.serv_conn.shutdown(2)
1755
1756 testShutdown_overflow = support.cpython_only(testShutdown)
1757
1758 @support.cpython_only
1759 def _testShutdown_overflow(self):
1760 import _testcapi
1761 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001762 # Issue 15989
1763 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1764 _testcapi.INT_MAX + 1)
1765 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1766 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001767 self.serv_conn.shutdown(2)
1768
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001769 def testDetach(self):
1770 # Testing detach()
1771 fileno = self.cli_conn.fileno()
1772 f = self.cli_conn.detach()
1773 self.assertEqual(f, fileno)
1774 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001775 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001776 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001777 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001778 # ...but we can create another socket using the (still open)
1779 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001780 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001781 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001782 msg = sock.recv(1024)
1783 self.assertEqual(msg, MSG)
1784
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001785 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001786 self.serv_conn.send(MSG)
1787
Victor Stinner45df8202010-04-28 22:31:17 +00001788@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001789class BasicUDPTest(ThreadedUDPSocketTest):
1790
1791 def __init__(self, methodName='runTest'):
1792 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1793
1794 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001795 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001796 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001797 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001798
1799 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001800 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001801
Guido van Rossum1c938012002-06-12 21:17:20 +00001802 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001803 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001804 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001805 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001806
Guido van Rossum1c938012002-06-12 21:17:20 +00001807 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001808 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001809
Guido van Rossumd8faa362007-04-27 19:54:29 +00001810 def testRecvFromNegative(self):
1811 # Negative lengths passed to recvfrom should give ValueError.
1812 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1813
1814 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001815 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001816
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001817# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1818# same test code is used with different families and types of socket
1819# (e.g. stream, datagram), and tests using recvmsg() are repeated
1820# using recvmsg_into().
1821#
1822# The generic test classes such as SendmsgTests and
1823# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1824# supplied with sockets cli_sock and serv_sock representing the
1825# client's and the server's end of the connection respectively, and
1826# attributes cli_addr and serv_addr holding their (numeric where
1827# appropriate) addresses.
1828#
1829# The final concrete test classes combine these with subclasses of
1830# SocketTestBase which set up client and server sockets of a specific
1831# type, and with subclasses of SendrecvmsgBase such as
1832# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1833# sockets to cli_sock and serv_sock and override the methods and
1834# attributes of SendrecvmsgBase to fill in destination addresses if
1835# needed when sending, check for specific flags in msg_flags, etc.
1836#
1837# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1838# recvmsg_into().
1839
1840# XXX: like the other datagram (UDP) tests in this module, the code
1841# here assumes that datagram delivery on the local machine will be
1842# reliable.
1843
1844class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1845 # Base class for sendmsg()/recvmsg() tests.
1846
1847 # Time in seconds to wait before considering a test failed, or
1848 # None for no timeout. Not all tests actually set a timeout.
1849 fail_timeout = 3.0
1850
1851 def setUp(self):
1852 self.misc_event = threading.Event()
1853 super().setUp()
1854
1855 def sendToServer(self, msg):
1856 # Send msg to the server.
1857 return self.cli_sock.send(msg)
1858
1859 # Tuple of alternative default arguments for sendmsg() when called
1860 # via sendmsgToServer() (e.g. to include a destination address).
1861 sendmsg_to_server_defaults = ()
1862
1863 def sendmsgToServer(self, *args):
1864 # Call sendmsg() on self.cli_sock with the given arguments,
1865 # filling in any arguments which are not supplied with the
1866 # corresponding items of self.sendmsg_to_server_defaults, if
1867 # any.
1868 return self.cli_sock.sendmsg(
1869 *(args + self.sendmsg_to_server_defaults[len(args):]))
1870
1871 def doRecvmsg(self, sock, bufsize, *args):
1872 # Call recvmsg() on sock with given arguments and return its
1873 # result. Should be used for tests which can use either
1874 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1875 # this method with one which emulates it using recvmsg_into(),
1876 # thus allowing the same test to be used for both methods.
1877 result = sock.recvmsg(bufsize, *args)
1878 self.registerRecvmsgResult(result)
1879 return result
1880
1881 def registerRecvmsgResult(self, result):
1882 # Called by doRecvmsg() with the return value of recvmsg() or
1883 # recvmsg_into(). Can be overridden to arrange cleanup based
1884 # on the returned ancillary data, for instance.
1885 pass
1886
1887 def checkRecvmsgAddress(self, addr1, addr2):
1888 # Called to compare the received address with the address of
1889 # the peer.
1890 self.assertEqual(addr1, addr2)
1891
1892 # Flags that are normally unset in msg_flags
1893 msg_flags_common_unset = 0
1894 for name in ("MSG_CTRUNC", "MSG_OOB"):
1895 msg_flags_common_unset |= getattr(socket, name, 0)
1896
1897 # Flags that are normally set
1898 msg_flags_common_set = 0
1899
1900 # Flags set when a complete record has been received (e.g. MSG_EOR
1901 # for SCTP)
1902 msg_flags_eor_indicator = 0
1903
1904 # Flags set when a complete record has not been received
1905 # (e.g. MSG_TRUNC for datagram sockets)
1906 msg_flags_non_eor_indicator = 0
1907
1908 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1909 # Method to check the value of msg_flags returned by recvmsg[_into]().
1910 #
1911 # Checks that all bits in msg_flags_common_set attribute are
1912 # set in "flags" and all bits in msg_flags_common_unset are
1913 # unset.
1914 #
1915 # The "eor" argument specifies whether the flags should
1916 # indicate that a full record (or datagram) has been received.
1917 # If "eor" is None, no checks are done; otherwise, checks
1918 # that:
1919 #
1920 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1921 # set and all bits in msg_flags_non_eor_indicator are unset
1922 #
1923 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1924 # are set and all bits in msg_flags_eor_indicator are unset
1925 #
1926 # If "checkset" and/or "checkunset" are supplied, they require
1927 # the given bits to be set or unset respectively, overriding
1928 # what the attributes require for those bits.
1929 #
1930 # If any bits are set in "ignore", they will not be checked,
1931 # regardless of the other inputs.
1932 #
1933 # Will raise Exception if the inputs require a bit to be both
1934 # set and unset, and it is not ignored.
1935
1936 defaultset = self.msg_flags_common_set
1937 defaultunset = self.msg_flags_common_unset
1938
1939 if eor:
1940 defaultset |= self.msg_flags_eor_indicator
1941 defaultunset |= self.msg_flags_non_eor_indicator
1942 elif eor is not None:
1943 defaultset |= self.msg_flags_non_eor_indicator
1944 defaultunset |= self.msg_flags_eor_indicator
1945
1946 # Function arguments override defaults
1947 defaultset &= ~checkunset
1948 defaultunset &= ~checkset
1949
1950 # Merge arguments with remaining defaults, and check for conflicts
1951 checkset |= defaultset
1952 checkunset |= defaultunset
1953 inboth = checkset & checkunset & ~ignore
1954 if inboth:
1955 raise Exception("contradictory set, unset requirements for flags "
1956 "{0:#x}".format(inboth))
1957
1958 # Compare with given msg_flags value
1959 mask = (checkset | checkunset) & ~ignore
1960 self.assertEqual(flags & mask, checkset & mask)
1961
1962
1963class RecvmsgIntoMixin(SendrecvmsgBase):
1964 # Mixin to implement doRecvmsg() using recvmsg_into().
1965
1966 def doRecvmsg(self, sock, bufsize, *args):
1967 buf = bytearray(bufsize)
1968 result = sock.recvmsg_into([buf], *args)
1969 self.registerRecvmsgResult(result)
1970 self.assertGreaterEqual(result[0], 0)
1971 self.assertLessEqual(result[0], bufsize)
1972 return (bytes(buf[:result[0]]),) + result[1:]
1973
1974
1975class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1976 # Defines flags to be checked in msg_flags for datagram sockets.
1977
1978 @property
1979 def msg_flags_non_eor_indicator(self):
1980 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1981
1982
1983class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1984 # Defines flags to be checked in msg_flags for SCTP sockets.
1985
1986 @property
1987 def msg_flags_eor_indicator(self):
1988 return super().msg_flags_eor_indicator | socket.MSG_EOR
1989
1990
1991class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1992 # Base class for tests on connectionless-mode sockets. Users must
1993 # supply sockets on attributes cli and serv to be mapped to
1994 # cli_sock and serv_sock respectively.
1995
1996 @property
1997 def serv_sock(self):
1998 return self.serv
1999
2000 @property
2001 def cli_sock(self):
2002 return self.cli
2003
2004 @property
2005 def sendmsg_to_server_defaults(self):
2006 return ([], [], 0, self.serv_addr)
2007
2008 def sendToServer(self, msg):
2009 return self.cli_sock.sendto(msg, self.serv_addr)
2010
2011
2012class SendrecvmsgConnectedBase(SendrecvmsgBase):
2013 # Base class for tests on connected sockets. Users must supply
2014 # sockets on attributes serv_conn and cli_conn (representing the
2015 # connections *to* the server and the client), to be mapped to
2016 # cli_sock and serv_sock respectively.
2017
2018 @property
2019 def serv_sock(self):
2020 return self.cli_conn
2021
2022 @property
2023 def cli_sock(self):
2024 return self.serv_conn
2025
2026 def checkRecvmsgAddress(self, addr1, addr2):
2027 # Address is currently "unspecified" for a connected socket,
2028 # so we don't examine it
2029 pass
2030
2031
2032class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2033 # Base class to set a timeout on server's socket.
2034
2035 def setUp(self):
2036 super().setUp()
2037 self.serv_sock.settimeout(self.fail_timeout)
2038
2039
2040class SendmsgTests(SendrecvmsgServerTimeoutBase):
2041 # Tests for sendmsg() which can use any socket type and do not
2042 # involve recvmsg() or recvmsg_into().
2043
2044 def testSendmsg(self):
2045 # Send a simple message with sendmsg().
2046 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2047
2048 def _testSendmsg(self):
2049 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2050
2051 def testSendmsgDataGenerator(self):
2052 # Send from buffer obtained from a generator (not a sequence).
2053 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2054
2055 def _testSendmsgDataGenerator(self):
2056 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2057 len(MSG))
2058
2059 def testSendmsgAncillaryGenerator(self):
2060 # Gather (empty) ancillary data from a generator.
2061 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2062
2063 def _testSendmsgAncillaryGenerator(self):
2064 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2065 len(MSG))
2066
2067 def testSendmsgArray(self):
2068 # Send data from an array instead of the usual bytes object.
2069 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2070
2071 def _testSendmsgArray(self):
2072 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2073 len(MSG))
2074
2075 def testSendmsgGather(self):
2076 # Send message data from more than one buffer (gather write).
2077 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2078
2079 def _testSendmsgGather(self):
2080 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2081
2082 def testSendmsgBadArgs(self):
2083 # Check that sendmsg() rejects invalid arguments.
2084 self.assertEqual(self.serv_sock.recv(1000), b"done")
2085
2086 def _testSendmsgBadArgs(self):
2087 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2088 self.assertRaises(TypeError, self.sendmsgToServer,
2089 b"not in an iterable")
2090 self.assertRaises(TypeError, self.sendmsgToServer,
2091 object())
2092 self.assertRaises(TypeError, self.sendmsgToServer,
2093 [object()])
2094 self.assertRaises(TypeError, self.sendmsgToServer,
2095 [MSG, object()])
2096 self.assertRaises(TypeError, self.sendmsgToServer,
2097 [MSG], object())
2098 self.assertRaises(TypeError, self.sendmsgToServer,
2099 [MSG], [], object())
2100 self.assertRaises(TypeError, self.sendmsgToServer,
2101 [MSG], [], 0, object())
2102 self.sendToServer(b"done")
2103
2104 def testSendmsgBadCmsg(self):
2105 # Check that invalid ancillary data items are rejected.
2106 self.assertEqual(self.serv_sock.recv(1000), b"done")
2107
2108 def _testSendmsgBadCmsg(self):
2109 self.assertRaises(TypeError, self.sendmsgToServer,
2110 [MSG], [object()])
2111 self.assertRaises(TypeError, self.sendmsgToServer,
2112 [MSG], [(object(), 0, b"data")])
2113 self.assertRaises(TypeError, self.sendmsgToServer,
2114 [MSG], [(0, object(), b"data")])
2115 self.assertRaises(TypeError, self.sendmsgToServer,
2116 [MSG], [(0, 0, object())])
2117 self.assertRaises(TypeError, self.sendmsgToServer,
2118 [MSG], [(0, 0)])
2119 self.assertRaises(TypeError, self.sendmsgToServer,
2120 [MSG], [(0, 0, b"data", 42)])
2121 self.sendToServer(b"done")
2122
2123 @requireAttrs(socket, "CMSG_SPACE")
2124 def testSendmsgBadMultiCmsg(self):
2125 # Check that invalid ancillary data items are rejected when
2126 # more than one item is present.
2127 self.assertEqual(self.serv_sock.recv(1000), b"done")
2128
2129 @testSendmsgBadMultiCmsg.client_skip
2130 def _testSendmsgBadMultiCmsg(self):
2131 self.assertRaises(TypeError, self.sendmsgToServer,
2132 [MSG], [0, 0, b""])
2133 self.assertRaises(TypeError, self.sendmsgToServer,
2134 [MSG], [(0, 0, b""), object()])
2135 self.sendToServer(b"done")
2136
2137 def testSendmsgExcessCmsgReject(self):
2138 # Check that sendmsg() rejects excess ancillary data items
2139 # when the number that can be sent is limited.
2140 self.assertEqual(self.serv_sock.recv(1000), b"done")
2141
2142 def _testSendmsgExcessCmsgReject(self):
2143 if not hasattr(socket, "CMSG_SPACE"):
2144 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002145 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002146 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2147 self.assertIsNone(cm.exception.errno)
2148 self.sendToServer(b"done")
2149
2150 def testSendmsgAfterClose(self):
2151 # Check that sendmsg() fails on a closed socket.
2152 pass
2153
2154 def _testSendmsgAfterClose(self):
2155 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002156 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002157
2158
2159class SendmsgStreamTests(SendmsgTests):
2160 # Tests for sendmsg() which require a stream socket and do not
2161 # involve recvmsg() or recvmsg_into().
2162
2163 def testSendmsgExplicitNoneAddr(self):
2164 # Check that peer address can be specified as None.
2165 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2166
2167 def _testSendmsgExplicitNoneAddr(self):
2168 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2169
2170 def testSendmsgTimeout(self):
2171 # Check that timeout works with sendmsg().
2172 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2173 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2174
2175 def _testSendmsgTimeout(self):
2176 try:
2177 self.cli_sock.settimeout(0.03)
2178 with self.assertRaises(socket.timeout):
2179 while True:
2180 self.sendmsgToServer([b"a"*512])
2181 finally:
2182 self.misc_event.set()
2183
2184 # XXX: would be nice to have more tests for sendmsg flags argument.
2185
2186 # Linux supports MSG_DONTWAIT when sending, but in general, it
2187 # only works when receiving. Could add other platforms if they
2188 # support it too.
2189 @skipWithClientIf(sys.platform not in {"linux2"},
2190 "MSG_DONTWAIT not known to work on this platform when "
2191 "sending")
2192 def testSendmsgDontWait(self):
2193 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2194 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2195 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2196
2197 @testSendmsgDontWait.client_skip
2198 def _testSendmsgDontWait(self):
2199 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002200 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002201 while True:
2202 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2203 self.assertIn(cm.exception.errno,
2204 (errno.EAGAIN, errno.EWOULDBLOCK))
2205 finally:
2206 self.misc_event.set()
2207
2208
2209class SendmsgConnectionlessTests(SendmsgTests):
2210 # Tests for sendmsg() which require a connectionless-mode
2211 # (e.g. datagram) socket, and do not involve recvmsg() or
2212 # recvmsg_into().
2213
2214 def testSendmsgNoDestAddr(self):
2215 # Check that sendmsg() fails when no destination address is
2216 # given for unconnected socket.
2217 pass
2218
2219 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002220 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002221 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002222 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002223 [MSG], [], 0, None)
2224
2225
2226class RecvmsgGenericTests(SendrecvmsgBase):
2227 # Tests for recvmsg() which can also be emulated using
2228 # recvmsg_into(), and can use any socket type.
2229
2230 def testRecvmsg(self):
2231 # Receive a simple message with recvmsg[_into]().
2232 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2233 self.assertEqual(msg, MSG)
2234 self.checkRecvmsgAddress(addr, self.cli_addr)
2235 self.assertEqual(ancdata, [])
2236 self.checkFlags(flags, eor=True)
2237
2238 def _testRecvmsg(self):
2239 self.sendToServer(MSG)
2240
2241 def testRecvmsgExplicitDefaults(self):
2242 # Test recvmsg[_into]() with default arguments provided explicitly.
2243 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2244 len(MSG), 0, 0)
2245 self.assertEqual(msg, MSG)
2246 self.checkRecvmsgAddress(addr, self.cli_addr)
2247 self.assertEqual(ancdata, [])
2248 self.checkFlags(flags, eor=True)
2249
2250 def _testRecvmsgExplicitDefaults(self):
2251 self.sendToServer(MSG)
2252
2253 def testRecvmsgShorter(self):
2254 # Receive a message smaller than buffer.
2255 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2256 len(MSG) + 42)
2257 self.assertEqual(msg, MSG)
2258 self.checkRecvmsgAddress(addr, self.cli_addr)
2259 self.assertEqual(ancdata, [])
2260 self.checkFlags(flags, eor=True)
2261
2262 def _testRecvmsgShorter(self):
2263 self.sendToServer(MSG)
2264
Charles-François Natali8619cd72011-10-03 19:43:15 +02002265 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2266 # datagram is received (issue #13001).
2267 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002268 def testRecvmsgTrunc(self):
2269 # Receive part of message, check for truncation indicators.
2270 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2271 len(MSG) - 3)
2272 self.assertEqual(msg, MSG[:-3])
2273 self.checkRecvmsgAddress(addr, self.cli_addr)
2274 self.assertEqual(ancdata, [])
2275 self.checkFlags(flags, eor=False)
2276
Charles-François Natali8619cd72011-10-03 19:43:15 +02002277 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002278 def _testRecvmsgTrunc(self):
2279 self.sendToServer(MSG)
2280
2281 def testRecvmsgShortAncillaryBuf(self):
2282 # Test ancillary data buffer too small to hold any ancillary data.
2283 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2284 len(MSG), 1)
2285 self.assertEqual(msg, MSG)
2286 self.checkRecvmsgAddress(addr, self.cli_addr)
2287 self.assertEqual(ancdata, [])
2288 self.checkFlags(flags, eor=True)
2289
2290 def _testRecvmsgShortAncillaryBuf(self):
2291 self.sendToServer(MSG)
2292
2293 def testRecvmsgLongAncillaryBuf(self):
2294 # Test large ancillary data buffer.
2295 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2296 len(MSG), 10240)
2297 self.assertEqual(msg, MSG)
2298 self.checkRecvmsgAddress(addr, self.cli_addr)
2299 self.assertEqual(ancdata, [])
2300 self.checkFlags(flags, eor=True)
2301
2302 def _testRecvmsgLongAncillaryBuf(self):
2303 self.sendToServer(MSG)
2304
2305 def testRecvmsgAfterClose(self):
2306 # Check that recvmsg[_into]() fails on a closed socket.
2307 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002308 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002309
2310 def _testRecvmsgAfterClose(self):
2311 pass
2312
2313 def testRecvmsgTimeout(self):
2314 # Check that timeout works.
2315 try:
2316 self.serv_sock.settimeout(0.03)
2317 self.assertRaises(socket.timeout,
2318 self.doRecvmsg, self.serv_sock, len(MSG))
2319 finally:
2320 self.misc_event.set()
2321
2322 def _testRecvmsgTimeout(self):
2323 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2324
2325 @requireAttrs(socket, "MSG_PEEK")
2326 def testRecvmsgPeek(self):
2327 # Check that MSG_PEEK in flags enables examination of pending
2328 # data without consuming it.
2329
2330 # Receive part of data with MSG_PEEK.
2331 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2332 len(MSG) - 3, 0,
2333 socket.MSG_PEEK)
2334 self.assertEqual(msg, MSG[:-3])
2335 self.checkRecvmsgAddress(addr, self.cli_addr)
2336 self.assertEqual(ancdata, [])
2337 # Ignoring MSG_TRUNC here (so this test is the same for stream
2338 # and datagram sockets). Some wording in POSIX seems to
2339 # suggest that it needn't be set when peeking, but that may
2340 # just be a slip.
2341 self.checkFlags(flags, eor=False,
2342 ignore=getattr(socket, "MSG_TRUNC", 0))
2343
2344 # Receive all data with MSG_PEEK.
2345 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2346 len(MSG), 0,
2347 socket.MSG_PEEK)
2348 self.assertEqual(msg, MSG)
2349 self.checkRecvmsgAddress(addr, self.cli_addr)
2350 self.assertEqual(ancdata, [])
2351 self.checkFlags(flags, eor=True)
2352
2353 # Check that the same data can still be received normally.
2354 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2355 self.assertEqual(msg, MSG)
2356 self.checkRecvmsgAddress(addr, self.cli_addr)
2357 self.assertEqual(ancdata, [])
2358 self.checkFlags(flags, eor=True)
2359
2360 @testRecvmsgPeek.client_skip
2361 def _testRecvmsgPeek(self):
2362 self.sendToServer(MSG)
2363
2364 @requireAttrs(socket.socket, "sendmsg")
2365 def testRecvmsgFromSendmsg(self):
2366 # Test receiving with recvmsg[_into]() when message is sent
2367 # using sendmsg().
2368 self.serv_sock.settimeout(self.fail_timeout)
2369 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2370 self.assertEqual(msg, MSG)
2371 self.checkRecvmsgAddress(addr, self.cli_addr)
2372 self.assertEqual(ancdata, [])
2373 self.checkFlags(flags, eor=True)
2374
2375 @testRecvmsgFromSendmsg.client_skip
2376 def _testRecvmsgFromSendmsg(self):
2377 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2378
2379
2380class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2381 # Tests which require a stream socket and can use either recvmsg()
2382 # or recvmsg_into().
2383
2384 def testRecvmsgEOF(self):
2385 # Receive end-of-stream indicator (b"", peer socket closed).
2386 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2387 self.assertEqual(msg, b"")
2388 self.checkRecvmsgAddress(addr, self.cli_addr)
2389 self.assertEqual(ancdata, [])
2390 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2391
2392 def _testRecvmsgEOF(self):
2393 self.cli_sock.close()
2394
2395 def testRecvmsgOverflow(self):
2396 # Receive a message in more than one chunk.
2397 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2398 len(MSG) - 3)
2399 self.checkRecvmsgAddress(addr, self.cli_addr)
2400 self.assertEqual(ancdata, [])
2401 self.checkFlags(flags, eor=False)
2402
2403 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2404 self.checkRecvmsgAddress(addr, self.cli_addr)
2405 self.assertEqual(ancdata, [])
2406 self.checkFlags(flags, eor=True)
2407
2408 msg = seg1 + seg2
2409 self.assertEqual(msg, MSG)
2410
2411 def _testRecvmsgOverflow(self):
2412 self.sendToServer(MSG)
2413
2414
2415class RecvmsgTests(RecvmsgGenericTests):
2416 # Tests for recvmsg() which can use any socket type.
2417
2418 def testRecvmsgBadArgs(self):
2419 # Check that recvmsg() rejects invalid arguments.
2420 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2421 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2422 -1, 0, 0)
2423 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2424 len(MSG), -1, 0)
2425 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2426 [bytearray(10)], 0, 0)
2427 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2428 object(), 0, 0)
2429 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2430 len(MSG), object(), 0)
2431 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2432 len(MSG), 0, object())
2433
2434 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2435 self.assertEqual(msg, MSG)
2436 self.checkRecvmsgAddress(addr, self.cli_addr)
2437 self.assertEqual(ancdata, [])
2438 self.checkFlags(flags, eor=True)
2439
2440 def _testRecvmsgBadArgs(self):
2441 self.sendToServer(MSG)
2442
2443
2444class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2445 # Tests for recvmsg_into() which can use any socket type.
2446
2447 def testRecvmsgIntoBadArgs(self):
2448 # Check that recvmsg_into() rejects invalid arguments.
2449 buf = bytearray(len(MSG))
2450 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2451 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2452 len(MSG), 0, 0)
2453 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2454 buf, 0, 0)
2455 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2456 [object()], 0, 0)
2457 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2458 [b"I'm not writable"], 0, 0)
2459 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2460 [buf, object()], 0, 0)
2461 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2462 [buf], -1, 0)
2463 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2464 [buf], object(), 0)
2465 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2466 [buf], 0, object())
2467
2468 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2469 self.assertEqual(nbytes, len(MSG))
2470 self.assertEqual(buf, bytearray(MSG))
2471 self.checkRecvmsgAddress(addr, self.cli_addr)
2472 self.assertEqual(ancdata, [])
2473 self.checkFlags(flags, eor=True)
2474
2475 def _testRecvmsgIntoBadArgs(self):
2476 self.sendToServer(MSG)
2477
2478 def testRecvmsgIntoGenerator(self):
2479 # Receive into buffer obtained from a generator (not a sequence).
2480 buf = bytearray(len(MSG))
2481 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2482 (o for o in [buf]))
2483 self.assertEqual(nbytes, len(MSG))
2484 self.assertEqual(buf, bytearray(MSG))
2485 self.checkRecvmsgAddress(addr, self.cli_addr)
2486 self.assertEqual(ancdata, [])
2487 self.checkFlags(flags, eor=True)
2488
2489 def _testRecvmsgIntoGenerator(self):
2490 self.sendToServer(MSG)
2491
2492 def testRecvmsgIntoArray(self):
2493 # Receive into an array rather than the usual bytearray.
2494 buf = array.array("B", [0] * len(MSG))
2495 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2496 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002497 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002498 self.checkRecvmsgAddress(addr, self.cli_addr)
2499 self.assertEqual(ancdata, [])
2500 self.checkFlags(flags, eor=True)
2501
2502 def _testRecvmsgIntoArray(self):
2503 self.sendToServer(MSG)
2504
2505 def testRecvmsgIntoScatter(self):
2506 # Receive into multiple buffers (scatter write).
2507 b1 = bytearray(b"----")
2508 b2 = bytearray(b"0123456789")
2509 b3 = bytearray(b"--------------")
2510 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2511 [b1, memoryview(b2)[2:9], b3])
2512 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2513 self.assertEqual(b1, bytearray(b"Mary"))
2514 self.assertEqual(b2, bytearray(b"01 had a 9"))
2515 self.assertEqual(b3, bytearray(b"little lamb---"))
2516 self.checkRecvmsgAddress(addr, self.cli_addr)
2517 self.assertEqual(ancdata, [])
2518 self.checkFlags(flags, eor=True)
2519
2520 def _testRecvmsgIntoScatter(self):
2521 self.sendToServer(b"Mary had a little lamb")
2522
2523
2524class CmsgMacroTests(unittest.TestCase):
2525 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2526 # assumptions used by sendmsg() and recvmsg[_into](), which share
2527 # code with these functions.
2528
2529 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002530 try:
2531 import _testcapi
2532 except ImportError:
2533 socklen_t_limit = 0x7fffffff
2534 else:
2535 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002536
2537 @requireAttrs(socket, "CMSG_LEN")
2538 def testCMSG_LEN(self):
2539 # Test CMSG_LEN() with various valid and invalid values,
2540 # checking the assumptions used by recvmsg() and sendmsg().
2541 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2542 values = list(range(257)) + list(range(toobig - 257, toobig))
2543
2544 # struct cmsghdr has at least three members, two of which are ints
2545 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2546 for n in values:
2547 ret = socket.CMSG_LEN(n)
2548 # This is how recvmsg() calculates the data size
2549 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2550 self.assertLessEqual(ret, self.socklen_t_limit)
2551
2552 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2553 # sendmsg() shares code with these functions, and requires
2554 # that it reject values over the limit.
2555 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2556 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2557
2558 @requireAttrs(socket, "CMSG_SPACE")
2559 def testCMSG_SPACE(self):
2560 # Test CMSG_SPACE() with various valid and invalid values,
2561 # checking the assumptions used by sendmsg().
2562 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2563 values = list(range(257)) + list(range(toobig - 257, toobig))
2564
2565 last = socket.CMSG_SPACE(0)
2566 # struct cmsghdr has at least three members, two of which are ints
2567 self.assertGreater(last, array.array("i").itemsize * 2)
2568 for n in values:
2569 ret = socket.CMSG_SPACE(n)
2570 self.assertGreaterEqual(ret, last)
2571 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2572 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2573 self.assertLessEqual(ret, self.socklen_t_limit)
2574 last = ret
2575
2576 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2577 # sendmsg() shares code with these functions, and requires
2578 # that it reject values over the limit.
2579 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2580 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2581
2582
2583class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2584 # Tests for file descriptor passing on Unix-domain sockets.
2585
2586 # Invalid file descriptor value that's unlikely to evaluate to a
2587 # real FD even if one of its bytes is replaced with a different
2588 # value (which shouldn't actually happen).
2589 badfd = -0x5555
2590
2591 def newFDs(self, n):
2592 # Return a list of n file descriptors for newly-created files
2593 # containing their list indices as ASCII numbers.
2594 fds = []
2595 for i in range(n):
2596 fd, path = tempfile.mkstemp()
2597 self.addCleanup(os.unlink, path)
2598 self.addCleanup(os.close, fd)
2599 os.write(fd, str(i).encode())
2600 fds.append(fd)
2601 return fds
2602
2603 def checkFDs(self, fds):
2604 # Check that the file descriptors in the given list contain
2605 # their correct list indices as ASCII numbers.
2606 for n, fd in enumerate(fds):
2607 os.lseek(fd, 0, os.SEEK_SET)
2608 self.assertEqual(os.read(fd, 1024), str(n).encode())
2609
2610 def registerRecvmsgResult(self, result):
2611 self.addCleanup(self.closeRecvmsgFDs, result)
2612
2613 def closeRecvmsgFDs(self, recvmsg_result):
2614 # Close all file descriptors specified in the ancillary data
2615 # of the given return value from recvmsg() or recvmsg_into().
2616 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2617 if (cmsg_level == socket.SOL_SOCKET and
2618 cmsg_type == socket.SCM_RIGHTS):
2619 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002620 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002621 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2622 for fd in fds:
2623 os.close(fd)
2624
2625 def createAndSendFDs(self, n):
2626 # Send n new file descriptors created by newFDs() to the
2627 # server, with the constant MSG as the non-ancillary data.
2628 self.assertEqual(
2629 self.sendmsgToServer([MSG],
2630 [(socket.SOL_SOCKET,
2631 socket.SCM_RIGHTS,
2632 array.array("i", self.newFDs(n)))]),
2633 len(MSG))
2634
2635 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2636 # Check that constant MSG was received with numfds file
2637 # descriptors in a maximum of maxcmsgs control messages (which
2638 # must contain only complete integers). By default, check
2639 # that MSG_CTRUNC is unset, but ignore any flags in
2640 # ignoreflags.
2641 msg, ancdata, flags, addr = result
2642 self.assertEqual(msg, MSG)
2643 self.checkRecvmsgAddress(addr, self.cli_addr)
2644 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2645 ignore=ignoreflags)
2646
2647 self.assertIsInstance(ancdata, list)
2648 self.assertLessEqual(len(ancdata), maxcmsgs)
2649 fds = array.array("i")
2650 for item in ancdata:
2651 self.assertIsInstance(item, tuple)
2652 cmsg_level, cmsg_type, cmsg_data = item
2653 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2654 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2655 self.assertIsInstance(cmsg_data, bytes)
2656 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002657 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002658
2659 self.assertEqual(len(fds), numfds)
2660 self.checkFDs(fds)
2661
2662 def testFDPassSimple(self):
2663 # Pass a single FD (array read from bytes object).
2664 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2665 len(MSG), 10240))
2666
2667 def _testFDPassSimple(self):
2668 self.assertEqual(
2669 self.sendmsgToServer(
2670 [MSG],
2671 [(socket.SOL_SOCKET,
2672 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002673 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002674 len(MSG))
2675
2676 def testMultipleFDPass(self):
2677 # Pass multiple FDs in a single array.
2678 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2679 len(MSG), 10240))
2680
2681 def _testMultipleFDPass(self):
2682 self.createAndSendFDs(4)
2683
2684 @requireAttrs(socket, "CMSG_SPACE")
2685 def testFDPassCMSG_SPACE(self):
2686 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2687 self.checkRecvmsgFDs(
2688 4, self.doRecvmsg(self.serv_sock, len(MSG),
2689 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2690
2691 @testFDPassCMSG_SPACE.client_skip
2692 def _testFDPassCMSG_SPACE(self):
2693 self.createAndSendFDs(4)
2694
2695 def testFDPassCMSG_LEN(self):
2696 # Test using CMSG_LEN() to calculate ancillary buffer size.
2697 self.checkRecvmsgFDs(1,
2698 self.doRecvmsg(self.serv_sock, len(MSG),
2699 socket.CMSG_LEN(4 * SIZEOF_INT)),
2700 # RFC 3542 says implementations may set
2701 # MSG_CTRUNC if there isn't enough space
2702 # for trailing padding.
2703 ignoreflags=socket.MSG_CTRUNC)
2704
2705 def _testFDPassCMSG_LEN(self):
2706 self.createAndSendFDs(1)
2707
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002708 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002709 @requireAttrs(socket, "CMSG_SPACE")
2710 def testFDPassSeparate(self):
2711 # Pass two FDs in two separate arrays. Arrays may be combined
2712 # into a single control message by the OS.
2713 self.checkRecvmsgFDs(2,
2714 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2715 maxcmsgs=2)
2716
2717 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002718 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002719 def _testFDPassSeparate(self):
2720 fd0, fd1 = self.newFDs(2)
2721 self.assertEqual(
2722 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2723 socket.SCM_RIGHTS,
2724 array.array("i", [fd0])),
2725 (socket.SOL_SOCKET,
2726 socket.SCM_RIGHTS,
2727 array.array("i", [fd1]))]),
2728 len(MSG))
2729
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002730 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002731 @requireAttrs(socket, "CMSG_SPACE")
2732 def testFDPassSeparateMinSpace(self):
2733 # Pass two FDs in two separate arrays, receiving them into the
2734 # minimum space for two arrays.
2735 self.checkRecvmsgFDs(2,
2736 self.doRecvmsg(self.serv_sock, len(MSG),
2737 socket.CMSG_SPACE(SIZEOF_INT) +
2738 socket.CMSG_LEN(SIZEOF_INT)),
2739 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2740
2741 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002742 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002743 def _testFDPassSeparateMinSpace(self):
2744 fd0, fd1 = self.newFDs(2)
2745 self.assertEqual(
2746 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2747 socket.SCM_RIGHTS,
2748 array.array("i", [fd0])),
2749 (socket.SOL_SOCKET,
2750 socket.SCM_RIGHTS,
2751 array.array("i", [fd1]))]),
2752 len(MSG))
2753
2754 def sendAncillaryIfPossible(self, msg, ancdata):
2755 # Try to send msg and ancdata to server, but if the system
2756 # call fails, just send msg with no ancillary data.
2757 try:
2758 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002759 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002760 # Check that it was the system call that failed
2761 self.assertIsInstance(e.errno, int)
2762 nbytes = self.sendmsgToServer([msg])
2763 self.assertEqual(nbytes, len(msg))
2764
2765 def testFDPassEmpty(self):
2766 # Try to pass an empty FD array. Can receive either no array
2767 # or an empty array.
2768 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2769 len(MSG), 10240),
2770 ignoreflags=socket.MSG_CTRUNC)
2771
2772 def _testFDPassEmpty(self):
2773 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2774 socket.SCM_RIGHTS,
2775 b"")])
2776
2777 def testFDPassPartialInt(self):
2778 # Try to pass a truncated FD array.
2779 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2780 len(MSG), 10240)
2781 self.assertEqual(msg, MSG)
2782 self.checkRecvmsgAddress(addr, self.cli_addr)
2783 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2784 self.assertLessEqual(len(ancdata), 1)
2785 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2786 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2787 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2788 self.assertLess(len(cmsg_data), SIZEOF_INT)
2789
2790 def _testFDPassPartialInt(self):
2791 self.sendAncillaryIfPossible(
2792 MSG,
2793 [(socket.SOL_SOCKET,
2794 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002795 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002796
2797 @requireAttrs(socket, "CMSG_SPACE")
2798 def testFDPassPartialIntInMiddle(self):
2799 # Try to pass two FD arrays, the first of which is truncated.
2800 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2801 len(MSG), 10240)
2802 self.assertEqual(msg, MSG)
2803 self.checkRecvmsgAddress(addr, self.cli_addr)
2804 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2805 self.assertLessEqual(len(ancdata), 2)
2806 fds = array.array("i")
2807 # Arrays may have been combined in a single control message
2808 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2809 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2810 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002811 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002812 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2813 self.assertLessEqual(len(fds), 2)
2814 self.checkFDs(fds)
2815
2816 @testFDPassPartialIntInMiddle.client_skip
2817 def _testFDPassPartialIntInMiddle(self):
2818 fd0, fd1 = self.newFDs(2)
2819 self.sendAncillaryIfPossible(
2820 MSG,
2821 [(socket.SOL_SOCKET,
2822 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002823 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002824 (socket.SOL_SOCKET,
2825 socket.SCM_RIGHTS,
2826 array.array("i", [fd1]))])
2827
2828 def checkTruncatedHeader(self, result, ignoreflags=0):
2829 # Check that no ancillary data items are returned when data is
2830 # truncated inside the cmsghdr structure.
2831 msg, ancdata, flags, addr = result
2832 self.assertEqual(msg, MSG)
2833 self.checkRecvmsgAddress(addr, self.cli_addr)
2834 self.assertEqual(ancdata, [])
2835 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2836 ignore=ignoreflags)
2837
2838 def testCmsgTruncNoBufSize(self):
2839 # Check that no ancillary data is received when no buffer size
2840 # is specified.
2841 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2842 # BSD seems to set MSG_CTRUNC only
2843 # if an item has been partially
2844 # received.
2845 ignoreflags=socket.MSG_CTRUNC)
2846
2847 def _testCmsgTruncNoBufSize(self):
2848 self.createAndSendFDs(1)
2849
2850 def testCmsgTrunc0(self):
2851 # Check that no ancillary data is received when buffer size is 0.
2852 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2853 ignoreflags=socket.MSG_CTRUNC)
2854
2855 def _testCmsgTrunc0(self):
2856 self.createAndSendFDs(1)
2857
2858 # Check that no ancillary data is returned for various non-zero
2859 # (but still too small) buffer sizes.
2860
2861 def testCmsgTrunc1(self):
2862 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2863
2864 def _testCmsgTrunc1(self):
2865 self.createAndSendFDs(1)
2866
2867 def testCmsgTrunc2Int(self):
2868 # The cmsghdr structure has at least three members, two of
2869 # which are ints, so we still shouldn't see any ancillary
2870 # data.
2871 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2872 SIZEOF_INT * 2))
2873
2874 def _testCmsgTrunc2Int(self):
2875 self.createAndSendFDs(1)
2876
2877 def testCmsgTruncLen0Minus1(self):
2878 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2879 socket.CMSG_LEN(0) - 1))
2880
2881 def _testCmsgTruncLen0Minus1(self):
2882 self.createAndSendFDs(1)
2883
2884 # The following tests try to truncate the control message in the
2885 # middle of the FD array.
2886
2887 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2888 # Check that file descriptor data is truncated to between
2889 # mindata and maxdata bytes when received with buffer size
2890 # ancbuf, and that any complete file descriptor numbers are
2891 # valid.
2892 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2893 len(MSG), ancbuf)
2894 self.assertEqual(msg, MSG)
2895 self.checkRecvmsgAddress(addr, self.cli_addr)
2896 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2897
2898 if mindata == 0 and ancdata == []:
2899 return
2900 self.assertEqual(len(ancdata), 1)
2901 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2902 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2903 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2904 self.assertGreaterEqual(len(cmsg_data), mindata)
2905 self.assertLessEqual(len(cmsg_data), maxdata)
2906 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002907 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002908 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2909 self.checkFDs(fds)
2910
2911 def testCmsgTruncLen0(self):
2912 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2913
2914 def _testCmsgTruncLen0(self):
2915 self.createAndSendFDs(1)
2916
2917 def testCmsgTruncLen0Plus1(self):
2918 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2919
2920 def _testCmsgTruncLen0Plus1(self):
2921 self.createAndSendFDs(2)
2922
2923 def testCmsgTruncLen1(self):
2924 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2925 maxdata=SIZEOF_INT)
2926
2927 def _testCmsgTruncLen1(self):
2928 self.createAndSendFDs(2)
2929
2930 def testCmsgTruncLen2Minus1(self):
2931 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2932 maxdata=(2 * SIZEOF_INT) - 1)
2933
2934 def _testCmsgTruncLen2Minus1(self):
2935 self.createAndSendFDs(2)
2936
2937
2938class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2939 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2940 # features of the RFC 3542 Advanced Sockets API for IPv6.
2941 # Currently we can only handle certain data items (e.g. traffic
2942 # class, hop limit, MTU discovery and fragmentation settings)
2943 # without resorting to unportable means such as the struct module,
2944 # but the tests here are aimed at testing the ancillary data
2945 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2946 # itself.
2947
2948 # Test value to use when setting hop limit of packet
2949 hop_limit = 2
2950
2951 # Test value to use when setting traffic class of packet.
2952 # -1 means "use kernel default".
2953 traffic_class = -1
2954
2955 def ancillaryMapping(self, ancdata):
2956 # Given ancillary data list ancdata, return a mapping from
2957 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2958 # Check that no (level, type) pair appears more than once.
2959 d = {}
2960 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2961 self.assertNotIn((cmsg_level, cmsg_type), d)
2962 d[(cmsg_level, cmsg_type)] = cmsg_data
2963 return d
2964
2965 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2966 # Receive hop limit into ancbufsize bytes of ancillary data
2967 # space. Check that data is MSG, ancillary data is not
2968 # truncated (but ignore any flags in ignoreflags), and hop
2969 # limit is between 0 and maxhop inclusive.
2970 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2971 socket.IPV6_RECVHOPLIMIT, 1)
2972 self.misc_event.set()
2973 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2974 len(MSG), ancbufsize)
2975
2976 self.assertEqual(msg, MSG)
2977 self.checkRecvmsgAddress(addr, self.cli_addr)
2978 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2979 ignore=ignoreflags)
2980
2981 self.assertEqual(len(ancdata), 1)
2982 self.assertIsInstance(ancdata[0], tuple)
2983 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2984 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2985 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2986 self.assertIsInstance(cmsg_data, bytes)
2987 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2988 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002989 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002990 self.assertGreaterEqual(a[0], 0)
2991 self.assertLessEqual(a[0], maxhop)
2992
2993 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2994 def testRecvHopLimit(self):
2995 # Test receiving the packet hop limit as ancillary data.
2996 self.checkHopLimit(ancbufsize=10240)
2997
2998 @testRecvHopLimit.client_skip
2999 def _testRecvHopLimit(self):
3000 # Need to wait until server has asked to receive ancillary
3001 # data, as implementations are not required to buffer it
3002 # otherwise.
3003 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3004 self.sendToServer(MSG)
3005
3006 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3007 def testRecvHopLimitCMSG_SPACE(self):
3008 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3009 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3010
3011 @testRecvHopLimitCMSG_SPACE.client_skip
3012 def _testRecvHopLimitCMSG_SPACE(self):
3013 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3014 self.sendToServer(MSG)
3015
3016 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3017 # 3542 says portable applications must provide space for trailing
3018 # padding. Implementations may set MSG_CTRUNC if there isn't
3019 # enough space for the padding.
3020
3021 @requireAttrs(socket.socket, "sendmsg")
3022 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3023 def testSetHopLimit(self):
3024 # Test setting hop limit on outgoing packet and receiving it
3025 # at the other end.
3026 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3027
3028 @testSetHopLimit.client_skip
3029 def _testSetHopLimit(self):
3030 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3031 self.assertEqual(
3032 self.sendmsgToServer([MSG],
3033 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3034 array.array("i", [self.hop_limit]))]),
3035 len(MSG))
3036
3037 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3038 ignoreflags=0):
3039 # Receive traffic class and hop limit into ancbufsize bytes of
3040 # ancillary data space. Check that data is MSG, ancillary
3041 # data is not truncated (but ignore any flags in ignoreflags),
3042 # and traffic class and hop limit are in range (hop limit no
3043 # more than maxhop).
3044 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3045 socket.IPV6_RECVHOPLIMIT, 1)
3046 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3047 socket.IPV6_RECVTCLASS, 1)
3048 self.misc_event.set()
3049 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3050 len(MSG), ancbufsize)
3051
3052 self.assertEqual(msg, MSG)
3053 self.checkRecvmsgAddress(addr, self.cli_addr)
3054 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3055 ignore=ignoreflags)
3056 self.assertEqual(len(ancdata), 2)
3057 ancmap = self.ancillaryMapping(ancdata)
3058
3059 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3060 self.assertEqual(len(tcdata), SIZEOF_INT)
3061 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003062 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003063 self.assertGreaterEqual(a[0], 0)
3064 self.assertLessEqual(a[0], 255)
3065
3066 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3067 self.assertEqual(len(hldata), SIZEOF_INT)
3068 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003069 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003070 self.assertGreaterEqual(a[0], 0)
3071 self.assertLessEqual(a[0], maxhop)
3072
3073 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3074 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3075 def testRecvTrafficClassAndHopLimit(self):
3076 # Test receiving traffic class and hop limit as ancillary data.
3077 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3078
3079 @testRecvTrafficClassAndHopLimit.client_skip
3080 def _testRecvTrafficClassAndHopLimit(self):
3081 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3082 self.sendToServer(MSG)
3083
3084 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3085 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3086 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3087 # Test receiving traffic class and hop limit, using
3088 # CMSG_SPACE() to calculate buffer size.
3089 self.checkTrafficClassAndHopLimit(
3090 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3091
3092 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3093 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3094 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3095 self.sendToServer(MSG)
3096
3097 @requireAttrs(socket.socket, "sendmsg")
3098 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3099 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3100 def testSetTrafficClassAndHopLimit(self):
3101 # Test setting traffic class and hop limit on outgoing packet,
3102 # and receiving them at the other end.
3103 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3104 maxhop=self.hop_limit)
3105
3106 @testSetTrafficClassAndHopLimit.client_skip
3107 def _testSetTrafficClassAndHopLimit(self):
3108 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3109 self.assertEqual(
3110 self.sendmsgToServer([MSG],
3111 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3112 array.array("i", [self.traffic_class])),
3113 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3114 array.array("i", [self.hop_limit]))]),
3115 len(MSG))
3116
3117 @requireAttrs(socket.socket, "sendmsg")
3118 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3119 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3120 def testOddCmsgSize(self):
3121 # Try to send ancillary data with first item one byte too
3122 # long. Fall back to sending with correct size if this fails,
3123 # and check that second item was handled correctly.
3124 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3125 maxhop=self.hop_limit)
3126
3127 @testOddCmsgSize.client_skip
3128 def _testOddCmsgSize(self):
3129 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3130 try:
3131 nbytes = self.sendmsgToServer(
3132 [MSG],
3133 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003134 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003135 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3136 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003137 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003138 self.assertIsInstance(e.errno, int)
3139 nbytes = self.sendmsgToServer(
3140 [MSG],
3141 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3142 array.array("i", [self.traffic_class])),
3143 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3144 array.array("i", [self.hop_limit]))])
3145 self.assertEqual(nbytes, len(MSG))
3146
3147 # Tests for proper handling of truncated ancillary data
3148
3149 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3150 # Receive hop limit into ancbufsize bytes of ancillary data
3151 # space, which should be too small to contain the ancillary
3152 # data header (if ancbufsize is None, pass no second argument
3153 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3154 # (unless included in ignoreflags), and no ancillary data is
3155 # returned.
3156 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3157 socket.IPV6_RECVHOPLIMIT, 1)
3158 self.misc_event.set()
3159 args = () if ancbufsize is None else (ancbufsize,)
3160 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3161 len(MSG), *args)
3162
3163 self.assertEqual(msg, MSG)
3164 self.checkRecvmsgAddress(addr, self.cli_addr)
3165 self.assertEqual(ancdata, [])
3166 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3167 ignore=ignoreflags)
3168
3169 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3170 def testCmsgTruncNoBufSize(self):
3171 # Check that no ancillary data is received when no ancillary
3172 # buffer size is provided.
3173 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3174 # BSD seems to set
3175 # MSG_CTRUNC only if an item
3176 # has been partially
3177 # received.
3178 ignoreflags=socket.MSG_CTRUNC)
3179
3180 @testCmsgTruncNoBufSize.client_skip
3181 def _testCmsgTruncNoBufSize(self):
3182 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3183 self.sendToServer(MSG)
3184
3185 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3186 def testSingleCmsgTrunc0(self):
3187 # Check that no ancillary data is received when ancillary
3188 # buffer size is zero.
3189 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3190 ignoreflags=socket.MSG_CTRUNC)
3191
3192 @testSingleCmsgTrunc0.client_skip
3193 def _testSingleCmsgTrunc0(self):
3194 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3195 self.sendToServer(MSG)
3196
3197 # Check that no ancillary data is returned for various non-zero
3198 # (but still too small) buffer sizes.
3199
3200 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3201 def testSingleCmsgTrunc1(self):
3202 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3203
3204 @testSingleCmsgTrunc1.client_skip
3205 def _testSingleCmsgTrunc1(self):
3206 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3207 self.sendToServer(MSG)
3208
3209 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3210 def testSingleCmsgTrunc2Int(self):
3211 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3212
3213 @testSingleCmsgTrunc2Int.client_skip
3214 def _testSingleCmsgTrunc2Int(self):
3215 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3216 self.sendToServer(MSG)
3217
3218 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3219 def testSingleCmsgTruncLen0Minus1(self):
3220 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3221
3222 @testSingleCmsgTruncLen0Minus1.client_skip
3223 def _testSingleCmsgTruncLen0Minus1(self):
3224 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3225 self.sendToServer(MSG)
3226
3227 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3228 def testSingleCmsgTruncInData(self):
3229 # Test truncation of a control message inside its associated
3230 # data. The message may be returned with its data truncated,
3231 # or not returned at all.
3232 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3233 socket.IPV6_RECVHOPLIMIT, 1)
3234 self.misc_event.set()
3235 msg, ancdata, flags, addr = self.doRecvmsg(
3236 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3237
3238 self.assertEqual(msg, MSG)
3239 self.checkRecvmsgAddress(addr, self.cli_addr)
3240 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3241
3242 self.assertLessEqual(len(ancdata), 1)
3243 if ancdata:
3244 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3245 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3246 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3247 self.assertLess(len(cmsg_data), SIZEOF_INT)
3248
3249 @testSingleCmsgTruncInData.client_skip
3250 def _testSingleCmsgTruncInData(self):
3251 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3252 self.sendToServer(MSG)
3253
3254 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3255 # Receive traffic class and hop limit into ancbufsize bytes of
3256 # ancillary data space, which should be large enough to
3257 # contain the first item, but too small to contain the header
3258 # of the second. Check that data is MSG, MSG_CTRUNC is set
3259 # (unless included in ignoreflags), and only one ancillary
3260 # data item is returned.
3261 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3262 socket.IPV6_RECVHOPLIMIT, 1)
3263 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3264 socket.IPV6_RECVTCLASS, 1)
3265 self.misc_event.set()
3266 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3267 len(MSG), ancbufsize)
3268
3269 self.assertEqual(msg, MSG)
3270 self.checkRecvmsgAddress(addr, self.cli_addr)
3271 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3272 ignore=ignoreflags)
3273
3274 self.assertEqual(len(ancdata), 1)
3275 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3276 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3277 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3278 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3279 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003280 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003281 self.assertGreaterEqual(a[0], 0)
3282 self.assertLessEqual(a[0], 255)
3283
3284 # Try the above test with various buffer sizes.
3285
3286 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3287 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3288 def testSecondCmsgTrunc0(self):
3289 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3290 ignoreflags=socket.MSG_CTRUNC)
3291
3292 @testSecondCmsgTrunc0.client_skip
3293 def _testSecondCmsgTrunc0(self):
3294 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3295 self.sendToServer(MSG)
3296
3297 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3298 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3299 def testSecondCmsgTrunc1(self):
3300 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3301
3302 @testSecondCmsgTrunc1.client_skip
3303 def _testSecondCmsgTrunc1(self):
3304 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3305 self.sendToServer(MSG)
3306
3307 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3308 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3309 def testSecondCmsgTrunc2Int(self):
3310 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3311 2 * SIZEOF_INT)
3312
3313 @testSecondCmsgTrunc2Int.client_skip
3314 def _testSecondCmsgTrunc2Int(self):
3315 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3316 self.sendToServer(MSG)
3317
3318 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3319 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3320 def testSecondCmsgTruncLen0Minus1(self):
3321 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3322 socket.CMSG_LEN(0) - 1)
3323
3324 @testSecondCmsgTruncLen0Minus1.client_skip
3325 def _testSecondCmsgTruncLen0Minus1(self):
3326 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3327 self.sendToServer(MSG)
3328
3329 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3330 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3331 def testSecomdCmsgTruncInData(self):
3332 # Test truncation of the second of two control messages inside
3333 # its associated data.
3334 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3335 socket.IPV6_RECVHOPLIMIT, 1)
3336 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3337 socket.IPV6_RECVTCLASS, 1)
3338 self.misc_event.set()
3339 msg, ancdata, flags, addr = self.doRecvmsg(
3340 self.serv_sock, len(MSG),
3341 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3342
3343 self.assertEqual(msg, MSG)
3344 self.checkRecvmsgAddress(addr, self.cli_addr)
3345 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3346
3347 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3348
3349 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3350 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3351 cmsg_types.remove(cmsg_type)
3352 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3353 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003354 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003355 self.assertGreaterEqual(a[0], 0)
3356 self.assertLessEqual(a[0], 255)
3357
3358 if ancdata:
3359 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3360 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3361 cmsg_types.remove(cmsg_type)
3362 self.assertLess(len(cmsg_data), SIZEOF_INT)
3363
3364 self.assertEqual(ancdata, [])
3365
3366 @testSecomdCmsgTruncInData.client_skip
3367 def _testSecomdCmsgTruncInData(self):
3368 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3369 self.sendToServer(MSG)
3370
3371
3372# Derive concrete test classes for different socket types.
3373
3374class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3375 SendrecvmsgConnectionlessBase,
3376 ThreadedSocketTestMixin, UDPTestBase):
3377 pass
3378
3379@requireAttrs(socket.socket, "sendmsg")
3380@unittest.skipUnless(thread, 'Threading required for this test.')
3381class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3382 pass
3383
3384@requireAttrs(socket.socket, "recvmsg")
3385@unittest.skipUnless(thread, 'Threading required for this test.')
3386class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3387 pass
3388
3389@requireAttrs(socket.socket, "recvmsg_into")
3390@unittest.skipUnless(thread, 'Threading required for this test.')
3391class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3392 pass
3393
3394
3395class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3396 SendrecvmsgConnectionlessBase,
3397 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003398
3399 def checkRecvmsgAddress(self, addr1, addr2):
3400 # Called to compare the received address with the address of
3401 # the peer, ignoring scope ID
3402 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003403
3404@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003405@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003406@requireSocket("AF_INET6", "SOCK_DGRAM")
3407@unittest.skipUnless(thread, 'Threading required for this test.')
3408class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3409 pass
3410
3411@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003412@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003413@requireSocket("AF_INET6", "SOCK_DGRAM")
3414@unittest.skipUnless(thread, 'Threading required for this test.')
3415class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3416 pass
3417
3418@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003419@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003420@requireSocket("AF_INET6", "SOCK_DGRAM")
3421@unittest.skipUnless(thread, 'Threading required for this test.')
3422class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3423 pass
3424
3425@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003426@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003427@requireAttrs(socket, "IPPROTO_IPV6")
3428@requireSocket("AF_INET6", "SOCK_DGRAM")
3429@unittest.skipUnless(thread, 'Threading required for this test.')
3430class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3431 SendrecvmsgUDP6TestBase):
3432 pass
3433
3434@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003435@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003436@requireAttrs(socket, "IPPROTO_IPV6")
3437@requireSocket("AF_INET6", "SOCK_DGRAM")
3438@unittest.skipUnless(thread, 'Threading required for this test.')
3439class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3440 RFC3542AncillaryTest,
3441 SendrecvmsgUDP6TestBase):
3442 pass
3443
3444
3445class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3446 ConnectedStreamTestMixin, TCPTestBase):
3447 pass
3448
3449@requireAttrs(socket.socket, "sendmsg")
3450@unittest.skipUnless(thread, 'Threading required for this test.')
3451class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3452 pass
3453
3454@requireAttrs(socket.socket, "recvmsg")
3455@unittest.skipUnless(thread, 'Threading required for this test.')
3456class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3457 SendrecvmsgTCPTestBase):
3458 pass
3459
3460@requireAttrs(socket.socket, "recvmsg_into")
3461@unittest.skipUnless(thread, 'Threading required for this test.')
3462class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3463 SendrecvmsgTCPTestBase):
3464 pass
3465
3466
3467class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3468 SendrecvmsgConnectedBase,
3469 ConnectedStreamTestMixin, SCTPStreamBase):
3470 pass
3471
3472@requireAttrs(socket.socket, "sendmsg")
3473@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3474@unittest.skipUnless(thread, 'Threading required for this test.')
3475class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3476 pass
3477
3478@requireAttrs(socket.socket, "recvmsg")
3479@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3480@unittest.skipUnless(thread, 'Threading required for this test.')
3481class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3482 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003483
3484 def testRecvmsgEOF(self):
3485 try:
3486 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3487 except OSError as e:
3488 if e.errno != errno.ENOTCONN:
3489 raise
3490 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003491
3492@requireAttrs(socket.socket, "recvmsg_into")
3493@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3494@unittest.skipUnless(thread, 'Threading required for this test.')
3495class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3496 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003497
3498 def testRecvmsgEOF(self):
3499 try:
3500 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3501 except OSError as e:
3502 if e.errno != errno.ENOTCONN:
3503 raise
3504 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003505
3506
3507class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3508 ConnectedStreamTestMixin, UnixStreamBase):
3509 pass
3510
3511@requireAttrs(socket.socket, "sendmsg")
3512@requireAttrs(socket, "AF_UNIX")
3513@unittest.skipUnless(thread, 'Threading required for this test.')
3514class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3515 pass
3516
3517@requireAttrs(socket.socket, "recvmsg")
3518@requireAttrs(socket, "AF_UNIX")
3519@unittest.skipUnless(thread, 'Threading required for this test.')
3520class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3521 SendrecvmsgUnixStreamTestBase):
3522 pass
3523
3524@requireAttrs(socket.socket, "recvmsg_into")
3525@requireAttrs(socket, "AF_UNIX")
3526@unittest.skipUnless(thread, 'Threading required for this test.')
3527class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3528 SendrecvmsgUnixStreamTestBase):
3529 pass
3530
3531@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3532@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3533@unittest.skipUnless(thread, 'Threading required for this test.')
3534class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3535 pass
3536
3537@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3538@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3539@unittest.skipUnless(thread, 'Threading required for this test.')
3540class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3541 SendrecvmsgUnixStreamTestBase):
3542 pass
3543
3544
3545# Test interrupting the interruptible send/receive methods with a
3546# signal when a timeout is set. These tests avoid having multiple
3547# threads alive during the test so that the OS cannot deliver the
3548# signal to the wrong one.
3549
3550class InterruptedTimeoutBase(unittest.TestCase):
3551 # Base class for interrupted send/receive tests. Installs an
3552 # empty handler for SIGALRM and removes it on teardown, along with
3553 # any scheduled alarms.
3554
3555 def setUp(self):
3556 super().setUp()
3557 orig_alrm_handler = signal.signal(signal.SIGALRM,
3558 lambda signum, frame: None)
3559 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3560 self.addCleanup(self.setAlarm, 0)
3561
3562 # Timeout for socket operations
3563 timeout = 4.0
3564
3565 # Provide setAlarm() method to schedule delivery of SIGALRM after
3566 # given number of seconds, or cancel it if zero, and an
3567 # appropriate time value to use. Use setitimer() if available.
3568 if hasattr(signal, "setitimer"):
3569 alarm_time = 0.05
3570
3571 def setAlarm(self, seconds):
3572 signal.setitimer(signal.ITIMER_REAL, seconds)
3573 else:
3574 # Old systems may deliver the alarm up to one second early
3575 alarm_time = 2
3576
3577 def setAlarm(self, seconds):
3578 signal.alarm(seconds)
3579
3580
3581# Require siginterrupt() in order to ensure that system calls are
3582# interrupted by default.
3583@requireAttrs(signal, "siginterrupt")
3584@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3585 "Don't have signal.alarm or signal.setitimer")
3586class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3587 # Test interrupting the recv*() methods with signals when a
3588 # timeout is set.
3589
3590 def setUp(self):
3591 super().setUp()
3592 self.serv.settimeout(self.timeout)
3593
3594 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003595 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003596 # errno of EINTR when interrupted by a signal.
3597 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003598 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003599 func(*args, **kwargs)
3600 self.assertNotIsInstance(cm.exception, socket.timeout)
3601 self.assertEqual(cm.exception.errno, errno.EINTR)
3602
3603 def testInterruptedRecvTimeout(self):
3604 self.checkInterruptedRecv(self.serv.recv, 1024)
3605
3606 def testInterruptedRecvIntoTimeout(self):
3607 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3608
3609 def testInterruptedRecvfromTimeout(self):
3610 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3611
3612 def testInterruptedRecvfromIntoTimeout(self):
3613 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3614
3615 @requireAttrs(socket.socket, "recvmsg")
3616 def testInterruptedRecvmsgTimeout(self):
3617 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3618
3619 @requireAttrs(socket.socket, "recvmsg_into")
3620 def testInterruptedRecvmsgIntoTimeout(self):
3621 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3622
3623
3624# Require siginterrupt() in order to ensure that system calls are
3625# interrupted by default.
3626@requireAttrs(signal, "siginterrupt")
3627@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3628 "Don't have signal.alarm or signal.setitimer")
3629@unittest.skipUnless(thread, 'Threading required for this test.')
3630class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3631 ThreadSafeCleanupTestCase,
3632 SocketListeningTestMixin, TCPTestBase):
3633 # Test interrupting the interruptible send*() methods with signals
3634 # when a timeout is set.
3635
3636 def setUp(self):
3637 super().setUp()
3638 self.serv_conn = self.newSocket()
3639 self.addCleanup(self.serv_conn.close)
3640 # Use a thread to complete the connection, but wait for it to
3641 # terminate before running the test, so that there is only one
3642 # thread to accept the signal.
3643 cli_thread = threading.Thread(target=self.doConnect)
3644 cli_thread.start()
3645 self.cli_conn, addr = self.serv.accept()
3646 self.addCleanup(self.cli_conn.close)
3647 cli_thread.join()
3648 self.serv_conn.settimeout(self.timeout)
3649
3650 def doConnect(self):
3651 self.serv_conn.connect(self.serv_addr)
3652
3653 def checkInterruptedSend(self, func, *args, **kwargs):
3654 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003655 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003656 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003657 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003658 while True:
3659 self.setAlarm(self.alarm_time)
3660 func(*args, **kwargs)
3661 self.assertNotIsInstance(cm.exception, socket.timeout)
3662 self.assertEqual(cm.exception.errno, errno.EINTR)
3663
Ned Deilyc5640382014-02-03 13:58:31 -08003664 # Issue #12958: The following tests have problems on OS X prior to 10.7
3665 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003666 def testInterruptedSendTimeout(self):
3667 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3668
Ned Deilyc5640382014-02-03 13:58:31 -08003669 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003670 def testInterruptedSendtoTimeout(self):
3671 # Passing an actual address here as Python's wrapper for
3672 # sendto() doesn't allow passing a zero-length one; POSIX
3673 # requires that the address is ignored since the socket is
3674 # connection-mode, however.
3675 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3676 self.serv_addr)
3677
Ned Deilyc5640382014-02-03 13:58:31 -08003678 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003679 @requireAttrs(socket.socket, "sendmsg")
3680 def testInterruptedSendmsgTimeout(self):
3681 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3682
3683
Victor Stinner45df8202010-04-28 22:31:17 +00003684@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003685class TCPCloserTest(ThreadedTCPSocketTest):
3686
3687 def testClose(self):
3688 conn, addr = self.serv.accept()
3689 conn.close()
3690
3691 sd = self.cli
3692 read, write, err = select.select([sd], [], [], 1.0)
3693 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003694 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003695
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003696 # Calling close() many times should be safe.
3697 conn.close()
3698 conn.close()
3699
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003700 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003701 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003702 time.sleep(1.0)
3703
Serhiy Storchaka43767632013-11-03 21:31:38 +02003704@unittest.skipUnless(hasattr(socket, 'socketpair'),
3705 'test needs socket.socketpair()')
Victor Stinner45df8202010-04-28 22:31:17 +00003706@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003707class BasicSocketPairTest(SocketPairTest):
3708
3709 def __init__(self, methodName='runTest'):
3710 SocketPairTest.__init__(self, methodName=methodName)
3711
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003712 def _check_defaults(self, sock):
3713 self.assertIsInstance(sock, socket.socket)
3714 if hasattr(socket, 'AF_UNIX'):
3715 self.assertEqual(sock.family, socket.AF_UNIX)
3716 else:
3717 self.assertEqual(sock.family, socket.AF_INET)
3718 self.assertEqual(sock.type, socket.SOCK_STREAM)
3719 self.assertEqual(sock.proto, 0)
3720
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003721 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003722 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003723
3724 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003725 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003726
Dave Cole331708b2004-08-09 04:51:41 +00003727 def testRecv(self):
3728 msg = self.serv.recv(1024)
3729 self.assertEqual(msg, MSG)
3730
3731 def _testRecv(self):
3732 self.cli.send(MSG)
3733
3734 def testSend(self):
3735 self.serv.send(MSG)
3736
3737 def _testSend(self):
3738 msg = self.cli.recv(1024)
3739 self.assertEqual(msg, MSG)
3740
Victor Stinner45df8202010-04-28 22:31:17 +00003741@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003742class NonBlockingTCPTests(ThreadedTCPSocketTest):
3743
3744 def __init__(self, methodName='runTest'):
3745 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3746
3747 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003748 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003749 self.serv.setblocking(True)
3750 self.assertIsNone(self.serv.gettimeout())
3751 self.serv.setblocking(False)
3752 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003753 start = time.time()
3754 try:
3755 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003756 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003757 pass
3758 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003759 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003760
3761 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003762 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003763
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003764 @support.cpython_only
3765 def testSetBlocking_overflow(self):
3766 # Issue 15989
3767 import _testcapi
3768 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3769 self.skipTest('needs UINT_MAX < ULONG_MAX')
3770 self.serv.setblocking(False)
3771 self.assertEqual(self.serv.gettimeout(), 0.0)
3772 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3773 self.assertIsNone(self.serv.gettimeout())
3774
3775 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3776
Serhiy Storchaka43767632013-11-03 21:31:38 +02003777 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3778 'test needs socket.SOCK_NONBLOCK')
3779 @support.requires_linux_version(2, 6, 28)
3780 def testInitNonBlocking(self):
3781 # reinit server socket
3782 self.serv.close()
3783 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3784 socket.SOCK_NONBLOCK)
3785 self.port = support.bind_port(self.serv)
3786 self.serv.listen(1)
3787 # actual testing
3788 start = time.time()
3789 try:
3790 self.serv.accept()
3791 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003792 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003793 end = time.time()
3794 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3795
3796 def _testInitNonBlocking(self):
3797 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003798
Antoine Pitrou600232b2011-01-05 21:03:42 +00003799 def testInheritFlags(self):
3800 # Issue #7995: when calling accept() on a listening socket with a
3801 # timeout, the resulting socket should not be non-blocking.
3802 self.serv.settimeout(10)
3803 try:
3804 conn, addr = self.serv.accept()
3805 message = conn.recv(len(MSG))
3806 finally:
3807 conn.close()
3808 self.serv.settimeout(None)
3809
3810 def _testInheritFlags(self):
3811 time.sleep(0.1)
3812 self.cli.connect((HOST, self.port))
3813 time.sleep(0.5)
3814 self.cli.send(MSG)
3815
Guido van Rossum24e4af82002-06-12 19:18:08 +00003816 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003817 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003818 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003819 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003820 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003821 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003822 pass
3823 else:
3824 self.fail("Error trying to do non-blocking accept.")
3825 read, write, err = select.select([self.serv], [], [])
3826 if self.serv in read:
3827 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003828 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003829 else:
3830 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003831
Guido van Rossum24e4af82002-06-12 19:18:08 +00003832 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003833 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003834 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003835
3836 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003837 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003838 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003839 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003840
3841 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003842 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003843 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003844
3845 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003846 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003847 conn, addr = self.serv.accept()
3848 conn.setblocking(0)
3849 try:
3850 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003851 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003852 pass
3853 else:
3854 self.fail("Error trying to do non-blocking recv.")
3855 read, write, err = select.select([conn], [], [])
3856 if conn in read:
3857 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003858 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003859 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003860 else:
3861 self.fail("Error during select call to non-blocking socket.")
3862
3863 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003864 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003865 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003866 self.cli.send(MSG)
3867
Victor Stinner45df8202010-04-28 22:31:17 +00003868@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003869class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003870 """Unit tests for the object returned by socket.makefile()
3871
Antoine Pitrou834bd812010-10-13 16:17:14 +00003872 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003873 the client connection. You can read from this file to
3874 get output from the server.
3875
Antoine Pitrou834bd812010-10-13 16:17:14 +00003876 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003877 server connection. You can write to this file to send output
3878 to the client.
3879 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003880
Guido van Rossume9f66142002-08-07 15:46:19 +00003881 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003882 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003883 errors = 'strict'
3884 newline = None
3885
3886 read_mode = 'rb'
3887 read_msg = MSG
3888 write_mode = 'wb'
3889 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003890
Guido van Rossum24e4af82002-06-12 19:18:08 +00003891 def __init__(self, methodName='runTest'):
3892 SocketConnectedTest.__init__(self, methodName=methodName)
3893
3894 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003895 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3896 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003897 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003898 self.read_file = self.cli_conn.makefile(
3899 self.read_mode, self.bufsize,
3900 encoding = self.encoding,
3901 errors = self.errors,
3902 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003903
3904 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003905 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003906 self.read_file.close()
3907 self.assertTrue(self.read_file.closed)
3908 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003909 SocketConnectedTest.tearDown(self)
3910
3911 def clientSetUp(self):
3912 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003913 self.write_file = self.serv_conn.makefile(
3914 self.write_mode, self.bufsize,
3915 encoding = self.encoding,
3916 errors = self.errors,
3917 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003918
3919 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003920 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003921 self.write_file.close()
3922 self.assertTrue(self.write_file.closed)
3923 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003924 SocketConnectedTest.clientTearDown(self)
3925
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003926 def testReadAfterTimeout(self):
3927 # Issue #7322: A file object must disallow further reads
3928 # after a timeout has occurred.
3929 self.cli_conn.settimeout(1)
3930 self.read_file.read(3)
3931 # First read raises a timeout
3932 self.assertRaises(socket.timeout, self.read_file.read, 1)
3933 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003934 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003935 self.read_file.read(1)
3936 self.assertIn("cannot read from timed out object", str(ctx.exception))
3937
3938 def _testReadAfterTimeout(self):
3939 self.write_file.write(self.write_msg[0:3])
3940 self.write_file.flush()
3941 self.serv_finished.wait()
3942
Guido van Rossum24e4af82002-06-12 19:18:08 +00003943 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003944 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003945 first_seg = self.read_file.read(len(self.read_msg)-3)
3946 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003947 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003948 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003949
3950 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003951 self.write_file.write(self.write_msg)
3952 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003953
Guido van Rossum8c943832002-08-08 01:00:28 +00003954 def testFullRead(self):
3955 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003956 msg = self.read_file.read()
3957 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003958
3959 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003960 self.write_file.write(self.write_msg)
3961 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003962
Guido van Rossum24e4af82002-06-12 19:18:08 +00003963 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003964 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003965 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003966 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003967 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003968 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003969 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003970 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003971 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003972
3973 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003974 self.write_file.write(self.write_msg)
3975 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003976
3977 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003978 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003979 line = self.read_file.readline()
3980 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003981
3982 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003983 self.write_file.write(self.write_msg)
3984 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003985
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003986 def testCloseAfterMakefile(self):
3987 # The file returned by makefile should keep the socket open.
3988 self.cli_conn.close()
3989 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003990 msg = self.read_file.read()
3991 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003992
3993 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003994 self.write_file.write(self.write_msg)
3995 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003996
3997 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003998 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003999 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004000 if isinstance(self.read_msg, str):
4001 msg = msg.decode()
4002 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004003
4004 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004005 self.write_file.write(self.write_msg)
4006 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004007
Tim Peters116d83c2004-03-28 02:20:45 +00004008 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004009 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004010
4011 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004012 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004013
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004014 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004015 self.assertEqual(self.read_file.mode, self.read_mode)
4016 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004017
4018 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004019 self.assertEqual(self.write_file.mode, self.write_mode)
4020 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004021
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004022 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004023 self.read_file.close()
4024 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004025 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004026 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004027
4028 def _testRealClose(self):
4029 pass
4030
4031
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004032class FileObjectInterruptedTestCase(unittest.TestCase):
4033 """Test that the file object correctly handles EINTR internally."""
4034
4035 class MockSocket(object):
4036 def __init__(self, recv_funcs=()):
4037 # A generator that returns callables that we'll call for each
4038 # call to recv().
4039 self._recv_step = iter(recv_funcs)
4040
4041 def recv_into(self, buffer):
4042 data = next(self._recv_step)()
4043 assert len(buffer) >= len(data)
4044 buffer[:len(data)] = data
4045 return len(data)
4046
4047 def _decref_socketios(self):
4048 pass
4049
4050 def _textiowrap_for_test(self, buffering=-1):
4051 raw = socket.SocketIO(self, "r")
4052 if buffering < 0:
4053 buffering = io.DEFAULT_BUFFER_SIZE
4054 if buffering == 0:
4055 return raw
4056 buffer = io.BufferedReader(raw, buffering)
4057 text = io.TextIOWrapper(buffer, None, None)
4058 text.mode = "rb"
4059 return text
4060
4061 @staticmethod
4062 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02004063 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004064
4065 def _textiowrap_mock_socket(self, mock, buffering=-1):
4066 raw = socket.SocketIO(mock, "r")
4067 if buffering < 0:
4068 buffering = io.DEFAULT_BUFFER_SIZE
4069 if buffering == 0:
4070 return raw
4071 buffer = io.BufferedReader(raw, buffering)
4072 text = io.TextIOWrapper(buffer, None, None)
4073 text.mode = "rb"
4074 return text
4075
4076 def _test_readline(self, size=-1, buffering=-1):
4077 mock_sock = self.MockSocket(recv_funcs=[
4078 lambda : b"This is the first line\nAnd the sec",
4079 self._raise_eintr,
4080 lambda : b"ond line is here\n",
4081 lambda : b"",
4082 lambda : b"", # XXX(gps): io library does an extra EOF read
4083 ])
4084 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004085 self.assertEqual(fo.readline(size), "This is the first line\n")
4086 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004087
4088 def _test_read(self, size=-1, buffering=-1):
4089 mock_sock = self.MockSocket(recv_funcs=[
4090 lambda : b"This is the first line\nAnd the sec",
4091 self._raise_eintr,
4092 lambda : b"ond line is here\n",
4093 lambda : b"",
4094 lambda : b"", # XXX(gps): io library does an extra EOF read
4095 ])
4096 expecting = (b"This is the first line\n"
4097 b"And the second line is here\n")
4098 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4099 if buffering == 0:
4100 data = b''
4101 else:
4102 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004103 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004104 while len(data) != len(expecting):
4105 part = fo.read(size)
4106 if not part:
4107 break
4108 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004109 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004110
4111 def test_default(self):
4112 self._test_readline()
4113 self._test_readline(size=100)
4114 self._test_read()
4115 self._test_read(size=100)
4116
4117 def test_with_1k_buffer(self):
4118 self._test_readline(buffering=1024)
4119 self._test_readline(size=100, buffering=1024)
4120 self._test_read(buffering=1024)
4121 self._test_read(size=100, buffering=1024)
4122
4123 def _test_readline_no_buffer(self, size=-1):
4124 mock_sock = self.MockSocket(recv_funcs=[
4125 lambda : b"a",
4126 lambda : b"\n",
4127 lambda : b"B",
4128 self._raise_eintr,
4129 lambda : b"b",
4130 lambda : b"",
4131 ])
4132 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004133 self.assertEqual(fo.readline(size), b"a\n")
4134 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004135
4136 def test_no_buffer(self):
4137 self._test_readline_no_buffer()
4138 self._test_readline_no_buffer(size=4)
4139 self._test_read(buffering=0)
4140 self._test_read(size=100, buffering=0)
4141
4142
Guido van Rossume9f66142002-08-07 15:46:19 +00004143class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4144
4145 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004146
Guido van Rossume9f66142002-08-07 15:46:19 +00004147 In this case (and in this case only), it should be possible to
4148 create a file object, read a line from it, create another file
4149 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004150 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004151 when reading multiple requests from the same socket."""
4152
4153 bufsize = 0 # Use unbuffered mode
4154
4155 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004156 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004157 line = self.read_file.readline() # first line
4158 self.assertEqual(line, b"A. " + self.write_msg) # first line
4159 self.read_file = self.cli_conn.makefile('rb', 0)
4160 line = self.read_file.readline() # second line
4161 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004162
4163 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004164 self.write_file.write(b"A. " + self.write_msg)
4165 self.write_file.write(b"B. " + self.write_msg)
4166 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004167
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004168 def testMakefileClose(self):
4169 # The file returned by makefile should keep the socket open...
4170 self.cli_conn.close()
4171 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004172 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004173 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004174 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004175 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004176
4177 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004178 self.write_file.write(self.write_msg)
4179 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004180
4181 def testMakefileCloseSocketDestroy(self):
4182 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004183 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004184 refcount_after = sys.getrefcount(self.cli_conn)
4185 self.assertEqual(refcount_before - 1, refcount_after)
4186
4187 def _testMakefileCloseSocketDestroy(self):
4188 pass
4189
Antoine Pitrou98b46702010-09-18 22:59:00 +00004190 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004191 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004192 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4193
4194 def testSmallReadNonBlocking(self):
4195 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004196 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4197 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004198 self.evt1.set()
4199 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004200 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004201 if first_seg is None:
4202 # Data not arrived (can happen under Windows), wait a bit
4203 time.sleep(0.5)
4204 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004205 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004206 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004207 self.assertEqual(n, 3)
4208 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004209 self.assertEqual(msg, self.read_msg)
4210 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4211 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004212
4213 def _testSmallReadNonBlocking(self):
4214 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004215 self.write_file.write(self.write_msg)
4216 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004217 self.evt2.set()
4218 # Avoid cloding the socket before the server test has finished,
4219 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4220 self.serv_finished.wait(5.0)
4221
4222 def testWriteNonBlocking(self):
4223 self.cli_finished.wait(5.0)
4224 # The client thread can't skip directly - the SkipTest exception
4225 # would appear as a failure.
4226 if self.serv_skipped:
4227 self.skipTest(self.serv_skipped)
4228
4229 def _testWriteNonBlocking(self):
4230 self.serv_skipped = None
4231 self.serv_conn.setblocking(False)
4232 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004233 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004234 LIMIT = 10
4235 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004236 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004237 self.assertGreater(n, 0)
4238 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004239 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004240 if n is None:
4241 # Succeeded
4242 break
4243 self.assertGreater(n, 0)
4244 else:
4245 # Let us know that this test didn't manage to establish
4246 # the expected conditions. This is not a failure in itself but,
4247 # if it happens repeatedly, the test should be fixed.
4248 self.serv_skipped = "failed to saturate the socket buffer"
4249
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004250
Guido van Rossum8c943832002-08-08 01:00:28 +00004251class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4252
4253 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4254
4255
4256class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4257
4258 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004259
Thomas Woutersb2137042007-02-01 18:02:27 +00004260
Antoine Pitrou834bd812010-10-13 16:17:14 +00004261class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4262 """Tests for socket.makefile() in text mode (rather than binary)"""
4263
4264 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004265 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004266 write_mode = 'wb'
4267 write_msg = MSG
4268 newline = ''
4269
4270
4271class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4272 """Tests for socket.makefile() in text mode (rather than binary)"""
4273
4274 read_mode = 'rb'
4275 read_msg = MSG
4276 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004277 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004278 newline = ''
4279
4280
4281class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4282 """Tests for socket.makefile() in text mode (rather than binary)"""
4283
4284 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004285 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004286 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004287 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004288 newline = ''
4289
4290
Guido van Rossumd8faa362007-04-27 19:54:29 +00004291class NetworkConnectionTest(object):
4292 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004293
Guido van Rossumd8faa362007-04-27 19:54:29 +00004294 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004295 # We're inherited below by BasicTCPTest2, which also inherits
4296 # BasicTCPTest, which defines self.port referenced below.
4297 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004298 self.serv_conn = self.cli
4299
4300class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4301 """Tests that NetworkConnection does not break existing TCP functionality.
4302 """
4303
4304class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004305
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004306 class MockSocket(socket.socket):
4307 def connect(self, *args):
4308 raise socket.timeout('timed out')
4309
4310 @contextlib.contextmanager
4311 def mocked_socket_module(self):
4312 """Return a socket which times out on connect"""
4313 old_socket = socket.socket
4314 socket.socket = self.MockSocket
4315 try:
4316 yield
4317 finally:
4318 socket.socket = old_socket
4319
4320 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004321 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004322 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004323 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004324 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004325 cli.connect((HOST, port))
4326 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4327
4328 def test_create_connection(self):
4329 # Issue #9792: errors raised by create_connection() should have
4330 # a proper errno attribute.
4331 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004332 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004333 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004334
4335 # Issue #16257: create_connection() calls getaddrinfo() against
4336 # 'localhost'. This may result in an IPV6 addr being returned
4337 # as well as an IPV4 one:
4338 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4339 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4340 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4341 #
4342 # create_connection() enumerates through all the addresses returned
4343 # and if it doesn't successfully bind to any of them, it propagates
4344 # the last exception it encountered.
4345 #
4346 # On Solaris, ENETUNREACH is returned in this circumstance instead
4347 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4348 # expected errnos.
4349 expected_errnos = [ errno.ECONNREFUSED, ]
4350 if hasattr(errno, 'ENETUNREACH'):
4351 expected_errnos.append(errno.ENETUNREACH)
4352
4353 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004354
4355 def test_create_connection_timeout(self):
4356 # Issue #9792: create_connection() should not recast timeout errors
4357 # as generic socket errors.
4358 with self.mocked_socket_module():
4359 with self.assertRaises(socket.timeout):
4360 socket.create_connection((HOST, 1234))
4361
Guido van Rossumd8faa362007-04-27 19:54:29 +00004362
Victor Stinner45df8202010-04-28 22:31:17 +00004363@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004364class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4365
4366 def __init__(self, methodName='runTest'):
4367 SocketTCPTest.__init__(self, methodName=methodName)
4368 ThreadableTest.__init__(self)
4369
4370 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004371 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004372
4373 def clientTearDown(self):
4374 self.cli.close()
4375 self.cli = None
4376 ThreadableTest.clientTearDown(self)
4377
4378 def _justAccept(self):
4379 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004380 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004381
4382 testFamily = _justAccept
4383 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004384 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004385 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004386 self.assertEqual(self.cli.family, 2)
4387
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004388 testSourceAddress = _justAccept
4389 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004390 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4391 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004392 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004393 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004394 # The port number being used is sufficient to show that the bind()
4395 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004396
Guido van Rossumd8faa362007-04-27 19:54:29 +00004397 testTimeoutDefault = _justAccept
4398 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004399 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004400 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004401 socket.setdefaulttimeout(42)
4402 try:
4403 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004404 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004405 finally:
4406 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004407 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004408
4409 testTimeoutNone = _justAccept
4410 def _testTimeoutNone(self):
4411 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004412 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004413 socket.setdefaulttimeout(30)
4414 try:
4415 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004416 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004417 finally:
4418 socket.setdefaulttimeout(None)
4419 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004420
4421 testTimeoutValueNamed = _justAccept
4422 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004423 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004424 self.assertEqual(self.cli.gettimeout(), 30)
4425
4426 testTimeoutValueNonamed = _justAccept
4427 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004428 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004429 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004430 self.assertEqual(self.cli.gettimeout(), 30)
4431
Victor Stinner45df8202010-04-28 22:31:17 +00004432@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004433class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4434
4435 def __init__(self, methodName='runTest'):
4436 SocketTCPTest.__init__(self, methodName=methodName)
4437 ThreadableTest.__init__(self)
4438
4439 def clientSetUp(self):
4440 pass
4441
4442 def clientTearDown(self):
4443 self.cli.close()
4444 self.cli = None
4445 ThreadableTest.clientTearDown(self)
4446
4447 def testInsideTimeout(self):
4448 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004449 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004450 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004451 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004452 testOutsideTimeout = testInsideTimeout
4453
4454 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004455 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004456 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004457 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004458
4459 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004460 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004461 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004462
4463
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004464class TCPTimeoutTest(SocketTCPTest):
4465
4466 def testTCPTimeout(self):
4467 def raise_timeout(*args, **kwargs):
4468 self.serv.settimeout(1.0)
4469 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004470 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004471 "Error generating a timeout exception (TCP)")
4472
4473 def testTimeoutZero(self):
4474 ok = False
4475 try:
4476 self.serv.settimeout(0.0)
4477 foo = self.serv.accept()
4478 except socket.timeout:
4479 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004480 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004481 ok = True
4482 except:
4483 self.fail("caught unexpected exception (TCP)")
4484 if not ok:
4485 self.fail("accept() returned success when we did not expect it")
4486
Serhiy Storchaka43767632013-11-03 21:31:38 +02004487 @unittest.skipUnless(hasattr(signal, 'alarm'),
4488 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004489 def testInterruptedTimeout(self):
4490 # XXX I don't know how to do this test on MSWindows or any other
4491 # plaform that doesn't support signal.alarm() or os.kill(), though
4492 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004493 self.serv.settimeout(5.0) # must be longer than alarm
4494 class Alarm(Exception):
4495 pass
4496 def alarm_handler(signal, frame):
4497 raise Alarm
4498 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4499 try:
4500 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4501 try:
4502 foo = self.serv.accept()
4503 except socket.timeout:
4504 self.fail("caught timeout instead of Alarm")
4505 except Alarm:
4506 pass
4507 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004508 self.fail("caught other exception instead of Alarm:"
4509 " %s(%s):\n%s" %
4510 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004511 else:
4512 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004513 finally:
4514 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004515 except Alarm:
4516 self.fail("got Alarm in wrong place")
4517 finally:
4518 # no alarm can be pending. Safe to restore old handler.
4519 signal.signal(signal.SIGALRM, old_alarm)
4520
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004521class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004522
4523 def testUDPTimeout(self):
4524 def raise_timeout(*args, **kwargs):
4525 self.serv.settimeout(1.0)
4526 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004527 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004528 "Error generating a timeout exception (UDP)")
4529
4530 def testTimeoutZero(self):
4531 ok = False
4532 try:
4533 self.serv.settimeout(0.0)
4534 foo = self.serv.recv(1024)
4535 except socket.timeout:
4536 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004537 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004538 ok = True
4539 except:
4540 self.fail("caught unexpected exception (UDP)")
4541 if not ok:
4542 self.fail("recv() returned success when we did not expect it")
4543
4544class TestExceptions(unittest.TestCase):
4545
4546 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004547 self.assertTrue(issubclass(OSError, Exception))
4548 self.assertTrue(issubclass(socket.herror, OSError))
4549 self.assertTrue(issubclass(socket.gaierror, OSError))
4550 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004551
Serhiy Storchaka43767632013-11-03 21:31:38 +02004552@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004553class TestLinuxAbstractNamespace(unittest.TestCase):
4554
4555 UNIX_PATH_MAX = 108
4556
4557 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004558 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004559 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4560 s1.bind(address)
4561 s1.listen(1)
4562 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4563 s2.connect(s1.getsockname())
4564 with s1.accept()[0] as s3:
4565 self.assertEqual(s1.getsockname(), address)
4566 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004567
4568 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004569 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004570 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4571 s.bind(address)
4572 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004573
4574 def testNameOverflow(self):
4575 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004576 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004577 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004578
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004579 def testStrName(self):
4580 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004581 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4582 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004583 s.bind("\x00python\x00test\x00")
4584 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004585 finally:
4586 s.close()
4587
Serhiy Storchaka43767632013-11-03 21:31:38 +02004588@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004589class TestUnixDomain(unittest.TestCase):
4590
4591 def setUp(self):
4592 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4593
4594 def tearDown(self):
4595 self.sock.close()
4596
4597 def encoded(self, path):
4598 # Return the given path encoded in the file system encoding,
4599 # or skip the test if this is not possible.
4600 try:
4601 return os.fsencode(path)
4602 except UnicodeEncodeError:
4603 self.skipTest(
4604 "Pathname {0!a} cannot be represented in file "
4605 "system encoding {1!r}".format(
4606 path, sys.getfilesystemencoding()))
4607
Antoine Pitrou16374872011-12-16 15:04:12 +01004608 def bind(self, sock, path):
4609 # Bind the socket
4610 try:
4611 sock.bind(path)
4612 except OSError as e:
4613 if str(e) == "AF_UNIX path too long":
4614 self.skipTest(
4615 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4616 .format(path))
4617 else:
4618 raise
4619
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004620 def testStrAddr(self):
4621 # Test binding to and retrieving a normal string pathname.
4622 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004623 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004624 self.addCleanup(support.unlink, path)
4625 self.assertEqual(self.sock.getsockname(), path)
4626
4627 def testBytesAddr(self):
4628 # Test binding to a bytes pathname.
4629 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004630 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004631 self.addCleanup(support.unlink, path)
4632 self.assertEqual(self.sock.getsockname(), path)
4633
4634 def testSurrogateescapeBind(self):
4635 # Test binding to a valid non-ASCII pathname, with the
4636 # non-ASCII bytes supplied using surrogateescape encoding.
4637 path = os.path.abspath(support.TESTFN_UNICODE)
4638 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004639 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004640 self.addCleanup(support.unlink, path)
4641 self.assertEqual(self.sock.getsockname(), path)
4642
4643 def testUnencodableAddr(self):
4644 # Test binding to a pathname that cannot be encoded in the
4645 # file system encoding.
4646 if support.TESTFN_UNENCODABLE is None:
4647 self.skipTest("No unencodable filename available")
4648 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004649 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004650 self.addCleanup(support.unlink, path)
4651 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004652
Victor Stinner45df8202010-04-28 22:31:17 +00004653@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004654class BufferIOTest(SocketConnectedTest):
4655 """
4656 Test the buffer versions of socket.recv() and socket.send().
4657 """
4658 def __init__(self, methodName='runTest'):
4659 SocketConnectedTest.__init__(self, methodName=methodName)
4660
Antoine Pitrou25480782010-03-17 22:50:28 +00004661 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004662 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004663 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004664 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004665 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004666 self.assertEqual(msg, MSG)
4667
Antoine Pitrou25480782010-03-17 22:50:28 +00004668 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004669 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004670 self.serv_conn.send(buf)
4671
Antoine Pitrou25480782010-03-17 22:50:28 +00004672 def testRecvIntoBytearray(self):
4673 buf = bytearray(1024)
4674 nbytes = self.cli_conn.recv_into(buf)
4675 self.assertEqual(nbytes, len(MSG))
4676 msg = buf[:len(MSG)]
4677 self.assertEqual(msg, MSG)
4678
4679 _testRecvIntoBytearray = _testRecvIntoArray
4680
4681 def testRecvIntoMemoryview(self):
4682 buf = bytearray(1024)
4683 nbytes = self.cli_conn.recv_into(memoryview(buf))
4684 self.assertEqual(nbytes, len(MSG))
4685 msg = buf[:len(MSG)]
4686 self.assertEqual(msg, MSG)
4687
4688 _testRecvIntoMemoryview = _testRecvIntoArray
4689
4690 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004691 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004692 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004693 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004694 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004695 self.assertEqual(msg, MSG)
4696
Antoine Pitrou25480782010-03-17 22:50:28 +00004697 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004698 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004699 self.serv_conn.send(buf)
4700
Antoine Pitrou25480782010-03-17 22:50:28 +00004701 def testRecvFromIntoBytearray(self):
4702 buf = bytearray(1024)
4703 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4704 self.assertEqual(nbytes, len(MSG))
4705 msg = buf[:len(MSG)]
4706 self.assertEqual(msg, MSG)
4707
4708 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4709
4710 def testRecvFromIntoMemoryview(self):
4711 buf = bytearray(1024)
4712 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4713 self.assertEqual(nbytes, len(MSG))
4714 msg = buf[:len(MSG)]
4715 self.assertEqual(msg, MSG)
4716
4717 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4718
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004719 def testRecvFromIntoSmallBuffer(self):
4720 # See issue #20246.
4721 buf = bytearray(8)
4722 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4723
4724 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004725 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004726
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004727 def testRecvFromIntoEmptyBuffer(self):
4728 buf = bytearray()
4729 self.cli_conn.recvfrom_into(buf)
4730 self.cli_conn.recvfrom_into(buf, 0)
4731
4732 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4733
Christian Heimes043d6f62008-01-07 17:19:16 +00004734
4735TIPC_STYPE = 2000
4736TIPC_LOWER = 200
4737TIPC_UPPER = 210
4738
4739def isTipcAvailable():
4740 """Check if the TIPC module is loaded
4741
4742 The TIPC module is not loaded automatically on Ubuntu and probably
4743 other Linux distros.
4744 """
4745 if not hasattr(socket, "AF_TIPC"):
4746 return False
4747 if not os.path.isfile("/proc/modules"):
4748 return False
4749 with open("/proc/modules") as f:
4750 for line in f:
4751 if line.startswith("tipc "):
4752 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004753 return False
4754
Serhiy Storchaka43767632013-11-03 21:31:38 +02004755@unittest.skipUnless(isTipcAvailable(),
4756 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004757class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004758 def testRDM(self):
4759 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4760 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004761 self.addCleanup(srv.close)
4762 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004763
4764 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4765 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4766 TIPC_LOWER, TIPC_UPPER)
4767 srv.bind(srvaddr)
4768
4769 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4770 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4771 cli.sendto(MSG, sendaddr)
4772
4773 msg, recvaddr = srv.recvfrom(1024)
4774
4775 self.assertEqual(cli.getsockname(), recvaddr)
4776 self.assertEqual(msg, MSG)
4777
4778
Serhiy Storchaka43767632013-11-03 21:31:38 +02004779@unittest.skipUnless(isTipcAvailable(),
4780 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004781class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004782 def __init__(self, methodName = 'runTest'):
4783 unittest.TestCase.__init__(self, methodName = methodName)
4784 ThreadableTest.__init__(self)
4785
4786 def setUp(self):
4787 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004788 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004789 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4790 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4791 TIPC_LOWER, TIPC_UPPER)
4792 self.srv.bind(srvaddr)
4793 self.srv.listen(5)
4794 self.serverExplicitReady()
4795 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004796 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004797
4798 def clientSetUp(self):
4799 # The is a hittable race between serverExplicitReady() and the
4800 # accept() call; sleep a little while to avoid it, otherwise
4801 # we could get an exception
4802 time.sleep(0.1)
4803 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004804 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004805 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4806 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4807 self.cli.connect(addr)
4808 self.cliaddr = self.cli.getsockname()
4809
4810 def testStream(self):
4811 msg = self.conn.recv(1024)
4812 self.assertEqual(msg, MSG)
4813 self.assertEqual(self.cliaddr, self.connaddr)
4814
4815 def _testStream(self):
4816 self.cli.send(MSG)
4817 self.cli.close()
4818
4819
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004820@unittest.skipUnless(thread, 'Threading required for this test.')
4821class ContextManagersTest(ThreadedTCPSocketTest):
4822
4823 def _testSocketClass(self):
4824 # base test
4825 with socket.socket() as sock:
4826 self.assertFalse(sock._closed)
4827 self.assertTrue(sock._closed)
4828 # close inside with block
4829 with socket.socket() as sock:
4830 sock.close()
4831 self.assertTrue(sock._closed)
4832 # exception inside with block
4833 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004834 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004835 self.assertTrue(sock._closed)
4836
4837 def testCreateConnectionBase(self):
4838 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004839 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004840 data = conn.recv(1024)
4841 conn.sendall(data)
4842
4843 def _testCreateConnectionBase(self):
4844 address = self.serv.getsockname()
4845 with socket.create_connection(address) as sock:
4846 self.assertFalse(sock._closed)
4847 sock.sendall(b'foo')
4848 self.assertEqual(sock.recv(1024), b'foo')
4849 self.assertTrue(sock._closed)
4850
4851 def testCreateConnectionClose(self):
4852 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004853 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004854 data = conn.recv(1024)
4855 conn.sendall(data)
4856
4857 def _testCreateConnectionClose(self):
4858 address = self.serv.getsockname()
4859 with socket.create_connection(address) as sock:
4860 sock.close()
4861 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004862 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004863
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004864
Victor Stinnerdaf45552013-08-28 00:53:59 +02004865class InheritanceTest(unittest.TestCase):
4866 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4867 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004868 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004869 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004870 with socket.socket(socket.AF_INET,
4871 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4872 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004873 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004874
4875 def test_default_inheritable(self):
4876 sock = socket.socket()
4877 with sock:
4878 self.assertEqual(sock.get_inheritable(), False)
4879
4880 def test_dup(self):
4881 sock = socket.socket()
4882 with sock:
4883 newsock = sock.dup()
4884 sock.close()
4885 with newsock:
4886 self.assertEqual(newsock.get_inheritable(), False)
4887
4888 def test_set_inheritable(self):
4889 sock = socket.socket()
4890 with sock:
4891 sock.set_inheritable(True)
4892 self.assertEqual(sock.get_inheritable(), True)
4893
4894 sock.set_inheritable(False)
4895 self.assertEqual(sock.get_inheritable(), False)
4896
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004897 @unittest.skipIf(fcntl is None, "need fcntl")
4898 def test_get_inheritable_cloexec(self):
4899 sock = socket.socket()
4900 with sock:
4901 fd = sock.fileno()
4902 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004903
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004904 # clear FD_CLOEXEC flag
4905 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4906 flags &= ~fcntl.FD_CLOEXEC
4907 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004908
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004909 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004910
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004911 @unittest.skipIf(fcntl is None, "need fcntl")
4912 def test_set_inheritable_cloexec(self):
4913 sock = socket.socket()
4914 with sock:
4915 fd = sock.fileno()
4916 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4917 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004918
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004919 sock.set_inheritable(True)
4920 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4921 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004922
4923
Victor Stinnerdaf45552013-08-28 00:53:59 +02004924 @unittest.skipUnless(hasattr(socket, "socketpair"),
4925 "need socket.socketpair()")
4926 def test_socketpair(self):
4927 s1, s2 = socket.socketpair()
4928 self.addCleanup(s1.close)
4929 self.addCleanup(s2.close)
4930 self.assertEqual(s1.get_inheritable(), False)
4931 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004932
4933
4934@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4935 "SOCK_NONBLOCK not defined")
4936class NonblockConstantTest(unittest.TestCase):
4937 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4938 if nonblock:
4939 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4940 self.assertEqual(s.gettimeout(), timeout)
4941 else:
4942 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4943 self.assertEqual(s.gettimeout(), None)
4944
Charles-François Natali239bb962011-06-03 12:55:15 +02004945 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004946 def test_SOCK_NONBLOCK(self):
4947 # a lot of it seems silly and redundant, but I wanted to test that
4948 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004949 with socket.socket(socket.AF_INET,
4950 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4951 self.checkNonblock(s)
4952 s.setblocking(1)
4953 self.checkNonblock(s, False)
4954 s.setblocking(0)
4955 self.checkNonblock(s)
4956 s.settimeout(None)
4957 self.checkNonblock(s, False)
4958 s.settimeout(2.0)
4959 self.checkNonblock(s, timeout=2.0)
4960 s.setblocking(1)
4961 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004962 # defaulttimeout
4963 t = socket.getdefaulttimeout()
4964 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004965 with socket.socket() as s:
4966 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004967 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004968 with socket.socket() as s:
4969 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004970 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004971 with socket.socket() as s:
4972 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004973 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004974 with socket.socket() as s:
4975 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004976 socket.setdefaulttimeout(t)
4977
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004978
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004979@unittest.skipUnless(os.name == "nt", "Windows specific")
4980@unittest.skipUnless(multiprocessing, "need multiprocessing")
4981class TestSocketSharing(SocketTCPTest):
4982 # This must be classmethod and not staticmethod or multiprocessing
4983 # won't be able to bootstrap it.
4984 @classmethod
4985 def remoteProcessServer(cls, q):
4986 # Recreate socket from shared data
4987 sdata = q.get()
4988 message = q.get()
4989
4990 s = socket.fromshare(sdata)
4991 s2, c = s.accept()
4992
4993 # Send the message
4994 s2.sendall(message)
4995 s2.close()
4996 s.close()
4997
4998 def testShare(self):
4999 # Transfer the listening server socket to another process
5000 # and service it from there.
5001
5002 # Create process:
5003 q = multiprocessing.Queue()
5004 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5005 p.start()
5006
5007 # Get the shared socket data
5008 data = self.serv.share(p.pid)
5009
5010 # Pass the shared socket to the other process
5011 addr = self.serv.getsockname()
5012 self.serv.close()
5013 q.put(data)
5014
5015 # The data that the server will send us
5016 message = b"slapmahfro"
5017 q.put(message)
5018
5019 # Connect
5020 s = socket.create_connection(addr)
5021 # listen for the data
5022 m = []
5023 while True:
5024 data = s.recv(100)
5025 if not data:
5026 break
5027 m.append(data)
5028 s.close()
5029 received = b"".join(m)
5030 self.assertEqual(received, message)
5031 p.join()
5032
5033 def testShareLength(self):
5034 data = self.serv.share(os.getpid())
5035 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5036 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5037
5038 def compareSockets(self, org, other):
5039 # socket sharing is expected to work only for blocking socket
5040 # since the internal python timout value isn't transfered.
5041 self.assertEqual(org.gettimeout(), None)
5042 self.assertEqual(org.gettimeout(), other.gettimeout())
5043
5044 self.assertEqual(org.family, other.family)
5045 self.assertEqual(org.type, other.type)
5046 # If the user specified "0" for proto, then
5047 # internally windows will have picked the correct value.
5048 # Python introspection on the socket however will still return
5049 # 0. For the shared socket, the python value is recreated
5050 # from the actual value, so it may not compare correctly.
5051 if org.proto != 0:
5052 self.assertEqual(org.proto, other.proto)
5053
5054 def testShareLocal(self):
5055 data = self.serv.share(os.getpid())
5056 s = socket.fromshare(data)
5057 try:
5058 self.compareSockets(self.serv, s)
5059 finally:
5060 s.close()
5061
5062 def testTypes(self):
5063 families = [socket.AF_INET, socket.AF_INET6]
5064 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5065 for f in families:
5066 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005067 try:
5068 source = socket.socket(f, t)
5069 except OSError:
5070 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005071 try:
5072 data = source.share(os.getpid())
5073 shared = socket.fromshare(data)
5074 try:
5075 self.compareSockets(source, shared)
5076 finally:
5077 shared.close()
5078 finally:
5079 source.close()
5080
5081
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005082@unittest.skipUnless(thread, 'Threading required for this test.')
5083class SendfileUsingSendTest(ThreadedTCPSocketTest):
5084 """
5085 Test the send() implementation of socket.sendfile().
5086 """
5087
5088 FILESIZE = (10 * 1024 * 1024) # 10MB
5089 BUFSIZE = 8192
5090 FILEDATA = b""
5091 TIMEOUT = 2
5092
5093 @classmethod
5094 def setUpClass(cls):
5095 def chunks(total, step):
5096 assert total >= step
5097 while total > step:
5098 yield step
5099 total -= step
5100 if total:
5101 yield total
5102
5103 chunk = b"".join([random.choice(string.ascii_letters).encode()
5104 for i in range(cls.BUFSIZE)])
5105 with open(support.TESTFN, 'wb') as f:
5106 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5107 f.write(chunk)
5108 with open(support.TESTFN, 'rb') as f:
5109 cls.FILEDATA = f.read()
5110 assert len(cls.FILEDATA) == cls.FILESIZE
5111
5112 @classmethod
5113 def tearDownClass(cls):
5114 support.unlink(support.TESTFN)
5115
5116 def accept_conn(self):
5117 self.serv.settimeout(self.TIMEOUT)
5118 conn, addr = self.serv.accept()
5119 conn.settimeout(self.TIMEOUT)
5120 self.addCleanup(conn.close)
5121 return conn
5122
5123 def recv_data(self, conn):
5124 received = []
5125 while True:
5126 chunk = conn.recv(self.BUFSIZE)
5127 if not chunk:
5128 break
5129 received.append(chunk)
5130 return b''.join(received)
5131
5132 def meth_from_sock(self, sock):
5133 # Depending on the mixin class being run return either send()
5134 # or sendfile() method implementation.
5135 return getattr(sock, "_sendfile_use_send")
5136
5137 # regular file
5138
5139 def _testRegularFile(self):
5140 address = self.serv.getsockname()
5141 file = open(support.TESTFN, 'rb')
5142 with socket.create_connection(address) as sock, file as file:
5143 meth = self.meth_from_sock(sock)
5144 sent = meth(file)
5145 self.assertEqual(sent, self.FILESIZE)
5146 self.assertEqual(file.tell(), self.FILESIZE)
5147
5148 def testRegularFile(self):
5149 conn = self.accept_conn()
5150 data = self.recv_data(conn)
5151 self.assertEqual(len(data), self.FILESIZE)
5152 self.assertEqual(data, self.FILEDATA)
5153
5154 # non regular file
5155
5156 def _testNonRegularFile(self):
5157 address = self.serv.getsockname()
5158 file = io.BytesIO(self.FILEDATA)
5159 with socket.create_connection(address) as sock, file as file:
5160 sent = sock.sendfile(file)
5161 self.assertEqual(sent, self.FILESIZE)
5162 self.assertEqual(file.tell(), self.FILESIZE)
5163 self.assertRaises(socket._GiveupOnSendfile,
5164 sock._sendfile_use_sendfile, file)
5165
5166 def testNonRegularFile(self):
5167 conn = self.accept_conn()
5168 data = self.recv_data(conn)
5169 self.assertEqual(len(data), self.FILESIZE)
5170 self.assertEqual(data, self.FILEDATA)
5171
5172 # empty file
5173
5174 def _testEmptyFileSend(self):
5175 address = self.serv.getsockname()
5176 filename = support.TESTFN + "2"
5177 with open(filename, 'wb'):
5178 self.addCleanup(support.unlink, filename)
5179 file = open(filename, 'rb')
5180 with socket.create_connection(address) as sock, file as file:
5181 meth = self.meth_from_sock(sock)
5182 sent = meth(file)
5183 self.assertEqual(sent, 0)
5184 self.assertEqual(file.tell(), 0)
5185
5186 def testEmptyFileSend(self):
5187 conn = self.accept_conn()
5188 data = self.recv_data(conn)
5189 self.assertEqual(data, b"")
5190
5191 # offset
5192
5193 def _testOffset(self):
5194 address = self.serv.getsockname()
5195 file = open(support.TESTFN, 'rb')
5196 with socket.create_connection(address) as sock, file as file:
5197 meth = self.meth_from_sock(sock)
5198 sent = meth(file, offset=5000)
5199 self.assertEqual(sent, self.FILESIZE - 5000)
5200 self.assertEqual(file.tell(), self.FILESIZE)
5201
5202 def testOffset(self):
5203 conn = self.accept_conn()
5204 data = self.recv_data(conn)
5205 self.assertEqual(len(data), self.FILESIZE - 5000)
5206 self.assertEqual(data, self.FILEDATA[5000:])
5207
5208 # count
5209
5210 def _testCount(self):
5211 address = self.serv.getsockname()
5212 file = open(support.TESTFN, 'rb')
5213 with socket.create_connection(address, timeout=2) as sock, file as file:
5214 count = 5000007
5215 meth = self.meth_from_sock(sock)
5216 sent = meth(file, count=count)
5217 self.assertEqual(sent, count)
5218 self.assertEqual(file.tell(), count)
5219
5220 def testCount(self):
5221 count = 5000007
5222 conn = self.accept_conn()
5223 data = self.recv_data(conn)
5224 self.assertEqual(len(data), count)
5225 self.assertEqual(data, self.FILEDATA[:count])
5226
5227 # count small
5228
5229 def _testCountSmall(self):
5230 address = self.serv.getsockname()
5231 file = open(support.TESTFN, 'rb')
5232 with socket.create_connection(address, timeout=2) as sock, file as file:
5233 count = 1
5234 meth = self.meth_from_sock(sock)
5235 sent = meth(file, count=count)
5236 self.assertEqual(sent, count)
5237 self.assertEqual(file.tell(), count)
5238
5239 def testCountSmall(self):
5240 count = 1
5241 conn = self.accept_conn()
5242 data = self.recv_data(conn)
5243 self.assertEqual(len(data), count)
5244 self.assertEqual(data, self.FILEDATA[:count])
5245
5246 # count + offset
5247
5248 def _testCountWithOffset(self):
5249 address = self.serv.getsockname()
5250 file = open(support.TESTFN, 'rb')
5251 with socket.create_connection(address, timeout=2) as sock, file as file:
5252 count = 100007
5253 meth = self.meth_from_sock(sock)
5254 sent = meth(file, offset=2007, count=count)
5255 self.assertEqual(sent, count)
5256 self.assertEqual(file.tell(), count + 2007)
5257
5258 def testCountWithOffset(self):
5259 count = 100007
5260 conn = self.accept_conn()
5261 data = self.recv_data(conn)
5262 self.assertEqual(len(data), count)
5263 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5264
5265 # non blocking sockets are not supposed to work
5266
5267 def _testNonBlocking(self):
5268 address = self.serv.getsockname()
5269 file = open(support.TESTFN, 'rb')
5270 with socket.create_connection(address) as sock, file as file:
5271 sock.setblocking(False)
5272 meth = self.meth_from_sock(sock)
5273 self.assertRaises(ValueError, meth, file)
5274 self.assertRaises(ValueError, sock.sendfile, file)
5275
5276 def testNonBlocking(self):
5277 conn = self.accept_conn()
5278 if conn.recv(8192):
5279 self.fail('was not supposed to receive any data')
5280
5281 # timeout (non-triggered)
5282
5283 def _testWithTimeout(self):
5284 address = self.serv.getsockname()
5285 file = open(support.TESTFN, 'rb')
5286 with socket.create_connection(address, timeout=2) as sock, file as file:
5287 meth = self.meth_from_sock(sock)
5288 sent = meth(file)
5289 self.assertEqual(sent, self.FILESIZE)
5290
5291 def testWithTimeout(self):
5292 conn = self.accept_conn()
5293 data = self.recv_data(conn)
5294 self.assertEqual(len(data), self.FILESIZE)
5295 self.assertEqual(data, self.FILEDATA)
5296
5297 # timeout (triggered)
5298
5299 def _testWithTimeoutTriggeredSend(self):
5300 address = self.serv.getsockname()
5301 file = open(support.TESTFN, 'rb')
5302 with socket.create_connection(address, timeout=0.01) as sock, \
5303 file as file:
5304 meth = self.meth_from_sock(sock)
5305 self.assertRaises(socket.timeout, meth, file)
5306
5307 def testWithTimeoutTriggeredSend(self):
5308 conn = self.accept_conn()
5309 conn.recv(88192)
5310
5311 # errors
5312
5313 def _test_errors(self):
5314 pass
5315
5316 def test_errors(self):
5317 with open(support.TESTFN, 'rb') as file:
5318 with socket.socket(type=socket.SOCK_DGRAM) as s:
5319 meth = self.meth_from_sock(s)
5320 self.assertRaisesRegex(
5321 ValueError, "SOCK_STREAM", meth, file)
5322 with open(support.TESTFN, 'rt') as file:
5323 with socket.socket() as s:
5324 meth = self.meth_from_sock(s)
5325 self.assertRaisesRegex(
5326 ValueError, "binary mode", meth, file)
5327 with open(support.TESTFN, 'rb') as file:
5328 with socket.socket() as s:
5329 meth = self.meth_from_sock(s)
5330 self.assertRaisesRegex(TypeError, "positive integer",
5331 meth, file, count='2')
5332 self.assertRaisesRegex(TypeError, "positive integer",
5333 meth, file, count=0.1)
5334 self.assertRaisesRegex(ValueError, "positive integer",
5335 meth, file, count=0)
5336 self.assertRaisesRegex(ValueError, "positive integer",
5337 meth, file, count=-1)
5338
5339
5340@unittest.skipUnless(thread, 'Threading required for this test.')
5341@unittest.skipUnless(hasattr(os, "sendfile"),
5342 'os.sendfile() required for this test.')
5343class SendfileUsingSendfileTest(SendfileUsingSendTest):
5344 """
5345 Test the sendfile() implementation of socket.sendfile().
5346 """
5347 def meth_from_sock(self, sock):
5348 return getattr(sock, "_sendfile_use_sendfile")
5349
5350
Guido van Rossumb995eb72002-07-31 16:08:40 +00005351def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005352 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005353 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005354
5355 tests.extend([
5356 NonBlockingTCPTests,
5357 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005358 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00005359 UnbufferedFileObjectClassTestCase,
5360 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005361 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005362 UnicodeReadFileObjectClassTestCase,
5363 UnicodeWriteFileObjectClassTestCase,
5364 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005365 NetworkConnectionNoServer,
5366 NetworkConnectionAttributesTest,
5367 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005368 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005369 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005370 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005371 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005372 tests.append(BasicSocketPairTest)
5373 tests.append(TestUnixDomain)
5374 tests.append(TestLinuxAbstractNamespace)
5375 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005376 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005377 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005378 tests.extend([
5379 CmsgMacroTests,
5380 SendmsgUDPTest,
5381 RecvmsgUDPTest,
5382 RecvmsgIntoUDPTest,
5383 SendmsgUDP6Test,
5384 RecvmsgUDP6Test,
5385 RecvmsgRFC3542AncillaryUDP6Test,
5386 RecvmsgIntoRFC3542AncillaryUDP6Test,
5387 RecvmsgIntoUDP6Test,
5388 SendmsgTCPTest,
5389 RecvmsgTCPTest,
5390 RecvmsgIntoTCPTest,
5391 SendmsgSCTPStreamTest,
5392 RecvmsgSCTPStreamTest,
5393 RecvmsgIntoSCTPStreamTest,
5394 SendmsgUnixStreamTest,
5395 RecvmsgUnixStreamTest,
5396 RecvmsgIntoUnixStreamTest,
5397 RecvmsgSCMRightsStreamTest,
5398 RecvmsgIntoSCMRightsStreamTest,
5399 # These are slow when setitimer() is not available
5400 InterruptedRecvTimeoutTest,
5401 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005402 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005403 SendfileUsingSendTest,
5404 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005405 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005406
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005407 thread_info = support.threading_setup()
5408 support.run_unittest(*tests)
5409 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005410
5411if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005412 test_main()