blob: c7b9ba8dd79b434b361daf9206f626644af6e495 [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:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000026 import multiprocessing
27except ImportError:
28 multiprocessing = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000029
Benjamin Petersonee8712c2008-05-20 21:35:26 +000030HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000031MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000032
Victor Stinner45df8202010-04-28 22:31:17 +000033try:
34 import _thread as thread
35 import threading
36except ImportError:
37 thread = None
38 threading = None
39
Charles-François Natali47413c12011-10-06 19:47:44 +020040def _have_socket_can():
41 """Check whether CAN sockets are supported on this host."""
42 try:
43 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020044 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020045 return False
46 else:
47 s.close()
48 return True
49
Charles-François Natali10b8cf42011-11-10 19:21:37 +010050def _have_socket_rds():
51 """Check whether RDS sockets are supported on this host."""
52 try:
53 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
54 except (AttributeError, OSError):
55 return False
56 else:
57 s.close()
58 return True
59
Charles-François Natali47413c12011-10-06 19:47:44 +020060HAVE_SOCKET_CAN = _have_socket_can()
61
Charles-François Natali10b8cf42011-11-10 19:21:37 +010062HAVE_SOCKET_RDS = _have_socket_rds()
63
Nick Coghlan96fe56a2011-08-22 11:55:57 +100064# Size in bytes of the int type
65SIZEOF_INT = array.array("i").itemsize
66
Guido van Rossum24e4af82002-06-12 19:18:08 +000067class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000068
Guido van Rossum24e4af82002-06-12 19:18:08 +000069 def setUp(self):
70 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000071 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000072 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000073
Guido van Rossum24e4af82002-06-12 19:18:08 +000074 def tearDown(self):
75 self.serv.close()
76 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000077
Guido van Rossum24e4af82002-06-12 19:18:08 +000078class SocketUDPTest(unittest.TestCase):
79
80 def setUp(self):
81 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000082 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000083
84 def tearDown(self):
85 self.serv.close()
86 self.serv = None
87
Nick Coghlan96fe56a2011-08-22 11:55:57 +100088class ThreadSafeCleanupTestCase(unittest.TestCase):
89 """Subclass of unittest.TestCase with thread-safe cleanup methods.
90
91 This subclass protects the addCleanup() and doCleanups() methods
92 with a recursive lock.
93 """
94
95 if threading:
96 def __init__(self, *args, **kwargs):
97 super().__init__(*args, **kwargs)
98 self._cleanup_lock = threading.RLock()
99
100 def addCleanup(self, *args, **kwargs):
101 with self._cleanup_lock:
102 return super().addCleanup(*args, **kwargs)
103
104 def doCleanups(self, *args, **kwargs):
105 with self._cleanup_lock:
106 return super().doCleanups(*args, **kwargs)
107
Charles-François Natali47413c12011-10-06 19:47:44 +0200108class SocketCANTest(unittest.TestCase):
109
110 """To be able to run this test, a `vcan0` CAN interface can be created with
111 the following commands:
112 # modprobe vcan
113 # ip link add dev vcan0 type vcan
114 # ifconfig vcan0 up
115 """
116 interface = 'vcan0'
117 bufsize = 128
118
Charles-François Natali773e42d2013-02-05 19:42:01 +0100119 """The CAN frame structure is defined in <linux/can.h>:
120
121 struct can_frame {
122 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
123 __u8 can_dlc; /* data length code: 0 .. 8 */
124 __u8 data[8] __attribute__((aligned(8)));
125 };
126 """
127 can_frame_fmt = "=IB3x8s"
128 can_frame_size = struct.calcsize(can_frame_fmt)
129
130 """The Broadcast Management Command frame structure is defined
131 in <linux/can/bcm.h>:
132
133 struct bcm_msg_head {
134 __u32 opcode;
135 __u32 flags;
136 __u32 count;
137 struct timeval ival1, ival2;
138 canid_t can_id;
139 __u32 nframes;
140 struct can_frame frames[0];
141 }
142
143 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
144 `struct can_frame` definition). Must use native not standard types for packing.
145 """
146 bcm_cmd_msg_fmt = "@3I4l2I"
147 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
148
Charles-François Natali47413c12011-10-06 19:47:44 +0200149 def setUp(self):
150 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200151 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200152 try:
153 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200154 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200155 self.skipTest('network interface `%s` does not exist' %
156 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200157
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100158
159class SocketRDSTest(unittest.TestCase):
160
161 """To be able to run this test, the `rds` kernel module must be loaded:
162 # modprobe rds
163 """
164 bufsize = 8192
165
166 def setUp(self):
167 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
168 self.addCleanup(self.serv.close)
169 try:
170 self.port = support.bind_port(self.serv)
171 except OSError:
172 self.skipTest('unable to bind RDS socket')
173
174
Guido van Rossum24e4af82002-06-12 19:18:08 +0000175class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000176 """Threadable Test class
177
178 The ThreadableTest class makes it easy to create a threaded
179 client/server pair from an existing unit test. To create a
180 new threaded class from an existing unit test, use multiple
181 inheritance:
182
183 class NewClass (OldClass, ThreadableTest):
184 pass
185
186 This class defines two new fixture functions with obvious
187 purposes for overriding:
188
189 clientSetUp ()
190 clientTearDown ()
191
192 Any new test functions within the class must then define
193 tests in pairs, where the test name is preceeded with a
194 '_' to indicate the client portion of the test. Ex:
195
196 def testFoo(self):
197 # Server portion
198
199 def _testFoo(self):
200 # Client portion
201
202 Any exceptions raised by the clients during their tests
203 are caught and transferred to the main thread to alert
204 the testing framework.
205
206 Note, the server setup function cannot call any blocking
207 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000208 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000209 the blocking call (such as in setting up a client/server
210 connection and performing the accept() in setUp().
211 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000212
213 def __init__(self):
214 # Swap the true setup function
215 self.__setUp = self.setUp
216 self.__tearDown = self.tearDown
217 self.setUp = self._setUp
218 self.tearDown = self._tearDown
219
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000220 def serverExplicitReady(self):
221 """This method allows the server to explicitly indicate that
222 it wants the client thread to proceed. This is useful if the
223 server is about to execute a blocking routine that is
224 dependent upon the client thread during its setup routine."""
225 self.server_ready.set()
226
Guido van Rossum24e4af82002-06-12 19:18:08 +0000227 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000228 self.server_ready = threading.Event()
229 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000230 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000231 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200232 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000233
234 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000235 methodname = self.id()
236 i = methodname.rfind('.')
237 methodname = methodname[i+1:]
238 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000239 self.client_thread = thread.start_new_thread(
240 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000241
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200242 try:
243 self.__setUp()
244 except:
245 self.server_crashed = True
246 raise
247 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000248 self.server_ready.set()
249 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250
251 def _tearDown(self):
252 self.__tearDown()
253 self.done.wait()
254
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000255 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000256 exc = self.queue.get()
257 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000258
259 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000260 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000261 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200262 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200263 if self.server_crashed:
264 self.clientTearDown()
265 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000266 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000267 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000268 try:
269 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000270 except BaseException as e:
271 self.queue.put(e)
272 finally:
273 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000274
275 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000276 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277
278 def clientTearDown(self):
279 self.done.set()
280 thread.exit()
281
282class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
283
284 def __init__(self, methodName='runTest'):
285 SocketTCPTest.__init__(self, methodName=methodName)
286 ThreadableTest.__init__(self)
287
288 def clientSetUp(self):
289 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
290
291 def clientTearDown(self):
292 self.cli.close()
293 self.cli = None
294 ThreadableTest.clientTearDown(self)
295
296class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
297
298 def __init__(self, methodName='runTest'):
299 SocketUDPTest.__init__(self, methodName=methodName)
300 ThreadableTest.__init__(self)
301
302 def clientSetUp(self):
303 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
304
Brian Curtin3beb38f2010-11-04 03:41:43 +0000305 def clientTearDown(self):
306 self.cli.close()
307 self.cli = None
308 ThreadableTest.clientTearDown(self)
309
Charles-François Natali47413c12011-10-06 19:47:44 +0200310class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
311
312 def __init__(self, methodName='runTest'):
313 SocketCANTest.__init__(self, methodName=methodName)
314 ThreadableTest.__init__(self)
315
316 def clientSetUp(self):
317 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
318 try:
319 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200320 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200321 # skipTest should not be called here, and will be called in the
322 # server instead
323 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200324
325 def clientTearDown(self):
326 self.cli.close()
327 self.cli = None
328 ThreadableTest.clientTearDown(self)
329
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100330class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
331
332 def __init__(self, methodName='runTest'):
333 SocketRDSTest.__init__(self, methodName=methodName)
334 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100335
336 def clientSetUp(self):
337 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
338 try:
339 # RDS sockets must be bound explicitly to send or receive data
340 self.cli.bind((HOST, 0))
341 self.cli_addr = self.cli.getsockname()
342 except OSError:
343 # skipTest should not be called here, and will be called in the
344 # server instead
345 pass
346
347 def clientTearDown(self):
348 self.cli.close()
349 self.cli = None
350 ThreadableTest.clientTearDown(self)
351
Guido van Rossum24e4af82002-06-12 19:18:08 +0000352class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000353 """Socket tests for client-server connection.
354
355 self.cli_conn is a client socket connected to the server. The
356 setUp() method guarantees that it is connected to the server.
357 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000358
359 def __init__(self, methodName='runTest'):
360 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
361
362 def setUp(self):
363 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000364 # Indicate explicitly we're ready for the client thread to
365 # proceed and then perform the blocking call to accept
366 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000367 conn, addr = self.serv.accept()
368 self.cli_conn = conn
369
370 def tearDown(self):
371 self.cli_conn.close()
372 self.cli_conn = None
373 ThreadedTCPSocketTest.tearDown(self)
374
375 def clientSetUp(self):
376 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000377 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000378 self.serv_conn = self.cli
379
380 def clientTearDown(self):
381 self.serv_conn.close()
382 self.serv_conn = None
383 ThreadedTCPSocketTest.clientTearDown(self)
384
Dave Cole331708b2004-08-09 04:51:41 +0000385class SocketPairTest(unittest.TestCase, ThreadableTest):
386
387 def __init__(self, methodName='runTest'):
388 unittest.TestCase.__init__(self, methodName=methodName)
389 ThreadableTest.__init__(self)
390
391 def setUp(self):
392 self.serv, self.cli = socket.socketpair()
393
394 def tearDown(self):
395 self.serv.close()
396 self.serv = None
397
398 def clientSetUp(self):
399 pass
400
401 def clientTearDown(self):
402 self.cli.close()
403 self.cli = None
404 ThreadableTest.clientTearDown(self)
405
Tim Peters494aaee2004-08-09 18:54:11 +0000406
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000407# The following classes are used by the sendmsg()/recvmsg() tests.
408# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
409# gives a drop-in replacement for SocketConnectedTest, but different
410# address families can be used, and the attributes serv_addr and
411# cli_addr will be set to the addresses of the endpoints.
412
413class SocketTestBase(unittest.TestCase):
414 """A base class for socket tests.
415
416 Subclasses must provide methods newSocket() to return a new socket
417 and bindSock(sock) to bind it to an unused address.
418
419 Creates a socket self.serv and sets self.serv_addr to its address.
420 """
421
422 def setUp(self):
423 self.serv = self.newSocket()
424 self.bindServer()
425
426 def bindServer(self):
427 """Bind server socket and set self.serv_addr to its address."""
428 self.bindSock(self.serv)
429 self.serv_addr = self.serv.getsockname()
430
431 def tearDown(self):
432 self.serv.close()
433 self.serv = None
434
435
436class SocketListeningTestMixin(SocketTestBase):
437 """Mixin to listen on the server socket."""
438
439 def setUp(self):
440 super().setUp()
441 self.serv.listen(1)
442
443
444class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
445 ThreadableTest):
446 """Mixin to add client socket and allow client/server tests.
447
448 Client socket is self.cli and its address is self.cli_addr. See
449 ThreadableTest for usage information.
450 """
451
452 def __init__(self, *args, **kwargs):
453 super().__init__(*args, **kwargs)
454 ThreadableTest.__init__(self)
455
456 def clientSetUp(self):
457 self.cli = self.newClientSocket()
458 self.bindClient()
459
460 def newClientSocket(self):
461 """Return a new socket for use as client."""
462 return self.newSocket()
463
464 def bindClient(self):
465 """Bind client socket and set self.cli_addr to its address."""
466 self.bindSock(self.cli)
467 self.cli_addr = self.cli.getsockname()
468
469 def clientTearDown(self):
470 self.cli.close()
471 self.cli = None
472 ThreadableTest.clientTearDown(self)
473
474
475class ConnectedStreamTestMixin(SocketListeningTestMixin,
476 ThreadedSocketTestMixin):
477 """Mixin to allow client/server stream tests with connected client.
478
479 Server's socket representing connection to client is self.cli_conn
480 and client's connection to server is self.serv_conn. (Based on
481 SocketConnectedTest.)
482 """
483
484 def setUp(self):
485 super().setUp()
486 # Indicate explicitly we're ready for the client thread to
487 # proceed and then perform the blocking call to accept
488 self.serverExplicitReady()
489 conn, addr = self.serv.accept()
490 self.cli_conn = conn
491
492 def tearDown(self):
493 self.cli_conn.close()
494 self.cli_conn = None
495 super().tearDown()
496
497 def clientSetUp(self):
498 super().clientSetUp()
499 self.cli.connect(self.serv_addr)
500 self.serv_conn = self.cli
501
502 def clientTearDown(self):
503 self.serv_conn.close()
504 self.serv_conn = None
505 super().clientTearDown()
506
507
508class UnixSocketTestBase(SocketTestBase):
509 """Base class for Unix-domain socket tests."""
510
511 # This class is used for file descriptor passing tests, so we
512 # create the sockets in a private directory so that other users
513 # can't send anything that might be problematic for a privileged
514 # user running the tests.
515
516 def setUp(self):
517 self.dir_path = tempfile.mkdtemp()
518 self.addCleanup(os.rmdir, self.dir_path)
519 super().setUp()
520
521 def bindSock(self, sock):
522 path = tempfile.mktemp(dir=self.dir_path)
523 sock.bind(path)
524 self.addCleanup(support.unlink, path)
525
526class UnixStreamBase(UnixSocketTestBase):
527 """Base class for Unix-domain SOCK_STREAM tests."""
528
529 def newSocket(self):
530 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
531
532
533class InetTestBase(SocketTestBase):
534 """Base class for IPv4 socket tests."""
535
536 host = HOST
537
538 def setUp(self):
539 super().setUp()
540 self.port = self.serv_addr[1]
541
542 def bindSock(self, sock):
543 support.bind_port(sock, host=self.host)
544
545class TCPTestBase(InetTestBase):
546 """Base class for TCP-over-IPv4 tests."""
547
548 def newSocket(self):
549 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
550
551class UDPTestBase(InetTestBase):
552 """Base class for UDP-over-IPv4 tests."""
553
554 def newSocket(self):
555 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
556
557class SCTPStreamBase(InetTestBase):
558 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
559
560 def newSocket(self):
561 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
562 socket.IPPROTO_SCTP)
563
564
565class Inet6TestBase(InetTestBase):
566 """Base class for IPv6 socket tests."""
567
568 # Don't use "localhost" here - it may not have an IPv6 address
569 # assigned to it by default (e.g. in /etc/hosts), and if someone
570 # has assigned it an IPv4-mapped address, then it's unlikely to
571 # work with the full IPv6 API.
572 host = "::1"
573
574class UDP6TestBase(Inet6TestBase):
575 """Base class for UDP-over-IPv6 tests."""
576
577 def newSocket(self):
578 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
579
580
581# Test-skipping decorators for use with ThreadableTest.
582
583def skipWithClientIf(condition, reason):
584 """Skip decorated test if condition is true, add client_skip decorator.
585
586 If the decorated object is not a class, sets its attribute
587 "client_skip" to a decorator which will return an empty function
588 if the test is to be skipped, or the original function if it is
589 not. This can be used to avoid running the client part of a
590 skipped test when using ThreadableTest.
591 """
592 def client_pass(*args, **kwargs):
593 pass
594 def skipdec(obj):
595 retval = unittest.skip(reason)(obj)
596 if not isinstance(obj, type):
597 retval.client_skip = lambda f: client_pass
598 return retval
599 def noskipdec(obj):
600 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
601 obj.client_skip = lambda f: f
602 return obj
603 return skipdec if condition else noskipdec
604
605
606def requireAttrs(obj, *attributes):
607 """Skip decorated test if obj is missing any of the given attributes.
608
609 Sets client_skip attribute as skipWithClientIf() does.
610 """
611 missing = [name for name in attributes if not hasattr(obj, name)]
612 return skipWithClientIf(
613 missing, "don't have " + ", ".join(name for name in missing))
614
615
616def requireSocket(*args):
617 """Skip decorated test if a socket cannot be created with given arguments.
618
619 When an argument is given as a string, will use the value of that
620 attribute of the socket module, or skip the test if it doesn't
621 exist. Sets client_skip attribute as skipWithClientIf() does.
622 """
623 err = None
624 missing = [obj for obj in args if
625 isinstance(obj, str) and not hasattr(socket, obj)]
626 if missing:
627 err = "don't have " + ", ".join(name for name in missing)
628 else:
629 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
630 for obj in args]
631 try:
632 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200633 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000634 # XXX: check errno?
635 err = str(e)
636 else:
637 s.close()
638 return skipWithClientIf(
639 err is not None,
640 "can't create socket({0}): {1}".format(
641 ", ".join(str(o) for o in args), err))
642
643
Guido van Rossum24e4af82002-06-12 19:18:08 +0000644#######################################################################
645## Begin Tests
646
647class GeneralModuleTests(unittest.TestCase):
648
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000649 def test_repr(self):
650 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200651 with s:
652 self.assertIn('fd=%i' % s.fileno(), repr(s))
653 self.assertIn('family=%i' % socket.AF_INET, repr(s))
654 self.assertIn('type=%i' % socket.SOCK_STREAM, repr(s))
655 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200656 self.assertNotIn('raddr', repr(s))
657 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200658 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200659 self.assertIn(str(s.getsockname()), repr(s))
660 self.assertIn('[closed]', repr(s))
661 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000662
Raymond Hettinger027bb632004-05-31 03:09:25 +0000663 def test_weakref(self):
664 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
665 p = proxy(s)
666 self.assertEqual(p.fileno(), s.fileno())
667 s.close()
668 s = None
669 try:
670 p.fileno()
671 except ReferenceError:
672 pass
673 else:
674 self.fail('Socket proxy still exists')
675
Guido van Rossum24e4af82002-06-12 19:18:08 +0000676 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000677 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300678 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200679 with self.assertRaises(OSError, msg=msg % 'OSError'):
680 raise OSError
681 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000682 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200683 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000684 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000685
Ezio Melotti63e42302011-05-07 19:47:48 +0300686 def testSendtoErrors(self):
687 # Testing that sendto doens't masks failures. See #10169.
688 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
689 self.addCleanup(s.close)
690 s.bind(('', 0))
691 sockname = s.getsockname()
692 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300693 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300694 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300695 self.assertEqual(str(cm.exception),
696 "'str' does not support the buffer interface")
697 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300698 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300699 self.assertEqual(str(cm.exception),
700 "'complex' does not support the buffer interface")
701 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300702 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300703 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300704 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300705 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300706 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300707 self.assertEqual(str(cm.exception),
708 "'str' does not support the buffer interface")
709 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300710 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300711 self.assertEqual(str(cm.exception),
712 "'complex' does not support the buffer interface")
713 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300714 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300715 self.assertIn('not NoneType', str(cm.exception))
716 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300717 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300718 self.assertIn('an integer is required', str(cm.exception))
719 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300720 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300721 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300722 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300723 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300724 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300725 self.assertIn('(1 given)', str(cm.exception))
726 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300727 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300728 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300729
Guido van Rossum24e4af82002-06-12 19:18:08 +0000730 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000731 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000732 socket.AF_INET
733 socket.SOCK_STREAM
734 socket.SOCK_DGRAM
735 socket.SOCK_RAW
736 socket.SOCK_RDM
737 socket.SOCK_SEQPACKET
738 socket.SOL_SOCKET
739 socket.SO_REUSEADDR
740
Guido van Rossum654c11e2002-06-13 20:24:17 +0000741 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000742 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000743 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000744 try:
745 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200746 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000747 # Probably name lookup wasn't set up right; skip this test
748 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000749 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000750 try:
751 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200752 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000753 # Probably a similar problem as above; skip this test
754 return
Brett Cannon01668a12005-03-11 00:04:17 +0000755 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000756 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000757 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000758 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000759
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000760 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
761 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
762 def test_sethostname(self):
763 oldhn = socket.gethostname()
764 try:
765 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200766 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000767 if e.errno == errno.EPERM:
768 self.skipTest("test should be run as root")
769 else:
770 raise
771 try:
772 # running test as root!
773 self.assertEqual(socket.gethostname(), 'new')
774 # Should work with bytes objects too
775 socket.sethostname(b'bar')
776 self.assertEqual(socket.gethostname(), 'bar')
777 finally:
778 socket.sethostname(oldhn)
779
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700780 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
781 'socket.if_nameindex() not available.')
782 def testInterfaceNameIndex(self):
783 interfaces = socket.if_nameindex()
784 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200785 self.assertIsInstance(index, int)
786 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700787 # interface indices are non-zero integers
788 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200789 _index = socket.if_nametoindex(name)
790 self.assertIsInstance(_index, int)
791 self.assertEqual(index, _index)
792 _name = socket.if_indextoname(index)
793 self.assertIsInstance(_name, str)
794 self.assertEqual(name, _name)
795
796 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
797 'socket.if_nameindex() not available.')
798 def testInvalidInterfaceNameIndex(self):
799 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200800 self.assertRaises(OSError, socket.if_indextoname, 0)
801 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200802 # test with invalid values
803 self.assertRaises(TypeError, socket.if_nametoindex, 0)
804 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700805
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000806 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000807 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000808 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000809 try:
810 # On some versions, this loses a reference
811 orig = sys.getrefcount(__name__)
812 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000813 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000814 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000815 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000816
Guido van Rossum24e4af82002-06-12 19:18:08 +0000817 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000818 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819 try:
820 # On some versions, this crashes the interpreter.
821 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200822 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000823 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000824
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000825 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000826 # This just checks that htons etc. are their own inverse,
827 # when looking at the lower 16 or 32 bits.
828 sizes = {socket.htonl: 32, socket.ntohl: 32,
829 socket.htons: 16, socket.ntohs: 16}
830 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000831 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000832 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
833 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000834
Guido van Rossuma2627af2002-09-14 00:58:46 +0000835 swapped = func(mask)
836 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000837 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000838
Guido van Rossum018919a2007-01-15 00:07:32 +0000839 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000840 good_values = [ 1, 2, 3, 1, 2, 3 ]
841 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000842 for k in good_values:
843 socket.ntohl(k)
844 socket.ntohs(k)
845 socket.htonl(k)
846 socket.htons(k)
847 for k in bad_values:
848 self.assertRaises(OverflowError, socket.ntohl, k)
849 self.assertRaises(OverflowError, socket.ntohs, k)
850 self.assertRaises(OverflowError, socket.htonl, k)
851 self.assertRaises(OverflowError, socket.htons, k)
852
Barry Warsaw11b91a02004-06-28 00:50:43 +0000853 def testGetServBy(self):
854 eq = self.assertEqual
855 # Find one service that exists, then check all the related interfaces.
856 # I've ordered this by protocols that have both a tcp and udp
857 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200858 if (sys.platform.startswith(('freebsd', 'netbsd'))
859 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000860 # avoid the 'echo' service on this platform, as there is an
861 # assumption breaking non-standard port/protocol entry
862 services = ('daytime', 'qotd', 'domain')
863 else:
864 services = ('echo', 'daytime', 'domain')
865 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000866 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000867 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000868 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200869 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000870 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000871 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200872 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000873 # Try same call with optional protocol omitted
874 port2 = socket.getservbyname(service)
875 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400876 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000877 try:
878 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200879 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000880 udpport = None
881 else:
882 eq(udpport, port)
883 # Now make sure the lookup by port returns the same service name
884 eq(socket.getservbyport(port2), service)
885 eq(socket.getservbyport(port, 'tcp'), service)
886 if udpport is not None:
887 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000888 # Make sure getservbyport does not accept out of range ports.
889 self.assertRaises(OverflowError, socket.getservbyport, -1)
890 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000891
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000892 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000893 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000894 # The default timeout should initially be None
895 self.assertEqual(socket.getdefaulttimeout(), None)
896 s = socket.socket()
897 self.assertEqual(s.gettimeout(), None)
898 s.close()
899
900 # Set the default timeout to 10, and see if it propagates
901 socket.setdefaulttimeout(10)
902 self.assertEqual(socket.getdefaulttimeout(), 10)
903 s = socket.socket()
904 self.assertEqual(s.gettimeout(), 10)
905 s.close()
906
907 # Reset the default timeout to None, and see if it propagates
908 socket.setdefaulttimeout(None)
909 self.assertEqual(socket.getdefaulttimeout(), None)
910 s = socket.socket()
911 self.assertEqual(s.gettimeout(), None)
912 s.close()
913
914 # Check that setting it to an invalid value raises ValueError
915 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
916
917 # Check that setting it to an invalid type raises TypeError
918 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
919
Benjamin Petersonf91df042009-02-13 02:50:59 +0000920 def testIPv4_inet_aton_fourbytes(self):
921 if not hasattr(socket, 'inet_aton'):
922 return # No inet_aton, nothing to check
923 # Test that issue1008086 and issue767150 are fixed.
924 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000925 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
926 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000927
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000928 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000929 if not hasattr(socket, 'inet_pton'):
930 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000931 from socket import inet_aton as f, inet_pton, AF_INET
932 g = lambda a: inet_pton(AF_INET, a)
933
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100934 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200935 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100936 )
937
Ezio Melottib3aedd42010-11-20 19:04:17 +0000938 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
939 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
940 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
941 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
942 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100943 assertInvalid(f, '0.0.0.')
944 assertInvalid(f, '300.0.0.0')
945 assertInvalid(f, 'a.0.0.0')
946 assertInvalid(f, '1.2.3.4.5')
947 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000948
Ezio Melottib3aedd42010-11-20 19:04:17 +0000949 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
950 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
951 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
952 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100953 assertInvalid(g, '0.0.0.')
954 assertInvalid(g, '300.0.0.0')
955 assertInvalid(g, 'a.0.0.0')
956 assertInvalid(g, '1.2.3.4.5')
957 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000958
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000959 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000960 if not hasattr(socket, 'inet_pton'):
961 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000962 try:
963 from socket import inet_pton, AF_INET6, has_ipv6
964 if not has_ipv6:
965 return
966 except ImportError:
967 return
968 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100969 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200970 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100971 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000972
Ezio Melottib3aedd42010-11-20 19:04:17 +0000973 self.assertEqual(b'\x00' * 16, f('::'))
974 self.assertEqual(b'\x00' * 16, f('0::0'))
975 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
976 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000977 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 +0000978 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
979 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100980 self.assertEqual(
981 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
982 f('ad42:abc::127:0:254:2')
983 )
984 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
985 assertInvalid('0x20::')
986 assertInvalid(':::')
987 assertInvalid('::0::')
988 assertInvalid('1::abc::')
989 assertInvalid('1::abc::def')
990 assertInvalid('1:2:3:4:5:6:')
991 assertInvalid('1:2:3:4:5:6')
992 assertInvalid('1:2:3:4:5:6:7:8:')
993 assertInvalid('1:2:3:4:5:6:7:8:0')
994
995 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
996 f('::254.42.23.64')
997 )
998 self.assertEqual(
999 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1000 f('42::a29b:254.42.23.64')
1001 )
1002 self.assertEqual(
1003 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1004 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1005 )
1006 assertInvalid('255.254.253.252')
1007 assertInvalid('1::260.2.3.0')
1008 assertInvalid('1::0.be.e.0')
1009 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1010 assertInvalid('::1.2.3.4:0')
1011 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001012
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001013 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +00001014 if not hasattr(socket, 'inet_ntop'):
1015 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001016 from socket import inet_ntoa as f, inet_ntop, AF_INET
1017 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001018 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001019 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001020 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001021
Ezio Melottib3aedd42010-11-20 19:04:17 +00001022 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1023 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1024 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1025 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001026 assertInvalid(f, b'\x00' * 3)
1027 assertInvalid(f, b'\x00' * 5)
1028 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +00001029
Ezio Melottib3aedd42010-11-20 19:04:17 +00001030 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1031 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1032 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001033 assertInvalid(g, b'\x00' * 3)
1034 assertInvalid(g, b'\x00' * 5)
1035 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001036
1037 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +00001038 if not hasattr(socket, 'inet_ntop'):
1039 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001040 try:
1041 from socket import inet_ntop, AF_INET6, has_ipv6
1042 if not has_ipv6:
1043 return
1044 except ImportError:
1045 return
1046 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001047 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001048 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001049 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001050
Ezio Melottib3aedd42010-11-20 19:04:17 +00001051 self.assertEqual('::', f(b'\x00' * 16))
1052 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1053 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001054 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001055 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 +00001056 )
1057
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001058 assertInvalid(b'\x12' * 15)
1059 assertInvalid(b'\x12' * 17)
1060 assertInvalid(b'\x12' * 4)
1061
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001062 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001063
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001064 def testSockName(self):
1065 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001066 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001067 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001068 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001069 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001070 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001071 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1072 # it reasonable to get the host's addr in addition to 0.0.0.0.
1073 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001074 try:
1075 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001076 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001077 # Probably name lookup wasn't set up right; skip this test
1078 return
Benjamin Peterson577473f2010-01-19 00:09:57 +00001079 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001080 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001081
1082 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001083 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001084 # We know a socket should start without reuse==0
1085 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001086 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001087 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001088 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001089
1090 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001091 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001092 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001093 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001094 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1095 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001096 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001097
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001098 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001099 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001100 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1101 sock.settimeout(1)
1102 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001103 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001104
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001105 def testNewAttributes(self):
1106 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001107
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001108 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1109 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001110 if hasattr(socket, 'SOCK_CLOEXEC'):
1111 self.assertIn(sock.type,
1112 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1113 socket.SOCK_STREAM))
1114 else:
1115 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001116 self.assertEqual(sock.proto, 0)
1117 sock.close()
1118
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001119 def test_getsockaddrarg(self):
1120 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001121 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001122 big_port = port + 65536
1123 neg_port = port - 65536
1124 sock = socket.socket()
1125 try:
1126 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1127 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1128 sock.bind((host, port))
1129 finally:
1130 sock.close()
1131
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001132 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001133 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001134 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1135 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1136 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1137 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001138 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1139 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001140 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001141 self.assertRaises(ValueError, s.ioctl, -1, None)
1142 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001143
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001144 def testGetaddrinfo(self):
1145 try:
1146 socket.getaddrinfo('localhost', 80)
1147 except socket.gaierror as err:
1148 if err.errno == socket.EAI_SERVICE:
1149 # see http://bugs.python.org/issue1282647
1150 self.skipTest("buggy libc version")
1151 raise
1152 # len of every sequence is supposed to be == 5
1153 for info in socket.getaddrinfo(HOST, None):
1154 self.assertEqual(len(info), 5)
1155 # host can be a domain name, a string representation of an
1156 # IPv4/v6 address or None
1157 socket.getaddrinfo('localhost', 80)
1158 socket.getaddrinfo('127.0.0.1', 80)
1159 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001160 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001161 socket.getaddrinfo('::1', 80)
1162 # port can be a string service name such as "http", a numeric
1163 # port number or None
1164 socket.getaddrinfo(HOST, "http")
1165 socket.getaddrinfo(HOST, 80)
1166 socket.getaddrinfo(HOST, None)
1167 # test family and socktype filters
1168 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
1169 for family, _, _, _, _ in infos:
1170 self.assertEqual(family, socket.AF_INET)
1171 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1172 for _, socktype, _, _, _ in infos:
1173 self.assertEqual(socktype, socket.SOCK_STREAM)
1174 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001175 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001176 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1177 # a server willing to support both IPv4 and IPv6 will
1178 # usually do this
1179 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1180 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001181 # test keyword arguments
1182 a = socket.getaddrinfo(HOST, None)
1183 b = socket.getaddrinfo(host=HOST, port=None)
1184 self.assertEqual(a, b)
1185 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1186 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1187 self.assertEqual(a, b)
1188 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1189 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1190 self.assertEqual(a, b)
1191 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1192 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1193 self.assertEqual(a, b)
1194 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1195 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1196 self.assertEqual(a, b)
1197 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1198 socket.AI_PASSIVE)
1199 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1200 type=socket.SOCK_STREAM, proto=0,
1201 flags=socket.AI_PASSIVE)
1202 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001203 # Issue #6697.
1204 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001205
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001206 # Issue 17269
Ronald Oussorena822d3662013-06-10 10:36:28 +02001207 if hasattr(socket, 'AI_NUMERICSERV'):
1208 socket.getaddrinfo("localhost", None, 0, 0, 0, socket.AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001209
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001210 def test_getnameinfo(self):
1211 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001212 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001213
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001214 @unittest.skipUnless(support.is_resource_enabled('network'),
1215 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001216 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001217 # Check for internet access before running test (issue #12804).
1218 try:
1219 socket.gethostbyname('python.org')
1220 except socket.gaierror as e:
1221 if e.errno == socket.EAI_NODATA:
1222 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001223 # these should all be successful
1224 socket.gethostbyname('испытание.python.org')
1225 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001226 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1227 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1228 # have a reverse entry yet
1229 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001230
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001231 def check_sendall_interrupted(self, with_timeout):
1232 # socketpair() is not stricly required, but it makes things easier.
1233 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1234 self.skipTest("signal.alarm and socket.socketpair required for this test")
1235 # Our signal handlers clobber the C errno by calling a math function
1236 # with an invalid domain value.
1237 def ok_handler(*args):
1238 self.assertRaises(ValueError, math.acosh, 0)
1239 def raising_handler(*args):
1240 self.assertRaises(ValueError, math.acosh, 0)
1241 1 // 0
1242 c, s = socket.socketpair()
1243 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1244 try:
1245 if with_timeout:
1246 # Just above the one second minimum for signal.alarm
1247 c.settimeout(1.5)
1248 with self.assertRaises(ZeroDivisionError):
1249 signal.alarm(1)
1250 c.sendall(b"x" * (1024**2))
1251 if with_timeout:
1252 signal.signal(signal.SIGALRM, ok_handler)
1253 signal.alarm(1)
1254 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1255 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001256 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001257 signal.signal(signal.SIGALRM, old_alarm)
1258 c.close()
1259 s.close()
1260
1261 def test_sendall_interrupted(self):
1262 self.check_sendall_interrupted(False)
1263
1264 def test_sendall_interrupted_with_timeout(self):
1265 self.check_sendall_interrupted(True)
1266
Antoine Pitroue033e062010-10-29 10:38:18 +00001267 def test_dealloc_warn(self):
1268 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1269 r = repr(sock)
1270 with self.assertWarns(ResourceWarning) as cm:
1271 sock = None
1272 support.gc_collect()
1273 self.assertIn(r, str(cm.warning.args[0]))
1274 # An open socket file object gets dereferenced after the socket
1275 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1276 f = sock.makefile('rb')
1277 r = repr(sock)
1278 sock = None
1279 support.gc_collect()
1280 with self.assertWarns(ResourceWarning):
1281 f = None
1282 support.gc_collect()
1283
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001284 def test_name_closed_socketio(self):
1285 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1286 fp = sock.makefile("rb")
1287 fp.close()
1288 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1289
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001290 def test_unusable_closed_socketio(self):
1291 with socket.socket() as sock:
1292 fp = sock.makefile("rb", buffering=0)
1293 self.assertTrue(fp.readable())
1294 self.assertFalse(fp.writable())
1295 self.assertFalse(fp.seekable())
1296 fp.close()
1297 self.assertRaises(ValueError, fp.readable)
1298 self.assertRaises(ValueError, fp.writable)
1299 self.assertRaises(ValueError, fp.seekable)
1300
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001301 def test_pickle(self):
1302 sock = socket.socket()
1303 with sock:
1304 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1305 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1306
Serhiy Storchaka78980432013-01-15 01:12:17 +02001307 def test_listen_backlog(self):
1308 for backlog in 0, -1:
1309 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1310 srv.bind((HOST, 0))
1311 srv.listen(backlog)
1312 srv.close()
1313
1314 # Issue 15989
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001315 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1316 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001317 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001318 srv.close()
1319
Charles-François Natali42663332012-01-02 15:57:30 +01001320 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001321 def test_flowinfo(self):
1322 self.assertRaises(OverflowError, socket.getnameinfo,
1323 ('::1',0, 0xffffffff), 0)
1324 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1325 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
1326
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001327
Charles-François Natali47413c12011-10-06 19:47:44 +02001328@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1329class BasicCANTest(unittest.TestCase):
1330
1331 def testCrucialConstants(self):
1332 socket.AF_CAN
1333 socket.PF_CAN
1334 socket.CAN_RAW
1335
Charles-François Natali773e42d2013-02-05 19:42:01 +01001336 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1337 'socket.CAN_BCM required for this test.')
1338 def testBCMConstants(self):
1339 socket.CAN_BCM
1340
1341 # opcodes
1342 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1343 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1344 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1345 socket.CAN_BCM_TX_SEND # send one CAN frame
1346 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1347 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1348 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1349 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1350 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1351 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1352 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1353 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1354
Charles-François Natali47413c12011-10-06 19:47:44 +02001355 def testCreateSocket(self):
1356 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1357 pass
1358
Charles-François Natali773e42d2013-02-05 19:42:01 +01001359 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1360 'socket.CAN_BCM required for this test.')
1361 def testCreateBCMSocket(self):
1362 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1363 pass
1364
Charles-François Natali47413c12011-10-06 19:47:44 +02001365 def testBindAny(self):
1366 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1367 s.bind(('', ))
1368
1369 def testTooLongInterfaceName(self):
1370 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1371 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001372 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001373 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001374
1375 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1376 'socket.CAN_RAW_LOOPBACK required for this test.')
1377 def testLoopback(self):
1378 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1379 for loopback in (0, 1):
1380 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1381 loopback)
1382 self.assertEqual(loopback,
1383 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1384
1385 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1386 'socket.CAN_RAW_FILTER required for this test.')
1387 def testFilter(self):
1388 can_id, can_mask = 0x200, 0x700
1389 can_filter = struct.pack("=II", can_id, can_mask)
1390 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1391 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1392 self.assertEqual(can_filter,
1393 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1394
1395
1396@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001397class CANTest(ThreadedCANSocketTest):
1398
Charles-François Natali47413c12011-10-06 19:47:44 +02001399 def __init__(self, methodName='runTest'):
1400 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1401
1402 @classmethod
1403 def build_can_frame(cls, can_id, data):
1404 """Build a CAN frame."""
1405 can_dlc = len(data)
1406 data = data.ljust(8, b'\x00')
1407 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1408
1409 @classmethod
1410 def dissect_can_frame(cls, frame):
1411 """Dissect a CAN frame."""
1412 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1413 return (can_id, can_dlc, data[:can_dlc])
1414
1415 def testSendFrame(self):
1416 cf, addr = self.s.recvfrom(self.bufsize)
1417 self.assertEqual(self.cf, cf)
1418 self.assertEqual(addr[0], self.interface)
1419 self.assertEqual(addr[1], socket.AF_CAN)
1420
1421 def _testSendFrame(self):
1422 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1423 self.cli.send(self.cf)
1424
1425 def testSendMaxFrame(self):
1426 cf, addr = self.s.recvfrom(self.bufsize)
1427 self.assertEqual(self.cf, cf)
1428
1429 def _testSendMaxFrame(self):
1430 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1431 self.cli.send(self.cf)
1432
1433 def testSendMultiFrames(self):
1434 cf, addr = self.s.recvfrom(self.bufsize)
1435 self.assertEqual(self.cf1, cf)
1436
1437 cf, addr = self.s.recvfrom(self.bufsize)
1438 self.assertEqual(self.cf2, cf)
1439
1440 def _testSendMultiFrames(self):
1441 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1442 self.cli.send(self.cf1)
1443
1444 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1445 self.cli.send(self.cf2)
1446
Charles-François Natali773e42d2013-02-05 19:42:01 +01001447 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1448 'socket.CAN_BCM required for this test.')
1449 def _testBCM(self):
1450 cf, addr = self.cli.recvfrom(self.bufsize)
1451 self.assertEqual(self.cf, cf)
1452 can_id, can_dlc, data = self.dissect_can_frame(cf)
1453 self.assertEqual(self.can_id, can_id)
1454 self.assertEqual(self.data, data)
1455
1456 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1457 'socket.CAN_BCM required for this test.')
1458 def testBCM(self):
1459 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1460 self.addCleanup(bcm.close)
1461 bcm.connect((self.interface,))
1462 self.can_id = 0x123
1463 self.data = bytes([0xc0, 0xff, 0xee])
1464 self.cf = self.build_can_frame(self.can_id, self.data)
1465 opcode = socket.CAN_BCM_TX_SEND
1466 flags = 0
1467 count = 0
1468 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1469 bcm_can_id = 0x0222
1470 nframes = 1
1471 assert len(self.cf) == 16
1472 header = struct.pack(self.bcm_cmd_msg_fmt,
1473 opcode,
1474 flags,
1475 count,
1476 ival1_seconds,
1477 ival1_usec,
1478 ival2_seconds,
1479 ival2_usec,
1480 bcm_can_id,
1481 nframes,
1482 )
1483 header_plus_frame = header + self.cf
1484 bytes_sent = bcm.send(header_plus_frame)
1485 self.assertEqual(bytes_sent, len(header_plus_frame))
1486
Charles-François Natali47413c12011-10-06 19:47:44 +02001487
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001488@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1489class BasicRDSTest(unittest.TestCase):
1490
1491 def testCrucialConstants(self):
1492 socket.AF_RDS
1493 socket.PF_RDS
1494
1495 def testCreateSocket(self):
1496 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1497 pass
1498
1499 def testSocketBufferSize(self):
1500 bufsize = 16384
1501 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1502 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1503 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1504
1505
1506@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1507@unittest.skipUnless(thread, 'Threading required for this test.')
1508class RDSTest(ThreadedRDSSocketTest):
1509
1510 def __init__(self, methodName='runTest'):
1511 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1512
Charles-François Natali240c55f2011-11-10 20:33:36 +01001513 def setUp(self):
1514 super().setUp()
1515 self.evt = threading.Event()
1516
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001517 def testSendAndRecv(self):
1518 data, addr = self.serv.recvfrom(self.bufsize)
1519 self.assertEqual(self.data, data)
1520 self.assertEqual(self.cli_addr, addr)
1521
1522 def _testSendAndRecv(self):
1523 self.data = b'spam'
1524 self.cli.sendto(self.data, 0, (HOST, self.port))
1525
1526 def testPeek(self):
1527 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1528 self.assertEqual(self.data, data)
1529 data, addr = self.serv.recvfrom(self.bufsize)
1530 self.assertEqual(self.data, data)
1531
1532 def _testPeek(self):
1533 self.data = b'spam'
1534 self.cli.sendto(self.data, 0, (HOST, self.port))
1535
1536 @requireAttrs(socket.socket, 'recvmsg')
1537 def testSendAndRecvMsg(self):
1538 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1539 self.assertEqual(self.data, data)
1540
1541 @requireAttrs(socket.socket, 'sendmsg')
1542 def _testSendAndRecvMsg(self):
1543 self.data = b'hello ' * 10
1544 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1545
1546 def testSendAndRecvMulti(self):
1547 data, addr = self.serv.recvfrom(self.bufsize)
1548 self.assertEqual(self.data1, data)
1549
1550 data, addr = self.serv.recvfrom(self.bufsize)
1551 self.assertEqual(self.data2, data)
1552
1553 def _testSendAndRecvMulti(self):
1554 self.data1 = b'bacon'
1555 self.cli.sendto(self.data1, 0, (HOST, self.port))
1556
1557 self.data2 = b'egg'
1558 self.cli.sendto(self.data2, 0, (HOST, self.port))
1559
1560 def testSelect(self):
1561 r, w, x = select.select([self.serv], [], [], 3.0)
1562 self.assertIn(self.serv, r)
1563 data, addr = self.serv.recvfrom(self.bufsize)
1564 self.assertEqual(self.data, data)
1565
1566 def _testSelect(self):
1567 self.data = b'select'
1568 self.cli.sendto(self.data, 0, (HOST, self.port))
1569
1570 def testCongestion(self):
1571 # wait until the sender is done
1572 self.evt.wait()
1573
1574 def _testCongestion(self):
1575 # test the behavior in case of congestion
1576 self.data = b'fill'
1577 self.cli.setblocking(False)
1578 try:
1579 # try to lower the receiver's socket buffer size
1580 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1581 except OSError:
1582 pass
1583 with self.assertRaises(OSError) as cm:
1584 try:
1585 # fill the receiver's socket buffer
1586 while True:
1587 self.cli.sendto(self.data, 0, (HOST, self.port))
1588 finally:
1589 # signal the receiver we're done
1590 self.evt.set()
1591 # sendto() should have failed with ENOBUFS
1592 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1593 # and we should have received a congestion notification through poll
1594 r, w, x = select.select([self.serv], [], [], 3.0)
1595 self.assertIn(self.serv, r)
1596
1597
Victor Stinner45df8202010-04-28 22:31:17 +00001598@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001599class BasicTCPTest(SocketConnectedTest):
1600
1601 def __init__(self, methodName='runTest'):
1602 SocketConnectedTest.__init__(self, methodName=methodName)
1603
1604 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001605 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001606 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001607 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001608
1609 def _testRecv(self):
1610 self.serv_conn.send(MSG)
1611
1612 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001613 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001614 seg1 = self.cli_conn.recv(len(MSG) - 3)
1615 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001616 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001617 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001618
1619 def _testOverFlowRecv(self):
1620 self.serv_conn.send(MSG)
1621
1622 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001623 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001624 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001625 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001626
1627 def _testRecvFrom(self):
1628 self.serv_conn.send(MSG)
1629
1630 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001631 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001632 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1633 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001634 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001635 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001636
1637 def _testOverFlowRecvFrom(self):
1638 self.serv_conn.send(MSG)
1639
1640 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001641 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001642 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001643 while 1:
1644 read = self.cli_conn.recv(1024)
1645 if not read:
1646 break
Guido van Rossume531e292002-08-08 20:28:34 +00001647 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001648 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001649
1650 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001651 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001652 self.serv_conn.sendall(big_chunk)
1653
1654 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001655 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001656 fd = self.cli_conn.fileno()
1657 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001658 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001659 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001660 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001661 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001662
1663 def _testFromFd(self):
1664 self.serv_conn.send(MSG)
1665
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001666 def testDup(self):
1667 # Testing dup()
1668 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001669 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001670 msg = sock.recv(1024)
1671 self.assertEqual(msg, MSG)
1672
1673 def _testDup(self):
1674 self.serv_conn.send(MSG)
1675
Guido van Rossum24e4af82002-06-12 19:18:08 +00001676 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001677 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001678 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001679 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001680 # wait for _testShutdown to finish: on OS X, when the server
1681 # closes the connection the client also becomes disconnected,
1682 # and the client's shutdown call will fail. (Issue #4397.)
1683 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001684
1685 def _testShutdown(self):
1686 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001687 # Issue 15989
1688 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1689 _testcapi.INT_MAX + 1)
1690 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1691 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001692 self.serv_conn.shutdown(2)
1693
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001694 def testDetach(self):
1695 # Testing detach()
1696 fileno = self.cli_conn.fileno()
1697 f = self.cli_conn.detach()
1698 self.assertEqual(f, fileno)
1699 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001700 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001701 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001702 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001703 # ...but we can create another socket using the (still open)
1704 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001705 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001706 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001707 msg = sock.recv(1024)
1708 self.assertEqual(msg, MSG)
1709
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001710 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001711 self.serv_conn.send(MSG)
1712
Victor Stinner45df8202010-04-28 22:31:17 +00001713@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001714class BasicUDPTest(ThreadedUDPSocketTest):
1715
1716 def __init__(self, methodName='runTest'):
1717 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1718
1719 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001720 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001721 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001722 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001723
1724 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001725 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001726
Guido van Rossum1c938012002-06-12 21:17:20 +00001727 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001728 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001729 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001730 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001731
Guido van Rossum1c938012002-06-12 21:17:20 +00001732 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001733 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001734
Guido van Rossumd8faa362007-04-27 19:54:29 +00001735 def testRecvFromNegative(self):
1736 # Negative lengths passed to recvfrom should give ValueError.
1737 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1738
1739 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001740 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001741
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001742# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1743# same test code is used with different families and types of socket
1744# (e.g. stream, datagram), and tests using recvmsg() are repeated
1745# using recvmsg_into().
1746#
1747# The generic test classes such as SendmsgTests and
1748# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1749# supplied with sockets cli_sock and serv_sock representing the
1750# client's and the server's end of the connection respectively, and
1751# attributes cli_addr and serv_addr holding their (numeric where
1752# appropriate) addresses.
1753#
1754# The final concrete test classes combine these with subclasses of
1755# SocketTestBase which set up client and server sockets of a specific
1756# type, and with subclasses of SendrecvmsgBase such as
1757# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1758# sockets to cli_sock and serv_sock and override the methods and
1759# attributes of SendrecvmsgBase to fill in destination addresses if
1760# needed when sending, check for specific flags in msg_flags, etc.
1761#
1762# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1763# recvmsg_into().
1764
1765# XXX: like the other datagram (UDP) tests in this module, the code
1766# here assumes that datagram delivery on the local machine will be
1767# reliable.
1768
1769class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1770 # Base class for sendmsg()/recvmsg() tests.
1771
1772 # Time in seconds to wait before considering a test failed, or
1773 # None for no timeout. Not all tests actually set a timeout.
1774 fail_timeout = 3.0
1775
1776 def setUp(self):
1777 self.misc_event = threading.Event()
1778 super().setUp()
1779
1780 def sendToServer(self, msg):
1781 # Send msg to the server.
1782 return self.cli_sock.send(msg)
1783
1784 # Tuple of alternative default arguments for sendmsg() when called
1785 # via sendmsgToServer() (e.g. to include a destination address).
1786 sendmsg_to_server_defaults = ()
1787
1788 def sendmsgToServer(self, *args):
1789 # Call sendmsg() on self.cli_sock with the given arguments,
1790 # filling in any arguments which are not supplied with the
1791 # corresponding items of self.sendmsg_to_server_defaults, if
1792 # any.
1793 return self.cli_sock.sendmsg(
1794 *(args + self.sendmsg_to_server_defaults[len(args):]))
1795
1796 def doRecvmsg(self, sock, bufsize, *args):
1797 # Call recvmsg() on sock with given arguments and return its
1798 # result. Should be used for tests which can use either
1799 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1800 # this method with one which emulates it using recvmsg_into(),
1801 # thus allowing the same test to be used for both methods.
1802 result = sock.recvmsg(bufsize, *args)
1803 self.registerRecvmsgResult(result)
1804 return result
1805
1806 def registerRecvmsgResult(self, result):
1807 # Called by doRecvmsg() with the return value of recvmsg() or
1808 # recvmsg_into(). Can be overridden to arrange cleanup based
1809 # on the returned ancillary data, for instance.
1810 pass
1811
1812 def checkRecvmsgAddress(self, addr1, addr2):
1813 # Called to compare the received address with the address of
1814 # the peer.
1815 self.assertEqual(addr1, addr2)
1816
1817 # Flags that are normally unset in msg_flags
1818 msg_flags_common_unset = 0
1819 for name in ("MSG_CTRUNC", "MSG_OOB"):
1820 msg_flags_common_unset |= getattr(socket, name, 0)
1821
1822 # Flags that are normally set
1823 msg_flags_common_set = 0
1824
1825 # Flags set when a complete record has been received (e.g. MSG_EOR
1826 # for SCTP)
1827 msg_flags_eor_indicator = 0
1828
1829 # Flags set when a complete record has not been received
1830 # (e.g. MSG_TRUNC for datagram sockets)
1831 msg_flags_non_eor_indicator = 0
1832
1833 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1834 # Method to check the value of msg_flags returned by recvmsg[_into]().
1835 #
1836 # Checks that all bits in msg_flags_common_set attribute are
1837 # set in "flags" and all bits in msg_flags_common_unset are
1838 # unset.
1839 #
1840 # The "eor" argument specifies whether the flags should
1841 # indicate that a full record (or datagram) has been received.
1842 # If "eor" is None, no checks are done; otherwise, checks
1843 # that:
1844 #
1845 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1846 # set and all bits in msg_flags_non_eor_indicator are unset
1847 #
1848 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1849 # are set and all bits in msg_flags_eor_indicator are unset
1850 #
1851 # If "checkset" and/or "checkunset" are supplied, they require
1852 # the given bits to be set or unset respectively, overriding
1853 # what the attributes require for those bits.
1854 #
1855 # If any bits are set in "ignore", they will not be checked,
1856 # regardless of the other inputs.
1857 #
1858 # Will raise Exception if the inputs require a bit to be both
1859 # set and unset, and it is not ignored.
1860
1861 defaultset = self.msg_flags_common_set
1862 defaultunset = self.msg_flags_common_unset
1863
1864 if eor:
1865 defaultset |= self.msg_flags_eor_indicator
1866 defaultunset |= self.msg_flags_non_eor_indicator
1867 elif eor is not None:
1868 defaultset |= self.msg_flags_non_eor_indicator
1869 defaultunset |= self.msg_flags_eor_indicator
1870
1871 # Function arguments override defaults
1872 defaultset &= ~checkunset
1873 defaultunset &= ~checkset
1874
1875 # Merge arguments with remaining defaults, and check for conflicts
1876 checkset |= defaultset
1877 checkunset |= defaultunset
1878 inboth = checkset & checkunset & ~ignore
1879 if inboth:
1880 raise Exception("contradictory set, unset requirements for flags "
1881 "{0:#x}".format(inboth))
1882
1883 # Compare with given msg_flags value
1884 mask = (checkset | checkunset) & ~ignore
1885 self.assertEqual(flags & mask, checkset & mask)
1886
1887
1888class RecvmsgIntoMixin(SendrecvmsgBase):
1889 # Mixin to implement doRecvmsg() using recvmsg_into().
1890
1891 def doRecvmsg(self, sock, bufsize, *args):
1892 buf = bytearray(bufsize)
1893 result = sock.recvmsg_into([buf], *args)
1894 self.registerRecvmsgResult(result)
1895 self.assertGreaterEqual(result[0], 0)
1896 self.assertLessEqual(result[0], bufsize)
1897 return (bytes(buf[:result[0]]),) + result[1:]
1898
1899
1900class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1901 # Defines flags to be checked in msg_flags for datagram sockets.
1902
1903 @property
1904 def msg_flags_non_eor_indicator(self):
1905 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1906
1907
1908class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1909 # Defines flags to be checked in msg_flags for SCTP sockets.
1910
1911 @property
1912 def msg_flags_eor_indicator(self):
1913 return super().msg_flags_eor_indicator | socket.MSG_EOR
1914
1915
1916class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1917 # Base class for tests on connectionless-mode sockets. Users must
1918 # supply sockets on attributes cli and serv to be mapped to
1919 # cli_sock and serv_sock respectively.
1920
1921 @property
1922 def serv_sock(self):
1923 return self.serv
1924
1925 @property
1926 def cli_sock(self):
1927 return self.cli
1928
1929 @property
1930 def sendmsg_to_server_defaults(self):
1931 return ([], [], 0, self.serv_addr)
1932
1933 def sendToServer(self, msg):
1934 return self.cli_sock.sendto(msg, self.serv_addr)
1935
1936
1937class SendrecvmsgConnectedBase(SendrecvmsgBase):
1938 # Base class for tests on connected sockets. Users must supply
1939 # sockets on attributes serv_conn and cli_conn (representing the
1940 # connections *to* the server and the client), to be mapped to
1941 # cli_sock and serv_sock respectively.
1942
1943 @property
1944 def serv_sock(self):
1945 return self.cli_conn
1946
1947 @property
1948 def cli_sock(self):
1949 return self.serv_conn
1950
1951 def checkRecvmsgAddress(self, addr1, addr2):
1952 # Address is currently "unspecified" for a connected socket,
1953 # so we don't examine it
1954 pass
1955
1956
1957class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1958 # Base class to set a timeout on server's socket.
1959
1960 def setUp(self):
1961 super().setUp()
1962 self.serv_sock.settimeout(self.fail_timeout)
1963
1964
1965class SendmsgTests(SendrecvmsgServerTimeoutBase):
1966 # Tests for sendmsg() which can use any socket type and do not
1967 # involve recvmsg() or recvmsg_into().
1968
1969 def testSendmsg(self):
1970 # Send a simple message with sendmsg().
1971 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1972
1973 def _testSendmsg(self):
1974 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1975
1976 def testSendmsgDataGenerator(self):
1977 # Send from buffer obtained from a generator (not a sequence).
1978 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1979
1980 def _testSendmsgDataGenerator(self):
1981 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1982 len(MSG))
1983
1984 def testSendmsgAncillaryGenerator(self):
1985 # Gather (empty) ancillary data from a generator.
1986 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1987
1988 def _testSendmsgAncillaryGenerator(self):
1989 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1990 len(MSG))
1991
1992 def testSendmsgArray(self):
1993 # Send data from an array instead of the usual bytes object.
1994 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1995
1996 def _testSendmsgArray(self):
1997 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1998 len(MSG))
1999
2000 def testSendmsgGather(self):
2001 # Send message data from more than one buffer (gather write).
2002 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2003
2004 def _testSendmsgGather(self):
2005 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2006
2007 def testSendmsgBadArgs(self):
2008 # Check that sendmsg() rejects invalid arguments.
2009 self.assertEqual(self.serv_sock.recv(1000), b"done")
2010
2011 def _testSendmsgBadArgs(self):
2012 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2013 self.assertRaises(TypeError, self.sendmsgToServer,
2014 b"not in an iterable")
2015 self.assertRaises(TypeError, self.sendmsgToServer,
2016 object())
2017 self.assertRaises(TypeError, self.sendmsgToServer,
2018 [object()])
2019 self.assertRaises(TypeError, self.sendmsgToServer,
2020 [MSG, object()])
2021 self.assertRaises(TypeError, self.sendmsgToServer,
2022 [MSG], object())
2023 self.assertRaises(TypeError, self.sendmsgToServer,
2024 [MSG], [], object())
2025 self.assertRaises(TypeError, self.sendmsgToServer,
2026 [MSG], [], 0, object())
2027 self.sendToServer(b"done")
2028
2029 def testSendmsgBadCmsg(self):
2030 # Check that invalid ancillary data items are rejected.
2031 self.assertEqual(self.serv_sock.recv(1000), b"done")
2032
2033 def _testSendmsgBadCmsg(self):
2034 self.assertRaises(TypeError, self.sendmsgToServer,
2035 [MSG], [object()])
2036 self.assertRaises(TypeError, self.sendmsgToServer,
2037 [MSG], [(object(), 0, b"data")])
2038 self.assertRaises(TypeError, self.sendmsgToServer,
2039 [MSG], [(0, object(), b"data")])
2040 self.assertRaises(TypeError, self.sendmsgToServer,
2041 [MSG], [(0, 0, object())])
2042 self.assertRaises(TypeError, self.sendmsgToServer,
2043 [MSG], [(0, 0)])
2044 self.assertRaises(TypeError, self.sendmsgToServer,
2045 [MSG], [(0, 0, b"data", 42)])
2046 self.sendToServer(b"done")
2047
2048 @requireAttrs(socket, "CMSG_SPACE")
2049 def testSendmsgBadMultiCmsg(self):
2050 # Check that invalid ancillary data items are rejected when
2051 # more than one item is present.
2052 self.assertEqual(self.serv_sock.recv(1000), b"done")
2053
2054 @testSendmsgBadMultiCmsg.client_skip
2055 def _testSendmsgBadMultiCmsg(self):
2056 self.assertRaises(TypeError, self.sendmsgToServer,
2057 [MSG], [0, 0, b""])
2058 self.assertRaises(TypeError, self.sendmsgToServer,
2059 [MSG], [(0, 0, b""), object()])
2060 self.sendToServer(b"done")
2061
2062 def testSendmsgExcessCmsgReject(self):
2063 # Check that sendmsg() rejects excess ancillary data items
2064 # when the number that can be sent is limited.
2065 self.assertEqual(self.serv_sock.recv(1000), b"done")
2066
2067 def _testSendmsgExcessCmsgReject(self):
2068 if not hasattr(socket, "CMSG_SPACE"):
2069 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002070 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002071 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2072 self.assertIsNone(cm.exception.errno)
2073 self.sendToServer(b"done")
2074
2075 def testSendmsgAfterClose(self):
2076 # Check that sendmsg() fails on a closed socket.
2077 pass
2078
2079 def _testSendmsgAfterClose(self):
2080 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002081 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002082
2083
2084class SendmsgStreamTests(SendmsgTests):
2085 # Tests for sendmsg() which require a stream socket and do not
2086 # involve recvmsg() or recvmsg_into().
2087
2088 def testSendmsgExplicitNoneAddr(self):
2089 # Check that peer address can be specified as None.
2090 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2091
2092 def _testSendmsgExplicitNoneAddr(self):
2093 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2094
2095 def testSendmsgTimeout(self):
2096 # Check that timeout works with sendmsg().
2097 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2098 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2099
2100 def _testSendmsgTimeout(self):
2101 try:
2102 self.cli_sock.settimeout(0.03)
2103 with self.assertRaises(socket.timeout):
2104 while True:
2105 self.sendmsgToServer([b"a"*512])
2106 finally:
2107 self.misc_event.set()
2108
2109 # XXX: would be nice to have more tests for sendmsg flags argument.
2110
2111 # Linux supports MSG_DONTWAIT when sending, but in general, it
2112 # only works when receiving. Could add other platforms if they
2113 # support it too.
2114 @skipWithClientIf(sys.platform not in {"linux2"},
2115 "MSG_DONTWAIT not known to work on this platform when "
2116 "sending")
2117 def testSendmsgDontWait(self):
2118 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2119 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2120 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2121
2122 @testSendmsgDontWait.client_skip
2123 def _testSendmsgDontWait(self):
2124 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002125 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002126 while True:
2127 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2128 self.assertIn(cm.exception.errno,
2129 (errno.EAGAIN, errno.EWOULDBLOCK))
2130 finally:
2131 self.misc_event.set()
2132
2133
2134class SendmsgConnectionlessTests(SendmsgTests):
2135 # Tests for sendmsg() which require a connectionless-mode
2136 # (e.g. datagram) socket, and do not involve recvmsg() or
2137 # recvmsg_into().
2138
2139 def testSendmsgNoDestAddr(self):
2140 # Check that sendmsg() fails when no destination address is
2141 # given for unconnected socket.
2142 pass
2143
2144 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002145 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002146 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002147 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002148 [MSG], [], 0, None)
2149
2150
2151class RecvmsgGenericTests(SendrecvmsgBase):
2152 # Tests for recvmsg() which can also be emulated using
2153 # recvmsg_into(), and can use any socket type.
2154
2155 def testRecvmsg(self):
2156 # Receive a simple message with recvmsg[_into]().
2157 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2158 self.assertEqual(msg, MSG)
2159 self.checkRecvmsgAddress(addr, self.cli_addr)
2160 self.assertEqual(ancdata, [])
2161 self.checkFlags(flags, eor=True)
2162
2163 def _testRecvmsg(self):
2164 self.sendToServer(MSG)
2165
2166 def testRecvmsgExplicitDefaults(self):
2167 # Test recvmsg[_into]() with default arguments provided explicitly.
2168 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2169 len(MSG), 0, 0)
2170 self.assertEqual(msg, MSG)
2171 self.checkRecvmsgAddress(addr, self.cli_addr)
2172 self.assertEqual(ancdata, [])
2173 self.checkFlags(flags, eor=True)
2174
2175 def _testRecvmsgExplicitDefaults(self):
2176 self.sendToServer(MSG)
2177
2178 def testRecvmsgShorter(self):
2179 # Receive a message smaller than buffer.
2180 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2181 len(MSG) + 42)
2182 self.assertEqual(msg, MSG)
2183 self.checkRecvmsgAddress(addr, self.cli_addr)
2184 self.assertEqual(ancdata, [])
2185 self.checkFlags(flags, eor=True)
2186
2187 def _testRecvmsgShorter(self):
2188 self.sendToServer(MSG)
2189
Charles-François Natali8619cd72011-10-03 19:43:15 +02002190 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2191 # datagram is received (issue #13001).
2192 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002193 def testRecvmsgTrunc(self):
2194 # Receive part of message, check for truncation indicators.
2195 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2196 len(MSG) - 3)
2197 self.assertEqual(msg, MSG[:-3])
2198 self.checkRecvmsgAddress(addr, self.cli_addr)
2199 self.assertEqual(ancdata, [])
2200 self.checkFlags(flags, eor=False)
2201
Charles-François Natali8619cd72011-10-03 19:43:15 +02002202 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002203 def _testRecvmsgTrunc(self):
2204 self.sendToServer(MSG)
2205
2206 def testRecvmsgShortAncillaryBuf(self):
2207 # Test ancillary data buffer too small to hold any ancillary data.
2208 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2209 len(MSG), 1)
2210 self.assertEqual(msg, MSG)
2211 self.checkRecvmsgAddress(addr, self.cli_addr)
2212 self.assertEqual(ancdata, [])
2213 self.checkFlags(flags, eor=True)
2214
2215 def _testRecvmsgShortAncillaryBuf(self):
2216 self.sendToServer(MSG)
2217
2218 def testRecvmsgLongAncillaryBuf(self):
2219 # Test large ancillary data buffer.
2220 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2221 len(MSG), 10240)
2222 self.assertEqual(msg, MSG)
2223 self.checkRecvmsgAddress(addr, self.cli_addr)
2224 self.assertEqual(ancdata, [])
2225 self.checkFlags(flags, eor=True)
2226
2227 def _testRecvmsgLongAncillaryBuf(self):
2228 self.sendToServer(MSG)
2229
2230 def testRecvmsgAfterClose(self):
2231 # Check that recvmsg[_into]() fails on a closed socket.
2232 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002233 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002234
2235 def _testRecvmsgAfterClose(self):
2236 pass
2237
2238 def testRecvmsgTimeout(self):
2239 # Check that timeout works.
2240 try:
2241 self.serv_sock.settimeout(0.03)
2242 self.assertRaises(socket.timeout,
2243 self.doRecvmsg, self.serv_sock, len(MSG))
2244 finally:
2245 self.misc_event.set()
2246
2247 def _testRecvmsgTimeout(self):
2248 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2249
2250 @requireAttrs(socket, "MSG_PEEK")
2251 def testRecvmsgPeek(self):
2252 # Check that MSG_PEEK in flags enables examination of pending
2253 # data without consuming it.
2254
2255 # Receive part of data with MSG_PEEK.
2256 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2257 len(MSG) - 3, 0,
2258 socket.MSG_PEEK)
2259 self.assertEqual(msg, MSG[:-3])
2260 self.checkRecvmsgAddress(addr, self.cli_addr)
2261 self.assertEqual(ancdata, [])
2262 # Ignoring MSG_TRUNC here (so this test is the same for stream
2263 # and datagram sockets). Some wording in POSIX seems to
2264 # suggest that it needn't be set when peeking, but that may
2265 # just be a slip.
2266 self.checkFlags(flags, eor=False,
2267 ignore=getattr(socket, "MSG_TRUNC", 0))
2268
2269 # Receive all data with MSG_PEEK.
2270 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2271 len(MSG), 0,
2272 socket.MSG_PEEK)
2273 self.assertEqual(msg, MSG)
2274 self.checkRecvmsgAddress(addr, self.cli_addr)
2275 self.assertEqual(ancdata, [])
2276 self.checkFlags(flags, eor=True)
2277
2278 # Check that the same data can still be received normally.
2279 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2280 self.assertEqual(msg, MSG)
2281 self.checkRecvmsgAddress(addr, self.cli_addr)
2282 self.assertEqual(ancdata, [])
2283 self.checkFlags(flags, eor=True)
2284
2285 @testRecvmsgPeek.client_skip
2286 def _testRecvmsgPeek(self):
2287 self.sendToServer(MSG)
2288
2289 @requireAttrs(socket.socket, "sendmsg")
2290 def testRecvmsgFromSendmsg(self):
2291 # Test receiving with recvmsg[_into]() when message is sent
2292 # using sendmsg().
2293 self.serv_sock.settimeout(self.fail_timeout)
2294 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2295 self.assertEqual(msg, MSG)
2296 self.checkRecvmsgAddress(addr, self.cli_addr)
2297 self.assertEqual(ancdata, [])
2298 self.checkFlags(flags, eor=True)
2299
2300 @testRecvmsgFromSendmsg.client_skip
2301 def _testRecvmsgFromSendmsg(self):
2302 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2303
2304
2305class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2306 # Tests which require a stream socket and can use either recvmsg()
2307 # or recvmsg_into().
2308
2309 def testRecvmsgEOF(self):
2310 # Receive end-of-stream indicator (b"", peer socket closed).
2311 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2312 self.assertEqual(msg, b"")
2313 self.checkRecvmsgAddress(addr, self.cli_addr)
2314 self.assertEqual(ancdata, [])
2315 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2316
2317 def _testRecvmsgEOF(self):
2318 self.cli_sock.close()
2319
2320 def testRecvmsgOverflow(self):
2321 # Receive a message in more than one chunk.
2322 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2323 len(MSG) - 3)
2324 self.checkRecvmsgAddress(addr, self.cli_addr)
2325 self.assertEqual(ancdata, [])
2326 self.checkFlags(flags, eor=False)
2327
2328 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2329 self.checkRecvmsgAddress(addr, self.cli_addr)
2330 self.assertEqual(ancdata, [])
2331 self.checkFlags(flags, eor=True)
2332
2333 msg = seg1 + seg2
2334 self.assertEqual(msg, MSG)
2335
2336 def _testRecvmsgOverflow(self):
2337 self.sendToServer(MSG)
2338
2339
2340class RecvmsgTests(RecvmsgGenericTests):
2341 # Tests for recvmsg() which can use any socket type.
2342
2343 def testRecvmsgBadArgs(self):
2344 # Check that recvmsg() rejects invalid arguments.
2345 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2346 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2347 -1, 0, 0)
2348 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2349 len(MSG), -1, 0)
2350 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2351 [bytearray(10)], 0, 0)
2352 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2353 object(), 0, 0)
2354 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2355 len(MSG), object(), 0)
2356 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2357 len(MSG), 0, object())
2358
2359 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2360 self.assertEqual(msg, MSG)
2361 self.checkRecvmsgAddress(addr, self.cli_addr)
2362 self.assertEqual(ancdata, [])
2363 self.checkFlags(flags, eor=True)
2364
2365 def _testRecvmsgBadArgs(self):
2366 self.sendToServer(MSG)
2367
2368
2369class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2370 # Tests for recvmsg_into() which can use any socket type.
2371
2372 def testRecvmsgIntoBadArgs(self):
2373 # Check that recvmsg_into() rejects invalid arguments.
2374 buf = bytearray(len(MSG))
2375 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2376 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2377 len(MSG), 0, 0)
2378 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2379 buf, 0, 0)
2380 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2381 [object()], 0, 0)
2382 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2383 [b"I'm not writable"], 0, 0)
2384 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2385 [buf, object()], 0, 0)
2386 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2387 [buf], -1, 0)
2388 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2389 [buf], object(), 0)
2390 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2391 [buf], 0, object())
2392
2393 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2394 self.assertEqual(nbytes, len(MSG))
2395 self.assertEqual(buf, bytearray(MSG))
2396 self.checkRecvmsgAddress(addr, self.cli_addr)
2397 self.assertEqual(ancdata, [])
2398 self.checkFlags(flags, eor=True)
2399
2400 def _testRecvmsgIntoBadArgs(self):
2401 self.sendToServer(MSG)
2402
2403 def testRecvmsgIntoGenerator(self):
2404 # Receive into buffer obtained from a generator (not a sequence).
2405 buf = bytearray(len(MSG))
2406 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2407 (o for o in [buf]))
2408 self.assertEqual(nbytes, len(MSG))
2409 self.assertEqual(buf, bytearray(MSG))
2410 self.checkRecvmsgAddress(addr, self.cli_addr)
2411 self.assertEqual(ancdata, [])
2412 self.checkFlags(flags, eor=True)
2413
2414 def _testRecvmsgIntoGenerator(self):
2415 self.sendToServer(MSG)
2416
2417 def testRecvmsgIntoArray(self):
2418 # Receive into an array rather than the usual bytearray.
2419 buf = array.array("B", [0] * len(MSG))
2420 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2421 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002422 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002423 self.checkRecvmsgAddress(addr, self.cli_addr)
2424 self.assertEqual(ancdata, [])
2425 self.checkFlags(flags, eor=True)
2426
2427 def _testRecvmsgIntoArray(self):
2428 self.sendToServer(MSG)
2429
2430 def testRecvmsgIntoScatter(self):
2431 # Receive into multiple buffers (scatter write).
2432 b1 = bytearray(b"----")
2433 b2 = bytearray(b"0123456789")
2434 b3 = bytearray(b"--------------")
2435 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2436 [b1, memoryview(b2)[2:9], b3])
2437 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2438 self.assertEqual(b1, bytearray(b"Mary"))
2439 self.assertEqual(b2, bytearray(b"01 had a 9"))
2440 self.assertEqual(b3, bytearray(b"little lamb---"))
2441 self.checkRecvmsgAddress(addr, self.cli_addr)
2442 self.assertEqual(ancdata, [])
2443 self.checkFlags(flags, eor=True)
2444
2445 def _testRecvmsgIntoScatter(self):
2446 self.sendToServer(b"Mary had a little lamb")
2447
2448
2449class CmsgMacroTests(unittest.TestCase):
2450 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2451 # assumptions used by sendmsg() and recvmsg[_into](), which share
2452 # code with these functions.
2453
2454 # Match the definition in socketmodule.c
2455 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2456
2457 @requireAttrs(socket, "CMSG_LEN")
2458 def testCMSG_LEN(self):
2459 # Test CMSG_LEN() with various valid and invalid values,
2460 # checking the assumptions used by recvmsg() and sendmsg().
2461 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2462 values = list(range(257)) + list(range(toobig - 257, toobig))
2463
2464 # struct cmsghdr has at least three members, two of which are ints
2465 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2466 for n in values:
2467 ret = socket.CMSG_LEN(n)
2468 # This is how recvmsg() calculates the data size
2469 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2470 self.assertLessEqual(ret, self.socklen_t_limit)
2471
2472 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2473 # sendmsg() shares code with these functions, and requires
2474 # that it reject values over the limit.
2475 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2476 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2477
2478 @requireAttrs(socket, "CMSG_SPACE")
2479 def testCMSG_SPACE(self):
2480 # Test CMSG_SPACE() with various valid and invalid values,
2481 # checking the assumptions used by sendmsg().
2482 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2483 values = list(range(257)) + list(range(toobig - 257, toobig))
2484
2485 last = socket.CMSG_SPACE(0)
2486 # struct cmsghdr has at least three members, two of which are ints
2487 self.assertGreater(last, array.array("i").itemsize * 2)
2488 for n in values:
2489 ret = socket.CMSG_SPACE(n)
2490 self.assertGreaterEqual(ret, last)
2491 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2492 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2493 self.assertLessEqual(ret, self.socklen_t_limit)
2494 last = ret
2495
2496 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2497 # sendmsg() shares code with these functions, and requires
2498 # that it reject values over the limit.
2499 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2500 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2501
2502
2503class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2504 # Tests for file descriptor passing on Unix-domain sockets.
2505
2506 # Invalid file descriptor value that's unlikely to evaluate to a
2507 # real FD even if one of its bytes is replaced with a different
2508 # value (which shouldn't actually happen).
2509 badfd = -0x5555
2510
2511 def newFDs(self, n):
2512 # Return a list of n file descriptors for newly-created files
2513 # containing their list indices as ASCII numbers.
2514 fds = []
2515 for i in range(n):
2516 fd, path = tempfile.mkstemp()
2517 self.addCleanup(os.unlink, path)
2518 self.addCleanup(os.close, fd)
2519 os.write(fd, str(i).encode())
2520 fds.append(fd)
2521 return fds
2522
2523 def checkFDs(self, fds):
2524 # Check that the file descriptors in the given list contain
2525 # their correct list indices as ASCII numbers.
2526 for n, fd in enumerate(fds):
2527 os.lseek(fd, 0, os.SEEK_SET)
2528 self.assertEqual(os.read(fd, 1024), str(n).encode())
2529
2530 def registerRecvmsgResult(self, result):
2531 self.addCleanup(self.closeRecvmsgFDs, result)
2532
2533 def closeRecvmsgFDs(self, recvmsg_result):
2534 # Close all file descriptors specified in the ancillary data
2535 # of the given return value from recvmsg() or recvmsg_into().
2536 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2537 if (cmsg_level == socket.SOL_SOCKET and
2538 cmsg_type == socket.SCM_RIGHTS):
2539 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002540 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002541 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2542 for fd in fds:
2543 os.close(fd)
2544
2545 def createAndSendFDs(self, n):
2546 # Send n new file descriptors created by newFDs() to the
2547 # server, with the constant MSG as the non-ancillary data.
2548 self.assertEqual(
2549 self.sendmsgToServer([MSG],
2550 [(socket.SOL_SOCKET,
2551 socket.SCM_RIGHTS,
2552 array.array("i", self.newFDs(n)))]),
2553 len(MSG))
2554
2555 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2556 # Check that constant MSG was received with numfds file
2557 # descriptors in a maximum of maxcmsgs control messages (which
2558 # must contain only complete integers). By default, check
2559 # that MSG_CTRUNC is unset, but ignore any flags in
2560 # ignoreflags.
2561 msg, ancdata, flags, addr = result
2562 self.assertEqual(msg, MSG)
2563 self.checkRecvmsgAddress(addr, self.cli_addr)
2564 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2565 ignore=ignoreflags)
2566
2567 self.assertIsInstance(ancdata, list)
2568 self.assertLessEqual(len(ancdata), maxcmsgs)
2569 fds = array.array("i")
2570 for item in ancdata:
2571 self.assertIsInstance(item, tuple)
2572 cmsg_level, cmsg_type, cmsg_data = item
2573 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2574 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2575 self.assertIsInstance(cmsg_data, bytes)
2576 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002577 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002578
2579 self.assertEqual(len(fds), numfds)
2580 self.checkFDs(fds)
2581
2582 def testFDPassSimple(self):
2583 # Pass a single FD (array read from bytes object).
2584 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2585 len(MSG), 10240))
2586
2587 def _testFDPassSimple(self):
2588 self.assertEqual(
2589 self.sendmsgToServer(
2590 [MSG],
2591 [(socket.SOL_SOCKET,
2592 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002593 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002594 len(MSG))
2595
2596 def testMultipleFDPass(self):
2597 # Pass multiple FDs in a single array.
2598 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2599 len(MSG), 10240))
2600
2601 def _testMultipleFDPass(self):
2602 self.createAndSendFDs(4)
2603
2604 @requireAttrs(socket, "CMSG_SPACE")
2605 def testFDPassCMSG_SPACE(self):
2606 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2607 self.checkRecvmsgFDs(
2608 4, self.doRecvmsg(self.serv_sock, len(MSG),
2609 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2610
2611 @testFDPassCMSG_SPACE.client_skip
2612 def _testFDPassCMSG_SPACE(self):
2613 self.createAndSendFDs(4)
2614
2615 def testFDPassCMSG_LEN(self):
2616 # Test using CMSG_LEN() to calculate ancillary buffer size.
2617 self.checkRecvmsgFDs(1,
2618 self.doRecvmsg(self.serv_sock, len(MSG),
2619 socket.CMSG_LEN(4 * SIZEOF_INT)),
2620 # RFC 3542 says implementations may set
2621 # MSG_CTRUNC if there isn't enough space
2622 # for trailing padding.
2623 ignoreflags=socket.MSG_CTRUNC)
2624
2625 def _testFDPassCMSG_LEN(self):
2626 self.createAndSendFDs(1)
2627
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002628 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002629 @requireAttrs(socket, "CMSG_SPACE")
2630 def testFDPassSeparate(self):
2631 # Pass two FDs in two separate arrays. Arrays may be combined
2632 # into a single control message by the OS.
2633 self.checkRecvmsgFDs(2,
2634 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2635 maxcmsgs=2)
2636
2637 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002638 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002639 def _testFDPassSeparate(self):
2640 fd0, fd1 = self.newFDs(2)
2641 self.assertEqual(
2642 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2643 socket.SCM_RIGHTS,
2644 array.array("i", [fd0])),
2645 (socket.SOL_SOCKET,
2646 socket.SCM_RIGHTS,
2647 array.array("i", [fd1]))]),
2648 len(MSG))
2649
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002650 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002651 @requireAttrs(socket, "CMSG_SPACE")
2652 def testFDPassSeparateMinSpace(self):
2653 # Pass two FDs in two separate arrays, receiving them into the
2654 # minimum space for two arrays.
2655 self.checkRecvmsgFDs(2,
2656 self.doRecvmsg(self.serv_sock, len(MSG),
2657 socket.CMSG_SPACE(SIZEOF_INT) +
2658 socket.CMSG_LEN(SIZEOF_INT)),
2659 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2660
2661 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002662 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002663 def _testFDPassSeparateMinSpace(self):
2664 fd0, fd1 = self.newFDs(2)
2665 self.assertEqual(
2666 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2667 socket.SCM_RIGHTS,
2668 array.array("i", [fd0])),
2669 (socket.SOL_SOCKET,
2670 socket.SCM_RIGHTS,
2671 array.array("i", [fd1]))]),
2672 len(MSG))
2673
2674 def sendAncillaryIfPossible(self, msg, ancdata):
2675 # Try to send msg and ancdata to server, but if the system
2676 # call fails, just send msg with no ancillary data.
2677 try:
2678 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002679 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002680 # Check that it was the system call that failed
2681 self.assertIsInstance(e.errno, int)
2682 nbytes = self.sendmsgToServer([msg])
2683 self.assertEqual(nbytes, len(msg))
2684
2685 def testFDPassEmpty(self):
2686 # Try to pass an empty FD array. Can receive either no array
2687 # or an empty array.
2688 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2689 len(MSG), 10240),
2690 ignoreflags=socket.MSG_CTRUNC)
2691
2692 def _testFDPassEmpty(self):
2693 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2694 socket.SCM_RIGHTS,
2695 b"")])
2696
2697 def testFDPassPartialInt(self):
2698 # Try to pass a truncated FD array.
2699 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2700 len(MSG), 10240)
2701 self.assertEqual(msg, MSG)
2702 self.checkRecvmsgAddress(addr, self.cli_addr)
2703 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2704 self.assertLessEqual(len(ancdata), 1)
2705 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2706 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2707 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2708 self.assertLess(len(cmsg_data), SIZEOF_INT)
2709
2710 def _testFDPassPartialInt(self):
2711 self.sendAncillaryIfPossible(
2712 MSG,
2713 [(socket.SOL_SOCKET,
2714 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002715 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002716
2717 @requireAttrs(socket, "CMSG_SPACE")
2718 def testFDPassPartialIntInMiddle(self):
2719 # Try to pass two FD arrays, the first of which is truncated.
2720 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2721 len(MSG), 10240)
2722 self.assertEqual(msg, MSG)
2723 self.checkRecvmsgAddress(addr, self.cli_addr)
2724 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2725 self.assertLessEqual(len(ancdata), 2)
2726 fds = array.array("i")
2727 # Arrays may have been combined in a single control message
2728 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2729 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2730 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002731 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002732 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2733 self.assertLessEqual(len(fds), 2)
2734 self.checkFDs(fds)
2735
2736 @testFDPassPartialIntInMiddle.client_skip
2737 def _testFDPassPartialIntInMiddle(self):
2738 fd0, fd1 = self.newFDs(2)
2739 self.sendAncillaryIfPossible(
2740 MSG,
2741 [(socket.SOL_SOCKET,
2742 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002743 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002744 (socket.SOL_SOCKET,
2745 socket.SCM_RIGHTS,
2746 array.array("i", [fd1]))])
2747
2748 def checkTruncatedHeader(self, result, ignoreflags=0):
2749 # Check that no ancillary data items are returned when data is
2750 # truncated inside the cmsghdr structure.
2751 msg, ancdata, flags, addr = result
2752 self.assertEqual(msg, MSG)
2753 self.checkRecvmsgAddress(addr, self.cli_addr)
2754 self.assertEqual(ancdata, [])
2755 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2756 ignore=ignoreflags)
2757
2758 def testCmsgTruncNoBufSize(self):
2759 # Check that no ancillary data is received when no buffer size
2760 # is specified.
2761 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2762 # BSD seems to set MSG_CTRUNC only
2763 # if an item has been partially
2764 # received.
2765 ignoreflags=socket.MSG_CTRUNC)
2766
2767 def _testCmsgTruncNoBufSize(self):
2768 self.createAndSendFDs(1)
2769
2770 def testCmsgTrunc0(self):
2771 # Check that no ancillary data is received when buffer size is 0.
2772 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2773 ignoreflags=socket.MSG_CTRUNC)
2774
2775 def _testCmsgTrunc0(self):
2776 self.createAndSendFDs(1)
2777
2778 # Check that no ancillary data is returned for various non-zero
2779 # (but still too small) buffer sizes.
2780
2781 def testCmsgTrunc1(self):
2782 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2783
2784 def _testCmsgTrunc1(self):
2785 self.createAndSendFDs(1)
2786
2787 def testCmsgTrunc2Int(self):
2788 # The cmsghdr structure has at least three members, two of
2789 # which are ints, so we still shouldn't see any ancillary
2790 # data.
2791 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2792 SIZEOF_INT * 2))
2793
2794 def _testCmsgTrunc2Int(self):
2795 self.createAndSendFDs(1)
2796
2797 def testCmsgTruncLen0Minus1(self):
2798 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2799 socket.CMSG_LEN(0) - 1))
2800
2801 def _testCmsgTruncLen0Minus1(self):
2802 self.createAndSendFDs(1)
2803
2804 # The following tests try to truncate the control message in the
2805 # middle of the FD array.
2806
2807 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2808 # Check that file descriptor data is truncated to between
2809 # mindata and maxdata bytes when received with buffer size
2810 # ancbuf, and that any complete file descriptor numbers are
2811 # valid.
2812 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2813 len(MSG), ancbuf)
2814 self.assertEqual(msg, MSG)
2815 self.checkRecvmsgAddress(addr, self.cli_addr)
2816 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2817
2818 if mindata == 0 and ancdata == []:
2819 return
2820 self.assertEqual(len(ancdata), 1)
2821 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2822 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2823 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2824 self.assertGreaterEqual(len(cmsg_data), mindata)
2825 self.assertLessEqual(len(cmsg_data), maxdata)
2826 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002827 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002828 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2829 self.checkFDs(fds)
2830
2831 def testCmsgTruncLen0(self):
2832 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2833
2834 def _testCmsgTruncLen0(self):
2835 self.createAndSendFDs(1)
2836
2837 def testCmsgTruncLen0Plus1(self):
2838 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2839
2840 def _testCmsgTruncLen0Plus1(self):
2841 self.createAndSendFDs(2)
2842
2843 def testCmsgTruncLen1(self):
2844 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2845 maxdata=SIZEOF_INT)
2846
2847 def _testCmsgTruncLen1(self):
2848 self.createAndSendFDs(2)
2849
2850 def testCmsgTruncLen2Minus1(self):
2851 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2852 maxdata=(2 * SIZEOF_INT) - 1)
2853
2854 def _testCmsgTruncLen2Minus1(self):
2855 self.createAndSendFDs(2)
2856
2857
2858class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2859 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2860 # features of the RFC 3542 Advanced Sockets API for IPv6.
2861 # Currently we can only handle certain data items (e.g. traffic
2862 # class, hop limit, MTU discovery and fragmentation settings)
2863 # without resorting to unportable means such as the struct module,
2864 # but the tests here are aimed at testing the ancillary data
2865 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2866 # itself.
2867
2868 # Test value to use when setting hop limit of packet
2869 hop_limit = 2
2870
2871 # Test value to use when setting traffic class of packet.
2872 # -1 means "use kernel default".
2873 traffic_class = -1
2874
2875 def ancillaryMapping(self, ancdata):
2876 # Given ancillary data list ancdata, return a mapping from
2877 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2878 # Check that no (level, type) pair appears more than once.
2879 d = {}
2880 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2881 self.assertNotIn((cmsg_level, cmsg_type), d)
2882 d[(cmsg_level, cmsg_type)] = cmsg_data
2883 return d
2884
2885 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2886 # Receive hop limit into ancbufsize bytes of ancillary data
2887 # space. Check that data is MSG, ancillary data is not
2888 # truncated (but ignore any flags in ignoreflags), and hop
2889 # limit is between 0 and maxhop inclusive.
2890 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2891 socket.IPV6_RECVHOPLIMIT, 1)
2892 self.misc_event.set()
2893 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2894 len(MSG), ancbufsize)
2895
2896 self.assertEqual(msg, MSG)
2897 self.checkRecvmsgAddress(addr, self.cli_addr)
2898 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2899 ignore=ignoreflags)
2900
2901 self.assertEqual(len(ancdata), 1)
2902 self.assertIsInstance(ancdata[0], tuple)
2903 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2904 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2905 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2906 self.assertIsInstance(cmsg_data, bytes)
2907 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2908 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002909 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002910 self.assertGreaterEqual(a[0], 0)
2911 self.assertLessEqual(a[0], maxhop)
2912
2913 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2914 def testRecvHopLimit(self):
2915 # Test receiving the packet hop limit as ancillary data.
2916 self.checkHopLimit(ancbufsize=10240)
2917
2918 @testRecvHopLimit.client_skip
2919 def _testRecvHopLimit(self):
2920 # Need to wait until server has asked to receive ancillary
2921 # data, as implementations are not required to buffer it
2922 # otherwise.
2923 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2924 self.sendToServer(MSG)
2925
2926 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2927 def testRecvHopLimitCMSG_SPACE(self):
2928 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2929 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2930
2931 @testRecvHopLimitCMSG_SPACE.client_skip
2932 def _testRecvHopLimitCMSG_SPACE(self):
2933 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2934 self.sendToServer(MSG)
2935
2936 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2937 # 3542 says portable applications must provide space for trailing
2938 # padding. Implementations may set MSG_CTRUNC if there isn't
2939 # enough space for the padding.
2940
2941 @requireAttrs(socket.socket, "sendmsg")
2942 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2943 def testSetHopLimit(self):
2944 # Test setting hop limit on outgoing packet and receiving it
2945 # at the other end.
2946 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2947
2948 @testSetHopLimit.client_skip
2949 def _testSetHopLimit(self):
2950 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2951 self.assertEqual(
2952 self.sendmsgToServer([MSG],
2953 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2954 array.array("i", [self.hop_limit]))]),
2955 len(MSG))
2956
2957 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2958 ignoreflags=0):
2959 # Receive traffic class and hop limit into ancbufsize bytes of
2960 # ancillary data space. Check that data is MSG, ancillary
2961 # data is not truncated (but ignore any flags in ignoreflags),
2962 # and traffic class and hop limit are in range (hop limit no
2963 # more than maxhop).
2964 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2965 socket.IPV6_RECVHOPLIMIT, 1)
2966 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2967 socket.IPV6_RECVTCLASS, 1)
2968 self.misc_event.set()
2969 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2970 len(MSG), ancbufsize)
2971
2972 self.assertEqual(msg, MSG)
2973 self.checkRecvmsgAddress(addr, self.cli_addr)
2974 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2975 ignore=ignoreflags)
2976 self.assertEqual(len(ancdata), 2)
2977 ancmap = self.ancillaryMapping(ancdata)
2978
2979 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2980 self.assertEqual(len(tcdata), SIZEOF_INT)
2981 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002982 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002983 self.assertGreaterEqual(a[0], 0)
2984 self.assertLessEqual(a[0], 255)
2985
2986 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2987 self.assertEqual(len(hldata), SIZEOF_INT)
2988 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002989 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002990 self.assertGreaterEqual(a[0], 0)
2991 self.assertLessEqual(a[0], maxhop)
2992
2993 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2994 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2995 def testRecvTrafficClassAndHopLimit(self):
2996 # Test receiving traffic class and hop limit as ancillary data.
2997 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2998
2999 @testRecvTrafficClassAndHopLimit.client_skip
3000 def _testRecvTrafficClassAndHopLimit(self):
3001 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3002 self.sendToServer(MSG)
3003
3004 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3005 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3006 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3007 # Test receiving traffic class and hop limit, using
3008 # CMSG_SPACE() to calculate buffer size.
3009 self.checkTrafficClassAndHopLimit(
3010 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3011
3012 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3013 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3014 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3015 self.sendToServer(MSG)
3016
3017 @requireAttrs(socket.socket, "sendmsg")
3018 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3019 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3020 def testSetTrafficClassAndHopLimit(self):
3021 # Test setting traffic class and hop limit on outgoing packet,
3022 # and receiving them at the other end.
3023 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3024 maxhop=self.hop_limit)
3025
3026 @testSetTrafficClassAndHopLimit.client_skip
3027 def _testSetTrafficClassAndHopLimit(self):
3028 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3029 self.assertEqual(
3030 self.sendmsgToServer([MSG],
3031 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3032 array.array("i", [self.traffic_class])),
3033 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3034 array.array("i", [self.hop_limit]))]),
3035 len(MSG))
3036
3037 @requireAttrs(socket.socket, "sendmsg")
3038 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3039 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3040 def testOddCmsgSize(self):
3041 # Try to send ancillary data with first item one byte too
3042 # long. Fall back to sending with correct size if this fails,
3043 # and check that second item was handled correctly.
3044 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3045 maxhop=self.hop_limit)
3046
3047 @testOddCmsgSize.client_skip
3048 def _testOddCmsgSize(self):
3049 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3050 try:
3051 nbytes = self.sendmsgToServer(
3052 [MSG],
3053 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003054 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003055 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3056 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003057 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003058 self.assertIsInstance(e.errno, int)
3059 nbytes = self.sendmsgToServer(
3060 [MSG],
3061 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3062 array.array("i", [self.traffic_class])),
3063 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3064 array.array("i", [self.hop_limit]))])
3065 self.assertEqual(nbytes, len(MSG))
3066
3067 # Tests for proper handling of truncated ancillary data
3068
3069 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3070 # Receive hop limit into ancbufsize bytes of ancillary data
3071 # space, which should be too small to contain the ancillary
3072 # data header (if ancbufsize is None, pass no second argument
3073 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3074 # (unless included in ignoreflags), and no ancillary data is
3075 # returned.
3076 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3077 socket.IPV6_RECVHOPLIMIT, 1)
3078 self.misc_event.set()
3079 args = () if ancbufsize is None else (ancbufsize,)
3080 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3081 len(MSG), *args)
3082
3083 self.assertEqual(msg, MSG)
3084 self.checkRecvmsgAddress(addr, self.cli_addr)
3085 self.assertEqual(ancdata, [])
3086 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3087 ignore=ignoreflags)
3088
3089 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3090 def testCmsgTruncNoBufSize(self):
3091 # Check that no ancillary data is received when no ancillary
3092 # buffer size is provided.
3093 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3094 # BSD seems to set
3095 # MSG_CTRUNC only if an item
3096 # has been partially
3097 # received.
3098 ignoreflags=socket.MSG_CTRUNC)
3099
3100 @testCmsgTruncNoBufSize.client_skip
3101 def _testCmsgTruncNoBufSize(self):
3102 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3103 self.sendToServer(MSG)
3104
3105 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3106 def testSingleCmsgTrunc0(self):
3107 # Check that no ancillary data is received when ancillary
3108 # buffer size is zero.
3109 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3110 ignoreflags=socket.MSG_CTRUNC)
3111
3112 @testSingleCmsgTrunc0.client_skip
3113 def _testSingleCmsgTrunc0(self):
3114 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3115 self.sendToServer(MSG)
3116
3117 # Check that no ancillary data is returned for various non-zero
3118 # (but still too small) buffer sizes.
3119
3120 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3121 def testSingleCmsgTrunc1(self):
3122 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3123
3124 @testSingleCmsgTrunc1.client_skip
3125 def _testSingleCmsgTrunc1(self):
3126 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3127 self.sendToServer(MSG)
3128
3129 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3130 def testSingleCmsgTrunc2Int(self):
3131 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3132
3133 @testSingleCmsgTrunc2Int.client_skip
3134 def _testSingleCmsgTrunc2Int(self):
3135 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3136 self.sendToServer(MSG)
3137
3138 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3139 def testSingleCmsgTruncLen0Minus1(self):
3140 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3141
3142 @testSingleCmsgTruncLen0Minus1.client_skip
3143 def _testSingleCmsgTruncLen0Minus1(self):
3144 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3145 self.sendToServer(MSG)
3146
3147 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3148 def testSingleCmsgTruncInData(self):
3149 # Test truncation of a control message inside its associated
3150 # data. The message may be returned with its data truncated,
3151 # or not returned at all.
3152 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3153 socket.IPV6_RECVHOPLIMIT, 1)
3154 self.misc_event.set()
3155 msg, ancdata, flags, addr = self.doRecvmsg(
3156 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3157
3158 self.assertEqual(msg, MSG)
3159 self.checkRecvmsgAddress(addr, self.cli_addr)
3160 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3161
3162 self.assertLessEqual(len(ancdata), 1)
3163 if ancdata:
3164 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3165 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3166 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3167 self.assertLess(len(cmsg_data), SIZEOF_INT)
3168
3169 @testSingleCmsgTruncInData.client_skip
3170 def _testSingleCmsgTruncInData(self):
3171 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3172 self.sendToServer(MSG)
3173
3174 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3175 # Receive traffic class and hop limit into ancbufsize bytes of
3176 # ancillary data space, which should be large enough to
3177 # contain the first item, but too small to contain the header
3178 # of the second. Check that data is MSG, MSG_CTRUNC is set
3179 # (unless included in ignoreflags), and only one ancillary
3180 # data item is returned.
3181 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3182 socket.IPV6_RECVHOPLIMIT, 1)
3183 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3184 socket.IPV6_RECVTCLASS, 1)
3185 self.misc_event.set()
3186 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3187 len(MSG), ancbufsize)
3188
3189 self.assertEqual(msg, MSG)
3190 self.checkRecvmsgAddress(addr, self.cli_addr)
3191 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3192 ignore=ignoreflags)
3193
3194 self.assertEqual(len(ancdata), 1)
3195 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3196 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3197 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3198 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3199 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003200 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003201 self.assertGreaterEqual(a[0], 0)
3202 self.assertLessEqual(a[0], 255)
3203
3204 # Try the above test with various buffer sizes.
3205
3206 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3207 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3208 def testSecondCmsgTrunc0(self):
3209 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3210 ignoreflags=socket.MSG_CTRUNC)
3211
3212 @testSecondCmsgTrunc0.client_skip
3213 def _testSecondCmsgTrunc0(self):
3214 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3215 self.sendToServer(MSG)
3216
3217 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3218 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3219 def testSecondCmsgTrunc1(self):
3220 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3221
3222 @testSecondCmsgTrunc1.client_skip
3223 def _testSecondCmsgTrunc1(self):
3224 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3225 self.sendToServer(MSG)
3226
3227 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3228 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3229 def testSecondCmsgTrunc2Int(self):
3230 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3231 2 * SIZEOF_INT)
3232
3233 @testSecondCmsgTrunc2Int.client_skip
3234 def _testSecondCmsgTrunc2Int(self):
3235 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3236 self.sendToServer(MSG)
3237
3238 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3239 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3240 def testSecondCmsgTruncLen0Minus1(self):
3241 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3242 socket.CMSG_LEN(0) - 1)
3243
3244 @testSecondCmsgTruncLen0Minus1.client_skip
3245 def _testSecondCmsgTruncLen0Minus1(self):
3246 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3247 self.sendToServer(MSG)
3248
3249 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3250 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3251 def testSecomdCmsgTruncInData(self):
3252 # Test truncation of the second of two control messages inside
3253 # its associated data.
3254 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3255 socket.IPV6_RECVHOPLIMIT, 1)
3256 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3257 socket.IPV6_RECVTCLASS, 1)
3258 self.misc_event.set()
3259 msg, ancdata, flags, addr = self.doRecvmsg(
3260 self.serv_sock, len(MSG),
3261 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3262
3263 self.assertEqual(msg, MSG)
3264 self.checkRecvmsgAddress(addr, self.cli_addr)
3265 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3266
3267 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3268
3269 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3270 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3271 cmsg_types.remove(cmsg_type)
3272 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3273 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003274 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003275 self.assertGreaterEqual(a[0], 0)
3276 self.assertLessEqual(a[0], 255)
3277
3278 if ancdata:
3279 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3280 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3281 cmsg_types.remove(cmsg_type)
3282 self.assertLess(len(cmsg_data), SIZEOF_INT)
3283
3284 self.assertEqual(ancdata, [])
3285
3286 @testSecomdCmsgTruncInData.client_skip
3287 def _testSecomdCmsgTruncInData(self):
3288 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3289 self.sendToServer(MSG)
3290
3291
3292# Derive concrete test classes for different socket types.
3293
3294class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3295 SendrecvmsgConnectionlessBase,
3296 ThreadedSocketTestMixin, UDPTestBase):
3297 pass
3298
3299@requireAttrs(socket.socket, "sendmsg")
3300@unittest.skipUnless(thread, 'Threading required for this test.')
3301class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3302 pass
3303
3304@requireAttrs(socket.socket, "recvmsg")
3305@unittest.skipUnless(thread, 'Threading required for this test.')
3306class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3307 pass
3308
3309@requireAttrs(socket.socket, "recvmsg_into")
3310@unittest.skipUnless(thread, 'Threading required for this test.')
3311class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3312 pass
3313
3314
3315class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3316 SendrecvmsgConnectionlessBase,
3317 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003318
3319 def checkRecvmsgAddress(self, addr1, addr2):
3320 # Called to compare the received address with the address of
3321 # the peer, ignoring scope ID
3322 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003323
3324@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003325@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003326@requireSocket("AF_INET6", "SOCK_DGRAM")
3327@unittest.skipUnless(thread, 'Threading required for this test.')
3328class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3329 pass
3330
3331@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003332@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003333@requireSocket("AF_INET6", "SOCK_DGRAM")
3334@unittest.skipUnless(thread, 'Threading required for this test.')
3335class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3336 pass
3337
3338@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003339@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003340@requireSocket("AF_INET6", "SOCK_DGRAM")
3341@unittest.skipUnless(thread, 'Threading required for this test.')
3342class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3343 pass
3344
3345@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003346@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003347@requireAttrs(socket, "IPPROTO_IPV6")
3348@requireSocket("AF_INET6", "SOCK_DGRAM")
3349@unittest.skipUnless(thread, 'Threading required for this test.')
3350class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3351 SendrecvmsgUDP6TestBase):
3352 pass
3353
3354@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003355@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003356@requireAttrs(socket, "IPPROTO_IPV6")
3357@requireSocket("AF_INET6", "SOCK_DGRAM")
3358@unittest.skipUnless(thread, 'Threading required for this test.')
3359class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3360 RFC3542AncillaryTest,
3361 SendrecvmsgUDP6TestBase):
3362 pass
3363
3364
3365class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3366 ConnectedStreamTestMixin, TCPTestBase):
3367 pass
3368
3369@requireAttrs(socket.socket, "sendmsg")
3370@unittest.skipUnless(thread, 'Threading required for this test.')
3371class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3372 pass
3373
3374@requireAttrs(socket.socket, "recvmsg")
3375@unittest.skipUnless(thread, 'Threading required for this test.')
3376class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3377 SendrecvmsgTCPTestBase):
3378 pass
3379
3380@requireAttrs(socket.socket, "recvmsg_into")
3381@unittest.skipUnless(thread, 'Threading required for this test.')
3382class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3383 SendrecvmsgTCPTestBase):
3384 pass
3385
3386
3387class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3388 SendrecvmsgConnectedBase,
3389 ConnectedStreamTestMixin, SCTPStreamBase):
3390 pass
3391
3392@requireAttrs(socket.socket, "sendmsg")
3393@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3394@unittest.skipUnless(thread, 'Threading required for this test.')
3395class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3396 pass
3397
3398@requireAttrs(socket.socket, "recvmsg")
3399@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3400@unittest.skipUnless(thread, 'Threading required for this test.')
3401class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3402 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003403
3404 def testRecvmsgEOF(self):
3405 try:
3406 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3407 except OSError as e:
3408 if e.errno != errno.ENOTCONN:
3409 raise
3410 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003411
3412@requireAttrs(socket.socket, "recvmsg_into")
3413@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3414@unittest.skipUnless(thread, 'Threading required for this test.')
3415class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3416 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003417
3418 def testRecvmsgEOF(self):
3419 try:
3420 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3421 except OSError as e:
3422 if e.errno != errno.ENOTCONN:
3423 raise
3424 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003425
3426
3427class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3428 ConnectedStreamTestMixin, UnixStreamBase):
3429 pass
3430
3431@requireAttrs(socket.socket, "sendmsg")
3432@requireAttrs(socket, "AF_UNIX")
3433@unittest.skipUnless(thread, 'Threading required for this test.')
3434class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3435 pass
3436
3437@requireAttrs(socket.socket, "recvmsg")
3438@requireAttrs(socket, "AF_UNIX")
3439@unittest.skipUnless(thread, 'Threading required for this test.')
3440class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3441 SendrecvmsgUnixStreamTestBase):
3442 pass
3443
3444@requireAttrs(socket.socket, "recvmsg_into")
3445@requireAttrs(socket, "AF_UNIX")
3446@unittest.skipUnless(thread, 'Threading required for this test.')
3447class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3448 SendrecvmsgUnixStreamTestBase):
3449 pass
3450
3451@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3452@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3453@unittest.skipUnless(thread, 'Threading required for this test.')
3454class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3455 pass
3456
3457@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3458@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3459@unittest.skipUnless(thread, 'Threading required for this test.')
3460class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3461 SendrecvmsgUnixStreamTestBase):
3462 pass
3463
3464
3465# Test interrupting the interruptible send/receive methods with a
3466# signal when a timeout is set. These tests avoid having multiple
3467# threads alive during the test so that the OS cannot deliver the
3468# signal to the wrong one.
3469
3470class InterruptedTimeoutBase(unittest.TestCase):
3471 # Base class for interrupted send/receive tests. Installs an
3472 # empty handler for SIGALRM and removes it on teardown, along with
3473 # any scheduled alarms.
3474
3475 def setUp(self):
3476 super().setUp()
3477 orig_alrm_handler = signal.signal(signal.SIGALRM,
3478 lambda signum, frame: None)
3479 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3480 self.addCleanup(self.setAlarm, 0)
3481
3482 # Timeout for socket operations
3483 timeout = 4.0
3484
3485 # Provide setAlarm() method to schedule delivery of SIGALRM after
3486 # given number of seconds, or cancel it if zero, and an
3487 # appropriate time value to use. Use setitimer() if available.
3488 if hasattr(signal, "setitimer"):
3489 alarm_time = 0.05
3490
3491 def setAlarm(self, seconds):
3492 signal.setitimer(signal.ITIMER_REAL, seconds)
3493 else:
3494 # Old systems may deliver the alarm up to one second early
3495 alarm_time = 2
3496
3497 def setAlarm(self, seconds):
3498 signal.alarm(seconds)
3499
3500
3501# Require siginterrupt() in order to ensure that system calls are
3502# interrupted by default.
3503@requireAttrs(signal, "siginterrupt")
3504@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3505 "Don't have signal.alarm or signal.setitimer")
3506class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3507 # Test interrupting the recv*() methods with signals when a
3508 # timeout is set.
3509
3510 def setUp(self):
3511 super().setUp()
3512 self.serv.settimeout(self.timeout)
3513
3514 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003515 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003516 # errno of EINTR when interrupted by a signal.
3517 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003518 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003519 func(*args, **kwargs)
3520 self.assertNotIsInstance(cm.exception, socket.timeout)
3521 self.assertEqual(cm.exception.errno, errno.EINTR)
3522
3523 def testInterruptedRecvTimeout(self):
3524 self.checkInterruptedRecv(self.serv.recv, 1024)
3525
3526 def testInterruptedRecvIntoTimeout(self):
3527 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3528
3529 def testInterruptedRecvfromTimeout(self):
3530 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3531
3532 def testInterruptedRecvfromIntoTimeout(self):
3533 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3534
3535 @requireAttrs(socket.socket, "recvmsg")
3536 def testInterruptedRecvmsgTimeout(self):
3537 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3538
3539 @requireAttrs(socket.socket, "recvmsg_into")
3540 def testInterruptedRecvmsgIntoTimeout(self):
3541 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3542
3543
3544# Require siginterrupt() in order to ensure that system calls are
3545# interrupted by default.
3546@requireAttrs(signal, "siginterrupt")
3547@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3548 "Don't have signal.alarm or signal.setitimer")
3549@unittest.skipUnless(thread, 'Threading required for this test.')
3550class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3551 ThreadSafeCleanupTestCase,
3552 SocketListeningTestMixin, TCPTestBase):
3553 # Test interrupting the interruptible send*() methods with signals
3554 # when a timeout is set.
3555
3556 def setUp(self):
3557 super().setUp()
3558 self.serv_conn = self.newSocket()
3559 self.addCleanup(self.serv_conn.close)
3560 # Use a thread to complete the connection, but wait for it to
3561 # terminate before running the test, so that there is only one
3562 # thread to accept the signal.
3563 cli_thread = threading.Thread(target=self.doConnect)
3564 cli_thread.start()
3565 self.cli_conn, addr = self.serv.accept()
3566 self.addCleanup(self.cli_conn.close)
3567 cli_thread.join()
3568 self.serv_conn.settimeout(self.timeout)
3569
3570 def doConnect(self):
3571 self.serv_conn.connect(self.serv_addr)
3572
3573 def checkInterruptedSend(self, func, *args, **kwargs):
3574 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003575 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003576 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003577 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003578 while True:
3579 self.setAlarm(self.alarm_time)
3580 func(*args, **kwargs)
3581 self.assertNotIsInstance(cm.exception, socket.timeout)
3582 self.assertEqual(cm.exception.errno, errno.EINTR)
3583
Nick Coghlan2496f332011-09-19 20:26:31 +10003584 # Issue #12958: The following tests have problems on Mac OS X
3585 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003586 def testInterruptedSendTimeout(self):
3587 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3588
Nick Coghlan2496f332011-09-19 20:26:31 +10003589 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003590 def testInterruptedSendtoTimeout(self):
3591 # Passing an actual address here as Python's wrapper for
3592 # sendto() doesn't allow passing a zero-length one; POSIX
3593 # requires that the address is ignored since the socket is
3594 # connection-mode, however.
3595 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3596 self.serv_addr)
3597
Nick Coghlan2496f332011-09-19 20:26:31 +10003598 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003599 @requireAttrs(socket.socket, "sendmsg")
3600 def testInterruptedSendmsgTimeout(self):
3601 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3602
3603
Victor Stinner45df8202010-04-28 22:31:17 +00003604@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003605class TCPCloserTest(ThreadedTCPSocketTest):
3606
3607 def testClose(self):
3608 conn, addr = self.serv.accept()
3609 conn.close()
3610
3611 sd = self.cli
3612 read, write, err = select.select([sd], [], [], 1.0)
3613 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003614 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003615
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003616 # Calling close() many times should be safe.
3617 conn.close()
3618 conn.close()
3619
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003620 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003621 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003622 time.sleep(1.0)
3623
Victor Stinner45df8202010-04-28 22:31:17 +00003624@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003625class BasicSocketPairTest(SocketPairTest):
3626
3627 def __init__(self, methodName='runTest'):
3628 SocketPairTest.__init__(self, methodName=methodName)
3629
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003630 def _check_defaults(self, sock):
3631 self.assertIsInstance(sock, socket.socket)
3632 if hasattr(socket, 'AF_UNIX'):
3633 self.assertEqual(sock.family, socket.AF_UNIX)
3634 else:
3635 self.assertEqual(sock.family, socket.AF_INET)
3636 self.assertEqual(sock.type, socket.SOCK_STREAM)
3637 self.assertEqual(sock.proto, 0)
3638
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003639 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003640 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003641
3642 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003643 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003644
Dave Cole331708b2004-08-09 04:51:41 +00003645 def testRecv(self):
3646 msg = self.serv.recv(1024)
3647 self.assertEqual(msg, MSG)
3648
3649 def _testRecv(self):
3650 self.cli.send(MSG)
3651
3652 def testSend(self):
3653 self.serv.send(MSG)
3654
3655 def _testSend(self):
3656 msg = self.cli.recv(1024)
3657 self.assertEqual(msg, MSG)
3658
Victor Stinner45df8202010-04-28 22:31:17 +00003659@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003660class NonBlockingTCPTests(ThreadedTCPSocketTest):
3661
3662 def __init__(self, methodName='runTest'):
3663 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3664
3665 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003666 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003667 self.serv.setblocking(True)
3668 self.assertIsNone(self.serv.gettimeout())
3669 self.serv.setblocking(False)
3670 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003671 start = time.time()
3672 try:
3673 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003674 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003675 pass
3676 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003677 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Serhiy Storchaka78980432013-01-15 01:12:17 +02003678 # Issue 15989
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003679 if _testcapi.UINT_MAX < _testcapi.ULONG_MAX:
3680 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3681 self.assertIsNone(self.serv.gettimeout())
Guido van Rossum24e4af82002-06-12 19:18:08 +00003682
3683 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003684 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003685
Antoine Pitroub1c54962010-10-14 15:05:38 +00003686 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003687 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003688 def testInitNonBlocking(self):
3689 # reinit server socket
3690 self.serv.close()
3691 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003692 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003693 self.port = support.bind_port(self.serv)
3694 self.serv.listen(1)
3695 # actual testing
3696 start = time.time()
3697 try:
3698 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003699 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003700 pass
3701 end = time.time()
3702 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3703
3704 def _testInitNonBlocking(self):
3705 pass
3706
Antoine Pitrou600232b2011-01-05 21:03:42 +00003707 def testInheritFlags(self):
3708 # Issue #7995: when calling accept() on a listening socket with a
3709 # timeout, the resulting socket should not be non-blocking.
3710 self.serv.settimeout(10)
3711 try:
3712 conn, addr = self.serv.accept()
3713 message = conn.recv(len(MSG))
3714 finally:
3715 conn.close()
3716 self.serv.settimeout(None)
3717
3718 def _testInheritFlags(self):
3719 time.sleep(0.1)
3720 self.cli.connect((HOST, self.port))
3721 time.sleep(0.5)
3722 self.cli.send(MSG)
3723
Guido van Rossum24e4af82002-06-12 19:18:08 +00003724 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003725 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003726 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003727 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003728 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003729 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003730 pass
3731 else:
3732 self.fail("Error trying to do non-blocking accept.")
3733 read, write, err = select.select([self.serv], [], [])
3734 if self.serv in read:
3735 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003736 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003737 else:
3738 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003739
Guido van Rossum24e4af82002-06-12 19:18:08 +00003740 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003741 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003742 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003743
3744 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003745 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003746 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003747 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003748
3749 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003750 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003751 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003752
3753 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003754 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003755 conn, addr = self.serv.accept()
3756 conn.setblocking(0)
3757 try:
3758 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003759 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003760 pass
3761 else:
3762 self.fail("Error trying to do non-blocking recv.")
3763 read, write, err = select.select([conn], [], [])
3764 if conn in read:
3765 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003766 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003767 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003768 else:
3769 self.fail("Error during select call to non-blocking socket.")
3770
3771 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003772 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003773 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003774 self.cli.send(MSG)
3775
Victor Stinner45df8202010-04-28 22:31:17 +00003776@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003777class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003778 """Unit tests for the object returned by socket.makefile()
3779
Antoine Pitrou834bd812010-10-13 16:17:14 +00003780 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003781 the client connection. You can read from this file to
3782 get output from the server.
3783
Antoine Pitrou834bd812010-10-13 16:17:14 +00003784 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003785 server connection. You can write to this file to send output
3786 to the client.
3787 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003788
Guido van Rossume9f66142002-08-07 15:46:19 +00003789 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003790 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003791 errors = 'strict'
3792 newline = None
3793
3794 read_mode = 'rb'
3795 read_msg = MSG
3796 write_mode = 'wb'
3797 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003798
Guido van Rossum24e4af82002-06-12 19:18:08 +00003799 def __init__(self, methodName='runTest'):
3800 SocketConnectedTest.__init__(self, methodName=methodName)
3801
3802 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003803 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3804 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003805 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003806 self.read_file = self.cli_conn.makefile(
3807 self.read_mode, self.bufsize,
3808 encoding = self.encoding,
3809 errors = self.errors,
3810 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003811
3812 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003813 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003814 self.read_file.close()
3815 self.assertTrue(self.read_file.closed)
3816 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003817 SocketConnectedTest.tearDown(self)
3818
3819 def clientSetUp(self):
3820 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003821 self.write_file = self.serv_conn.makefile(
3822 self.write_mode, self.bufsize,
3823 encoding = self.encoding,
3824 errors = self.errors,
3825 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003826
3827 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003828 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003829 self.write_file.close()
3830 self.assertTrue(self.write_file.closed)
3831 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003832 SocketConnectedTest.clientTearDown(self)
3833
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003834 def testReadAfterTimeout(self):
3835 # Issue #7322: A file object must disallow further reads
3836 # after a timeout has occurred.
3837 self.cli_conn.settimeout(1)
3838 self.read_file.read(3)
3839 # First read raises a timeout
3840 self.assertRaises(socket.timeout, self.read_file.read, 1)
3841 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003842 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003843 self.read_file.read(1)
3844 self.assertIn("cannot read from timed out object", str(ctx.exception))
3845
3846 def _testReadAfterTimeout(self):
3847 self.write_file.write(self.write_msg[0:3])
3848 self.write_file.flush()
3849 self.serv_finished.wait()
3850
Guido van Rossum24e4af82002-06-12 19:18:08 +00003851 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003852 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003853 first_seg = self.read_file.read(len(self.read_msg)-3)
3854 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003855 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003856 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003857
3858 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003859 self.write_file.write(self.write_msg)
3860 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003861
Guido van Rossum8c943832002-08-08 01:00:28 +00003862 def testFullRead(self):
3863 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003864 msg = self.read_file.read()
3865 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003866
3867 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003868 self.write_file.write(self.write_msg)
3869 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003870
Guido van Rossum24e4af82002-06-12 19:18:08 +00003871 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003872 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003873 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003874 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003875 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003876 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003877 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003878 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003879 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003880
3881 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003882 self.write_file.write(self.write_msg)
3883 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003884
3885 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003886 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003887 line = self.read_file.readline()
3888 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003889
3890 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003891 self.write_file.write(self.write_msg)
3892 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003893
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003894 def testCloseAfterMakefile(self):
3895 # The file returned by makefile should keep the socket open.
3896 self.cli_conn.close()
3897 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003898 msg = self.read_file.read()
3899 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003900
3901 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003902 self.write_file.write(self.write_msg)
3903 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003904
3905 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003906 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003907 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003908 if isinstance(self.read_msg, str):
3909 msg = msg.decode()
3910 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003911
3912 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003913 self.write_file.write(self.write_msg)
3914 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003915
Tim Peters116d83c2004-03-28 02:20:45 +00003916 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003917 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003918
3919 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003920 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003921
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003922 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003923 self.assertEqual(self.read_file.mode, self.read_mode)
3924 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003925
3926 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003927 self.assertEqual(self.write_file.mode, self.write_mode)
3928 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003929
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003930 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003931 self.read_file.close()
3932 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003933 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003934 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003935
3936 def _testRealClose(self):
3937 pass
3938
3939
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003940class FileObjectInterruptedTestCase(unittest.TestCase):
3941 """Test that the file object correctly handles EINTR internally."""
3942
3943 class MockSocket(object):
3944 def __init__(self, recv_funcs=()):
3945 # A generator that returns callables that we'll call for each
3946 # call to recv().
3947 self._recv_step = iter(recv_funcs)
3948
3949 def recv_into(self, buffer):
3950 data = next(self._recv_step)()
3951 assert len(buffer) >= len(data)
3952 buffer[:len(data)] = data
3953 return len(data)
3954
3955 def _decref_socketios(self):
3956 pass
3957
3958 def _textiowrap_for_test(self, buffering=-1):
3959 raw = socket.SocketIO(self, "r")
3960 if buffering < 0:
3961 buffering = io.DEFAULT_BUFFER_SIZE
3962 if buffering == 0:
3963 return raw
3964 buffer = io.BufferedReader(raw, buffering)
3965 text = io.TextIOWrapper(buffer, None, None)
3966 text.mode = "rb"
3967 return text
3968
3969 @staticmethod
3970 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02003971 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003972
3973 def _textiowrap_mock_socket(self, mock, buffering=-1):
3974 raw = socket.SocketIO(mock, "r")
3975 if buffering < 0:
3976 buffering = io.DEFAULT_BUFFER_SIZE
3977 if buffering == 0:
3978 return raw
3979 buffer = io.BufferedReader(raw, buffering)
3980 text = io.TextIOWrapper(buffer, None, None)
3981 text.mode = "rb"
3982 return text
3983
3984 def _test_readline(self, size=-1, buffering=-1):
3985 mock_sock = self.MockSocket(recv_funcs=[
3986 lambda : b"This is the first line\nAnd the sec",
3987 self._raise_eintr,
3988 lambda : b"ond line is here\n",
3989 lambda : b"",
3990 lambda : b"", # XXX(gps): io library does an extra EOF read
3991 ])
3992 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003993 self.assertEqual(fo.readline(size), "This is the first line\n")
3994 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003995
3996 def _test_read(self, size=-1, buffering=-1):
3997 mock_sock = self.MockSocket(recv_funcs=[
3998 lambda : b"This is the first line\nAnd the sec",
3999 self._raise_eintr,
4000 lambda : b"ond line is here\n",
4001 lambda : b"",
4002 lambda : b"", # XXX(gps): io library does an extra EOF read
4003 ])
4004 expecting = (b"This is the first line\n"
4005 b"And the second line is here\n")
4006 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4007 if buffering == 0:
4008 data = b''
4009 else:
4010 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004011 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004012 while len(data) != len(expecting):
4013 part = fo.read(size)
4014 if not part:
4015 break
4016 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004017 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004018
4019 def test_default(self):
4020 self._test_readline()
4021 self._test_readline(size=100)
4022 self._test_read()
4023 self._test_read(size=100)
4024
4025 def test_with_1k_buffer(self):
4026 self._test_readline(buffering=1024)
4027 self._test_readline(size=100, buffering=1024)
4028 self._test_read(buffering=1024)
4029 self._test_read(size=100, buffering=1024)
4030
4031 def _test_readline_no_buffer(self, size=-1):
4032 mock_sock = self.MockSocket(recv_funcs=[
4033 lambda : b"a",
4034 lambda : b"\n",
4035 lambda : b"B",
4036 self._raise_eintr,
4037 lambda : b"b",
4038 lambda : b"",
4039 ])
4040 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004041 self.assertEqual(fo.readline(size), b"a\n")
4042 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004043
4044 def test_no_buffer(self):
4045 self._test_readline_no_buffer()
4046 self._test_readline_no_buffer(size=4)
4047 self._test_read(buffering=0)
4048 self._test_read(size=100, buffering=0)
4049
4050
Guido van Rossume9f66142002-08-07 15:46:19 +00004051class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4052
4053 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004054
Guido van Rossume9f66142002-08-07 15:46:19 +00004055 In this case (and in this case only), it should be possible to
4056 create a file object, read a line from it, create another file
4057 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004058 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004059 when reading multiple requests from the same socket."""
4060
4061 bufsize = 0 # Use unbuffered mode
4062
4063 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004064 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004065 line = self.read_file.readline() # first line
4066 self.assertEqual(line, b"A. " + self.write_msg) # first line
4067 self.read_file = self.cli_conn.makefile('rb', 0)
4068 line = self.read_file.readline() # second line
4069 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004070
4071 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004072 self.write_file.write(b"A. " + self.write_msg)
4073 self.write_file.write(b"B. " + self.write_msg)
4074 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004075
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004076 def testMakefileClose(self):
4077 # The file returned by makefile should keep the socket open...
4078 self.cli_conn.close()
4079 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004080 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004081 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004082 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004083 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004084
4085 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004086 self.write_file.write(self.write_msg)
4087 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004088
4089 def testMakefileCloseSocketDestroy(self):
4090 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004091 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004092 refcount_after = sys.getrefcount(self.cli_conn)
4093 self.assertEqual(refcount_before - 1, refcount_after)
4094
4095 def _testMakefileCloseSocketDestroy(self):
4096 pass
4097
Antoine Pitrou98b46702010-09-18 22:59:00 +00004098 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004099 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004100 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4101
4102 def testSmallReadNonBlocking(self):
4103 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004104 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4105 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004106 self.evt1.set()
4107 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004108 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004109 if first_seg is None:
4110 # Data not arrived (can happen under Windows), wait a bit
4111 time.sleep(0.5)
4112 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004113 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004114 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004115 self.assertEqual(n, 3)
4116 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004117 self.assertEqual(msg, self.read_msg)
4118 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4119 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004120
4121 def _testSmallReadNonBlocking(self):
4122 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004123 self.write_file.write(self.write_msg)
4124 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004125 self.evt2.set()
4126 # Avoid cloding the socket before the server test has finished,
4127 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4128 self.serv_finished.wait(5.0)
4129
4130 def testWriteNonBlocking(self):
4131 self.cli_finished.wait(5.0)
4132 # The client thread can't skip directly - the SkipTest exception
4133 # would appear as a failure.
4134 if self.serv_skipped:
4135 self.skipTest(self.serv_skipped)
4136
4137 def _testWriteNonBlocking(self):
4138 self.serv_skipped = None
4139 self.serv_conn.setblocking(False)
4140 # Try to saturate the socket buffer pipe with repeated large writes.
4141 BIG = b"x" * (1024 ** 2)
4142 LIMIT = 10
4143 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004144 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004145 self.assertGreater(n, 0)
4146 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004147 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004148 if n is None:
4149 # Succeeded
4150 break
4151 self.assertGreater(n, 0)
4152 else:
4153 # Let us know that this test didn't manage to establish
4154 # the expected conditions. This is not a failure in itself but,
4155 # if it happens repeatedly, the test should be fixed.
4156 self.serv_skipped = "failed to saturate the socket buffer"
4157
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004158
Guido van Rossum8c943832002-08-08 01:00:28 +00004159class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4160
4161 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4162
4163
4164class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4165
4166 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004167
Thomas Woutersb2137042007-02-01 18:02:27 +00004168
Antoine Pitrou834bd812010-10-13 16:17:14 +00004169class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4170 """Tests for socket.makefile() in text mode (rather than binary)"""
4171
4172 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004173 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004174 write_mode = 'wb'
4175 write_msg = MSG
4176 newline = ''
4177
4178
4179class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4180 """Tests for socket.makefile() in text mode (rather than binary)"""
4181
4182 read_mode = 'rb'
4183 read_msg = MSG
4184 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004185 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004186 newline = ''
4187
4188
4189class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4190 """Tests for socket.makefile() in text mode (rather than binary)"""
4191
4192 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004193 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004194 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004195 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004196 newline = ''
4197
4198
Guido van Rossumd8faa362007-04-27 19:54:29 +00004199class NetworkConnectionTest(object):
4200 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004201
Guido van Rossumd8faa362007-04-27 19:54:29 +00004202 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004203 # We're inherited below by BasicTCPTest2, which also inherits
4204 # BasicTCPTest, which defines self.port referenced below.
4205 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004206 self.serv_conn = self.cli
4207
4208class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4209 """Tests that NetworkConnection does not break existing TCP functionality.
4210 """
4211
4212class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004213
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004214 class MockSocket(socket.socket):
4215 def connect(self, *args):
4216 raise socket.timeout('timed out')
4217
4218 @contextlib.contextmanager
4219 def mocked_socket_module(self):
4220 """Return a socket which times out on connect"""
4221 old_socket = socket.socket
4222 socket.socket = self.MockSocket
4223 try:
4224 yield
4225 finally:
4226 socket.socket = old_socket
4227
4228 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004229 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004230 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004231 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004232 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004233 cli.connect((HOST, port))
4234 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4235
4236 def test_create_connection(self):
4237 # Issue #9792: errors raised by create_connection() should have
4238 # a proper errno attribute.
4239 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004240 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004241 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004242
4243 # Issue #16257: create_connection() calls getaddrinfo() against
4244 # 'localhost'. This may result in an IPV6 addr being returned
4245 # as well as an IPV4 one:
4246 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4247 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4248 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4249 #
4250 # create_connection() enumerates through all the addresses returned
4251 # and if it doesn't successfully bind to any of them, it propagates
4252 # the last exception it encountered.
4253 #
4254 # On Solaris, ENETUNREACH is returned in this circumstance instead
4255 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4256 # expected errnos.
4257 expected_errnos = [ errno.ECONNREFUSED, ]
4258 if hasattr(errno, 'ENETUNREACH'):
4259 expected_errnos.append(errno.ENETUNREACH)
4260
4261 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004262
4263 def test_create_connection_timeout(self):
4264 # Issue #9792: create_connection() should not recast timeout errors
4265 # as generic socket errors.
4266 with self.mocked_socket_module():
4267 with self.assertRaises(socket.timeout):
4268 socket.create_connection((HOST, 1234))
4269
Guido van Rossumd8faa362007-04-27 19:54:29 +00004270
Victor Stinner45df8202010-04-28 22:31:17 +00004271@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004272class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4273
4274 def __init__(self, methodName='runTest'):
4275 SocketTCPTest.__init__(self, methodName=methodName)
4276 ThreadableTest.__init__(self)
4277
4278 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004279 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004280
4281 def clientTearDown(self):
4282 self.cli.close()
4283 self.cli = None
4284 ThreadableTest.clientTearDown(self)
4285
4286 def _justAccept(self):
4287 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004288 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004289
4290 testFamily = _justAccept
4291 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004292 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004293 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004294 self.assertEqual(self.cli.family, 2)
4295
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004296 testSourceAddress = _justAccept
4297 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004298 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4299 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004300 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004301 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004302 # The port number being used is sufficient to show that the bind()
4303 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004304
Guido van Rossumd8faa362007-04-27 19:54:29 +00004305 testTimeoutDefault = _justAccept
4306 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004307 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004308 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004309 socket.setdefaulttimeout(42)
4310 try:
4311 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004312 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004313 finally:
4314 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004315 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004316
4317 testTimeoutNone = _justAccept
4318 def _testTimeoutNone(self):
4319 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004320 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004321 socket.setdefaulttimeout(30)
4322 try:
4323 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004324 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004325 finally:
4326 socket.setdefaulttimeout(None)
4327 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004328
4329 testTimeoutValueNamed = _justAccept
4330 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004331 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004332 self.assertEqual(self.cli.gettimeout(), 30)
4333
4334 testTimeoutValueNonamed = _justAccept
4335 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004336 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004337 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004338 self.assertEqual(self.cli.gettimeout(), 30)
4339
Victor Stinner45df8202010-04-28 22:31:17 +00004340@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004341class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4342
4343 def __init__(self, methodName='runTest'):
4344 SocketTCPTest.__init__(self, methodName=methodName)
4345 ThreadableTest.__init__(self)
4346
4347 def clientSetUp(self):
4348 pass
4349
4350 def clientTearDown(self):
4351 self.cli.close()
4352 self.cli = None
4353 ThreadableTest.clientTearDown(self)
4354
4355 def testInsideTimeout(self):
4356 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004357 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004358 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004359 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004360 testOutsideTimeout = testInsideTimeout
4361
4362 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004363 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004364 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004365 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004366
4367 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004368 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004369 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004370
4371
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004372class TCPTimeoutTest(SocketTCPTest):
4373
4374 def testTCPTimeout(self):
4375 def raise_timeout(*args, **kwargs):
4376 self.serv.settimeout(1.0)
4377 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004378 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004379 "Error generating a timeout exception (TCP)")
4380
4381 def testTimeoutZero(self):
4382 ok = False
4383 try:
4384 self.serv.settimeout(0.0)
4385 foo = self.serv.accept()
4386 except socket.timeout:
4387 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004388 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004389 ok = True
4390 except:
4391 self.fail("caught unexpected exception (TCP)")
4392 if not ok:
4393 self.fail("accept() returned success when we did not expect it")
4394
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004395 def testInterruptedTimeout(self):
4396 # XXX I don't know how to do this test on MSWindows or any other
4397 # plaform that doesn't support signal.alarm() or os.kill(), though
4398 # the bug should have existed on all platforms.
4399 if not hasattr(signal, "alarm"):
4400 return # can only test on *nix
4401 self.serv.settimeout(5.0) # must be longer than alarm
4402 class Alarm(Exception):
4403 pass
4404 def alarm_handler(signal, frame):
4405 raise Alarm
4406 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4407 try:
4408 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4409 try:
4410 foo = self.serv.accept()
4411 except socket.timeout:
4412 self.fail("caught timeout instead of Alarm")
4413 except Alarm:
4414 pass
4415 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004416 self.fail("caught other exception instead of Alarm:"
4417 " %s(%s):\n%s" %
4418 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004419 else:
4420 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004421 finally:
4422 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004423 except Alarm:
4424 self.fail("got Alarm in wrong place")
4425 finally:
4426 # no alarm can be pending. Safe to restore old handler.
4427 signal.signal(signal.SIGALRM, old_alarm)
4428
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004429class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004430
4431 def testUDPTimeout(self):
4432 def raise_timeout(*args, **kwargs):
4433 self.serv.settimeout(1.0)
4434 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004435 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004436 "Error generating a timeout exception (UDP)")
4437
4438 def testTimeoutZero(self):
4439 ok = False
4440 try:
4441 self.serv.settimeout(0.0)
4442 foo = self.serv.recv(1024)
4443 except socket.timeout:
4444 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004445 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004446 ok = True
4447 except:
4448 self.fail("caught unexpected exception (UDP)")
4449 if not ok:
4450 self.fail("recv() returned success when we did not expect it")
4451
4452class TestExceptions(unittest.TestCase):
4453
4454 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004455 self.assertTrue(issubclass(OSError, Exception))
4456 self.assertTrue(issubclass(socket.herror, OSError))
4457 self.assertTrue(issubclass(socket.gaierror, OSError))
4458 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004459
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004460class TestLinuxAbstractNamespace(unittest.TestCase):
4461
4462 UNIX_PATH_MAX = 108
4463
4464 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004465 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004466 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4467 s1.bind(address)
4468 s1.listen(1)
4469 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4470 s2.connect(s1.getsockname())
4471 with s1.accept()[0] as s3:
4472 self.assertEqual(s1.getsockname(), address)
4473 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004474
4475 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004476 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004477 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4478 s.bind(address)
4479 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004480
4481 def testNameOverflow(self):
4482 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004483 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004484 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004485
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004486 def testStrName(self):
4487 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004488 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4489 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004490 s.bind("\x00python\x00test\x00")
4491 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004492 finally:
4493 s.close()
4494
4495class TestUnixDomain(unittest.TestCase):
4496
4497 def setUp(self):
4498 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4499
4500 def tearDown(self):
4501 self.sock.close()
4502
4503 def encoded(self, path):
4504 # Return the given path encoded in the file system encoding,
4505 # or skip the test if this is not possible.
4506 try:
4507 return os.fsencode(path)
4508 except UnicodeEncodeError:
4509 self.skipTest(
4510 "Pathname {0!a} cannot be represented in file "
4511 "system encoding {1!r}".format(
4512 path, sys.getfilesystemencoding()))
4513
Antoine Pitrou16374872011-12-16 15:04:12 +01004514 def bind(self, sock, path):
4515 # Bind the socket
4516 try:
4517 sock.bind(path)
4518 except OSError as e:
4519 if str(e) == "AF_UNIX path too long":
4520 self.skipTest(
4521 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4522 .format(path))
4523 else:
4524 raise
4525
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004526 def testStrAddr(self):
4527 # Test binding to and retrieving a normal string pathname.
4528 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004529 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004530 self.addCleanup(support.unlink, path)
4531 self.assertEqual(self.sock.getsockname(), path)
4532
4533 def testBytesAddr(self):
4534 # Test binding to a bytes pathname.
4535 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004536 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004537 self.addCleanup(support.unlink, path)
4538 self.assertEqual(self.sock.getsockname(), path)
4539
4540 def testSurrogateescapeBind(self):
4541 # Test binding to a valid non-ASCII pathname, with the
4542 # non-ASCII bytes supplied using surrogateescape encoding.
4543 path = os.path.abspath(support.TESTFN_UNICODE)
4544 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004545 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004546 self.addCleanup(support.unlink, path)
4547 self.assertEqual(self.sock.getsockname(), path)
4548
4549 def testUnencodableAddr(self):
4550 # Test binding to a pathname that cannot be encoded in the
4551 # file system encoding.
4552 if support.TESTFN_UNENCODABLE is None:
4553 self.skipTest("No unencodable filename available")
4554 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004555 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004556 self.addCleanup(support.unlink, path)
4557 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004558
Victor Stinner45df8202010-04-28 22:31:17 +00004559@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004560class BufferIOTest(SocketConnectedTest):
4561 """
4562 Test the buffer versions of socket.recv() and socket.send().
4563 """
4564 def __init__(self, methodName='runTest'):
4565 SocketConnectedTest.__init__(self, methodName=methodName)
4566
Antoine Pitrou25480782010-03-17 22:50:28 +00004567 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004568 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004569 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004570 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004571 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004572 self.assertEqual(msg, MSG)
4573
Antoine Pitrou25480782010-03-17 22:50:28 +00004574 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004575 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004576 self.serv_conn.send(buf)
4577
Antoine Pitrou25480782010-03-17 22:50:28 +00004578 def testRecvIntoBytearray(self):
4579 buf = bytearray(1024)
4580 nbytes = self.cli_conn.recv_into(buf)
4581 self.assertEqual(nbytes, len(MSG))
4582 msg = buf[:len(MSG)]
4583 self.assertEqual(msg, MSG)
4584
4585 _testRecvIntoBytearray = _testRecvIntoArray
4586
4587 def testRecvIntoMemoryview(self):
4588 buf = bytearray(1024)
4589 nbytes = self.cli_conn.recv_into(memoryview(buf))
4590 self.assertEqual(nbytes, len(MSG))
4591 msg = buf[:len(MSG)]
4592 self.assertEqual(msg, MSG)
4593
4594 _testRecvIntoMemoryview = _testRecvIntoArray
4595
4596 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004597 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004598 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004599 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004600 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004601 self.assertEqual(msg, MSG)
4602
Antoine Pitrou25480782010-03-17 22:50:28 +00004603 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004604 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004605 self.serv_conn.send(buf)
4606
Antoine Pitrou25480782010-03-17 22:50:28 +00004607 def testRecvFromIntoBytearray(self):
4608 buf = bytearray(1024)
4609 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4610 self.assertEqual(nbytes, len(MSG))
4611 msg = buf[:len(MSG)]
4612 self.assertEqual(msg, MSG)
4613
4614 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4615
4616 def testRecvFromIntoMemoryview(self):
4617 buf = bytearray(1024)
4618 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4619 self.assertEqual(nbytes, len(MSG))
4620 msg = buf[:len(MSG)]
4621 self.assertEqual(msg, MSG)
4622
4623 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4624
Christian Heimes043d6f62008-01-07 17:19:16 +00004625
4626TIPC_STYPE = 2000
4627TIPC_LOWER = 200
4628TIPC_UPPER = 210
4629
4630def isTipcAvailable():
4631 """Check if the TIPC module is loaded
4632
4633 The TIPC module is not loaded automatically on Ubuntu and probably
4634 other Linux distros.
4635 """
4636 if not hasattr(socket, "AF_TIPC"):
4637 return False
4638 if not os.path.isfile("/proc/modules"):
4639 return False
4640 with open("/proc/modules") as f:
4641 for line in f:
4642 if line.startswith("tipc "):
4643 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004644 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004645 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4646 return False
4647
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004648class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004649 def testRDM(self):
4650 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4651 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004652 self.addCleanup(srv.close)
4653 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004654
4655 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4656 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4657 TIPC_LOWER, TIPC_UPPER)
4658 srv.bind(srvaddr)
4659
4660 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4661 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4662 cli.sendto(MSG, sendaddr)
4663
4664 msg, recvaddr = srv.recvfrom(1024)
4665
4666 self.assertEqual(cli.getsockname(), recvaddr)
4667 self.assertEqual(msg, MSG)
4668
4669
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004670class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004671 def __init__(self, methodName = 'runTest'):
4672 unittest.TestCase.__init__(self, methodName = methodName)
4673 ThreadableTest.__init__(self)
4674
4675 def setUp(self):
4676 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004677 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004678 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4679 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4680 TIPC_LOWER, TIPC_UPPER)
4681 self.srv.bind(srvaddr)
4682 self.srv.listen(5)
4683 self.serverExplicitReady()
4684 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004685 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004686
4687 def clientSetUp(self):
4688 # The is a hittable race between serverExplicitReady() and the
4689 # accept() call; sleep a little while to avoid it, otherwise
4690 # we could get an exception
4691 time.sleep(0.1)
4692 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004693 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004694 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4695 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4696 self.cli.connect(addr)
4697 self.cliaddr = self.cli.getsockname()
4698
4699 def testStream(self):
4700 msg = self.conn.recv(1024)
4701 self.assertEqual(msg, MSG)
4702 self.assertEqual(self.cliaddr, self.connaddr)
4703
4704 def _testStream(self):
4705 self.cli.send(MSG)
4706 self.cli.close()
4707
4708
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004709@unittest.skipUnless(thread, 'Threading required for this test.')
4710class ContextManagersTest(ThreadedTCPSocketTest):
4711
4712 def _testSocketClass(self):
4713 # base test
4714 with socket.socket() as sock:
4715 self.assertFalse(sock._closed)
4716 self.assertTrue(sock._closed)
4717 # close inside with block
4718 with socket.socket() as sock:
4719 sock.close()
4720 self.assertTrue(sock._closed)
4721 # exception inside with block
4722 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004723 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004724 self.assertTrue(sock._closed)
4725
4726 def testCreateConnectionBase(self):
4727 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004728 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004729 data = conn.recv(1024)
4730 conn.sendall(data)
4731
4732 def _testCreateConnectionBase(self):
4733 address = self.serv.getsockname()
4734 with socket.create_connection(address) as sock:
4735 self.assertFalse(sock._closed)
4736 sock.sendall(b'foo')
4737 self.assertEqual(sock.recv(1024), b'foo')
4738 self.assertTrue(sock._closed)
4739
4740 def testCreateConnectionClose(self):
4741 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004742 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004743 data = conn.recv(1024)
4744 conn.sendall(data)
4745
4746 def _testCreateConnectionClose(self):
4747 address = self.serv.getsockname()
4748 with socket.create_connection(address) as sock:
4749 sock.close()
4750 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004751 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004752
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004753
Victor Stinnerdaf45552013-08-28 00:53:59 +02004754class InheritanceTest(unittest.TestCase):
4755 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4756 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004757 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004758 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004759 with socket.socket(socket.AF_INET,
4760 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4761 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerdaf45552013-08-28 00:53:59 +02004762 self.assertTrue(sock.get_inheritable())
4763
4764 def test_default_inheritable(self):
4765 sock = socket.socket()
4766 with sock:
4767 self.assertEqual(sock.get_inheritable(), False)
4768
4769 def test_dup(self):
4770 sock = socket.socket()
4771 with sock:
4772 newsock = sock.dup()
4773 sock.close()
4774 with newsock:
4775 self.assertEqual(newsock.get_inheritable(), False)
4776
4777 def test_set_inheritable(self):
4778 sock = socket.socket()
4779 with sock:
4780 sock.set_inheritable(True)
4781 self.assertEqual(sock.get_inheritable(), True)
4782
4783 sock.set_inheritable(False)
4784 self.assertEqual(sock.get_inheritable(), False)
4785
4786 @unittest.skipUnless(hasattr(socket, "socketpair"),
4787 "need socket.socketpair()")
4788 def test_socketpair(self):
4789 s1, s2 = socket.socketpair()
4790 self.addCleanup(s1.close)
4791 self.addCleanup(s2.close)
4792 self.assertEqual(s1.get_inheritable(), False)
4793 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004794
4795
4796@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4797 "SOCK_NONBLOCK not defined")
4798class NonblockConstantTest(unittest.TestCase):
4799 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4800 if nonblock:
4801 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4802 self.assertEqual(s.gettimeout(), timeout)
4803 else:
4804 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4805 self.assertEqual(s.gettimeout(), None)
4806
Charles-François Natali239bb962011-06-03 12:55:15 +02004807 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004808 def test_SOCK_NONBLOCK(self):
4809 # a lot of it seems silly and redundant, but I wanted to test that
4810 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004811 with socket.socket(socket.AF_INET,
4812 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4813 self.checkNonblock(s)
4814 s.setblocking(1)
4815 self.checkNonblock(s, False)
4816 s.setblocking(0)
4817 self.checkNonblock(s)
4818 s.settimeout(None)
4819 self.checkNonblock(s, False)
4820 s.settimeout(2.0)
4821 self.checkNonblock(s, timeout=2.0)
4822 s.setblocking(1)
4823 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004824 # defaulttimeout
4825 t = socket.getdefaulttimeout()
4826 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004827 with socket.socket() as s:
4828 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004829 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004830 with socket.socket() as s:
4831 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004832 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004833 with socket.socket() as s:
4834 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004835 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004836 with socket.socket() as s:
4837 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004838 socket.setdefaulttimeout(t)
4839
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004840
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004841@unittest.skipUnless(os.name == "nt", "Windows specific")
4842@unittest.skipUnless(multiprocessing, "need multiprocessing")
4843class TestSocketSharing(SocketTCPTest):
4844 # This must be classmethod and not staticmethod or multiprocessing
4845 # won't be able to bootstrap it.
4846 @classmethod
4847 def remoteProcessServer(cls, q):
4848 # Recreate socket from shared data
4849 sdata = q.get()
4850 message = q.get()
4851
4852 s = socket.fromshare(sdata)
4853 s2, c = s.accept()
4854
4855 # Send the message
4856 s2.sendall(message)
4857 s2.close()
4858 s.close()
4859
4860 def testShare(self):
4861 # Transfer the listening server socket to another process
4862 # and service it from there.
4863
4864 # Create process:
4865 q = multiprocessing.Queue()
4866 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4867 p.start()
4868
4869 # Get the shared socket data
4870 data = self.serv.share(p.pid)
4871
4872 # Pass the shared socket to the other process
4873 addr = self.serv.getsockname()
4874 self.serv.close()
4875 q.put(data)
4876
4877 # The data that the server will send us
4878 message = b"slapmahfro"
4879 q.put(message)
4880
4881 # Connect
4882 s = socket.create_connection(addr)
4883 # listen for the data
4884 m = []
4885 while True:
4886 data = s.recv(100)
4887 if not data:
4888 break
4889 m.append(data)
4890 s.close()
4891 received = b"".join(m)
4892 self.assertEqual(received, message)
4893 p.join()
4894
4895 def testShareLength(self):
4896 data = self.serv.share(os.getpid())
4897 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4898 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4899
4900 def compareSockets(self, org, other):
4901 # socket sharing is expected to work only for blocking socket
4902 # since the internal python timout value isn't transfered.
4903 self.assertEqual(org.gettimeout(), None)
4904 self.assertEqual(org.gettimeout(), other.gettimeout())
4905
4906 self.assertEqual(org.family, other.family)
4907 self.assertEqual(org.type, other.type)
4908 # If the user specified "0" for proto, then
4909 # internally windows will have picked the correct value.
4910 # Python introspection on the socket however will still return
4911 # 0. For the shared socket, the python value is recreated
4912 # from the actual value, so it may not compare correctly.
4913 if org.proto != 0:
4914 self.assertEqual(org.proto, other.proto)
4915
4916 def testShareLocal(self):
4917 data = self.serv.share(os.getpid())
4918 s = socket.fromshare(data)
4919 try:
4920 self.compareSockets(self.serv, s)
4921 finally:
4922 s.close()
4923
4924 def testTypes(self):
4925 families = [socket.AF_INET, socket.AF_INET6]
4926 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4927 for f in families:
4928 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00004929 try:
4930 source = socket.socket(f, t)
4931 except OSError:
4932 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004933 try:
4934 data = source.share(os.getpid())
4935 shared = socket.fromshare(data)
4936 try:
4937 self.compareSockets(source, shared)
4938 finally:
4939 shared.close()
4940 finally:
4941 source.close()
4942
4943
Guido van Rossumb995eb72002-07-31 16:08:40 +00004944def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004945 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004946 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004947
4948 tests.extend([
4949 NonBlockingTCPTests,
4950 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004951 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004952 UnbufferedFileObjectClassTestCase,
4953 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004954 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004955 UnicodeReadFileObjectClassTestCase,
4956 UnicodeWriteFileObjectClassTestCase,
4957 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004958 NetworkConnectionNoServer,
4959 NetworkConnectionAttributesTest,
4960 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004961 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004962 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004963 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004964 ])
Dave Cole331708b2004-08-09 04:51:41 +00004965 if hasattr(socket, "socketpair"):
4966 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004967 if hasattr(socket, "AF_UNIX"):
4968 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004969 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004970 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004971 if isTipcAvailable():
4972 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004973 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004974 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004975 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004976 tests.extend([
4977 CmsgMacroTests,
4978 SendmsgUDPTest,
4979 RecvmsgUDPTest,
4980 RecvmsgIntoUDPTest,
4981 SendmsgUDP6Test,
4982 RecvmsgUDP6Test,
4983 RecvmsgRFC3542AncillaryUDP6Test,
4984 RecvmsgIntoRFC3542AncillaryUDP6Test,
4985 RecvmsgIntoUDP6Test,
4986 SendmsgTCPTest,
4987 RecvmsgTCPTest,
4988 RecvmsgIntoTCPTest,
4989 SendmsgSCTPStreamTest,
4990 RecvmsgSCTPStreamTest,
4991 RecvmsgIntoSCTPStreamTest,
4992 SendmsgUnixStreamTest,
4993 RecvmsgUnixStreamTest,
4994 RecvmsgIntoUnixStreamTest,
4995 RecvmsgSCMRightsStreamTest,
4996 RecvmsgIntoSCMRightsStreamTest,
4997 # These are slow when setitimer() is not available
4998 InterruptedRecvTimeoutTest,
4999 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005000 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005001 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005002
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005003 thread_info = support.threading_setup()
5004 support.run_unittest(*tests)
5005 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005006
5007if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005008 test_main()