blob: 546d79309128e863832cf11abb32fdf7a62588e8 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +100010import tempfile
11import _testcapi
Christian Heimesbbe741d2008-03-28 10:53:29 +000012import time
13import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000014import queue
Jack Jansen522e7692002-09-06 21:57:50 +000015import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000016import os
17import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000018import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000019import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000020from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000021import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000022import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010023import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020024import struct
Antoine Pitroub1c54962010-10-14 15:05:38 +000025try:
26 import fcntl
27except ImportError:
28 fcntl = False
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000029try:
30 import multiprocessing
31except ImportError:
32 multiprocessing = False
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
43
Charles-François Natali47413c12011-10-06 19:47:44 +020044def _have_socket_can():
45 """Check whether CAN sockets are supported on this host."""
46 try:
47 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020048 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020049 return False
50 else:
51 s.close()
52 return True
53
Charles-François Natali10b8cf42011-11-10 19:21:37 +010054def _have_socket_rds():
55 """Check whether RDS sockets are supported on this host."""
56 try:
57 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
58 except (AttributeError, OSError):
59 return False
60 else:
61 s.close()
62 return True
63
Charles-François Natali47413c12011-10-06 19:47:44 +020064HAVE_SOCKET_CAN = _have_socket_can()
65
Charles-François Natali10b8cf42011-11-10 19:21:37 +010066HAVE_SOCKET_RDS = _have_socket_rds()
67
Nick Coghlan96fe56a2011-08-22 11:55:57 +100068# Size in bytes of the int type
69SIZEOF_INT = array.array("i").itemsize
70
Guido van Rossum24e4af82002-06-12 19:18:08 +000071class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000072
Guido van Rossum24e4af82002-06-12 19:18:08 +000073 def setUp(self):
74 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000075 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000076 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000077
Guido van Rossum24e4af82002-06-12 19:18:08 +000078 def tearDown(self):
79 self.serv.close()
80 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000081
Guido van Rossum24e4af82002-06-12 19:18:08 +000082class SocketUDPTest(unittest.TestCase):
83
84 def setUp(self):
85 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000086 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000087
88 def tearDown(self):
89 self.serv.close()
90 self.serv = None
91
Nick Coghlan96fe56a2011-08-22 11:55:57 +100092class ThreadSafeCleanupTestCase(unittest.TestCase):
93 """Subclass of unittest.TestCase with thread-safe cleanup methods.
94
95 This subclass protects the addCleanup() and doCleanups() methods
96 with a recursive lock.
97 """
98
99 if threading:
100 def __init__(self, *args, **kwargs):
101 super().__init__(*args, **kwargs)
102 self._cleanup_lock = threading.RLock()
103
104 def addCleanup(self, *args, **kwargs):
105 with self._cleanup_lock:
106 return super().addCleanup(*args, **kwargs)
107
108 def doCleanups(self, *args, **kwargs):
109 with self._cleanup_lock:
110 return super().doCleanups(*args, **kwargs)
111
Charles-François Natali47413c12011-10-06 19:47:44 +0200112class SocketCANTest(unittest.TestCase):
113
114 """To be able to run this test, a `vcan0` CAN interface can be created with
115 the following commands:
116 # modprobe vcan
117 # ip link add dev vcan0 type vcan
118 # ifconfig vcan0 up
119 """
120 interface = 'vcan0'
121 bufsize = 128
122
Charles-François Natali773e42d2013-02-05 19:42:01 +0100123 """The CAN frame structure is defined in <linux/can.h>:
124
125 struct can_frame {
126 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
127 __u8 can_dlc; /* data length code: 0 .. 8 */
128 __u8 data[8] __attribute__((aligned(8)));
129 };
130 """
131 can_frame_fmt = "=IB3x8s"
132 can_frame_size = struct.calcsize(can_frame_fmt)
133
134 """The Broadcast Management Command frame structure is defined
135 in <linux/can/bcm.h>:
136
137 struct bcm_msg_head {
138 __u32 opcode;
139 __u32 flags;
140 __u32 count;
141 struct timeval ival1, ival2;
142 canid_t can_id;
143 __u32 nframes;
144 struct can_frame frames[0];
145 }
146
147 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
148 `struct can_frame` definition). Must use native not standard types for packing.
149 """
150 bcm_cmd_msg_fmt = "@3I4l2I"
151 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
152
Charles-François Natali47413c12011-10-06 19:47:44 +0200153 def setUp(self):
154 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200155 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200156 try:
157 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200158 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200159 self.skipTest('network interface `%s` does not exist' %
160 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200161
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100162
163class SocketRDSTest(unittest.TestCase):
164
165 """To be able to run this test, the `rds` kernel module must be loaded:
166 # modprobe rds
167 """
168 bufsize = 8192
169
170 def setUp(self):
171 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
172 self.addCleanup(self.serv.close)
173 try:
174 self.port = support.bind_port(self.serv)
175 except OSError:
176 self.skipTest('unable to bind RDS socket')
177
178
Guido van Rossum24e4af82002-06-12 19:18:08 +0000179class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000180 """Threadable Test class
181
182 The ThreadableTest class makes it easy to create a threaded
183 client/server pair from an existing unit test. To create a
184 new threaded class from an existing unit test, use multiple
185 inheritance:
186
187 class NewClass (OldClass, ThreadableTest):
188 pass
189
190 This class defines two new fixture functions with obvious
191 purposes for overriding:
192
193 clientSetUp ()
194 clientTearDown ()
195
196 Any new test functions within the class must then define
197 tests in pairs, where the test name is preceeded with a
198 '_' to indicate the client portion of the test. Ex:
199
200 def testFoo(self):
201 # Server portion
202
203 def _testFoo(self):
204 # Client portion
205
206 Any exceptions raised by the clients during their tests
207 are caught and transferred to the main thread to alert
208 the testing framework.
209
210 Note, the server setup function cannot call any blocking
211 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000212 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000213 the blocking call (such as in setting up a client/server
214 connection and performing the accept() in setUp().
215 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000216
217 def __init__(self):
218 # Swap the true setup function
219 self.__setUp = self.setUp
220 self.__tearDown = self.tearDown
221 self.setUp = self._setUp
222 self.tearDown = self._tearDown
223
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000224 def serverExplicitReady(self):
225 """This method allows the server to explicitly indicate that
226 it wants the client thread to proceed. This is useful if the
227 server is about to execute a blocking routine that is
228 dependent upon the client thread during its setup routine."""
229 self.server_ready.set()
230
Guido van Rossum24e4af82002-06-12 19:18:08 +0000231 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000232 self.server_ready = threading.Event()
233 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000234 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000235 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200236 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000237
238 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000239 methodname = self.id()
240 i = methodname.rfind('.')
241 methodname = methodname[i+1:]
242 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000243 self.client_thread = thread.start_new_thread(
244 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000245
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200246 try:
247 self.__setUp()
248 except:
249 self.server_crashed = True
250 raise
251 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000252 self.server_ready.set()
253 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000254
255 def _tearDown(self):
256 self.__tearDown()
257 self.done.wait()
258
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000259 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000260 exc = self.queue.get()
261 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000262
263 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000264 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000265 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200266 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200267 if self.server_crashed:
268 self.clientTearDown()
269 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000270 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000271 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000272 try:
273 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000274 except BaseException as e:
275 self.queue.put(e)
276 finally:
277 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000278
279 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000280 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000281
282 def clientTearDown(self):
283 self.done.set()
284 thread.exit()
285
286class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
287
288 def __init__(self, methodName='runTest'):
289 SocketTCPTest.__init__(self, methodName=methodName)
290 ThreadableTest.__init__(self)
291
292 def clientSetUp(self):
293 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
294
295 def clientTearDown(self):
296 self.cli.close()
297 self.cli = None
298 ThreadableTest.clientTearDown(self)
299
300class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
301
302 def __init__(self, methodName='runTest'):
303 SocketUDPTest.__init__(self, methodName=methodName)
304 ThreadableTest.__init__(self)
305
306 def clientSetUp(self):
307 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
308
Brian Curtin3beb38f2010-11-04 03:41:43 +0000309 def clientTearDown(self):
310 self.cli.close()
311 self.cli = None
312 ThreadableTest.clientTearDown(self)
313
Charles-François Natali47413c12011-10-06 19:47:44 +0200314class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
315
316 def __init__(self, methodName='runTest'):
317 SocketCANTest.__init__(self, methodName=methodName)
318 ThreadableTest.__init__(self)
319
320 def clientSetUp(self):
321 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
322 try:
323 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200324 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200325 # skipTest should not be called here, and will be called in the
326 # server instead
327 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200328
329 def clientTearDown(self):
330 self.cli.close()
331 self.cli = None
332 ThreadableTest.clientTearDown(self)
333
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100334class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
335
336 def __init__(self, methodName='runTest'):
337 SocketRDSTest.__init__(self, methodName=methodName)
338 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100339
340 def clientSetUp(self):
341 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
342 try:
343 # RDS sockets must be bound explicitly to send or receive data
344 self.cli.bind((HOST, 0))
345 self.cli_addr = self.cli.getsockname()
346 except OSError:
347 # skipTest should not be called here, and will be called in the
348 # server instead
349 pass
350
351 def clientTearDown(self):
352 self.cli.close()
353 self.cli = None
354 ThreadableTest.clientTearDown(self)
355
Guido van Rossum24e4af82002-06-12 19:18:08 +0000356class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000357 """Socket tests for client-server connection.
358
359 self.cli_conn is a client socket connected to the server. The
360 setUp() method guarantees that it is connected to the server.
361 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000362
363 def __init__(self, methodName='runTest'):
364 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
365
366 def setUp(self):
367 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000368 # Indicate explicitly we're ready for the client thread to
369 # proceed and then perform the blocking call to accept
370 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000371 conn, addr = self.serv.accept()
372 self.cli_conn = conn
373
374 def tearDown(self):
375 self.cli_conn.close()
376 self.cli_conn = None
377 ThreadedTCPSocketTest.tearDown(self)
378
379 def clientSetUp(self):
380 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000381 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000382 self.serv_conn = self.cli
383
384 def clientTearDown(self):
385 self.serv_conn.close()
386 self.serv_conn = None
387 ThreadedTCPSocketTest.clientTearDown(self)
388
Dave Cole331708b2004-08-09 04:51:41 +0000389class SocketPairTest(unittest.TestCase, ThreadableTest):
390
391 def __init__(self, methodName='runTest'):
392 unittest.TestCase.__init__(self, methodName=methodName)
393 ThreadableTest.__init__(self)
394
395 def setUp(self):
396 self.serv, self.cli = socket.socketpair()
397
398 def tearDown(self):
399 self.serv.close()
400 self.serv = None
401
402 def clientSetUp(self):
403 pass
404
405 def clientTearDown(self):
406 self.cli.close()
407 self.cli = None
408 ThreadableTest.clientTearDown(self)
409
Tim Peters494aaee2004-08-09 18:54:11 +0000410
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000411# The following classes are used by the sendmsg()/recvmsg() tests.
412# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
413# gives a drop-in replacement for SocketConnectedTest, but different
414# address families can be used, and the attributes serv_addr and
415# cli_addr will be set to the addresses of the endpoints.
416
417class SocketTestBase(unittest.TestCase):
418 """A base class for socket tests.
419
420 Subclasses must provide methods newSocket() to return a new socket
421 and bindSock(sock) to bind it to an unused address.
422
423 Creates a socket self.serv and sets self.serv_addr to its address.
424 """
425
426 def setUp(self):
427 self.serv = self.newSocket()
428 self.bindServer()
429
430 def bindServer(self):
431 """Bind server socket and set self.serv_addr to its address."""
432 self.bindSock(self.serv)
433 self.serv_addr = self.serv.getsockname()
434
435 def tearDown(self):
436 self.serv.close()
437 self.serv = None
438
439
440class SocketListeningTestMixin(SocketTestBase):
441 """Mixin to listen on the server socket."""
442
443 def setUp(self):
444 super().setUp()
445 self.serv.listen(1)
446
447
448class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
449 ThreadableTest):
450 """Mixin to add client socket and allow client/server tests.
451
452 Client socket is self.cli and its address is self.cli_addr. See
453 ThreadableTest for usage information.
454 """
455
456 def __init__(self, *args, **kwargs):
457 super().__init__(*args, **kwargs)
458 ThreadableTest.__init__(self)
459
460 def clientSetUp(self):
461 self.cli = self.newClientSocket()
462 self.bindClient()
463
464 def newClientSocket(self):
465 """Return a new socket for use as client."""
466 return self.newSocket()
467
468 def bindClient(self):
469 """Bind client socket and set self.cli_addr to its address."""
470 self.bindSock(self.cli)
471 self.cli_addr = self.cli.getsockname()
472
473 def clientTearDown(self):
474 self.cli.close()
475 self.cli = None
476 ThreadableTest.clientTearDown(self)
477
478
479class ConnectedStreamTestMixin(SocketListeningTestMixin,
480 ThreadedSocketTestMixin):
481 """Mixin to allow client/server stream tests with connected client.
482
483 Server's socket representing connection to client is self.cli_conn
484 and client's connection to server is self.serv_conn. (Based on
485 SocketConnectedTest.)
486 """
487
488 def setUp(self):
489 super().setUp()
490 # Indicate explicitly we're ready for the client thread to
491 # proceed and then perform the blocking call to accept
492 self.serverExplicitReady()
493 conn, addr = self.serv.accept()
494 self.cli_conn = conn
495
496 def tearDown(self):
497 self.cli_conn.close()
498 self.cli_conn = None
499 super().tearDown()
500
501 def clientSetUp(self):
502 super().clientSetUp()
503 self.cli.connect(self.serv_addr)
504 self.serv_conn = self.cli
505
506 def clientTearDown(self):
507 self.serv_conn.close()
508 self.serv_conn = None
509 super().clientTearDown()
510
511
512class UnixSocketTestBase(SocketTestBase):
513 """Base class for Unix-domain socket tests."""
514
515 # This class is used for file descriptor passing tests, so we
516 # create the sockets in a private directory so that other users
517 # can't send anything that might be problematic for a privileged
518 # user running the tests.
519
520 def setUp(self):
521 self.dir_path = tempfile.mkdtemp()
522 self.addCleanup(os.rmdir, self.dir_path)
523 super().setUp()
524
525 def bindSock(self, sock):
526 path = tempfile.mktemp(dir=self.dir_path)
527 sock.bind(path)
528 self.addCleanup(support.unlink, path)
529
530class UnixStreamBase(UnixSocketTestBase):
531 """Base class for Unix-domain SOCK_STREAM tests."""
532
533 def newSocket(self):
534 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
535
536
537class InetTestBase(SocketTestBase):
538 """Base class for IPv4 socket tests."""
539
540 host = HOST
541
542 def setUp(self):
543 super().setUp()
544 self.port = self.serv_addr[1]
545
546 def bindSock(self, sock):
547 support.bind_port(sock, host=self.host)
548
549class TCPTestBase(InetTestBase):
550 """Base class for TCP-over-IPv4 tests."""
551
552 def newSocket(self):
553 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
554
555class UDPTestBase(InetTestBase):
556 """Base class for UDP-over-IPv4 tests."""
557
558 def newSocket(self):
559 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
560
561class SCTPStreamBase(InetTestBase):
562 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
563
564 def newSocket(self):
565 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
566 socket.IPPROTO_SCTP)
567
568
569class Inet6TestBase(InetTestBase):
570 """Base class for IPv6 socket tests."""
571
572 # Don't use "localhost" here - it may not have an IPv6 address
573 # assigned to it by default (e.g. in /etc/hosts), and if someone
574 # has assigned it an IPv4-mapped address, then it's unlikely to
575 # work with the full IPv6 API.
576 host = "::1"
577
578class UDP6TestBase(Inet6TestBase):
579 """Base class for UDP-over-IPv6 tests."""
580
581 def newSocket(self):
582 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
583
584
585# Test-skipping decorators for use with ThreadableTest.
586
587def skipWithClientIf(condition, reason):
588 """Skip decorated test if condition is true, add client_skip decorator.
589
590 If the decorated object is not a class, sets its attribute
591 "client_skip" to a decorator which will return an empty function
592 if the test is to be skipped, or the original function if it is
593 not. This can be used to avoid running the client part of a
594 skipped test when using ThreadableTest.
595 """
596 def client_pass(*args, **kwargs):
597 pass
598 def skipdec(obj):
599 retval = unittest.skip(reason)(obj)
600 if not isinstance(obj, type):
601 retval.client_skip = lambda f: client_pass
602 return retval
603 def noskipdec(obj):
604 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
605 obj.client_skip = lambda f: f
606 return obj
607 return skipdec if condition else noskipdec
608
609
610def requireAttrs(obj, *attributes):
611 """Skip decorated test if obj is missing any of the given attributes.
612
613 Sets client_skip attribute as skipWithClientIf() does.
614 """
615 missing = [name for name in attributes if not hasattr(obj, name)]
616 return skipWithClientIf(
617 missing, "don't have " + ", ".join(name for name in missing))
618
619
620def requireSocket(*args):
621 """Skip decorated test if a socket cannot be created with given arguments.
622
623 When an argument is given as a string, will use the value of that
624 attribute of the socket module, or skip the test if it doesn't
625 exist. Sets client_skip attribute as skipWithClientIf() does.
626 """
627 err = None
628 missing = [obj for obj in args if
629 isinstance(obj, str) and not hasattr(socket, obj)]
630 if missing:
631 err = "don't have " + ", ".join(name for name in missing)
632 else:
633 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
634 for obj in args]
635 try:
636 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200637 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000638 # XXX: check errno?
639 err = str(e)
640 else:
641 s.close()
642 return skipWithClientIf(
643 err is not None,
644 "can't create socket({0}): {1}".format(
645 ", ".join(str(o) for o in args), err))
646
647
Guido van Rossum24e4af82002-06-12 19:18:08 +0000648#######################################################################
649## Begin Tests
650
651class GeneralModuleTests(unittest.TestCase):
652
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000653 def test_repr(self):
654 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200655 with s:
656 self.assertIn('fd=%i' % s.fileno(), repr(s))
657 self.assertIn('family=%i' % socket.AF_INET, repr(s))
658 self.assertIn('type=%i' % socket.SOCK_STREAM, repr(s))
659 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200660 self.assertNotIn('raddr', repr(s))
661 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200662 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200663 self.assertIn(str(s.getsockname()), repr(s))
664 self.assertIn('[closed]', repr(s))
665 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000666
Raymond Hettinger027bb632004-05-31 03:09:25 +0000667 def test_weakref(self):
668 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
669 p = proxy(s)
670 self.assertEqual(p.fileno(), s.fileno())
671 s.close()
672 s = None
673 try:
674 p.fileno()
675 except ReferenceError:
676 pass
677 else:
678 self.fail('Socket proxy still exists')
679
Guido van Rossum24e4af82002-06-12 19:18:08 +0000680 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000681 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300682 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200683 with self.assertRaises(OSError, msg=msg % 'OSError'):
684 raise OSError
685 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000686 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200687 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000688 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000689
Ezio Melotti63e42302011-05-07 19:47:48 +0300690 def testSendtoErrors(self):
691 # Testing that sendto doens't masks failures. See #10169.
692 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
693 self.addCleanup(s.close)
694 s.bind(('', 0))
695 sockname = s.getsockname()
696 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300697 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300698 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300699 self.assertEqual(str(cm.exception),
700 "'str' does not support the buffer interface")
701 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300702 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300703 self.assertEqual(str(cm.exception),
704 "'complex' does not support the buffer interface")
705 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300706 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300707 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300708 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300709 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300710 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300711 self.assertEqual(str(cm.exception),
712 "'str' does not support the buffer interface")
713 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300714 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300715 self.assertEqual(str(cm.exception),
716 "'complex' does not support the buffer interface")
717 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300718 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300719 self.assertIn('not NoneType', str(cm.exception))
720 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300721 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300722 self.assertIn('an integer is required', str(cm.exception))
723 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300724 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300725 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300726 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300727 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300728 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300729 self.assertIn('(1 given)', str(cm.exception))
730 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300731 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300732 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300733
Guido van Rossum24e4af82002-06-12 19:18:08 +0000734 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000735 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000736 socket.AF_INET
737 socket.SOCK_STREAM
738 socket.SOCK_DGRAM
739 socket.SOCK_RAW
740 socket.SOCK_RDM
741 socket.SOCK_SEQPACKET
742 socket.SOL_SOCKET
743 socket.SO_REUSEADDR
744
Guido van Rossum654c11e2002-06-13 20:24:17 +0000745 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000746 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000747 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000748 try:
749 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200750 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000751 # Probably name lookup wasn't set up right; skip this test
752 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000753 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000754 try:
755 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200756 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000757 # Probably a similar problem as above; skip this test
758 return
Brett Cannon01668a12005-03-11 00:04:17 +0000759 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000760 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000761 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000762 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000763
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000764 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
765 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
766 def test_sethostname(self):
767 oldhn = socket.gethostname()
768 try:
769 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200770 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000771 if e.errno == errno.EPERM:
772 self.skipTest("test should be run as root")
773 else:
774 raise
775 try:
776 # running test as root!
777 self.assertEqual(socket.gethostname(), 'new')
778 # Should work with bytes objects too
779 socket.sethostname(b'bar')
780 self.assertEqual(socket.gethostname(), 'bar')
781 finally:
782 socket.sethostname(oldhn)
783
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700784 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
785 'socket.if_nameindex() not available.')
786 def testInterfaceNameIndex(self):
787 interfaces = socket.if_nameindex()
788 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200789 self.assertIsInstance(index, int)
790 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700791 # interface indices are non-zero integers
792 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200793 _index = socket.if_nametoindex(name)
794 self.assertIsInstance(_index, int)
795 self.assertEqual(index, _index)
796 _name = socket.if_indextoname(index)
797 self.assertIsInstance(_name, str)
798 self.assertEqual(name, _name)
799
800 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
801 'socket.if_nameindex() not available.')
802 def testInvalidInterfaceNameIndex(self):
803 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200804 self.assertRaises(OSError, socket.if_indextoname, 0)
805 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200806 # test with invalid values
807 self.assertRaises(TypeError, socket.if_nametoindex, 0)
808 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700809
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000810 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000811 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000812 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000813 try:
814 # On some versions, this loses a reference
815 orig = sys.getrefcount(__name__)
816 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000817 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000818 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000820
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000822 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000823 try:
824 # On some versions, this crashes the interpreter.
825 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200826 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000827 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000828
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000829 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000830 # This just checks that htons etc. are their own inverse,
831 # when looking at the lower 16 or 32 bits.
832 sizes = {socket.htonl: 32, socket.ntohl: 32,
833 socket.htons: 16, socket.ntohs: 16}
834 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000835 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000836 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
837 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000838
Guido van Rossuma2627af2002-09-14 00:58:46 +0000839 swapped = func(mask)
840 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000841 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000842
Guido van Rossum018919a2007-01-15 00:07:32 +0000843 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000844 good_values = [ 1, 2, 3, 1, 2, 3 ]
845 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000846 for k in good_values:
847 socket.ntohl(k)
848 socket.ntohs(k)
849 socket.htonl(k)
850 socket.htons(k)
851 for k in bad_values:
852 self.assertRaises(OverflowError, socket.ntohl, k)
853 self.assertRaises(OverflowError, socket.ntohs, k)
854 self.assertRaises(OverflowError, socket.htonl, k)
855 self.assertRaises(OverflowError, socket.htons, k)
856
Barry Warsaw11b91a02004-06-28 00:50:43 +0000857 def testGetServBy(self):
858 eq = self.assertEqual
859 # Find one service that exists, then check all the related interfaces.
860 # I've ordered this by protocols that have both a tcp and udp
861 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200862 if (sys.platform.startswith(('freebsd', 'netbsd'))
863 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000864 # avoid the 'echo' service on this platform, as there is an
865 # assumption breaking non-standard port/protocol entry
866 services = ('daytime', 'qotd', 'domain')
867 else:
868 services = ('echo', 'daytime', 'domain')
869 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000870 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000871 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000872 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200873 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000874 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000875 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200876 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000877 # Try same call with optional protocol omitted
878 port2 = socket.getservbyname(service)
879 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400880 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000881 try:
882 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200883 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000884 udpport = None
885 else:
886 eq(udpport, port)
887 # Now make sure the lookup by port returns the same service name
888 eq(socket.getservbyport(port2), service)
889 eq(socket.getservbyport(port, 'tcp'), service)
890 if udpport is not None:
891 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000892 # Make sure getservbyport does not accept out of range ports.
893 self.assertRaises(OverflowError, socket.getservbyport, -1)
894 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000895
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000896 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000897 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000898 # The default timeout should initially be None
899 self.assertEqual(socket.getdefaulttimeout(), None)
900 s = socket.socket()
901 self.assertEqual(s.gettimeout(), None)
902 s.close()
903
904 # Set the default timeout to 10, and see if it propagates
905 socket.setdefaulttimeout(10)
906 self.assertEqual(socket.getdefaulttimeout(), 10)
907 s = socket.socket()
908 self.assertEqual(s.gettimeout(), 10)
909 s.close()
910
911 # Reset the default timeout to None, and see if it propagates
912 socket.setdefaulttimeout(None)
913 self.assertEqual(socket.getdefaulttimeout(), None)
914 s = socket.socket()
915 self.assertEqual(s.gettimeout(), None)
916 s.close()
917
918 # Check that setting it to an invalid value raises ValueError
919 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
920
921 # Check that setting it to an invalid type raises TypeError
922 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
923
Benjamin Petersonf91df042009-02-13 02:50:59 +0000924 def testIPv4_inet_aton_fourbytes(self):
925 if not hasattr(socket, 'inet_aton'):
926 return # No inet_aton, nothing to check
927 # Test that issue1008086 and issue767150 are fixed.
928 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000929 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
930 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000931
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000932 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000933 if not hasattr(socket, 'inet_pton'):
934 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000935 from socket import inet_aton as f, inet_pton, AF_INET
936 g = lambda a: inet_pton(AF_INET, a)
937
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100938 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200939 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100940 )
941
Ezio Melottib3aedd42010-11-20 19:04:17 +0000942 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
943 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
944 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
945 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
946 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100947 assertInvalid(f, '0.0.0.')
948 assertInvalid(f, '300.0.0.0')
949 assertInvalid(f, 'a.0.0.0')
950 assertInvalid(f, '1.2.3.4.5')
951 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000952
Ezio Melottib3aedd42010-11-20 19:04:17 +0000953 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
954 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
955 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
956 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100957 assertInvalid(g, '0.0.0.')
958 assertInvalid(g, '300.0.0.0')
959 assertInvalid(g, 'a.0.0.0')
960 assertInvalid(g, '1.2.3.4.5')
961 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000962
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000963 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000964 if not hasattr(socket, 'inet_pton'):
965 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000966 try:
967 from socket import inet_pton, AF_INET6, has_ipv6
968 if not has_ipv6:
969 return
970 except ImportError:
971 return
972 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100973 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200974 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100975 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000976
Ezio Melottib3aedd42010-11-20 19:04:17 +0000977 self.assertEqual(b'\x00' * 16, f('::'))
978 self.assertEqual(b'\x00' * 16, f('0::0'))
979 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
980 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000981 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 +0000982 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
983 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100984 self.assertEqual(
985 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
986 f('ad42:abc::127:0:254:2')
987 )
988 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
989 assertInvalid('0x20::')
990 assertInvalid(':::')
991 assertInvalid('::0::')
992 assertInvalid('1::abc::')
993 assertInvalid('1::abc::def')
994 assertInvalid('1:2:3:4:5:6:')
995 assertInvalid('1:2:3:4:5:6')
996 assertInvalid('1:2:3:4:5:6:7:8:')
997 assertInvalid('1:2:3:4:5:6:7:8:0')
998
999 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1000 f('::254.42.23.64')
1001 )
1002 self.assertEqual(
1003 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1004 f('42::a29b:254.42.23.64')
1005 )
1006 self.assertEqual(
1007 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1008 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1009 )
1010 assertInvalid('255.254.253.252')
1011 assertInvalid('1::260.2.3.0')
1012 assertInvalid('1::0.be.e.0')
1013 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1014 assertInvalid('::1.2.3.4:0')
1015 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001016
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001017 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +00001018 if not hasattr(socket, 'inet_ntop'):
1019 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001020 from socket import inet_ntoa as f, inet_ntop, AF_INET
1021 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001022 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001023 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001024 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001025
Ezio Melottib3aedd42010-11-20 19:04:17 +00001026 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1027 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1028 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1029 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001030 assertInvalid(f, b'\x00' * 3)
1031 assertInvalid(f, b'\x00' * 5)
1032 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +00001033
Ezio Melottib3aedd42010-11-20 19:04:17 +00001034 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1035 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1036 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001037 assertInvalid(g, b'\x00' * 3)
1038 assertInvalid(g, b'\x00' * 5)
1039 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001040
1041 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +00001042 if not hasattr(socket, 'inet_ntop'):
1043 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001044 try:
1045 from socket import inet_ntop, AF_INET6, has_ipv6
1046 if not has_ipv6:
1047 return
1048 except ImportError:
1049 return
1050 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001051 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001052 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001053 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001054
Ezio Melottib3aedd42010-11-20 19:04:17 +00001055 self.assertEqual('::', f(b'\x00' * 16))
1056 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1057 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001058 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001059 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 +00001060 )
1061
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001062 assertInvalid(b'\x12' * 15)
1063 assertInvalid(b'\x12' * 17)
1064 assertInvalid(b'\x12' * 4)
1065
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001066 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001067
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001068 def testSockName(self):
1069 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001070 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001071 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001072 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001073 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001074 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001075 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1076 # it reasonable to get the host's addr in addition to 0.0.0.0.
1077 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001078 try:
1079 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001080 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001081 # Probably name lookup wasn't set up right; skip this test
1082 return
Benjamin Peterson577473f2010-01-19 00:09:57 +00001083 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001084 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001085
1086 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001087 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001088 # We know a socket should start without reuse==0
1089 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001090 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001091 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001092 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001093
1094 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001095 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001096 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001097 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001098 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1099 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001100 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001101
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001102 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001103 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001104 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1105 sock.settimeout(1)
1106 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001107 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001108
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001109 def testNewAttributes(self):
1110 # testing .family, .type and .protocol
1111 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1112 self.assertEqual(sock.family, socket.AF_INET)
1113 self.assertEqual(sock.type, socket.SOCK_STREAM)
1114 self.assertEqual(sock.proto, 0)
1115 sock.close()
1116
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001117 def test_getsockaddrarg(self):
1118 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001119 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001120 big_port = port + 65536
1121 neg_port = port - 65536
1122 sock = socket.socket()
1123 try:
1124 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1125 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1126 sock.bind((host, port))
1127 finally:
1128 sock.close()
1129
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001130 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001131 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001132 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1133 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1134 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1135 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001136 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1137 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001138 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001139 self.assertRaises(ValueError, s.ioctl, -1, None)
1140 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001141
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001142 def testGetaddrinfo(self):
1143 try:
1144 socket.getaddrinfo('localhost', 80)
1145 except socket.gaierror as err:
1146 if err.errno == socket.EAI_SERVICE:
1147 # see http://bugs.python.org/issue1282647
1148 self.skipTest("buggy libc version")
1149 raise
1150 # len of every sequence is supposed to be == 5
1151 for info in socket.getaddrinfo(HOST, None):
1152 self.assertEqual(len(info), 5)
1153 # host can be a domain name, a string representation of an
1154 # IPv4/v6 address or None
1155 socket.getaddrinfo('localhost', 80)
1156 socket.getaddrinfo('127.0.0.1', 80)
1157 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001158 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001159 socket.getaddrinfo('::1', 80)
1160 # port can be a string service name such as "http", a numeric
1161 # port number or None
1162 socket.getaddrinfo(HOST, "http")
1163 socket.getaddrinfo(HOST, 80)
1164 socket.getaddrinfo(HOST, None)
1165 # test family and socktype filters
1166 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
1167 for family, _, _, _, _ in infos:
1168 self.assertEqual(family, socket.AF_INET)
1169 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1170 for _, socktype, _, _, _ in infos:
1171 self.assertEqual(socktype, socket.SOCK_STREAM)
1172 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001173 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001174 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1175 # a server willing to support both IPv4 and IPv6 will
1176 # usually do this
1177 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1178 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001179 # test keyword arguments
1180 a = socket.getaddrinfo(HOST, None)
1181 b = socket.getaddrinfo(host=HOST, port=None)
1182 self.assertEqual(a, b)
1183 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1184 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1185 self.assertEqual(a, b)
1186 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1187 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1188 self.assertEqual(a, b)
1189 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1190 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1191 self.assertEqual(a, b)
1192 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1193 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1194 self.assertEqual(a, b)
1195 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1196 socket.AI_PASSIVE)
1197 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1198 type=socket.SOCK_STREAM, proto=0,
1199 flags=socket.AI_PASSIVE)
1200 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001201 # Issue #6697.
1202 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001203
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001204 def test_getnameinfo(self):
1205 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001206 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001207
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001208 @unittest.skipUnless(support.is_resource_enabled('network'),
1209 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001210 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001211 # Check for internet access before running test (issue #12804).
1212 try:
1213 socket.gethostbyname('python.org')
1214 except socket.gaierror as e:
1215 if e.errno == socket.EAI_NODATA:
1216 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001217 # these should all be successful
1218 socket.gethostbyname('испытание.python.org')
1219 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001220 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1221 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1222 # have a reverse entry yet
1223 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001224
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001225 def check_sendall_interrupted(self, with_timeout):
1226 # socketpair() is not stricly required, but it makes things easier.
1227 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1228 self.skipTest("signal.alarm and socket.socketpair required for this test")
1229 # Our signal handlers clobber the C errno by calling a math function
1230 # with an invalid domain value.
1231 def ok_handler(*args):
1232 self.assertRaises(ValueError, math.acosh, 0)
1233 def raising_handler(*args):
1234 self.assertRaises(ValueError, math.acosh, 0)
1235 1 // 0
1236 c, s = socket.socketpair()
1237 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1238 try:
1239 if with_timeout:
1240 # Just above the one second minimum for signal.alarm
1241 c.settimeout(1.5)
1242 with self.assertRaises(ZeroDivisionError):
1243 signal.alarm(1)
1244 c.sendall(b"x" * (1024**2))
1245 if with_timeout:
1246 signal.signal(signal.SIGALRM, ok_handler)
1247 signal.alarm(1)
1248 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1249 finally:
1250 signal.signal(signal.SIGALRM, old_alarm)
1251 c.close()
1252 s.close()
1253
1254 def test_sendall_interrupted(self):
1255 self.check_sendall_interrupted(False)
1256
1257 def test_sendall_interrupted_with_timeout(self):
1258 self.check_sendall_interrupted(True)
1259
Antoine Pitroue033e062010-10-29 10:38:18 +00001260 def test_dealloc_warn(self):
1261 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1262 r = repr(sock)
1263 with self.assertWarns(ResourceWarning) as cm:
1264 sock = None
1265 support.gc_collect()
1266 self.assertIn(r, str(cm.warning.args[0]))
1267 # An open socket file object gets dereferenced after the socket
1268 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1269 f = sock.makefile('rb')
1270 r = repr(sock)
1271 sock = None
1272 support.gc_collect()
1273 with self.assertWarns(ResourceWarning):
1274 f = None
1275 support.gc_collect()
1276
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001277 def test_name_closed_socketio(self):
1278 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1279 fp = sock.makefile("rb")
1280 fp.close()
1281 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1282
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001283 def test_unusable_closed_socketio(self):
1284 with socket.socket() as sock:
1285 fp = sock.makefile("rb", buffering=0)
1286 self.assertTrue(fp.readable())
1287 self.assertFalse(fp.writable())
1288 self.assertFalse(fp.seekable())
1289 fp.close()
1290 self.assertRaises(ValueError, fp.readable)
1291 self.assertRaises(ValueError, fp.writable)
1292 self.assertRaises(ValueError, fp.seekable)
1293
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001294 def test_pickle(self):
1295 sock = socket.socket()
1296 with sock:
1297 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1298 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1299
Serhiy Storchaka78980432013-01-15 01:12:17 +02001300 def test_listen_backlog(self):
1301 for backlog in 0, -1:
1302 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1303 srv.bind((HOST, 0))
1304 srv.listen(backlog)
1305 srv.close()
1306
1307 # Issue 15989
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001308 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1309 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001310 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001311 srv.close()
1312
Charles-François Natali42663332012-01-02 15:57:30 +01001313 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001314 def test_flowinfo(self):
1315 self.assertRaises(OverflowError, socket.getnameinfo,
1316 ('::1',0, 0xffffffff), 0)
1317 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1318 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
1319
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001320
Charles-François Natali47413c12011-10-06 19:47:44 +02001321@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1322class BasicCANTest(unittest.TestCase):
1323
1324 def testCrucialConstants(self):
1325 socket.AF_CAN
1326 socket.PF_CAN
1327 socket.CAN_RAW
1328
Charles-François Natali773e42d2013-02-05 19:42:01 +01001329 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1330 'socket.CAN_BCM required for this test.')
1331 def testBCMConstants(self):
1332 socket.CAN_BCM
1333
1334 # opcodes
1335 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1336 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1337 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1338 socket.CAN_BCM_TX_SEND # send one CAN frame
1339 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1340 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1341 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1342 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1343 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1344 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1345 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1346 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1347
Charles-François Natali47413c12011-10-06 19:47:44 +02001348 def testCreateSocket(self):
1349 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1350 pass
1351
Charles-François Natali773e42d2013-02-05 19:42:01 +01001352 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1353 'socket.CAN_BCM required for this test.')
1354 def testCreateBCMSocket(self):
1355 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1356 pass
1357
Charles-François Natali47413c12011-10-06 19:47:44 +02001358 def testBindAny(self):
1359 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1360 s.bind(('', ))
1361
1362 def testTooLongInterfaceName(self):
1363 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1364 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001365 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001366 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001367
1368 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1369 'socket.CAN_RAW_LOOPBACK required for this test.')
1370 def testLoopback(self):
1371 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1372 for loopback in (0, 1):
1373 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1374 loopback)
1375 self.assertEqual(loopback,
1376 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1377
1378 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1379 'socket.CAN_RAW_FILTER required for this test.')
1380 def testFilter(self):
1381 can_id, can_mask = 0x200, 0x700
1382 can_filter = struct.pack("=II", can_id, can_mask)
1383 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1384 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1385 self.assertEqual(can_filter,
1386 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1387
1388
1389@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001390class CANTest(ThreadedCANSocketTest):
1391
Charles-François Natali47413c12011-10-06 19:47:44 +02001392 def __init__(self, methodName='runTest'):
1393 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1394
1395 @classmethod
1396 def build_can_frame(cls, can_id, data):
1397 """Build a CAN frame."""
1398 can_dlc = len(data)
1399 data = data.ljust(8, b'\x00')
1400 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1401
1402 @classmethod
1403 def dissect_can_frame(cls, frame):
1404 """Dissect a CAN frame."""
1405 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1406 return (can_id, can_dlc, data[:can_dlc])
1407
1408 def testSendFrame(self):
1409 cf, addr = self.s.recvfrom(self.bufsize)
1410 self.assertEqual(self.cf, cf)
1411 self.assertEqual(addr[0], self.interface)
1412 self.assertEqual(addr[1], socket.AF_CAN)
1413
1414 def _testSendFrame(self):
1415 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1416 self.cli.send(self.cf)
1417
1418 def testSendMaxFrame(self):
1419 cf, addr = self.s.recvfrom(self.bufsize)
1420 self.assertEqual(self.cf, cf)
1421
1422 def _testSendMaxFrame(self):
1423 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1424 self.cli.send(self.cf)
1425
1426 def testSendMultiFrames(self):
1427 cf, addr = self.s.recvfrom(self.bufsize)
1428 self.assertEqual(self.cf1, cf)
1429
1430 cf, addr = self.s.recvfrom(self.bufsize)
1431 self.assertEqual(self.cf2, cf)
1432
1433 def _testSendMultiFrames(self):
1434 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1435 self.cli.send(self.cf1)
1436
1437 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1438 self.cli.send(self.cf2)
1439
Charles-François Natali773e42d2013-02-05 19:42:01 +01001440 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1441 'socket.CAN_BCM required for this test.')
1442 def _testBCM(self):
1443 cf, addr = self.cli.recvfrom(self.bufsize)
1444 self.assertEqual(self.cf, cf)
1445 can_id, can_dlc, data = self.dissect_can_frame(cf)
1446 self.assertEqual(self.can_id, can_id)
1447 self.assertEqual(self.data, data)
1448
1449 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1450 'socket.CAN_BCM required for this test.')
1451 def testBCM(self):
1452 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1453 self.addCleanup(bcm.close)
1454 bcm.connect((self.interface,))
1455 self.can_id = 0x123
1456 self.data = bytes([0xc0, 0xff, 0xee])
1457 self.cf = self.build_can_frame(self.can_id, self.data)
1458 opcode = socket.CAN_BCM_TX_SEND
1459 flags = 0
1460 count = 0
1461 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1462 bcm_can_id = 0x0222
1463 nframes = 1
1464 assert len(self.cf) == 16
1465 header = struct.pack(self.bcm_cmd_msg_fmt,
1466 opcode,
1467 flags,
1468 count,
1469 ival1_seconds,
1470 ival1_usec,
1471 ival2_seconds,
1472 ival2_usec,
1473 bcm_can_id,
1474 nframes,
1475 )
1476 header_plus_frame = header + self.cf
1477 bytes_sent = bcm.send(header_plus_frame)
1478 self.assertEqual(bytes_sent, len(header_plus_frame))
1479
Charles-François Natali47413c12011-10-06 19:47:44 +02001480
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001481@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1482class BasicRDSTest(unittest.TestCase):
1483
1484 def testCrucialConstants(self):
1485 socket.AF_RDS
1486 socket.PF_RDS
1487
1488 def testCreateSocket(self):
1489 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1490 pass
1491
1492 def testSocketBufferSize(self):
1493 bufsize = 16384
1494 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1495 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1496 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1497
1498
1499@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1500@unittest.skipUnless(thread, 'Threading required for this test.')
1501class RDSTest(ThreadedRDSSocketTest):
1502
1503 def __init__(self, methodName='runTest'):
1504 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1505
Charles-François Natali240c55f2011-11-10 20:33:36 +01001506 def setUp(self):
1507 super().setUp()
1508 self.evt = threading.Event()
1509
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001510 def testSendAndRecv(self):
1511 data, addr = self.serv.recvfrom(self.bufsize)
1512 self.assertEqual(self.data, data)
1513 self.assertEqual(self.cli_addr, addr)
1514
1515 def _testSendAndRecv(self):
1516 self.data = b'spam'
1517 self.cli.sendto(self.data, 0, (HOST, self.port))
1518
1519 def testPeek(self):
1520 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1521 self.assertEqual(self.data, data)
1522 data, addr = self.serv.recvfrom(self.bufsize)
1523 self.assertEqual(self.data, data)
1524
1525 def _testPeek(self):
1526 self.data = b'spam'
1527 self.cli.sendto(self.data, 0, (HOST, self.port))
1528
1529 @requireAttrs(socket.socket, 'recvmsg')
1530 def testSendAndRecvMsg(self):
1531 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1532 self.assertEqual(self.data, data)
1533
1534 @requireAttrs(socket.socket, 'sendmsg')
1535 def _testSendAndRecvMsg(self):
1536 self.data = b'hello ' * 10
1537 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1538
1539 def testSendAndRecvMulti(self):
1540 data, addr = self.serv.recvfrom(self.bufsize)
1541 self.assertEqual(self.data1, data)
1542
1543 data, addr = self.serv.recvfrom(self.bufsize)
1544 self.assertEqual(self.data2, data)
1545
1546 def _testSendAndRecvMulti(self):
1547 self.data1 = b'bacon'
1548 self.cli.sendto(self.data1, 0, (HOST, self.port))
1549
1550 self.data2 = b'egg'
1551 self.cli.sendto(self.data2, 0, (HOST, self.port))
1552
1553 def testSelect(self):
1554 r, w, x = select.select([self.serv], [], [], 3.0)
1555 self.assertIn(self.serv, r)
1556 data, addr = self.serv.recvfrom(self.bufsize)
1557 self.assertEqual(self.data, data)
1558
1559 def _testSelect(self):
1560 self.data = b'select'
1561 self.cli.sendto(self.data, 0, (HOST, self.port))
1562
1563 def testCongestion(self):
1564 # wait until the sender is done
1565 self.evt.wait()
1566
1567 def _testCongestion(self):
1568 # test the behavior in case of congestion
1569 self.data = b'fill'
1570 self.cli.setblocking(False)
1571 try:
1572 # try to lower the receiver's socket buffer size
1573 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1574 except OSError:
1575 pass
1576 with self.assertRaises(OSError) as cm:
1577 try:
1578 # fill the receiver's socket buffer
1579 while True:
1580 self.cli.sendto(self.data, 0, (HOST, self.port))
1581 finally:
1582 # signal the receiver we're done
1583 self.evt.set()
1584 # sendto() should have failed with ENOBUFS
1585 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1586 # and we should have received a congestion notification through poll
1587 r, w, x = select.select([self.serv], [], [], 3.0)
1588 self.assertIn(self.serv, r)
1589
1590
Victor Stinner45df8202010-04-28 22:31:17 +00001591@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001592class BasicTCPTest(SocketConnectedTest):
1593
1594 def __init__(self, methodName='runTest'):
1595 SocketConnectedTest.__init__(self, methodName=methodName)
1596
1597 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001598 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001599 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001600 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001601
1602 def _testRecv(self):
1603 self.serv_conn.send(MSG)
1604
1605 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001606 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001607 seg1 = self.cli_conn.recv(len(MSG) - 3)
1608 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001609 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001610 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001611
1612 def _testOverFlowRecv(self):
1613 self.serv_conn.send(MSG)
1614
1615 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001616 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001617 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001618 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001619
1620 def _testRecvFrom(self):
1621 self.serv_conn.send(MSG)
1622
1623 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001624 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001625 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1626 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001627 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001628 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001629
1630 def _testOverFlowRecvFrom(self):
1631 self.serv_conn.send(MSG)
1632
1633 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001634 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001635 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001636 while 1:
1637 read = self.cli_conn.recv(1024)
1638 if not read:
1639 break
Guido van Rossume531e292002-08-08 20:28:34 +00001640 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001641 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001642
1643 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001644 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001645 self.serv_conn.sendall(big_chunk)
1646
1647 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001648 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001649 fd = self.cli_conn.fileno()
1650 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001651 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001652 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001653 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001654 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001655
1656 def _testFromFd(self):
1657 self.serv_conn.send(MSG)
1658
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001659 def testDup(self):
1660 # Testing dup()
1661 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001662 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001663 msg = sock.recv(1024)
1664 self.assertEqual(msg, MSG)
1665
1666 def _testDup(self):
1667 self.serv_conn.send(MSG)
1668
Guido van Rossum24e4af82002-06-12 19:18:08 +00001669 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001670 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001671 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001672 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001673 # wait for _testShutdown to finish: on OS X, when the server
1674 # closes the connection the client also becomes disconnected,
1675 # and the client's shutdown call will fail. (Issue #4397.)
1676 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001677
1678 def _testShutdown(self):
1679 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001680 # Issue 15989
1681 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1682 _testcapi.INT_MAX + 1)
1683 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1684 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001685 self.serv_conn.shutdown(2)
1686
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001687 def testDetach(self):
1688 # Testing detach()
1689 fileno = self.cli_conn.fileno()
1690 f = self.cli_conn.detach()
1691 self.assertEqual(f, fileno)
1692 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001693 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001694 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001695 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001696 # ...but we can create another socket using the (still open)
1697 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001698 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001699 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001700 msg = sock.recv(1024)
1701 self.assertEqual(msg, MSG)
1702
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001703 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001704 self.serv_conn.send(MSG)
1705
Victor Stinner45df8202010-04-28 22:31:17 +00001706@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001707class BasicUDPTest(ThreadedUDPSocketTest):
1708
1709 def __init__(self, methodName='runTest'):
1710 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1711
1712 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001713 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001714 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001715 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001716
1717 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001718 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001719
Guido van Rossum1c938012002-06-12 21:17:20 +00001720 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001721 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001722 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001723 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001724
Guido van Rossum1c938012002-06-12 21:17:20 +00001725 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001726 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001727
Guido van Rossumd8faa362007-04-27 19:54:29 +00001728 def testRecvFromNegative(self):
1729 # Negative lengths passed to recvfrom should give ValueError.
1730 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1731
1732 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001733 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001734
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001735# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1736# same test code is used with different families and types of socket
1737# (e.g. stream, datagram), and tests using recvmsg() are repeated
1738# using recvmsg_into().
1739#
1740# The generic test classes such as SendmsgTests and
1741# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1742# supplied with sockets cli_sock and serv_sock representing the
1743# client's and the server's end of the connection respectively, and
1744# attributes cli_addr and serv_addr holding their (numeric where
1745# appropriate) addresses.
1746#
1747# The final concrete test classes combine these with subclasses of
1748# SocketTestBase which set up client and server sockets of a specific
1749# type, and with subclasses of SendrecvmsgBase such as
1750# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1751# sockets to cli_sock and serv_sock and override the methods and
1752# attributes of SendrecvmsgBase to fill in destination addresses if
1753# needed when sending, check for specific flags in msg_flags, etc.
1754#
1755# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1756# recvmsg_into().
1757
1758# XXX: like the other datagram (UDP) tests in this module, the code
1759# here assumes that datagram delivery on the local machine will be
1760# reliable.
1761
1762class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1763 # Base class for sendmsg()/recvmsg() tests.
1764
1765 # Time in seconds to wait before considering a test failed, or
1766 # None for no timeout. Not all tests actually set a timeout.
1767 fail_timeout = 3.0
1768
1769 def setUp(self):
1770 self.misc_event = threading.Event()
1771 super().setUp()
1772
1773 def sendToServer(self, msg):
1774 # Send msg to the server.
1775 return self.cli_sock.send(msg)
1776
1777 # Tuple of alternative default arguments for sendmsg() when called
1778 # via sendmsgToServer() (e.g. to include a destination address).
1779 sendmsg_to_server_defaults = ()
1780
1781 def sendmsgToServer(self, *args):
1782 # Call sendmsg() on self.cli_sock with the given arguments,
1783 # filling in any arguments which are not supplied with the
1784 # corresponding items of self.sendmsg_to_server_defaults, if
1785 # any.
1786 return self.cli_sock.sendmsg(
1787 *(args + self.sendmsg_to_server_defaults[len(args):]))
1788
1789 def doRecvmsg(self, sock, bufsize, *args):
1790 # Call recvmsg() on sock with given arguments and return its
1791 # result. Should be used for tests which can use either
1792 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1793 # this method with one which emulates it using recvmsg_into(),
1794 # thus allowing the same test to be used for both methods.
1795 result = sock.recvmsg(bufsize, *args)
1796 self.registerRecvmsgResult(result)
1797 return result
1798
1799 def registerRecvmsgResult(self, result):
1800 # Called by doRecvmsg() with the return value of recvmsg() or
1801 # recvmsg_into(). Can be overridden to arrange cleanup based
1802 # on the returned ancillary data, for instance.
1803 pass
1804
1805 def checkRecvmsgAddress(self, addr1, addr2):
1806 # Called to compare the received address with the address of
1807 # the peer.
1808 self.assertEqual(addr1, addr2)
1809
1810 # Flags that are normally unset in msg_flags
1811 msg_flags_common_unset = 0
1812 for name in ("MSG_CTRUNC", "MSG_OOB"):
1813 msg_flags_common_unset |= getattr(socket, name, 0)
1814
1815 # Flags that are normally set
1816 msg_flags_common_set = 0
1817
1818 # Flags set when a complete record has been received (e.g. MSG_EOR
1819 # for SCTP)
1820 msg_flags_eor_indicator = 0
1821
1822 # Flags set when a complete record has not been received
1823 # (e.g. MSG_TRUNC for datagram sockets)
1824 msg_flags_non_eor_indicator = 0
1825
1826 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1827 # Method to check the value of msg_flags returned by recvmsg[_into]().
1828 #
1829 # Checks that all bits in msg_flags_common_set attribute are
1830 # set in "flags" and all bits in msg_flags_common_unset are
1831 # unset.
1832 #
1833 # The "eor" argument specifies whether the flags should
1834 # indicate that a full record (or datagram) has been received.
1835 # If "eor" is None, no checks are done; otherwise, checks
1836 # that:
1837 #
1838 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1839 # set and all bits in msg_flags_non_eor_indicator are unset
1840 #
1841 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1842 # are set and all bits in msg_flags_eor_indicator are unset
1843 #
1844 # If "checkset" and/or "checkunset" are supplied, they require
1845 # the given bits to be set or unset respectively, overriding
1846 # what the attributes require for those bits.
1847 #
1848 # If any bits are set in "ignore", they will not be checked,
1849 # regardless of the other inputs.
1850 #
1851 # Will raise Exception if the inputs require a bit to be both
1852 # set and unset, and it is not ignored.
1853
1854 defaultset = self.msg_flags_common_set
1855 defaultunset = self.msg_flags_common_unset
1856
1857 if eor:
1858 defaultset |= self.msg_flags_eor_indicator
1859 defaultunset |= self.msg_flags_non_eor_indicator
1860 elif eor is not None:
1861 defaultset |= self.msg_flags_non_eor_indicator
1862 defaultunset |= self.msg_flags_eor_indicator
1863
1864 # Function arguments override defaults
1865 defaultset &= ~checkunset
1866 defaultunset &= ~checkset
1867
1868 # Merge arguments with remaining defaults, and check for conflicts
1869 checkset |= defaultset
1870 checkunset |= defaultunset
1871 inboth = checkset & checkunset & ~ignore
1872 if inboth:
1873 raise Exception("contradictory set, unset requirements for flags "
1874 "{0:#x}".format(inboth))
1875
1876 # Compare with given msg_flags value
1877 mask = (checkset | checkunset) & ~ignore
1878 self.assertEqual(flags & mask, checkset & mask)
1879
1880
1881class RecvmsgIntoMixin(SendrecvmsgBase):
1882 # Mixin to implement doRecvmsg() using recvmsg_into().
1883
1884 def doRecvmsg(self, sock, bufsize, *args):
1885 buf = bytearray(bufsize)
1886 result = sock.recvmsg_into([buf], *args)
1887 self.registerRecvmsgResult(result)
1888 self.assertGreaterEqual(result[0], 0)
1889 self.assertLessEqual(result[0], bufsize)
1890 return (bytes(buf[:result[0]]),) + result[1:]
1891
1892
1893class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1894 # Defines flags to be checked in msg_flags for datagram sockets.
1895
1896 @property
1897 def msg_flags_non_eor_indicator(self):
1898 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1899
1900
1901class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1902 # Defines flags to be checked in msg_flags for SCTP sockets.
1903
1904 @property
1905 def msg_flags_eor_indicator(self):
1906 return super().msg_flags_eor_indicator | socket.MSG_EOR
1907
1908
1909class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1910 # Base class for tests on connectionless-mode sockets. Users must
1911 # supply sockets on attributes cli and serv to be mapped to
1912 # cli_sock and serv_sock respectively.
1913
1914 @property
1915 def serv_sock(self):
1916 return self.serv
1917
1918 @property
1919 def cli_sock(self):
1920 return self.cli
1921
1922 @property
1923 def sendmsg_to_server_defaults(self):
1924 return ([], [], 0, self.serv_addr)
1925
1926 def sendToServer(self, msg):
1927 return self.cli_sock.sendto(msg, self.serv_addr)
1928
1929
1930class SendrecvmsgConnectedBase(SendrecvmsgBase):
1931 # Base class for tests on connected sockets. Users must supply
1932 # sockets on attributes serv_conn and cli_conn (representing the
1933 # connections *to* the server and the client), to be mapped to
1934 # cli_sock and serv_sock respectively.
1935
1936 @property
1937 def serv_sock(self):
1938 return self.cli_conn
1939
1940 @property
1941 def cli_sock(self):
1942 return self.serv_conn
1943
1944 def checkRecvmsgAddress(self, addr1, addr2):
1945 # Address is currently "unspecified" for a connected socket,
1946 # so we don't examine it
1947 pass
1948
1949
1950class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1951 # Base class to set a timeout on server's socket.
1952
1953 def setUp(self):
1954 super().setUp()
1955 self.serv_sock.settimeout(self.fail_timeout)
1956
1957
1958class SendmsgTests(SendrecvmsgServerTimeoutBase):
1959 # Tests for sendmsg() which can use any socket type and do not
1960 # involve recvmsg() or recvmsg_into().
1961
1962 def testSendmsg(self):
1963 # Send a simple message with sendmsg().
1964 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1965
1966 def _testSendmsg(self):
1967 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1968
1969 def testSendmsgDataGenerator(self):
1970 # Send from buffer obtained from a generator (not a sequence).
1971 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1972
1973 def _testSendmsgDataGenerator(self):
1974 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1975 len(MSG))
1976
1977 def testSendmsgAncillaryGenerator(self):
1978 # Gather (empty) ancillary data from a generator.
1979 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1980
1981 def _testSendmsgAncillaryGenerator(self):
1982 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1983 len(MSG))
1984
1985 def testSendmsgArray(self):
1986 # Send data from an array instead of the usual bytes object.
1987 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1988
1989 def _testSendmsgArray(self):
1990 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1991 len(MSG))
1992
1993 def testSendmsgGather(self):
1994 # Send message data from more than one buffer (gather write).
1995 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1996
1997 def _testSendmsgGather(self):
1998 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1999
2000 def testSendmsgBadArgs(self):
2001 # Check that sendmsg() rejects invalid arguments.
2002 self.assertEqual(self.serv_sock.recv(1000), b"done")
2003
2004 def _testSendmsgBadArgs(self):
2005 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2006 self.assertRaises(TypeError, self.sendmsgToServer,
2007 b"not in an iterable")
2008 self.assertRaises(TypeError, self.sendmsgToServer,
2009 object())
2010 self.assertRaises(TypeError, self.sendmsgToServer,
2011 [object()])
2012 self.assertRaises(TypeError, self.sendmsgToServer,
2013 [MSG, object()])
2014 self.assertRaises(TypeError, self.sendmsgToServer,
2015 [MSG], object())
2016 self.assertRaises(TypeError, self.sendmsgToServer,
2017 [MSG], [], object())
2018 self.assertRaises(TypeError, self.sendmsgToServer,
2019 [MSG], [], 0, object())
2020 self.sendToServer(b"done")
2021
2022 def testSendmsgBadCmsg(self):
2023 # Check that invalid ancillary data items are rejected.
2024 self.assertEqual(self.serv_sock.recv(1000), b"done")
2025
2026 def _testSendmsgBadCmsg(self):
2027 self.assertRaises(TypeError, self.sendmsgToServer,
2028 [MSG], [object()])
2029 self.assertRaises(TypeError, self.sendmsgToServer,
2030 [MSG], [(object(), 0, b"data")])
2031 self.assertRaises(TypeError, self.sendmsgToServer,
2032 [MSG], [(0, object(), b"data")])
2033 self.assertRaises(TypeError, self.sendmsgToServer,
2034 [MSG], [(0, 0, object())])
2035 self.assertRaises(TypeError, self.sendmsgToServer,
2036 [MSG], [(0, 0)])
2037 self.assertRaises(TypeError, self.sendmsgToServer,
2038 [MSG], [(0, 0, b"data", 42)])
2039 self.sendToServer(b"done")
2040
2041 @requireAttrs(socket, "CMSG_SPACE")
2042 def testSendmsgBadMultiCmsg(self):
2043 # Check that invalid ancillary data items are rejected when
2044 # more than one item is present.
2045 self.assertEqual(self.serv_sock.recv(1000), b"done")
2046
2047 @testSendmsgBadMultiCmsg.client_skip
2048 def _testSendmsgBadMultiCmsg(self):
2049 self.assertRaises(TypeError, self.sendmsgToServer,
2050 [MSG], [0, 0, b""])
2051 self.assertRaises(TypeError, self.sendmsgToServer,
2052 [MSG], [(0, 0, b""), object()])
2053 self.sendToServer(b"done")
2054
2055 def testSendmsgExcessCmsgReject(self):
2056 # Check that sendmsg() rejects excess ancillary data items
2057 # when the number that can be sent is limited.
2058 self.assertEqual(self.serv_sock.recv(1000), b"done")
2059
2060 def _testSendmsgExcessCmsgReject(self):
2061 if not hasattr(socket, "CMSG_SPACE"):
2062 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002063 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002064 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2065 self.assertIsNone(cm.exception.errno)
2066 self.sendToServer(b"done")
2067
2068 def testSendmsgAfterClose(self):
2069 # Check that sendmsg() fails on a closed socket.
2070 pass
2071
2072 def _testSendmsgAfterClose(self):
2073 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002074 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002075
2076
2077class SendmsgStreamTests(SendmsgTests):
2078 # Tests for sendmsg() which require a stream socket and do not
2079 # involve recvmsg() or recvmsg_into().
2080
2081 def testSendmsgExplicitNoneAddr(self):
2082 # Check that peer address can be specified as None.
2083 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2084
2085 def _testSendmsgExplicitNoneAddr(self):
2086 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2087
2088 def testSendmsgTimeout(self):
2089 # Check that timeout works with sendmsg().
2090 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2091 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2092
2093 def _testSendmsgTimeout(self):
2094 try:
2095 self.cli_sock.settimeout(0.03)
2096 with self.assertRaises(socket.timeout):
2097 while True:
2098 self.sendmsgToServer([b"a"*512])
2099 finally:
2100 self.misc_event.set()
2101
2102 # XXX: would be nice to have more tests for sendmsg flags argument.
2103
2104 # Linux supports MSG_DONTWAIT when sending, but in general, it
2105 # only works when receiving. Could add other platforms if they
2106 # support it too.
2107 @skipWithClientIf(sys.platform not in {"linux2"},
2108 "MSG_DONTWAIT not known to work on this platform when "
2109 "sending")
2110 def testSendmsgDontWait(self):
2111 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2112 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2113 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2114
2115 @testSendmsgDontWait.client_skip
2116 def _testSendmsgDontWait(self):
2117 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002118 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002119 while True:
2120 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2121 self.assertIn(cm.exception.errno,
2122 (errno.EAGAIN, errno.EWOULDBLOCK))
2123 finally:
2124 self.misc_event.set()
2125
2126
2127class SendmsgConnectionlessTests(SendmsgTests):
2128 # Tests for sendmsg() which require a connectionless-mode
2129 # (e.g. datagram) socket, and do not involve recvmsg() or
2130 # recvmsg_into().
2131
2132 def testSendmsgNoDestAddr(self):
2133 # Check that sendmsg() fails when no destination address is
2134 # given for unconnected socket.
2135 pass
2136
2137 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002138 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002139 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002140 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002141 [MSG], [], 0, None)
2142
2143
2144class RecvmsgGenericTests(SendrecvmsgBase):
2145 # Tests for recvmsg() which can also be emulated using
2146 # recvmsg_into(), and can use any socket type.
2147
2148 def testRecvmsg(self):
2149 # Receive a simple message with recvmsg[_into]().
2150 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2151 self.assertEqual(msg, MSG)
2152 self.checkRecvmsgAddress(addr, self.cli_addr)
2153 self.assertEqual(ancdata, [])
2154 self.checkFlags(flags, eor=True)
2155
2156 def _testRecvmsg(self):
2157 self.sendToServer(MSG)
2158
2159 def testRecvmsgExplicitDefaults(self):
2160 # Test recvmsg[_into]() with default arguments provided explicitly.
2161 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2162 len(MSG), 0, 0)
2163 self.assertEqual(msg, MSG)
2164 self.checkRecvmsgAddress(addr, self.cli_addr)
2165 self.assertEqual(ancdata, [])
2166 self.checkFlags(flags, eor=True)
2167
2168 def _testRecvmsgExplicitDefaults(self):
2169 self.sendToServer(MSG)
2170
2171 def testRecvmsgShorter(self):
2172 # Receive a message smaller than buffer.
2173 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2174 len(MSG) + 42)
2175 self.assertEqual(msg, MSG)
2176 self.checkRecvmsgAddress(addr, self.cli_addr)
2177 self.assertEqual(ancdata, [])
2178 self.checkFlags(flags, eor=True)
2179
2180 def _testRecvmsgShorter(self):
2181 self.sendToServer(MSG)
2182
Charles-François Natali8619cd72011-10-03 19:43:15 +02002183 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2184 # datagram is received (issue #13001).
2185 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002186 def testRecvmsgTrunc(self):
2187 # Receive part of message, check for truncation indicators.
2188 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2189 len(MSG) - 3)
2190 self.assertEqual(msg, MSG[:-3])
2191 self.checkRecvmsgAddress(addr, self.cli_addr)
2192 self.assertEqual(ancdata, [])
2193 self.checkFlags(flags, eor=False)
2194
Charles-François Natali8619cd72011-10-03 19:43:15 +02002195 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002196 def _testRecvmsgTrunc(self):
2197 self.sendToServer(MSG)
2198
2199 def testRecvmsgShortAncillaryBuf(self):
2200 # Test ancillary data buffer too small to hold any ancillary data.
2201 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2202 len(MSG), 1)
2203 self.assertEqual(msg, MSG)
2204 self.checkRecvmsgAddress(addr, self.cli_addr)
2205 self.assertEqual(ancdata, [])
2206 self.checkFlags(flags, eor=True)
2207
2208 def _testRecvmsgShortAncillaryBuf(self):
2209 self.sendToServer(MSG)
2210
2211 def testRecvmsgLongAncillaryBuf(self):
2212 # Test large ancillary data buffer.
2213 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2214 len(MSG), 10240)
2215 self.assertEqual(msg, MSG)
2216 self.checkRecvmsgAddress(addr, self.cli_addr)
2217 self.assertEqual(ancdata, [])
2218 self.checkFlags(flags, eor=True)
2219
2220 def _testRecvmsgLongAncillaryBuf(self):
2221 self.sendToServer(MSG)
2222
2223 def testRecvmsgAfterClose(self):
2224 # Check that recvmsg[_into]() fails on a closed socket.
2225 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002226 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002227
2228 def _testRecvmsgAfterClose(self):
2229 pass
2230
2231 def testRecvmsgTimeout(self):
2232 # Check that timeout works.
2233 try:
2234 self.serv_sock.settimeout(0.03)
2235 self.assertRaises(socket.timeout,
2236 self.doRecvmsg, self.serv_sock, len(MSG))
2237 finally:
2238 self.misc_event.set()
2239
2240 def _testRecvmsgTimeout(self):
2241 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2242
2243 @requireAttrs(socket, "MSG_PEEK")
2244 def testRecvmsgPeek(self):
2245 # Check that MSG_PEEK in flags enables examination of pending
2246 # data without consuming it.
2247
2248 # Receive part of data with MSG_PEEK.
2249 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2250 len(MSG) - 3, 0,
2251 socket.MSG_PEEK)
2252 self.assertEqual(msg, MSG[:-3])
2253 self.checkRecvmsgAddress(addr, self.cli_addr)
2254 self.assertEqual(ancdata, [])
2255 # Ignoring MSG_TRUNC here (so this test is the same for stream
2256 # and datagram sockets). Some wording in POSIX seems to
2257 # suggest that it needn't be set when peeking, but that may
2258 # just be a slip.
2259 self.checkFlags(flags, eor=False,
2260 ignore=getattr(socket, "MSG_TRUNC", 0))
2261
2262 # Receive all data with MSG_PEEK.
2263 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2264 len(MSG), 0,
2265 socket.MSG_PEEK)
2266 self.assertEqual(msg, MSG)
2267 self.checkRecvmsgAddress(addr, self.cli_addr)
2268 self.assertEqual(ancdata, [])
2269 self.checkFlags(flags, eor=True)
2270
2271 # Check that the same data can still be received normally.
2272 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2273 self.assertEqual(msg, MSG)
2274 self.checkRecvmsgAddress(addr, self.cli_addr)
2275 self.assertEqual(ancdata, [])
2276 self.checkFlags(flags, eor=True)
2277
2278 @testRecvmsgPeek.client_skip
2279 def _testRecvmsgPeek(self):
2280 self.sendToServer(MSG)
2281
2282 @requireAttrs(socket.socket, "sendmsg")
2283 def testRecvmsgFromSendmsg(self):
2284 # Test receiving with recvmsg[_into]() when message is sent
2285 # using sendmsg().
2286 self.serv_sock.settimeout(self.fail_timeout)
2287 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2288 self.assertEqual(msg, MSG)
2289 self.checkRecvmsgAddress(addr, self.cli_addr)
2290 self.assertEqual(ancdata, [])
2291 self.checkFlags(flags, eor=True)
2292
2293 @testRecvmsgFromSendmsg.client_skip
2294 def _testRecvmsgFromSendmsg(self):
2295 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2296
2297
2298class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2299 # Tests which require a stream socket and can use either recvmsg()
2300 # or recvmsg_into().
2301
2302 def testRecvmsgEOF(self):
2303 # Receive end-of-stream indicator (b"", peer socket closed).
2304 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2305 self.assertEqual(msg, b"")
2306 self.checkRecvmsgAddress(addr, self.cli_addr)
2307 self.assertEqual(ancdata, [])
2308 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2309
2310 def _testRecvmsgEOF(self):
2311 self.cli_sock.close()
2312
2313 def testRecvmsgOverflow(self):
2314 # Receive a message in more than one chunk.
2315 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2316 len(MSG) - 3)
2317 self.checkRecvmsgAddress(addr, self.cli_addr)
2318 self.assertEqual(ancdata, [])
2319 self.checkFlags(flags, eor=False)
2320
2321 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2322 self.checkRecvmsgAddress(addr, self.cli_addr)
2323 self.assertEqual(ancdata, [])
2324 self.checkFlags(flags, eor=True)
2325
2326 msg = seg1 + seg2
2327 self.assertEqual(msg, MSG)
2328
2329 def _testRecvmsgOverflow(self):
2330 self.sendToServer(MSG)
2331
2332
2333class RecvmsgTests(RecvmsgGenericTests):
2334 # Tests for recvmsg() which can use any socket type.
2335
2336 def testRecvmsgBadArgs(self):
2337 # Check that recvmsg() rejects invalid arguments.
2338 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2339 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2340 -1, 0, 0)
2341 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2342 len(MSG), -1, 0)
2343 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2344 [bytearray(10)], 0, 0)
2345 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2346 object(), 0, 0)
2347 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2348 len(MSG), object(), 0)
2349 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2350 len(MSG), 0, object())
2351
2352 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2353 self.assertEqual(msg, MSG)
2354 self.checkRecvmsgAddress(addr, self.cli_addr)
2355 self.assertEqual(ancdata, [])
2356 self.checkFlags(flags, eor=True)
2357
2358 def _testRecvmsgBadArgs(self):
2359 self.sendToServer(MSG)
2360
2361
2362class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2363 # Tests for recvmsg_into() which can use any socket type.
2364
2365 def testRecvmsgIntoBadArgs(self):
2366 # Check that recvmsg_into() rejects invalid arguments.
2367 buf = bytearray(len(MSG))
2368 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2369 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2370 len(MSG), 0, 0)
2371 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2372 buf, 0, 0)
2373 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2374 [object()], 0, 0)
2375 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2376 [b"I'm not writable"], 0, 0)
2377 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2378 [buf, object()], 0, 0)
2379 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2380 [buf], -1, 0)
2381 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2382 [buf], object(), 0)
2383 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2384 [buf], 0, object())
2385
2386 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2387 self.assertEqual(nbytes, len(MSG))
2388 self.assertEqual(buf, bytearray(MSG))
2389 self.checkRecvmsgAddress(addr, self.cli_addr)
2390 self.assertEqual(ancdata, [])
2391 self.checkFlags(flags, eor=True)
2392
2393 def _testRecvmsgIntoBadArgs(self):
2394 self.sendToServer(MSG)
2395
2396 def testRecvmsgIntoGenerator(self):
2397 # Receive into buffer obtained from a generator (not a sequence).
2398 buf = bytearray(len(MSG))
2399 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2400 (o for o in [buf]))
2401 self.assertEqual(nbytes, len(MSG))
2402 self.assertEqual(buf, bytearray(MSG))
2403 self.checkRecvmsgAddress(addr, self.cli_addr)
2404 self.assertEqual(ancdata, [])
2405 self.checkFlags(flags, eor=True)
2406
2407 def _testRecvmsgIntoGenerator(self):
2408 self.sendToServer(MSG)
2409
2410 def testRecvmsgIntoArray(self):
2411 # Receive into an array rather than the usual bytearray.
2412 buf = array.array("B", [0] * len(MSG))
2413 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2414 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002415 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002416 self.checkRecvmsgAddress(addr, self.cli_addr)
2417 self.assertEqual(ancdata, [])
2418 self.checkFlags(flags, eor=True)
2419
2420 def _testRecvmsgIntoArray(self):
2421 self.sendToServer(MSG)
2422
2423 def testRecvmsgIntoScatter(self):
2424 # Receive into multiple buffers (scatter write).
2425 b1 = bytearray(b"----")
2426 b2 = bytearray(b"0123456789")
2427 b3 = bytearray(b"--------------")
2428 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2429 [b1, memoryview(b2)[2:9], b3])
2430 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2431 self.assertEqual(b1, bytearray(b"Mary"))
2432 self.assertEqual(b2, bytearray(b"01 had a 9"))
2433 self.assertEqual(b3, bytearray(b"little lamb---"))
2434 self.checkRecvmsgAddress(addr, self.cli_addr)
2435 self.assertEqual(ancdata, [])
2436 self.checkFlags(flags, eor=True)
2437
2438 def _testRecvmsgIntoScatter(self):
2439 self.sendToServer(b"Mary had a little lamb")
2440
2441
2442class CmsgMacroTests(unittest.TestCase):
2443 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2444 # assumptions used by sendmsg() and recvmsg[_into](), which share
2445 # code with these functions.
2446
2447 # Match the definition in socketmodule.c
2448 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2449
2450 @requireAttrs(socket, "CMSG_LEN")
2451 def testCMSG_LEN(self):
2452 # Test CMSG_LEN() with various valid and invalid values,
2453 # checking the assumptions used by recvmsg() and sendmsg().
2454 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2455 values = list(range(257)) + list(range(toobig - 257, toobig))
2456
2457 # struct cmsghdr has at least three members, two of which are ints
2458 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2459 for n in values:
2460 ret = socket.CMSG_LEN(n)
2461 # This is how recvmsg() calculates the data size
2462 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2463 self.assertLessEqual(ret, self.socklen_t_limit)
2464
2465 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2466 # sendmsg() shares code with these functions, and requires
2467 # that it reject values over the limit.
2468 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2469 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2470
2471 @requireAttrs(socket, "CMSG_SPACE")
2472 def testCMSG_SPACE(self):
2473 # Test CMSG_SPACE() with various valid and invalid values,
2474 # checking the assumptions used by sendmsg().
2475 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2476 values = list(range(257)) + list(range(toobig - 257, toobig))
2477
2478 last = socket.CMSG_SPACE(0)
2479 # struct cmsghdr has at least three members, two of which are ints
2480 self.assertGreater(last, array.array("i").itemsize * 2)
2481 for n in values:
2482 ret = socket.CMSG_SPACE(n)
2483 self.assertGreaterEqual(ret, last)
2484 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2485 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2486 self.assertLessEqual(ret, self.socklen_t_limit)
2487 last = ret
2488
2489 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2490 # sendmsg() shares code with these functions, and requires
2491 # that it reject values over the limit.
2492 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2493 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2494
2495
2496class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2497 # Tests for file descriptor passing on Unix-domain sockets.
2498
2499 # Invalid file descriptor value that's unlikely to evaluate to a
2500 # real FD even if one of its bytes is replaced with a different
2501 # value (which shouldn't actually happen).
2502 badfd = -0x5555
2503
2504 def newFDs(self, n):
2505 # Return a list of n file descriptors for newly-created files
2506 # containing their list indices as ASCII numbers.
2507 fds = []
2508 for i in range(n):
2509 fd, path = tempfile.mkstemp()
2510 self.addCleanup(os.unlink, path)
2511 self.addCleanup(os.close, fd)
2512 os.write(fd, str(i).encode())
2513 fds.append(fd)
2514 return fds
2515
2516 def checkFDs(self, fds):
2517 # Check that the file descriptors in the given list contain
2518 # their correct list indices as ASCII numbers.
2519 for n, fd in enumerate(fds):
2520 os.lseek(fd, 0, os.SEEK_SET)
2521 self.assertEqual(os.read(fd, 1024), str(n).encode())
2522
2523 def registerRecvmsgResult(self, result):
2524 self.addCleanup(self.closeRecvmsgFDs, result)
2525
2526 def closeRecvmsgFDs(self, recvmsg_result):
2527 # Close all file descriptors specified in the ancillary data
2528 # of the given return value from recvmsg() or recvmsg_into().
2529 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2530 if (cmsg_level == socket.SOL_SOCKET and
2531 cmsg_type == socket.SCM_RIGHTS):
2532 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002533 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002534 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2535 for fd in fds:
2536 os.close(fd)
2537
2538 def createAndSendFDs(self, n):
2539 # Send n new file descriptors created by newFDs() to the
2540 # server, with the constant MSG as the non-ancillary data.
2541 self.assertEqual(
2542 self.sendmsgToServer([MSG],
2543 [(socket.SOL_SOCKET,
2544 socket.SCM_RIGHTS,
2545 array.array("i", self.newFDs(n)))]),
2546 len(MSG))
2547
2548 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2549 # Check that constant MSG was received with numfds file
2550 # descriptors in a maximum of maxcmsgs control messages (which
2551 # must contain only complete integers). By default, check
2552 # that MSG_CTRUNC is unset, but ignore any flags in
2553 # ignoreflags.
2554 msg, ancdata, flags, addr = result
2555 self.assertEqual(msg, MSG)
2556 self.checkRecvmsgAddress(addr, self.cli_addr)
2557 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2558 ignore=ignoreflags)
2559
2560 self.assertIsInstance(ancdata, list)
2561 self.assertLessEqual(len(ancdata), maxcmsgs)
2562 fds = array.array("i")
2563 for item in ancdata:
2564 self.assertIsInstance(item, tuple)
2565 cmsg_level, cmsg_type, cmsg_data = item
2566 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2567 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2568 self.assertIsInstance(cmsg_data, bytes)
2569 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002570 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002571
2572 self.assertEqual(len(fds), numfds)
2573 self.checkFDs(fds)
2574
2575 def testFDPassSimple(self):
2576 # Pass a single FD (array read from bytes object).
2577 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2578 len(MSG), 10240))
2579
2580 def _testFDPassSimple(self):
2581 self.assertEqual(
2582 self.sendmsgToServer(
2583 [MSG],
2584 [(socket.SOL_SOCKET,
2585 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002586 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002587 len(MSG))
2588
2589 def testMultipleFDPass(self):
2590 # Pass multiple FDs in a single array.
2591 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2592 len(MSG), 10240))
2593
2594 def _testMultipleFDPass(self):
2595 self.createAndSendFDs(4)
2596
2597 @requireAttrs(socket, "CMSG_SPACE")
2598 def testFDPassCMSG_SPACE(self):
2599 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2600 self.checkRecvmsgFDs(
2601 4, self.doRecvmsg(self.serv_sock, len(MSG),
2602 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2603
2604 @testFDPassCMSG_SPACE.client_skip
2605 def _testFDPassCMSG_SPACE(self):
2606 self.createAndSendFDs(4)
2607
2608 def testFDPassCMSG_LEN(self):
2609 # Test using CMSG_LEN() to calculate ancillary buffer size.
2610 self.checkRecvmsgFDs(1,
2611 self.doRecvmsg(self.serv_sock, len(MSG),
2612 socket.CMSG_LEN(4 * SIZEOF_INT)),
2613 # RFC 3542 says implementations may set
2614 # MSG_CTRUNC if there isn't enough space
2615 # for trailing padding.
2616 ignoreflags=socket.MSG_CTRUNC)
2617
2618 def _testFDPassCMSG_LEN(self):
2619 self.createAndSendFDs(1)
2620
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002621 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002622 @requireAttrs(socket, "CMSG_SPACE")
2623 def testFDPassSeparate(self):
2624 # Pass two FDs in two separate arrays. Arrays may be combined
2625 # into a single control message by the OS.
2626 self.checkRecvmsgFDs(2,
2627 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2628 maxcmsgs=2)
2629
2630 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002631 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002632 def _testFDPassSeparate(self):
2633 fd0, fd1 = self.newFDs(2)
2634 self.assertEqual(
2635 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2636 socket.SCM_RIGHTS,
2637 array.array("i", [fd0])),
2638 (socket.SOL_SOCKET,
2639 socket.SCM_RIGHTS,
2640 array.array("i", [fd1]))]),
2641 len(MSG))
2642
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002643 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002644 @requireAttrs(socket, "CMSG_SPACE")
2645 def testFDPassSeparateMinSpace(self):
2646 # Pass two FDs in two separate arrays, receiving them into the
2647 # minimum space for two arrays.
2648 self.checkRecvmsgFDs(2,
2649 self.doRecvmsg(self.serv_sock, len(MSG),
2650 socket.CMSG_SPACE(SIZEOF_INT) +
2651 socket.CMSG_LEN(SIZEOF_INT)),
2652 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2653
2654 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002655 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002656 def _testFDPassSeparateMinSpace(self):
2657 fd0, fd1 = self.newFDs(2)
2658 self.assertEqual(
2659 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2660 socket.SCM_RIGHTS,
2661 array.array("i", [fd0])),
2662 (socket.SOL_SOCKET,
2663 socket.SCM_RIGHTS,
2664 array.array("i", [fd1]))]),
2665 len(MSG))
2666
2667 def sendAncillaryIfPossible(self, msg, ancdata):
2668 # Try to send msg and ancdata to server, but if the system
2669 # call fails, just send msg with no ancillary data.
2670 try:
2671 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002672 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002673 # Check that it was the system call that failed
2674 self.assertIsInstance(e.errno, int)
2675 nbytes = self.sendmsgToServer([msg])
2676 self.assertEqual(nbytes, len(msg))
2677
2678 def testFDPassEmpty(self):
2679 # Try to pass an empty FD array. Can receive either no array
2680 # or an empty array.
2681 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2682 len(MSG), 10240),
2683 ignoreflags=socket.MSG_CTRUNC)
2684
2685 def _testFDPassEmpty(self):
2686 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2687 socket.SCM_RIGHTS,
2688 b"")])
2689
2690 def testFDPassPartialInt(self):
2691 # Try to pass a truncated FD array.
2692 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2693 len(MSG), 10240)
2694 self.assertEqual(msg, MSG)
2695 self.checkRecvmsgAddress(addr, self.cli_addr)
2696 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2697 self.assertLessEqual(len(ancdata), 1)
2698 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2699 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2700 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2701 self.assertLess(len(cmsg_data), SIZEOF_INT)
2702
2703 def _testFDPassPartialInt(self):
2704 self.sendAncillaryIfPossible(
2705 MSG,
2706 [(socket.SOL_SOCKET,
2707 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002708 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002709
2710 @requireAttrs(socket, "CMSG_SPACE")
2711 def testFDPassPartialIntInMiddle(self):
2712 # Try to pass two FD arrays, the first of which is truncated.
2713 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2714 len(MSG), 10240)
2715 self.assertEqual(msg, MSG)
2716 self.checkRecvmsgAddress(addr, self.cli_addr)
2717 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2718 self.assertLessEqual(len(ancdata), 2)
2719 fds = array.array("i")
2720 # Arrays may have been combined in a single control message
2721 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2722 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2723 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002724 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002725 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2726 self.assertLessEqual(len(fds), 2)
2727 self.checkFDs(fds)
2728
2729 @testFDPassPartialIntInMiddle.client_skip
2730 def _testFDPassPartialIntInMiddle(self):
2731 fd0, fd1 = self.newFDs(2)
2732 self.sendAncillaryIfPossible(
2733 MSG,
2734 [(socket.SOL_SOCKET,
2735 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002736 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002737 (socket.SOL_SOCKET,
2738 socket.SCM_RIGHTS,
2739 array.array("i", [fd1]))])
2740
2741 def checkTruncatedHeader(self, result, ignoreflags=0):
2742 # Check that no ancillary data items are returned when data is
2743 # truncated inside the cmsghdr structure.
2744 msg, ancdata, flags, addr = result
2745 self.assertEqual(msg, MSG)
2746 self.checkRecvmsgAddress(addr, self.cli_addr)
2747 self.assertEqual(ancdata, [])
2748 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2749 ignore=ignoreflags)
2750
2751 def testCmsgTruncNoBufSize(self):
2752 # Check that no ancillary data is received when no buffer size
2753 # is specified.
2754 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2755 # BSD seems to set MSG_CTRUNC only
2756 # if an item has been partially
2757 # received.
2758 ignoreflags=socket.MSG_CTRUNC)
2759
2760 def _testCmsgTruncNoBufSize(self):
2761 self.createAndSendFDs(1)
2762
2763 def testCmsgTrunc0(self):
2764 # Check that no ancillary data is received when buffer size is 0.
2765 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2766 ignoreflags=socket.MSG_CTRUNC)
2767
2768 def _testCmsgTrunc0(self):
2769 self.createAndSendFDs(1)
2770
2771 # Check that no ancillary data is returned for various non-zero
2772 # (but still too small) buffer sizes.
2773
2774 def testCmsgTrunc1(self):
2775 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2776
2777 def _testCmsgTrunc1(self):
2778 self.createAndSendFDs(1)
2779
2780 def testCmsgTrunc2Int(self):
2781 # The cmsghdr structure has at least three members, two of
2782 # which are ints, so we still shouldn't see any ancillary
2783 # data.
2784 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2785 SIZEOF_INT * 2))
2786
2787 def _testCmsgTrunc2Int(self):
2788 self.createAndSendFDs(1)
2789
2790 def testCmsgTruncLen0Minus1(self):
2791 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2792 socket.CMSG_LEN(0) - 1))
2793
2794 def _testCmsgTruncLen0Minus1(self):
2795 self.createAndSendFDs(1)
2796
2797 # The following tests try to truncate the control message in the
2798 # middle of the FD array.
2799
2800 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2801 # Check that file descriptor data is truncated to between
2802 # mindata and maxdata bytes when received with buffer size
2803 # ancbuf, and that any complete file descriptor numbers are
2804 # valid.
2805 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2806 len(MSG), ancbuf)
2807 self.assertEqual(msg, MSG)
2808 self.checkRecvmsgAddress(addr, self.cli_addr)
2809 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2810
2811 if mindata == 0 and ancdata == []:
2812 return
2813 self.assertEqual(len(ancdata), 1)
2814 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2815 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2816 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2817 self.assertGreaterEqual(len(cmsg_data), mindata)
2818 self.assertLessEqual(len(cmsg_data), maxdata)
2819 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002820 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002821 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2822 self.checkFDs(fds)
2823
2824 def testCmsgTruncLen0(self):
2825 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2826
2827 def _testCmsgTruncLen0(self):
2828 self.createAndSendFDs(1)
2829
2830 def testCmsgTruncLen0Plus1(self):
2831 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2832
2833 def _testCmsgTruncLen0Plus1(self):
2834 self.createAndSendFDs(2)
2835
2836 def testCmsgTruncLen1(self):
2837 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2838 maxdata=SIZEOF_INT)
2839
2840 def _testCmsgTruncLen1(self):
2841 self.createAndSendFDs(2)
2842
2843 def testCmsgTruncLen2Minus1(self):
2844 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2845 maxdata=(2 * SIZEOF_INT) - 1)
2846
2847 def _testCmsgTruncLen2Minus1(self):
2848 self.createAndSendFDs(2)
2849
2850
2851class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2852 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2853 # features of the RFC 3542 Advanced Sockets API for IPv6.
2854 # Currently we can only handle certain data items (e.g. traffic
2855 # class, hop limit, MTU discovery and fragmentation settings)
2856 # without resorting to unportable means such as the struct module,
2857 # but the tests here are aimed at testing the ancillary data
2858 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2859 # itself.
2860
2861 # Test value to use when setting hop limit of packet
2862 hop_limit = 2
2863
2864 # Test value to use when setting traffic class of packet.
2865 # -1 means "use kernel default".
2866 traffic_class = -1
2867
2868 def ancillaryMapping(self, ancdata):
2869 # Given ancillary data list ancdata, return a mapping from
2870 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2871 # Check that no (level, type) pair appears more than once.
2872 d = {}
2873 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2874 self.assertNotIn((cmsg_level, cmsg_type), d)
2875 d[(cmsg_level, cmsg_type)] = cmsg_data
2876 return d
2877
2878 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2879 # Receive hop limit into ancbufsize bytes of ancillary data
2880 # space. Check that data is MSG, ancillary data is not
2881 # truncated (but ignore any flags in ignoreflags), and hop
2882 # limit is between 0 and maxhop inclusive.
2883 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2884 socket.IPV6_RECVHOPLIMIT, 1)
2885 self.misc_event.set()
2886 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2887 len(MSG), ancbufsize)
2888
2889 self.assertEqual(msg, MSG)
2890 self.checkRecvmsgAddress(addr, self.cli_addr)
2891 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2892 ignore=ignoreflags)
2893
2894 self.assertEqual(len(ancdata), 1)
2895 self.assertIsInstance(ancdata[0], tuple)
2896 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2897 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2898 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2899 self.assertIsInstance(cmsg_data, bytes)
2900 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2901 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002902 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002903 self.assertGreaterEqual(a[0], 0)
2904 self.assertLessEqual(a[0], maxhop)
2905
2906 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2907 def testRecvHopLimit(self):
2908 # Test receiving the packet hop limit as ancillary data.
2909 self.checkHopLimit(ancbufsize=10240)
2910
2911 @testRecvHopLimit.client_skip
2912 def _testRecvHopLimit(self):
2913 # Need to wait until server has asked to receive ancillary
2914 # data, as implementations are not required to buffer it
2915 # otherwise.
2916 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2917 self.sendToServer(MSG)
2918
2919 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2920 def testRecvHopLimitCMSG_SPACE(self):
2921 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2922 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2923
2924 @testRecvHopLimitCMSG_SPACE.client_skip
2925 def _testRecvHopLimitCMSG_SPACE(self):
2926 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2927 self.sendToServer(MSG)
2928
2929 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2930 # 3542 says portable applications must provide space for trailing
2931 # padding. Implementations may set MSG_CTRUNC if there isn't
2932 # enough space for the padding.
2933
2934 @requireAttrs(socket.socket, "sendmsg")
2935 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2936 def testSetHopLimit(self):
2937 # Test setting hop limit on outgoing packet and receiving it
2938 # at the other end.
2939 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2940
2941 @testSetHopLimit.client_skip
2942 def _testSetHopLimit(self):
2943 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2944 self.assertEqual(
2945 self.sendmsgToServer([MSG],
2946 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2947 array.array("i", [self.hop_limit]))]),
2948 len(MSG))
2949
2950 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2951 ignoreflags=0):
2952 # Receive traffic class and hop limit into ancbufsize bytes of
2953 # ancillary data space. Check that data is MSG, ancillary
2954 # data is not truncated (but ignore any flags in ignoreflags),
2955 # and traffic class and hop limit are in range (hop limit no
2956 # more than maxhop).
2957 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2958 socket.IPV6_RECVHOPLIMIT, 1)
2959 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2960 socket.IPV6_RECVTCLASS, 1)
2961 self.misc_event.set()
2962 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2963 len(MSG), ancbufsize)
2964
2965 self.assertEqual(msg, MSG)
2966 self.checkRecvmsgAddress(addr, self.cli_addr)
2967 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2968 ignore=ignoreflags)
2969 self.assertEqual(len(ancdata), 2)
2970 ancmap = self.ancillaryMapping(ancdata)
2971
2972 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2973 self.assertEqual(len(tcdata), SIZEOF_INT)
2974 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002975 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002976 self.assertGreaterEqual(a[0], 0)
2977 self.assertLessEqual(a[0], 255)
2978
2979 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2980 self.assertEqual(len(hldata), SIZEOF_INT)
2981 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002982 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002983 self.assertGreaterEqual(a[0], 0)
2984 self.assertLessEqual(a[0], maxhop)
2985
2986 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2987 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2988 def testRecvTrafficClassAndHopLimit(self):
2989 # Test receiving traffic class and hop limit as ancillary data.
2990 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2991
2992 @testRecvTrafficClassAndHopLimit.client_skip
2993 def _testRecvTrafficClassAndHopLimit(self):
2994 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2995 self.sendToServer(MSG)
2996
2997 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2998 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2999 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3000 # Test receiving traffic class and hop limit, using
3001 # CMSG_SPACE() to calculate buffer size.
3002 self.checkTrafficClassAndHopLimit(
3003 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3004
3005 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3006 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3007 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3008 self.sendToServer(MSG)
3009
3010 @requireAttrs(socket.socket, "sendmsg")
3011 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3012 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3013 def testSetTrafficClassAndHopLimit(self):
3014 # Test setting traffic class and hop limit on outgoing packet,
3015 # and receiving them at the other end.
3016 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3017 maxhop=self.hop_limit)
3018
3019 @testSetTrafficClassAndHopLimit.client_skip
3020 def _testSetTrafficClassAndHopLimit(self):
3021 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3022 self.assertEqual(
3023 self.sendmsgToServer([MSG],
3024 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3025 array.array("i", [self.traffic_class])),
3026 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3027 array.array("i", [self.hop_limit]))]),
3028 len(MSG))
3029
3030 @requireAttrs(socket.socket, "sendmsg")
3031 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3032 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3033 def testOddCmsgSize(self):
3034 # Try to send ancillary data with first item one byte too
3035 # long. Fall back to sending with correct size if this fails,
3036 # and check that second item was handled correctly.
3037 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3038 maxhop=self.hop_limit)
3039
3040 @testOddCmsgSize.client_skip
3041 def _testOddCmsgSize(self):
3042 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3043 try:
3044 nbytes = self.sendmsgToServer(
3045 [MSG],
3046 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003047 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003048 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3049 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003050 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003051 self.assertIsInstance(e.errno, int)
3052 nbytes = self.sendmsgToServer(
3053 [MSG],
3054 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3055 array.array("i", [self.traffic_class])),
3056 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3057 array.array("i", [self.hop_limit]))])
3058 self.assertEqual(nbytes, len(MSG))
3059
3060 # Tests for proper handling of truncated ancillary data
3061
3062 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3063 # Receive hop limit into ancbufsize bytes of ancillary data
3064 # space, which should be too small to contain the ancillary
3065 # data header (if ancbufsize is None, pass no second argument
3066 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3067 # (unless included in ignoreflags), and no ancillary data is
3068 # returned.
3069 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3070 socket.IPV6_RECVHOPLIMIT, 1)
3071 self.misc_event.set()
3072 args = () if ancbufsize is None else (ancbufsize,)
3073 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3074 len(MSG), *args)
3075
3076 self.assertEqual(msg, MSG)
3077 self.checkRecvmsgAddress(addr, self.cli_addr)
3078 self.assertEqual(ancdata, [])
3079 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3080 ignore=ignoreflags)
3081
3082 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3083 def testCmsgTruncNoBufSize(self):
3084 # Check that no ancillary data is received when no ancillary
3085 # buffer size is provided.
3086 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3087 # BSD seems to set
3088 # MSG_CTRUNC only if an item
3089 # has been partially
3090 # received.
3091 ignoreflags=socket.MSG_CTRUNC)
3092
3093 @testCmsgTruncNoBufSize.client_skip
3094 def _testCmsgTruncNoBufSize(self):
3095 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3096 self.sendToServer(MSG)
3097
3098 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3099 def testSingleCmsgTrunc0(self):
3100 # Check that no ancillary data is received when ancillary
3101 # buffer size is zero.
3102 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3103 ignoreflags=socket.MSG_CTRUNC)
3104
3105 @testSingleCmsgTrunc0.client_skip
3106 def _testSingleCmsgTrunc0(self):
3107 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3108 self.sendToServer(MSG)
3109
3110 # Check that no ancillary data is returned for various non-zero
3111 # (but still too small) buffer sizes.
3112
3113 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3114 def testSingleCmsgTrunc1(self):
3115 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3116
3117 @testSingleCmsgTrunc1.client_skip
3118 def _testSingleCmsgTrunc1(self):
3119 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3120 self.sendToServer(MSG)
3121
3122 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3123 def testSingleCmsgTrunc2Int(self):
3124 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3125
3126 @testSingleCmsgTrunc2Int.client_skip
3127 def _testSingleCmsgTrunc2Int(self):
3128 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3129 self.sendToServer(MSG)
3130
3131 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3132 def testSingleCmsgTruncLen0Minus1(self):
3133 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3134
3135 @testSingleCmsgTruncLen0Minus1.client_skip
3136 def _testSingleCmsgTruncLen0Minus1(self):
3137 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3138 self.sendToServer(MSG)
3139
3140 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3141 def testSingleCmsgTruncInData(self):
3142 # Test truncation of a control message inside its associated
3143 # data. The message may be returned with its data truncated,
3144 # or not returned at all.
3145 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3146 socket.IPV6_RECVHOPLIMIT, 1)
3147 self.misc_event.set()
3148 msg, ancdata, flags, addr = self.doRecvmsg(
3149 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3150
3151 self.assertEqual(msg, MSG)
3152 self.checkRecvmsgAddress(addr, self.cli_addr)
3153 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3154
3155 self.assertLessEqual(len(ancdata), 1)
3156 if ancdata:
3157 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3158 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3159 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3160 self.assertLess(len(cmsg_data), SIZEOF_INT)
3161
3162 @testSingleCmsgTruncInData.client_skip
3163 def _testSingleCmsgTruncInData(self):
3164 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3165 self.sendToServer(MSG)
3166
3167 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3168 # Receive traffic class and hop limit into ancbufsize bytes of
3169 # ancillary data space, which should be large enough to
3170 # contain the first item, but too small to contain the header
3171 # of the second. Check that data is MSG, MSG_CTRUNC is set
3172 # (unless included in ignoreflags), and only one ancillary
3173 # data item is returned.
3174 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3175 socket.IPV6_RECVHOPLIMIT, 1)
3176 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3177 socket.IPV6_RECVTCLASS, 1)
3178 self.misc_event.set()
3179 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3180 len(MSG), ancbufsize)
3181
3182 self.assertEqual(msg, MSG)
3183 self.checkRecvmsgAddress(addr, self.cli_addr)
3184 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3185 ignore=ignoreflags)
3186
3187 self.assertEqual(len(ancdata), 1)
3188 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3189 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3190 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3191 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3192 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003193 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003194 self.assertGreaterEqual(a[0], 0)
3195 self.assertLessEqual(a[0], 255)
3196
3197 # Try the above test with various buffer sizes.
3198
3199 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3200 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3201 def testSecondCmsgTrunc0(self):
3202 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3203 ignoreflags=socket.MSG_CTRUNC)
3204
3205 @testSecondCmsgTrunc0.client_skip
3206 def _testSecondCmsgTrunc0(self):
3207 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3208 self.sendToServer(MSG)
3209
3210 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3211 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3212 def testSecondCmsgTrunc1(self):
3213 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3214
3215 @testSecondCmsgTrunc1.client_skip
3216 def _testSecondCmsgTrunc1(self):
3217 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3218 self.sendToServer(MSG)
3219
3220 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3221 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3222 def testSecondCmsgTrunc2Int(self):
3223 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3224 2 * SIZEOF_INT)
3225
3226 @testSecondCmsgTrunc2Int.client_skip
3227 def _testSecondCmsgTrunc2Int(self):
3228 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3229 self.sendToServer(MSG)
3230
3231 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3232 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3233 def testSecondCmsgTruncLen0Minus1(self):
3234 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3235 socket.CMSG_LEN(0) - 1)
3236
3237 @testSecondCmsgTruncLen0Minus1.client_skip
3238 def _testSecondCmsgTruncLen0Minus1(self):
3239 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3240 self.sendToServer(MSG)
3241
3242 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3243 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3244 def testSecomdCmsgTruncInData(self):
3245 # Test truncation of the second of two control messages inside
3246 # its associated data.
3247 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3248 socket.IPV6_RECVHOPLIMIT, 1)
3249 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3250 socket.IPV6_RECVTCLASS, 1)
3251 self.misc_event.set()
3252 msg, ancdata, flags, addr = self.doRecvmsg(
3253 self.serv_sock, len(MSG),
3254 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3255
3256 self.assertEqual(msg, MSG)
3257 self.checkRecvmsgAddress(addr, self.cli_addr)
3258 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3259
3260 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3261
3262 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3263 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3264 cmsg_types.remove(cmsg_type)
3265 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3266 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003267 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003268 self.assertGreaterEqual(a[0], 0)
3269 self.assertLessEqual(a[0], 255)
3270
3271 if ancdata:
3272 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3273 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3274 cmsg_types.remove(cmsg_type)
3275 self.assertLess(len(cmsg_data), SIZEOF_INT)
3276
3277 self.assertEqual(ancdata, [])
3278
3279 @testSecomdCmsgTruncInData.client_skip
3280 def _testSecomdCmsgTruncInData(self):
3281 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3282 self.sendToServer(MSG)
3283
3284
3285# Derive concrete test classes for different socket types.
3286
3287class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3288 SendrecvmsgConnectionlessBase,
3289 ThreadedSocketTestMixin, UDPTestBase):
3290 pass
3291
3292@requireAttrs(socket.socket, "sendmsg")
3293@unittest.skipUnless(thread, 'Threading required for this test.')
3294class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3295 pass
3296
3297@requireAttrs(socket.socket, "recvmsg")
3298@unittest.skipUnless(thread, 'Threading required for this test.')
3299class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3300 pass
3301
3302@requireAttrs(socket.socket, "recvmsg_into")
3303@unittest.skipUnless(thread, 'Threading required for this test.')
3304class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3305 pass
3306
3307
3308class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3309 SendrecvmsgConnectionlessBase,
3310 ThreadedSocketTestMixin, UDP6TestBase):
3311 pass
3312
3313@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003314@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003315@requireSocket("AF_INET6", "SOCK_DGRAM")
3316@unittest.skipUnless(thread, 'Threading required for this test.')
3317class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3318 pass
3319
3320@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003321@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003322@requireSocket("AF_INET6", "SOCK_DGRAM")
3323@unittest.skipUnless(thread, 'Threading required for this test.')
3324class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3325 pass
3326
3327@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003328@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003329@requireSocket("AF_INET6", "SOCK_DGRAM")
3330@unittest.skipUnless(thread, 'Threading required for this test.')
3331class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3332 pass
3333
3334@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003335@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003336@requireAttrs(socket, "IPPROTO_IPV6")
3337@requireSocket("AF_INET6", "SOCK_DGRAM")
3338@unittest.skipUnless(thread, 'Threading required for this test.')
3339class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3340 SendrecvmsgUDP6TestBase):
3341 pass
3342
3343@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003344@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003345@requireAttrs(socket, "IPPROTO_IPV6")
3346@requireSocket("AF_INET6", "SOCK_DGRAM")
3347@unittest.skipUnless(thread, 'Threading required for this test.')
3348class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3349 RFC3542AncillaryTest,
3350 SendrecvmsgUDP6TestBase):
3351 pass
3352
3353
3354class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3355 ConnectedStreamTestMixin, TCPTestBase):
3356 pass
3357
3358@requireAttrs(socket.socket, "sendmsg")
3359@unittest.skipUnless(thread, 'Threading required for this test.')
3360class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3361 pass
3362
3363@requireAttrs(socket.socket, "recvmsg")
3364@unittest.skipUnless(thread, 'Threading required for this test.')
3365class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3366 SendrecvmsgTCPTestBase):
3367 pass
3368
3369@requireAttrs(socket.socket, "recvmsg_into")
3370@unittest.skipUnless(thread, 'Threading required for this test.')
3371class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3372 SendrecvmsgTCPTestBase):
3373 pass
3374
3375
3376class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3377 SendrecvmsgConnectedBase,
3378 ConnectedStreamTestMixin, SCTPStreamBase):
3379 pass
3380
3381@requireAttrs(socket.socket, "sendmsg")
3382@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3383@unittest.skipUnless(thread, 'Threading required for this test.')
3384class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3385 pass
3386
3387@requireAttrs(socket.socket, "recvmsg")
3388@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3389@unittest.skipUnless(thread, 'Threading required for this test.')
3390class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3391 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003392
3393 def testRecvmsgEOF(self):
3394 try:
3395 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3396 except OSError as e:
3397 if e.errno != errno.ENOTCONN:
3398 raise
3399 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003400
3401@requireAttrs(socket.socket, "recvmsg_into")
3402@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3403@unittest.skipUnless(thread, 'Threading required for this test.')
3404class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3405 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003406
3407 def testRecvmsgEOF(self):
3408 try:
3409 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3410 except OSError as e:
3411 if e.errno != errno.ENOTCONN:
3412 raise
3413 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003414
3415
3416class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3417 ConnectedStreamTestMixin, UnixStreamBase):
3418 pass
3419
3420@requireAttrs(socket.socket, "sendmsg")
3421@requireAttrs(socket, "AF_UNIX")
3422@unittest.skipUnless(thread, 'Threading required for this test.')
3423class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3424 pass
3425
3426@requireAttrs(socket.socket, "recvmsg")
3427@requireAttrs(socket, "AF_UNIX")
3428@unittest.skipUnless(thread, 'Threading required for this test.')
3429class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3430 SendrecvmsgUnixStreamTestBase):
3431 pass
3432
3433@requireAttrs(socket.socket, "recvmsg_into")
3434@requireAttrs(socket, "AF_UNIX")
3435@unittest.skipUnless(thread, 'Threading required for this test.')
3436class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3437 SendrecvmsgUnixStreamTestBase):
3438 pass
3439
3440@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3441@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3442@unittest.skipUnless(thread, 'Threading required for this test.')
3443class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3444 pass
3445
3446@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3447@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3448@unittest.skipUnless(thread, 'Threading required for this test.')
3449class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3450 SendrecvmsgUnixStreamTestBase):
3451 pass
3452
3453
3454# Test interrupting the interruptible send/receive methods with a
3455# signal when a timeout is set. These tests avoid having multiple
3456# threads alive during the test so that the OS cannot deliver the
3457# signal to the wrong one.
3458
3459class InterruptedTimeoutBase(unittest.TestCase):
3460 # Base class for interrupted send/receive tests. Installs an
3461 # empty handler for SIGALRM and removes it on teardown, along with
3462 # any scheduled alarms.
3463
3464 def setUp(self):
3465 super().setUp()
3466 orig_alrm_handler = signal.signal(signal.SIGALRM,
3467 lambda signum, frame: None)
3468 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3469 self.addCleanup(self.setAlarm, 0)
3470
3471 # Timeout for socket operations
3472 timeout = 4.0
3473
3474 # Provide setAlarm() method to schedule delivery of SIGALRM after
3475 # given number of seconds, or cancel it if zero, and an
3476 # appropriate time value to use. Use setitimer() if available.
3477 if hasattr(signal, "setitimer"):
3478 alarm_time = 0.05
3479
3480 def setAlarm(self, seconds):
3481 signal.setitimer(signal.ITIMER_REAL, seconds)
3482 else:
3483 # Old systems may deliver the alarm up to one second early
3484 alarm_time = 2
3485
3486 def setAlarm(self, seconds):
3487 signal.alarm(seconds)
3488
3489
3490# Require siginterrupt() in order to ensure that system calls are
3491# interrupted by default.
3492@requireAttrs(signal, "siginterrupt")
3493@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3494 "Don't have signal.alarm or signal.setitimer")
3495class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3496 # Test interrupting the recv*() methods with signals when a
3497 # timeout is set.
3498
3499 def setUp(self):
3500 super().setUp()
3501 self.serv.settimeout(self.timeout)
3502
3503 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003504 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003505 # errno of EINTR when interrupted by a signal.
3506 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003507 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003508 func(*args, **kwargs)
3509 self.assertNotIsInstance(cm.exception, socket.timeout)
3510 self.assertEqual(cm.exception.errno, errno.EINTR)
3511
3512 def testInterruptedRecvTimeout(self):
3513 self.checkInterruptedRecv(self.serv.recv, 1024)
3514
3515 def testInterruptedRecvIntoTimeout(self):
3516 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3517
3518 def testInterruptedRecvfromTimeout(self):
3519 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3520
3521 def testInterruptedRecvfromIntoTimeout(self):
3522 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3523
3524 @requireAttrs(socket.socket, "recvmsg")
3525 def testInterruptedRecvmsgTimeout(self):
3526 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3527
3528 @requireAttrs(socket.socket, "recvmsg_into")
3529 def testInterruptedRecvmsgIntoTimeout(self):
3530 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3531
3532
3533# Require siginterrupt() in order to ensure that system calls are
3534# interrupted by default.
3535@requireAttrs(signal, "siginterrupt")
3536@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3537 "Don't have signal.alarm or signal.setitimer")
3538@unittest.skipUnless(thread, 'Threading required for this test.')
3539class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3540 ThreadSafeCleanupTestCase,
3541 SocketListeningTestMixin, TCPTestBase):
3542 # Test interrupting the interruptible send*() methods with signals
3543 # when a timeout is set.
3544
3545 def setUp(self):
3546 super().setUp()
3547 self.serv_conn = self.newSocket()
3548 self.addCleanup(self.serv_conn.close)
3549 # Use a thread to complete the connection, but wait for it to
3550 # terminate before running the test, so that there is only one
3551 # thread to accept the signal.
3552 cli_thread = threading.Thread(target=self.doConnect)
3553 cli_thread.start()
3554 self.cli_conn, addr = self.serv.accept()
3555 self.addCleanup(self.cli_conn.close)
3556 cli_thread.join()
3557 self.serv_conn.settimeout(self.timeout)
3558
3559 def doConnect(self):
3560 self.serv_conn.connect(self.serv_addr)
3561
3562 def checkInterruptedSend(self, func, *args, **kwargs):
3563 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003564 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003565 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003566 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003567 while True:
3568 self.setAlarm(self.alarm_time)
3569 func(*args, **kwargs)
3570 self.assertNotIsInstance(cm.exception, socket.timeout)
3571 self.assertEqual(cm.exception.errno, errno.EINTR)
3572
Nick Coghlan2496f332011-09-19 20:26:31 +10003573 # Issue #12958: The following tests have problems on Mac OS X
3574 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003575 def testInterruptedSendTimeout(self):
3576 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3577
Nick Coghlan2496f332011-09-19 20:26:31 +10003578 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003579 def testInterruptedSendtoTimeout(self):
3580 # Passing an actual address here as Python's wrapper for
3581 # sendto() doesn't allow passing a zero-length one; POSIX
3582 # requires that the address is ignored since the socket is
3583 # connection-mode, however.
3584 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3585 self.serv_addr)
3586
Nick Coghlan2496f332011-09-19 20:26:31 +10003587 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003588 @requireAttrs(socket.socket, "sendmsg")
3589 def testInterruptedSendmsgTimeout(self):
3590 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3591
3592
Victor Stinner45df8202010-04-28 22:31:17 +00003593@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003594class TCPCloserTest(ThreadedTCPSocketTest):
3595
3596 def testClose(self):
3597 conn, addr = self.serv.accept()
3598 conn.close()
3599
3600 sd = self.cli
3601 read, write, err = select.select([sd], [], [], 1.0)
3602 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003603 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003604
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003605 # Calling close() many times should be safe.
3606 conn.close()
3607 conn.close()
3608
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003609 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003610 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003611 time.sleep(1.0)
3612
Victor Stinner45df8202010-04-28 22:31:17 +00003613@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003614class BasicSocketPairTest(SocketPairTest):
3615
3616 def __init__(self, methodName='runTest'):
3617 SocketPairTest.__init__(self, methodName=methodName)
3618
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003619 def _check_defaults(self, sock):
3620 self.assertIsInstance(sock, socket.socket)
3621 if hasattr(socket, 'AF_UNIX'):
3622 self.assertEqual(sock.family, socket.AF_UNIX)
3623 else:
3624 self.assertEqual(sock.family, socket.AF_INET)
3625 self.assertEqual(sock.type, socket.SOCK_STREAM)
3626 self.assertEqual(sock.proto, 0)
3627
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003628 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003629 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003630
3631 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003632 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003633
Dave Cole331708b2004-08-09 04:51:41 +00003634 def testRecv(self):
3635 msg = self.serv.recv(1024)
3636 self.assertEqual(msg, MSG)
3637
3638 def _testRecv(self):
3639 self.cli.send(MSG)
3640
3641 def testSend(self):
3642 self.serv.send(MSG)
3643
3644 def _testSend(self):
3645 msg = self.cli.recv(1024)
3646 self.assertEqual(msg, MSG)
3647
Victor Stinner45df8202010-04-28 22:31:17 +00003648@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003649class NonBlockingTCPTests(ThreadedTCPSocketTest):
3650
3651 def __init__(self, methodName='runTest'):
3652 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3653
3654 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003655 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003656 self.serv.setblocking(True)
3657 self.assertIsNone(self.serv.gettimeout())
3658 self.serv.setblocking(False)
3659 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003660 start = time.time()
3661 try:
3662 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003663 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003664 pass
3665 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003666 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Serhiy Storchaka78980432013-01-15 01:12:17 +02003667 # Issue 15989
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003668 if _testcapi.UINT_MAX < _testcapi.ULONG_MAX:
3669 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3670 self.assertIsNone(self.serv.gettimeout())
Guido van Rossum24e4af82002-06-12 19:18:08 +00003671
3672 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003673 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003674
Antoine Pitroub1c54962010-10-14 15:05:38 +00003675 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003676 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003677 def testInitNonBlocking(self):
3678 # reinit server socket
3679 self.serv.close()
3680 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003681 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003682 self.port = support.bind_port(self.serv)
3683 self.serv.listen(1)
3684 # actual testing
3685 start = time.time()
3686 try:
3687 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003688 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003689 pass
3690 end = time.time()
3691 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3692
3693 def _testInitNonBlocking(self):
3694 pass
3695
Antoine Pitrou600232b2011-01-05 21:03:42 +00003696 def testInheritFlags(self):
3697 # Issue #7995: when calling accept() on a listening socket with a
3698 # timeout, the resulting socket should not be non-blocking.
3699 self.serv.settimeout(10)
3700 try:
3701 conn, addr = self.serv.accept()
3702 message = conn.recv(len(MSG))
3703 finally:
3704 conn.close()
3705 self.serv.settimeout(None)
3706
3707 def _testInheritFlags(self):
3708 time.sleep(0.1)
3709 self.cli.connect((HOST, self.port))
3710 time.sleep(0.5)
3711 self.cli.send(MSG)
3712
Guido van Rossum24e4af82002-06-12 19:18:08 +00003713 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003714 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003715 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003716 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003717 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003718 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003719 pass
3720 else:
3721 self.fail("Error trying to do non-blocking accept.")
3722 read, write, err = select.select([self.serv], [], [])
3723 if self.serv in read:
3724 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003725 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003726 else:
3727 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003728
Guido van Rossum24e4af82002-06-12 19:18:08 +00003729 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003730 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003731 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003732
3733 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003734 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003735 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003736 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003737
3738 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003739 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003740 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003741
3742 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003743 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003744 conn, addr = self.serv.accept()
3745 conn.setblocking(0)
3746 try:
3747 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003748 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003749 pass
3750 else:
3751 self.fail("Error trying to do non-blocking recv.")
3752 read, write, err = select.select([conn], [], [])
3753 if conn in read:
3754 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003755 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003756 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003757 else:
3758 self.fail("Error during select call to non-blocking socket.")
3759
3760 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003761 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003762 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003763 self.cli.send(MSG)
3764
Victor Stinner45df8202010-04-28 22:31:17 +00003765@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003766class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003767 """Unit tests for the object returned by socket.makefile()
3768
Antoine Pitrou834bd812010-10-13 16:17:14 +00003769 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003770 the client connection. You can read from this file to
3771 get output from the server.
3772
Antoine Pitrou834bd812010-10-13 16:17:14 +00003773 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003774 server connection. You can write to this file to send output
3775 to the client.
3776 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003777
Guido van Rossume9f66142002-08-07 15:46:19 +00003778 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003779 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003780 errors = 'strict'
3781 newline = None
3782
3783 read_mode = 'rb'
3784 read_msg = MSG
3785 write_mode = 'wb'
3786 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003787
Guido van Rossum24e4af82002-06-12 19:18:08 +00003788 def __init__(self, methodName='runTest'):
3789 SocketConnectedTest.__init__(self, methodName=methodName)
3790
3791 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003792 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3793 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003794 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003795 self.read_file = self.cli_conn.makefile(
3796 self.read_mode, self.bufsize,
3797 encoding = self.encoding,
3798 errors = self.errors,
3799 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003800
3801 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003802 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003803 self.read_file.close()
3804 self.assertTrue(self.read_file.closed)
3805 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003806 SocketConnectedTest.tearDown(self)
3807
3808 def clientSetUp(self):
3809 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003810 self.write_file = self.serv_conn.makefile(
3811 self.write_mode, self.bufsize,
3812 encoding = self.encoding,
3813 errors = self.errors,
3814 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003815
3816 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003817 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003818 self.write_file.close()
3819 self.assertTrue(self.write_file.closed)
3820 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003821 SocketConnectedTest.clientTearDown(self)
3822
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003823 def testReadAfterTimeout(self):
3824 # Issue #7322: A file object must disallow further reads
3825 # after a timeout has occurred.
3826 self.cli_conn.settimeout(1)
3827 self.read_file.read(3)
3828 # First read raises a timeout
3829 self.assertRaises(socket.timeout, self.read_file.read, 1)
3830 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003831 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003832 self.read_file.read(1)
3833 self.assertIn("cannot read from timed out object", str(ctx.exception))
3834
3835 def _testReadAfterTimeout(self):
3836 self.write_file.write(self.write_msg[0:3])
3837 self.write_file.flush()
3838 self.serv_finished.wait()
3839
Guido van Rossum24e4af82002-06-12 19:18:08 +00003840 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003841 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003842 first_seg = self.read_file.read(len(self.read_msg)-3)
3843 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003844 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003845 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003846
3847 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003848 self.write_file.write(self.write_msg)
3849 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003850
Guido van Rossum8c943832002-08-08 01:00:28 +00003851 def testFullRead(self):
3852 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003853 msg = self.read_file.read()
3854 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003855
3856 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003857 self.write_file.write(self.write_msg)
3858 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003859
Guido van Rossum24e4af82002-06-12 19:18:08 +00003860 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003861 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003862 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003863 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003864 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003865 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003866 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003867 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003868 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003869
3870 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003871 self.write_file.write(self.write_msg)
3872 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003873
3874 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003875 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003876 line = self.read_file.readline()
3877 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003878
3879 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003880 self.write_file.write(self.write_msg)
3881 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003882
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003883 def testCloseAfterMakefile(self):
3884 # The file returned by makefile should keep the socket open.
3885 self.cli_conn.close()
3886 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003887 msg = self.read_file.read()
3888 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003889
3890 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003891 self.write_file.write(self.write_msg)
3892 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003893
3894 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003895 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003896 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003897 if isinstance(self.read_msg, str):
3898 msg = msg.decode()
3899 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003900
3901 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003902 self.write_file.write(self.write_msg)
3903 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003904
Tim Peters116d83c2004-03-28 02:20:45 +00003905 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003906 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003907
3908 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003909 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003910
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003911 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003912 self.assertEqual(self.read_file.mode, self.read_mode)
3913 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003914
3915 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003916 self.assertEqual(self.write_file.mode, self.write_mode)
3917 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003918
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003919 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003920 self.read_file.close()
3921 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003922 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003923 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003924
3925 def _testRealClose(self):
3926 pass
3927
3928
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003929class FileObjectInterruptedTestCase(unittest.TestCase):
3930 """Test that the file object correctly handles EINTR internally."""
3931
3932 class MockSocket(object):
3933 def __init__(self, recv_funcs=()):
3934 # A generator that returns callables that we'll call for each
3935 # call to recv().
3936 self._recv_step = iter(recv_funcs)
3937
3938 def recv_into(self, buffer):
3939 data = next(self._recv_step)()
3940 assert len(buffer) >= len(data)
3941 buffer[:len(data)] = data
3942 return len(data)
3943
3944 def _decref_socketios(self):
3945 pass
3946
3947 def _textiowrap_for_test(self, buffering=-1):
3948 raw = socket.SocketIO(self, "r")
3949 if buffering < 0:
3950 buffering = io.DEFAULT_BUFFER_SIZE
3951 if buffering == 0:
3952 return raw
3953 buffer = io.BufferedReader(raw, buffering)
3954 text = io.TextIOWrapper(buffer, None, None)
3955 text.mode = "rb"
3956 return text
3957
3958 @staticmethod
3959 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02003960 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003961
3962 def _textiowrap_mock_socket(self, mock, buffering=-1):
3963 raw = socket.SocketIO(mock, "r")
3964 if buffering < 0:
3965 buffering = io.DEFAULT_BUFFER_SIZE
3966 if buffering == 0:
3967 return raw
3968 buffer = io.BufferedReader(raw, buffering)
3969 text = io.TextIOWrapper(buffer, None, None)
3970 text.mode = "rb"
3971 return text
3972
3973 def _test_readline(self, size=-1, buffering=-1):
3974 mock_sock = self.MockSocket(recv_funcs=[
3975 lambda : b"This is the first line\nAnd the sec",
3976 self._raise_eintr,
3977 lambda : b"ond line is here\n",
3978 lambda : b"",
3979 lambda : b"", # XXX(gps): io library does an extra EOF read
3980 ])
3981 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003982 self.assertEqual(fo.readline(size), "This is the first line\n")
3983 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003984
3985 def _test_read(self, size=-1, buffering=-1):
3986 mock_sock = self.MockSocket(recv_funcs=[
3987 lambda : b"This is the first line\nAnd the sec",
3988 self._raise_eintr,
3989 lambda : b"ond line is here\n",
3990 lambda : b"",
3991 lambda : b"", # XXX(gps): io library does an extra EOF read
3992 ])
3993 expecting = (b"This is the first line\n"
3994 b"And the second line is here\n")
3995 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3996 if buffering == 0:
3997 data = b''
3998 else:
3999 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004000 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004001 while len(data) != len(expecting):
4002 part = fo.read(size)
4003 if not part:
4004 break
4005 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004006 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004007
4008 def test_default(self):
4009 self._test_readline()
4010 self._test_readline(size=100)
4011 self._test_read()
4012 self._test_read(size=100)
4013
4014 def test_with_1k_buffer(self):
4015 self._test_readline(buffering=1024)
4016 self._test_readline(size=100, buffering=1024)
4017 self._test_read(buffering=1024)
4018 self._test_read(size=100, buffering=1024)
4019
4020 def _test_readline_no_buffer(self, size=-1):
4021 mock_sock = self.MockSocket(recv_funcs=[
4022 lambda : b"a",
4023 lambda : b"\n",
4024 lambda : b"B",
4025 self._raise_eintr,
4026 lambda : b"b",
4027 lambda : b"",
4028 ])
4029 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004030 self.assertEqual(fo.readline(size), b"a\n")
4031 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004032
4033 def test_no_buffer(self):
4034 self._test_readline_no_buffer()
4035 self._test_readline_no_buffer(size=4)
4036 self._test_read(buffering=0)
4037 self._test_read(size=100, buffering=0)
4038
4039
Guido van Rossume9f66142002-08-07 15:46:19 +00004040class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4041
4042 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004043
Guido van Rossume9f66142002-08-07 15:46:19 +00004044 In this case (and in this case only), it should be possible to
4045 create a file object, read a line from it, create another file
4046 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004047 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004048 when reading multiple requests from the same socket."""
4049
4050 bufsize = 0 # Use unbuffered mode
4051
4052 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004053 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004054 line = self.read_file.readline() # first line
4055 self.assertEqual(line, b"A. " + self.write_msg) # first line
4056 self.read_file = self.cli_conn.makefile('rb', 0)
4057 line = self.read_file.readline() # second line
4058 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004059
4060 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004061 self.write_file.write(b"A. " + self.write_msg)
4062 self.write_file.write(b"B. " + self.write_msg)
4063 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004064
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004065 def testMakefileClose(self):
4066 # The file returned by makefile should keep the socket open...
4067 self.cli_conn.close()
4068 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004069 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004070 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004071 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004072 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004073
4074 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004075 self.write_file.write(self.write_msg)
4076 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004077
4078 def testMakefileCloseSocketDestroy(self):
4079 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004080 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004081 refcount_after = sys.getrefcount(self.cli_conn)
4082 self.assertEqual(refcount_before - 1, refcount_after)
4083
4084 def _testMakefileCloseSocketDestroy(self):
4085 pass
4086
Antoine Pitrou98b46702010-09-18 22:59:00 +00004087 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004088 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004089 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4090
4091 def testSmallReadNonBlocking(self):
4092 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004093 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4094 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004095 self.evt1.set()
4096 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004097 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004098 if first_seg is None:
4099 # Data not arrived (can happen under Windows), wait a bit
4100 time.sleep(0.5)
4101 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004102 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004103 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004104 self.assertEqual(n, 3)
4105 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004106 self.assertEqual(msg, self.read_msg)
4107 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4108 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004109
4110 def _testSmallReadNonBlocking(self):
4111 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004112 self.write_file.write(self.write_msg)
4113 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004114 self.evt2.set()
4115 # Avoid cloding the socket before the server test has finished,
4116 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4117 self.serv_finished.wait(5.0)
4118
4119 def testWriteNonBlocking(self):
4120 self.cli_finished.wait(5.0)
4121 # The client thread can't skip directly - the SkipTest exception
4122 # would appear as a failure.
4123 if self.serv_skipped:
4124 self.skipTest(self.serv_skipped)
4125
4126 def _testWriteNonBlocking(self):
4127 self.serv_skipped = None
4128 self.serv_conn.setblocking(False)
4129 # Try to saturate the socket buffer pipe with repeated large writes.
4130 BIG = b"x" * (1024 ** 2)
4131 LIMIT = 10
4132 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004133 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004134 self.assertGreater(n, 0)
4135 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004136 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004137 if n is None:
4138 # Succeeded
4139 break
4140 self.assertGreater(n, 0)
4141 else:
4142 # Let us know that this test didn't manage to establish
4143 # the expected conditions. This is not a failure in itself but,
4144 # if it happens repeatedly, the test should be fixed.
4145 self.serv_skipped = "failed to saturate the socket buffer"
4146
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004147
Guido van Rossum8c943832002-08-08 01:00:28 +00004148class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4149
4150 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4151
4152
4153class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4154
4155 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004156
Thomas Woutersb2137042007-02-01 18:02:27 +00004157
Antoine Pitrou834bd812010-10-13 16:17:14 +00004158class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4159 """Tests for socket.makefile() in text mode (rather than binary)"""
4160
4161 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004162 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004163 write_mode = 'wb'
4164 write_msg = MSG
4165 newline = ''
4166
4167
4168class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4169 """Tests for socket.makefile() in text mode (rather than binary)"""
4170
4171 read_mode = 'rb'
4172 read_msg = MSG
4173 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004174 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004175 newline = ''
4176
4177
4178class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4179 """Tests for socket.makefile() in text mode (rather than binary)"""
4180
4181 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004182 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004183 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004184 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004185 newline = ''
4186
4187
Guido van Rossumd8faa362007-04-27 19:54:29 +00004188class NetworkConnectionTest(object):
4189 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004190
Guido van Rossumd8faa362007-04-27 19:54:29 +00004191 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004192 # We're inherited below by BasicTCPTest2, which also inherits
4193 # BasicTCPTest, which defines self.port referenced below.
4194 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004195 self.serv_conn = self.cli
4196
4197class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4198 """Tests that NetworkConnection does not break existing TCP functionality.
4199 """
4200
4201class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004202
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004203 class MockSocket(socket.socket):
4204 def connect(self, *args):
4205 raise socket.timeout('timed out')
4206
4207 @contextlib.contextmanager
4208 def mocked_socket_module(self):
4209 """Return a socket which times out on connect"""
4210 old_socket = socket.socket
4211 socket.socket = self.MockSocket
4212 try:
4213 yield
4214 finally:
4215 socket.socket = old_socket
4216
4217 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004218 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004219 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004220 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004221 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004222 cli.connect((HOST, port))
4223 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4224
4225 def test_create_connection(self):
4226 # Issue #9792: errors raised by create_connection() should have
4227 # a proper errno attribute.
4228 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004229 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004230 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004231
4232 # Issue #16257: create_connection() calls getaddrinfo() against
4233 # 'localhost'. This may result in an IPV6 addr being returned
4234 # as well as an IPV4 one:
4235 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4236 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4237 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4238 #
4239 # create_connection() enumerates through all the addresses returned
4240 # and if it doesn't successfully bind to any of them, it propagates
4241 # the last exception it encountered.
4242 #
4243 # On Solaris, ENETUNREACH is returned in this circumstance instead
4244 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4245 # expected errnos.
4246 expected_errnos = [ errno.ECONNREFUSED, ]
4247 if hasattr(errno, 'ENETUNREACH'):
4248 expected_errnos.append(errno.ENETUNREACH)
4249
4250 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004251
4252 def test_create_connection_timeout(self):
4253 # Issue #9792: create_connection() should not recast timeout errors
4254 # as generic socket errors.
4255 with self.mocked_socket_module():
4256 with self.assertRaises(socket.timeout):
4257 socket.create_connection((HOST, 1234))
4258
Guido van Rossumd8faa362007-04-27 19:54:29 +00004259
Victor Stinner45df8202010-04-28 22:31:17 +00004260@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004261class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4262
4263 def __init__(self, methodName='runTest'):
4264 SocketTCPTest.__init__(self, methodName=methodName)
4265 ThreadableTest.__init__(self)
4266
4267 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004268 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004269
4270 def clientTearDown(self):
4271 self.cli.close()
4272 self.cli = None
4273 ThreadableTest.clientTearDown(self)
4274
4275 def _justAccept(self):
4276 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004277 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004278
4279 testFamily = _justAccept
4280 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004281 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004282 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004283 self.assertEqual(self.cli.family, 2)
4284
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004285 testSourceAddress = _justAccept
4286 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004287 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4288 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004289 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004290 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004291 # The port number being used is sufficient to show that the bind()
4292 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004293
Guido van Rossumd8faa362007-04-27 19:54:29 +00004294 testTimeoutDefault = _justAccept
4295 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004296 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004297 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004298 socket.setdefaulttimeout(42)
4299 try:
4300 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004301 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004302 finally:
4303 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004304 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004305
4306 testTimeoutNone = _justAccept
4307 def _testTimeoutNone(self):
4308 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004309 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004310 socket.setdefaulttimeout(30)
4311 try:
4312 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004313 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004314 finally:
4315 socket.setdefaulttimeout(None)
4316 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004317
4318 testTimeoutValueNamed = _justAccept
4319 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004320 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004321 self.assertEqual(self.cli.gettimeout(), 30)
4322
4323 testTimeoutValueNonamed = _justAccept
4324 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004325 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004326 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004327 self.assertEqual(self.cli.gettimeout(), 30)
4328
Victor Stinner45df8202010-04-28 22:31:17 +00004329@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004330class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4331
4332 def __init__(self, methodName='runTest'):
4333 SocketTCPTest.__init__(self, methodName=methodName)
4334 ThreadableTest.__init__(self)
4335
4336 def clientSetUp(self):
4337 pass
4338
4339 def clientTearDown(self):
4340 self.cli.close()
4341 self.cli = None
4342 ThreadableTest.clientTearDown(self)
4343
4344 def testInsideTimeout(self):
4345 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004346 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004347 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004348 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004349 testOutsideTimeout = testInsideTimeout
4350
4351 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004352 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004353 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004354 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004355
4356 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004357 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004358 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004359
4360
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004361class TCPTimeoutTest(SocketTCPTest):
4362
4363 def testTCPTimeout(self):
4364 def raise_timeout(*args, **kwargs):
4365 self.serv.settimeout(1.0)
4366 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004367 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004368 "Error generating a timeout exception (TCP)")
4369
4370 def testTimeoutZero(self):
4371 ok = False
4372 try:
4373 self.serv.settimeout(0.0)
4374 foo = self.serv.accept()
4375 except socket.timeout:
4376 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004377 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004378 ok = True
4379 except:
4380 self.fail("caught unexpected exception (TCP)")
4381 if not ok:
4382 self.fail("accept() returned success when we did not expect it")
4383
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004384 def testInterruptedTimeout(self):
4385 # XXX I don't know how to do this test on MSWindows or any other
4386 # plaform that doesn't support signal.alarm() or os.kill(), though
4387 # the bug should have existed on all platforms.
4388 if not hasattr(signal, "alarm"):
4389 return # can only test on *nix
4390 self.serv.settimeout(5.0) # must be longer than alarm
4391 class Alarm(Exception):
4392 pass
4393 def alarm_handler(signal, frame):
4394 raise Alarm
4395 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4396 try:
4397 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4398 try:
4399 foo = self.serv.accept()
4400 except socket.timeout:
4401 self.fail("caught timeout instead of Alarm")
4402 except Alarm:
4403 pass
4404 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004405 self.fail("caught other exception instead of Alarm:"
4406 " %s(%s):\n%s" %
4407 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004408 else:
4409 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004410 finally:
4411 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004412 except Alarm:
4413 self.fail("got Alarm in wrong place")
4414 finally:
4415 # no alarm can be pending. Safe to restore old handler.
4416 signal.signal(signal.SIGALRM, old_alarm)
4417
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004418class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004419
4420 def testUDPTimeout(self):
4421 def raise_timeout(*args, **kwargs):
4422 self.serv.settimeout(1.0)
4423 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004424 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004425 "Error generating a timeout exception (UDP)")
4426
4427 def testTimeoutZero(self):
4428 ok = False
4429 try:
4430 self.serv.settimeout(0.0)
4431 foo = self.serv.recv(1024)
4432 except socket.timeout:
4433 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004434 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004435 ok = True
4436 except:
4437 self.fail("caught unexpected exception (UDP)")
4438 if not ok:
4439 self.fail("recv() returned success when we did not expect it")
4440
4441class TestExceptions(unittest.TestCase):
4442
4443 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004444 self.assertTrue(issubclass(OSError, Exception))
4445 self.assertTrue(issubclass(socket.herror, OSError))
4446 self.assertTrue(issubclass(socket.gaierror, OSError))
4447 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004448
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004449class TestLinuxAbstractNamespace(unittest.TestCase):
4450
4451 UNIX_PATH_MAX = 108
4452
4453 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004454 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004455 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4456 s1.bind(address)
4457 s1.listen(1)
4458 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4459 s2.connect(s1.getsockname())
4460 with s1.accept()[0] as s3:
4461 self.assertEqual(s1.getsockname(), address)
4462 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004463
4464 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004465 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004466 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4467 s.bind(address)
4468 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004469
4470 def testNameOverflow(self):
4471 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004472 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004473 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004474
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004475 def testStrName(self):
4476 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004477 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4478 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004479 s.bind("\x00python\x00test\x00")
4480 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004481 finally:
4482 s.close()
4483
4484class TestUnixDomain(unittest.TestCase):
4485
4486 def setUp(self):
4487 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4488
4489 def tearDown(self):
4490 self.sock.close()
4491
4492 def encoded(self, path):
4493 # Return the given path encoded in the file system encoding,
4494 # or skip the test if this is not possible.
4495 try:
4496 return os.fsencode(path)
4497 except UnicodeEncodeError:
4498 self.skipTest(
4499 "Pathname {0!a} cannot be represented in file "
4500 "system encoding {1!r}".format(
4501 path, sys.getfilesystemencoding()))
4502
Antoine Pitrou16374872011-12-16 15:04:12 +01004503 def bind(self, sock, path):
4504 # Bind the socket
4505 try:
4506 sock.bind(path)
4507 except OSError as e:
4508 if str(e) == "AF_UNIX path too long":
4509 self.skipTest(
4510 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4511 .format(path))
4512 else:
4513 raise
4514
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004515 def testStrAddr(self):
4516 # Test binding to and retrieving a normal string pathname.
4517 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004518 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004519 self.addCleanup(support.unlink, path)
4520 self.assertEqual(self.sock.getsockname(), path)
4521
4522 def testBytesAddr(self):
4523 # Test binding to a bytes pathname.
4524 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004525 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004526 self.addCleanup(support.unlink, path)
4527 self.assertEqual(self.sock.getsockname(), path)
4528
4529 def testSurrogateescapeBind(self):
4530 # Test binding to a valid non-ASCII pathname, with the
4531 # non-ASCII bytes supplied using surrogateescape encoding.
4532 path = os.path.abspath(support.TESTFN_UNICODE)
4533 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004534 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004535 self.addCleanup(support.unlink, path)
4536 self.assertEqual(self.sock.getsockname(), path)
4537
4538 def testUnencodableAddr(self):
4539 # Test binding to a pathname that cannot be encoded in the
4540 # file system encoding.
4541 if support.TESTFN_UNENCODABLE is None:
4542 self.skipTest("No unencodable filename available")
4543 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004544 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004545 self.addCleanup(support.unlink, path)
4546 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004547
Victor Stinner45df8202010-04-28 22:31:17 +00004548@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004549class BufferIOTest(SocketConnectedTest):
4550 """
4551 Test the buffer versions of socket.recv() and socket.send().
4552 """
4553 def __init__(self, methodName='runTest'):
4554 SocketConnectedTest.__init__(self, methodName=methodName)
4555
Antoine Pitrou25480782010-03-17 22:50:28 +00004556 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004557 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004558 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004559 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004560 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004561 self.assertEqual(msg, MSG)
4562
Antoine Pitrou25480782010-03-17 22:50:28 +00004563 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004564 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004565 self.serv_conn.send(buf)
4566
Antoine Pitrou25480782010-03-17 22:50:28 +00004567 def testRecvIntoBytearray(self):
4568 buf = bytearray(1024)
4569 nbytes = self.cli_conn.recv_into(buf)
4570 self.assertEqual(nbytes, len(MSG))
4571 msg = buf[:len(MSG)]
4572 self.assertEqual(msg, MSG)
4573
4574 _testRecvIntoBytearray = _testRecvIntoArray
4575
4576 def testRecvIntoMemoryview(self):
4577 buf = bytearray(1024)
4578 nbytes = self.cli_conn.recv_into(memoryview(buf))
4579 self.assertEqual(nbytes, len(MSG))
4580 msg = buf[:len(MSG)]
4581 self.assertEqual(msg, MSG)
4582
4583 _testRecvIntoMemoryview = _testRecvIntoArray
4584
4585 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004586 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004587 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004588 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004589 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004590 self.assertEqual(msg, MSG)
4591
Antoine Pitrou25480782010-03-17 22:50:28 +00004592 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004593 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004594 self.serv_conn.send(buf)
4595
Antoine Pitrou25480782010-03-17 22:50:28 +00004596 def testRecvFromIntoBytearray(self):
4597 buf = bytearray(1024)
4598 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4599 self.assertEqual(nbytes, len(MSG))
4600 msg = buf[:len(MSG)]
4601 self.assertEqual(msg, MSG)
4602
4603 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4604
4605 def testRecvFromIntoMemoryview(self):
4606 buf = bytearray(1024)
4607 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4608 self.assertEqual(nbytes, len(MSG))
4609 msg = buf[:len(MSG)]
4610 self.assertEqual(msg, MSG)
4611
4612 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4613
Christian Heimes043d6f62008-01-07 17:19:16 +00004614
4615TIPC_STYPE = 2000
4616TIPC_LOWER = 200
4617TIPC_UPPER = 210
4618
4619def isTipcAvailable():
4620 """Check if the TIPC module is loaded
4621
4622 The TIPC module is not loaded automatically on Ubuntu and probably
4623 other Linux distros.
4624 """
4625 if not hasattr(socket, "AF_TIPC"):
4626 return False
4627 if not os.path.isfile("/proc/modules"):
4628 return False
4629 with open("/proc/modules") as f:
4630 for line in f:
4631 if line.startswith("tipc "):
4632 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004633 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004634 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4635 return False
4636
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004637class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004638 def testRDM(self):
4639 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4640 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004641 self.addCleanup(srv.close)
4642 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004643
4644 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4645 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4646 TIPC_LOWER, TIPC_UPPER)
4647 srv.bind(srvaddr)
4648
4649 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4650 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4651 cli.sendto(MSG, sendaddr)
4652
4653 msg, recvaddr = srv.recvfrom(1024)
4654
4655 self.assertEqual(cli.getsockname(), recvaddr)
4656 self.assertEqual(msg, MSG)
4657
4658
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004659class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004660 def __init__(self, methodName = 'runTest'):
4661 unittest.TestCase.__init__(self, methodName = methodName)
4662 ThreadableTest.__init__(self)
4663
4664 def setUp(self):
4665 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004666 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004667 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4668 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4669 TIPC_LOWER, TIPC_UPPER)
4670 self.srv.bind(srvaddr)
4671 self.srv.listen(5)
4672 self.serverExplicitReady()
4673 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004674 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004675
4676 def clientSetUp(self):
4677 # The is a hittable race between serverExplicitReady() and the
4678 # accept() call; sleep a little while to avoid it, otherwise
4679 # we could get an exception
4680 time.sleep(0.1)
4681 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004682 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004683 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4684 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4685 self.cli.connect(addr)
4686 self.cliaddr = self.cli.getsockname()
4687
4688 def testStream(self):
4689 msg = self.conn.recv(1024)
4690 self.assertEqual(msg, MSG)
4691 self.assertEqual(self.cliaddr, self.connaddr)
4692
4693 def _testStream(self):
4694 self.cli.send(MSG)
4695 self.cli.close()
4696
4697
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004698@unittest.skipUnless(thread, 'Threading required for this test.')
4699class ContextManagersTest(ThreadedTCPSocketTest):
4700
4701 def _testSocketClass(self):
4702 # base test
4703 with socket.socket() as sock:
4704 self.assertFalse(sock._closed)
4705 self.assertTrue(sock._closed)
4706 # close inside with block
4707 with socket.socket() as sock:
4708 sock.close()
4709 self.assertTrue(sock._closed)
4710 # exception inside with block
4711 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004712 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004713 self.assertTrue(sock._closed)
4714
4715 def testCreateConnectionBase(self):
4716 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004717 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004718 data = conn.recv(1024)
4719 conn.sendall(data)
4720
4721 def _testCreateConnectionBase(self):
4722 address = self.serv.getsockname()
4723 with socket.create_connection(address) as sock:
4724 self.assertFalse(sock._closed)
4725 sock.sendall(b'foo')
4726 self.assertEqual(sock.recv(1024), b'foo')
4727 self.assertTrue(sock._closed)
4728
4729 def testCreateConnectionClose(self):
4730 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004731 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004732 data = conn.recv(1024)
4733 conn.sendall(data)
4734
4735 def _testCreateConnectionClose(self):
4736 address = self.serv.getsockname()
4737 with socket.create_connection(address) as sock:
4738 sock.close()
4739 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004740 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004741
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004742
Antoine Pitroub1c54962010-10-14 15:05:38 +00004743@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4744 "SOCK_CLOEXEC not defined")
4745@unittest.skipUnless(fcntl, "module fcntl not available")
4746class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004747 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004748 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004749 with socket.socket(socket.AF_INET,
4750 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4751 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4752 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004753
4754
4755@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4756 "SOCK_NONBLOCK not defined")
4757class NonblockConstantTest(unittest.TestCase):
4758 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4759 if nonblock:
4760 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4761 self.assertEqual(s.gettimeout(), timeout)
4762 else:
4763 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4764 self.assertEqual(s.gettimeout(), None)
4765
Charles-François Natali239bb962011-06-03 12:55:15 +02004766 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004767 def test_SOCK_NONBLOCK(self):
4768 # a lot of it seems silly and redundant, but I wanted to test that
4769 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004770 with socket.socket(socket.AF_INET,
4771 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4772 self.checkNonblock(s)
4773 s.setblocking(1)
4774 self.checkNonblock(s, False)
4775 s.setblocking(0)
4776 self.checkNonblock(s)
4777 s.settimeout(None)
4778 self.checkNonblock(s, False)
4779 s.settimeout(2.0)
4780 self.checkNonblock(s, timeout=2.0)
4781 s.setblocking(1)
4782 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004783 # defaulttimeout
4784 t = socket.getdefaulttimeout()
4785 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004786 with socket.socket() as s:
4787 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004788 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004789 with socket.socket() as s:
4790 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004791 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004792 with socket.socket() as s:
4793 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004794 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004795 with socket.socket() as s:
4796 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004797 socket.setdefaulttimeout(t)
4798
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004799
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004800@unittest.skipUnless(os.name == "nt", "Windows specific")
4801@unittest.skipUnless(multiprocessing, "need multiprocessing")
4802class TestSocketSharing(SocketTCPTest):
4803 # This must be classmethod and not staticmethod or multiprocessing
4804 # won't be able to bootstrap it.
4805 @classmethod
4806 def remoteProcessServer(cls, q):
4807 # Recreate socket from shared data
4808 sdata = q.get()
4809 message = q.get()
4810
4811 s = socket.fromshare(sdata)
4812 s2, c = s.accept()
4813
4814 # Send the message
4815 s2.sendall(message)
4816 s2.close()
4817 s.close()
4818
4819 def testShare(self):
4820 # Transfer the listening server socket to another process
4821 # and service it from there.
4822
4823 # Create process:
4824 q = multiprocessing.Queue()
4825 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4826 p.start()
4827
4828 # Get the shared socket data
4829 data = self.serv.share(p.pid)
4830
4831 # Pass the shared socket to the other process
4832 addr = self.serv.getsockname()
4833 self.serv.close()
4834 q.put(data)
4835
4836 # The data that the server will send us
4837 message = b"slapmahfro"
4838 q.put(message)
4839
4840 # Connect
4841 s = socket.create_connection(addr)
4842 # listen for the data
4843 m = []
4844 while True:
4845 data = s.recv(100)
4846 if not data:
4847 break
4848 m.append(data)
4849 s.close()
4850 received = b"".join(m)
4851 self.assertEqual(received, message)
4852 p.join()
4853
4854 def testShareLength(self):
4855 data = self.serv.share(os.getpid())
4856 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4857 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4858
4859 def compareSockets(self, org, other):
4860 # socket sharing is expected to work only for blocking socket
4861 # since the internal python timout value isn't transfered.
4862 self.assertEqual(org.gettimeout(), None)
4863 self.assertEqual(org.gettimeout(), other.gettimeout())
4864
4865 self.assertEqual(org.family, other.family)
4866 self.assertEqual(org.type, other.type)
4867 # If the user specified "0" for proto, then
4868 # internally windows will have picked the correct value.
4869 # Python introspection on the socket however will still return
4870 # 0. For the shared socket, the python value is recreated
4871 # from the actual value, so it may not compare correctly.
4872 if org.proto != 0:
4873 self.assertEqual(org.proto, other.proto)
4874
4875 def testShareLocal(self):
4876 data = self.serv.share(os.getpid())
4877 s = socket.fromshare(data)
4878 try:
4879 self.compareSockets(self.serv, s)
4880 finally:
4881 s.close()
4882
4883 def testTypes(self):
4884 families = [socket.AF_INET, socket.AF_INET6]
4885 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4886 for f in families:
4887 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00004888 try:
4889 source = socket.socket(f, t)
4890 except OSError:
4891 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004892 try:
4893 data = source.share(os.getpid())
4894 shared = socket.fromshare(data)
4895 try:
4896 self.compareSockets(source, shared)
4897 finally:
4898 shared.close()
4899 finally:
4900 source.close()
4901
4902
Guido van Rossumb995eb72002-07-31 16:08:40 +00004903def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004904 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004905 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004906
4907 tests.extend([
4908 NonBlockingTCPTests,
4909 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004910 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004911 UnbufferedFileObjectClassTestCase,
4912 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004913 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004914 UnicodeReadFileObjectClassTestCase,
4915 UnicodeWriteFileObjectClassTestCase,
4916 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004917 NetworkConnectionNoServer,
4918 NetworkConnectionAttributesTest,
4919 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004920 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004921 CloexecConstantTest,
4922 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004923 ])
Dave Cole331708b2004-08-09 04:51:41 +00004924 if hasattr(socket, "socketpair"):
4925 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004926 if hasattr(socket, "AF_UNIX"):
4927 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004928 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004929 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004930 if isTipcAvailable():
4931 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004932 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004933 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004934 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004935 tests.extend([
4936 CmsgMacroTests,
4937 SendmsgUDPTest,
4938 RecvmsgUDPTest,
4939 RecvmsgIntoUDPTest,
4940 SendmsgUDP6Test,
4941 RecvmsgUDP6Test,
4942 RecvmsgRFC3542AncillaryUDP6Test,
4943 RecvmsgIntoRFC3542AncillaryUDP6Test,
4944 RecvmsgIntoUDP6Test,
4945 SendmsgTCPTest,
4946 RecvmsgTCPTest,
4947 RecvmsgIntoTCPTest,
4948 SendmsgSCTPStreamTest,
4949 RecvmsgSCTPStreamTest,
4950 RecvmsgIntoSCTPStreamTest,
4951 SendmsgUnixStreamTest,
4952 RecvmsgUnixStreamTest,
4953 RecvmsgIntoUnixStreamTest,
4954 RecvmsgSCMRightsStreamTest,
4955 RecvmsgIntoSCMRightsStreamTest,
4956 # These are slow when setitimer() is not available
4957 InterruptedRecvTimeoutTest,
4958 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004959 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004960 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004961
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004962 thread_info = support.threading_setup()
4963 support.run_unittest(*tests)
4964 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004965
4966if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004967 test_main()