blob: 72eac0d1ca23ee650a19d5d7b84fb026eabdd3eb [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003
Christian Heimes5e696852008-04-09 08:37:03 +00004import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005import io
Charles-François Natali65708cf2014-07-25 18:44:30 +01006import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +00007import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +10009import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000016import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000017import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000020import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010021import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020022import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020023import random
24import string
Antoine Pitroub1c54962010-10-14 15:05:38 +000025try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000026 import multiprocessing
27except ImportError:
28 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020029try:
30 import fcntl
31except ImportError:
32 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000033
Benjamin Petersonee8712c2008-05-20 21:35:26 +000034HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000035MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000036
Victor Stinner45df8202010-04-28 22:31:17 +000037try:
38 import _thread as thread
39 import threading
40except ImportError:
41 thread = None
42 threading = None
Victor Stinnere254e532014-07-26 14:36:55 +020043try:
44 import _socket
45except ImportError:
46 _socket = None
47
Victor Stinner45df8202010-04-28 22:31:17 +000048
Charles-François Natali47413c12011-10-06 19:47:44 +020049def _have_socket_can():
50 """Check whether CAN sockets are supported on this host."""
51 try:
52 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020053 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020054 return False
55 else:
56 s.close()
57 return True
58
Charles-François Natali10b8cf42011-11-10 19:21:37 +010059def _have_socket_rds():
60 """Check whether RDS sockets are supported on this host."""
61 try:
62 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
63 except (AttributeError, OSError):
64 return False
65 else:
66 s.close()
67 return True
68
Charles-François Natali47413c12011-10-06 19:47:44 +020069HAVE_SOCKET_CAN = _have_socket_can()
70
Charles-François Natali10b8cf42011-11-10 19:21:37 +010071HAVE_SOCKET_RDS = _have_socket_rds()
72
Nick Coghlan96fe56a2011-08-22 11:55:57 +100073# Size in bytes of the int type
74SIZEOF_INT = array.array("i").itemsize
75
Guido van Rossum24e4af82002-06-12 19:18:08 +000076class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000077
Guido van Rossum24e4af82002-06-12 19:18:08 +000078 def setUp(self):
79 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000080 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +010081 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +000082
Guido van Rossum24e4af82002-06-12 19:18:08 +000083 def tearDown(self):
84 self.serv.close()
85 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000086
Guido van Rossum24e4af82002-06-12 19:18:08 +000087class SocketUDPTest(unittest.TestCase):
88
89 def setUp(self):
90 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000091 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000092
93 def tearDown(self):
94 self.serv.close()
95 self.serv = None
96
Nick Coghlan96fe56a2011-08-22 11:55:57 +100097class ThreadSafeCleanupTestCase(unittest.TestCase):
98 """Subclass of unittest.TestCase with thread-safe cleanup methods.
99
100 This subclass protects the addCleanup() and doCleanups() methods
101 with a recursive lock.
102 """
103
104 if threading:
105 def __init__(self, *args, **kwargs):
106 super().__init__(*args, **kwargs)
107 self._cleanup_lock = threading.RLock()
108
109 def addCleanup(self, *args, **kwargs):
110 with self._cleanup_lock:
111 return super().addCleanup(*args, **kwargs)
112
113 def doCleanups(self, *args, **kwargs):
114 with self._cleanup_lock:
115 return super().doCleanups(*args, **kwargs)
116
Charles-François Natali47413c12011-10-06 19:47:44 +0200117class SocketCANTest(unittest.TestCase):
118
119 """To be able to run this test, a `vcan0` CAN interface can be created with
120 the following commands:
121 # modprobe vcan
122 # ip link add dev vcan0 type vcan
123 # ifconfig vcan0 up
124 """
125 interface = 'vcan0'
126 bufsize = 128
127
Charles-François Natali773e42d2013-02-05 19:42:01 +0100128 """The CAN frame structure is defined in <linux/can.h>:
129
130 struct can_frame {
131 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
132 __u8 can_dlc; /* data length code: 0 .. 8 */
133 __u8 data[8] __attribute__((aligned(8)));
134 };
135 """
136 can_frame_fmt = "=IB3x8s"
137 can_frame_size = struct.calcsize(can_frame_fmt)
138
139 """The Broadcast Management Command frame structure is defined
140 in <linux/can/bcm.h>:
141
142 struct bcm_msg_head {
143 __u32 opcode;
144 __u32 flags;
145 __u32 count;
146 struct timeval ival1, ival2;
147 canid_t can_id;
148 __u32 nframes;
149 struct can_frame frames[0];
150 }
151
152 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
153 `struct can_frame` definition). Must use native not standard types for packing.
154 """
155 bcm_cmd_msg_fmt = "@3I4l2I"
156 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
157
Charles-François Natali47413c12011-10-06 19:47:44 +0200158 def setUp(self):
159 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200160 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200161 try:
162 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200163 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200164 self.skipTest('network interface `%s` does not exist' %
165 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200166
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100167
168class SocketRDSTest(unittest.TestCase):
169
170 """To be able to run this test, the `rds` kernel module must be loaded:
171 # modprobe rds
172 """
173 bufsize = 8192
174
175 def setUp(self):
176 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
177 self.addCleanup(self.serv.close)
178 try:
179 self.port = support.bind_port(self.serv)
180 except OSError:
181 self.skipTest('unable to bind RDS socket')
182
183
Guido van Rossum24e4af82002-06-12 19:18:08 +0000184class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000185 """Threadable Test class
186
187 The ThreadableTest class makes it easy to create a threaded
188 client/server pair from an existing unit test. To create a
189 new threaded class from an existing unit test, use multiple
190 inheritance:
191
192 class NewClass (OldClass, ThreadableTest):
193 pass
194
195 This class defines two new fixture functions with obvious
196 purposes for overriding:
197
198 clientSetUp ()
199 clientTearDown ()
200
201 Any new test functions within the class must then define
202 tests in pairs, where the test name is preceeded with a
203 '_' to indicate the client portion of the test. Ex:
204
205 def testFoo(self):
206 # Server portion
207
208 def _testFoo(self):
209 # Client portion
210
211 Any exceptions raised by the clients during their tests
212 are caught and transferred to the main thread to alert
213 the testing framework.
214
215 Note, the server setup function cannot call any blocking
216 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000217 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000218 the blocking call (such as in setting up a client/server
219 connection and performing the accept() in setUp().
220 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000221
222 def __init__(self):
223 # Swap the true setup function
224 self.__setUp = self.setUp
225 self.__tearDown = self.tearDown
226 self.setUp = self._setUp
227 self.tearDown = self._tearDown
228
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000229 def serverExplicitReady(self):
230 """This method allows the server to explicitly indicate that
231 it wants the client thread to proceed. This is useful if the
232 server is about to execute a blocking routine that is
233 dependent upon the client thread during its setup routine."""
234 self.server_ready.set()
235
Guido van Rossum24e4af82002-06-12 19:18:08 +0000236 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000237 self.server_ready = threading.Event()
238 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000239 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000240 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200241 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000242
243 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000244 methodname = self.id()
245 i = methodname.rfind('.')
246 methodname = methodname[i+1:]
247 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000248 self.client_thread = thread.start_new_thread(
249 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200251 try:
252 self.__setUp()
253 except:
254 self.server_crashed = True
255 raise
256 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000257 self.server_ready.set()
258 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000259
260 def _tearDown(self):
261 self.__tearDown()
262 self.done.wait()
263
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000264 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000265 exc = self.queue.get()
266 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000267
268 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000269 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000270 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200271 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200272 if self.server_crashed:
273 self.clientTearDown()
274 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000275 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000276 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277 try:
278 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000279 except BaseException as e:
280 self.queue.put(e)
281 finally:
282 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000283
284 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000285 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000286
287 def clientTearDown(self):
288 self.done.set()
289 thread.exit()
290
291class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
292
293 def __init__(self, methodName='runTest'):
294 SocketTCPTest.__init__(self, methodName=methodName)
295 ThreadableTest.__init__(self)
296
297 def clientSetUp(self):
298 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
299
300 def clientTearDown(self):
301 self.cli.close()
302 self.cli = None
303 ThreadableTest.clientTearDown(self)
304
305class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
306
307 def __init__(self, methodName='runTest'):
308 SocketUDPTest.__init__(self, methodName=methodName)
309 ThreadableTest.__init__(self)
310
311 def clientSetUp(self):
312 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
313
Brian Curtin3beb38f2010-11-04 03:41:43 +0000314 def clientTearDown(self):
315 self.cli.close()
316 self.cli = None
317 ThreadableTest.clientTearDown(self)
318
Charles-François Natali47413c12011-10-06 19:47:44 +0200319class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
320
321 def __init__(self, methodName='runTest'):
322 SocketCANTest.__init__(self, methodName=methodName)
323 ThreadableTest.__init__(self)
324
325 def clientSetUp(self):
326 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
327 try:
328 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200329 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200330 # skipTest should not be called here, and will be called in the
331 # server instead
332 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200333
334 def clientTearDown(self):
335 self.cli.close()
336 self.cli = None
337 ThreadableTest.clientTearDown(self)
338
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100339class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
340
341 def __init__(self, methodName='runTest'):
342 SocketRDSTest.__init__(self, methodName=methodName)
343 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100344
345 def clientSetUp(self):
346 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
347 try:
348 # RDS sockets must be bound explicitly to send or receive data
349 self.cli.bind((HOST, 0))
350 self.cli_addr = self.cli.getsockname()
351 except OSError:
352 # skipTest should not be called here, and will be called in the
353 # server instead
354 pass
355
356 def clientTearDown(self):
357 self.cli.close()
358 self.cli = None
359 ThreadableTest.clientTearDown(self)
360
Guido van Rossum24e4af82002-06-12 19:18:08 +0000361class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000362 """Socket tests for client-server connection.
363
364 self.cli_conn is a client socket connected to the server. The
365 setUp() method guarantees that it is connected to the server.
366 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000367
368 def __init__(self, methodName='runTest'):
369 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
370
371 def setUp(self):
372 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000373 # Indicate explicitly we're ready for the client thread to
374 # proceed and then perform the blocking call to accept
375 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000376 conn, addr = self.serv.accept()
377 self.cli_conn = conn
378
379 def tearDown(self):
380 self.cli_conn.close()
381 self.cli_conn = None
382 ThreadedTCPSocketTest.tearDown(self)
383
384 def clientSetUp(self):
385 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000386 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000387 self.serv_conn = self.cli
388
389 def clientTearDown(self):
390 self.serv_conn.close()
391 self.serv_conn = None
392 ThreadedTCPSocketTest.clientTearDown(self)
393
Dave Cole331708b2004-08-09 04:51:41 +0000394class SocketPairTest(unittest.TestCase, ThreadableTest):
395
396 def __init__(self, methodName='runTest'):
397 unittest.TestCase.__init__(self, methodName=methodName)
398 ThreadableTest.__init__(self)
399
400 def setUp(self):
401 self.serv, self.cli = socket.socketpair()
402
403 def tearDown(self):
404 self.serv.close()
405 self.serv = None
406
407 def clientSetUp(self):
408 pass
409
410 def clientTearDown(self):
411 self.cli.close()
412 self.cli = None
413 ThreadableTest.clientTearDown(self)
414
Tim Peters494aaee2004-08-09 18:54:11 +0000415
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000416# The following classes are used by the sendmsg()/recvmsg() tests.
417# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
418# gives a drop-in replacement for SocketConnectedTest, but different
419# address families can be used, and the attributes serv_addr and
420# cli_addr will be set to the addresses of the endpoints.
421
422class SocketTestBase(unittest.TestCase):
423 """A base class for socket tests.
424
425 Subclasses must provide methods newSocket() to return a new socket
426 and bindSock(sock) to bind it to an unused address.
427
428 Creates a socket self.serv and sets self.serv_addr to its address.
429 """
430
431 def setUp(self):
432 self.serv = self.newSocket()
433 self.bindServer()
434
435 def bindServer(self):
436 """Bind server socket and set self.serv_addr to its address."""
437 self.bindSock(self.serv)
438 self.serv_addr = self.serv.getsockname()
439
440 def tearDown(self):
441 self.serv.close()
442 self.serv = None
443
444
445class SocketListeningTestMixin(SocketTestBase):
446 """Mixin to listen on the server socket."""
447
448 def setUp(self):
449 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100450 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000451
452
453class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
454 ThreadableTest):
455 """Mixin to add client socket and allow client/server tests.
456
457 Client socket is self.cli and its address is self.cli_addr. See
458 ThreadableTest for usage information.
459 """
460
461 def __init__(self, *args, **kwargs):
462 super().__init__(*args, **kwargs)
463 ThreadableTest.__init__(self)
464
465 def clientSetUp(self):
466 self.cli = self.newClientSocket()
467 self.bindClient()
468
469 def newClientSocket(self):
470 """Return a new socket for use as client."""
471 return self.newSocket()
472
473 def bindClient(self):
474 """Bind client socket and set self.cli_addr to its address."""
475 self.bindSock(self.cli)
476 self.cli_addr = self.cli.getsockname()
477
478 def clientTearDown(self):
479 self.cli.close()
480 self.cli = None
481 ThreadableTest.clientTearDown(self)
482
483
484class ConnectedStreamTestMixin(SocketListeningTestMixin,
485 ThreadedSocketTestMixin):
486 """Mixin to allow client/server stream tests with connected client.
487
488 Server's socket representing connection to client is self.cli_conn
489 and client's connection to server is self.serv_conn. (Based on
490 SocketConnectedTest.)
491 """
492
493 def setUp(self):
494 super().setUp()
495 # Indicate explicitly we're ready for the client thread to
496 # proceed and then perform the blocking call to accept
497 self.serverExplicitReady()
498 conn, addr = self.serv.accept()
499 self.cli_conn = conn
500
501 def tearDown(self):
502 self.cli_conn.close()
503 self.cli_conn = None
504 super().tearDown()
505
506 def clientSetUp(self):
507 super().clientSetUp()
508 self.cli.connect(self.serv_addr)
509 self.serv_conn = self.cli
510
511 def clientTearDown(self):
512 self.serv_conn.close()
513 self.serv_conn = None
514 super().clientTearDown()
515
516
517class UnixSocketTestBase(SocketTestBase):
518 """Base class for Unix-domain socket tests."""
519
520 # This class is used for file descriptor passing tests, so we
521 # create the sockets in a private directory so that other users
522 # can't send anything that might be problematic for a privileged
523 # user running the tests.
524
525 def setUp(self):
526 self.dir_path = tempfile.mkdtemp()
527 self.addCleanup(os.rmdir, self.dir_path)
528 super().setUp()
529
530 def bindSock(self, sock):
531 path = tempfile.mktemp(dir=self.dir_path)
532 sock.bind(path)
533 self.addCleanup(support.unlink, path)
534
535class UnixStreamBase(UnixSocketTestBase):
536 """Base class for Unix-domain SOCK_STREAM tests."""
537
538 def newSocket(self):
539 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
540
541
542class InetTestBase(SocketTestBase):
543 """Base class for IPv4 socket tests."""
544
545 host = HOST
546
547 def setUp(self):
548 super().setUp()
549 self.port = self.serv_addr[1]
550
551 def bindSock(self, sock):
552 support.bind_port(sock, host=self.host)
553
554class TCPTestBase(InetTestBase):
555 """Base class for TCP-over-IPv4 tests."""
556
557 def newSocket(self):
558 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
559
560class UDPTestBase(InetTestBase):
561 """Base class for UDP-over-IPv4 tests."""
562
563 def newSocket(self):
564 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
565
566class SCTPStreamBase(InetTestBase):
567 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
568
569 def newSocket(self):
570 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
571 socket.IPPROTO_SCTP)
572
573
574class Inet6TestBase(InetTestBase):
575 """Base class for IPv6 socket tests."""
576
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200577 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000578
579class UDP6TestBase(Inet6TestBase):
580 """Base class for UDP-over-IPv6 tests."""
581
582 def newSocket(self):
583 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
584
585
586# Test-skipping decorators for use with ThreadableTest.
587
588def skipWithClientIf(condition, reason):
589 """Skip decorated test if condition is true, add client_skip decorator.
590
591 If the decorated object is not a class, sets its attribute
592 "client_skip" to a decorator which will return an empty function
593 if the test is to be skipped, or the original function if it is
594 not. This can be used to avoid running the client part of a
595 skipped test when using ThreadableTest.
596 """
597 def client_pass(*args, **kwargs):
598 pass
599 def skipdec(obj):
600 retval = unittest.skip(reason)(obj)
601 if not isinstance(obj, type):
602 retval.client_skip = lambda f: client_pass
603 return retval
604 def noskipdec(obj):
605 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
606 obj.client_skip = lambda f: f
607 return obj
608 return skipdec if condition else noskipdec
609
610
611def requireAttrs(obj, *attributes):
612 """Skip decorated test if obj is missing any of the given attributes.
613
614 Sets client_skip attribute as skipWithClientIf() does.
615 """
616 missing = [name for name in attributes if not hasattr(obj, name)]
617 return skipWithClientIf(
618 missing, "don't have " + ", ".join(name for name in missing))
619
620
621def requireSocket(*args):
622 """Skip decorated test if a socket cannot be created with given arguments.
623
624 When an argument is given as a string, will use the value of that
625 attribute of the socket module, or skip the test if it doesn't
626 exist. Sets client_skip attribute as skipWithClientIf() does.
627 """
628 err = None
629 missing = [obj for obj in args if
630 isinstance(obj, str) and not hasattr(socket, obj)]
631 if missing:
632 err = "don't have " + ", ".join(name for name in missing)
633 else:
634 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
635 for obj in args]
636 try:
637 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200638 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000639 # XXX: check errno?
640 err = str(e)
641 else:
642 s.close()
643 return skipWithClientIf(
644 err is not None,
645 "can't create socket({0}): {1}".format(
646 ", ".join(str(o) for o in args), err))
647
648
Guido van Rossum24e4af82002-06-12 19:18:08 +0000649#######################################################################
650## Begin Tests
651
652class GeneralModuleTests(unittest.TestCase):
653
Ethan Furman7184bac2014-10-14 18:56:53 -0700654 def test_SocketType_is_socketobject(self):
655 import _socket
656 self.assertTrue(socket.SocketType is _socket.socket)
657 s = socket.socket()
658 self.assertIsInstance(s, socket.SocketType)
659 s.close()
660
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000661 def test_repr(self):
662 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200663 with s:
664 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000665 self.assertIn('family=%s' % socket.AF_INET, repr(s))
666 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200667 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200668 self.assertNotIn('raddr', repr(s))
669 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200670 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200671 self.assertIn(str(s.getsockname()), repr(s))
672 self.assertIn('[closed]', repr(s))
673 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000674
Victor Stinnere254e532014-07-26 14:36:55 +0200675 @unittest.skipUnless(_socket is not None, 'need _socket module')
676 def test_csocket_repr(self):
677 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
678 try:
679 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
680 % (s.fileno(), s.family, s.type, s.proto))
681 self.assertEqual(repr(s), expected)
682 finally:
683 s.close()
684 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
685 % (s.family, s.type, s.proto))
686 self.assertEqual(repr(s), expected)
687
Raymond Hettinger027bb632004-05-31 03:09:25 +0000688 def test_weakref(self):
689 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
690 p = proxy(s)
691 self.assertEqual(p.fileno(), s.fileno())
692 s.close()
693 s = None
694 try:
695 p.fileno()
696 except ReferenceError:
697 pass
698 else:
699 self.fail('Socket proxy still exists')
700
Guido van Rossum24e4af82002-06-12 19:18:08 +0000701 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000702 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300703 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200704 with self.assertRaises(OSError, msg=msg % 'OSError'):
705 raise OSError
706 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000707 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200708 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000709 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000710
Ezio Melotti63e42302011-05-07 19:47:48 +0300711 def testSendtoErrors(self):
712 # Testing that sendto doens't masks failures. See #10169.
713 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
714 self.addCleanup(s.close)
715 s.bind(('', 0))
716 sockname = s.getsockname()
717 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300718 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300719 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300720 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400721 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300722 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300723 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300724 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400725 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300726 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300727 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300728 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300729 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300730 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300731 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300732 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400733 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300734 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300735 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300736 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400737 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300738 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300739 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300740 self.assertIn('not NoneType', str(cm.exception))
741 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300742 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300743 self.assertIn('an integer is required', str(cm.exception))
744 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300745 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300746 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300747 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300748 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300749 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300750 self.assertIn('(1 given)', str(cm.exception))
751 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300752 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300753 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300754
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000756 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000757 socket.AF_INET
758 socket.SOCK_STREAM
759 socket.SOCK_DGRAM
760 socket.SOCK_RAW
761 socket.SOCK_RDM
762 socket.SOCK_SEQPACKET
763 socket.SOL_SOCKET
764 socket.SO_REUSEADDR
765
Guido van Rossum654c11e2002-06-13 20:24:17 +0000766 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000767 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000768 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000769 try:
770 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200771 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000772 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600773 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000774 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000775 try:
776 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200777 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000778 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600779 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000780 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000781 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000782 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000783 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000784
Charles-François Natali0cc86852013-09-13 19:53:08 +0200785 def test_host_resolution(self):
786 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
787 '1:1:1:1:1:1:1:1:1']:
788 self.assertRaises(OSError, socket.gethostbyname, addr)
789 self.assertRaises(OSError, socket.gethostbyaddr, addr)
790
791 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
792 self.assertEqual(socket.gethostbyname(addr), addr)
793
794 # we don't test support.HOSTv6 because there's a chance it doesn't have
795 # a matching name entry (e.g. 'ip6-localhost')
796 for host in [support.HOST]:
797 self.assertIn(host, socket.gethostbyaddr(host)[2])
798
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000799 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
800 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
801 def test_sethostname(self):
802 oldhn = socket.gethostname()
803 try:
804 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200805 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000806 if e.errno == errno.EPERM:
807 self.skipTest("test should be run as root")
808 else:
809 raise
810 try:
811 # running test as root!
812 self.assertEqual(socket.gethostname(), 'new')
813 # Should work with bytes objects too
814 socket.sethostname(b'bar')
815 self.assertEqual(socket.gethostname(), 'bar')
816 finally:
817 socket.sethostname(oldhn)
818
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700819 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
820 'socket.if_nameindex() not available.')
821 def testInterfaceNameIndex(self):
822 interfaces = socket.if_nameindex()
823 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200824 self.assertIsInstance(index, int)
825 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700826 # interface indices are non-zero integers
827 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200828 _index = socket.if_nametoindex(name)
829 self.assertIsInstance(_index, int)
830 self.assertEqual(index, _index)
831 _name = socket.if_indextoname(index)
832 self.assertIsInstance(_name, str)
833 self.assertEqual(name, _name)
834
835 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
836 'socket.if_nameindex() not available.')
837 def testInvalidInterfaceNameIndex(self):
838 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200839 self.assertRaises(OSError, socket.if_indextoname, 0)
840 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200841 # test with invalid values
842 self.assertRaises(TypeError, socket.if_nametoindex, 0)
843 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700844
Serhiy Storchaka43767632013-11-03 21:31:38 +0200845 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
846 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000847 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000848 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200849 try:
850 # On some versions, this loses a reference
851 orig = sys.getrefcount(__name__)
852 socket.getnameinfo(__name__,0)
853 except TypeError:
854 if sys.getrefcount(__name__) != orig:
855 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000856
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000858 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000859 try:
860 # On some versions, this crashes the interpreter.
861 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200862 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000863 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000864
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000865 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000866 # This just checks that htons etc. are their own inverse,
867 # when looking at the lower 16 or 32 bits.
868 sizes = {socket.htonl: 32, socket.ntohl: 32,
869 socket.htons: 16, socket.ntohs: 16}
870 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000871 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000872 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
873 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000874
Guido van Rossuma2627af2002-09-14 00:58:46 +0000875 swapped = func(mask)
876 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000877 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000878
Guido van Rossum018919a2007-01-15 00:07:32 +0000879 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000880 good_values = [ 1, 2, 3, 1, 2, 3 ]
881 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000882 for k in good_values:
883 socket.ntohl(k)
884 socket.ntohs(k)
885 socket.htonl(k)
886 socket.htons(k)
887 for k in bad_values:
888 self.assertRaises(OverflowError, socket.ntohl, k)
889 self.assertRaises(OverflowError, socket.ntohs, k)
890 self.assertRaises(OverflowError, socket.htonl, k)
891 self.assertRaises(OverflowError, socket.htons, k)
892
Barry Warsaw11b91a02004-06-28 00:50:43 +0000893 def testGetServBy(self):
894 eq = self.assertEqual
895 # Find one service that exists, then check all the related interfaces.
896 # I've ordered this by protocols that have both a tcp and udp
897 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200898 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200899 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000900 # avoid the 'echo' service on this platform, as there is an
901 # assumption breaking non-standard port/protocol entry
902 services = ('daytime', 'qotd', 'domain')
903 else:
904 services = ('echo', 'daytime', 'domain')
905 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000906 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000907 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000908 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200909 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000910 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000911 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200912 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000913 # Try same call with optional protocol omitted
914 port2 = socket.getservbyname(service)
915 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400916 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000917 try:
918 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200919 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000920 udpport = None
921 else:
922 eq(udpport, port)
923 # Now make sure the lookup by port returns the same service name
924 eq(socket.getservbyport(port2), service)
925 eq(socket.getservbyport(port, 'tcp'), service)
926 if udpport is not None:
927 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000928 # Make sure getservbyport does not accept out of range ports.
929 self.assertRaises(OverflowError, socket.getservbyport, -1)
930 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000932 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000933 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000934 # The default timeout should initially be None
935 self.assertEqual(socket.getdefaulttimeout(), None)
936 s = socket.socket()
937 self.assertEqual(s.gettimeout(), None)
938 s.close()
939
940 # Set the default timeout to 10, and see if it propagates
941 socket.setdefaulttimeout(10)
942 self.assertEqual(socket.getdefaulttimeout(), 10)
943 s = socket.socket()
944 self.assertEqual(s.gettimeout(), 10)
945 s.close()
946
947 # Reset the default timeout to None, and see if it propagates
948 socket.setdefaulttimeout(None)
949 self.assertEqual(socket.getdefaulttimeout(), None)
950 s = socket.socket()
951 self.assertEqual(s.gettimeout(), None)
952 s.close()
953
954 # Check that setting it to an invalid value raises ValueError
955 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
956
957 # Check that setting it to an invalid type raises TypeError
958 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
959
Serhiy Storchaka43767632013-11-03 21:31:38 +0200960 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
961 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000962 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000963 # Test that issue1008086 and issue767150 are fixed.
964 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000965 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
966 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000967
Serhiy Storchaka43767632013-11-03 21:31:38 +0200968 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
969 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000970 def testIPv4toString(self):
971 from socket import inet_aton as f, inet_pton, AF_INET
972 g = lambda a: inet_pton(AF_INET, a)
973
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100974 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200975 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100976 )
977
Ezio Melottib3aedd42010-11-20 19:04:17 +0000978 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
979 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
980 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
981 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
982 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100983 assertInvalid(f, '0.0.0.')
984 assertInvalid(f, '300.0.0.0')
985 assertInvalid(f, 'a.0.0.0')
986 assertInvalid(f, '1.2.3.4.5')
987 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000988
Ezio Melottib3aedd42010-11-20 19:04:17 +0000989 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
990 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
991 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
992 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100993 assertInvalid(g, '0.0.0.')
994 assertInvalid(g, '300.0.0.0')
995 assertInvalid(g, 'a.0.0.0')
996 assertInvalid(g, '1.2.3.4.5')
997 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000998
Serhiy Storchaka43767632013-11-03 21:31:38 +0200999 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1000 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001001 def testIPv6toString(self):
1002 try:
1003 from socket import inet_pton, AF_INET6, has_ipv6
1004 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001005 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001006 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001007 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001008
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001009 if sys.platform == "win32":
1010 try:
1011 inet_pton(AF_INET6, '::')
1012 except OSError as e:
1013 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001014 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001015
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001016 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001017 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001018 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001019 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001020
Ezio Melottib3aedd42010-11-20 19:04:17 +00001021 self.assertEqual(b'\x00' * 16, f('::'))
1022 self.assertEqual(b'\x00' * 16, f('0::0'))
1023 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1024 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001025 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001026 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1027 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001028 self.assertEqual(
1029 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1030 f('ad42:abc::127:0:254:2')
1031 )
1032 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1033 assertInvalid('0x20::')
1034 assertInvalid(':::')
1035 assertInvalid('::0::')
1036 assertInvalid('1::abc::')
1037 assertInvalid('1::abc::def')
1038 assertInvalid('1:2:3:4:5:6:')
1039 assertInvalid('1:2:3:4:5:6')
1040 assertInvalid('1:2:3:4:5:6:7:8:')
1041 assertInvalid('1:2:3:4:5:6:7:8:0')
1042
1043 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1044 f('::254.42.23.64')
1045 )
1046 self.assertEqual(
1047 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1048 f('42::a29b:254.42.23.64')
1049 )
1050 self.assertEqual(
1051 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1052 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1053 )
1054 assertInvalid('255.254.253.252')
1055 assertInvalid('1::260.2.3.0')
1056 assertInvalid('1::0.be.e.0')
1057 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1058 assertInvalid('::1.2.3.4:0')
1059 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001060
Serhiy Storchaka43767632013-11-03 21:31:38 +02001061 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1062 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001063 def testStringToIPv4(self):
1064 from socket import inet_ntoa as f, inet_ntop, AF_INET
1065 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001066 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001067 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001068 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001069
Ezio Melottib3aedd42010-11-20 19:04:17 +00001070 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1071 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1072 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1073 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001074 assertInvalid(f, b'\x00' * 3)
1075 assertInvalid(f, b'\x00' * 5)
1076 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001077 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001078
Ezio Melottib3aedd42010-11-20 19:04:17 +00001079 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1080 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1081 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001082 assertInvalid(g, b'\x00' * 3)
1083 assertInvalid(g, b'\x00' * 5)
1084 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001085 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001086
Serhiy Storchaka43767632013-11-03 21:31:38 +02001087 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1088 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001089 def testStringToIPv6(self):
1090 try:
1091 from socket import inet_ntop, AF_INET6, has_ipv6
1092 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001093 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001094 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001095 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001096
1097 if sys.platform == "win32":
1098 try:
1099 inet_ntop(AF_INET6, b'\x00' * 16)
1100 except OSError as e:
1101 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001102 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001103
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001104 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001105 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001106 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001107 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001108
Ezio Melottib3aedd42010-11-20 19:04:17 +00001109 self.assertEqual('::', f(b'\x00' * 16))
1110 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1111 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001112 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001113 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 +00001114 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001115 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001116
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001117 assertInvalid(b'\x12' * 15)
1118 assertInvalid(b'\x12' * 17)
1119 assertInvalid(b'\x12' * 4)
1120
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001121 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001122
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001123 def testSockName(self):
1124 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001125 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001126 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001127 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001128 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001129 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001130 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1131 # it reasonable to get the host's addr in addition to 0.0.0.0.
1132 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001133 try:
1134 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001135 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001136 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001137 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001138 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001139 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001140
1141 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001142 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001143 # We know a socket should start without reuse==0
1144 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001145 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001146 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001147 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001148
1149 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001150 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001151 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001152 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001153 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1154 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001155 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001156
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001157 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001158 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001159 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1160 sock.settimeout(1)
1161 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001162 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001163
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001164 def testNewAttributes(self):
1165 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001166
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001167 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1168 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001169 if hasattr(socket, 'SOCK_CLOEXEC'):
1170 self.assertIn(sock.type,
1171 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1172 socket.SOCK_STREAM))
1173 else:
1174 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001175 self.assertEqual(sock.proto, 0)
1176 sock.close()
1177
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001178 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001179 sock = socket.socket()
1180 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001181 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001182 big_port = port + 65536
1183 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001184 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1185 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1186 # Since find_unused_port() is inherently subject to race conditions, we
1187 # call it a couple times if necessary.
1188 for i in itertools.count():
1189 port = support.find_unused_port()
1190 try:
1191 sock.bind((HOST, port))
1192 except OSError as e:
1193 if e.errno != errno.EADDRINUSE or i == 5:
1194 raise
1195 else:
1196 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001197
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001198 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001199 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001200 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1201 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1202 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1203 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001204 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1205 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001206 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001207 self.assertRaises(ValueError, s.ioctl, -1, None)
1208 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001209
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001210 def testGetaddrinfo(self):
1211 try:
1212 socket.getaddrinfo('localhost', 80)
1213 except socket.gaierror as err:
1214 if err.errno == socket.EAI_SERVICE:
1215 # see http://bugs.python.org/issue1282647
1216 self.skipTest("buggy libc version")
1217 raise
1218 # len of every sequence is supposed to be == 5
1219 for info in socket.getaddrinfo(HOST, None):
1220 self.assertEqual(len(info), 5)
1221 # host can be a domain name, a string representation of an
1222 # IPv4/v6 address or None
1223 socket.getaddrinfo('localhost', 80)
1224 socket.getaddrinfo('127.0.0.1', 80)
1225 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001226 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001227 socket.getaddrinfo('::1', 80)
1228 # port can be a string service name such as "http", a numeric
1229 # port number or None
1230 socket.getaddrinfo(HOST, "http")
1231 socket.getaddrinfo(HOST, 80)
1232 socket.getaddrinfo(HOST, None)
1233 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001234 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1235 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001236 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001237 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1238 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001239 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001240 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1241 for _, socktype, _, _, _ in infos:
1242 self.assertEqual(socktype, socket.SOCK_STREAM)
1243 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001244 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001245 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1246 # a server willing to support both IPv4 and IPv6 will
1247 # usually do this
1248 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1249 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001250 # test keyword arguments
1251 a = socket.getaddrinfo(HOST, None)
1252 b = socket.getaddrinfo(host=HOST, port=None)
1253 self.assertEqual(a, b)
1254 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1255 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1256 self.assertEqual(a, b)
1257 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1258 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1259 self.assertEqual(a, b)
1260 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1261 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1262 self.assertEqual(a, b)
1263 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1264 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1265 self.assertEqual(a, b)
1266 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1267 socket.AI_PASSIVE)
1268 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1269 type=socket.SOCK_STREAM, proto=0,
1270 flags=socket.AI_PASSIVE)
1271 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001272 # Issue #6697.
1273 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001274
Ned Deilyb24f4812014-02-13 22:50:42 -08001275 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001276 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001277 try:
1278 # The arguments here are undefined and the call may succeed
1279 # or fail. All we care here is that it doesn't segfault.
1280 socket.getaddrinfo("localhost", None, 0, 0, 0,
1281 socket.AI_NUMERICSERV)
1282 except socket.gaierror:
1283 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001284
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001285 def test_getnameinfo(self):
1286 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001287 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001288
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001289 @unittest.skipUnless(support.is_resource_enabled('network'),
1290 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001291 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001292 # Check for internet access before running test (issue #12804).
1293 try:
1294 socket.gethostbyname('python.org')
1295 except socket.gaierror as e:
1296 if e.errno == socket.EAI_NODATA:
1297 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001298 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001299 domain = 'испытание.pythontest.net'
1300 socket.gethostbyname(domain)
1301 socket.gethostbyname_ex(domain)
1302 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001303 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1304 # have a reverse entry yet
1305 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001306
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001307 def check_sendall_interrupted(self, with_timeout):
1308 # socketpair() is not stricly required, but it makes things easier.
1309 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1310 self.skipTest("signal.alarm and socket.socketpair required for this test")
1311 # Our signal handlers clobber the C errno by calling a math function
1312 # with an invalid domain value.
1313 def ok_handler(*args):
1314 self.assertRaises(ValueError, math.acosh, 0)
1315 def raising_handler(*args):
1316 self.assertRaises(ValueError, math.acosh, 0)
1317 1 // 0
1318 c, s = socket.socketpair()
1319 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1320 try:
1321 if with_timeout:
1322 # Just above the one second minimum for signal.alarm
1323 c.settimeout(1.5)
1324 with self.assertRaises(ZeroDivisionError):
1325 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001326 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001327 if with_timeout:
1328 signal.signal(signal.SIGALRM, ok_handler)
1329 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001330 self.assertRaises(socket.timeout, c.sendall,
1331 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001332 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001333 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001334 signal.signal(signal.SIGALRM, old_alarm)
1335 c.close()
1336 s.close()
1337
1338 def test_sendall_interrupted(self):
1339 self.check_sendall_interrupted(False)
1340
1341 def test_sendall_interrupted_with_timeout(self):
1342 self.check_sendall_interrupted(True)
1343
Antoine Pitroue033e062010-10-29 10:38:18 +00001344 def test_dealloc_warn(self):
1345 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1346 r = repr(sock)
1347 with self.assertWarns(ResourceWarning) as cm:
1348 sock = None
1349 support.gc_collect()
1350 self.assertIn(r, str(cm.warning.args[0]))
1351 # An open socket file object gets dereferenced after the socket
1352 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1353 f = sock.makefile('rb')
1354 r = repr(sock)
1355 sock = None
1356 support.gc_collect()
1357 with self.assertWarns(ResourceWarning):
1358 f = None
1359 support.gc_collect()
1360
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001361 def test_name_closed_socketio(self):
1362 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1363 fp = sock.makefile("rb")
1364 fp.close()
1365 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1366
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001367 def test_unusable_closed_socketio(self):
1368 with socket.socket() as sock:
1369 fp = sock.makefile("rb", buffering=0)
1370 self.assertTrue(fp.readable())
1371 self.assertFalse(fp.writable())
1372 self.assertFalse(fp.seekable())
1373 fp.close()
1374 self.assertRaises(ValueError, fp.readable)
1375 self.assertRaises(ValueError, fp.writable)
1376 self.assertRaises(ValueError, fp.seekable)
1377
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001378 def test_pickle(self):
1379 sock = socket.socket()
1380 with sock:
1381 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1382 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001383 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1384 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1385 self.assertEqual(family, socket.AF_INET)
1386 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1387 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001388
Serhiy Storchaka78980432013-01-15 01:12:17 +02001389 def test_listen_backlog(self):
1390 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001391 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1392 srv.bind((HOST, 0))
1393 srv.listen(backlog)
1394
1395 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001396 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001397 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001398
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001399 @support.cpython_only
1400 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001401 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001402 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001403 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1404 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001405 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001406 srv.close()
1407
Charles-François Natali42663332012-01-02 15:57:30 +01001408 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001409 def test_flowinfo(self):
1410 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001411 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001412 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001413 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001414
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001415 def test_str_for_enums(self):
1416 # Make sure that the AF_* and SOCK_* constants have enum-like string
1417 # reprs.
1418 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1419 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001420 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001421
1422 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1423 def test_uknown_socket_family_repr(self):
1424 # Test that when created with a family that's not one of the known
1425 # AF_*/SOCK_* constants, socket.family just returns the number.
1426 #
1427 # To do this we fool socket.socket into believing it already has an
1428 # open fd because on this path it doesn't actually verify the family and
1429 # type and populates the socket object.
1430 #
1431 # On Windows this trick won't work, so the test is skipped.
1432 fd, _ = tempfile.mkstemp()
1433 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1434 self.assertEqual(s.family, 42424)
1435 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001436
Charles-François Natali47413c12011-10-06 19:47:44 +02001437@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1438class BasicCANTest(unittest.TestCase):
1439
1440 def testCrucialConstants(self):
1441 socket.AF_CAN
1442 socket.PF_CAN
1443 socket.CAN_RAW
1444
Charles-François Natali773e42d2013-02-05 19:42:01 +01001445 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1446 'socket.CAN_BCM required for this test.')
1447 def testBCMConstants(self):
1448 socket.CAN_BCM
1449
1450 # opcodes
1451 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1452 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1453 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1454 socket.CAN_BCM_TX_SEND # send one CAN frame
1455 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1456 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1457 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1458 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1459 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1460 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1461 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1462 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1463
Charles-François Natali47413c12011-10-06 19:47:44 +02001464 def testCreateSocket(self):
1465 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1466 pass
1467
Charles-François Natali773e42d2013-02-05 19:42:01 +01001468 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1469 'socket.CAN_BCM required for this test.')
1470 def testCreateBCMSocket(self):
1471 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1472 pass
1473
Charles-François Natali47413c12011-10-06 19:47:44 +02001474 def testBindAny(self):
1475 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1476 s.bind(('', ))
1477
1478 def testTooLongInterfaceName(self):
1479 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1480 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001481 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001482 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001483
1484 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1485 'socket.CAN_RAW_LOOPBACK required for this test.')
1486 def testLoopback(self):
1487 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1488 for loopback in (0, 1):
1489 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1490 loopback)
1491 self.assertEqual(loopback,
1492 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1493
1494 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1495 'socket.CAN_RAW_FILTER required for this test.')
1496 def testFilter(self):
1497 can_id, can_mask = 0x200, 0x700
1498 can_filter = struct.pack("=II", can_id, can_mask)
1499 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1500 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1501 self.assertEqual(can_filter,
1502 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001503 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001504
1505
1506@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001507@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001508class CANTest(ThreadedCANSocketTest):
1509
Charles-François Natali47413c12011-10-06 19:47:44 +02001510 def __init__(self, methodName='runTest'):
1511 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1512
1513 @classmethod
1514 def build_can_frame(cls, can_id, data):
1515 """Build a CAN frame."""
1516 can_dlc = len(data)
1517 data = data.ljust(8, b'\x00')
1518 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1519
1520 @classmethod
1521 def dissect_can_frame(cls, frame):
1522 """Dissect a CAN frame."""
1523 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1524 return (can_id, can_dlc, data[:can_dlc])
1525
1526 def testSendFrame(self):
1527 cf, addr = self.s.recvfrom(self.bufsize)
1528 self.assertEqual(self.cf, cf)
1529 self.assertEqual(addr[0], self.interface)
1530 self.assertEqual(addr[1], socket.AF_CAN)
1531
1532 def _testSendFrame(self):
1533 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1534 self.cli.send(self.cf)
1535
1536 def testSendMaxFrame(self):
1537 cf, addr = self.s.recvfrom(self.bufsize)
1538 self.assertEqual(self.cf, cf)
1539
1540 def _testSendMaxFrame(self):
1541 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1542 self.cli.send(self.cf)
1543
1544 def testSendMultiFrames(self):
1545 cf, addr = self.s.recvfrom(self.bufsize)
1546 self.assertEqual(self.cf1, cf)
1547
1548 cf, addr = self.s.recvfrom(self.bufsize)
1549 self.assertEqual(self.cf2, cf)
1550
1551 def _testSendMultiFrames(self):
1552 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1553 self.cli.send(self.cf1)
1554
1555 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1556 self.cli.send(self.cf2)
1557
Charles-François Natali773e42d2013-02-05 19:42:01 +01001558 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1559 'socket.CAN_BCM required for this test.')
1560 def _testBCM(self):
1561 cf, addr = self.cli.recvfrom(self.bufsize)
1562 self.assertEqual(self.cf, cf)
1563 can_id, can_dlc, data = self.dissect_can_frame(cf)
1564 self.assertEqual(self.can_id, can_id)
1565 self.assertEqual(self.data, data)
1566
1567 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1568 'socket.CAN_BCM required for this test.')
1569 def testBCM(self):
1570 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1571 self.addCleanup(bcm.close)
1572 bcm.connect((self.interface,))
1573 self.can_id = 0x123
1574 self.data = bytes([0xc0, 0xff, 0xee])
1575 self.cf = self.build_can_frame(self.can_id, self.data)
1576 opcode = socket.CAN_BCM_TX_SEND
1577 flags = 0
1578 count = 0
1579 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1580 bcm_can_id = 0x0222
1581 nframes = 1
1582 assert len(self.cf) == 16
1583 header = struct.pack(self.bcm_cmd_msg_fmt,
1584 opcode,
1585 flags,
1586 count,
1587 ival1_seconds,
1588 ival1_usec,
1589 ival2_seconds,
1590 ival2_usec,
1591 bcm_can_id,
1592 nframes,
1593 )
1594 header_plus_frame = header + self.cf
1595 bytes_sent = bcm.send(header_plus_frame)
1596 self.assertEqual(bytes_sent, len(header_plus_frame))
1597
Charles-François Natali47413c12011-10-06 19:47:44 +02001598
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001599@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1600class BasicRDSTest(unittest.TestCase):
1601
1602 def testCrucialConstants(self):
1603 socket.AF_RDS
1604 socket.PF_RDS
1605
1606 def testCreateSocket(self):
1607 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1608 pass
1609
1610 def testSocketBufferSize(self):
1611 bufsize = 16384
1612 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1613 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1614 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1615
1616
1617@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1618@unittest.skipUnless(thread, 'Threading required for this test.')
1619class RDSTest(ThreadedRDSSocketTest):
1620
1621 def __init__(self, methodName='runTest'):
1622 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1623
Charles-François Natali240c55f2011-11-10 20:33:36 +01001624 def setUp(self):
1625 super().setUp()
1626 self.evt = threading.Event()
1627
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001628 def testSendAndRecv(self):
1629 data, addr = self.serv.recvfrom(self.bufsize)
1630 self.assertEqual(self.data, data)
1631 self.assertEqual(self.cli_addr, addr)
1632
1633 def _testSendAndRecv(self):
1634 self.data = b'spam'
1635 self.cli.sendto(self.data, 0, (HOST, self.port))
1636
1637 def testPeek(self):
1638 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1639 self.assertEqual(self.data, data)
1640 data, addr = self.serv.recvfrom(self.bufsize)
1641 self.assertEqual(self.data, data)
1642
1643 def _testPeek(self):
1644 self.data = b'spam'
1645 self.cli.sendto(self.data, 0, (HOST, self.port))
1646
1647 @requireAttrs(socket.socket, 'recvmsg')
1648 def testSendAndRecvMsg(self):
1649 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1650 self.assertEqual(self.data, data)
1651
1652 @requireAttrs(socket.socket, 'sendmsg')
1653 def _testSendAndRecvMsg(self):
1654 self.data = b'hello ' * 10
1655 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1656
1657 def testSendAndRecvMulti(self):
1658 data, addr = self.serv.recvfrom(self.bufsize)
1659 self.assertEqual(self.data1, data)
1660
1661 data, addr = self.serv.recvfrom(self.bufsize)
1662 self.assertEqual(self.data2, data)
1663
1664 def _testSendAndRecvMulti(self):
1665 self.data1 = b'bacon'
1666 self.cli.sendto(self.data1, 0, (HOST, self.port))
1667
1668 self.data2 = b'egg'
1669 self.cli.sendto(self.data2, 0, (HOST, self.port))
1670
1671 def testSelect(self):
1672 r, w, x = select.select([self.serv], [], [], 3.0)
1673 self.assertIn(self.serv, r)
1674 data, addr = self.serv.recvfrom(self.bufsize)
1675 self.assertEqual(self.data, data)
1676
1677 def _testSelect(self):
1678 self.data = b'select'
1679 self.cli.sendto(self.data, 0, (HOST, self.port))
1680
1681 def testCongestion(self):
1682 # wait until the sender is done
1683 self.evt.wait()
1684
1685 def _testCongestion(self):
1686 # test the behavior in case of congestion
1687 self.data = b'fill'
1688 self.cli.setblocking(False)
1689 try:
1690 # try to lower the receiver's socket buffer size
1691 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1692 except OSError:
1693 pass
1694 with self.assertRaises(OSError) as cm:
1695 try:
1696 # fill the receiver's socket buffer
1697 while True:
1698 self.cli.sendto(self.data, 0, (HOST, self.port))
1699 finally:
1700 # signal the receiver we're done
1701 self.evt.set()
1702 # sendto() should have failed with ENOBUFS
1703 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1704 # and we should have received a congestion notification through poll
1705 r, w, x = select.select([self.serv], [], [], 3.0)
1706 self.assertIn(self.serv, r)
1707
1708
Victor Stinner45df8202010-04-28 22:31:17 +00001709@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001710class BasicTCPTest(SocketConnectedTest):
1711
1712 def __init__(self, methodName='runTest'):
1713 SocketConnectedTest.__init__(self, methodName=methodName)
1714
1715 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001716 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001717 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001718 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001719
1720 def _testRecv(self):
1721 self.serv_conn.send(MSG)
1722
1723 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001724 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001725 seg1 = self.cli_conn.recv(len(MSG) - 3)
1726 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001727 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001728 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001729
1730 def _testOverFlowRecv(self):
1731 self.serv_conn.send(MSG)
1732
1733 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001734 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001735 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001736 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001737
1738 def _testRecvFrom(self):
1739 self.serv_conn.send(MSG)
1740
1741 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001742 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001743 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1744 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001745 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001746 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001747
1748 def _testOverFlowRecvFrom(self):
1749 self.serv_conn.send(MSG)
1750
1751 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001752 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001753 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001754 while 1:
1755 read = self.cli_conn.recv(1024)
1756 if not read:
1757 break
Guido van Rossume531e292002-08-08 20:28:34 +00001758 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001759 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001760
1761 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001762 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001763 self.serv_conn.sendall(big_chunk)
1764
1765 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001766 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001767 fd = self.cli_conn.fileno()
1768 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001769 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001770 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001771 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001772 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001773
1774 def _testFromFd(self):
1775 self.serv_conn.send(MSG)
1776
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001777 def testDup(self):
1778 # Testing dup()
1779 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001780 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001781 msg = sock.recv(1024)
1782 self.assertEqual(msg, MSG)
1783
1784 def _testDup(self):
1785 self.serv_conn.send(MSG)
1786
Guido van Rossum24e4af82002-06-12 19:18:08 +00001787 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001788 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001789 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001790 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001791 # wait for _testShutdown to finish: on OS X, when the server
1792 # closes the connection the client also becomes disconnected,
1793 # and the client's shutdown call will fail. (Issue #4397.)
1794 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001795
1796 def _testShutdown(self):
1797 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001798 self.serv_conn.shutdown(2)
1799
1800 testShutdown_overflow = support.cpython_only(testShutdown)
1801
1802 @support.cpython_only
1803 def _testShutdown_overflow(self):
1804 import _testcapi
1805 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001806 # Issue 15989
1807 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1808 _testcapi.INT_MAX + 1)
1809 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1810 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001811 self.serv_conn.shutdown(2)
1812
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001813 def testDetach(self):
1814 # Testing detach()
1815 fileno = self.cli_conn.fileno()
1816 f = self.cli_conn.detach()
1817 self.assertEqual(f, fileno)
1818 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001819 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001820 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001821 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001822 # ...but we can create another socket using the (still open)
1823 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001824 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001825 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001826 msg = sock.recv(1024)
1827 self.assertEqual(msg, MSG)
1828
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001829 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001830 self.serv_conn.send(MSG)
1831
Victor Stinner45df8202010-04-28 22:31:17 +00001832@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001833class BasicUDPTest(ThreadedUDPSocketTest):
1834
1835 def __init__(self, methodName='runTest'):
1836 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1837
1838 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001839 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001840 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001841 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001842
1843 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001844 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001845
Guido van Rossum1c938012002-06-12 21:17:20 +00001846 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001847 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001848 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001849 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001850
Guido van Rossum1c938012002-06-12 21:17:20 +00001851 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001852 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001853
Guido van Rossumd8faa362007-04-27 19:54:29 +00001854 def testRecvFromNegative(self):
1855 # Negative lengths passed to recvfrom should give ValueError.
1856 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1857
1858 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001859 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001860
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001861# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1862# same test code is used with different families and types of socket
1863# (e.g. stream, datagram), and tests using recvmsg() are repeated
1864# using recvmsg_into().
1865#
1866# The generic test classes such as SendmsgTests and
1867# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1868# supplied with sockets cli_sock and serv_sock representing the
1869# client's and the server's end of the connection respectively, and
1870# attributes cli_addr and serv_addr holding their (numeric where
1871# appropriate) addresses.
1872#
1873# The final concrete test classes combine these with subclasses of
1874# SocketTestBase which set up client and server sockets of a specific
1875# type, and with subclasses of SendrecvmsgBase such as
1876# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1877# sockets to cli_sock and serv_sock and override the methods and
1878# attributes of SendrecvmsgBase to fill in destination addresses if
1879# needed when sending, check for specific flags in msg_flags, etc.
1880#
1881# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1882# recvmsg_into().
1883
1884# XXX: like the other datagram (UDP) tests in this module, the code
1885# here assumes that datagram delivery on the local machine will be
1886# reliable.
1887
1888class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1889 # Base class for sendmsg()/recvmsg() tests.
1890
1891 # Time in seconds to wait before considering a test failed, or
1892 # None for no timeout. Not all tests actually set a timeout.
1893 fail_timeout = 3.0
1894
1895 def setUp(self):
1896 self.misc_event = threading.Event()
1897 super().setUp()
1898
1899 def sendToServer(self, msg):
1900 # Send msg to the server.
1901 return self.cli_sock.send(msg)
1902
1903 # Tuple of alternative default arguments for sendmsg() when called
1904 # via sendmsgToServer() (e.g. to include a destination address).
1905 sendmsg_to_server_defaults = ()
1906
1907 def sendmsgToServer(self, *args):
1908 # Call sendmsg() on self.cli_sock with the given arguments,
1909 # filling in any arguments which are not supplied with the
1910 # corresponding items of self.sendmsg_to_server_defaults, if
1911 # any.
1912 return self.cli_sock.sendmsg(
1913 *(args + self.sendmsg_to_server_defaults[len(args):]))
1914
1915 def doRecvmsg(self, sock, bufsize, *args):
1916 # Call recvmsg() on sock with given arguments and return its
1917 # result. Should be used for tests which can use either
1918 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1919 # this method with one which emulates it using recvmsg_into(),
1920 # thus allowing the same test to be used for both methods.
1921 result = sock.recvmsg(bufsize, *args)
1922 self.registerRecvmsgResult(result)
1923 return result
1924
1925 def registerRecvmsgResult(self, result):
1926 # Called by doRecvmsg() with the return value of recvmsg() or
1927 # recvmsg_into(). Can be overridden to arrange cleanup based
1928 # on the returned ancillary data, for instance.
1929 pass
1930
1931 def checkRecvmsgAddress(self, addr1, addr2):
1932 # Called to compare the received address with the address of
1933 # the peer.
1934 self.assertEqual(addr1, addr2)
1935
1936 # Flags that are normally unset in msg_flags
1937 msg_flags_common_unset = 0
1938 for name in ("MSG_CTRUNC", "MSG_OOB"):
1939 msg_flags_common_unset |= getattr(socket, name, 0)
1940
1941 # Flags that are normally set
1942 msg_flags_common_set = 0
1943
1944 # Flags set when a complete record has been received (e.g. MSG_EOR
1945 # for SCTP)
1946 msg_flags_eor_indicator = 0
1947
1948 # Flags set when a complete record has not been received
1949 # (e.g. MSG_TRUNC for datagram sockets)
1950 msg_flags_non_eor_indicator = 0
1951
1952 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1953 # Method to check the value of msg_flags returned by recvmsg[_into]().
1954 #
1955 # Checks that all bits in msg_flags_common_set attribute are
1956 # set in "flags" and all bits in msg_flags_common_unset are
1957 # unset.
1958 #
1959 # The "eor" argument specifies whether the flags should
1960 # indicate that a full record (or datagram) has been received.
1961 # If "eor" is None, no checks are done; otherwise, checks
1962 # that:
1963 #
1964 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1965 # set and all bits in msg_flags_non_eor_indicator are unset
1966 #
1967 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1968 # are set and all bits in msg_flags_eor_indicator are unset
1969 #
1970 # If "checkset" and/or "checkunset" are supplied, they require
1971 # the given bits to be set or unset respectively, overriding
1972 # what the attributes require for those bits.
1973 #
1974 # If any bits are set in "ignore", they will not be checked,
1975 # regardless of the other inputs.
1976 #
1977 # Will raise Exception if the inputs require a bit to be both
1978 # set and unset, and it is not ignored.
1979
1980 defaultset = self.msg_flags_common_set
1981 defaultunset = self.msg_flags_common_unset
1982
1983 if eor:
1984 defaultset |= self.msg_flags_eor_indicator
1985 defaultunset |= self.msg_flags_non_eor_indicator
1986 elif eor is not None:
1987 defaultset |= self.msg_flags_non_eor_indicator
1988 defaultunset |= self.msg_flags_eor_indicator
1989
1990 # Function arguments override defaults
1991 defaultset &= ~checkunset
1992 defaultunset &= ~checkset
1993
1994 # Merge arguments with remaining defaults, and check for conflicts
1995 checkset |= defaultset
1996 checkunset |= defaultunset
1997 inboth = checkset & checkunset & ~ignore
1998 if inboth:
1999 raise Exception("contradictory set, unset requirements for flags "
2000 "{0:#x}".format(inboth))
2001
2002 # Compare with given msg_flags value
2003 mask = (checkset | checkunset) & ~ignore
2004 self.assertEqual(flags & mask, checkset & mask)
2005
2006
2007class RecvmsgIntoMixin(SendrecvmsgBase):
2008 # Mixin to implement doRecvmsg() using recvmsg_into().
2009
2010 def doRecvmsg(self, sock, bufsize, *args):
2011 buf = bytearray(bufsize)
2012 result = sock.recvmsg_into([buf], *args)
2013 self.registerRecvmsgResult(result)
2014 self.assertGreaterEqual(result[0], 0)
2015 self.assertLessEqual(result[0], bufsize)
2016 return (bytes(buf[:result[0]]),) + result[1:]
2017
2018
2019class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2020 # Defines flags to be checked in msg_flags for datagram sockets.
2021
2022 @property
2023 def msg_flags_non_eor_indicator(self):
2024 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2025
2026
2027class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2028 # Defines flags to be checked in msg_flags for SCTP sockets.
2029
2030 @property
2031 def msg_flags_eor_indicator(self):
2032 return super().msg_flags_eor_indicator | socket.MSG_EOR
2033
2034
2035class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2036 # Base class for tests on connectionless-mode sockets. Users must
2037 # supply sockets on attributes cli and serv to be mapped to
2038 # cli_sock and serv_sock respectively.
2039
2040 @property
2041 def serv_sock(self):
2042 return self.serv
2043
2044 @property
2045 def cli_sock(self):
2046 return self.cli
2047
2048 @property
2049 def sendmsg_to_server_defaults(self):
2050 return ([], [], 0, self.serv_addr)
2051
2052 def sendToServer(self, msg):
2053 return self.cli_sock.sendto(msg, self.serv_addr)
2054
2055
2056class SendrecvmsgConnectedBase(SendrecvmsgBase):
2057 # Base class for tests on connected sockets. Users must supply
2058 # sockets on attributes serv_conn and cli_conn (representing the
2059 # connections *to* the server and the client), to be mapped to
2060 # cli_sock and serv_sock respectively.
2061
2062 @property
2063 def serv_sock(self):
2064 return self.cli_conn
2065
2066 @property
2067 def cli_sock(self):
2068 return self.serv_conn
2069
2070 def checkRecvmsgAddress(self, addr1, addr2):
2071 # Address is currently "unspecified" for a connected socket,
2072 # so we don't examine it
2073 pass
2074
2075
2076class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2077 # Base class to set a timeout on server's socket.
2078
2079 def setUp(self):
2080 super().setUp()
2081 self.serv_sock.settimeout(self.fail_timeout)
2082
2083
2084class SendmsgTests(SendrecvmsgServerTimeoutBase):
2085 # Tests for sendmsg() which can use any socket type and do not
2086 # involve recvmsg() or recvmsg_into().
2087
2088 def testSendmsg(self):
2089 # Send a simple message with sendmsg().
2090 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2091
2092 def _testSendmsg(self):
2093 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2094
2095 def testSendmsgDataGenerator(self):
2096 # Send from buffer obtained from a generator (not a sequence).
2097 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2098
2099 def _testSendmsgDataGenerator(self):
2100 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2101 len(MSG))
2102
2103 def testSendmsgAncillaryGenerator(self):
2104 # Gather (empty) ancillary data from a generator.
2105 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2106
2107 def _testSendmsgAncillaryGenerator(self):
2108 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2109 len(MSG))
2110
2111 def testSendmsgArray(self):
2112 # Send data from an array instead of the usual bytes object.
2113 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2114
2115 def _testSendmsgArray(self):
2116 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2117 len(MSG))
2118
2119 def testSendmsgGather(self):
2120 # Send message data from more than one buffer (gather write).
2121 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2122
2123 def _testSendmsgGather(self):
2124 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2125
2126 def testSendmsgBadArgs(self):
2127 # Check that sendmsg() rejects invalid arguments.
2128 self.assertEqual(self.serv_sock.recv(1000), b"done")
2129
2130 def _testSendmsgBadArgs(self):
2131 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2132 self.assertRaises(TypeError, self.sendmsgToServer,
2133 b"not in an iterable")
2134 self.assertRaises(TypeError, self.sendmsgToServer,
2135 object())
2136 self.assertRaises(TypeError, self.sendmsgToServer,
2137 [object()])
2138 self.assertRaises(TypeError, self.sendmsgToServer,
2139 [MSG, object()])
2140 self.assertRaises(TypeError, self.sendmsgToServer,
2141 [MSG], object())
2142 self.assertRaises(TypeError, self.sendmsgToServer,
2143 [MSG], [], object())
2144 self.assertRaises(TypeError, self.sendmsgToServer,
2145 [MSG], [], 0, object())
2146 self.sendToServer(b"done")
2147
2148 def testSendmsgBadCmsg(self):
2149 # Check that invalid ancillary data items are rejected.
2150 self.assertEqual(self.serv_sock.recv(1000), b"done")
2151
2152 def _testSendmsgBadCmsg(self):
2153 self.assertRaises(TypeError, self.sendmsgToServer,
2154 [MSG], [object()])
2155 self.assertRaises(TypeError, self.sendmsgToServer,
2156 [MSG], [(object(), 0, b"data")])
2157 self.assertRaises(TypeError, self.sendmsgToServer,
2158 [MSG], [(0, object(), b"data")])
2159 self.assertRaises(TypeError, self.sendmsgToServer,
2160 [MSG], [(0, 0, object())])
2161 self.assertRaises(TypeError, self.sendmsgToServer,
2162 [MSG], [(0, 0)])
2163 self.assertRaises(TypeError, self.sendmsgToServer,
2164 [MSG], [(0, 0, b"data", 42)])
2165 self.sendToServer(b"done")
2166
2167 @requireAttrs(socket, "CMSG_SPACE")
2168 def testSendmsgBadMultiCmsg(self):
2169 # Check that invalid ancillary data items are rejected when
2170 # more than one item is present.
2171 self.assertEqual(self.serv_sock.recv(1000), b"done")
2172
2173 @testSendmsgBadMultiCmsg.client_skip
2174 def _testSendmsgBadMultiCmsg(self):
2175 self.assertRaises(TypeError, self.sendmsgToServer,
2176 [MSG], [0, 0, b""])
2177 self.assertRaises(TypeError, self.sendmsgToServer,
2178 [MSG], [(0, 0, b""), object()])
2179 self.sendToServer(b"done")
2180
2181 def testSendmsgExcessCmsgReject(self):
2182 # Check that sendmsg() rejects excess ancillary data items
2183 # when the number that can be sent is limited.
2184 self.assertEqual(self.serv_sock.recv(1000), b"done")
2185
2186 def _testSendmsgExcessCmsgReject(self):
2187 if not hasattr(socket, "CMSG_SPACE"):
2188 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002189 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002190 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2191 self.assertIsNone(cm.exception.errno)
2192 self.sendToServer(b"done")
2193
2194 def testSendmsgAfterClose(self):
2195 # Check that sendmsg() fails on a closed socket.
2196 pass
2197
2198 def _testSendmsgAfterClose(self):
2199 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002200 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002201
2202
2203class SendmsgStreamTests(SendmsgTests):
2204 # Tests for sendmsg() which require a stream socket and do not
2205 # involve recvmsg() or recvmsg_into().
2206
2207 def testSendmsgExplicitNoneAddr(self):
2208 # Check that peer address can be specified as None.
2209 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2210
2211 def _testSendmsgExplicitNoneAddr(self):
2212 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2213
2214 def testSendmsgTimeout(self):
2215 # Check that timeout works with sendmsg().
2216 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2217 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2218
2219 def _testSendmsgTimeout(self):
2220 try:
2221 self.cli_sock.settimeout(0.03)
2222 with self.assertRaises(socket.timeout):
2223 while True:
2224 self.sendmsgToServer([b"a"*512])
2225 finally:
2226 self.misc_event.set()
2227
2228 # XXX: would be nice to have more tests for sendmsg flags argument.
2229
2230 # Linux supports MSG_DONTWAIT when sending, but in general, it
2231 # only works when receiving. Could add other platforms if they
2232 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002233 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002234 "MSG_DONTWAIT not known to work on this platform when "
2235 "sending")
2236 def testSendmsgDontWait(self):
2237 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2238 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2239 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2240
2241 @testSendmsgDontWait.client_skip
2242 def _testSendmsgDontWait(self):
2243 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002244 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002245 while True:
2246 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2247 self.assertIn(cm.exception.errno,
2248 (errno.EAGAIN, errno.EWOULDBLOCK))
2249 finally:
2250 self.misc_event.set()
2251
2252
2253class SendmsgConnectionlessTests(SendmsgTests):
2254 # Tests for sendmsg() which require a connectionless-mode
2255 # (e.g. datagram) socket, and do not involve recvmsg() or
2256 # recvmsg_into().
2257
2258 def testSendmsgNoDestAddr(self):
2259 # Check that sendmsg() fails when no destination address is
2260 # given for unconnected socket.
2261 pass
2262
2263 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002264 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002265 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002266 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002267 [MSG], [], 0, None)
2268
2269
2270class RecvmsgGenericTests(SendrecvmsgBase):
2271 # Tests for recvmsg() which can also be emulated using
2272 # recvmsg_into(), and can use any socket type.
2273
2274 def testRecvmsg(self):
2275 # Receive a simple message with recvmsg[_into]().
2276 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2277 self.assertEqual(msg, MSG)
2278 self.checkRecvmsgAddress(addr, self.cli_addr)
2279 self.assertEqual(ancdata, [])
2280 self.checkFlags(flags, eor=True)
2281
2282 def _testRecvmsg(self):
2283 self.sendToServer(MSG)
2284
2285 def testRecvmsgExplicitDefaults(self):
2286 # Test recvmsg[_into]() with default arguments provided explicitly.
2287 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2288 len(MSG), 0, 0)
2289 self.assertEqual(msg, MSG)
2290 self.checkRecvmsgAddress(addr, self.cli_addr)
2291 self.assertEqual(ancdata, [])
2292 self.checkFlags(flags, eor=True)
2293
2294 def _testRecvmsgExplicitDefaults(self):
2295 self.sendToServer(MSG)
2296
2297 def testRecvmsgShorter(self):
2298 # Receive a message smaller than buffer.
2299 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2300 len(MSG) + 42)
2301 self.assertEqual(msg, MSG)
2302 self.checkRecvmsgAddress(addr, self.cli_addr)
2303 self.assertEqual(ancdata, [])
2304 self.checkFlags(flags, eor=True)
2305
2306 def _testRecvmsgShorter(self):
2307 self.sendToServer(MSG)
2308
Charles-François Natali8619cd72011-10-03 19:43:15 +02002309 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2310 # datagram is received (issue #13001).
2311 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002312 def testRecvmsgTrunc(self):
2313 # Receive part of message, check for truncation indicators.
2314 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2315 len(MSG) - 3)
2316 self.assertEqual(msg, MSG[:-3])
2317 self.checkRecvmsgAddress(addr, self.cli_addr)
2318 self.assertEqual(ancdata, [])
2319 self.checkFlags(flags, eor=False)
2320
Charles-François Natali8619cd72011-10-03 19:43:15 +02002321 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002322 def _testRecvmsgTrunc(self):
2323 self.sendToServer(MSG)
2324
2325 def testRecvmsgShortAncillaryBuf(self):
2326 # Test ancillary data buffer too small to hold any ancillary data.
2327 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2328 len(MSG), 1)
2329 self.assertEqual(msg, MSG)
2330 self.checkRecvmsgAddress(addr, self.cli_addr)
2331 self.assertEqual(ancdata, [])
2332 self.checkFlags(flags, eor=True)
2333
2334 def _testRecvmsgShortAncillaryBuf(self):
2335 self.sendToServer(MSG)
2336
2337 def testRecvmsgLongAncillaryBuf(self):
2338 # Test large ancillary data buffer.
2339 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2340 len(MSG), 10240)
2341 self.assertEqual(msg, MSG)
2342 self.checkRecvmsgAddress(addr, self.cli_addr)
2343 self.assertEqual(ancdata, [])
2344 self.checkFlags(flags, eor=True)
2345
2346 def _testRecvmsgLongAncillaryBuf(self):
2347 self.sendToServer(MSG)
2348
2349 def testRecvmsgAfterClose(self):
2350 # Check that recvmsg[_into]() fails on a closed socket.
2351 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002352 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002353
2354 def _testRecvmsgAfterClose(self):
2355 pass
2356
2357 def testRecvmsgTimeout(self):
2358 # Check that timeout works.
2359 try:
2360 self.serv_sock.settimeout(0.03)
2361 self.assertRaises(socket.timeout,
2362 self.doRecvmsg, self.serv_sock, len(MSG))
2363 finally:
2364 self.misc_event.set()
2365
2366 def _testRecvmsgTimeout(self):
2367 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2368
2369 @requireAttrs(socket, "MSG_PEEK")
2370 def testRecvmsgPeek(self):
2371 # Check that MSG_PEEK in flags enables examination of pending
2372 # data without consuming it.
2373
2374 # Receive part of data with MSG_PEEK.
2375 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2376 len(MSG) - 3, 0,
2377 socket.MSG_PEEK)
2378 self.assertEqual(msg, MSG[:-3])
2379 self.checkRecvmsgAddress(addr, self.cli_addr)
2380 self.assertEqual(ancdata, [])
2381 # Ignoring MSG_TRUNC here (so this test is the same for stream
2382 # and datagram sockets). Some wording in POSIX seems to
2383 # suggest that it needn't be set when peeking, but that may
2384 # just be a slip.
2385 self.checkFlags(flags, eor=False,
2386 ignore=getattr(socket, "MSG_TRUNC", 0))
2387
2388 # Receive all data with MSG_PEEK.
2389 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2390 len(MSG), 0,
2391 socket.MSG_PEEK)
2392 self.assertEqual(msg, MSG)
2393 self.checkRecvmsgAddress(addr, self.cli_addr)
2394 self.assertEqual(ancdata, [])
2395 self.checkFlags(flags, eor=True)
2396
2397 # Check that the same data can still be received normally.
2398 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2399 self.assertEqual(msg, MSG)
2400 self.checkRecvmsgAddress(addr, self.cli_addr)
2401 self.assertEqual(ancdata, [])
2402 self.checkFlags(flags, eor=True)
2403
2404 @testRecvmsgPeek.client_skip
2405 def _testRecvmsgPeek(self):
2406 self.sendToServer(MSG)
2407
2408 @requireAttrs(socket.socket, "sendmsg")
2409 def testRecvmsgFromSendmsg(self):
2410 # Test receiving with recvmsg[_into]() when message is sent
2411 # using sendmsg().
2412 self.serv_sock.settimeout(self.fail_timeout)
2413 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2414 self.assertEqual(msg, MSG)
2415 self.checkRecvmsgAddress(addr, self.cli_addr)
2416 self.assertEqual(ancdata, [])
2417 self.checkFlags(flags, eor=True)
2418
2419 @testRecvmsgFromSendmsg.client_skip
2420 def _testRecvmsgFromSendmsg(self):
2421 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2422
2423
2424class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2425 # Tests which require a stream socket and can use either recvmsg()
2426 # or recvmsg_into().
2427
2428 def testRecvmsgEOF(self):
2429 # Receive end-of-stream indicator (b"", peer socket closed).
2430 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2431 self.assertEqual(msg, b"")
2432 self.checkRecvmsgAddress(addr, self.cli_addr)
2433 self.assertEqual(ancdata, [])
2434 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2435
2436 def _testRecvmsgEOF(self):
2437 self.cli_sock.close()
2438
2439 def testRecvmsgOverflow(self):
2440 # Receive a message in more than one chunk.
2441 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2442 len(MSG) - 3)
2443 self.checkRecvmsgAddress(addr, self.cli_addr)
2444 self.assertEqual(ancdata, [])
2445 self.checkFlags(flags, eor=False)
2446
2447 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2448 self.checkRecvmsgAddress(addr, self.cli_addr)
2449 self.assertEqual(ancdata, [])
2450 self.checkFlags(flags, eor=True)
2451
2452 msg = seg1 + seg2
2453 self.assertEqual(msg, MSG)
2454
2455 def _testRecvmsgOverflow(self):
2456 self.sendToServer(MSG)
2457
2458
2459class RecvmsgTests(RecvmsgGenericTests):
2460 # Tests for recvmsg() which can use any socket type.
2461
2462 def testRecvmsgBadArgs(self):
2463 # Check that recvmsg() rejects invalid arguments.
2464 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2465 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2466 -1, 0, 0)
2467 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2468 len(MSG), -1, 0)
2469 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2470 [bytearray(10)], 0, 0)
2471 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2472 object(), 0, 0)
2473 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2474 len(MSG), object(), 0)
2475 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2476 len(MSG), 0, object())
2477
2478 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2479 self.assertEqual(msg, MSG)
2480 self.checkRecvmsgAddress(addr, self.cli_addr)
2481 self.assertEqual(ancdata, [])
2482 self.checkFlags(flags, eor=True)
2483
2484 def _testRecvmsgBadArgs(self):
2485 self.sendToServer(MSG)
2486
2487
2488class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2489 # Tests for recvmsg_into() which can use any socket type.
2490
2491 def testRecvmsgIntoBadArgs(self):
2492 # Check that recvmsg_into() rejects invalid arguments.
2493 buf = bytearray(len(MSG))
2494 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2495 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2496 len(MSG), 0, 0)
2497 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2498 buf, 0, 0)
2499 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2500 [object()], 0, 0)
2501 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2502 [b"I'm not writable"], 0, 0)
2503 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2504 [buf, object()], 0, 0)
2505 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2506 [buf], -1, 0)
2507 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2508 [buf], object(), 0)
2509 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2510 [buf], 0, object())
2511
2512 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2513 self.assertEqual(nbytes, len(MSG))
2514 self.assertEqual(buf, bytearray(MSG))
2515 self.checkRecvmsgAddress(addr, self.cli_addr)
2516 self.assertEqual(ancdata, [])
2517 self.checkFlags(flags, eor=True)
2518
2519 def _testRecvmsgIntoBadArgs(self):
2520 self.sendToServer(MSG)
2521
2522 def testRecvmsgIntoGenerator(self):
2523 # Receive into buffer obtained from a generator (not a sequence).
2524 buf = bytearray(len(MSG))
2525 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2526 (o for o in [buf]))
2527 self.assertEqual(nbytes, len(MSG))
2528 self.assertEqual(buf, bytearray(MSG))
2529 self.checkRecvmsgAddress(addr, self.cli_addr)
2530 self.assertEqual(ancdata, [])
2531 self.checkFlags(flags, eor=True)
2532
2533 def _testRecvmsgIntoGenerator(self):
2534 self.sendToServer(MSG)
2535
2536 def testRecvmsgIntoArray(self):
2537 # Receive into an array rather than the usual bytearray.
2538 buf = array.array("B", [0] * len(MSG))
2539 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2540 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002541 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002542 self.checkRecvmsgAddress(addr, self.cli_addr)
2543 self.assertEqual(ancdata, [])
2544 self.checkFlags(flags, eor=True)
2545
2546 def _testRecvmsgIntoArray(self):
2547 self.sendToServer(MSG)
2548
2549 def testRecvmsgIntoScatter(self):
2550 # Receive into multiple buffers (scatter write).
2551 b1 = bytearray(b"----")
2552 b2 = bytearray(b"0123456789")
2553 b3 = bytearray(b"--------------")
2554 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2555 [b1, memoryview(b2)[2:9], b3])
2556 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2557 self.assertEqual(b1, bytearray(b"Mary"))
2558 self.assertEqual(b2, bytearray(b"01 had a 9"))
2559 self.assertEqual(b3, bytearray(b"little lamb---"))
2560 self.checkRecvmsgAddress(addr, self.cli_addr)
2561 self.assertEqual(ancdata, [])
2562 self.checkFlags(flags, eor=True)
2563
2564 def _testRecvmsgIntoScatter(self):
2565 self.sendToServer(b"Mary had a little lamb")
2566
2567
2568class CmsgMacroTests(unittest.TestCase):
2569 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2570 # assumptions used by sendmsg() and recvmsg[_into](), which share
2571 # code with these functions.
2572
2573 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002574 try:
2575 import _testcapi
2576 except ImportError:
2577 socklen_t_limit = 0x7fffffff
2578 else:
2579 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002580
2581 @requireAttrs(socket, "CMSG_LEN")
2582 def testCMSG_LEN(self):
2583 # Test CMSG_LEN() with various valid and invalid values,
2584 # checking the assumptions used by recvmsg() and sendmsg().
2585 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2586 values = list(range(257)) + list(range(toobig - 257, toobig))
2587
2588 # struct cmsghdr has at least three members, two of which are ints
2589 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2590 for n in values:
2591 ret = socket.CMSG_LEN(n)
2592 # This is how recvmsg() calculates the data size
2593 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2594 self.assertLessEqual(ret, self.socklen_t_limit)
2595
2596 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2597 # sendmsg() shares code with these functions, and requires
2598 # that it reject values over the limit.
2599 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2600 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2601
2602 @requireAttrs(socket, "CMSG_SPACE")
2603 def testCMSG_SPACE(self):
2604 # Test CMSG_SPACE() with various valid and invalid values,
2605 # checking the assumptions used by sendmsg().
2606 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2607 values = list(range(257)) + list(range(toobig - 257, toobig))
2608
2609 last = socket.CMSG_SPACE(0)
2610 # struct cmsghdr has at least three members, two of which are ints
2611 self.assertGreater(last, array.array("i").itemsize * 2)
2612 for n in values:
2613 ret = socket.CMSG_SPACE(n)
2614 self.assertGreaterEqual(ret, last)
2615 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2616 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2617 self.assertLessEqual(ret, self.socklen_t_limit)
2618 last = ret
2619
2620 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2621 # sendmsg() shares code with these functions, and requires
2622 # that it reject values over the limit.
2623 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2624 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2625
2626
2627class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2628 # Tests for file descriptor passing on Unix-domain sockets.
2629
2630 # Invalid file descriptor value that's unlikely to evaluate to a
2631 # real FD even if one of its bytes is replaced with a different
2632 # value (which shouldn't actually happen).
2633 badfd = -0x5555
2634
2635 def newFDs(self, n):
2636 # Return a list of n file descriptors for newly-created files
2637 # containing their list indices as ASCII numbers.
2638 fds = []
2639 for i in range(n):
2640 fd, path = tempfile.mkstemp()
2641 self.addCleanup(os.unlink, path)
2642 self.addCleanup(os.close, fd)
2643 os.write(fd, str(i).encode())
2644 fds.append(fd)
2645 return fds
2646
2647 def checkFDs(self, fds):
2648 # Check that the file descriptors in the given list contain
2649 # their correct list indices as ASCII numbers.
2650 for n, fd in enumerate(fds):
2651 os.lseek(fd, 0, os.SEEK_SET)
2652 self.assertEqual(os.read(fd, 1024), str(n).encode())
2653
2654 def registerRecvmsgResult(self, result):
2655 self.addCleanup(self.closeRecvmsgFDs, result)
2656
2657 def closeRecvmsgFDs(self, recvmsg_result):
2658 # Close all file descriptors specified in the ancillary data
2659 # of the given return value from recvmsg() or recvmsg_into().
2660 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2661 if (cmsg_level == socket.SOL_SOCKET and
2662 cmsg_type == socket.SCM_RIGHTS):
2663 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002664 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002665 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2666 for fd in fds:
2667 os.close(fd)
2668
2669 def createAndSendFDs(self, n):
2670 # Send n new file descriptors created by newFDs() to the
2671 # server, with the constant MSG as the non-ancillary data.
2672 self.assertEqual(
2673 self.sendmsgToServer([MSG],
2674 [(socket.SOL_SOCKET,
2675 socket.SCM_RIGHTS,
2676 array.array("i", self.newFDs(n)))]),
2677 len(MSG))
2678
2679 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2680 # Check that constant MSG was received with numfds file
2681 # descriptors in a maximum of maxcmsgs control messages (which
2682 # must contain only complete integers). By default, check
2683 # that MSG_CTRUNC is unset, but ignore any flags in
2684 # ignoreflags.
2685 msg, ancdata, flags, addr = result
2686 self.assertEqual(msg, MSG)
2687 self.checkRecvmsgAddress(addr, self.cli_addr)
2688 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2689 ignore=ignoreflags)
2690
2691 self.assertIsInstance(ancdata, list)
2692 self.assertLessEqual(len(ancdata), maxcmsgs)
2693 fds = array.array("i")
2694 for item in ancdata:
2695 self.assertIsInstance(item, tuple)
2696 cmsg_level, cmsg_type, cmsg_data = item
2697 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2698 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2699 self.assertIsInstance(cmsg_data, bytes)
2700 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002701 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002702
2703 self.assertEqual(len(fds), numfds)
2704 self.checkFDs(fds)
2705
2706 def testFDPassSimple(self):
2707 # Pass a single FD (array read from bytes object).
2708 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2709 len(MSG), 10240))
2710
2711 def _testFDPassSimple(self):
2712 self.assertEqual(
2713 self.sendmsgToServer(
2714 [MSG],
2715 [(socket.SOL_SOCKET,
2716 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002717 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002718 len(MSG))
2719
2720 def testMultipleFDPass(self):
2721 # Pass multiple FDs in a single array.
2722 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2723 len(MSG), 10240))
2724
2725 def _testMultipleFDPass(self):
2726 self.createAndSendFDs(4)
2727
2728 @requireAttrs(socket, "CMSG_SPACE")
2729 def testFDPassCMSG_SPACE(self):
2730 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2731 self.checkRecvmsgFDs(
2732 4, self.doRecvmsg(self.serv_sock, len(MSG),
2733 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2734
2735 @testFDPassCMSG_SPACE.client_skip
2736 def _testFDPassCMSG_SPACE(self):
2737 self.createAndSendFDs(4)
2738
2739 def testFDPassCMSG_LEN(self):
2740 # Test using CMSG_LEN() to calculate ancillary buffer size.
2741 self.checkRecvmsgFDs(1,
2742 self.doRecvmsg(self.serv_sock, len(MSG),
2743 socket.CMSG_LEN(4 * SIZEOF_INT)),
2744 # RFC 3542 says implementations may set
2745 # MSG_CTRUNC if there isn't enough space
2746 # for trailing padding.
2747 ignoreflags=socket.MSG_CTRUNC)
2748
2749 def _testFDPassCMSG_LEN(self):
2750 self.createAndSendFDs(1)
2751
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002752 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002753 @requireAttrs(socket, "CMSG_SPACE")
2754 def testFDPassSeparate(self):
2755 # Pass two FDs in two separate arrays. Arrays may be combined
2756 # into a single control message by the OS.
2757 self.checkRecvmsgFDs(2,
2758 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2759 maxcmsgs=2)
2760
2761 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002762 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002763 def _testFDPassSeparate(self):
2764 fd0, fd1 = self.newFDs(2)
2765 self.assertEqual(
2766 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2767 socket.SCM_RIGHTS,
2768 array.array("i", [fd0])),
2769 (socket.SOL_SOCKET,
2770 socket.SCM_RIGHTS,
2771 array.array("i", [fd1]))]),
2772 len(MSG))
2773
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002774 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002775 @requireAttrs(socket, "CMSG_SPACE")
2776 def testFDPassSeparateMinSpace(self):
2777 # Pass two FDs in two separate arrays, receiving them into the
2778 # minimum space for two arrays.
2779 self.checkRecvmsgFDs(2,
2780 self.doRecvmsg(self.serv_sock, len(MSG),
2781 socket.CMSG_SPACE(SIZEOF_INT) +
2782 socket.CMSG_LEN(SIZEOF_INT)),
2783 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2784
2785 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002786 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002787 def _testFDPassSeparateMinSpace(self):
2788 fd0, fd1 = self.newFDs(2)
2789 self.assertEqual(
2790 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2791 socket.SCM_RIGHTS,
2792 array.array("i", [fd0])),
2793 (socket.SOL_SOCKET,
2794 socket.SCM_RIGHTS,
2795 array.array("i", [fd1]))]),
2796 len(MSG))
2797
2798 def sendAncillaryIfPossible(self, msg, ancdata):
2799 # Try to send msg and ancdata to server, but if the system
2800 # call fails, just send msg with no ancillary data.
2801 try:
2802 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002803 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002804 # Check that it was the system call that failed
2805 self.assertIsInstance(e.errno, int)
2806 nbytes = self.sendmsgToServer([msg])
2807 self.assertEqual(nbytes, len(msg))
2808
2809 def testFDPassEmpty(self):
2810 # Try to pass an empty FD array. Can receive either no array
2811 # or an empty array.
2812 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2813 len(MSG), 10240),
2814 ignoreflags=socket.MSG_CTRUNC)
2815
2816 def _testFDPassEmpty(self):
2817 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2818 socket.SCM_RIGHTS,
2819 b"")])
2820
2821 def testFDPassPartialInt(self):
2822 # Try to pass a truncated FD array.
2823 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2824 len(MSG), 10240)
2825 self.assertEqual(msg, MSG)
2826 self.checkRecvmsgAddress(addr, self.cli_addr)
2827 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2828 self.assertLessEqual(len(ancdata), 1)
2829 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2830 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2831 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2832 self.assertLess(len(cmsg_data), SIZEOF_INT)
2833
2834 def _testFDPassPartialInt(self):
2835 self.sendAncillaryIfPossible(
2836 MSG,
2837 [(socket.SOL_SOCKET,
2838 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002839 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002840
2841 @requireAttrs(socket, "CMSG_SPACE")
2842 def testFDPassPartialIntInMiddle(self):
2843 # Try to pass two FD arrays, the first of which is truncated.
2844 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2845 len(MSG), 10240)
2846 self.assertEqual(msg, MSG)
2847 self.checkRecvmsgAddress(addr, self.cli_addr)
2848 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2849 self.assertLessEqual(len(ancdata), 2)
2850 fds = array.array("i")
2851 # Arrays may have been combined in a single control message
2852 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2853 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2854 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002855 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002856 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2857 self.assertLessEqual(len(fds), 2)
2858 self.checkFDs(fds)
2859
2860 @testFDPassPartialIntInMiddle.client_skip
2861 def _testFDPassPartialIntInMiddle(self):
2862 fd0, fd1 = self.newFDs(2)
2863 self.sendAncillaryIfPossible(
2864 MSG,
2865 [(socket.SOL_SOCKET,
2866 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002867 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002868 (socket.SOL_SOCKET,
2869 socket.SCM_RIGHTS,
2870 array.array("i", [fd1]))])
2871
2872 def checkTruncatedHeader(self, result, ignoreflags=0):
2873 # Check that no ancillary data items are returned when data is
2874 # truncated inside the cmsghdr structure.
2875 msg, ancdata, flags, addr = result
2876 self.assertEqual(msg, MSG)
2877 self.checkRecvmsgAddress(addr, self.cli_addr)
2878 self.assertEqual(ancdata, [])
2879 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2880 ignore=ignoreflags)
2881
2882 def testCmsgTruncNoBufSize(self):
2883 # Check that no ancillary data is received when no buffer size
2884 # is specified.
2885 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2886 # BSD seems to set MSG_CTRUNC only
2887 # if an item has been partially
2888 # received.
2889 ignoreflags=socket.MSG_CTRUNC)
2890
2891 def _testCmsgTruncNoBufSize(self):
2892 self.createAndSendFDs(1)
2893
2894 def testCmsgTrunc0(self):
2895 # Check that no ancillary data is received when buffer size is 0.
2896 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2897 ignoreflags=socket.MSG_CTRUNC)
2898
2899 def _testCmsgTrunc0(self):
2900 self.createAndSendFDs(1)
2901
2902 # Check that no ancillary data is returned for various non-zero
2903 # (but still too small) buffer sizes.
2904
2905 def testCmsgTrunc1(self):
2906 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2907
2908 def _testCmsgTrunc1(self):
2909 self.createAndSendFDs(1)
2910
2911 def testCmsgTrunc2Int(self):
2912 # The cmsghdr structure has at least three members, two of
2913 # which are ints, so we still shouldn't see any ancillary
2914 # data.
2915 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2916 SIZEOF_INT * 2))
2917
2918 def _testCmsgTrunc2Int(self):
2919 self.createAndSendFDs(1)
2920
2921 def testCmsgTruncLen0Minus1(self):
2922 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2923 socket.CMSG_LEN(0) - 1))
2924
2925 def _testCmsgTruncLen0Minus1(self):
2926 self.createAndSendFDs(1)
2927
2928 # The following tests try to truncate the control message in the
2929 # middle of the FD array.
2930
2931 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2932 # Check that file descriptor data is truncated to between
2933 # mindata and maxdata bytes when received with buffer size
2934 # ancbuf, and that any complete file descriptor numbers are
2935 # valid.
2936 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2937 len(MSG), ancbuf)
2938 self.assertEqual(msg, MSG)
2939 self.checkRecvmsgAddress(addr, self.cli_addr)
2940 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2941
2942 if mindata == 0 and ancdata == []:
2943 return
2944 self.assertEqual(len(ancdata), 1)
2945 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2946 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2947 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2948 self.assertGreaterEqual(len(cmsg_data), mindata)
2949 self.assertLessEqual(len(cmsg_data), maxdata)
2950 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002951 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002952 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2953 self.checkFDs(fds)
2954
2955 def testCmsgTruncLen0(self):
2956 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2957
2958 def _testCmsgTruncLen0(self):
2959 self.createAndSendFDs(1)
2960
2961 def testCmsgTruncLen0Plus1(self):
2962 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2963
2964 def _testCmsgTruncLen0Plus1(self):
2965 self.createAndSendFDs(2)
2966
2967 def testCmsgTruncLen1(self):
2968 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2969 maxdata=SIZEOF_INT)
2970
2971 def _testCmsgTruncLen1(self):
2972 self.createAndSendFDs(2)
2973
2974 def testCmsgTruncLen2Minus1(self):
2975 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2976 maxdata=(2 * SIZEOF_INT) - 1)
2977
2978 def _testCmsgTruncLen2Minus1(self):
2979 self.createAndSendFDs(2)
2980
2981
2982class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2983 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2984 # features of the RFC 3542 Advanced Sockets API for IPv6.
2985 # Currently we can only handle certain data items (e.g. traffic
2986 # class, hop limit, MTU discovery and fragmentation settings)
2987 # without resorting to unportable means such as the struct module,
2988 # but the tests here are aimed at testing the ancillary data
2989 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2990 # itself.
2991
2992 # Test value to use when setting hop limit of packet
2993 hop_limit = 2
2994
2995 # Test value to use when setting traffic class of packet.
2996 # -1 means "use kernel default".
2997 traffic_class = -1
2998
2999 def ancillaryMapping(self, ancdata):
3000 # Given ancillary data list ancdata, return a mapping from
3001 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3002 # Check that no (level, type) pair appears more than once.
3003 d = {}
3004 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3005 self.assertNotIn((cmsg_level, cmsg_type), d)
3006 d[(cmsg_level, cmsg_type)] = cmsg_data
3007 return d
3008
3009 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3010 # Receive hop limit into ancbufsize bytes of ancillary data
3011 # space. Check that data is MSG, ancillary data is not
3012 # truncated (but ignore any flags in ignoreflags), and hop
3013 # limit is between 0 and maxhop inclusive.
3014 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3015 socket.IPV6_RECVHOPLIMIT, 1)
3016 self.misc_event.set()
3017 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3018 len(MSG), ancbufsize)
3019
3020 self.assertEqual(msg, MSG)
3021 self.checkRecvmsgAddress(addr, self.cli_addr)
3022 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3023 ignore=ignoreflags)
3024
3025 self.assertEqual(len(ancdata), 1)
3026 self.assertIsInstance(ancdata[0], tuple)
3027 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3028 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3029 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3030 self.assertIsInstance(cmsg_data, bytes)
3031 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3032 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003033 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003034 self.assertGreaterEqual(a[0], 0)
3035 self.assertLessEqual(a[0], maxhop)
3036
3037 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3038 def testRecvHopLimit(self):
3039 # Test receiving the packet hop limit as ancillary data.
3040 self.checkHopLimit(ancbufsize=10240)
3041
3042 @testRecvHopLimit.client_skip
3043 def _testRecvHopLimit(self):
3044 # Need to wait until server has asked to receive ancillary
3045 # data, as implementations are not required to buffer it
3046 # otherwise.
3047 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3048 self.sendToServer(MSG)
3049
3050 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3051 def testRecvHopLimitCMSG_SPACE(self):
3052 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3053 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3054
3055 @testRecvHopLimitCMSG_SPACE.client_skip
3056 def _testRecvHopLimitCMSG_SPACE(self):
3057 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3058 self.sendToServer(MSG)
3059
3060 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3061 # 3542 says portable applications must provide space for trailing
3062 # padding. Implementations may set MSG_CTRUNC if there isn't
3063 # enough space for the padding.
3064
3065 @requireAttrs(socket.socket, "sendmsg")
3066 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3067 def testSetHopLimit(self):
3068 # Test setting hop limit on outgoing packet and receiving it
3069 # at the other end.
3070 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3071
3072 @testSetHopLimit.client_skip
3073 def _testSetHopLimit(self):
3074 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3075 self.assertEqual(
3076 self.sendmsgToServer([MSG],
3077 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3078 array.array("i", [self.hop_limit]))]),
3079 len(MSG))
3080
3081 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3082 ignoreflags=0):
3083 # Receive traffic class and hop limit into ancbufsize bytes of
3084 # ancillary data space. Check that data is MSG, ancillary
3085 # data is not truncated (but ignore any flags in ignoreflags),
3086 # and traffic class and hop limit are in range (hop limit no
3087 # more than maxhop).
3088 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3089 socket.IPV6_RECVHOPLIMIT, 1)
3090 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3091 socket.IPV6_RECVTCLASS, 1)
3092 self.misc_event.set()
3093 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3094 len(MSG), ancbufsize)
3095
3096 self.assertEqual(msg, MSG)
3097 self.checkRecvmsgAddress(addr, self.cli_addr)
3098 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3099 ignore=ignoreflags)
3100 self.assertEqual(len(ancdata), 2)
3101 ancmap = self.ancillaryMapping(ancdata)
3102
3103 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3104 self.assertEqual(len(tcdata), SIZEOF_INT)
3105 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003106 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003107 self.assertGreaterEqual(a[0], 0)
3108 self.assertLessEqual(a[0], 255)
3109
3110 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3111 self.assertEqual(len(hldata), SIZEOF_INT)
3112 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003113 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003114 self.assertGreaterEqual(a[0], 0)
3115 self.assertLessEqual(a[0], maxhop)
3116
3117 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3118 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3119 def testRecvTrafficClassAndHopLimit(self):
3120 # Test receiving traffic class and hop limit as ancillary data.
3121 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3122
3123 @testRecvTrafficClassAndHopLimit.client_skip
3124 def _testRecvTrafficClassAndHopLimit(self):
3125 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3126 self.sendToServer(MSG)
3127
3128 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3129 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3130 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3131 # Test receiving traffic class and hop limit, using
3132 # CMSG_SPACE() to calculate buffer size.
3133 self.checkTrafficClassAndHopLimit(
3134 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3135
3136 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3137 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3138 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3139 self.sendToServer(MSG)
3140
3141 @requireAttrs(socket.socket, "sendmsg")
3142 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3143 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3144 def testSetTrafficClassAndHopLimit(self):
3145 # Test setting traffic class and hop limit on outgoing packet,
3146 # and receiving them at the other end.
3147 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3148 maxhop=self.hop_limit)
3149
3150 @testSetTrafficClassAndHopLimit.client_skip
3151 def _testSetTrafficClassAndHopLimit(self):
3152 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3153 self.assertEqual(
3154 self.sendmsgToServer([MSG],
3155 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3156 array.array("i", [self.traffic_class])),
3157 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3158 array.array("i", [self.hop_limit]))]),
3159 len(MSG))
3160
3161 @requireAttrs(socket.socket, "sendmsg")
3162 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3163 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3164 def testOddCmsgSize(self):
3165 # Try to send ancillary data with first item one byte too
3166 # long. Fall back to sending with correct size if this fails,
3167 # and check that second item was handled correctly.
3168 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3169 maxhop=self.hop_limit)
3170
3171 @testOddCmsgSize.client_skip
3172 def _testOddCmsgSize(self):
3173 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3174 try:
3175 nbytes = self.sendmsgToServer(
3176 [MSG],
3177 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003178 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003179 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3180 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003181 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003182 self.assertIsInstance(e.errno, int)
3183 nbytes = self.sendmsgToServer(
3184 [MSG],
3185 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3186 array.array("i", [self.traffic_class])),
3187 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3188 array.array("i", [self.hop_limit]))])
3189 self.assertEqual(nbytes, len(MSG))
3190
3191 # Tests for proper handling of truncated ancillary data
3192
3193 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3194 # Receive hop limit into ancbufsize bytes of ancillary data
3195 # space, which should be too small to contain the ancillary
3196 # data header (if ancbufsize is None, pass no second argument
3197 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3198 # (unless included in ignoreflags), and no ancillary data is
3199 # returned.
3200 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3201 socket.IPV6_RECVHOPLIMIT, 1)
3202 self.misc_event.set()
3203 args = () if ancbufsize is None else (ancbufsize,)
3204 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3205 len(MSG), *args)
3206
3207 self.assertEqual(msg, MSG)
3208 self.checkRecvmsgAddress(addr, self.cli_addr)
3209 self.assertEqual(ancdata, [])
3210 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3211 ignore=ignoreflags)
3212
3213 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3214 def testCmsgTruncNoBufSize(self):
3215 # Check that no ancillary data is received when no ancillary
3216 # buffer size is provided.
3217 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3218 # BSD seems to set
3219 # MSG_CTRUNC only if an item
3220 # has been partially
3221 # received.
3222 ignoreflags=socket.MSG_CTRUNC)
3223
3224 @testCmsgTruncNoBufSize.client_skip
3225 def _testCmsgTruncNoBufSize(self):
3226 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3227 self.sendToServer(MSG)
3228
3229 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3230 def testSingleCmsgTrunc0(self):
3231 # Check that no ancillary data is received when ancillary
3232 # buffer size is zero.
3233 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3234 ignoreflags=socket.MSG_CTRUNC)
3235
3236 @testSingleCmsgTrunc0.client_skip
3237 def _testSingleCmsgTrunc0(self):
3238 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3239 self.sendToServer(MSG)
3240
3241 # Check that no ancillary data is returned for various non-zero
3242 # (but still too small) buffer sizes.
3243
3244 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3245 def testSingleCmsgTrunc1(self):
3246 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3247
3248 @testSingleCmsgTrunc1.client_skip
3249 def _testSingleCmsgTrunc1(self):
3250 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3251 self.sendToServer(MSG)
3252
3253 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3254 def testSingleCmsgTrunc2Int(self):
3255 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3256
3257 @testSingleCmsgTrunc2Int.client_skip
3258 def _testSingleCmsgTrunc2Int(self):
3259 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3260 self.sendToServer(MSG)
3261
3262 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3263 def testSingleCmsgTruncLen0Minus1(self):
3264 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3265
3266 @testSingleCmsgTruncLen0Minus1.client_skip
3267 def _testSingleCmsgTruncLen0Minus1(self):
3268 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3269 self.sendToServer(MSG)
3270
3271 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3272 def testSingleCmsgTruncInData(self):
3273 # Test truncation of a control message inside its associated
3274 # data. The message may be returned with its data truncated,
3275 # or not returned at all.
3276 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3277 socket.IPV6_RECVHOPLIMIT, 1)
3278 self.misc_event.set()
3279 msg, ancdata, flags, addr = self.doRecvmsg(
3280 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3281
3282 self.assertEqual(msg, MSG)
3283 self.checkRecvmsgAddress(addr, self.cli_addr)
3284 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3285
3286 self.assertLessEqual(len(ancdata), 1)
3287 if ancdata:
3288 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3289 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3290 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3291 self.assertLess(len(cmsg_data), SIZEOF_INT)
3292
3293 @testSingleCmsgTruncInData.client_skip
3294 def _testSingleCmsgTruncInData(self):
3295 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3296 self.sendToServer(MSG)
3297
3298 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3299 # Receive traffic class and hop limit into ancbufsize bytes of
3300 # ancillary data space, which should be large enough to
3301 # contain the first item, but too small to contain the header
3302 # of the second. Check that data is MSG, MSG_CTRUNC is set
3303 # (unless included in ignoreflags), and only one ancillary
3304 # data item is returned.
3305 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3306 socket.IPV6_RECVHOPLIMIT, 1)
3307 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3308 socket.IPV6_RECVTCLASS, 1)
3309 self.misc_event.set()
3310 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3311 len(MSG), ancbufsize)
3312
3313 self.assertEqual(msg, MSG)
3314 self.checkRecvmsgAddress(addr, self.cli_addr)
3315 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3316 ignore=ignoreflags)
3317
3318 self.assertEqual(len(ancdata), 1)
3319 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3320 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3321 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3322 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3323 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003324 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003325 self.assertGreaterEqual(a[0], 0)
3326 self.assertLessEqual(a[0], 255)
3327
3328 # Try the above test with various buffer sizes.
3329
3330 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3331 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3332 def testSecondCmsgTrunc0(self):
3333 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3334 ignoreflags=socket.MSG_CTRUNC)
3335
3336 @testSecondCmsgTrunc0.client_skip
3337 def _testSecondCmsgTrunc0(self):
3338 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3339 self.sendToServer(MSG)
3340
3341 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3342 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3343 def testSecondCmsgTrunc1(self):
3344 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3345
3346 @testSecondCmsgTrunc1.client_skip
3347 def _testSecondCmsgTrunc1(self):
3348 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3349 self.sendToServer(MSG)
3350
3351 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3352 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3353 def testSecondCmsgTrunc2Int(self):
3354 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3355 2 * SIZEOF_INT)
3356
3357 @testSecondCmsgTrunc2Int.client_skip
3358 def _testSecondCmsgTrunc2Int(self):
3359 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3360 self.sendToServer(MSG)
3361
3362 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3363 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3364 def testSecondCmsgTruncLen0Minus1(self):
3365 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3366 socket.CMSG_LEN(0) - 1)
3367
3368 @testSecondCmsgTruncLen0Minus1.client_skip
3369 def _testSecondCmsgTruncLen0Minus1(self):
3370 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3371 self.sendToServer(MSG)
3372
3373 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3374 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3375 def testSecomdCmsgTruncInData(self):
3376 # Test truncation of the second of two control messages inside
3377 # its associated data.
3378 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3379 socket.IPV6_RECVHOPLIMIT, 1)
3380 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3381 socket.IPV6_RECVTCLASS, 1)
3382 self.misc_event.set()
3383 msg, ancdata, flags, addr = self.doRecvmsg(
3384 self.serv_sock, len(MSG),
3385 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3386
3387 self.assertEqual(msg, MSG)
3388 self.checkRecvmsgAddress(addr, self.cli_addr)
3389 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3390
3391 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3392
3393 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3394 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3395 cmsg_types.remove(cmsg_type)
3396 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3397 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003398 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003399 self.assertGreaterEqual(a[0], 0)
3400 self.assertLessEqual(a[0], 255)
3401
3402 if ancdata:
3403 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3404 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3405 cmsg_types.remove(cmsg_type)
3406 self.assertLess(len(cmsg_data), SIZEOF_INT)
3407
3408 self.assertEqual(ancdata, [])
3409
3410 @testSecomdCmsgTruncInData.client_skip
3411 def _testSecomdCmsgTruncInData(self):
3412 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3413 self.sendToServer(MSG)
3414
3415
3416# Derive concrete test classes for different socket types.
3417
3418class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3419 SendrecvmsgConnectionlessBase,
3420 ThreadedSocketTestMixin, UDPTestBase):
3421 pass
3422
3423@requireAttrs(socket.socket, "sendmsg")
3424@unittest.skipUnless(thread, 'Threading required for this test.')
3425class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3426 pass
3427
3428@requireAttrs(socket.socket, "recvmsg")
3429@unittest.skipUnless(thread, 'Threading required for this test.')
3430class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3431 pass
3432
3433@requireAttrs(socket.socket, "recvmsg_into")
3434@unittest.skipUnless(thread, 'Threading required for this test.')
3435class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3436 pass
3437
3438
3439class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3440 SendrecvmsgConnectionlessBase,
3441 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003442
3443 def checkRecvmsgAddress(self, addr1, addr2):
3444 # Called to compare the received address with the address of
3445 # the peer, ignoring scope ID
3446 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003447
3448@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003449@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003450@requireSocket("AF_INET6", "SOCK_DGRAM")
3451@unittest.skipUnless(thread, 'Threading required for this test.')
3452class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3453 pass
3454
3455@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003456@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003457@requireSocket("AF_INET6", "SOCK_DGRAM")
3458@unittest.skipUnless(thread, 'Threading required for this test.')
3459class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3460 pass
3461
3462@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003463@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003464@requireSocket("AF_INET6", "SOCK_DGRAM")
3465@unittest.skipUnless(thread, 'Threading required for this test.')
3466class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3467 pass
3468
3469@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003470@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003471@requireAttrs(socket, "IPPROTO_IPV6")
3472@requireSocket("AF_INET6", "SOCK_DGRAM")
3473@unittest.skipUnless(thread, 'Threading required for this test.')
3474class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3475 SendrecvmsgUDP6TestBase):
3476 pass
3477
3478@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003479@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003480@requireAttrs(socket, "IPPROTO_IPV6")
3481@requireSocket("AF_INET6", "SOCK_DGRAM")
3482@unittest.skipUnless(thread, 'Threading required for this test.')
3483class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3484 RFC3542AncillaryTest,
3485 SendrecvmsgUDP6TestBase):
3486 pass
3487
3488
3489class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3490 ConnectedStreamTestMixin, TCPTestBase):
3491 pass
3492
3493@requireAttrs(socket.socket, "sendmsg")
3494@unittest.skipUnless(thread, 'Threading required for this test.')
3495class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3496 pass
3497
3498@requireAttrs(socket.socket, "recvmsg")
3499@unittest.skipUnless(thread, 'Threading required for this test.')
3500class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3501 SendrecvmsgTCPTestBase):
3502 pass
3503
3504@requireAttrs(socket.socket, "recvmsg_into")
3505@unittest.skipUnless(thread, 'Threading required for this test.')
3506class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3507 SendrecvmsgTCPTestBase):
3508 pass
3509
3510
3511class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3512 SendrecvmsgConnectedBase,
3513 ConnectedStreamTestMixin, SCTPStreamBase):
3514 pass
3515
3516@requireAttrs(socket.socket, "sendmsg")
3517@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3518@unittest.skipUnless(thread, 'Threading required for this test.')
3519class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3520 pass
3521
3522@requireAttrs(socket.socket, "recvmsg")
3523@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3524@unittest.skipUnless(thread, 'Threading required for this test.')
3525class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3526 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003527
3528 def testRecvmsgEOF(self):
3529 try:
3530 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3531 except OSError as e:
3532 if e.errno != errno.ENOTCONN:
3533 raise
3534 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003535
3536@requireAttrs(socket.socket, "recvmsg_into")
3537@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3538@unittest.skipUnless(thread, 'Threading required for this test.')
3539class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3540 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003541
3542 def testRecvmsgEOF(self):
3543 try:
3544 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3545 except OSError as e:
3546 if e.errno != errno.ENOTCONN:
3547 raise
3548 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003549
3550
3551class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3552 ConnectedStreamTestMixin, UnixStreamBase):
3553 pass
3554
3555@requireAttrs(socket.socket, "sendmsg")
3556@requireAttrs(socket, "AF_UNIX")
3557@unittest.skipUnless(thread, 'Threading required for this test.')
3558class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3559 pass
3560
3561@requireAttrs(socket.socket, "recvmsg")
3562@requireAttrs(socket, "AF_UNIX")
3563@unittest.skipUnless(thread, 'Threading required for this test.')
3564class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3565 SendrecvmsgUnixStreamTestBase):
3566 pass
3567
3568@requireAttrs(socket.socket, "recvmsg_into")
3569@requireAttrs(socket, "AF_UNIX")
3570@unittest.skipUnless(thread, 'Threading required for this test.')
3571class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3572 SendrecvmsgUnixStreamTestBase):
3573 pass
3574
3575@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3576@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3577@unittest.skipUnless(thread, 'Threading required for this test.')
3578class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3579 pass
3580
3581@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3582@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3583@unittest.skipUnless(thread, 'Threading required for this test.')
3584class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3585 SendrecvmsgUnixStreamTestBase):
3586 pass
3587
3588
3589# Test interrupting the interruptible send/receive methods with a
3590# signal when a timeout is set. These tests avoid having multiple
3591# threads alive during the test so that the OS cannot deliver the
3592# signal to the wrong one.
3593
3594class InterruptedTimeoutBase(unittest.TestCase):
3595 # Base class for interrupted send/receive tests. Installs an
3596 # empty handler for SIGALRM and removes it on teardown, along with
3597 # any scheduled alarms.
3598
3599 def setUp(self):
3600 super().setUp()
3601 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003602 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003603 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3604 self.addCleanup(self.setAlarm, 0)
3605
3606 # Timeout for socket operations
3607 timeout = 4.0
3608
3609 # Provide setAlarm() method to schedule delivery of SIGALRM after
3610 # given number of seconds, or cancel it if zero, and an
3611 # appropriate time value to use. Use setitimer() if available.
3612 if hasattr(signal, "setitimer"):
3613 alarm_time = 0.05
3614
3615 def setAlarm(self, seconds):
3616 signal.setitimer(signal.ITIMER_REAL, seconds)
3617 else:
3618 # Old systems may deliver the alarm up to one second early
3619 alarm_time = 2
3620
3621 def setAlarm(self, seconds):
3622 signal.alarm(seconds)
3623
3624
3625# Require siginterrupt() in order to ensure that system calls are
3626# interrupted by default.
3627@requireAttrs(signal, "siginterrupt")
3628@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3629 "Don't have signal.alarm or signal.setitimer")
3630class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3631 # Test interrupting the recv*() methods with signals when a
3632 # timeout is set.
3633
3634 def setUp(self):
3635 super().setUp()
3636 self.serv.settimeout(self.timeout)
3637
3638 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003639 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003640 # errno of EINTR when interrupted by a signal.
3641 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003642 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003643 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003644
3645 def testInterruptedRecvTimeout(self):
3646 self.checkInterruptedRecv(self.serv.recv, 1024)
3647
3648 def testInterruptedRecvIntoTimeout(self):
3649 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3650
3651 def testInterruptedRecvfromTimeout(self):
3652 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3653
3654 def testInterruptedRecvfromIntoTimeout(self):
3655 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3656
3657 @requireAttrs(socket.socket, "recvmsg")
3658 def testInterruptedRecvmsgTimeout(self):
3659 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3660
3661 @requireAttrs(socket.socket, "recvmsg_into")
3662 def testInterruptedRecvmsgIntoTimeout(self):
3663 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3664
3665
3666# Require siginterrupt() in order to ensure that system calls are
3667# interrupted by default.
3668@requireAttrs(signal, "siginterrupt")
3669@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3670 "Don't have signal.alarm or signal.setitimer")
3671@unittest.skipUnless(thread, 'Threading required for this test.')
3672class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3673 ThreadSafeCleanupTestCase,
3674 SocketListeningTestMixin, TCPTestBase):
3675 # Test interrupting the interruptible send*() methods with signals
3676 # when a timeout is set.
3677
3678 def setUp(self):
3679 super().setUp()
3680 self.serv_conn = self.newSocket()
3681 self.addCleanup(self.serv_conn.close)
3682 # Use a thread to complete the connection, but wait for it to
3683 # terminate before running the test, so that there is only one
3684 # thread to accept the signal.
3685 cli_thread = threading.Thread(target=self.doConnect)
3686 cli_thread.start()
3687 self.cli_conn, addr = self.serv.accept()
3688 self.addCleanup(self.cli_conn.close)
3689 cli_thread.join()
3690 self.serv_conn.settimeout(self.timeout)
3691
3692 def doConnect(self):
3693 self.serv_conn.connect(self.serv_addr)
3694
3695 def checkInterruptedSend(self, func, *args, **kwargs):
3696 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003697 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003698 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003699 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003700 while True:
3701 self.setAlarm(self.alarm_time)
3702 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003703
Ned Deilyc5640382014-02-03 13:58:31 -08003704 # Issue #12958: The following tests have problems on OS X prior to 10.7
3705 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003706 def testInterruptedSendTimeout(self):
3707 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3708
Ned Deilyc5640382014-02-03 13:58:31 -08003709 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003710 def testInterruptedSendtoTimeout(self):
3711 # Passing an actual address here as Python's wrapper for
3712 # sendto() doesn't allow passing a zero-length one; POSIX
3713 # requires that the address is ignored since the socket is
3714 # connection-mode, however.
3715 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3716 self.serv_addr)
3717
Ned Deilyc5640382014-02-03 13:58:31 -08003718 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003719 @requireAttrs(socket.socket, "sendmsg")
3720 def testInterruptedSendmsgTimeout(self):
3721 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3722
3723
Victor Stinner45df8202010-04-28 22:31:17 +00003724@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003725class TCPCloserTest(ThreadedTCPSocketTest):
3726
3727 def testClose(self):
3728 conn, addr = self.serv.accept()
3729 conn.close()
3730
3731 sd = self.cli
3732 read, write, err = select.select([sd], [], [], 1.0)
3733 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003734 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003735
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003736 # Calling close() many times should be safe.
3737 conn.close()
3738 conn.close()
3739
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003740 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003741 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003742 time.sleep(1.0)
3743
Victor Stinner45df8202010-04-28 22:31:17 +00003744@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003745class BasicSocketPairTest(SocketPairTest):
3746
3747 def __init__(self, methodName='runTest'):
3748 SocketPairTest.__init__(self, methodName=methodName)
3749
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003750 def _check_defaults(self, sock):
3751 self.assertIsInstance(sock, socket.socket)
3752 if hasattr(socket, 'AF_UNIX'):
3753 self.assertEqual(sock.family, socket.AF_UNIX)
3754 else:
3755 self.assertEqual(sock.family, socket.AF_INET)
3756 self.assertEqual(sock.type, socket.SOCK_STREAM)
3757 self.assertEqual(sock.proto, 0)
3758
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003759 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003760 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003761
3762 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003763 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003764
Dave Cole331708b2004-08-09 04:51:41 +00003765 def testRecv(self):
3766 msg = self.serv.recv(1024)
3767 self.assertEqual(msg, MSG)
3768
3769 def _testRecv(self):
3770 self.cli.send(MSG)
3771
3772 def testSend(self):
3773 self.serv.send(MSG)
3774
3775 def _testSend(self):
3776 msg = self.cli.recv(1024)
3777 self.assertEqual(msg, MSG)
3778
Victor Stinner45df8202010-04-28 22:31:17 +00003779@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003780class NonBlockingTCPTests(ThreadedTCPSocketTest):
3781
3782 def __init__(self, methodName='runTest'):
3783 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3784
3785 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003786 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003787 self.serv.setblocking(True)
3788 self.assertIsNone(self.serv.gettimeout())
3789 self.serv.setblocking(False)
3790 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003791 start = time.time()
3792 try:
3793 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003794 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003795 pass
3796 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003797 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003798
3799 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003800 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003801
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003802 @support.cpython_only
3803 def testSetBlocking_overflow(self):
3804 # Issue 15989
3805 import _testcapi
3806 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3807 self.skipTest('needs UINT_MAX < ULONG_MAX')
3808 self.serv.setblocking(False)
3809 self.assertEqual(self.serv.gettimeout(), 0.0)
3810 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3811 self.assertIsNone(self.serv.gettimeout())
3812
3813 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3814
Serhiy Storchaka43767632013-11-03 21:31:38 +02003815 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3816 'test needs socket.SOCK_NONBLOCK')
3817 @support.requires_linux_version(2, 6, 28)
3818 def testInitNonBlocking(self):
3819 # reinit server socket
3820 self.serv.close()
3821 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3822 socket.SOCK_NONBLOCK)
3823 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003824 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003825 # actual testing
3826 start = time.time()
3827 try:
3828 self.serv.accept()
3829 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003830 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003831 end = time.time()
3832 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3833
3834 def _testInitNonBlocking(self):
3835 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003836
Antoine Pitrou600232b2011-01-05 21:03:42 +00003837 def testInheritFlags(self):
3838 # Issue #7995: when calling accept() on a listening socket with a
3839 # timeout, the resulting socket should not be non-blocking.
3840 self.serv.settimeout(10)
3841 try:
3842 conn, addr = self.serv.accept()
3843 message = conn.recv(len(MSG))
3844 finally:
3845 conn.close()
3846 self.serv.settimeout(None)
3847
3848 def _testInheritFlags(self):
3849 time.sleep(0.1)
3850 self.cli.connect((HOST, self.port))
3851 time.sleep(0.5)
3852 self.cli.send(MSG)
3853
Guido van Rossum24e4af82002-06-12 19:18:08 +00003854 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003855 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003856 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003857 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003858 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003859 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003860 pass
3861 else:
3862 self.fail("Error trying to do non-blocking accept.")
3863 read, write, err = select.select([self.serv], [], [])
3864 if self.serv in read:
3865 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003866 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003867 else:
3868 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003869
Guido van Rossum24e4af82002-06-12 19:18:08 +00003870 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003871 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003872 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003873
3874 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003875 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003876 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003877 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003878
3879 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003880 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003881 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003882
3883 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003884 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003885 conn, addr = self.serv.accept()
3886 conn.setblocking(0)
3887 try:
3888 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003889 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003890 pass
3891 else:
3892 self.fail("Error trying to do non-blocking recv.")
3893 read, write, err = select.select([conn], [], [])
3894 if conn in read:
3895 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003896 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003897 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003898 else:
3899 self.fail("Error during select call to non-blocking socket.")
3900
3901 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003902 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003903 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003904 self.cli.send(MSG)
3905
Victor Stinner45df8202010-04-28 22:31:17 +00003906@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003907class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003908 """Unit tests for the object returned by socket.makefile()
3909
Antoine Pitrou834bd812010-10-13 16:17:14 +00003910 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003911 the client connection. You can read from this file to
3912 get output from the server.
3913
Antoine Pitrou834bd812010-10-13 16:17:14 +00003914 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003915 server connection. You can write to this file to send output
3916 to the client.
3917 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003918
Guido van Rossume9f66142002-08-07 15:46:19 +00003919 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003920 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003921 errors = 'strict'
3922 newline = None
3923
3924 read_mode = 'rb'
3925 read_msg = MSG
3926 write_mode = 'wb'
3927 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003928
Guido van Rossum24e4af82002-06-12 19:18:08 +00003929 def __init__(self, methodName='runTest'):
3930 SocketConnectedTest.__init__(self, methodName=methodName)
3931
3932 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003933 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3934 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003935 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003936 self.read_file = self.cli_conn.makefile(
3937 self.read_mode, self.bufsize,
3938 encoding = self.encoding,
3939 errors = self.errors,
3940 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003941
3942 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003943 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003944 self.read_file.close()
3945 self.assertTrue(self.read_file.closed)
3946 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003947 SocketConnectedTest.tearDown(self)
3948
3949 def clientSetUp(self):
3950 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003951 self.write_file = self.serv_conn.makefile(
3952 self.write_mode, self.bufsize,
3953 encoding = self.encoding,
3954 errors = self.errors,
3955 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003956
3957 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003958 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003959 self.write_file.close()
3960 self.assertTrue(self.write_file.closed)
3961 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003962 SocketConnectedTest.clientTearDown(self)
3963
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003964 def testReadAfterTimeout(self):
3965 # Issue #7322: A file object must disallow further reads
3966 # after a timeout has occurred.
3967 self.cli_conn.settimeout(1)
3968 self.read_file.read(3)
3969 # First read raises a timeout
3970 self.assertRaises(socket.timeout, self.read_file.read, 1)
3971 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003972 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003973 self.read_file.read(1)
3974 self.assertIn("cannot read from timed out object", str(ctx.exception))
3975
3976 def _testReadAfterTimeout(self):
3977 self.write_file.write(self.write_msg[0:3])
3978 self.write_file.flush()
3979 self.serv_finished.wait()
3980
Guido van Rossum24e4af82002-06-12 19:18:08 +00003981 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003982 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003983 first_seg = self.read_file.read(len(self.read_msg)-3)
3984 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003985 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003986 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003987
3988 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003989 self.write_file.write(self.write_msg)
3990 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003991
Guido van Rossum8c943832002-08-08 01:00:28 +00003992 def testFullRead(self):
3993 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003994 msg = self.read_file.read()
3995 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003996
3997 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003998 self.write_file.write(self.write_msg)
3999 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004000
Guido van Rossum24e4af82002-06-12 19:18:08 +00004001 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004002 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004003 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004004 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004005 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004006 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004007 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004008 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004009 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004010
4011 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004012 self.write_file.write(self.write_msg)
4013 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004014
4015 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004016 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004017 line = self.read_file.readline()
4018 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004019
4020 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004021 self.write_file.write(self.write_msg)
4022 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004023
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004024 def testCloseAfterMakefile(self):
4025 # The file returned by makefile should keep the socket open.
4026 self.cli_conn.close()
4027 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004028 msg = self.read_file.read()
4029 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004030
4031 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004032 self.write_file.write(self.write_msg)
4033 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004034
4035 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004036 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004037 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004038 if isinstance(self.read_msg, str):
4039 msg = msg.decode()
4040 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004041
4042 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004043 self.write_file.write(self.write_msg)
4044 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004045
Tim Peters116d83c2004-03-28 02:20:45 +00004046 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004047 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004048
4049 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004050 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004051
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004052 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004053 self.assertEqual(self.read_file.mode, self.read_mode)
4054 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004055
4056 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004057 self.assertEqual(self.write_file.mode, self.write_mode)
4058 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004059
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004060 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004061 self.read_file.close()
4062 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004063 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004064 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004065
4066 def _testRealClose(self):
4067 pass
4068
4069
Guido van Rossume9f66142002-08-07 15:46:19 +00004070class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4071
4072 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004073
Guido van Rossume9f66142002-08-07 15:46:19 +00004074 In this case (and in this case only), it should be possible to
4075 create a file object, read a line from it, create another file
4076 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004077 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004078 when reading multiple requests from the same socket."""
4079
4080 bufsize = 0 # Use unbuffered mode
4081
4082 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004083 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004084 line = self.read_file.readline() # first line
4085 self.assertEqual(line, b"A. " + self.write_msg) # first line
4086 self.read_file = self.cli_conn.makefile('rb', 0)
4087 line = self.read_file.readline() # second line
4088 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004089
4090 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004091 self.write_file.write(b"A. " + self.write_msg)
4092 self.write_file.write(b"B. " + self.write_msg)
4093 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004094
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004095 def testMakefileClose(self):
4096 # The file returned by makefile should keep the socket open...
4097 self.cli_conn.close()
4098 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004099 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004100 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004101 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004102 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004103
4104 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004105 self.write_file.write(self.write_msg)
4106 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004107
4108 def testMakefileCloseSocketDestroy(self):
4109 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004110 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004111 refcount_after = sys.getrefcount(self.cli_conn)
4112 self.assertEqual(refcount_before - 1, refcount_after)
4113
4114 def _testMakefileCloseSocketDestroy(self):
4115 pass
4116
Antoine Pitrou98b46702010-09-18 22:59:00 +00004117 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004118 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004119 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4120
4121 def testSmallReadNonBlocking(self):
4122 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004123 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4124 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004125 self.evt1.set()
4126 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004127 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004128 if first_seg is None:
4129 # Data not arrived (can happen under Windows), wait a bit
4130 time.sleep(0.5)
4131 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004132 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004133 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004134 self.assertEqual(n, 3)
4135 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004136 self.assertEqual(msg, self.read_msg)
4137 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4138 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004139
4140 def _testSmallReadNonBlocking(self):
4141 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004142 self.write_file.write(self.write_msg)
4143 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004144 self.evt2.set()
4145 # Avoid cloding the socket before the server test has finished,
4146 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4147 self.serv_finished.wait(5.0)
4148
4149 def testWriteNonBlocking(self):
4150 self.cli_finished.wait(5.0)
4151 # The client thread can't skip directly - the SkipTest exception
4152 # would appear as a failure.
4153 if self.serv_skipped:
4154 self.skipTest(self.serv_skipped)
4155
4156 def _testWriteNonBlocking(self):
4157 self.serv_skipped = None
4158 self.serv_conn.setblocking(False)
4159 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004160 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004161 LIMIT = 10
4162 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004163 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004164 self.assertGreater(n, 0)
4165 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004166 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004167 if n is None:
4168 # Succeeded
4169 break
4170 self.assertGreater(n, 0)
4171 else:
4172 # Let us know that this test didn't manage to establish
4173 # the expected conditions. This is not a failure in itself but,
4174 # if it happens repeatedly, the test should be fixed.
4175 self.serv_skipped = "failed to saturate the socket buffer"
4176
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004177
Guido van Rossum8c943832002-08-08 01:00:28 +00004178class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4179
4180 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4181
4182
4183class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4184
4185 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004186
Thomas Woutersb2137042007-02-01 18:02:27 +00004187
Antoine Pitrou834bd812010-10-13 16:17:14 +00004188class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4189 """Tests for socket.makefile() in text mode (rather than binary)"""
4190
4191 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004192 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004193 write_mode = 'wb'
4194 write_msg = MSG
4195 newline = ''
4196
4197
4198class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4199 """Tests for socket.makefile() in text mode (rather than binary)"""
4200
4201 read_mode = 'rb'
4202 read_msg = MSG
4203 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004204 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004205 newline = ''
4206
4207
4208class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4209 """Tests for socket.makefile() in text mode (rather than binary)"""
4210
4211 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004212 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004213 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004214 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004215 newline = ''
4216
4217
Guido van Rossumd8faa362007-04-27 19:54:29 +00004218class NetworkConnectionTest(object):
4219 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004220
Guido van Rossumd8faa362007-04-27 19:54:29 +00004221 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004222 # We're inherited below by BasicTCPTest2, which also inherits
4223 # BasicTCPTest, which defines self.port referenced below.
4224 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004225 self.serv_conn = self.cli
4226
4227class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4228 """Tests that NetworkConnection does not break existing TCP functionality.
4229 """
4230
4231class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004232
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004233 class MockSocket(socket.socket):
4234 def connect(self, *args):
4235 raise socket.timeout('timed out')
4236
4237 @contextlib.contextmanager
4238 def mocked_socket_module(self):
4239 """Return a socket which times out on connect"""
4240 old_socket = socket.socket
4241 socket.socket = self.MockSocket
4242 try:
4243 yield
4244 finally:
4245 socket.socket = old_socket
4246
4247 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004248 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004249 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004250 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004251 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004252 cli.connect((HOST, port))
4253 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4254
4255 def test_create_connection(self):
4256 # Issue #9792: errors raised by create_connection() should have
4257 # a proper errno attribute.
4258 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004259 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004260 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004261
4262 # Issue #16257: create_connection() calls getaddrinfo() against
4263 # 'localhost'. This may result in an IPV6 addr being returned
4264 # as well as an IPV4 one:
4265 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4266 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4267 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4268 #
4269 # create_connection() enumerates through all the addresses returned
4270 # and if it doesn't successfully bind to any of them, it propagates
4271 # the last exception it encountered.
4272 #
4273 # On Solaris, ENETUNREACH is returned in this circumstance instead
4274 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4275 # expected errnos.
4276 expected_errnos = [ errno.ECONNREFUSED, ]
4277 if hasattr(errno, 'ENETUNREACH'):
4278 expected_errnos.append(errno.ENETUNREACH)
4279
4280 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004281
4282 def test_create_connection_timeout(self):
4283 # Issue #9792: create_connection() should not recast timeout errors
4284 # as generic socket errors.
4285 with self.mocked_socket_module():
4286 with self.assertRaises(socket.timeout):
4287 socket.create_connection((HOST, 1234))
4288
Guido van Rossumd8faa362007-04-27 19:54:29 +00004289
Victor Stinner45df8202010-04-28 22:31:17 +00004290@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004291class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4292
4293 def __init__(self, methodName='runTest'):
4294 SocketTCPTest.__init__(self, methodName=methodName)
4295 ThreadableTest.__init__(self)
4296
4297 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004298 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004299
4300 def clientTearDown(self):
4301 self.cli.close()
4302 self.cli = None
4303 ThreadableTest.clientTearDown(self)
4304
4305 def _justAccept(self):
4306 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004307 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004308
4309 testFamily = _justAccept
4310 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004311 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004312 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004313 self.assertEqual(self.cli.family, 2)
4314
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004315 testSourceAddress = _justAccept
4316 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004317 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4318 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004319 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004320 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004321 # The port number being used is sufficient to show that the bind()
4322 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004323
Guido van Rossumd8faa362007-04-27 19:54:29 +00004324 testTimeoutDefault = _justAccept
4325 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004326 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004327 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004328 socket.setdefaulttimeout(42)
4329 try:
4330 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004331 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004332 finally:
4333 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004334 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004335
4336 testTimeoutNone = _justAccept
4337 def _testTimeoutNone(self):
4338 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004339 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004340 socket.setdefaulttimeout(30)
4341 try:
4342 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004343 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004344 finally:
4345 socket.setdefaulttimeout(None)
4346 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004347
4348 testTimeoutValueNamed = _justAccept
4349 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004350 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004351 self.assertEqual(self.cli.gettimeout(), 30)
4352
4353 testTimeoutValueNonamed = _justAccept
4354 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004355 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004356 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004357 self.assertEqual(self.cli.gettimeout(), 30)
4358
Victor Stinner45df8202010-04-28 22:31:17 +00004359@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004360class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4361
4362 def __init__(self, methodName='runTest'):
4363 SocketTCPTest.__init__(self, methodName=methodName)
4364 ThreadableTest.__init__(self)
4365
4366 def clientSetUp(self):
4367 pass
4368
4369 def clientTearDown(self):
4370 self.cli.close()
4371 self.cli = None
4372 ThreadableTest.clientTearDown(self)
4373
4374 def testInsideTimeout(self):
4375 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004376 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004377 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004378 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004379 testOutsideTimeout = testInsideTimeout
4380
4381 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004382 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004383 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004384 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004385
4386 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004387 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004388 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004389
4390
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004391class TCPTimeoutTest(SocketTCPTest):
4392
4393 def testTCPTimeout(self):
4394 def raise_timeout(*args, **kwargs):
4395 self.serv.settimeout(1.0)
4396 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004397 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004398 "Error generating a timeout exception (TCP)")
4399
4400 def testTimeoutZero(self):
4401 ok = False
4402 try:
4403 self.serv.settimeout(0.0)
4404 foo = self.serv.accept()
4405 except socket.timeout:
4406 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004407 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004408 ok = True
4409 except:
4410 self.fail("caught unexpected exception (TCP)")
4411 if not ok:
4412 self.fail("accept() returned success when we did not expect it")
4413
Serhiy Storchaka43767632013-11-03 21:31:38 +02004414 @unittest.skipUnless(hasattr(signal, 'alarm'),
4415 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004416 def testInterruptedTimeout(self):
4417 # XXX I don't know how to do this test on MSWindows or any other
4418 # plaform that doesn't support signal.alarm() or os.kill(), though
4419 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004420 self.serv.settimeout(5.0) # must be longer than alarm
4421 class Alarm(Exception):
4422 pass
4423 def alarm_handler(signal, frame):
4424 raise Alarm
4425 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4426 try:
4427 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4428 try:
4429 foo = self.serv.accept()
4430 except socket.timeout:
4431 self.fail("caught timeout instead of Alarm")
4432 except Alarm:
4433 pass
4434 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004435 self.fail("caught other exception instead of Alarm:"
4436 " %s(%s):\n%s" %
4437 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004438 else:
4439 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004440 finally:
4441 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004442 except Alarm:
4443 self.fail("got Alarm in wrong place")
4444 finally:
4445 # no alarm can be pending. Safe to restore old handler.
4446 signal.signal(signal.SIGALRM, old_alarm)
4447
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004448class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004449
4450 def testUDPTimeout(self):
4451 def raise_timeout(*args, **kwargs):
4452 self.serv.settimeout(1.0)
4453 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004454 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004455 "Error generating a timeout exception (UDP)")
4456
4457 def testTimeoutZero(self):
4458 ok = False
4459 try:
4460 self.serv.settimeout(0.0)
4461 foo = self.serv.recv(1024)
4462 except socket.timeout:
4463 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004464 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004465 ok = True
4466 except:
4467 self.fail("caught unexpected exception (UDP)")
4468 if not ok:
4469 self.fail("recv() returned success when we did not expect it")
4470
4471class TestExceptions(unittest.TestCase):
4472
4473 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004474 self.assertTrue(issubclass(OSError, Exception))
4475 self.assertTrue(issubclass(socket.herror, OSError))
4476 self.assertTrue(issubclass(socket.gaierror, OSError))
4477 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004478
Serhiy Storchaka43767632013-11-03 21:31:38 +02004479@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004480class TestLinuxAbstractNamespace(unittest.TestCase):
4481
4482 UNIX_PATH_MAX = 108
4483
4484 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004485 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004486 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4487 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004488 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004489 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4490 s2.connect(s1.getsockname())
4491 with s1.accept()[0] as s3:
4492 self.assertEqual(s1.getsockname(), address)
4493 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004494
4495 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004496 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004497 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4498 s.bind(address)
4499 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004500
4501 def testNameOverflow(self):
4502 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004503 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004504 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004505
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004506 def testStrName(self):
4507 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004508 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4509 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004510 s.bind("\x00python\x00test\x00")
4511 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004512 finally:
4513 s.close()
4514
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004515 def testBytearrayName(self):
4516 # Check that an abstract name can be passed as a bytearray.
4517 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4518 s.bind(bytearray(b"\x00python\x00test\x00"))
4519 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4520
Serhiy Storchaka43767632013-11-03 21:31:38 +02004521@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004522class TestUnixDomain(unittest.TestCase):
4523
4524 def setUp(self):
4525 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4526
4527 def tearDown(self):
4528 self.sock.close()
4529
4530 def encoded(self, path):
4531 # Return the given path encoded in the file system encoding,
4532 # or skip the test if this is not possible.
4533 try:
4534 return os.fsencode(path)
4535 except UnicodeEncodeError:
4536 self.skipTest(
4537 "Pathname {0!a} cannot be represented in file "
4538 "system encoding {1!r}".format(
4539 path, sys.getfilesystemencoding()))
4540
Antoine Pitrou16374872011-12-16 15:04:12 +01004541 def bind(self, sock, path):
4542 # Bind the socket
4543 try:
4544 sock.bind(path)
4545 except OSError as e:
4546 if str(e) == "AF_UNIX path too long":
4547 self.skipTest(
4548 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4549 .format(path))
4550 else:
4551 raise
4552
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004553 def testStrAddr(self):
4554 # Test binding to and retrieving a normal string pathname.
4555 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004556 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004557 self.addCleanup(support.unlink, path)
4558 self.assertEqual(self.sock.getsockname(), path)
4559
4560 def testBytesAddr(self):
4561 # Test binding to a bytes pathname.
4562 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004563 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004564 self.addCleanup(support.unlink, path)
4565 self.assertEqual(self.sock.getsockname(), path)
4566
4567 def testSurrogateescapeBind(self):
4568 # Test binding to a valid non-ASCII pathname, with the
4569 # non-ASCII bytes supplied using surrogateescape encoding.
4570 path = os.path.abspath(support.TESTFN_UNICODE)
4571 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004572 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004573 self.addCleanup(support.unlink, path)
4574 self.assertEqual(self.sock.getsockname(), path)
4575
4576 def testUnencodableAddr(self):
4577 # Test binding to a pathname that cannot be encoded in the
4578 # file system encoding.
4579 if support.TESTFN_UNENCODABLE is None:
4580 self.skipTest("No unencodable filename available")
4581 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004582 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004583 self.addCleanup(support.unlink, path)
4584 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004585
Victor Stinner45df8202010-04-28 22:31:17 +00004586@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004587class BufferIOTest(SocketConnectedTest):
4588 """
4589 Test the buffer versions of socket.recv() and socket.send().
4590 """
4591 def __init__(self, methodName='runTest'):
4592 SocketConnectedTest.__init__(self, methodName=methodName)
4593
Antoine Pitrou25480782010-03-17 22:50:28 +00004594 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004595 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004596 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004597 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004598 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004599 self.assertEqual(msg, MSG)
4600
Antoine Pitrou25480782010-03-17 22:50:28 +00004601 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004602 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004603 self.serv_conn.send(buf)
4604
Antoine Pitrou25480782010-03-17 22:50:28 +00004605 def testRecvIntoBytearray(self):
4606 buf = bytearray(1024)
4607 nbytes = self.cli_conn.recv_into(buf)
4608 self.assertEqual(nbytes, len(MSG))
4609 msg = buf[:len(MSG)]
4610 self.assertEqual(msg, MSG)
4611
4612 _testRecvIntoBytearray = _testRecvIntoArray
4613
4614 def testRecvIntoMemoryview(self):
4615 buf = bytearray(1024)
4616 nbytes = self.cli_conn.recv_into(memoryview(buf))
4617 self.assertEqual(nbytes, len(MSG))
4618 msg = buf[:len(MSG)]
4619 self.assertEqual(msg, MSG)
4620
4621 _testRecvIntoMemoryview = _testRecvIntoArray
4622
4623 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004624 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004625 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004626 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004627 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004628 self.assertEqual(msg, MSG)
4629
Antoine Pitrou25480782010-03-17 22:50:28 +00004630 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004631 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004632 self.serv_conn.send(buf)
4633
Antoine Pitrou25480782010-03-17 22:50:28 +00004634 def testRecvFromIntoBytearray(self):
4635 buf = bytearray(1024)
4636 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4637 self.assertEqual(nbytes, len(MSG))
4638 msg = buf[:len(MSG)]
4639 self.assertEqual(msg, MSG)
4640
4641 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4642
4643 def testRecvFromIntoMemoryview(self):
4644 buf = bytearray(1024)
4645 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4646 self.assertEqual(nbytes, len(MSG))
4647 msg = buf[:len(MSG)]
4648 self.assertEqual(msg, MSG)
4649
4650 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4651
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004652 def testRecvFromIntoSmallBuffer(self):
4653 # See issue #20246.
4654 buf = bytearray(8)
4655 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4656
4657 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004658 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004659
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004660 def testRecvFromIntoEmptyBuffer(self):
4661 buf = bytearray()
4662 self.cli_conn.recvfrom_into(buf)
4663 self.cli_conn.recvfrom_into(buf, 0)
4664
4665 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4666
Christian Heimes043d6f62008-01-07 17:19:16 +00004667
4668TIPC_STYPE = 2000
4669TIPC_LOWER = 200
4670TIPC_UPPER = 210
4671
4672def isTipcAvailable():
4673 """Check if the TIPC module is loaded
4674
4675 The TIPC module is not loaded automatically on Ubuntu and probably
4676 other Linux distros.
4677 """
4678 if not hasattr(socket, "AF_TIPC"):
4679 return False
4680 if not os.path.isfile("/proc/modules"):
4681 return False
4682 with open("/proc/modules") as f:
4683 for line in f:
4684 if line.startswith("tipc "):
4685 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004686 return False
4687
Serhiy Storchaka43767632013-11-03 21:31:38 +02004688@unittest.skipUnless(isTipcAvailable(),
4689 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004690class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004691 def testRDM(self):
4692 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4693 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004694 self.addCleanup(srv.close)
4695 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004696
4697 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4698 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4699 TIPC_LOWER, TIPC_UPPER)
4700 srv.bind(srvaddr)
4701
4702 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4703 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4704 cli.sendto(MSG, sendaddr)
4705
4706 msg, recvaddr = srv.recvfrom(1024)
4707
4708 self.assertEqual(cli.getsockname(), recvaddr)
4709 self.assertEqual(msg, MSG)
4710
4711
Serhiy Storchaka43767632013-11-03 21:31:38 +02004712@unittest.skipUnless(isTipcAvailable(),
4713 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004714class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004715 def __init__(self, methodName = 'runTest'):
4716 unittest.TestCase.__init__(self, methodName = methodName)
4717 ThreadableTest.__init__(self)
4718
4719 def setUp(self):
4720 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004721 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004722 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4723 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4724 TIPC_LOWER, TIPC_UPPER)
4725 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004726 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004727 self.serverExplicitReady()
4728 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004729 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004730
4731 def clientSetUp(self):
4732 # The is a hittable race between serverExplicitReady() and the
4733 # accept() call; sleep a little while to avoid it, otherwise
4734 # we could get an exception
4735 time.sleep(0.1)
4736 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004737 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004738 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4739 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4740 self.cli.connect(addr)
4741 self.cliaddr = self.cli.getsockname()
4742
4743 def testStream(self):
4744 msg = self.conn.recv(1024)
4745 self.assertEqual(msg, MSG)
4746 self.assertEqual(self.cliaddr, self.connaddr)
4747
4748 def _testStream(self):
4749 self.cli.send(MSG)
4750 self.cli.close()
4751
4752
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004753@unittest.skipUnless(thread, 'Threading required for this test.')
4754class ContextManagersTest(ThreadedTCPSocketTest):
4755
4756 def _testSocketClass(self):
4757 # base test
4758 with socket.socket() as sock:
4759 self.assertFalse(sock._closed)
4760 self.assertTrue(sock._closed)
4761 # close inside with block
4762 with socket.socket() as sock:
4763 sock.close()
4764 self.assertTrue(sock._closed)
4765 # exception inside with block
4766 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004767 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004768 self.assertTrue(sock._closed)
4769
4770 def testCreateConnectionBase(self):
4771 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004772 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004773 data = conn.recv(1024)
4774 conn.sendall(data)
4775
4776 def _testCreateConnectionBase(self):
4777 address = self.serv.getsockname()
4778 with socket.create_connection(address) as sock:
4779 self.assertFalse(sock._closed)
4780 sock.sendall(b'foo')
4781 self.assertEqual(sock.recv(1024), b'foo')
4782 self.assertTrue(sock._closed)
4783
4784 def testCreateConnectionClose(self):
4785 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004786 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004787 data = conn.recv(1024)
4788 conn.sendall(data)
4789
4790 def _testCreateConnectionClose(self):
4791 address = self.serv.getsockname()
4792 with socket.create_connection(address) as sock:
4793 sock.close()
4794 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004795 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004796
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004797
Victor Stinnerdaf45552013-08-28 00:53:59 +02004798class InheritanceTest(unittest.TestCase):
4799 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4800 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004801 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004802 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004803 with socket.socket(socket.AF_INET,
4804 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4805 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004806 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004807
4808 def test_default_inheritable(self):
4809 sock = socket.socket()
4810 with sock:
4811 self.assertEqual(sock.get_inheritable(), False)
4812
4813 def test_dup(self):
4814 sock = socket.socket()
4815 with sock:
4816 newsock = sock.dup()
4817 sock.close()
4818 with newsock:
4819 self.assertEqual(newsock.get_inheritable(), False)
4820
4821 def test_set_inheritable(self):
4822 sock = socket.socket()
4823 with sock:
4824 sock.set_inheritable(True)
4825 self.assertEqual(sock.get_inheritable(), True)
4826
4827 sock.set_inheritable(False)
4828 self.assertEqual(sock.get_inheritable(), False)
4829
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004830 @unittest.skipIf(fcntl is None, "need fcntl")
4831 def test_get_inheritable_cloexec(self):
4832 sock = socket.socket()
4833 with sock:
4834 fd = sock.fileno()
4835 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004836
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004837 # clear FD_CLOEXEC flag
4838 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4839 flags &= ~fcntl.FD_CLOEXEC
4840 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004841
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004842 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004843
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004844 @unittest.skipIf(fcntl is None, "need fcntl")
4845 def test_set_inheritable_cloexec(self):
4846 sock = socket.socket()
4847 with sock:
4848 fd = sock.fileno()
4849 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4850 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004851
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004852 sock.set_inheritable(True)
4853 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4854 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004855
4856
Victor Stinnerdaf45552013-08-28 00:53:59 +02004857 @unittest.skipUnless(hasattr(socket, "socketpair"),
4858 "need socket.socketpair()")
4859 def test_socketpair(self):
4860 s1, s2 = socket.socketpair()
4861 self.addCleanup(s1.close)
4862 self.addCleanup(s2.close)
4863 self.assertEqual(s1.get_inheritable(), False)
4864 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004865
4866
4867@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4868 "SOCK_NONBLOCK not defined")
4869class NonblockConstantTest(unittest.TestCase):
4870 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4871 if nonblock:
4872 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4873 self.assertEqual(s.gettimeout(), timeout)
4874 else:
4875 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4876 self.assertEqual(s.gettimeout(), None)
4877
Charles-François Natali239bb962011-06-03 12:55:15 +02004878 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004879 def test_SOCK_NONBLOCK(self):
4880 # a lot of it seems silly and redundant, but I wanted to test that
4881 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004882 with socket.socket(socket.AF_INET,
4883 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4884 self.checkNonblock(s)
4885 s.setblocking(1)
4886 self.checkNonblock(s, False)
4887 s.setblocking(0)
4888 self.checkNonblock(s)
4889 s.settimeout(None)
4890 self.checkNonblock(s, False)
4891 s.settimeout(2.0)
4892 self.checkNonblock(s, timeout=2.0)
4893 s.setblocking(1)
4894 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004895 # defaulttimeout
4896 t = socket.getdefaulttimeout()
4897 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004898 with socket.socket() as s:
4899 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004900 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004901 with socket.socket() as s:
4902 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004903 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004904 with socket.socket() as s:
4905 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004906 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004907 with socket.socket() as s:
4908 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004909 socket.setdefaulttimeout(t)
4910
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004911
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004912@unittest.skipUnless(os.name == "nt", "Windows specific")
4913@unittest.skipUnless(multiprocessing, "need multiprocessing")
4914class TestSocketSharing(SocketTCPTest):
4915 # This must be classmethod and not staticmethod or multiprocessing
4916 # won't be able to bootstrap it.
4917 @classmethod
4918 def remoteProcessServer(cls, q):
4919 # Recreate socket from shared data
4920 sdata = q.get()
4921 message = q.get()
4922
4923 s = socket.fromshare(sdata)
4924 s2, c = s.accept()
4925
4926 # Send the message
4927 s2.sendall(message)
4928 s2.close()
4929 s.close()
4930
4931 def testShare(self):
4932 # Transfer the listening server socket to another process
4933 # and service it from there.
4934
4935 # Create process:
4936 q = multiprocessing.Queue()
4937 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4938 p.start()
4939
4940 # Get the shared socket data
4941 data = self.serv.share(p.pid)
4942
4943 # Pass the shared socket to the other process
4944 addr = self.serv.getsockname()
4945 self.serv.close()
4946 q.put(data)
4947
4948 # The data that the server will send us
4949 message = b"slapmahfro"
4950 q.put(message)
4951
4952 # Connect
4953 s = socket.create_connection(addr)
4954 # listen for the data
4955 m = []
4956 while True:
4957 data = s.recv(100)
4958 if not data:
4959 break
4960 m.append(data)
4961 s.close()
4962 received = b"".join(m)
4963 self.assertEqual(received, message)
4964 p.join()
4965
4966 def testShareLength(self):
4967 data = self.serv.share(os.getpid())
4968 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4969 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4970
4971 def compareSockets(self, org, other):
4972 # socket sharing is expected to work only for blocking socket
4973 # since the internal python timout value isn't transfered.
4974 self.assertEqual(org.gettimeout(), None)
4975 self.assertEqual(org.gettimeout(), other.gettimeout())
4976
4977 self.assertEqual(org.family, other.family)
4978 self.assertEqual(org.type, other.type)
4979 # If the user specified "0" for proto, then
4980 # internally windows will have picked the correct value.
4981 # Python introspection on the socket however will still return
4982 # 0. For the shared socket, the python value is recreated
4983 # from the actual value, so it may not compare correctly.
4984 if org.proto != 0:
4985 self.assertEqual(org.proto, other.proto)
4986
4987 def testShareLocal(self):
4988 data = self.serv.share(os.getpid())
4989 s = socket.fromshare(data)
4990 try:
4991 self.compareSockets(self.serv, s)
4992 finally:
4993 s.close()
4994
4995 def testTypes(self):
4996 families = [socket.AF_INET, socket.AF_INET6]
4997 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4998 for f in families:
4999 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005000 try:
5001 source = socket.socket(f, t)
5002 except OSError:
5003 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005004 try:
5005 data = source.share(os.getpid())
5006 shared = socket.fromshare(data)
5007 try:
5008 self.compareSockets(source, shared)
5009 finally:
5010 shared.close()
5011 finally:
5012 source.close()
5013
5014
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005015@unittest.skipUnless(thread, 'Threading required for this test.')
5016class SendfileUsingSendTest(ThreadedTCPSocketTest):
5017 """
5018 Test the send() implementation of socket.sendfile().
5019 """
5020
5021 FILESIZE = (10 * 1024 * 1024) # 10MB
5022 BUFSIZE = 8192
5023 FILEDATA = b""
5024 TIMEOUT = 2
5025
5026 @classmethod
5027 def setUpClass(cls):
5028 def chunks(total, step):
5029 assert total >= step
5030 while total > step:
5031 yield step
5032 total -= step
5033 if total:
5034 yield total
5035
5036 chunk = b"".join([random.choice(string.ascii_letters).encode()
5037 for i in range(cls.BUFSIZE)])
5038 with open(support.TESTFN, 'wb') as f:
5039 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5040 f.write(chunk)
5041 with open(support.TESTFN, 'rb') as f:
5042 cls.FILEDATA = f.read()
5043 assert len(cls.FILEDATA) == cls.FILESIZE
5044
5045 @classmethod
5046 def tearDownClass(cls):
5047 support.unlink(support.TESTFN)
5048
5049 def accept_conn(self):
5050 self.serv.settimeout(self.TIMEOUT)
5051 conn, addr = self.serv.accept()
5052 conn.settimeout(self.TIMEOUT)
5053 self.addCleanup(conn.close)
5054 return conn
5055
5056 def recv_data(self, conn):
5057 received = []
5058 while True:
5059 chunk = conn.recv(self.BUFSIZE)
5060 if not chunk:
5061 break
5062 received.append(chunk)
5063 return b''.join(received)
5064
5065 def meth_from_sock(self, sock):
5066 # Depending on the mixin class being run return either send()
5067 # or sendfile() method implementation.
5068 return getattr(sock, "_sendfile_use_send")
5069
5070 # regular file
5071
5072 def _testRegularFile(self):
5073 address = self.serv.getsockname()
5074 file = open(support.TESTFN, 'rb')
5075 with socket.create_connection(address) as sock, file as file:
5076 meth = self.meth_from_sock(sock)
5077 sent = meth(file)
5078 self.assertEqual(sent, self.FILESIZE)
5079 self.assertEqual(file.tell(), self.FILESIZE)
5080
5081 def testRegularFile(self):
5082 conn = self.accept_conn()
5083 data = self.recv_data(conn)
5084 self.assertEqual(len(data), self.FILESIZE)
5085 self.assertEqual(data, self.FILEDATA)
5086
5087 # non regular file
5088
5089 def _testNonRegularFile(self):
5090 address = self.serv.getsockname()
5091 file = io.BytesIO(self.FILEDATA)
5092 with socket.create_connection(address) as sock, file as file:
5093 sent = sock.sendfile(file)
5094 self.assertEqual(sent, self.FILESIZE)
5095 self.assertEqual(file.tell(), self.FILESIZE)
5096 self.assertRaises(socket._GiveupOnSendfile,
5097 sock._sendfile_use_sendfile, file)
5098
5099 def testNonRegularFile(self):
5100 conn = self.accept_conn()
5101 data = self.recv_data(conn)
5102 self.assertEqual(len(data), self.FILESIZE)
5103 self.assertEqual(data, self.FILEDATA)
5104
5105 # empty file
5106
5107 def _testEmptyFileSend(self):
5108 address = self.serv.getsockname()
5109 filename = support.TESTFN + "2"
5110 with open(filename, 'wb'):
5111 self.addCleanup(support.unlink, filename)
5112 file = open(filename, 'rb')
5113 with socket.create_connection(address) as sock, file as file:
5114 meth = self.meth_from_sock(sock)
5115 sent = meth(file)
5116 self.assertEqual(sent, 0)
5117 self.assertEqual(file.tell(), 0)
5118
5119 def testEmptyFileSend(self):
5120 conn = self.accept_conn()
5121 data = self.recv_data(conn)
5122 self.assertEqual(data, b"")
5123
5124 # offset
5125
5126 def _testOffset(self):
5127 address = self.serv.getsockname()
5128 file = open(support.TESTFN, 'rb')
5129 with socket.create_connection(address) as sock, file as file:
5130 meth = self.meth_from_sock(sock)
5131 sent = meth(file, offset=5000)
5132 self.assertEqual(sent, self.FILESIZE - 5000)
5133 self.assertEqual(file.tell(), self.FILESIZE)
5134
5135 def testOffset(self):
5136 conn = self.accept_conn()
5137 data = self.recv_data(conn)
5138 self.assertEqual(len(data), self.FILESIZE - 5000)
5139 self.assertEqual(data, self.FILEDATA[5000:])
5140
5141 # count
5142
5143 def _testCount(self):
5144 address = self.serv.getsockname()
5145 file = open(support.TESTFN, 'rb')
5146 with socket.create_connection(address, timeout=2) as sock, file as file:
5147 count = 5000007
5148 meth = self.meth_from_sock(sock)
5149 sent = meth(file, count=count)
5150 self.assertEqual(sent, count)
5151 self.assertEqual(file.tell(), count)
5152
5153 def testCount(self):
5154 count = 5000007
5155 conn = self.accept_conn()
5156 data = self.recv_data(conn)
5157 self.assertEqual(len(data), count)
5158 self.assertEqual(data, self.FILEDATA[:count])
5159
5160 # count small
5161
5162 def _testCountSmall(self):
5163 address = self.serv.getsockname()
5164 file = open(support.TESTFN, 'rb')
5165 with socket.create_connection(address, timeout=2) as sock, file as file:
5166 count = 1
5167 meth = self.meth_from_sock(sock)
5168 sent = meth(file, count=count)
5169 self.assertEqual(sent, count)
5170 self.assertEqual(file.tell(), count)
5171
5172 def testCountSmall(self):
5173 count = 1
5174 conn = self.accept_conn()
5175 data = self.recv_data(conn)
5176 self.assertEqual(len(data), count)
5177 self.assertEqual(data, self.FILEDATA[:count])
5178
5179 # count + offset
5180
5181 def _testCountWithOffset(self):
5182 address = self.serv.getsockname()
5183 file = open(support.TESTFN, 'rb')
5184 with socket.create_connection(address, timeout=2) as sock, file as file:
5185 count = 100007
5186 meth = self.meth_from_sock(sock)
5187 sent = meth(file, offset=2007, count=count)
5188 self.assertEqual(sent, count)
5189 self.assertEqual(file.tell(), count + 2007)
5190
5191 def testCountWithOffset(self):
5192 count = 100007
5193 conn = self.accept_conn()
5194 data = self.recv_data(conn)
5195 self.assertEqual(len(data), count)
5196 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5197
5198 # non blocking sockets are not supposed to work
5199
5200 def _testNonBlocking(self):
5201 address = self.serv.getsockname()
5202 file = open(support.TESTFN, 'rb')
5203 with socket.create_connection(address) as sock, file as file:
5204 sock.setblocking(False)
5205 meth = self.meth_from_sock(sock)
5206 self.assertRaises(ValueError, meth, file)
5207 self.assertRaises(ValueError, sock.sendfile, file)
5208
5209 def testNonBlocking(self):
5210 conn = self.accept_conn()
5211 if conn.recv(8192):
5212 self.fail('was not supposed to receive any data')
5213
5214 # timeout (non-triggered)
5215
5216 def _testWithTimeout(self):
5217 address = self.serv.getsockname()
5218 file = open(support.TESTFN, 'rb')
5219 with socket.create_connection(address, timeout=2) as sock, file as file:
5220 meth = self.meth_from_sock(sock)
5221 sent = meth(file)
5222 self.assertEqual(sent, self.FILESIZE)
5223
5224 def testWithTimeout(self):
5225 conn = self.accept_conn()
5226 data = self.recv_data(conn)
5227 self.assertEqual(len(data), self.FILESIZE)
5228 self.assertEqual(data, self.FILEDATA)
5229
5230 # timeout (triggered)
5231
5232 def _testWithTimeoutTriggeredSend(self):
5233 address = self.serv.getsockname()
5234 file = open(support.TESTFN, 'rb')
5235 with socket.create_connection(address, timeout=0.01) as sock, \
5236 file as file:
5237 meth = self.meth_from_sock(sock)
5238 self.assertRaises(socket.timeout, meth, file)
5239
5240 def testWithTimeoutTriggeredSend(self):
5241 conn = self.accept_conn()
5242 conn.recv(88192)
5243
5244 # errors
5245
5246 def _test_errors(self):
5247 pass
5248
5249 def test_errors(self):
5250 with open(support.TESTFN, 'rb') as file:
5251 with socket.socket(type=socket.SOCK_DGRAM) as s:
5252 meth = self.meth_from_sock(s)
5253 self.assertRaisesRegex(
5254 ValueError, "SOCK_STREAM", meth, file)
5255 with open(support.TESTFN, 'rt') as file:
5256 with socket.socket() as s:
5257 meth = self.meth_from_sock(s)
5258 self.assertRaisesRegex(
5259 ValueError, "binary mode", meth, file)
5260 with open(support.TESTFN, 'rb') as file:
5261 with socket.socket() as s:
5262 meth = self.meth_from_sock(s)
5263 self.assertRaisesRegex(TypeError, "positive integer",
5264 meth, file, count='2')
5265 self.assertRaisesRegex(TypeError, "positive integer",
5266 meth, file, count=0.1)
5267 self.assertRaisesRegex(ValueError, "positive integer",
5268 meth, file, count=0)
5269 self.assertRaisesRegex(ValueError, "positive integer",
5270 meth, file, count=-1)
5271
5272
5273@unittest.skipUnless(thread, 'Threading required for this test.')
5274@unittest.skipUnless(hasattr(os, "sendfile"),
5275 'os.sendfile() required for this test.')
5276class SendfileUsingSendfileTest(SendfileUsingSendTest):
5277 """
5278 Test the sendfile() implementation of socket.sendfile().
5279 """
5280 def meth_from_sock(self, sock):
5281 return getattr(sock, "_sendfile_use_sendfile")
5282
5283
Guido van Rossumb995eb72002-07-31 16:08:40 +00005284def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005285 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005286 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005287
5288 tests.extend([
5289 NonBlockingTCPTests,
5290 FileObjectClassTestCase,
5291 UnbufferedFileObjectClassTestCase,
5292 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005293 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005294 UnicodeReadFileObjectClassTestCase,
5295 UnicodeWriteFileObjectClassTestCase,
5296 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005297 NetworkConnectionNoServer,
5298 NetworkConnectionAttributesTest,
5299 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005300 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005301 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005302 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005303 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005304 tests.append(BasicSocketPairTest)
5305 tests.append(TestUnixDomain)
5306 tests.append(TestLinuxAbstractNamespace)
5307 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005308 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005309 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005310 tests.extend([
5311 CmsgMacroTests,
5312 SendmsgUDPTest,
5313 RecvmsgUDPTest,
5314 RecvmsgIntoUDPTest,
5315 SendmsgUDP6Test,
5316 RecvmsgUDP6Test,
5317 RecvmsgRFC3542AncillaryUDP6Test,
5318 RecvmsgIntoRFC3542AncillaryUDP6Test,
5319 RecvmsgIntoUDP6Test,
5320 SendmsgTCPTest,
5321 RecvmsgTCPTest,
5322 RecvmsgIntoTCPTest,
5323 SendmsgSCTPStreamTest,
5324 RecvmsgSCTPStreamTest,
5325 RecvmsgIntoSCTPStreamTest,
5326 SendmsgUnixStreamTest,
5327 RecvmsgUnixStreamTest,
5328 RecvmsgIntoUnixStreamTest,
5329 RecvmsgSCMRightsStreamTest,
5330 RecvmsgIntoSCMRightsStreamTest,
5331 # These are slow when setitimer() is not available
5332 InterruptedRecvTimeoutTest,
5333 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005334 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005335 SendfileUsingSendTest,
5336 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005337 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005338
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005339 thread_info = support.threading_setup()
5340 support.run_unittest(*tests)
5341 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005342
5343if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005344 test_main()