blob: ec76671025281f76b8823c4cc86b9a430fc8e0de [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)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000655 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000656 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000657
Raymond Hettinger027bb632004-05-31 03:09:25 +0000658 def test_weakref(self):
659 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
660 p = proxy(s)
661 self.assertEqual(p.fileno(), s.fileno())
662 s.close()
663 s = None
664 try:
665 p.fileno()
666 except ReferenceError:
667 pass
668 else:
669 self.fail('Socket proxy still exists')
670
Guido van Rossum24e4af82002-06-12 19:18:08 +0000671 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000672 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300673 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200674 with self.assertRaises(OSError, msg=msg % 'OSError'):
675 raise OSError
676 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000677 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200678 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000679 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000680
Ezio Melotti63e42302011-05-07 19:47:48 +0300681 def testSendtoErrors(self):
682 # Testing that sendto doens't masks failures. See #10169.
683 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
684 self.addCleanup(s.close)
685 s.bind(('', 0))
686 sockname = s.getsockname()
687 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300688 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300689 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300690 self.assertEqual(str(cm.exception),
691 "'str' does not support the buffer interface")
692 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300693 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300694 self.assertEqual(str(cm.exception),
695 "'complex' does not support the buffer interface")
696 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300697 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300698 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300699 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300700 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300701 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300702 self.assertEqual(str(cm.exception),
703 "'str' does not support the buffer interface")
704 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300705 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300706 self.assertEqual(str(cm.exception),
707 "'complex' does not support the buffer interface")
708 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300709 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300710 self.assertIn('not NoneType', str(cm.exception))
711 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300712 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300713 self.assertIn('an integer is required', str(cm.exception))
714 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300715 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300716 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300717 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300718 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300719 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300720 self.assertIn('(1 given)', str(cm.exception))
721 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300722 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300723 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300724
Guido van Rossum24e4af82002-06-12 19:18:08 +0000725 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000726 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000727 socket.AF_INET
728 socket.SOCK_STREAM
729 socket.SOCK_DGRAM
730 socket.SOCK_RAW
731 socket.SOCK_RDM
732 socket.SOCK_SEQPACKET
733 socket.SOL_SOCKET
734 socket.SO_REUSEADDR
735
Guido van Rossum654c11e2002-06-13 20:24:17 +0000736 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000737 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000738 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000739 try:
740 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200741 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000742 # Probably name lookup wasn't set up right; skip this test
743 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000744 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000745 try:
746 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200747 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000748 # Probably a similar problem as above; skip this test
749 return
Brett Cannon01668a12005-03-11 00:04:17 +0000750 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000751 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000752 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000753 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000754
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000755 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
756 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
757 def test_sethostname(self):
758 oldhn = socket.gethostname()
759 try:
760 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200761 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000762 if e.errno == errno.EPERM:
763 self.skipTest("test should be run as root")
764 else:
765 raise
766 try:
767 # running test as root!
768 self.assertEqual(socket.gethostname(), 'new')
769 # Should work with bytes objects too
770 socket.sethostname(b'bar')
771 self.assertEqual(socket.gethostname(), 'bar')
772 finally:
773 socket.sethostname(oldhn)
774
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700775 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
776 'socket.if_nameindex() not available.')
777 def testInterfaceNameIndex(self):
778 interfaces = socket.if_nameindex()
779 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200780 self.assertIsInstance(index, int)
781 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700782 # interface indices are non-zero integers
783 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200784 _index = socket.if_nametoindex(name)
785 self.assertIsInstance(_index, int)
786 self.assertEqual(index, _index)
787 _name = socket.if_indextoname(index)
788 self.assertIsInstance(_name, str)
789 self.assertEqual(name, _name)
790
791 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
792 'socket.if_nameindex() not available.')
793 def testInvalidInterfaceNameIndex(self):
794 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200795 self.assertRaises(OSError, socket.if_indextoname, 0)
796 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200797 # test with invalid values
798 self.assertRaises(TypeError, socket.if_nametoindex, 0)
799 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700800
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000801 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000802 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000803 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000804 try:
805 # On some versions, this loses a reference
806 orig = sys.getrefcount(__name__)
807 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000808 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000809 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000810 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000811
Guido van Rossum24e4af82002-06-12 19:18:08 +0000812 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000813 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000814 try:
815 # On some versions, this crashes the interpreter.
816 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200817 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000818 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000819
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000820 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000821 # This just checks that htons etc. are their own inverse,
822 # when looking at the lower 16 or 32 bits.
823 sizes = {socket.htonl: 32, socket.ntohl: 32,
824 socket.htons: 16, socket.ntohs: 16}
825 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000826 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000827 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
828 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000829
Guido van Rossuma2627af2002-09-14 00:58:46 +0000830 swapped = func(mask)
831 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000832 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000833
Guido van Rossum018919a2007-01-15 00:07:32 +0000834 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000835 good_values = [ 1, 2, 3, 1, 2, 3 ]
836 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000837 for k in good_values:
838 socket.ntohl(k)
839 socket.ntohs(k)
840 socket.htonl(k)
841 socket.htons(k)
842 for k in bad_values:
843 self.assertRaises(OverflowError, socket.ntohl, k)
844 self.assertRaises(OverflowError, socket.ntohs, k)
845 self.assertRaises(OverflowError, socket.htonl, k)
846 self.assertRaises(OverflowError, socket.htons, k)
847
Barry Warsaw11b91a02004-06-28 00:50:43 +0000848 def testGetServBy(self):
849 eq = self.assertEqual
850 # Find one service that exists, then check all the related interfaces.
851 # I've ordered this by protocols that have both a tcp and udp
852 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200853 if (sys.platform.startswith(('freebsd', 'netbsd'))
854 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000855 # avoid the 'echo' service on this platform, as there is an
856 # assumption breaking non-standard port/protocol entry
857 services = ('daytime', 'qotd', 'domain')
858 else:
859 services = ('echo', 'daytime', 'domain')
860 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000861 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000862 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000863 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200864 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000865 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000866 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200867 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000868 # Try same call with optional protocol omitted
869 port2 = socket.getservbyname(service)
870 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400871 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000872 try:
873 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200874 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000875 udpport = None
876 else:
877 eq(udpport, port)
878 # Now make sure the lookup by port returns the same service name
879 eq(socket.getservbyport(port2), service)
880 eq(socket.getservbyport(port, 'tcp'), service)
881 if udpport is not None:
882 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000883 # Make sure getservbyport does not accept out of range ports.
884 self.assertRaises(OverflowError, socket.getservbyport, -1)
885 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000886
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000887 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000888 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000889 # The default timeout should initially be None
890 self.assertEqual(socket.getdefaulttimeout(), None)
891 s = socket.socket()
892 self.assertEqual(s.gettimeout(), None)
893 s.close()
894
895 # Set the default timeout to 10, and see if it propagates
896 socket.setdefaulttimeout(10)
897 self.assertEqual(socket.getdefaulttimeout(), 10)
898 s = socket.socket()
899 self.assertEqual(s.gettimeout(), 10)
900 s.close()
901
902 # Reset the default timeout to None, and see if it propagates
903 socket.setdefaulttimeout(None)
904 self.assertEqual(socket.getdefaulttimeout(), None)
905 s = socket.socket()
906 self.assertEqual(s.gettimeout(), None)
907 s.close()
908
909 # Check that setting it to an invalid value raises ValueError
910 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
911
912 # Check that setting it to an invalid type raises TypeError
913 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
914
Benjamin Petersonf91df042009-02-13 02:50:59 +0000915 def testIPv4_inet_aton_fourbytes(self):
916 if not hasattr(socket, 'inet_aton'):
917 return # No inet_aton, nothing to check
918 # Test that issue1008086 and issue767150 are fixed.
919 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000920 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
921 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000922
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000923 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000924 if not hasattr(socket, 'inet_pton'):
925 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000926 from socket import inet_aton as f, inet_pton, AF_INET
927 g = lambda a: inet_pton(AF_INET, a)
928
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100929 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200930 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100931 )
932
Ezio Melottib3aedd42010-11-20 19:04:17 +0000933 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
934 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
935 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
936 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
937 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100938 assertInvalid(f, '0.0.0.')
939 assertInvalid(f, '300.0.0.0')
940 assertInvalid(f, 'a.0.0.0')
941 assertInvalid(f, '1.2.3.4.5')
942 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000943
Ezio Melottib3aedd42010-11-20 19:04:17 +0000944 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
945 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
946 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
947 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100948 assertInvalid(g, '0.0.0.')
949 assertInvalid(g, '300.0.0.0')
950 assertInvalid(g, 'a.0.0.0')
951 assertInvalid(g, '1.2.3.4.5')
952 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000953
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000954 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000955 if not hasattr(socket, 'inet_pton'):
956 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000957 try:
958 from socket import inet_pton, AF_INET6, has_ipv6
959 if not has_ipv6:
960 return
961 except ImportError:
962 return
963 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100964 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200965 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100966 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000967
Ezio Melottib3aedd42010-11-20 19:04:17 +0000968 self.assertEqual(b'\x00' * 16, f('::'))
969 self.assertEqual(b'\x00' * 16, f('0::0'))
970 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
971 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000972 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 +0000973 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
974 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100975 self.assertEqual(
976 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
977 f('ad42:abc::127:0:254:2')
978 )
979 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
980 assertInvalid('0x20::')
981 assertInvalid(':::')
982 assertInvalid('::0::')
983 assertInvalid('1::abc::')
984 assertInvalid('1::abc::def')
985 assertInvalid('1:2:3:4:5:6:')
986 assertInvalid('1:2:3:4:5:6')
987 assertInvalid('1:2:3:4:5:6:7:8:')
988 assertInvalid('1:2:3:4:5:6:7:8:0')
989
990 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
991 f('::254.42.23.64')
992 )
993 self.assertEqual(
994 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
995 f('42::a29b:254.42.23.64')
996 )
997 self.assertEqual(
998 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
999 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1000 )
1001 assertInvalid('255.254.253.252')
1002 assertInvalid('1::260.2.3.0')
1003 assertInvalid('1::0.be.e.0')
1004 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1005 assertInvalid('::1.2.3.4:0')
1006 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001007
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001008 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +00001009 if not hasattr(socket, 'inet_ntop'):
1010 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001011 from socket import inet_ntoa as f, inet_ntop, AF_INET
1012 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001013 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001014 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001015 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001016
Ezio Melottib3aedd42010-11-20 19:04:17 +00001017 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1018 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1019 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1020 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001021 assertInvalid(f, b'\x00' * 3)
1022 assertInvalid(f, b'\x00' * 5)
1023 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +00001024
Ezio Melottib3aedd42010-11-20 19:04:17 +00001025 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1026 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1027 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001028 assertInvalid(g, b'\x00' * 3)
1029 assertInvalid(g, b'\x00' * 5)
1030 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001031
1032 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +00001033 if not hasattr(socket, 'inet_ntop'):
1034 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001035 try:
1036 from socket import inet_ntop, AF_INET6, has_ipv6
1037 if not has_ipv6:
1038 return
1039 except ImportError:
1040 return
1041 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001042 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001043 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001044 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001045
Ezio Melottib3aedd42010-11-20 19:04:17 +00001046 self.assertEqual('::', f(b'\x00' * 16))
1047 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1048 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001049 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001050 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 +00001051 )
1052
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001053 assertInvalid(b'\x12' * 15)
1054 assertInvalid(b'\x12' * 17)
1055 assertInvalid(b'\x12' * 4)
1056
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001057 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001058
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001059 def testSockName(self):
1060 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001061 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001062 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001063 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001064 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001065 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001066 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1067 # it reasonable to get the host's addr in addition to 0.0.0.0.
1068 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001069 try:
1070 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001071 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001072 # Probably name lookup wasn't set up right; skip this test
1073 return
Benjamin Peterson577473f2010-01-19 00:09:57 +00001074 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001075 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001076
1077 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001078 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001079 # We know a socket should start without reuse==0
1080 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001081 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001082 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001083 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001084
1085 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001086 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001087 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001088 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001089 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1090 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001091 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001092
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001093 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001094 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001095 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1096 sock.settimeout(1)
1097 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001098 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001099
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001100 def testNewAttributes(self):
1101 # testing .family, .type and .protocol
1102 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1103 self.assertEqual(sock.family, socket.AF_INET)
1104 self.assertEqual(sock.type, socket.SOCK_STREAM)
1105 self.assertEqual(sock.proto, 0)
1106 sock.close()
1107
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001108 def test_getsockaddrarg(self):
1109 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001110 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001111 big_port = port + 65536
1112 neg_port = port - 65536
1113 sock = socket.socket()
1114 try:
1115 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1116 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1117 sock.bind((host, port))
1118 finally:
1119 sock.close()
1120
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001121 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001122 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001123 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1124 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1125 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1126 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001127 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1128 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001129 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001130 self.assertRaises(ValueError, s.ioctl, -1, None)
1131 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001132
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001133 def testGetaddrinfo(self):
1134 try:
1135 socket.getaddrinfo('localhost', 80)
1136 except socket.gaierror as err:
1137 if err.errno == socket.EAI_SERVICE:
1138 # see http://bugs.python.org/issue1282647
1139 self.skipTest("buggy libc version")
1140 raise
1141 # len of every sequence is supposed to be == 5
1142 for info in socket.getaddrinfo(HOST, None):
1143 self.assertEqual(len(info), 5)
1144 # host can be a domain name, a string representation of an
1145 # IPv4/v6 address or None
1146 socket.getaddrinfo('localhost', 80)
1147 socket.getaddrinfo('127.0.0.1', 80)
1148 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001149 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001150 socket.getaddrinfo('::1', 80)
1151 # port can be a string service name such as "http", a numeric
1152 # port number or None
1153 socket.getaddrinfo(HOST, "http")
1154 socket.getaddrinfo(HOST, 80)
1155 socket.getaddrinfo(HOST, None)
1156 # test family and socktype filters
1157 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
1158 for family, _, _, _, _ in infos:
1159 self.assertEqual(family, socket.AF_INET)
1160 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1161 for _, socktype, _, _, _ in infos:
1162 self.assertEqual(socktype, socket.SOCK_STREAM)
1163 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001164 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001165 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1166 # a server willing to support both IPv4 and IPv6 will
1167 # usually do this
1168 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1169 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001170 # test keyword arguments
1171 a = socket.getaddrinfo(HOST, None)
1172 b = socket.getaddrinfo(host=HOST, port=None)
1173 self.assertEqual(a, b)
1174 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1175 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1176 self.assertEqual(a, b)
1177 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1178 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1179 self.assertEqual(a, b)
1180 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1181 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1182 self.assertEqual(a, b)
1183 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1184 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1185 self.assertEqual(a, b)
1186 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1187 socket.AI_PASSIVE)
1188 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1189 type=socket.SOCK_STREAM, proto=0,
1190 flags=socket.AI_PASSIVE)
1191 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001192 # Issue #6697.
1193 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001194
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001195 def test_getnameinfo(self):
1196 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001197 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001198
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001199 @unittest.skipUnless(support.is_resource_enabled('network'),
1200 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001201 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001202 # Check for internet access before running test (issue #12804).
1203 try:
1204 socket.gethostbyname('python.org')
1205 except socket.gaierror as e:
1206 if e.errno == socket.EAI_NODATA:
1207 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001208 # these should all be successful
1209 socket.gethostbyname('испытание.python.org')
1210 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001211 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1212 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1213 # have a reverse entry yet
1214 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001215
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001216 def check_sendall_interrupted(self, with_timeout):
1217 # socketpair() is not stricly required, but it makes things easier.
1218 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1219 self.skipTest("signal.alarm and socket.socketpair required for this test")
1220 # Our signal handlers clobber the C errno by calling a math function
1221 # with an invalid domain value.
1222 def ok_handler(*args):
1223 self.assertRaises(ValueError, math.acosh, 0)
1224 def raising_handler(*args):
1225 self.assertRaises(ValueError, math.acosh, 0)
1226 1 // 0
1227 c, s = socket.socketpair()
1228 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1229 try:
1230 if with_timeout:
1231 # Just above the one second minimum for signal.alarm
1232 c.settimeout(1.5)
1233 with self.assertRaises(ZeroDivisionError):
1234 signal.alarm(1)
1235 c.sendall(b"x" * (1024**2))
1236 if with_timeout:
1237 signal.signal(signal.SIGALRM, ok_handler)
1238 signal.alarm(1)
1239 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1240 finally:
1241 signal.signal(signal.SIGALRM, old_alarm)
1242 c.close()
1243 s.close()
1244
1245 def test_sendall_interrupted(self):
1246 self.check_sendall_interrupted(False)
1247
1248 def test_sendall_interrupted_with_timeout(self):
1249 self.check_sendall_interrupted(True)
1250
Antoine Pitroue033e062010-10-29 10:38:18 +00001251 def test_dealloc_warn(self):
1252 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1253 r = repr(sock)
1254 with self.assertWarns(ResourceWarning) as cm:
1255 sock = None
1256 support.gc_collect()
1257 self.assertIn(r, str(cm.warning.args[0]))
1258 # An open socket file object gets dereferenced after the socket
1259 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1260 f = sock.makefile('rb')
1261 r = repr(sock)
1262 sock = None
1263 support.gc_collect()
1264 with self.assertWarns(ResourceWarning):
1265 f = None
1266 support.gc_collect()
1267
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001268 def test_name_closed_socketio(self):
1269 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1270 fp = sock.makefile("rb")
1271 fp.close()
1272 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1273
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001274 def test_unusable_closed_socketio(self):
1275 with socket.socket() as sock:
1276 fp = sock.makefile("rb", buffering=0)
1277 self.assertTrue(fp.readable())
1278 self.assertFalse(fp.writable())
1279 self.assertFalse(fp.seekable())
1280 fp.close()
1281 self.assertRaises(ValueError, fp.readable)
1282 self.assertRaises(ValueError, fp.writable)
1283 self.assertRaises(ValueError, fp.seekable)
1284
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001285 def test_pickle(self):
1286 sock = socket.socket()
1287 with sock:
1288 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1289 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1290
Serhiy Storchaka78980432013-01-15 01:12:17 +02001291 def test_listen_backlog(self):
1292 for backlog in 0, -1:
1293 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1294 srv.bind((HOST, 0))
1295 srv.listen(backlog)
1296 srv.close()
1297
1298 # Issue 15989
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001299 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1300 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001301 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001302 srv.close()
1303
Charles-François Natali42663332012-01-02 15:57:30 +01001304 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001305 def test_flowinfo(self):
1306 self.assertRaises(OverflowError, socket.getnameinfo,
1307 ('::1',0, 0xffffffff), 0)
1308 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1309 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
1310
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001311
Charles-François Natali47413c12011-10-06 19:47:44 +02001312@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1313class BasicCANTest(unittest.TestCase):
1314
1315 def testCrucialConstants(self):
1316 socket.AF_CAN
1317 socket.PF_CAN
1318 socket.CAN_RAW
1319
Charles-François Natali773e42d2013-02-05 19:42:01 +01001320 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1321 'socket.CAN_BCM required for this test.')
1322 def testBCMConstants(self):
1323 socket.CAN_BCM
1324
1325 # opcodes
1326 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1327 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1328 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1329 socket.CAN_BCM_TX_SEND # send one CAN frame
1330 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1331 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1332 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1333 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1334 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1335 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1336 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1337 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1338
Charles-François Natali47413c12011-10-06 19:47:44 +02001339 def testCreateSocket(self):
1340 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1341 pass
1342
Charles-François Natali773e42d2013-02-05 19:42:01 +01001343 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1344 'socket.CAN_BCM required for this test.')
1345 def testCreateBCMSocket(self):
1346 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1347 pass
1348
Charles-François Natali47413c12011-10-06 19:47:44 +02001349 def testBindAny(self):
1350 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1351 s.bind(('', ))
1352
1353 def testTooLongInterfaceName(self):
1354 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1355 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001356 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001357 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001358
1359 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1360 'socket.CAN_RAW_LOOPBACK required for this test.')
1361 def testLoopback(self):
1362 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1363 for loopback in (0, 1):
1364 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1365 loopback)
1366 self.assertEqual(loopback,
1367 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1368
1369 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1370 'socket.CAN_RAW_FILTER required for this test.')
1371 def testFilter(self):
1372 can_id, can_mask = 0x200, 0x700
1373 can_filter = struct.pack("=II", can_id, can_mask)
1374 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1375 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1376 self.assertEqual(can_filter,
1377 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1378
1379
1380@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001381class CANTest(ThreadedCANSocketTest):
1382
Charles-François Natali47413c12011-10-06 19:47:44 +02001383 def __init__(self, methodName='runTest'):
1384 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1385
1386 @classmethod
1387 def build_can_frame(cls, can_id, data):
1388 """Build a CAN frame."""
1389 can_dlc = len(data)
1390 data = data.ljust(8, b'\x00')
1391 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1392
1393 @classmethod
1394 def dissect_can_frame(cls, frame):
1395 """Dissect a CAN frame."""
1396 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1397 return (can_id, can_dlc, data[:can_dlc])
1398
1399 def testSendFrame(self):
1400 cf, addr = self.s.recvfrom(self.bufsize)
1401 self.assertEqual(self.cf, cf)
1402 self.assertEqual(addr[0], self.interface)
1403 self.assertEqual(addr[1], socket.AF_CAN)
1404
1405 def _testSendFrame(self):
1406 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1407 self.cli.send(self.cf)
1408
1409 def testSendMaxFrame(self):
1410 cf, addr = self.s.recvfrom(self.bufsize)
1411 self.assertEqual(self.cf, cf)
1412
1413 def _testSendMaxFrame(self):
1414 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1415 self.cli.send(self.cf)
1416
1417 def testSendMultiFrames(self):
1418 cf, addr = self.s.recvfrom(self.bufsize)
1419 self.assertEqual(self.cf1, cf)
1420
1421 cf, addr = self.s.recvfrom(self.bufsize)
1422 self.assertEqual(self.cf2, cf)
1423
1424 def _testSendMultiFrames(self):
1425 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1426 self.cli.send(self.cf1)
1427
1428 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1429 self.cli.send(self.cf2)
1430
Charles-François Natali773e42d2013-02-05 19:42:01 +01001431 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1432 'socket.CAN_BCM required for this test.')
1433 def _testBCM(self):
1434 cf, addr = self.cli.recvfrom(self.bufsize)
1435 self.assertEqual(self.cf, cf)
1436 can_id, can_dlc, data = self.dissect_can_frame(cf)
1437 self.assertEqual(self.can_id, can_id)
1438 self.assertEqual(self.data, data)
1439
1440 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1441 'socket.CAN_BCM required for this test.')
1442 def testBCM(self):
1443 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1444 self.addCleanup(bcm.close)
1445 bcm.connect((self.interface,))
1446 self.can_id = 0x123
1447 self.data = bytes([0xc0, 0xff, 0xee])
1448 self.cf = self.build_can_frame(self.can_id, self.data)
1449 opcode = socket.CAN_BCM_TX_SEND
1450 flags = 0
1451 count = 0
1452 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1453 bcm_can_id = 0x0222
1454 nframes = 1
1455 assert len(self.cf) == 16
1456 header = struct.pack(self.bcm_cmd_msg_fmt,
1457 opcode,
1458 flags,
1459 count,
1460 ival1_seconds,
1461 ival1_usec,
1462 ival2_seconds,
1463 ival2_usec,
1464 bcm_can_id,
1465 nframes,
1466 )
1467 header_plus_frame = header + self.cf
1468 bytes_sent = bcm.send(header_plus_frame)
1469 self.assertEqual(bytes_sent, len(header_plus_frame))
1470
Charles-François Natali47413c12011-10-06 19:47:44 +02001471
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001472@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1473class BasicRDSTest(unittest.TestCase):
1474
1475 def testCrucialConstants(self):
1476 socket.AF_RDS
1477 socket.PF_RDS
1478
1479 def testCreateSocket(self):
1480 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1481 pass
1482
1483 def testSocketBufferSize(self):
1484 bufsize = 16384
1485 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1486 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1487 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1488
1489
1490@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1491@unittest.skipUnless(thread, 'Threading required for this test.')
1492class RDSTest(ThreadedRDSSocketTest):
1493
1494 def __init__(self, methodName='runTest'):
1495 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1496
Charles-François Natali240c55f2011-11-10 20:33:36 +01001497 def setUp(self):
1498 super().setUp()
1499 self.evt = threading.Event()
1500
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001501 def testSendAndRecv(self):
1502 data, addr = self.serv.recvfrom(self.bufsize)
1503 self.assertEqual(self.data, data)
1504 self.assertEqual(self.cli_addr, addr)
1505
1506 def _testSendAndRecv(self):
1507 self.data = b'spam'
1508 self.cli.sendto(self.data, 0, (HOST, self.port))
1509
1510 def testPeek(self):
1511 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1512 self.assertEqual(self.data, data)
1513 data, addr = self.serv.recvfrom(self.bufsize)
1514 self.assertEqual(self.data, data)
1515
1516 def _testPeek(self):
1517 self.data = b'spam'
1518 self.cli.sendto(self.data, 0, (HOST, self.port))
1519
1520 @requireAttrs(socket.socket, 'recvmsg')
1521 def testSendAndRecvMsg(self):
1522 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1523 self.assertEqual(self.data, data)
1524
1525 @requireAttrs(socket.socket, 'sendmsg')
1526 def _testSendAndRecvMsg(self):
1527 self.data = b'hello ' * 10
1528 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1529
1530 def testSendAndRecvMulti(self):
1531 data, addr = self.serv.recvfrom(self.bufsize)
1532 self.assertEqual(self.data1, data)
1533
1534 data, addr = self.serv.recvfrom(self.bufsize)
1535 self.assertEqual(self.data2, data)
1536
1537 def _testSendAndRecvMulti(self):
1538 self.data1 = b'bacon'
1539 self.cli.sendto(self.data1, 0, (HOST, self.port))
1540
1541 self.data2 = b'egg'
1542 self.cli.sendto(self.data2, 0, (HOST, self.port))
1543
1544 def testSelect(self):
1545 r, w, x = select.select([self.serv], [], [], 3.0)
1546 self.assertIn(self.serv, r)
1547 data, addr = self.serv.recvfrom(self.bufsize)
1548 self.assertEqual(self.data, data)
1549
1550 def _testSelect(self):
1551 self.data = b'select'
1552 self.cli.sendto(self.data, 0, (HOST, self.port))
1553
1554 def testCongestion(self):
1555 # wait until the sender is done
1556 self.evt.wait()
1557
1558 def _testCongestion(self):
1559 # test the behavior in case of congestion
1560 self.data = b'fill'
1561 self.cli.setblocking(False)
1562 try:
1563 # try to lower the receiver's socket buffer size
1564 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1565 except OSError:
1566 pass
1567 with self.assertRaises(OSError) as cm:
1568 try:
1569 # fill the receiver's socket buffer
1570 while True:
1571 self.cli.sendto(self.data, 0, (HOST, self.port))
1572 finally:
1573 # signal the receiver we're done
1574 self.evt.set()
1575 # sendto() should have failed with ENOBUFS
1576 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1577 # and we should have received a congestion notification through poll
1578 r, w, x = select.select([self.serv], [], [], 3.0)
1579 self.assertIn(self.serv, r)
1580
1581
Victor Stinner45df8202010-04-28 22:31:17 +00001582@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001583class BasicTCPTest(SocketConnectedTest):
1584
1585 def __init__(self, methodName='runTest'):
1586 SocketConnectedTest.__init__(self, methodName=methodName)
1587
1588 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001589 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001590 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001591 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001592
1593 def _testRecv(self):
1594 self.serv_conn.send(MSG)
1595
1596 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001597 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001598 seg1 = self.cli_conn.recv(len(MSG) - 3)
1599 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001600 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001601 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001602
1603 def _testOverFlowRecv(self):
1604 self.serv_conn.send(MSG)
1605
1606 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001607 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001608 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001609 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001610
1611 def _testRecvFrom(self):
1612 self.serv_conn.send(MSG)
1613
1614 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001615 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001616 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1617 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001618 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001619 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001620
1621 def _testOverFlowRecvFrom(self):
1622 self.serv_conn.send(MSG)
1623
1624 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001625 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001626 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001627 while 1:
1628 read = self.cli_conn.recv(1024)
1629 if not read:
1630 break
Guido van Rossume531e292002-08-08 20:28:34 +00001631 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001632 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001633
1634 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001635 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001636 self.serv_conn.sendall(big_chunk)
1637
1638 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001639 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001640 fd = self.cli_conn.fileno()
1641 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001642 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001643 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001644 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001645 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001646
1647 def _testFromFd(self):
1648 self.serv_conn.send(MSG)
1649
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001650 def testDup(self):
1651 # Testing dup()
1652 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001653 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001654 msg = sock.recv(1024)
1655 self.assertEqual(msg, MSG)
1656
1657 def _testDup(self):
1658 self.serv_conn.send(MSG)
1659
Guido van Rossum24e4af82002-06-12 19:18:08 +00001660 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001661 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001662 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001663 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001664 # wait for _testShutdown to finish: on OS X, when the server
1665 # closes the connection the client also becomes disconnected,
1666 # and the client's shutdown call will fail. (Issue #4397.)
1667 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001668
1669 def _testShutdown(self):
1670 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001671 # Issue 15989
1672 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1673 _testcapi.INT_MAX + 1)
1674 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1675 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001676 self.serv_conn.shutdown(2)
1677
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001678 def testDetach(self):
1679 # Testing detach()
1680 fileno = self.cli_conn.fileno()
1681 f = self.cli_conn.detach()
1682 self.assertEqual(f, fileno)
1683 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001684 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001685 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001686 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001687 # ...but we can create another socket using the (still open)
1688 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001689 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001690 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001691 msg = sock.recv(1024)
1692 self.assertEqual(msg, MSG)
1693
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001694 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001695 self.serv_conn.send(MSG)
1696
Victor Stinner45df8202010-04-28 22:31:17 +00001697@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001698class BasicUDPTest(ThreadedUDPSocketTest):
1699
1700 def __init__(self, methodName='runTest'):
1701 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1702
1703 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001704 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001705 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001706 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001707
1708 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001709 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001710
Guido van Rossum1c938012002-06-12 21:17:20 +00001711 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001712 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001713 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001714 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001715
Guido van Rossum1c938012002-06-12 21:17:20 +00001716 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001717 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001718
Guido van Rossumd8faa362007-04-27 19:54:29 +00001719 def testRecvFromNegative(self):
1720 # Negative lengths passed to recvfrom should give ValueError.
1721 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1722
1723 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001724 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001725
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001726# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1727# same test code is used with different families and types of socket
1728# (e.g. stream, datagram), and tests using recvmsg() are repeated
1729# using recvmsg_into().
1730#
1731# The generic test classes such as SendmsgTests and
1732# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1733# supplied with sockets cli_sock and serv_sock representing the
1734# client's and the server's end of the connection respectively, and
1735# attributes cli_addr and serv_addr holding their (numeric where
1736# appropriate) addresses.
1737#
1738# The final concrete test classes combine these with subclasses of
1739# SocketTestBase which set up client and server sockets of a specific
1740# type, and with subclasses of SendrecvmsgBase such as
1741# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1742# sockets to cli_sock and serv_sock and override the methods and
1743# attributes of SendrecvmsgBase to fill in destination addresses if
1744# needed when sending, check for specific flags in msg_flags, etc.
1745#
1746# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1747# recvmsg_into().
1748
1749# XXX: like the other datagram (UDP) tests in this module, the code
1750# here assumes that datagram delivery on the local machine will be
1751# reliable.
1752
1753class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1754 # Base class for sendmsg()/recvmsg() tests.
1755
1756 # Time in seconds to wait before considering a test failed, or
1757 # None for no timeout. Not all tests actually set a timeout.
1758 fail_timeout = 3.0
1759
1760 def setUp(self):
1761 self.misc_event = threading.Event()
1762 super().setUp()
1763
1764 def sendToServer(self, msg):
1765 # Send msg to the server.
1766 return self.cli_sock.send(msg)
1767
1768 # Tuple of alternative default arguments for sendmsg() when called
1769 # via sendmsgToServer() (e.g. to include a destination address).
1770 sendmsg_to_server_defaults = ()
1771
1772 def sendmsgToServer(self, *args):
1773 # Call sendmsg() on self.cli_sock with the given arguments,
1774 # filling in any arguments which are not supplied with the
1775 # corresponding items of self.sendmsg_to_server_defaults, if
1776 # any.
1777 return self.cli_sock.sendmsg(
1778 *(args + self.sendmsg_to_server_defaults[len(args):]))
1779
1780 def doRecvmsg(self, sock, bufsize, *args):
1781 # Call recvmsg() on sock with given arguments and return its
1782 # result. Should be used for tests which can use either
1783 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1784 # this method with one which emulates it using recvmsg_into(),
1785 # thus allowing the same test to be used for both methods.
1786 result = sock.recvmsg(bufsize, *args)
1787 self.registerRecvmsgResult(result)
1788 return result
1789
1790 def registerRecvmsgResult(self, result):
1791 # Called by doRecvmsg() with the return value of recvmsg() or
1792 # recvmsg_into(). Can be overridden to arrange cleanup based
1793 # on the returned ancillary data, for instance.
1794 pass
1795
1796 def checkRecvmsgAddress(self, addr1, addr2):
1797 # Called to compare the received address with the address of
1798 # the peer.
1799 self.assertEqual(addr1, addr2)
1800
1801 # Flags that are normally unset in msg_flags
1802 msg_flags_common_unset = 0
1803 for name in ("MSG_CTRUNC", "MSG_OOB"):
1804 msg_flags_common_unset |= getattr(socket, name, 0)
1805
1806 # Flags that are normally set
1807 msg_flags_common_set = 0
1808
1809 # Flags set when a complete record has been received (e.g. MSG_EOR
1810 # for SCTP)
1811 msg_flags_eor_indicator = 0
1812
1813 # Flags set when a complete record has not been received
1814 # (e.g. MSG_TRUNC for datagram sockets)
1815 msg_flags_non_eor_indicator = 0
1816
1817 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1818 # Method to check the value of msg_flags returned by recvmsg[_into]().
1819 #
1820 # Checks that all bits in msg_flags_common_set attribute are
1821 # set in "flags" and all bits in msg_flags_common_unset are
1822 # unset.
1823 #
1824 # The "eor" argument specifies whether the flags should
1825 # indicate that a full record (or datagram) has been received.
1826 # If "eor" is None, no checks are done; otherwise, checks
1827 # that:
1828 #
1829 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1830 # set and all bits in msg_flags_non_eor_indicator are unset
1831 #
1832 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1833 # are set and all bits in msg_flags_eor_indicator are unset
1834 #
1835 # If "checkset" and/or "checkunset" are supplied, they require
1836 # the given bits to be set or unset respectively, overriding
1837 # what the attributes require for those bits.
1838 #
1839 # If any bits are set in "ignore", they will not be checked,
1840 # regardless of the other inputs.
1841 #
1842 # Will raise Exception if the inputs require a bit to be both
1843 # set and unset, and it is not ignored.
1844
1845 defaultset = self.msg_flags_common_set
1846 defaultunset = self.msg_flags_common_unset
1847
1848 if eor:
1849 defaultset |= self.msg_flags_eor_indicator
1850 defaultunset |= self.msg_flags_non_eor_indicator
1851 elif eor is not None:
1852 defaultset |= self.msg_flags_non_eor_indicator
1853 defaultunset |= self.msg_flags_eor_indicator
1854
1855 # Function arguments override defaults
1856 defaultset &= ~checkunset
1857 defaultunset &= ~checkset
1858
1859 # Merge arguments with remaining defaults, and check for conflicts
1860 checkset |= defaultset
1861 checkunset |= defaultunset
1862 inboth = checkset & checkunset & ~ignore
1863 if inboth:
1864 raise Exception("contradictory set, unset requirements for flags "
1865 "{0:#x}".format(inboth))
1866
1867 # Compare with given msg_flags value
1868 mask = (checkset | checkunset) & ~ignore
1869 self.assertEqual(flags & mask, checkset & mask)
1870
1871
1872class RecvmsgIntoMixin(SendrecvmsgBase):
1873 # Mixin to implement doRecvmsg() using recvmsg_into().
1874
1875 def doRecvmsg(self, sock, bufsize, *args):
1876 buf = bytearray(bufsize)
1877 result = sock.recvmsg_into([buf], *args)
1878 self.registerRecvmsgResult(result)
1879 self.assertGreaterEqual(result[0], 0)
1880 self.assertLessEqual(result[0], bufsize)
1881 return (bytes(buf[:result[0]]),) + result[1:]
1882
1883
1884class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1885 # Defines flags to be checked in msg_flags for datagram sockets.
1886
1887 @property
1888 def msg_flags_non_eor_indicator(self):
1889 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1890
1891
1892class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1893 # Defines flags to be checked in msg_flags for SCTP sockets.
1894
1895 @property
1896 def msg_flags_eor_indicator(self):
1897 return super().msg_flags_eor_indicator | socket.MSG_EOR
1898
1899
1900class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1901 # Base class for tests on connectionless-mode sockets. Users must
1902 # supply sockets on attributes cli and serv to be mapped to
1903 # cli_sock and serv_sock respectively.
1904
1905 @property
1906 def serv_sock(self):
1907 return self.serv
1908
1909 @property
1910 def cli_sock(self):
1911 return self.cli
1912
1913 @property
1914 def sendmsg_to_server_defaults(self):
1915 return ([], [], 0, self.serv_addr)
1916
1917 def sendToServer(self, msg):
1918 return self.cli_sock.sendto(msg, self.serv_addr)
1919
1920
1921class SendrecvmsgConnectedBase(SendrecvmsgBase):
1922 # Base class for tests on connected sockets. Users must supply
1923 # sockets on attributes serv_conn and cli_conn (representing the
1924 # connections *to* the server and the client), to be mapped to
1925 # cli_sock and serv_sock respectively.
1926
1927 @property
1928 def serv_sock(self):
1929 return self.cli_conn
1930
1931 @property
1932 def cli_sock(self):
1933 return self.serv_conn
1934
1935 def checkRecvmsgAddress(self, addr1, addr2):
1936 # Address is currently "unspecified" for a connected socket,
1937 # so we don't examine it
1938 pass
1939
1940
1941class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1942 # Base class to set a timeout on server's socket.
1943
1944 def setUp(self):
1945 super().setUp()
1946 self.serv_sock.settimeout(self.fail_timeout)
1947
1948
1949class SendmsgTests(SendrecvmsgServerTimeoutBase):
1950 # Tests for sendmsg() which can use any socket type and do not
1951 # involve recvmsg() or recvmsg_into().
1952
1953 def testSendmsg(self):
1954 # Send a simple message with sendmsg().
1955 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1956
1957 def _testSendmsg(self):
1958 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1959
1960 def testSendmsgDataGenerator(self):
1961 # Send from buffer obtained from a generator (not a sequence).
1962 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1963
1964 def _testSendmsgDataGenerator(self):
1965 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1966 len(MSG))
1967
1968 def testSendmsgAncillaryGenerator(self):
1969 # Gather (empty) ancillary data from a generator.
1970 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1971
1972 def _testSendmsgAncillaryGenerator(self):
1973 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1974 len(MSG))
1975
1976 def testSendmsgArray(self):
1977 # Send data from an array instead of the usual bytes object.
1978 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1979
1980 def _testSendmsgArray(self):
1981 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1982 len(MSG))
1983
1984 def testSendmsgGather(self):
1985 # Send message data from more than one buffer (gather write).
1986 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1987
1988 def _testSendmsgGather(self):
1989 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1990
1991 def testSendmsgBadArgs(self):
1992 # Check that sendmsg() rejects invalid arguments.
1993 self.assertEqual(self.serv_sock.recv(1000), b"done")
1994
1995 def _testSendmsgBadArgs(self):
1996 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1997 self.assertRaises(TypeError, self.sendmsgToServer,
1998 b"not in an iterable")
1999 self.assertRaises(TypeError, self.sendmsgToServer,
2000 object())
2001 self.assertRaises(TypeError, self.sendmsgToServer,
2002 [object()])
2003 self.assertRaises(TypeError, self.sendmsgToServer,
2004 [MSG, object()])
2005 self.assertRaises(TypeError, self.sendmsgToServer,
2006 [MSG], object())
2007 self.assertRaises(TypeError, self.sendmsgToServer,
2008 [MSG], [], object())
2009 self.assertRaises(TypeError, self.sendmsgToServer,
2010 [MSG], [], 0, object())
2011 self.sendToServer(b"done")
2012
2013 def testSendmsgBadCmsg(self):
2014 # Check that invalid ancillary data items are rejected.
2015 self.assertEqual(self.serv_sock.recv(1000), b"done")
2016
2017 def _testSendmsgBadCmsg(self):
2018 self.assertRaises(TypeError, self.sendmsgToServer,
2019 [MSG], [object()])
2020 self.assertRaises(TypeError, self.sendmsgToServer,
2021 [MSG], [(object(), 0, b"data")])
2022 self.assertRaises(TypeError, self.sendmsgToServer,
2023 [MSG], [(0, object(), b"data")])
2024 self.assertRaises(TypeError, self.sendmsgToServer,
2025 [MSG], [(0, 0, object())])
2026 self.assertRaises(TypeError, self.sendmsgToServer,
2027 [MSG], [(0, 0)])
2028 self.assertRaises(TypeError, self.sendmsgToServer,
2029 [MSG], [(0, 0, b"data", 42)])
2030 self.sendToServer(b"done")
2031
2032 @requireAttrs(socket, "CMSG_SPACE")
2033 def testSendmsgBadMultiCmsg(self):
2034 # Check that invalid ancillary data items are rejected when
2035 # more than one item is present.
2036 self.assertEqual(self.serv_sock.recv(1000), b"done")
2037
2038 @testSendmsgBadMultiCmsg.client_skip
2039 def _testSendmsgBadMultiCmsg(self):
2040 self.assertRaises(TypeError, self.sendmsgToServer,
2041 [MSG], [0, 0, b""])
2042 self.assertRaises(TypeError, self.sendmsgToServer,
2043 [MSG], [(0, 0, b""), object()])
2044 self.sendToServer(b"done")
2045
2046 def testSendmsgExcessCmsgReject(self):
2047 # Check that sendmsg() rejects excess ancillary data items
2048 # when the number that can be sent is limited.
2049 self.assertEqual(self.serv_sock.recv(1000), b"done")
2050
2051 def _testSendmsgExcessCmsgReject(self):
2052 if not hasattr(socket, "CMSG_SPACE"):
2053 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002054 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002055 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2056 self.assertIsNone(cm.exception.errno)
2057 self.sendToServer(b"done")
2058
2059 def testSendmsgAfterClose(self):
2060 # Check that sendmsg() fails on a closed socket.
2061 pass
2062
2063 def _testSendmsgAfterClose(self):
2064 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002065 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002066
2067
2068class SendmsgStreamTests(SendmsgTests):
2069 # Tests for sendmsg() which require a stream socket and do not
2070 # involve recvmsg() or recvmsg_into().
2071
2072 def testSendmsgExplicitNoneAddr(self):
2073 # Check that peer address can be specified as None.
2074 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2075
2076 def _testSendmsgExplicitNoneAddr(self):
2077 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2078
2079 def testSendmsgTimeout(self):
2080 # Check that timeout works with sendmsg().
2081 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2082 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2083
2084 def _testSendmsgTimeout(self):
2085 try:
2086 self.cli_sock.settimeout(0.03)
2087 with self.assertRaises(socket.timeout):
2088 while True:
2089 self.sendmsgToServer([b"a"*512])
2090 finally:
2091 self.misc_event.set()
2092
2093 # XXX: would be nice to have more tests for sendmsg flags argument.
2094
2095 # Linux supports MSG_DONTWAIT when sending, but in general, it
2096 # only works when receiving. Could add other platforms if they
2097 # support it too.
2098 @skipWithClientIf(sys.platform not in {"linux2"},
2099 "MSG_DONTWAIT not known to work on this platform when "
2100 "sending")
2101 def testSendmsgDontWait(self):
2102 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2103 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2104 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2105
2106 @testSendmsgDontWait.client_skip
2107 def _testSendmsgDontWait(self):
2108 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002109 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002110 while True:
2111 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2112 self.assertIn(cm.exception.errno,
2113 (errno.EAGAIN, errno.EWOULDBLOCK))
2114 finally:
2115 self.misc_event.set()
2116
2117
2118class SendmsgConnectionlessTests(SendmsgTests):
2119 # Tests for sendmsg() which require a connectionless-mode
2120 # (e.g. datagram) socket, and do not involve recvmsg() or
2121 # recvmsg_into().
2122
2123 def testSendmsgNoDestAddr(self):
2124 # Check that sendmsg() fails when no destination address is
2125 # given for unconnected socket.
2126 pass
2127
2128 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002129 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002130 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002131 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002132 [MSG], [], 0, None)
2133
2134
2135class RecvmsgGenericTests(SendrecvmsgBase):
2136 # Tests for recvmsg() which can also be emulated using
2137 # recvmsg_into(), and can use any socket type.
2138
2139 def testRecvmsg(self):
2140 # Receive a simple message with recvmsg[_into]().
2141 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2142 self.assertEqual(msg, MSG)
2143 self.checkRecvmsgAddress(addr, self.cli_addr)
2144 self.assertEqual(ancdata, [])
2145 self.checkFlags(flags, eor=True)
2146
2147 def _testRecvmsg(self):
2148 self.sendToServer(MSG)
2149
2150 def testRecvmsgExplicitDefaults(self):
2151 # Test recvmsg[_into]() with default arguments provided explicitly.
2152 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2153 len(MSG), 0, 0)
2154 self.assertEqual(msg, MSG)
2155 self.checkRecvmsgAddress(addr, self.cli_addr)
2156 self.assertEqual(ancdata, [])
2157 self.checkFlags(flags, eor=True)
2158
2159 def _testRecvmsgExplicitDefaults(self):
2160 self.sendToServer(MSG)
2161
2162 def testRecvmsgShorter(self):
2163 # Receive a message smaller than buffer.
2164 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2165 len(MSG) + 42)
2166 self.assertEqual(msg, MSG)
2167 self.checkRecvmsgAddress(addr, self.cli_addr)
2168 self.assertEqual(ancdata, [])
2169 self.checkFlags(flags, eor=True)
2170
2171 def _testRecvmsgShorter(self):
2172 self.sendToServer(MSG)
2173
Charles-François Natali8619cd72011-10-03 19:43:15 +02002174 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2175 # datagram is received (issue #13001).
2176 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002177 def testRecvmsgTrunc(self):
2178 # Receive part of message, check for truncation indicators.
2179 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2180 len(MSG) - 3)
2181 self.assertEqual(msg, MSG[:-3])
2182 self.checkRecvmsgAddress(addr, self.cli_addr)
2183 self.assertEqual(ancdata, [])
2184 self.checkFlags(flags, eor=False)
2185
Charles-François Natali8619cd72011-10-03 19:43:15 +02002186 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002187 def _testRecvmsgTrunc(self):
2188 self.sendToServer(MSG)
2189
2190 def testRecvmsgShortAncillaryBuf(self):
2191 # Test ancillary data buffer too small to hold any ancillary data.
2192 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2193 len(MSG), 1)
2194 self.assertEqual(msg, MSG)
2195 self.checkRecvmsgAddress(addr, self.cli_addr)
2196 self.assertEqual(ancdata, [])
2197 self.checkFlags(flags, eor=True)
2198
2199 def _testRecvmsgShortAncillaryBuf(self):
2200 self.sendToServer(MSG)
2201
2202 def testRecvmsgLongAncillaryBuf(self):
2203 # Test large ancillary data buffer.
2204 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2205 len(MSG), 10240)
2206 self.assertEqual(msg, MSG)
2207 self.checkRecvmsgAddress(addr, self.cli_addr)
2208 self.assertEqual(ancdata, [])
2209 self.checkFlags(flags, eor=True)
2210
2211 def _testRecvmsgLongAncillaryBuf(self):
2212 self.sendToServer(MSG)
2213
2214 def testRecvmsgAfterClose(self):
2215 # Check that recvmsg[_into]() fails on a closed socket.
2216 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002217 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002218
2219 def _testRecvmsgAfterClose(self):
2220 pass
2221
2222 def testRecvmsgTimeout(self):
2223 # Check that timeout works.
2224 try:
2225 self.serv_sock.settimeout(0.03)
2226 self.assertRaises(socket.timeout,
2227 self.doRecvmsg, self.serv_sock, len(MSG))
2228 finally:
2229 self.misc_event.set()
2230
2231 def _testRecvmsgTimeout(self):
2232 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2233
2234 @requireAttrs(socket, "MSG_PEEK")
2235 def testRecvmsgPeek(self):
2236 # Check that MSG_PEEK in flags enables examination of pending
2237 # data without consuming it.
2238
2239 # Receive part of data with MSG_PEEK.
2240 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2241 len(MSG) - 3, 0,
2242 socket.MSG_PEEK)
2243 self.assertEqual(msg, MSG[:-3])
2244 self.checkRecvmsgAddress(addr, self.cli_addr)
2245 self.assertEqual(ancdata, [])
2246 # Ignoring MSG_TRUNC here (so this test is the same for stream
2247 # and datagram sockets). Some wording in POSIX seems to
2248 # suggest that it needn't be set when peeking, but that may
2249 # just be a slip.
2250 self.checkFlags(flags, eor=False,
2251 ignore=getattr(socket, "MSG_TRUNC", 0))
2252
2253 # Receive all data with MSG_PEEK.
2254 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2255 len(MSG), 0,
2256 socket.MSG_PEEK)
2257 self.assertEqual(msg, MSG)
2258 self.checkRecvmsgAddress(addr, self.cli_addr)
2259 self.assertEqual(ancdata, [])
2260 self.checkFlags(flags, eor=True)
2261
2262 # Check that the same data can still be received normally.
2263 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2264 self.assertEqual(msg, MSG)
2265 self.checkRecvmsgAddress(addr, self.cli_addr)
2266 self.assertEqual(ancdata, [])
2267 self.checkFlags(flags, eor=True)
2268
2269 @testRecvmsgPeek.client_skip
2270 def _testRecvmsgPeek(self):
2271 self.sendToServer(MSG)
2272
2273 @requireAttrs(socket.socket, "sendmsg")
2274 def testRecvmsgFromSendmsg(self):
2275 # Test receiving with recvmsg[_into]() when message is sent
2276 # using sendmsg().
2277 self.serv_sock.settimeout(self.fail_timeout)
2278 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2279 self.assertEqual(msg, MSG)
2280 self.checkRecvmsgAddress(addr, self.cli_addr)
2281 self.assertEqual(ancdata, [])
2282 self.checkFlags(flags, eor=True)
2283
2284 @testRecvmsgFromSendmsg.client_skip
2285 def _testRecvmsgFromSendmsg(self):
2286 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2287
2288
2289class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2290 # Tests which require a stream socket and can use either recvmsg()
2291 # or recvmsg_into().
2292
2293 def testRecvmsgEOF(self):
2294 # Receive end-of-stream indicator (b"", peer socket closed).
2295 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2296 self.assertEqual(msg, b"")
2297 self.checkRecvmsgAddress(addr, self.cli_addr)
2298 self.assertEqual(ancdata, [])
2299 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2300
2301 def _testRecvmsgEOF(self):
2302 self.cli_sock.close()
2303
2304 def testRecvmsgOverflow(self):
2305 # Receive a message in more than one chunk.
2306 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2307 len(MSG) - 3)
2308 self.checkRecvmsgAddress(addr, self.cli_addr)
2309 self.assertEqual(ancdata, [])
2310 self.checkFlags(flags, eor=False)
2311
2312 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2313 self.checkRecvmsgAddress(addr, self.cli_addr)
2314 self.assertEqual(ancdata, [])
2315 self.checkFlags(flags, eor=True)
2316
2317 msg = seg1 + seg2
2318 self.assertEqual(msg, MSG)
2319
2320 def _testRecvmsgOverflow(self):
2321 self.sendToServer(MSG)
2322
2323
2324class RecvmsgTests(RecvmsgGenericTests):
2325 # Tests for recvmsg() which can use any socket type.
2326
2327 def testRecvmsgBadArgs(self):
2328 # Check that recvmsg() rejects invalid arguments.
2329 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2330 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2331 -1, 0, 0)
2332 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2333 len(MSG), -1, 0)
2334 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2335 [bytearray(10)], 0, 0)
2336 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2337 object(), 0, 0)
2338 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2339 len(MSG), object(), 0)
2340 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2341 len(MSG), 0, object())
2342
2343 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2344 self.assertEqual(msg, MSG)
2345 self.checkRecvmsgAddress(addr, self.cli_addr)
2346 self.assertEqual(ancdata, [])
2347 self.checkFlags(flags, eor=True)
2348
2349 def _testRecvmsgBadArgs(self):
2350 self.sendToServer(MSG)
2351
2352
2353class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2354 # Tests for recvmsg_into() which can use any socket type.
2355
2356 def testRecvmsgIntoBadArgs(self):
2357 # Check that recvmsg_into() rejects invalid arguments.
2358 buf = bytearray(len(MSG))
2359 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2360 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2361 len(MSG), 0, 0)
2362 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2363 buf, 0, 0)
2364 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2365 [object()], 0, 0)
2366 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2367 [b"I'm not writable"], 0, 0)
2368 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2369 [buf, object()], 0, 0)
2370 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2371 [buf], -1, 0)
2372 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2373 [buf], object(), 0)
2374 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2375 [buf], 0, object())
2376
2377 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2378 self.assertEqual(nbytes, len(MSG))
2379 self.assertEqual(buf, bytearray(MSG))
2380 self.checkRecvmsgAddress(addr, self.cli_addr)
2381 self.assertEqual(ancdata, [])
2382 self.checkFlags(flags, eor=True)
2383
2384 def _testRecvmsgIntoBadArgs(self):
2385 self.sendToServer(MSG)
2386
2387 def testRecvmsgIntoGenerator(self):
2388 # Receive into buffer obtained from a generator (not a sequence).
2389 buf = bytearray(len(MSG))
2390 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2391 (o for o in [buf]))
2392 self.assertEqual(nbytes, len(MSG))
2393 self.assertEqual(buf, bytearray(MSG))
2394 self.checkRecvmsgAddress(addr, self.cli_addr)
2395 self.assertEqual(ancdata, [])
2396 self.checkFlags(flags, eor=True)
2397
2398 def _testRecvmsgIntoGenerator(self):
2399 self.sendToServer(MSG)
2400
2401 def testRecvmsgIntoArray(self):
2402 # Receive into an array rather than the usual bytearray.
2403 buf = array.array("B", [0] * len(MSG))
2404 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2405 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002406 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002407 self.checkRecvmsgAddress(addr, self.cli_addr)
2408 self.assertEqual(ancdata, [])
2409 self.checkFlags(flags, eor=True)
2410
2411 def _testRecvmsgIntoArray(self):
2412 self.sendToServer(MSG)
2413
2414 def testRecvmsgIntoScatter(self):
2415 # Receive into multiple buffers (scatter write).
2416 b1 = bytearray(b"----")
2417 b2 = bytearray(b"0123456789")
2418 b3 = bytearray(b"--------------")
2419 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2420 [b1, memoryview(b2)[2:9], b3])
2421 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2422 self.assertEqual(b1, bytearray(b"Mary"))
2423 self.assertEqual(b2, bytearray(b"01 had a 9"))
2424 self.assertEqual(b3, bytearray(b"little lamb---"))
2425 self.checkRecvmsgAddress(addr, self.cli_addr)
2426 self.assertEqual(ancdata, [])
2427 self.checkFlags(flags, eor=True)
2428
2429 def _testRecvmsgIntoScatter(self):
2430 self.sendToServer(b"Mary had a little lamb")
2431
2432
2433class CmsgMacroTests(unittest.TestCase):
2434 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2435 # assumptions used by sendmsg() and recvmsg[_into](), which share
2436 # code with these functions.
2437
2438 # Match the definition in socketmodule.c
2439 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2440
2441 @requireAttrs(socket, "CMSG_LEN")
2442 def testCMSG_LEN(self):
2443 # Test CMSG_LEN() with various valid and invalid values,
2444 # checking the assumptions used by recvmsg() and sendmsg().
2445 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2446 values = list(range(257)) + list(range(toobig - 257, toobig))
2447
2448 # struct cmsghdr has at least three members, two of which are ints
2449 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2450 for n in values:
2451 ret = socket.CMSG_LEN(n)
2452 # This is how recvmsg() calculates the data size
2453 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2454 self.assertLessEqual(ret, self.socklen_t_limit)
2455
2456 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2457 # sendmsg() shares code with these functions, and requires
2458 # that it reject values over the limit.
2459 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2460 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2461
2462 @requireAttrs(socket, "CMSG_SPACE")
2463 def testCMSG_SPACE(self):
2464 # Test CMSG_SPACE() with various valid and invalid values,
2465 # checking the assumptions used by sendmsg().
2466 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2467 values = list(range(257)) + list(range(toobig - 257, toobig))
2468
2469 last = socket.CMSG_SPACE(0)
2470 # struct cmsghdr has at least three members, two of which are ints
2471 self.assertGreater(last, array.array("i").itemsize * 2)
2472 for n in values:
2473 ret = socket.CMSG_SPACE(n)
2474 self.assertGreaterEqual(ret, last)
2475 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2476 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2477 self.assertLessEqual(ret, self.socklen_t_limit)
2478 last = ret
2479
2480 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2481 # sendmsg() shares code with these functions, and requires
2482 # that it reject values over the limit.
2483 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2484 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2485
2486
2487class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2488 # Tests for file descriptor passing on Unix-domain sockets.
2489
2490 # Invalid file descriptor value that's unlikely to evaluate to a
2491 # real FD even if one of its bytes is replaced with a different
2492 # value (which shouldn't actually happen).
2493 badfd = -0x5555
2494
2495 def newFDs(self, n):
2496 # Return a list of n file descriptors for newly-created files
2497 # containing their list indices as ASCII numbers.
2498 fds = []
2499 for i in range(n):
2500 fd, path = tempfile.mkstemp()
2501 self.addCleanup(os.unlink, path)
2502 self.addCleanup(os.close, fd)
2503 os.write(fd, str(i).encode())
2504 fds.append(fd)
2505 return fds
2506
2507 def checkFDs(self, fds):
2508 # Check that the file descriptors in the given list contain
2509 # their correct list indices as ASCII numbers.
2510 for n, fd in enumerate(fds):
2511 os.lseek(fd, 0, os.SEEK_SET)
2512 self.assertEqual(os.read(fd, 1024), str(n).encode())
2513
2514 def registerRecvmsgResult(self, result):
2515 self.addCleanup(self.closeRecvmsgFDs, result)
2516
2517 def closeRecvmsgFDs(self, recvmsg_result):
2518 # Close all file descriptors specified in the ancillary data
2519 # of the given return value from recvmsg() or recvmsg_into().
2520 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2521 if (cmsg_level == socket.SOL_SOCKET and
2522 cmsg_type == socket.SCM_RIGHTS):
2523 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002524 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002525 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2526 for fd in fds:
2527 os.close(fd)
2528
2529 def createAndSendFDs(self, n):
2530 # Send n new file descriptors created by newFDs() to the
2531 # server, with the constant MSG as the non-ancillary data.
2532 self.assertEqual(
2533 self.sendmsgToServer([MSG],
2534 [(socket.SOL_SOCKET,
2535 socket.SCM_RIGHTS,
2536 array.array("i", self.newFDs(n)))]),
2537 len(MSG))
2538
2539 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2540 # Check that constant MSG was received with numfds file
2541 # descriptors in a maximum of maxcmsgs control messages (which
2542 # must contain only complete integers). By default, check
2543 # that MSG_CTRUNC is unset, but ignore any flags in
2544 # ignoreflags.
2545 msg, ancdata, flags, addr = result
2546 self.assertEqual(msg, MSG)
2547 self.checkRecvmsgAddress(addr, self.cli_addr)
2548 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2549 ignore=ignoreflags)
2550
2551 self.assertIsInstance(ancdata, list)
2552 self.assertLessEqual(len(ancdata), maxcmsgs)
2553 fds = array.array("i")
2554 for item in ancdata:
2555 self.assertIsInstance(item, tuple)
2556 cmsg_level, cmsg_type, cmsg_data = item
2557 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2558 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2559 self.assertIsInstance(cmsg_data, bytes)
2560 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002561 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002562
2563 self.assertEqual(len(fds), numfds)
2564 self.checkFDs(fds)
2565
2566 def testFDPassSimple(self):
2567 # Pass a single FD (array read from bytes object).
2568 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2569 len(MSG), 10240))
2570
2571 def _testFDPassSimple(self):
2572 self.assertEqual(
2573 self.sendmsgToServer(
2574 [MSG],
2575 [(socket.SOL_SOCKET,
2576 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002577 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002578 len(MSG))
2579
2580 def testMultipleFDPass(self):
2581 # Pass multiple FDs in a single array.
2582 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2583 len(MSG), 10240))
2584
2585 def _testMultipleFDPass(self):
2586 self.createAndSendFDs(4)
2587
2588 @requireAttrs(socket, "CMSG_SPACE")
2589 def testFDPassCMSG_SPACE(self):
2590 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2591 self.checkRecvmsgFDs(
2592 4, self.doRecvmsg(self.serv_sock, len(MSG),
2593 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2594
2595 @testFDPassCMSG_SPACE.client_skip
2596 def _testFDPassCMSG_SPACE(self):
2597 self.createAndSendFDs(4)
2598
2599 def testFDPassCMSG_LEN(self):
2600 # Test using CMSG_LEN() to calculate ancillary buffer size.
2601 self.checkRecvmsgFDs(1,
2602 self.doRecvmsg(self.serv_sock, len(MSG),
2603 socket.CMSG_LEN(4 * SIZEOF_INT)),
2604 # RFC 3542 says implementations may set
2605 # MSG_CTRUNC if there isn't enough space
2606 # for trailing padding.
2607 ignoreflags=socket.MSG_CTRUNC)
2608
2609 def _testFDPassCMSG_LEN(self):
2610 self.createAndSendFDs(1)
2611
Nick Coghlan2496f332011-09-19 20:26:31 +10002612 # Issue #12958: The following test has problems on Mac OS X
2613 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002614 @requireAttrs(socket, "CMSG_SPACE")
2615 def testFDPassSeparate(self):
2616 # Pass two FDs in two separate arrays. Arrays may be combined
2617 # into a single control message by the OS.
2618 self.checkRecvmsgFDs(2,
2619 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2620 maxcmsgs=2)
2621
2622 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002623 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002624 def _testFDPassSeparate(self):
2625 fd0, fd1 = self.newFDs(2)
2626 self.assertEqual(
2627 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2628 socket.SCM_RIGHTS,
2629 array.array("i", [fd0])),
2630 (socket.SOL_SOCKET,
2631 socket.SCM_RIGHTS,
2632 array.array("i", [fd1]))]),
2633 len(MSG))
2634
Nick Coghlan2496f332011-09-19 20:26:31 +10002635 # Issue #12958: The following test has problems on Mac OS X
2636 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002637 @requireAttrs(socket, "CMSG_SPACE")
2638 def testFDPassSeparateMinSpace(self):
2639 # Pass two FDs in two separate arrays, receiving them into the
2640 # minimum space for two arrays.
2641 self.checkRecvmsgFDs(2,
2642 self.doRecvmsg(self.serv_sock, len(MSG),
2643 socket.CMSG_SPACE(SIZEOF_INT) +
2644 socket.CMSG_LEN(SIZEOF_INT)),
2645 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2646
2647 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002648 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002649 def _testFDPassSeparateMinSpace(self):
2650 fd0, fd1 = self.newFDs(2)
2651 self.assertEqual(
2652 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2653 socket.SCM_RIGHTS,
2654 array.array("i", [fd0])),
2655 (socket.SOL_SOCKET,
2656 socket.SCM_RIGHTS,
2657 array.array("i", [fd1]))]),
2658 len(MSG))
2659
2660 def sendAncillaryIfPossible(self, msg, ancdata):
2661 # Try to send msg and ancdata to server, but if the system
2662 # call fails, just send msg with no ancillary data.
2663 try:
2664 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002665 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002666 # Check that it was the system call that failed
2667 self.assertIsInstance(e.errno, int)
2668 nbytes = self.sendmsgToServer([msg])
2669 self.assertEqual(nbytes, len(msg))
2670
2671 def testFDPassEmpty(self):
2672 # Try to pass an empty FD array. Can receive either no array
2673 # or an empty array.
2674 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2675 len(MSG), 10240),
2676 ignoreflags=socket.MSG_CTRUNC)
2677
2678 def _testFDPassEmpty(self):
2679 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2680 socket.SCM_RIGHTS,
2681 b"")])
2682
2683 def testFDPassPartialInt(self):
2684 # Try to pass a truncated FD array.
2685 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2686 len(MSG), 10240)
2687 self.assertEqual(msg, MSG)
2688 self.checkRecvmsgAddress(addr, self.cli_addr)
2689 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2690 self.assertLessEqual(len(ancdata), 1)
2691 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2692 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2693 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2694 self.assertLess(len(cmsg_data), SIZEOF_INT)
2695
2696 def _testFDPassPartialInt(self):
2697 self.sendAncillaryIfPossible(
2698 MSG,
2699 [(socket.SOL_SOCKET,
2700 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002701 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002702
2703 @requireAttrs(socket, "CMSG_SPACE")
2704 def testFDPassPartialIntInMiddle(self):
2705 # Try to pass two FD arrays, the first of which is truncated.
2706 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2707 len(MSG), 10240)
2708 self.assertEqual(msg, MSG)
2709 self.checkRecvmsgAddress(addr, self.cli_addr)
2710 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2711 self.assertLessEqual(len(ancdata), 2)
2712 fds = array.array("i")
2713 # Arrays may have been combined in a single control message
2714 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2715 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2716 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002717 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002718 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2719 self.assertLessEqual(len(fds), 2)
2720 self.checkFDs(fds)
2721
2722 @testFDPassPartialIntInMiddle.client_skip
2723 def _testFDPassPartialIntInMiddle(self):
2724 fd0, fd1 = self.newFDs(2)
2725 self.sendAncillaryIfPossible(
2726 MSG,
2727 [(socket.SOL_SOCKET,
2728 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002729 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002730 (socket.SOL_SOCKET,
2731 socket.SCM_RIGHTS,
2732 array.array("i", [fd1]))])
2733
2734 def checkTruncatedHeader(self, result, ignoreflags=0):
2735 # Check that no ancillary data items are returned when data is
2736 # truncated inside the cmsghdr structure.
2737 msg, ancdata, flags, addr = result
2738 self.assertEqual(msg, MSG)
2739 self.checkRecvmsgAddress(addr, self.cli_addr)
2740 self.assertEqual(ancdata, [])
2741 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2742 ignore=ignoreflags)
2743
2744 def testCmsgTruncNoBufSize(self):
2745 # Check that no ancillary data is received when no buffer size
2746 # is specified.
2747 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2748 # BSD seems to set MSG_CTRUNC only
2749 # if an item has been partially
2750 # received.
2751 ignoreflags=socket.MSG_CTRUNC)
2752
2753 def _testCmsgTruncNoBufSize(self):
2754 self.createAndSendFDs(1)
2755
2756 def testCmsgTrunc0(self):
2757 # Check that no ancillary data is received when buffer size is 0.
2758 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2759 ignoreflags=socket.MSG_CTRUNC)
2760
2761 def _testCmsgTrunc0(self):
2762 self.createAndSendFDs(1)
2763
2764 # Check that no ancillary data is returned for various non-zero
2765 # (but still too small) buffer sizes.
2766
2767 def testCmsgTrunc1(self):
2768 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2769
2770 def _testCmsgTrunc1(self):
2771 self.createAndSendFDs(1)
2772
2773 def testCmsgTrunc2Int(self):
2774 # The cmsghdr structure has at least three members, two of
2775 # which are ints, so we still shouldn't see any ancillary
2776 # data.
2777 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2778 SIZEOF_INT * 2))
2779
2780 def _testCmsgTrunc2Int(self):
2781 self.createAndSendFDs(1)
2782
2783 def testCmsgTruncLen0Minus1(self):
2784 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2785 socket.CMSG_LEN(0) - 1))
2786
2787 def _testCmsgTruncLen0Minus1(self):
2788 self.createAndSendFDs(1)
2789
2790 # The following tests try to truncate the control message in the
2791 # middle of the FD array.
2792
2793 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2794 # Check that file descriptor data is truncated to between
2795 # mindata and maxdata bytes when received with buffer size
2796 # ancbuf, and that any complete file descriptor numbers are
2797 # valid.
2798 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2799 len(MSG), ancbuf)
2800 self.assertEqual(msg, MSG)
2801 self.checkRecvmsgAddress(addr, self.cli_addr)
2802 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2803
2804 if mindata == 0 and ancdata == []:
2805 return
2806 self.assertEqual(len(ancdata), 1)
2807 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2808 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2809 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2810 self.assertGreaterEqual(len(cmsg_data), mindata)
2811 self.assertLessEqual(len(cmsg_data), maxdata)
2812 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002813 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002814 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2815 self.checkFDs(fds)
2816
2817 def testCmsgTruncLen0(self):
2818 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2819
2820 def _testCmsgTruncLen0(self):
2821 self.createAndSendFDs(1)
2822
2823 def testCmsgTruncLen0Plus1(self):
2824 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2825
2826 def _testCmsgTruncLen0Plus1(self):
2827 self.createAndSendFDs(2)
2828
2829 def testCmsgTruncLen1(self):
2830 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2831 maxdata=SIZEOF_INT)
2832
2833 def _testCmsgTruncLen1(self):
2834 self.createAndSendFDs(2)
2835
2836 def testCmsgTruncLen2Minus1(self):
2837 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2838 maxdata=(2 * SIZEOF_INT) - 1)
2839
2840 def _testCmsgTruncLen2Minus1(self):
2841 self.createAndSendFDs(2)
2842
2843
2844class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2845 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2846 # features of the RFC 3542 Advanced Sockets API for IPv6.
2847 # Currently we can only handle certain data items (e.g. traffic
2848 # class, hop limit, MTU discovery and fragmentation settings)
2849 # without resorting to unportable means such as the struct module,
2850 # but the tests here are aimed at testing the ancillary data
2851 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2852 # itself.
2853
2854 # Test value to use when setting hop limit of packet
2855 hop_limit = 2
2856
2857 # Test value to use when setting traffic class of packet.
2858 # -1 means "use kernel default".
2859 traffic_class = -1
2860
2861 def ancillaryMapping(self, ancdata):
2862 # Given ancillary data list ancdata, return a mapping from
2863 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2864 # Check that no (level, type) pair appears more than once.
2865 d = {}
2866 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2867 self.assertNotIn((cmsg_level, cmsg_type), d)
2868 d[(cmsg_level, cmsg_type)] = cmsg_data
2869 return d
2870
2871 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2872 # Receive hop limit into ancbufsize bytes of ancillary data
2873 # space. Check that data is MSG, ancillary data is not
2874 # truncated (but ignore any flags in ignoreflags), and hop
2875 # limit is between 0 and maxhop inclusive.
2876 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2877 socket.IPV6_RECVHOPLIMIT, 1)
2878 self.misc_event.set()
2879 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2880 len(MSG), ancbufsize)
2881
2882 self.assertEqual(msg, MSG)
2883 self.checkRecvmsgAddress(addr, self.cli_addr)
2884 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2885 ignore=ignoreflags)
2886
2887 self.assertEqual(len(ancdata), 1)
2888 self.assertIsInstance(ancdata[0], tuple)
2889 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2890 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2891 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2892 self.assertIsInstance(cmsg_data, bytes)
2893 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2894 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002895 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002896 self.assertGreaterEqual(a[0], 0)
2897 self.assertLessEqual(a[0], maxhop)
2898
2899 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2900 def testRecvHopLimit(self):
2901 # Test receiving the packet hop limit as ancillary data.
2902 self.checkHopLimit(ancbufsize=10240)
2903
2904 @testRecvHopLimit.client_skip
2905 def _testRecvHopLimit(self):
2906 # Need to wait until server has asked to receive ancillary
2907 # data, as implementations are not required to buffer it
2908 # otherwise.
2909 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2910 self.sendToServer(MSG)
2911
2912 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2913 def testRecvHopLimitCMSG_SPACE(self):
2914 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2915 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2916
2917 @testRecvHopLimitCMSG_SPACE.client_skip
2918 def _testRecvHopLimitCMSG_SPACE(self):
2919 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2920 self.sendToServer(MSG)
2921
2922 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2923 # 3542 says portable applications must provide space for trailing
2924 # padding. Implementations may set MSG_CTRUNC if there isn't
2925 # enough space for the padding.
2926
2927 @requireAttrs(socket.socket, "sendmsg")
2928 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2929 def testSetHopLimit(self):
2930 # Test setting hop limit on outgoing packet and receiving it
2931 # at the other end.
2932 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2933
2934 @testSetHopLimit.client_skip
2935 def _testSetHopLimit(self):
2936 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2937 self.assertEqual(
2938 self.sendmsgToServer([MSG],
2939 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2940 array.array("i", [self.hop_limit]))]),
2941 len(MSG))
2942
2943 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2944 ignoreflags=0):
2945 # Receive traffic class and hop limit into ancbufsize bytes of
2946 # ancillary data space. Check that data is MSG, ancillary
2947 # data is not truncated (but ignore any flags in ignoreflags),
2948 # and traffic class and hop limit are in range (hop limit no
2949 # more than maxhop).
2950 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2951 socket.IPV6_RECVHOPLIMIT, 1)
2952 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2953 socket.IPV6_RECVTCLASS, 1)
2954 self.misc_event.set()
2955 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2956 len(MSG), ancbufsize)
2957
2958 self.assertEqual(msg, MSG)
2959 self.checkRecvmsgAddress(addr, self.cli_addr)
2960 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2961 ignore=ignoreflags)
2962 self.assertEqual(len(ancdata), 2)
2963 ancmap = self.ancillaryMapping(ancdata)
2964
2965 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2966 self.assertEqual(len(tcdata), SIZEOF_INT)
2967 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002968 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002969 self.assertGreaterEqual(a[0], 0)
2970 self.assertLessEqual(a[0], 255)
2971
2972 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2973 self.assertEqual(len(hldata), SIZEOF_INT)
2974 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002975 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002976 self.assertGreaterEqual(a[0], 0)
2977 self.assertLessEqual(a[0], maxhop)
2978
2979 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2980 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2981 def testRecvTrafficClassAndHopLimit(self):
2982 # Test receiving traffic class and hop limit as ancillary data.
2983 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2984
2985 @testRecvTrafficClassAndHopLimit.client_skip
2986 def _testRecvTrafficClassAndHopLimit(self):
2987 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2988 self.sendToServer(MSG)
2989
2990 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2991 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2992 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2993 # Test receiving traffic class and hop limit, using
2994 # CMSG_SPACE() to calculate buffer size.
2995 self.checkTrafficClassAndHopLimit(
2996 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2997
2998 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2999 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3000 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3001 self.sendToServer(MSG)
3002
3003 @requireAttrs(socket.socket, "sendmsg")
3004 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3005 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3006 def testSetTrafficClassAndHopLimit(self):
3007 # Test setting traffic class and hop limit on outgoing packet,
3008 # and receiving them at the other end.
3009 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3010 maxhop=self.hop_limit)
3011
3012 @testSetTrafficClassAndHopLimit.client_skip
3013 def _testSetTrafficClassAndHopLimit(self):
3014 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3015 self.assertEqual(
3016 self.sendmsgToServer([MSG],
3017 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3018 array.array("i", [self.traffic_class])),
3019 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3020 array.array("i", [self.hop_limit]))]),
3021 len(MSG))
3022
3023 @requireAttrs(socket.socket, "sendmsg")
3024 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3025 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3026 def testOddCmsgSize(self):
3027 # Try to send ancillary data with first item one byte too
3028 # long. Fall back to sending with correct size if this fails,
3029 # and check that second item was handled correctly.
3030 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3031 maxhop=self.hop_limit)
3032
3033 @testOddCmsgSize.client_skip
3034 def _testOddCmsgSize(self):
3035 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3036 try:
3037 nbytes = self.sendmsgToServer(
3038 [MSG],
3039 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003040 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003041 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3042 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003043 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003044 self.assertIsInstance(e.errno, int)
3045 nbytes = self.sendmsgToServer(
3046 [MSG],
3047 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3048 array.array("i", [self.traffic_class])),
3049 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3050 array.array("i", [self.hop_limit]))])
3051 self.assertEqual(nbytes, len(MSG))
3052
3053 # Tests for proper handling of truncated ancillary data
3054
3055 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3056 # Receive hop limit into ancbufsize bytes of ancillary data
3057 # space, which should be too small to contain the ancillary
3058 # data header (if ancbufsize is None, pass no second argument
3059 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3060 # (unless included in ignoreflags), and no ancillary data is
3061 # returned.
3062 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3063 socket.IPV6_RECVHOPLIMIT, 1)
3064 self.misc_event.set()
3065 args = () if ancbufsize is None else (ancbufsize,)
3066 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3067 len(MSG), *args)
3068
3069 self.assertEqual(msg, MSG)
3070 self.checkRecvmsgAddress(addr, self.cli_addr)
3071 self.assertEqual(ancdata, [])
3072 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3073 ignore=ignoreflags)
3074
3075 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3076 def testCmsgTruncNoBufSize(self):
3077 # Check that no ancillary data is received when no ancillary
3078 # buffer size is provided.
3079 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3080 # BSD seems to set
3081 # MSG_CTRUNC only if an item
3082 # has been partially
3083 # received.
3084 ignoreflags=socket.MSG_CTRUNC)
3085
3086 @testCmsgTruncNoBufSize.client_skip
3087 def _testCmsgTruncNoBufSize(self):
3088 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3089 self.sendToServer(MSG)
3090
3091 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3092 def testSingleCmsgTrunc0(self):
3093 # Check that no ancillary data is received when ancillary
3094 # buffer size is zero.
3095 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3096 ignoreflags=socket.MSG_CTRUNC)
3097
3098 @testSingleCmsgTrunc0.client_skip
3099 def _testSingleCmsgTrunc0(self):
3100 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3101 self.sendToServer(MSG)
3102
3103 # Check that no ancillary data is returned for various non-zero
3104 # (but still too small) buffer sizes.
3105
3106 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3107 def testSingleCmsgTrunc1(self):
3108 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3109
3110 @testSingleCmsgTrunc1.client_skip
3111 def _testSingleCmsgTrunc1(self):
3112 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3113 self.sendToServer(MSG)
3114
3115 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3116 def testSingleCmsgTrunc2Int(self):
3117 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3118
3119 @testSingleCmsgTrunc2Int.client_skip
3120 def _testSingleCmsgTrunc2Int(self):
3121 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3122 self.sendToServer(MSG)
3123
3124 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3125 def testSingleCmsgTruncLen0Minus1(self):
3126 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3127
3128 @testSingleCmsgTruncLen0Minus1.client_skip
3129 def _testSingleCmsgTruncLen0Minus1(self):
3130 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3131 self.sendToServer(MSG)
3132
3133 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3134 def testSingleCmsgTruncInData(self):
3135 # Test truncation of a control message inside its associated
3136 # data. The message may be returned with its data truncated,
3137 # or not returned at all.
3138 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3139 socket.IPV6_RECVHOPLIMIT, 1)
3140 self.misc_event.set()
3141 msg, ancdata, flags, addr = self.doRecvmsg(
3142 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3143
3144 self.assertEqual(msg, MSG)
3145 self.checkRecvmsgAddress(addr, self.cli_addr)
3146 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3147
3148 self.assertLessEqual(len(ancdata), 1)
3149 if ancdata:
3150 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3151 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3152 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3153 self.assertLess(len(cmsg_data), SIZEOF_INT)
3154
3155 @testSingleCmsgTruncInData.client_skip
3156 def _testSingleCmsgTruncInData(self):
3157 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3158 self.sendToServer(MSG)
3159
3160 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3161 # Receive traffic class and hop limit into ancbufsize bytes of
3162 # ancillary data space, which should be large enough to
3163 # contain the first item, but too small to contain the header
3164 # of the second. Check that data is MSG, MSG_CTRUNC is set
3165 # (unless included in ignoreflags), and only one ancillary
3166 # data item is returned.
3167 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3168 socket.IPV6_RECVHOPLIMIT, 1)
3169 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3170 socket.IPV6_RECVTCLASS, 1)
3171 self.misc_event.set()
3172 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3173 len(MSG), ancbufsize)
3174
3175 self.assertEqual(msg, MSG)
3176 self.checkRecvmsgAddress(addr, self.cli_addr)
3177 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3178 ignore=ignoreflags)
3179
3180 self.assertEqual(len(ancdata), 1)
3181 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3182 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3183 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3184 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3185 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003186 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003187 self.assertGreaterEqual(a[0], 0)
3188 self.assertLessEqual(a[0], 255)
3189
3190 # Try the above test with various buffer sizes.
3191
3192 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3193 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3194 def testSecondCmsgTrunc0(self):
3195 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3196 ignoreflags=socket.MSG_CTRUNC)
3197
3198 @testSecondCmsgTrunc0.client_skip
3199 def _testSecondCmsgTrunc0(self):
3200 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3201 self.sendToServer(MSG)
3202
3203 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3204 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3205 def testSecondCmsgTrunc1(self):
3206 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3207
3208 @testSecondCmsgTrunc1.client_skip
3209 def _testSecondCmsgTrunc1(self):
3210 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3211 self.sendToServer(MSG)
3212
3213 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3214 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3215 def testSecondCmsgTrunc2Int(self):
3216 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3217 2 * SIZEOF_INT)
3218
3219 @testSecondCmsgTrunc2Int.client_skip
3220 def _testSecondCmsgTrunc2Int(self):
3221 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3222 self.sendToServer(MSG)
3223
3224 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3225 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3226 def testSecondCmsgTruncLen0Minus1(self):
3227 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3228 socket.CMSG_LEN(0) - 1)
3229
3230 @testSecondCmsgTruncLen0Minus1.client_skip
3231 def _testSecondCmsgTruncLen0Minus1(self):
3232 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3233 self.sendToServer(MSG)
3234
3235 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3236 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3237 def testSecomdCmsgTruncInData(self):
3238 # Test truncation of the second of two control messages inside
3239 # its associated data.
3240 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3241 socket.IPV6_RECVHOPLIMIT, 1)
3242 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3243 socket.IPV6_RECVTCLASS, 1)
3244 self.misc_event.set()
3245 msg, ancdata, flags, addr = self.doRecvmsg(
3246 self.serv_sock, len(MSG),
3247 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3248
3249 self.assertEqual(msg, MSG)
3250 self.checkRecvmsgAddress(addr, self.cli_addr)
3251 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3252
3253 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3254
3255 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3256 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3257 cmsg_types.remove(cmsg_type)
3258 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3259 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003260 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003261 self.assertGreaterEqual(a[0], 0)
3262 self.assertLessEqual(a[0], 255)
3263
3264 if ancdata:
3265 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3266 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3267 cmsg_types.remove(cmsg_type)
3268 self.assertLess(len(cmsg_data), SIZEOF_INT)
3269
3270 self.assertEqual(ancdata, [])
3271
3272 @testSecomdCmsgTruncInData.client_skip
3273 def _testSecomdCmsgTruncInData(self):
3274 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3275 self.sendToServer(MSG)
3276
3277
3278# Derive concrete test classes for different socket types.
3279
3280class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3281 SendrecvmsgConnectionlessBase,
3282 ThreadedSocketTestMixin, UDPTestBase):
3283 pass
3284
3285@requireAttrs(socket.socket, "sendmsg")
3286@unittest.skipUnless(thread, 'Threading required for this test.')
3287class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3288 pass
3289
3290@requireAttrs(socket.socket, "recvmsg")
3291@unittest.skipUnless(thread, 'Threading required for this test.')
3292class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3293 pass
3294
3295@requireAttrs(socket.socket, "recvmsg_into")
3296@unittest.skipUnless(thread, 'Threading required for this test.')
3297class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3298 pass
3299
3300
3301class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3302 SendrecvmsgConnectionlessBase,
3303 ThreadedSocketTestMixin, UDP6TestBase):
3304 pass
3305
3306@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003307@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003308@requireSocket("AF_INET6", "SOCK_DGRAM")
3309@unittest.skipUnless(thread, 'Threading required for this test.')
3310class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3311 pass
3312
3313@requireAttrs(socket.socket, "recvmsg")
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 RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3318 pass
3319
3320@requireAttrs(socket.socket, "recvmsg_into")
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 RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3325 pass
3326
3327@requireAttrs(socket.socket, "recvmsg")
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@requireAttrs(socket, "IPPROTO_IPV6")
3330@requireSocket("AF_INET6", "SOCK_DGRAM")
3331@unittest.skipUnless(thread, 'Threading required for this test.')
3332class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3333 SendrecvmsgUDP6TestBase):
3334 pass
3335
3336@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003337@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003338@requireAttrs(socket, "IPPROTO_IPV6")
3339@requireSocket("AF_INET6", "SOCK_DGRAM")
3340@unittest.skipUnless(thread, 'Threading required for this test.')
3341class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3342 RFC3542AncillaryTest,
3343 SendrecvmsgUDP6TestBase):
3344 pass
3345
3346
3347class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3348 ConnectedStreamTestMixin, TCPTestBase):
3349 pass
3350
3351@requireAttrs(socket.socket, "sendmsg")
3352@unittest.skipUnless(thread, 'Threading required for this test.')
3353class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3354 pass
3355
3356@requireAttrs(socket.socket, "recvmsg")
3357@unittest.skipUnless(thread, 'Threading required for this test.')
3358class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3359 SendrecvmsgTCPTestBase):
3360 pass
3361
3362@requireAttrs(socket.socket, "recvmsg_into")
3363@unittest.skipUnless(thread, 'Threading required for this test.')
3364class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3365 SendrecvmsgTCPTestBase):
3366 pass
3367
3368
3369class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3370 SendrecvmsgConnectedBase,
3371 ConnectedStreamTestMixin, SCTPStreamBase):
3372 pass
3373
3374@requireAttrs(socket.socket, "sendmsg")
3375@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3376@unittest.skipUnless(thread, 'Threading required for this test.')
3377class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3378 pass
3379
3380@requireAttrs(socket.socket, "recvmsg")
3381@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3382@unittest.skipUnless(thread, 'Threading required for this test.')
3383class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3384 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003385
3386 def testRecvmsgEOF(self):
3387 try:
3388 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3389 except OSError as e:
3390 if e.errno != errno.ENOTCONN:
3391 raise
3392 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003393
3394@requireAttrs(socket.socket, "recvmsg_into")
3395@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3396@unittest.skipUnless(thread, 'Threading required for this test.')
3397class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3398 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003399
3400 def testRecvmsgEOF(self):
3401 try:
3402 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3403 except OSError as e:
3404 if e.errno != errno.ENOTCONN:
3405 raise
3406 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003407
3408
3409class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3410 ConnectedStreamTestMixin, UnixStreamBase):
3411 pass
3412
3413@requireAttrs(socket.socket, "sendmsg")
3414@requireAttrs(socket, "AF_UNIX")
3415@unittest.skipUnless(thread, 'Threading required for this test.')
3416class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3417 pass
3418
3419@requireAttrs(socket.socket, "recvmsg")
3420@requireAttrs(socket, "AF_UNIX")
3421@unittest.skipUnless(thread, 'Threading required for this test.')
3422class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3423 SendrecvmsgUnixStreamTestBase):
3424 pass
3425
3426@requireAttrs(socket.socket, "recvmsg_into")
3427@requireAttrs(socket, "AF_UNIX")
3428@unittest.skipUnless(thread, 'Threading required for this test.')
3429class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3430 SendrecvmsgUnixStreamTestBase):
3431 pass
3432
3433@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3434@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3435@unittest.skipUnless(thread, 'Threading required for this test.')
3436class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3437 pass
3438
3439@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3440@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3441@unittest.skipUnless(thread, 'Threading required for this test.')
3442class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3443 SendrecvmsgUnixStreamTestBase):
3444 pass
3445
3446
3447# Test interrupting the interruptible send/receive methods with a
3448# signal when a timeout is set. These tests avoid having multiple
3449# threads alive during the test so that the OS cannot deliver the
3450# signal to the wrong one.
3451
3452class InterruptedTimeoutBase(unittest.TestCase):
3453 # Base class for interrupted send/receive tests. Installs an
3454 # empty handler for SIGALRM and removes it on teardown, along with
3455 # any scheduled alarms.
3456
3457 def setUp(self):
3458 super().setUp()
3459 orig_alrm_handler = signal.signal(signal.SIGALRM,
3460 lambda signum, frame: None)
3461 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3462 self.addCleanup(self.setAlarm, 0)
3463
3464 # Timeout for socket operations
3465 timeout = 4.0
3466
3467 # Provide setAlarm() method to schedule delivery of SIGALRM after
3468 # given number of seconds, or cancel it if zero, and an
3469 # appropriate time value to use. Use setitimer() if available.
3470 if hasattr(signal, "setitimer"):
3471 alarm_time = 0.05
3472
3473 def setAlarm(self, seconds):
3474 signal.setitimer(signal.ITIMER_REAL, seconds)
3475 else:
3476 # Old systems may deliver the alarm up to one second early
3477 alarm_time = 2
3478
3479 def setAlarm(self, seconds):
3480 signal.alarm(seconds)
3481
3482
3483# Require siginterrupt() in order to ensure that system calls are
3484# interrupted by default.
3485@requireAttrs(signal, "siginterrupt")
3486@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3487 "Don't have signal.alarm or signal.setitimer")
3488class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3489 # Test interrupting the recv*() methods with signals when a
3490 # timeout is set.
3491
3492 def setUp(self):
3493 super().setUp()
3494 self.serv.settimeout(self.timeout)
3495
3496 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003497 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003498 # errno of EINTR when interrupted by a signal.
3499 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003500 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003501 func(*args, **kwargs)
3502 self.assertNotIsInstance(cm.exception, socket.timeout)
3503 self.assertEqual(cm.exception.errno, errno.EINTR)
3504
3505 def testInterruptedRecvTimeout(self):
3506 self.checkInterruptedRecv(self.serv.recv, 1024)
3507
3508 def testInterruptedRecvIntoTimeout(self):
3509 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3510
3511 def testInterruptedRecvfromTimeout(self):
3512 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3513
3514 def testInterruptedRecvfromIntoTimeout(self):
3515 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3516
3517 @requireAttrs(socket.socket, "recvmsg")
3518 def testInterruptedRecvmsgTimeout(self):
3519 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3520
3521 @requireAttrs(socket.socket, "recvmsg_into")
3522 def testInterruptedRecvmsgIntoTimeout(self):
3523 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3524
3525
3526# Require siginterrupt() in order to ensure that system calls are
3527# interrupted by default.
3528@requireAttrs(signal, "siginterrupt")
3529@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3530 "Don't have signal.alarm or signal.setitimer")
3531@unittest.skipUnless(thread, 'Threading required for this test.')
3532class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3533 ThreadSafeCleanupTestCase,
3534 SocketListeningTestMixin, TCPTestBase):
3535 # Test interrupting the interruptible send*() methods with signals
3536 # when a timeout is set.
3537
3538 def setUp(self):
3539 super().setUp()
3540 self.serv_conn = self.newSocket()
3541 self.addCleanup(self.serv_conn.close)
3542 # Use a thread to complete the connection, but wait for it to
3543 # terminate before running the test, so that there is only one
3544 # thread to accept the signal.
3545 cli_thread = threading.Thread(target=self.doConnect)
3546 cli_thread.start()
3547 self.cli_conn, addr = self.serv.accept()
3548 self.addCleanup(self.cli_conn.close)
3549 cli_thread.join()
3550 self.serv_conn.settimeout(self.timeout)
3551
3552 def doConnect(self):
3553 self.serv_conn.connect(self.serv_addr)
3554
3555 def checkInterruptedSend(self, func, *args, **kwargs):
3556 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003557 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003558 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003559 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003560 while True:
3561 self.setAlarm(self.alarm_time)
3562 func(*args, **kwargs)
3563 self.assertNotIsInstance(cm.exception, socket.timeout)
3564 self.assertEqual(cm.exception.errno, errno.EINTR)
3565
Nick Coghlan2496f332011-09-19 20:26:31 +10003566 # Issue #12958: The following tests have problems on Mac OS X
3567 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003568 def testInterruptedSendTimeout(self):
3569 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3570
Nick Coghlan2496f332011-09-19 20:26:31 +10003571 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003572 def testInterruptedSendtoTimeout(self):
3573 # Passing an actual address here as Python's wrapper for
3574 # sendto() doesn't allow passing a zero-length one; POSIX
3575 # requires that the address is ignored since the socket is
3576 # connection-mode, however.
3577 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3578 self.serv_addr)
3579
Nick Coghlan2496f332011-09-19 20:26:31 +10003580 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003581 @requireAttrs(socket.socket, "sendmsg")
3582 def testInterruptedSendmsgTimeout(self):
3583 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3584
3585
Victor Stinner45df8202010-04-28 22:31:17 +00003586@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003587class TCPCloserTest(ThreadedTCPSocketTest):
3588
3589 def testClose(self):
3590 conn, addr = self.serv.accept()
3591 conn.close()
3592
3593 sd = self.cli
3594 read, write, err = select.select([sd], [], [], 1.0)
3595 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003596 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003597
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003598 # Calling close() many times should be safe.
3599 conn.close()
3600 conn.close()
3601
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003602 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003603 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003604 time.sleep(1.0)
3605
Victor Stinner45df8202010-04-28 22:31:17 +00003606@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003607class BasicSocketPairTest(SocketPairTest):
3608
3609 def __init__(self, methodName='runTest'):
3610 SocketPairTest.__init__(self, methodName=methodName)
3611
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003612 def _check_defaults(self, sock):
3613 self.assertIsInstance(sock, socket.socket)
3614 if hasattr(socket, 'AF_UNIX'):
3615 self.assertEqual(sock.family, socket.AF_UNIX)
3616 else:
3617 self.assertEqual(sock.family, socket.AF_INET)
3618 self.assertEqual(sock.type, socket.SOCK_STREAM)
3619 self.assertEqual(sock.proto, 0)
3620
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003621 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003622 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003623
3624 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003625 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003626
Dave Cole331708b2004-08-09 04:51:41 +00003627 def testRecv(self):
3628 msg = self.serv.recv(1024)
3629 self.assertEqual(msg, MSG)
3630
3631 def _testRecv(self):
3632 self.cli.send(MSG)
3633
3634 def testSend(self):
3635 self.serv.send(MSG)
3636
3637 def _testSend(self):
3638 msg = self.cli.recv(1024)
3639 self.assertEqual(msg, MSG)
3640
Victor Stinner45df8202010-04-28 22:31:17 +00003641@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003642class NonBlockingTCPTests(ThreadedTCPSocketTest):
3643
3644 def __init__(self, methodName='runTest'):
3645 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3646
3647 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003648 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003649 self.serv.setblocking(True)
3650 self.assertIsNone(self.serv.gettimeout())
3651 self.serv.setblocking(False)
3652 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003653 start = time.time()
3654 try:
3655 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003656 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003657 pass
3658 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003659 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Serhiy Storchaka78980432013-01-15 01:12:17 +02003660 # Issue 15989
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003661 if _testcapi.UINT_MAX < _testcapi.ULONG_MAX:
3662 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3663 self.assertIsNone(self.serv.gettimeout())
Guido van Rossum24e4af82002-06-12 19:18:08 +00003664
3665 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003666 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003667
Antoine Pitroub1c54962010-10-14 15:05:38 +00003668 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003669 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003670 def testInitNonBlocking(self):
3671 # reinit server socket
3672 self.serv.close()
3673 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003674 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003675 self.port = support.bind_port(self.serv)
3676 self.serv.listen(1)
3677 # actual testing
3678 start = time.time()
3679 try:
3680 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003681 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003682 pass
3683 end = time.time()
3684 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3685
3686 def _testInitNonBlocking(self):
3687 pass
3688
Antoine Pitrou600232b2011-01-05 21:03:42 +00003689 def testInheritFlags(self):
3690 # Issue #7995: when calling accept() on a listening socket with a
3691 # timeout, the resulting socket should not be non-blocking.
3692 self.serv.settimeout(10)
3693 try:
3694 conn, addr = self.serv.accept()
3695 message = conn.recv(len(MSG))
3696 finally:
3697 conn.close()
3698 self.serv.settimeout(None)
3699
3700 def _testInheritFlags(self):
3701 time.sleep(0.1)
3702 self.cli.connect((HOST, self.port))
3703 time.sleep(0.5)
3704 self.cli.send(MSG)
3705
Guido van Rossum24e4af82002-06-12 19:18:08 +00003706 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003707 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003708 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003709 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003710 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003711 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003712 pass
3713 else:
3714 self.fail("Error trying to do non-blocking accept.")
3715 read, write, err = select.select([self.serv], [], [])
3716 if self.serv in read:
3717 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003718 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003719 else:
3720 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003721
Guido van Rossum24e4af82002-06-12 19:18:08 +00003722 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003723 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003724 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003725
3726 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003727 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003728 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003729 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003730
3731 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003732 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003733 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003734
3735 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003736 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003737 conn, addr = self.serv.accept()
3738 conn.setblocking(0)
3739 try:
3740 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003741 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003742 pass
3743 else:
3744 self.fail("Error trying to do non-blocking recv.")
3745 read, write, err = select.select([conn], [], [])
3746 if conn in read:
3747 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003748 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003749 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003750 else:
3751 self.fail("Error during select call to non-blocking socket.")
3752
3753 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003754 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003755 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003756 self.cli.send(MSG)
3757
Victor Stinner45df8202010-04-28 22:31:17 +00003758@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003759class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003760 """Unit tests for the object returned by socket.makefile()
3761
Antoine Pitrou834bd812010-10-13 16:17:14 +00003762 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003763 the client connection. You can read from this file to
3764 get output from the server.
3765
Antoine Pitrou834bd812010-10-13 16:17:14 +00003766 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003767 server connection. You can write to this file to send output
3768 to the client.
3769 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003770
Guido van Rossume9f66142002-08-07 15:46:19 +00003771 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003772 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003773 errors = 'strict'
3774 newline = None
3775
3776 read_mode = 'rb'
3777 read_msg = MSG
3778 write_mode = 'wb'
3779 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003780
Guido van Rossum24e4af82002-06-12 19:18:08 +00003781 def __init__(self, methodName='runTest'):
3782 SocketConnectedTest.__init__(self, methodName=methodName)
3783
3784 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003785 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3786 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003787 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003788 self.read_file = self.cli_conn.makefile(
3789 self.read_mode, self.bufsize,
3790 encoding = self.encoding,
3791 errors = self.errors,
3792 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003793
3794 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003795 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003796 self.read_file.close()
3797 self.assertTrue(self.read_file.closed)
3798 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003799 SocketConnectedTest.tearDown(self)
3800
3801 def clientSetUp(self):
3802 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003803 self.write_file = self.serv_conn.makefile(
3804 self.write_mode, self.bufsize,
3805 encoding = self.encoding,
3806 errors = self.errors,
3807 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003808
3809 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003810 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003811 self.write_file.close()
3812 self.assertTrue(self.write_file.closed)
3813 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003814 SocketConnectedTest.clientTearDown(self)
3815
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003816 def testReadAfterTimeout(self):
3817 # Issue #7322: A file object must disallow further reads
3818 # after a timeout has occurred.
3819 self.cli_conn.settimeout(1)
3820 self.read_file.read(3)
3821 # First read raises a timeout
3822 self.assertRaises(socket.timeout, self.read_file.read, 1)
3823 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003824 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003825 self.read_file.read(1)
3826 self.assertIn("cannot read from timed out object", str(ctx.exception))
3827
3828 def _testReadAfterTimeout(self):
3829 self.write_file.write(self.write_msg[0:3])
3830 self.write_file.flush()
3831 self.serv_finished.wait()
3832
Guido van Rossum24e4af82002-06-12 19:18:08 +00003833 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003834 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003835 first_seg = self.read_file.read(len(self.read_msg)-3)
3836 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003837 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003838 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003839
3840 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003841 self.write_file.write(self.write_msg)
3842 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003843
Guido van Rossum8c943832002-08-08 01:00:28 +00003844 def testFullRead(self):
3845 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003846 msg = self.read_file.read()
3847 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003848
3849 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003850 self.write_file.write(self.write_msg)
3851 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003852
Guido van Rossum24e4af82002-06-12 19:18:08 +00003853 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003854 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003855 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003856 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003857 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003858 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003859 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003860 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003861 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003862
3863 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003864 self.write_file.write(self.write_msg)
3865 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003866
3867 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003868 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003869 line = self.read_file.readline()
3870 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003871
3872 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003873 self.write_file.write(self.write_msg)
3874 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003875
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003876 def testCloseAfterMakefile(self):
3877 # The file returned by makefile should keep the socket open.
3878 self.cli_conn.close()
3879 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003880 msg = self.read_file.read()
3881 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003882
3883 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003884 self.write_file.write(self.write_msg)
3885 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003886
3887 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003888 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003889 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003890 if isinstance(self.read_msg, str):
3891 msg = msg.decode()
3892 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003893
3894 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003895 self.write_file.write(self.write_msg)
3896 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003897
Tim Peters116d83c2004-03-28 02:20:45 +00003898 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003899 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003900
3901 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003902 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003903
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003904 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003905 self.assertEqual(self.read_file.mode, self.read_mode)
3906 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003907
3908 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003909 self.assertEqual(self.write_file.mode, self.write_mode)
3910 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003911
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003912 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003913 self.read_file.close()
3914 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003915 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003916 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003917
3918 def _testRealClose(self):
3919 pass
3920
3921
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003922class FileObjectInterruptedTestCase(unittest.TestCase):
3923 """Test that the file object correctly handles EINTR internally."""
3924
3925 class MockSocket(object):
3926 def __init__(self, recv_funcs=()):
3927 # A generator that returns callables that we'll call for each
3928 # call to recv().
3929 self._recv_step = iter(recv_funcs)
3930
3931 def recv_into(self, buffer):
3932 data = next(self._recv_step)()
3933 assert len(buffer) >= len(data)
3934 buffer[:len(data)] = data
3935 return len(data)
3936
3937 def _decref_socketios(self):
3938 pass
3939
3940 def _textiowrap_for_test(self, buffering=-1):
3941 raw = socket.SocketIO(self, "r")
3942 if buffering < 0:
3943 buffering = io.DEFAULT_BUFFER_SIZE
3944 if buffering == 0:
3945 return raw
3946 buffer = io.BufferedReader(raw, buffering)
3947 text = io.TextIOWrapper(buffer, None, None)
3948 text.mode = "rb"
3949 return text
3950
3951 @staticmethod
3952 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02003953 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003954
3955 def _textiowrap_mock_socket(self, mock, buffering=-1):
3956 raw = socket.SocketIO(mock, "r")
3957 if buffering < 0:
3958 buffering = io.DEFAULT_BUFFER_SIZE
3959 if buffering == 0:
3960 return raw
3961 buffer = io.BufferedReader(raw, buffering)
3962 text = io.TextIOWrapper(buffer, None, None)
3963 text.mode = "rb"
3964 return text
3965
3966 def _test_readline(self, size=-1, buffering=-1):
3967 mock_sock = self.MockSocket(recv_funcs=[
3968 lambda : b"This is the first line\nAnd the sec",
3969 self._raise_eintr,
3970 lambda : b"ond line is here\n",
3971 lambda : b"",
3972 lambda : b"", # XXX(gps): io library does an extra EOF read
3973 ])
3974 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003975 self.assertEqual(fo.readline(size), "This is the first line\n")
3976 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003977
3978 def _test_read(self, size=-1, buffering=-1):
3979 mock_sock = self.MockSocket(recv_funcs=[
3980 lambda : b"This is the first line\nAnd the sec",
3981 self._raise_eintr,
3982 lambda : b"ond line is here\n",
3983 lambda : b"",
3984 lambda : b"", # XXX(gps): io library does an extra EOF read
3985 ])
3986 expecting = (b"This is the first line\n"
3987 b"And the second line is here\n")
3988 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3989 if buffering == 0:
3990 data = b''
3991 else:
3992 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003993 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003994 while len(data) != len(expecting):
3995 part = fo.read(size)
3996 if not part:
3997 break
3998 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003999 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004000
4001 def test_default(self):
4002 self._test_readline()
4003 self._test_readline(size=100)
4004 self._test_read()
4005 self._test_read(size=100)
4006
4007 def test_with_1k_buffer(self):
4008 self._test_readline(buffering=1024)
4009 self._test_readline(size=100, buffering=1024)
4010 self._test_read(buffering=1024)
4011 self._test_read(size=100, buffering=1024)
4012
4013 def _test_readline_no_buffer(self, size=-1):
4014 mock_sock = self.MockSocket(recv_funcs=[
4015 lambda : b"a",
4016 lambda : b"\n",
4017 lambda : b"B",
4018 self._raise_eintr,
4019 lambda : b"b",
4020 lambda : b"",
4021 ])
4022 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004023 self.assertEqual(fo.readline(size), b"a\n")
4024 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004025
4026 def test_no_buffer(self):
4027 self._test_readline_no_buffer()
4028 self._test_readline_no_buffer(size=4)
4029 self._test_read(buffering=0)
4030 self._test_read(size=100, buffering=0)
4031
4032
Guido van Rossume9f66142002-08-07 15:46:19 +00004033class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4034
4035 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004036
Guido van Rossume9f66142002-08-07 15:46:19 +00004037 In this case (and in this case only), it should be possible to
4038 create a file object, read a line from it, create another file
4039 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004040 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004041 when reading multiple requests from the same socket."""
4042
4043 bufsize = 0 # Use unbuffered mode
4044
4045 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004046 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004047 line = self.read_file.readline() # first line
4048 self.assertEqual(line, b"A. " + self.write_msg) # first line
4049 self.read_file = self.cli_conn.makefile('rb', 0)
4050 line = self.read_file.readline() # second line
4051 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004052
4053 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004054 self.write_file.write(b"A. " + self.write_msg)
4055 self.write_file.write(b"B. " + self.write_msg)
4056 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004057
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004058 def testMakefileClose(self):
4059 # The file returned by makefile should keep the socket open...
4060 self.cli_conn.close()
4061 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004062 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004063 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004064 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004065 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004066
4067 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004068 self.write_file.write(self.write_msg)
4069 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004070
4071 def testMakefileCloseSocketDestroy(self):
4072 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004073 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004074 refcount_after = sys.getrefcount(self.cli_conn)
4075 self.assertEqual(refcount_before - 1, refcount_after)
4076
4077 def _testMakefileCloseSocketDestroy(self):
4078 pass
4079
Antoine Pitrou98b46702010-09-18 22:59:00 +00004080 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004081 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004082 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4083
4084 def testSmallReadNonBlocking(self):
4085 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004086 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4087 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004088 self.evt1.set()
4089 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004090 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004091 if first_seg is None:
4092 # Data not arrived (can happen under Windows), wait a bit
4093 time.sleep(0.5)
4094 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004095 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004096 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004097 self.assertEqual(n, 3)
4098 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004099 self.assertEqual(msg, self.read_msg)
4100 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4101 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004102
4103 def _testSmallReadNonBlocking(self):
4104 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004105 self.write_file.write(self.write_msg)
4106 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004107 self.evt2.set()
4108 # Avoid cloding the socket before the server test has finished,
4109 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4110 self.serv_finished.wait(5.0)
4111
4112 def testWriteNonBlocking(self):
4113 self.cli_finished.wait(5.0)
4114 # The client thread can't skip directly - the SkipTest exception
4115 # would appear as a failure.
4116 if self.serv_skipped:
4117 self.skipTest(self.serv_skipped)
4118
4119 def _testWriteNonBlocking(self):
4120 self.serv_skipped = None
4121 self.serv_conn.setblocking(False)
4122 # Try to saturate the socket buffer pipe with repeated large writes.
4123 BIG = b"x" * (1024 ** 2)
4124 LIMIT = 10
4125 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004126 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004127 self.assertGreater(n, 0)
4128 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004129 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004130 if n is None:
4131 # Succeeded
4132 break
4133 self.assertGreater(n, 0)
4134 else:
4135 # Let us know that this test didn't manage to establish
4136 # the expected conditions. This is not a failure in itself but,
4137 # if it happens repeatedly, the test should be fixed.
4138 self.serv_skipped = "failed to saturate the socket buffer"
4139
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004140
Guido van Rossum8c943832002-08-08 01:00:28 +00004141class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4142
4143 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4144
4145
4146class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4147
4148 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004149
Thomas Woutersb2137042007-02-01 18:02:27 +00004150
Antoine Pitrou834bd812010-10-13 16:17:14 +00004151class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4152 """Tests for socket.makefile() in text mode (rather than binary)"""
4153
4154 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004155 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004156 write_mode = 'wb'
4157 write_msg = MSG
4158 newline = ''
4159
4160
4161class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4162 """Tests for socket.makefile() in text mode (rather than binary)"""
4163
4164 read_mode = 'rb'
4165 read_msg = MSG
4166 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004167 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004168 newline = ''
4169
4170
4171class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4172 """Tests for socket.makefile() in text mode (rather than binary)"""
4173
4174 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004175 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004176 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004177 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004178 newline = ''
4179
4180
Guido van Rossumd8faa362007-04-27 19:54:29 +00004181class NetworkConnectionTest(object):
4182 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004183
Guido van Rossumd8faa362007-04-27 19:54:29 +00004184 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004185 # We're inherited below by BasicTCPTest2, which also inherits
4186 # BasicTCPTest, which defines self.port referenced below.
4187 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004188 self.serv_conn = self.cli
4189
4190class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4191 """Tests that NetworkConnection does not break existing TCP functionality.
4192 """
4193
4194class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004195
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004196 class MockSocket(socket.socket):
4197 def connect(self, *args):
4198 raise socket.timeout('timed out')
4199
4200 @contextlib.contextmanager
4201 def mocked_socket_module(self):
4202 """Return a socket which times out on connect"""
4203 old_socket = socket.socket
4204 socket.socket = self.MockSocket
4205 try:
4206 yield
4207 finally:
4208 socket.socket = old_socket
4209
4210 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004211 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004212 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004213 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004214 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004215 cli.connect((HOST, port))
4216 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4217
4218 def test_create_connection(self):
4219 # Issue #9792: errors raised by create_connection() should have
4220 # a proper errno attribute.
4221 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004222 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004223 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004224
4225 # Issue #16257: create_connection() calls getaddrinfo() against
4226 # 'localhost'. This may result in an IPV6 addr being returned
4227 # as well as an IPV4 one:
4228 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4229 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4230 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4231 #
4232 # create_connection() enumerates through all the addresses returned
4233 # and if it doesn't successfully bind to any of them, it propagates
4234 # the last exception it encountered.
4235 #
4236 # On Solaris, ENETUNREACH is returned in this circumstance instead
4237 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4238 # expected errnos.
4239 expected_errnos = [ errno.ECONNREFUSED, ]
4240 if hasattr(errno, 'ENETUNREACH'):
4241 expected_errnos.append(errno.ENETUNREACH)
4242
4243 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004244
4245 def test_create_connection_timeout(self):
4246 # Issue #9792: create_connection() should not recast timeout errors
4247 # as generic socket errors.
4248 with self.mocked_socket_module():
4249 with self.assertRaises(socket.timeout):
4250 socket.create_connection((HOST, 1234))
4251
Guido van Rossumd8faa362007-04-27 19:54:29 +00004252
Victor Stinner45df8202010-04-28 22:31:17 +00004253@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004254class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4255
4256 def __init__(self, methodName='runTest'):
4257 SocketTCPTest.__init__(self, methodName=methodName)
4258 ThreadableTest.__init__(self)
4259
4260 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004261 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004262
4263 def clientTearDown(self):
4264 self.cli.close()
4265 self.cli = None
4266 ThreadableTest.clientTearDown(self)
4267
4268 def _justAccept(self):
4269 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004270 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004271
4272 testFamily = _justAccept
4273 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004274 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004275 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004276 self.assertEqual(self.cli.family, 2)
4277
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004278 testSourceAddress = _justAccept
4279 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004280 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4281 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004282 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004283 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004284 # The port number being used is sufficient to show that the bind()
4285 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004286
Guido van Rossumd8faa362007-04-27 19:54:29 +00004287 testTimeoutDefault = _justAccept
4288 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004289 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004290 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004291 socket.setdefaulttimeout(42)
4292 try:
4293 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004294 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004295 finally:
4296 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004297 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004298
4299 testTimeoutNone = _justAccept
4300 def _testTimeoutNone(self):
4301 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004302 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004303 socket.setdefaulttimeout(30)
4304 try:
4305 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004306 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004307 finally:
4308 socket.setdefaulttimeout(None)
4309 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004310
4311 testTimeoutValueNamed = _justAccept
4312 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004313 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004314 self.assertEqual(self.cli.gettimeout(), 30)
4315
4316 testTimeoutValueNonamed = _justAccept
4317 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004318 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004319 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004320 self.assertEqual(self.cli.gettimeout(), 30)
4321
Victor Stinner45df8202010-04-28 22:31:17 +00004322@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004323class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4324
4325 def __init__(self, methodName='runTest'):
4326 SocketTCPTest.__init__(self, methodName=methodName)
4327 ThreadableTest.__init__(self)
4328
4329 def clientSetUp(self):
4330 pass
4331
4332 def clientTearDown(self):
4333 self.cli.close()
4334 self.cli = None
4335 ThreadableTest.clientTearDown(self)
4336
4337 def testInsideTimeout(self):
4338 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004339 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004340 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004341 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004342 testOutsideTimeout = testInsideTimeout
4343
4344 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004345 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004346 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004347 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004348
4349 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004350 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004351 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004352
4353
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004354class TCPTimeoutTest(SocketTCPTest):
4355
4356 def testTCPTimeout(self):
4357 def raise_timeout(*args, **kwargs):
4358 self.serv.settimeout(1.0)
4359 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004360 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004361 "Error generating a timeout exception (TCP)")
4362
4363 def testTimeoutZero(self):
4364 ok = False
4365 try:
4366 self.serv.settimeout(0.0)
4367 foo = self.serv.accept()
4368 except socket.timeout:
4369 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004370 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004371 ok = True
4372 except:
4373 self.fail("caught unexpected exception (TCP)")
4374 if not ok:
4375 self.fail("accept() returned success when we did not expect it")
4376
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004377 def testInterruptedTimeout(self):
4378 # XXX I don't know how to do this test on MSWindows or any other
4379 # plaform that doesn't support signal.alarm() or os.kill(), though
4380 # the bug should have existed on all platforms.
4381 if not hasattr(signal, "alarm"):
4382 return # can only test on *nix
4383 self.serv.settimeout(5.0) # must be longer than alarm
4384 class Alarm(Exception):
4385 pass
4386 def alarm_handler(signal, frame):
4387 raise Alarm
4388 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4389 try:
4390 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4391 try:
4392 foo = self.serv.accept()
4393 except socket.timeout:
4394 self.fail("caught timeout instead of Alarm")
4395 except Alarm:
4396 pass
4397 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004398 self.fail("caught other exception instead of Alarm:"
4399 " %s(%s):\n%s" %
4400 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004401 else:
4402 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004403 finally:
4404 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004405 except Alarm:
4406 self.fail("got Alarm in wrong place")
4407 finally:
4408 # no alarm can be pending. Safe to restore old handler.
4409 signal.signal(signal.SIGALRM, old_alarm)
4410
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004411class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004412
4413 def testUDPTimeout(self):
4414 def raise_timeout(*args, **kwargs):
4415 self.serv.settimeout(1.0)
4416 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004417 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004418 "Error generating a timeout exception (UDP)")
4419
4420 def testTimeoutZero(self):
4421 ok = False
4422 try:
4423 self.serv.settimeout(0.0)
4424 foo = self.serv.recv(1024)
4425 except socket.timeout:
4426 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004427 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004428 ok = True
4429 except:
4430 self.fail("caught unexpected exception (UDP)")
4431 if not ok:
4432 self.fail("recv() returned success when we did not expect it")
4433
4434class TestExceptions(unittest.TestCase):
4435
4436 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004437 self.assertTrue(issubclass(OSError, Exception))
4438 self.assertTrue(issubclass(socket.herror, OSError))
4439 self.assertTrue(issubclass(socket.gaierror, OSError))
4440 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004441
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004442class TestLinuxAbstractNamespace(unittest.TestCase):
4443
4444 UNIX_PATH_MAX = 108
4445
4446 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004447 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004448 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4449 s1.bind(address)
4450 s1.listen(1)
4451 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4452 s2.connect(s1.getsockname())
4453 with s1.accept()[0] as s3:
4454 self.assertEqual(s1.getsockname(), address)
4455 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004456
4457 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004458 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004459 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4460 s.bind(address)
4461 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004462
4463 def testNameOverflow(self):
4464 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004465 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004466 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004467
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004468 def testStrName(self):
4469 # Check that an abstract name can be passed as a string.
4470 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4471 try:
4472 s.bind("\x00python\x00test\x00")
4473 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4474 finally:
4475 s.close()
4476
4477class TestUnixDomain(unittest.TestCase):
4478
4479 def setUp(self):
4480 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4481
4482 def tearDown(self):
4483 self.sock.close()
4484
4485 def encoded(self, path):
4486 # Return the given path encoded in the file system encoding,
4487 # or skip the test if this is not possible.
4488 try:
4489 return os.fsencode(path)
4490 except UnicodeEncodeError:
4491 self.skipTest(
4492 "Pathname {0!a} cannot be represented in file "
4493 "system encoding {1!r}".format(
4494 path, sys.getfilesystemencoding()))
4495
Antoine Pitrou16374872011-12-16 15:04:12 +01004496 def bind(self, sock, path):
4497 # Bind the socket
4498 try:
4499 sock.bind(path)
4500 except OSError as e:
4501 if str(e) == "AF_UNIX path too long":
4502 self.skipTest(
4503 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4504 .format(path))
4505 else:
4506 raise
4507
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004508 def testStrAddr(self):
4509 # Test binding to and retrieving a normal string pathname.
4510 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004511 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004512 self.addCleanup(support.unlink, path)
4513 self.assertEqual(self.sock.getsockname(), path)
4514
4515 def testBytesAddr(self):
4516 # Test binding to a bytes pathname.
4517 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004518 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004519 self.addCleanup(support.unlink, path)
4520 self.assertEqual(self.sock.getsockname(), path)
4521
4522 def testSurrogateescapeBind(self):
4523 # Test binding to a valid non-ASCII pathname, with the
4524 # non-ASCII bytes supplied using surrogateescape encoding.
4525 path = os.path.abspath(support.TESTFN_UNICODE)
4526 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004527 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004528 self.addCleanup(support.unlink, path)
4529 self.assertEqual(self.sock.getsockname(), path)
4530
4531 def testUnencodableAddr(self):
4532 # Test binding to a pathname that cannot be encoded in the
4533 # file system encoding.
4534 if support.TESTFN_UNENCODABLE is None:
4535 self.skipTest("No unencodable filename available")
4536 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004537 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004538 self.addCleanup(support.unlink, path)
4539 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004540
Victor Stinner45df8202010-04-28 22:31:17 +00004541@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004542class BufferIOTest(SocketConnectedTest):
4543 """
4544 Test the buffer versions of socket.recv() and socket.send().
4545 """
4546 def __init__(self, methodName='runTest'):
4547 SocketConnectedTest.__init__(self, methodName=methodName)
4548
Antoine Pitrou25480782010-03-17 22:50:28 +00004549 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004550 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004551 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004552 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004553 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004554 self.assertEqual(msg, MSG)
4555
Antoine Pitrou25480782010-03-17 22:50:28 +00004556 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004557 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004558 self.serv_conn.send(buf)
4559
Antoine Pitrou25480782010-03-17 22:50:28 +00004560 def testRecvIntoBytearray(self):
4561 buf = bytearray(1024)
4562 nbytes = self.cli_conn.recv_into(buf)
4563 self.assertEqual(nbytes, len(MSG))
4564 msg = buf[:len(MSG)]
4565 self.assertEqual(msg, MSG)
4566
4567 _testRecvIntoBytearray = _testRecvIntoArray
4568
4569 def testRecvIntoMemoryview(self):
4570 buf = bytearray(1024)
4571 nbytes = self.cli_conn.recv_into(memoryview(buf))
4572 self.assertEqual(nbytes, len(MSG))
4573 msg = buf[:len(MSG)]
4574 self.assertEqual(msg, MSG)
4575
4576 _testRecvIntoMemoryview = _testRecvIntoArray
4577
4578 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004579 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004580 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004581 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004582 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004583 self.assertEqual(msg, MSG)
4584
Antoine Pitrou25480782010-03-17 22:50:28 +00004585 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004586 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004587 self.serv_conn.send(buf)
4588
Antoine Pitrou25480782010-03-17 22:50:28 +00004589 def testRecvFromIntoBytearray(self):
4590 buf = bytearray(1024)
4591 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4592 self.assertEqual(nbytes, len(MSG))
4593 msg = buf[:len(MSG)]
4594 self.assertEqual(msg, MSG)
4595
4596 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4597
4598 def testRecvFromIntoMemoryview(self):
4599 buf = bytearray(1024)
4600 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4601 self.assertEqual(nbytes, len(MSG))
4602 msg = buf[:len(MSG)]
4603 self.assertEqual(msg, MSG)
4604
4605 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4606
Christian Heimes043d6f62008-01-07 17:19:16 +00004607
4608TIPC_STYPE = 2000
4609TIPC_LOWER = 200
4610TIPC_UPPER = 210
4611
4612def isTipcAvailable():
4613 """Check if the TIPC module is loaded
4614
4615 The TIPC module is not loaded automatically on Ubuntu and probably
4616 other Linux distros.
4617 """
4618 if not hasattr(socket, "AF_TIPC"):
4619 return False
4620 if not os.path.isfile("/proc/modules"):
4621 return False
4622 with open("/proc/modules") as f:
4623 for line in f:
4624 if line.startswith("tipc "):
4625 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004626 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004627 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4628 return False
4629
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004630class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004631 def testRDM(self):
4632 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4633 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004634 self.addCleanup(srv.close)
4635 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004636
4637 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4638 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4639 TIPC_LOWER, TIPC_UPPER)
4640 srv.bind(srvaddr)
4641
4642 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4643 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4644 cli.sendto(MSG, sendaddr)
4645
4646 msg, recvaddr = srv.recvfrom(1024)
4647
4648 self.assertEqual(cli.getsockname(), recvaddr)
4649 self.assertEqual(msg, MSG)
4650
4651
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004652class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004653 def __init__(self, methodName = 'runTest'):
4654 unittest.TestCase.__init__(self, methodName = methodName)
4655 ThreadableTest.__init__(self)
4656
4657 def setUp(self):
4658 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004659 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004660 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4661 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4662 TIPC_LOWER, TIPC_UPPER)
4663 self.srv.bind(srvaddr)
4664 self.srv.listen(5)
4665 self.serverExplicitReady()
4666 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004667 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004668
4669 def clientSetUp(self):
4670 # The is a hittable race between serverExplicitReady() and the
4671 # accept() call; sleep a little while to avoid it, otherwise
4672 # we could get an exception
4673 time.sleep(0.1)
4674 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004675 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004676 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4677 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4678 self.cli.connect(addr)
4679 self.cliaddr = self.cli.getsockname()
4680
4681 def testStream(self):
4682 msg = self.conn.recv(1024)
4683 self.assertEqual(msg, MSG)
4684 self.assertEqual(self.cliaddr, self.connaddr)
4685
4686 def _testStream(self):
4687 self.cli.send(MSG)
4688 self.cli.close()
4689
4690
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004691@unittest.skipUnless(thread, 'Threading required for this test.')
4692class ContextManagersTest(ThreadedTCPSocketTest):
4693
4694 def _testSocketClass(self):
4695 # base test
4696 with socket.socket() as sock:
4697 self.assertFalse(sock._closed)
4698 self.assertTrue(sock._closed)
4699 # close inside with block
4700 with socket.socket() as sock:
4701 sock.close()
4702 self.assertTrue(sock._closed)
4703 # exception inside with block
4704 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004705 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004706 self.assertTrue(sock._closed)
4707
4708 def testCreateConnectionBase(self):
4709 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004710 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004711 data = conn.recv(1024)
4712 conn.sendall(data)
4713
4714 def _testCreateConnectionBase(self):
4715 address = self.serv.getsockname()
4716 with socket.create_connection(address) as sock:
4717 self.assertFalse(sock._closed)
4718 sock.sendall(b'foo')
4719 self.assertEqual(sock.recv(1024), b'foo')
4720 self.assertTrue(sock._closed)
4721
4722 def testCreateConnectionClose(self):
4723 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004724 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004725 data = conn.recv(1024)
4726 conn.sendall(data)
4727
4728 def _testCreateConnectionClose(self):
4729 address = self.serv.getsockname()
4730 with socket.create_connection(address) as sock:
4731 sock.close()
4732 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004733 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004734
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004735
Antoine Pitroub1c54962010-10-14 15:05:38 +00004736@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4737 "SOCK_CLOEXEC not defined")
4738@unittest.skipUnless(fcntl, "module fcntl not available")
4739class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004740 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004741 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004742 with socket.socket(socket.AF_INET,
4743 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4744 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4745 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004746
4747
4748@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4749 "SOCK_NONBLOCK not defined")
4750class NonblockConstantTest(unittest.TestCase):
4751 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4752 if nonblock:
4753 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4754 self.assertEqual(s.gettimeout(), timeout)
4755 else:
4756 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4757 self.assertEqual(s.gettimeout(), None)
4758
Charles-François Natali239bb962011-06-03 12:55:15 +02004759 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004760 def test_SOCK_NONBLOCK(self):
4761 # a lot of it seems silly and redundant, but I wanted to test that
4762 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004763 with socket.socket(socket.AF_INET,
4764 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4765 self.checkNonblock(s)
4766 s.setblocking(1)
4767 self.checkNonblock(s, False)
4768 s.setblocking(0)
4769 self.checkNonblock(s)
4770 s.settimeout(None)
4771 self.checkNonblock(s, False)
4772 s.settimeout(2.0)
4773 self.checkNonblock(s, timeout=2.0)
4774 s.setblocking(1)
4775 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004776 # defaulttimeout
4777 t = socket.getdefaulttimeout()
4778 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004779 with socket.socket() as s:
4780 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004781 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004782 with socket.socket() as s:
4783 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004784 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004785 with socket.socket() as s:
4786 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004787 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004788 with socket.socket() as s:
4789 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004790 socket.setdefaulttimeout(t)
4791
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004792
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004793@unittest.skipUnless(os.name == "nt", "Windows specific")
4794@unittest.skipUnless(multiprocessing, "need multiprocessing")
4795class TestSocketSharing(SocketTCPTest):
4796 # This must be classmethod and not staticmethod or multiprocessing
4797 # won't be able to bootstrap it.
4798 @classmethod
4799 def remoteProcessServer(cls, q):
4800 # Recreate socket from shared data
4801 sdata = q.get()
4802 message = q.get()
4803
4804 s = socket.fromshare(sdata)
4805 s2, c = s.accept()
4806
4807 # Send the message
4808 s2.sendall(message)
4809 s2.close()
4810 s.close()
4811
4812 def testShare(self):
4813 # Transfer the listening server socket to another process
4814 # and service it from there.
4815
4816 # Create process:
4817 q = multiprocessing.Queue()
4818 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4819 p.start()
4820
4821 # Get the shared socket data
4822 data = self.serv.share(p.pid)
4823
4824 # Pass the shared socket to the other process
4825 addr = self.serv.getsockname()
4826 self.serv.close()
4827 q.put(data)
4828
4829 # The data that the server will send us
4830 message = b"slapmahfro"
4831 q.put(message)
4832
4833 # Connect
4834 s = socket.create_connection(addr)
4835 # listen for the data
4836 m = []
4837 while True:
4838 data = s.recv(100)
4839 if not data:
4840 break
4841 m.append(data)
4842 s.close()
4843 received = b"".join(m)
4844 self.assertEqual(received, message)
4845 p.join()
4846
4847 def testShareLength(self):
4848 data = self.serv.share(os.getpid())
4849 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4850 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4851
4852 def compareSockets(self, org, other):
4853 # socket sharing is expected to work only for blocking socket
4854 # since the internal python timout value isn't transfered.
4855 self.assertEqual(org.gettimeout(), None)
4856 self.assertEqual(org.gettimeout(), other.gettimeout())
4857
4858 self.assertEqual(org.family, other.family)
4859 self.assertEqual(org.type, other.type)
4860 # If the user specified "0" for proto, then
4861 # internally windows will have picked the correct value.
4862 # Python introspection on the socket however will still return
4863 # 0. For the shared socket, the python value is recreated
4864 # from the actual value, so it may not compare correctly.
4865 if org.proto != 0:
4866 self.assertEqual(org.proto, other.proto)
4867
4868 def testShareLocal(self):
4869 data = self.serv.share(os.getpid())
4870 s = socket.fromshare(data)
4871 try:
4872 self.compareSockets(self.serv, s)
4873 finally:
4874 s.close()
4875
4876 def testTypes(self):
4877 families = [socket.AF_INET, socket.AF_INET6]
4878 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4879 for f in families:
4880 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00004881 try:
4882 source = socket.socket(f, t)
4883 except OSError:
4884 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004885 try:
4886 data = source.share(os.getpid())
4887 shared = socket.fromshare(data)
4888 try:
4889 self.compareSockets(source, shared)
4890 finally:
4891 shared.close()
4892 finally:
4893 source.close()
4894
4895
Guido van Rossumb995eb72002-07-31 16:08:40 +00004896def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004897 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004898 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004899
4900 tests.extend([
4901 NonBlockingTCPTests,
4902 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004903 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004904 UnbufferedFileObjectClassTestCase,
4905 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004906 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004907 UnicodeReadFileObjectClassTestCase,
4908 UnicodeWriteFileObjectClassTestCase,
4909 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004910 NetworkConnectionNoServer,
4911 NetworkConnectionAttributesTest,
4912 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004913 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004914 CloexecConstantTest,
4915 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004916 ])
Dave Cole331708b2004-08-09 04:51:41 +00004917 if hasattr(socket, "socketpair"):
4918 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004919 if hasattr(socket, "AF_UNIX"):
4920 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004921 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004922 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004923 if isTipcAvailable():
4924 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004925 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004926 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004927 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004928 tests.extend([
4929 CmsgMacroTests,
4930 SendmsgUDPTest,
4931 RecvmsgUDPTest,
4932 RecvmsgIntoUDPTest,
4933 SendmsgUDP6Test,
4934 RecvmsgUDP6Test,
4935 RecvmsgRFC3542AncillaryUDP6Test,
4936 RecvmsgIntoRFC3542AncillaryUDP6Test,
4937 RecvmsgIntoUDP6Test,
4938 SendmsgTCPTest,
4939 RecvmsgTCPTest,
4940 RecvmsgIntoTCPTest,
4941 SendmsgSCTPStreamTest,
4942 RecvmsgSCTPStreamTest,
4943 RecvmsgIntoSCTPStreamTest,
4944 SendmsgUnixStreamTest,
4945 RecvmsgUnixStreamTest,
4946 RecvmsgIntoUnixStreamTest,
4947 RecvmsgSCMRightsStreamTest,
4948 RecvmsgIntoSCMRightsStreamTest,
4949 # These are slow when setitimer() is not available
4950 InterruptedRecvTimeoutTest,
4951 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004952 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004953 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004954
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004955 thread_info = support.threading_setup()
4956 support.run_unittest(*tests)
4957 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004958
4959if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004960 test_main()