blob: ae84dbfda37e53790ff25db54e593aacc35f1666 [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)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001250 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001251 if with_timeout:
1252 signal.signal(signal.SIGALRM, ok_handler)
1253 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001254 self.assertRaises(socket.timeout, c.sendall,
1255 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001256 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001257 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001258 signal.signal(signal.SIGALRM, old_alarm)
1259 c.close()
1260 s.close()
1261
1262 def test_sendall_interrupted(self):
1263 self.check_sendall_interrupted(False)
1264
1265 def test_sendall_interrupted_with_timeout(self):
1266 self.check_sendall_interrupted(True)
1267
Antoine Pitroue033e062010-10-29 10:38:18 +00001268 def test_dealloc_warn(self):
1269 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1270 r = repr(sock)
1271 with self.assertWarns(ResourceWarning) as cm:
1272 sock = None
1273 support.gc_collect()
1274 self.assertIn(r, str(cm.warning.args[0]))
1275 # An open socket file object gets dereferenced after the socket
1276 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1277 f = sock.makefile('rb')
1278 r = repr(sock)
1279 sock = None
1280 support.gc_collect()
1281 with self.assertWarns(ResourceWarning):
1282 f = None
1283 support.gc_collect()
1284
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001285 def test_name_closed_socketio(self):
1286 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1287 fp = sock.makefile("rb")
1288 fp.close()
1289 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1290
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001291 def test_unusable_closed_socketio(self):
1292 with socket.socket() as sock:
1293 fp = sock.makefile("rb", buffering=0)
1294 self.assertTrue(fp.readable())
1295 self.assertFalse(fp.writable())
1296 self.assertFalse(fp.seekable())
1297 fp.close()
1298 self.assertRaises(ValueError, fp.readable)
1299 self.assertRaises(ValueError, fp.writable)
1300 self.assertRaises(ValueError, fp.seekable)
1301
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001302 def test_pickle(self):
1303 sock = socket.socket()
1304 with sock:
1305 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1306 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1307
Serhiy Storchaka78980432013-01-15 01:12:17 +02001308 def test_listen_backlog(self):
1309 for backlog in 0, -1:
1310 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1311 srv.bind((HOST, 0))
1312 srv.listen(backlog)
1313 srv.close()
1314
1315 # Issue 15989
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001316 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1317 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001318 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001319 srv.close()
1320
Charles-François Natali42663332012-01-02 15:57:30 +01001321 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001322 def test_flowinfo(self):
1323 self.assertRaises(OverflowError, socket.getnameinfo,
1324 ('::1',0, 0xffffffff), 0)
1325 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1326 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
1327
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001328
Charles-François Natali47413c12011-10-06 19:47:44 +02001329@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1330class BasicCANTest(unittest.TestCase):
1331
1332 def testCrucialConstants(self):
1333 socket.AF_CAN
1334 socket.PF_CAN
1335 socket.CAN_RAW
1336
Charles-François Natali773e42d2013-02-05 19:42:01 +01001337 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1338 'socket.CAN_BCM required for this test.')
1339 def testBCMConstants(self):
1340 socket.CAN_BCM
1341
1342 # opcodes
1343 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1344 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1345 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1346 socket.CAN_BCM_TX_SEND # send one CAN frame
1347 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1348 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1349 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1350 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1351 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1352 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1353 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1354 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1355
Charles-François Natali47413c12011-10-06 19:47:44 +02001356 def testCreateSocket(self):
1357 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1358 pass
1359
Charles-François Natali773e42d2013-02-05 19:42:01 +01001360 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1361 'socket.CAN_BCM required for this test.')
1362 def testCreateBCMSocket(self):
1363 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1364 pass
1365
Charles-François Natali47413c12011-10-06 19:47:44 +02001366 def testBindAny(self):
1367 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1368 s.bind(('', ))
1369
1370 def testTooLongInterfaceName(self):
1371 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1372 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001373 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001374 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001375
1376 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1377 'socket.CAN_RAW_LOOPBACK required for this test.')
1378 def testLoopback(self):
1379 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1380 for loopback in (0, 1):
1381 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1382 loopback)
1383 self.assertEqual(loopback,
1384 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1385
1386 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1387 'socket.CAN_RAW_FILTER required for this test.')
1388 def testFilter(self):
1389 can_id, can_mask = 0x200, 0x700
1390 can_filter = struct.pack("=II", can_id, can_mask)
1391 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1392 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1393 self.assertEqual(can_filter,
1394 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1395
1396
1397@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001398class CANTest(ThreadedCANSocketTest):
1399
Charles-François Natali47413c12011-10-06 19:47:44 +02001400 def __init__(self, methodName='runTest'):
1401 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1402
1403 @classmethod
1404 def build_can_frame(cls, can_id, data):
1405 """Build a CAN frame."""
1406 can_dlc = len(data)
1407 data = data.ljust(8, b'\x00')
1408 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1409
1410 @classmethod
1411 def dissect_can_frame(cls, frame):
1412 """Dissect a CAN frame."""
1413 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1414 return (can_id, can_dlc, data[:can_dlc])
1415
1416 def testSendFrame(self):
1417 cf, addr = self.s.recvfrom(self.bufsize)
1418 self.assertEqual(self.cf, cf)
1419 self.assertEqual(addr[0], self.interface)
1420 self.assertEqual(addr[1], socket.AF_CAN)
1421
1422 def _testSendFrame(self):
1423 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1424 self.cli.send(self.cf)
1425
1426 def testSendMaxFrame(self):
1427 cf, addr = self.s.recvfrom(self.bufsize)
1428 self.assertEqual(self.cf, cf)
1429
1430 def _testSendMaxFrame(self):
1431 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1432 self.cli.send(self.cf)
1433
1434 def testSendMultiFrames(self):
1435 cf, addr = self.s.recvfrom(self.bufsize)
1436 self.assertEqual(self.cf1, cf)
1437
1438 cf, addr = self.s.recvfrom(self.bufsize)
1439 self.assertEqual(self.cf2, cf)
1440
1441 def _testSendMultiFrames(self):
1442 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1443 self.cli.send(self.cf1)
1444
1445 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1446 self.cli.send(self.cf2)
1447
Charles-François Natali773e42d2013-02-05 19:42:01 +01001448 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1449 'socket.CAN_BCM required for this test.')
1450 def _testBCM(self):
1451 cf, addr = self.cli.recvfrom(self.bufsize)
1452 self.assertEqual(self.cf, cf)
1453 can_id, can_dlc, data = self.dissect_can_frame(cf)
1454 self.assertEqual(self.can_id, can_id)
1455 self.assertEqual(self.data, data)
1456
1457 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1458 'socket.CAN_BCM required for this test.')
1459 def testBCM(self):
1460 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1461 self.addCleanup(bcm.close)
1462 bcm.connect((self.interface,))
1463 self.can_id = 0x123
1464 self.data = bytes([0xc0, 0xff, 0xee])
1465 self.cf = self.build_can_frame(self.can_id, self.data)
1466 opcode = socket.CAN_BCM_TX_SEND
1467 flags = 0
1468 count = 0
1469 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1470 bcm_can_id = 0x0222
1471 nframes = 1
1472 assert len(self.cf) == 16
1473 header = struct.pack(self.bcm_cmd_msg_fmt,
1474 opcode,
1475 flags,
1476 count,
1477 ival1_seconds,
1478 ival1_usec,
1479 ival2_seconds,
1480 ival2_usec,
1481 bcm_can_id,
1482 nframes,
1483 )
1484 header_plus_frame = header + self.cf
1485 bytes_sent = bcm.send(header_plus_frame)
1486 self.assertEqual(bytes_sent, len(header_plus_frame))
1487
Charles-François Natali47413c12011-10-06 19:47:44 +02001488
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001489@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1490class BasicRDSTest(unittest.TestCase):
1491
1492 def testCrucialConstants(self):
1493 socket.AF_RDS
1494 socket.PF_RDS
1495
1496 def testCreateSocket(self):
1497 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1498 pass
1499
1500 def testSocketBufferSize(self):
1501 bufsize = 16384
1502 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1503 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1504 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1505
1506
1507@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1508@unittest.skipUnless(thread, 'Threading required for this test.')
1509class RDSTest(ThreadedRDSSocketTest):
1510
1511 def __init__(self, methodName='runTest'):
1512 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1513
Charles-François Natali240c55f2011-11-10 20:33:36 +01001514 def setUp(self):
1515 super().setUp()
1516 self.evt = threading.Event()
1517
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001518 def testSendAndRecv(self):
1519 data, addr = self.serv.recvfrom(self.bufsize)
1520 self.assertEqual(self.data, data)
1521 self.assertEqual(self.cli_addr, addr)
1522
1523 def _testSendAndRecv(self):
1524 self.data = b'spam'
1525 self.cli.sendto(self.data, 0, (HOST, self.port))
1526
1527 def testPeek(self):
1528 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1529 self.assertEqual(self.data, data)
1530 data, addr = self.serv.recvfrom(self.bufsize)
1531 self.assertEqual(self.data, data)
1532
1533 def _testPeek(self):
1534 self.data = b'spam'
1535 self.cli.sendto(self.data, 0, (HOST, self.port))
1536
1537 @requireAttrs(socket.socket, 'recvmsg')
1538 def testSendAndRecvMsg(self):
1539 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1540 self.assertEqual(self.data, data)
1541
1542 @requireAttrs(socket.socket, 'sendmsg')
1543 def _testSendAndRecvMsg(self):
1544 self.data = b'hello ' * 10
1545 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1546
1547 def testSendAndRecvMulti(self):
1548 data, addr = self.serv.recvfrom(self.bufsize)
1549 self.assertEqual(self.data1, data)
1550
1551 data, addr = self.serv.recvfrom(self.bufsize)
1552 self.assertEqual(self.data2, data)
1553
1554 def _testSendAndRecvMulti(self):
1555 self.data1 = b'bacon'
1556 self.cli.sendto(self.data1, 0, (HOST, self.port))
1557
1558 self.data2 = b'egg'
1559 self.cli.sendto(self.data2, 0, (HOST, self.port))
1560
1561 def testSelect(self):
1562 r, w, x = select.select([self.serv], [], [], 3.0)
1563 self.assertIn(self.serv, r)
1564 data, addr = self.serv.recvfrom(self.bufsize)
1565 self.assertEqual(self.data, data)
1566
1567 def _testSelect(self):
1568 self.data = b'select'
1569 self.cli.sendto(self.data, 0, (HOST, self.port))
1570
1571 def testCongestion(self):
1572 # wait until the sender is done
1573 self.evt.wait()
1574
1575 def _testCongestion(self):
1576 # test the behavior in case of congestion
1577 self.data = b'fill'
1578 self.cli.setblocking(False)
1579 try:
1580 # try to lower the receiver's socket buffer size
1581 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1582 except OSError:
1583 pass
1584 with self.assertRaises(OSError) as cm:
1585 try:
1586 # fill the receiver's socket buffer
1587 while True:
1588 self.cli.sendto(self.data, 0, (HOST, self.port))
1589 finally:
1590 # signal the receiver we're done
1591 self.evt.set()
1592 # sendto() should have failed with ENOBUFS
1593 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1594 # and we should have received a congestion notification through poll
1595 r, w, x = select.select([self.serv], [], [], 3.0)
1596 self.assertIn(self.serv, r)
1597
1598
Victor Stinner45df8202010-04-28 22:31:17 +00001599@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001600class BasicTCPTest(SocketConnectedTest):
1601
1602 def __init__(self, methodName='runTest'):
1603 SocketConnectedTest.__init__(self, methodName=methodName)
1604
1605 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001606 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001607 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001608 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001609
1610 def _testRecv(self):
1611 self.serv_conn.send(MSG)
1612
1613 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001614 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001615 seg1 = self.cli_conn.recv(len(MSG) - 3)
1616 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001617 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001618 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001619
1620 def _testOverFlowRecv(self):
1621 self.serv_conn.send(MSG)
1622
1623 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001624 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001625 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001626 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001627
1628 def _testRecvFrom(self):
1629 self.serv_conn.send(MSG)
1630
1631 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001632 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001633 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1634 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001635 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001636 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001637
1638 def _testOverFlowRecvFrom(self):
1639 self.serv_conn.send(MSG)
1640
1641 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001642 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001643 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001644 while 1:
1645 read = self.cli_conn.recv(1024)
1646 if not read:
1647 break
Guido van Rossume531e292002-08-08 20:28:34 +00001648 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001649 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001650
1651 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001652 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001653 self.serv_conn.sendall(big_chunk)
1654
1655 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001656 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001657 fd = self.cli_conn.fileno()
1658 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001659 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001660 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001661 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001662 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001663
1664 def _testFromFd(self):
1665 self.serv_conn.send(MSG)
1666
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001667 def testDup(self):
1668 # Testing dup()
1669 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001670 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001671 msg = sock.recv(1024)
1672 self.assertEqual(msg, MSG)
1673
1674 def _testDup(self):
1675 self.serv_conn.send(MSG)
1676
Guido van Rossum24e4af82002-06-12 19:18:08 +00001677 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001678 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001679 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001680 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001681 # wait for _testShutdown to finish: on OS X, when the server
1682 # closes the connection the client also becomes disconnected,
1683 # and the client's shutdown call will fail. (Issue #4397.)
1684 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001685
1686 def _testShutdown(self):
1687 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001688 # Issue 15989
1689 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1690 _testcapi.INT_MAX + 1)
1691 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1692 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001693 self.serv_conn.shutdown(2)
1694
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001695 def testDetach(self):
1696 # Testing detach()
1697 fileno = self.cli_conn.fileno()
1698 f = self.cli_conn.detach()
1699 self.assertEqual(f, fileno)
1700 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001701 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001702 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001703 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001704 # ...but we can create another socket using the (still open)
1705 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001706 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001707 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001708 msg = sock.recv(1024)
1709 self.assertEqual(msg, MSG)
1710
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001711 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001712 self.serv_conn.send(MSG)
1713
Victor Stinner45df8202010-04-28 22:31:17 +00001714@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001715class BasicUDPTest(ThreadedUDPSocketTest):
1716
1717 def __init__(self, methodName='runTest'):
1718 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1719
1720 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001721 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001722 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001723 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001724
1725 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001726 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001727
Guido van Rossum1c938012002-06-12 21:17:20 +00001728 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001729 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001730 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001731 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001732
Guido van Rossum1c938012002-06-12 21:17:20 +00001733 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001734 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001735
Guido van Rossumd8faa362007-04-27 19:54:29 +00001736 def testRecvFromNegative(self):
1737 # Negative lengths passed to recvfrom should give ValueError.
1738 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1739
1740 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001741 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001742
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001743# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1744# same test code is used with different families and types of socket
1745# (e.g. stream, datagram), and tests using recvmsg() are repeated
1746# using recvmsg_into().
1747#
1748# The generic test classes such as SendmsgTests and
1749# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1750# supplied with sockets cli_sock and serv_sock representing the
1751# client's and the server's end of the connection respectively, and
1752# attributes cli_addr and serv_addr holding their (numeric where
1753# appropriate) addresses.
1754#
1755# The final concrete test classes combine these with subclasses of
1756# SocketTestBase which set up client and server sockets of a specific
1757# type, and with subclasses of SendrecvmsgBase such as
1758# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1759# sockets to cli_sock and serv_sock and override the methods and
1760# attributes of SendrecvmsgBase to fill in destination addresses if
1761# needed when sending, check for specific flags in msg_flags, etc.
1762#
1763# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1764# recvmsg_into().
1765
1766# XXX: like the other datagram (UDP) tests in this module, the code
1767# here assumes that datagram delivery on the local machine will be
1768# reliable.
1769
1770class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1771 # Base class for sendmsg()/recvmsg() tests.
1772
1773 # Time in seconds to wait before considering a test failed, or
1774 # None for no timeout. Not all tests actually set a timeout.
1775 fail_timeout = 3.0
1776
1777 def setUp(self):
1778 self.misc_event = threading.Event()
1779 super().setUp()
1780
1781 def sendToServer(self, msg):
1782 # Send msg to the server.
1783 return self.cli_sock.send(msg)
1784
1785 # Tuple of alternative default arguments for sendmsg() when called
1786 # via sendmsgToServer() (e.g. to include a destination address).
1787 sendmsg_to_server_defaults = ()
1788
1789 def sendmsgToServer(self, *args):
1790 # Call sendmsg() on self.cli_sock with the given arguments,
1791 # filling in any arguments which are not supplied with the
1792 # corresponding items of self.sendmsg_to_server_defaults, if
1793 # any.
1794 return self.cli_sock.sendmsg(
1795 *(args + self.sendmsg_to_server_defaults[len(args):]))
1796
1797 def doRecvmsg(self, sock, bufsize, *args):
1798 # Call recvmsg() on sock with given arguments and return its
1799 # result. Should be used for tests which can use either
1800 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1801 # this method with one which emulates it using recvmsg_into(),
1802 # thus allowing the same test to be used for both methods.
1803 result = sock.recvmsg(bufsize, *args)
1804 self.registerRecvmsgResult(result)
1805 return result
1806
1807 def registerRecvmsgResult(self, result):
1808 # Called by doRecvmsg() with the return value of recvmsg() or
1809 # recvmsg_into(). Can be overridden to arrange cleanup based
1810 # on the returned ancillary data, for instance.
1811 pass
1812
1813 def checkRecvmsgAddress(self, addr1, addr2):
1814 # Called to compare the received address with the address of
1815 # the peer.
1816 self.assertEqual(addr1, addr2)
1817
1818 # Flags that are normally unset in msg_flags
1819 msg_flags_common_unset = 0
1820 for name in ("MSG_CTRUNC", "MSG_OOB"):
1821 msg_flags_common_unset |= getattr(socket, name, 0)
1822
1823 # Flags that are normally set
1824 msg_flags_common_set = 0
1825
1826 # Flags set when a complete record has been received (e.g. MSG_EOR
1827 # for SCTP)
1828 msg_flags_eor_indicator = 0
1829
1830 # Flags set when a complete record has not been received
1831 # (e.g. MSG_TRUNC for datagram sockets)
1832 msg_flags_non_eor_indicator = 0
1833
1834 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1835 # Method to check the value of msg_flags returned by recvmsg[_into]().
1836 #
1837 # Checks that all bits in msg_flags_common_set attribute are
1838 # set in "flags" and all bits in msg_flags_common_unset are
1839 # unset.
1840 #
1841 # The "eor" argument specifies whether the flags should
1842 # indicate that a full record (or datagram) has been received.
1843 # If "eor" is None, no checks are done; otherwise, checks
1844 # that:
1845 #
1846 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1847 # set and all bits in msg_flags_non_eor_indicator are unset
1848 #
1849 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1850 # are set and all bits in msg_flags_eor_indicator are unset
1851 #
1852 # If "checkset" and/or "checkunset" are supplied, they require
1853 # the given bits to be set or unset respectively, overriding
1854 # what the attributes require for those bits.
1855 #
1856 # If any bits are set in "ignore", they will not be checked,
1857 # regardless of the other inputs.
1858 #
1859 # Will raise Exception if the inputs require a bit to be both
1860 # set and unset, and it is not ignored.
1861
1862 defaultset = self.msg_flags_common_set
1863 defaultunset = self.msg_flags_common_unset
1864
1865 if eor:
1866 defaultset |= self.msg_flags_eor_indicator
1867 defaultunset |= self.msg_flags_non_eor_indicator
1868 elif eor is not None:
1869 defaultset |= self.msg_flags_non_eor_indicator
1870 defaultunset |= self.msg_flags_eor_indicator
1871
1872 # Function arguments override defaults
1873 defaultset &= ~checkunset
1874 defaultunset &= ~checkset
1875
1876 # Merge arguments with remaining defaults, and check for conflicts
1877 checkset |= defaultset
1878 checkunset |= defaultunset
1879 inboth = checkset & checkunset & ~ignore
1880 if inboth:
1881 raise Exception("contradictory set, unset requirements for flags "
1882 "{0:#x}".format(inboth))
1883
1884 # Compare with given msg_flags value
1885 mask = (checkset | checkunset) & ~ignore
1886 self.assertEqual(flags & mask, checkset & mask)
1887
1888
1889class RecvmsgIntoMixin(SendrecvmsgBase):
1890 # Mixin to implement doRecvmsg() using recvmsg_into().
1891
1892 def doRecvmsg(self, sock, bufsize, *args):
1893 buf = bytearray(bufsize)
1894 result = sock.recvmsg_into([buf], *args)
1895 self.registerRecvmsgResult(result)
1896 self.assertGreaterEqual(result[0], 0)
1897 self.assertLessEqual(result[0], bufsize)
1898 return (bytes(buf[:result[0]]),) + result[1:]
1899
1900
1901class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1902 # Defines flags to be checked in msg_flags for datagram sockets.
1903
1904 @property
1905 def msg_flags_non_eor_indicator(self):
1906 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1907
1908
1909class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1910 # Defines flags to be checked in msg_flags for SCTP sockets.
1911
1912 @property
1913 def msg_flags_eor_indicator(self):
1914 return super().msg_flags_eor_indicator | socket.MSG_EOR
1915
1916
1917class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1918 # Base class for tests on connectionless-mode sockets. Users must
1919 # supply sockets on attributes cli and serv to be mapped to
1920 # cli_sock and serv_sock respectively.
1921
1922 @property
1923 def serv_sock(self):
1924 return self.serv
1925
1926 @property
1927 def cli_sock(self):
1928 return self.cli
1929
1930 @property
1931 def sendmsg_to_server_defaults(self):
1932 return ([], [], 0, self.serv_addr)
1933
1934 def sendToServer(self, msg):
1935 return self.cli_sock.sendto(msg, self.serv_addr)
1936
1937
1938class SendrecvmsgConnectedBase(SendrecvmsgBase):
1939 # Base class for tests on connected sockets. Users must supply
1940 # sockets on attributes serv_conn and cli_conn (representing the
1941 # connections *to* the server and the client), to be mapped to
1942 # cli_sock and serv_sock respectively.
1943
1944 @property
1945 def serv_sock(self):
1946 return self.cli_conn
1947
1948 @property
1949 def cli_sock(self):
1950 return self.serv_conn
1951
1952 def checkRecvmsgAddress(self, addr1, addr2):
1953 # Address is currently "unspecified" for a connected socket,
1954 # so we don't examine it
1955 pass
1956
1957
1958class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1959 # Base class to set a timeout on server's socket.
1960
1961 def setUp(self):
1962 super().setUp()
1963 self.serv_sock.settimeout(self.fail_timeout)
1964
1965
1966class SendmsgTests(SendrecvmsgServerTimeoutBase):
1967 # Tests for sendmsg() which can use any socket type and do not
1968 # involve recvmsg() or recvmsg_into().
1969
1970 def testSendmsg(self):
1971 # Send a simple message with sendmsg().
1972 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1973
1974 def _testSendmsg(self):
1975 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1976
1977 def testSendmsgDataGenerator(self):
1978 # Send from buffer obtained from a generator (not a sequence).
1979 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1980
1981 def _testSendmsgDataGenerator(self):
1982 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1983 len(MSG))
1984
1985 def testSendmsgAncillaryGenerator(self):
1986 # Gather (empty) ancillary data from a generator.
1987 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1988
1989 def _testSendmsgAncillaryGenerator(self):
1990 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1991 len(MSG))
1992
1993 def testSendmsgArray(self):
1994 # Send data from an array instead of the usual bytes object.
1995 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1996
1997 def _testSendmsgArray(self):
1998 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1999 len(MSG))
2000
2001 def testSendmsgGather(self):
2002 # Send message data from more than one buffer (gather write).
2003 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2004
2005 def _testSendmsgGather(self):
2006 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2007
2008 def testSendmsgBadArgs(self):
2009 # Check that sendmsg() rejects invalid arguments.
2010 self.assertEqual(self.serv_sock.recv(1000), b"done")
2011
2012 def _testSendmsgBadArgs(self):
2013 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2014 self.assertRaises(TypeError, self.sendmsgToServer,
2015 b"not in an iterable")
2016 self.assertRaises(TypeError, self.sendmsgToServer,
2017 object())
2018 self.assertRaises(TypeError, self.sendmsgToServer,
2019 [object()])
2020 self.assertRaises(TypeError, self.sendmsgToServer,
2021 [MSG, object()])
2022 self.assertRaises(TypeError, self.sendmsgToServer,
2023 [MSG], object())
2024 self.assertRaises(TypeError, self.sendmsgToServer,
2025 [MSG], [], object())
2026 self.assertRaises(TypeError, self.sendmsgToServer,
2027 [MSG], [], 0, object())
2028 self.sendToServer(b"done")
2029
2030 def testSendmsgBadCmsg(self):
2031 # Check that invalid ancillary data items are rejected.
2032 self.assertEqual(self.serv_sock.recv(1000), b"done")
2033
2034 def _testSendmsgBadCmsg(self):
2035 self.assertRaises(TypeError, self.sendmsgToServer,
2036 [MSG], [object()])
2037 self.assertRaises(TypeError, self.sendmsgToServer,
2038 [MSG], [(object(), 0, b"data")])
2039 self.assertRaises(TypeError, self.sendmsgToServer,
2040 [MSG], [(0, object(), b"data")])
2041 self.assertRaises(TypeError, self.sendmsgToServer,
2042 [MSG], [(0, 0, object())])
2043 self.assertRaises(TypeError, self.sendmsgToServer,
2044 [MSG], [(0, 0)])
2045 self.assertRaises(TypeError, self.sendmsgToServer,
2046 [MSG], [(0, 0, b"data", 42)])
2047 self.sendToServer(b"done")
2048
2049 @requireAttrs(socket, "CMSG_SPACE")
2050 def testSendmsgBadMultiCmsg(self):
2051 # Check that invalid ancillary data items are rejected when
2052 # more than one item is present.
2053 self.assertEqual(self.serv_sock.recv(1000), b"done")
2054
2055 @testSendmsgBadMultiCmsg.client_skip
2056 def _testSendmsgBadMultiCmsg(self):
2057 self.assertRaises(TypeError, self.sendmsgToServer,
2058 [MSG], [0, 0, b""])
2059 self.assertRaises(TypeError, self.sendmsgToServer,
2060 [MSG], [(0, 0, b""), object()])
2061 self.sendToServer(b"done")
2062
2063 def testSendmsgExcessCmsgReject(self):
2064 # Check that sendmsg() rejects excess ancillary data items
2065 # when the number that can be sent is limited.
2066 self.assertEqual(self.serv_sock.recv(1000), b"done")
2067
2068 def _testSendmsgExcessCmsgReject(self):
2069 if not hasattr(socket, "CMSG_SPACE"):
2070 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002071 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002072 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2073 self.assertIsNone(cm.exception.errno)
2074 self.sendToServer(b"done")
2075
2076 def testSendmsgAfterClose(self):
2077 # Check that sendmsg() fails on a closed socket.
2078 pass
2079
2080 def _testSendmsgAfterClose(self):
2081 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002082 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002083
2084
2085class SendmsgStreamTests(SendmsgTests):
2086 # Tests for sendmsg() which require a stream socket and do not
2087 # involve recvmsg() or recvmsg_into().
2088
2089 def testSendmsgExplicitNoneAddr(self):
2090 # Check that peer address can be specified as None.
2091 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2092
2093 def _testSendmsgExplicitNoneAddr(self):
2094 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2095
2096 def testSendmsgTimeout(self):
2097 # Check that timeout works with sendmsg().
2098 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2099 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2100
2101 def _testSendmsgTimeout(self):
2102 try:
2103 self.cli_sock.settimeout(0.03)
2104 with self.assertRaises(socket.timeout):
2105 while True:
2106 self.sendmsgToServer([b"a"*512])
2107 finally:
2108 self.misc_event.set()
2109
2110 # XXX: would be nice to have more tests for sendmsg flags argument.
2111
2112 # Linux supports MSG_DONTWAIT when sending, but in general, it
2113 # only works when receiving. Could add other platforms if they
2114 # support it too.
2115 @skipWithClientIf(sys.platform not in {"linux2"},
2116 "MSG_DONTWAIT not known to work on this platform when "
2117 "sending")
2118 def testSendmsgDontWait(self):
2119 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2120 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2121 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2122
2123 @testSendmsgDontWait.client_skip
2124 def _testSendmsgDontWait(self):
2125 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002126 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002127 while True:
2128 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2129 self.assertIn(cm.exception.errno,
2130 (errno.EAGAIN, errno.EWOULDBLOCK))
2131 finally:
2132 self.misc_event.set()
2133
2134
2135class SendmsgConnectionlessTests(SendmsgTests):
2136 # Tests for sendmsg() which require a connectionless-mode
2137 # (e.g. datagram) socket, and do not involve recvmsg() or
2138 # recvmsg_into().
2139
2140 def testSendmsgNoDestAddr(self):
2141 # Check that sendmsg() fails when no destination address is
2142 # given for unconnected socket.
2143 pass
2144
2145 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002146 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002147 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002148 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002149 [MSG], [], 0, None)
2150
2151
2152class RecvmsgGenericTests(SendrecvmsgBase):
2153 # Tests for recvmsg() which can also be emulated using
2154 # recvmsg_into(), and can use any socket type.
2155
2156 def testRecvmsg(self):
2157 # Receive a simple message with recvmsg[_into]().
2158 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2159 self.assertEqual(msg, MSG)
2160 self.checkRecvmsgAddress(addr, self.cli_addr)
2161 self.assertEqual(ancdata, [])
2162 self.checkFlags(flags, eor=True)
2163
2164 def _testRecvmsg(self):
2165 self.sendToServer(MSG)
2166
2167 def testRecvmsgExplicitDefaults(self):
2168 # Test recvmsg[_into]() with default arguments provided explicitly.
2169 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2170 len(MSG), 0, 0)
2171 self.assertEqual(msg, MSG)
2172 self.checkRecvmsgAddress(addr, self.cli_addr)
2173 self.assertEqual(ancdata, [])
2174 self.checkFlags(flags, eor=True)
2175
2176 def _testRecvmsgExplicitDefaults(self):
2177 self.sendToServer(MSG)
2178
2179 def testRecvmsgShorter(self):
2180 # Receive a message smaller than buffer.
2181 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2182 len(MSG) + 42)
2183 self.assertEqual(msg, MSG)
2184 self.checkRecvmsgAddress(addr, self.cli_addr)
2185 self.assertEqual(ancdata, [])
2186 self.checkFlags(flags, eor=True)
2187
2188 def _testRecvmsgShorter(self):
2189 self.sendToServer(MSG)
2190
Charles-François Natali8619cd72011-10-03 19:43:15 +02002191 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2192 # datagram is received (issue #13001).
2193 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002194 def testRecvmsgTrunc(self):
2195 # Receive part of message, check for truncation indicators.
2196 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2197 len(MSG) - 3)
2198 self.assertEqual(msg, MSG[:-3])
2199 self.checkRecvmsgAddress(addr, self.cli_addr)
2200 self.assertEqual(ancdata, [])
2201 self.checkFlags(flags, eor=False)
2202
Charles-François Natali8619cd72011-10-03 19:43:15 +02002203 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002204 def _testRecvmsgTrunc(self):
2205 self.sendToServer(MSG)
2206
2207 def testRecvmsgShortAncillaryBuf(self):
2208 # Test ancillary data buffer too small to hold any ancillary data.
2209 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2210 len(MSG), 1)
2211 self.assertEqual(msg, MSG)
2212 self.checkRecvmsgAddress(addr, self.cli_addr)
2213 self.assertEqual(ancdata, [])
2214 self.checkFlags(flags, eor=True)
2215
2216 def _testRecvmsgShortAncillaryBuf(self):
2217 self.sendToServer(MSG)
2218
2219 def testRecvmsgLongAncillaryBuf(self):
2220 # Test large ancillary data buffer.
2221 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2222 len(MSG), 10240)
2223 self.assertEqual(msg, MSG)
2224 self.checkRecvmsgAddress(addr, self.cli_addr)
2225 self.assertEqual(ancdata, [])
2226 self.checkFlags(flags, eor=True)
2227
2228 def _testRecvmsgLongAncillaryBuf(self):
2229 self.sendToServer(MSG)
2230
2231 def testRecvmsgAfterClose(self):
2232 # Check that recvmsg[_into]() fails on a closed socket.
2233 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002234 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002235
2236 def _testRecvmsgAfterClose(self):
2237 pass
2238
2239 def testRecvmsgTimeout(self):
2240 # Check that timeout works.
2241 try:
2242 self.serv_sock.settimeout(0.03)
2243 self.assertRaises(socket.timeout,
2244 self.doRecvmsg, self.serv_sock, len(MSG))
2245 finally:
2246 self.misc_event.set()
2247
2248 def _testRecvmsgTimeout(self):
2249 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2250
2251 @requireAttrs(socket, "MSG_PEEK")
2252 def testRecvmsgPeek(self):
2253 # Check that MSG_PEEK in flags enables examination of pending
2254 # data without consuming it.
2255
2256 # Receive part of data with MSG_PEEK.
2257 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2258 len(MSG) - 3, 0,
2259 socket.MSG_PEEK)
2260 self.assertEqual(msg, MSG[:-3])
2261 self.checkRecvmsgAddress(addr, self.cli_addr)
2262 self.assertEqual(ancdata, [])
2263 # Ignoring MSG_TRUNC here (so this test is the same for stream
2264 # and datagram sockets). Some wording in POSIX seems to
2265 # suggest that it needn't be set when peeking, but that may
2266 # just be a slip.
2267 self.checkFlags(flags, eor=False,
2268 ignore=getattr(socket, "MSG_TRUNC", 0))
2269
2270 # Receive all data with MSG_PEEK.
2271 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2272 len(MSG), 0,
2273 socket.MSG_PEEK)
2274 self.assertEqual(msg, MSG)
2275 self.checkRecvmsgAddress(addr, self.cli_addr)
2276 self.assertEqual(ancdata, [])
2277 self.checkFlags(flags, eor=True)
2278
2279 # Check that the same data can still be received normally.
2280 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2281 self.assertEqual(msg, MSG)
2282 self.checkRecvmsgAddress(addr, self.cli_addr)
2283 self.assertEqual(ancdata, [])
2284 self.checkFlags(flags, eor=True)
2285
2286 @testRecvmsgPeek.client_skip
2287 def _testRecvmsgPeek(self):
2288 self.sendToServer(MSG)
2289
2290 @requireAttrs(socket.socket, "sendmsg")
2291 def testRecvmsgFromSendmsg(self):
2292 # Test receiving with recvmsg[_into]() when message is sent
2293 # using sendmsg().
2294 self.serv_sock.settimeout(self.fail_timeout)
2295 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2296 self.assertEqual(msg, MSG)
2297 self.checkRecvmsgAddress(addr, self.cli_addr)
2298 self.assertEqual(ancdata, [])
2299 self.checkFlags(flags, eor=True)
2300
2301 @testRecvmsgFromSendmsg.client_skip
2302 def _testRecvmsgFromSendmsg(self):
2303 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2304
2305
2306class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2307 # Tests which require a stream socket and can use either recvmsg()
2308 # or recvmsg_into().
2309
2310 def testRecvmsgEOF(self):
2311 # Receive end-of-stream indicator (b"", peer socket closed).
2312 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2313 self.assertEqual(msg, b"")
2314 self.checkRecvmsgAddress(addr, self.cli_addr)
2315 self.assertEqual(ancdata, [])
2316 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2317
2318 def _testRecvmsgEOF(self):
2319 self.cli_sock.close()
2320
2321 def testRecvmsgOverflow(self):
2322 # Receive a message in more than one chunk.
2323 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2324 len(MSG) - 3)
2325 self.checkRecvmsgAddress(addr, self.cli_addr)
2326 self.assertEqual(ancdata, [])
2327 self.checkFlags(flags, eor=False)
2328
2329 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2330 self.checkRecvmsgAddress(addr, self.cli_addr)
2331 self.assertEqual(ancdata, [])
2332 self.checkFlags(flags, eor=True)
2333
2334 msg = seg1 + seg2
2335 self.assertEqual(msg, MSG)
2336
2337 def _testRecvmsgOverflow(self):
2338 self.sendToServer(MSG)
2339
2340
2341class RecvmsgTests(RecvmsgGenericTests):
2342 # Tests for recvmsg() which can use any socket type.
2343
2344 def testRecvmsgBadArgs(self):
2345 # Check that recvmsg() rejects invalid arguments.
2346 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2347 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2348 -1, 0, 0)
2349 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2350 len(MSG), -1, 0)
2351 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2352 [bytearray(10)], 0, 0)
2353 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2354 object(), 0, 0)
2355 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2356 len(MSG), object(), 0)
2357 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2358 len(MSG), 0, object())
2359
2360 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2361 self.assertEqual(msg, MSG)
2362 self.checkRecvmsgAddress(addr, self.cli_addr)
2363 self.assertEqual(ancdata, [])
2364 self.checkFlags(flags, eor=True)
2365
2366 def _testRecvmsgBadArgs(self):
2367 self.sendToServer(MSG)
2368
2369
2370class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2371 # Tests for recvmsg_into() which can use any socket type.
2372
2373 def testRecvmsgIntoBadArgs(self):
2374 # Check that recvmsg_into() rejects invalid arguments.
2375 buf = bytearray(len(MSG))
2376 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2377 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2378 len(MSG), 0, 0)
2379 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2380 buf, 0, 0)
2381 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2382 [object()], 0, 0)
2383 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2384 [b"I'm not writable"], 0, 0)
2385 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2386 [buf, object()], 0, 0)
2387 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2388 [buf], -1, 0)
2389 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2390 [buf], object(), 0)
2391 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2392 [buf], 0, object())
2393
2394 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2395 self.assertEqual(nbytes, len(MSG))
2396 self.assertEqual(buf, bytearray(MSG))
2397 self.checkRecvmsgAddress(addr, self.cli_addr)
2398 self.assertEqual(ancdata, [])
2399 self.checkFlags(flags, eor=True)
2400
2401 def _testRecvmsgIntoBadArgs(self):
2402 self.sendToServer(MSG)
2403
2404 def testRecvmsgIntoGenerator(self):
2405 # Receive into buffer obtained from a generator (not a sequence).
2406 buf = bytearray(len(MSG))
2407 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2408 (o for o in [buf]))
2409 self.assertEqual(nbytes, len(MSG))
2410 self.assertEqual(buf, bytearray(MSG))
2411 self.checkRecvmsgAddress(addr, self.cli_addr)
2412 self.assertEqual(ancdata, [])
2413 self.checkFlags(flags, eor=True)
2414
2415 def _testRecvmsgIntoGenerator(self):
2416 self.sendToServer(MSG)
2417
2418 def testRecvmsgIntoArray(self):
2419 # Receive into an array rather than the usual bytearray.
2420 buf = array.array("B", [0] * len(MSG))
2421 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2422 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002423 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002424 self.checkRecvmsgAddress(addr, self.cli_addr)
2425 self.assertEqual(ancdata, [])
2426 self.checkFlags(flags, eor=True)
2427
2428 def _testRecvmsgIntoArray(self):
2429 self.sendToServer(MSG)
2430
2431 def testRecvmsgIntoScatter(self):
2432 # Receive into multiple buffers (scatter write).
2433 b1 = bytearray(b"----")
2434 b2 = bytearray(b"0123456789")
2435 b3 = bytearray(b"--------------")
2436 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2437 [b1, memoryview(b2)[2:9], b3])
2438 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2439 self.assertEqual(b1, bytearray(b"Mary"))
2440 self.assertEqual(b2, bytearray(b"01 had a 9"))
2441 self.assertEqual(b3, bytearray(b"little lamb---"))
2442 self.checkRecvmsgAddress(addr, self.cli_addr)
2443 self.assertEqual(ancdata, [])
2444 self.checkFlags(flags, eor=True)
2445
2446 def _testRecvmsgIntoScatter(self):
2447 self.sendToServer(b"Mary had a little lamb")
2448
2449
2450class CmsgMacroTests(unittest.TestCase):
2451 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2452 # assumptions used by sendmsg() and recvmsg[_into](), which share
2453 # code with these functions.
2454
2455 # Match the definition in socketmodule.c
2456 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2457
2458 @requireAttrs(socket, "CMSG_LEN")
2459 def testCMSG_LEN(self):
2460 # Test CMSG_LEN() with various valid and invalid values,
2461 # checking the assumptions used by recvmsg() and sendmsg().
2462 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2463 values = list(range(257)) + list(range(toobig - 257, toobig))
2464
2465 # struct cmsghdr has at least three members, two of which are ints
2466 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2467 for n in values:
2468 ret = socket.CMSG_LEN(n)
2469 # This is how recvmsg() calculates the data size
2470 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2471 self.assertLessEqual(ret, self.socklen_t_limit)
2472
2473 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2474 # sendmsg() shares code with these functions, and requires
2475 # that it reject values over the limit.
2476 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2477 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2478
2479 @requireAttrs(socket, "CMSG_SPACE")
2480 def testCMSG_SPACE(self):
2481 # Test CMSG_SPACE() with various valid and invalid values,
2482 # checking the assumptions used by sendmsg().
2483 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2484 values = list(range(257)) + list(range(toobig - 257, toobig))
2485
2486 last = socket.CMSG_SPACE(0)
2487 # struct cmsghdr has at least three members, two of which are ints
2488 self.assertGreater(last, array.array("i").itemsize * 2)
2489 for n in values:
2490 ret = socket.CMSG_SPACE(n)
2491 self.assertGreaterEqual(ret, last)
2492 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2493 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2494 self.assertLessEqual(ret, self.socklen_t_limit)
2495 last = ret
2496
2497 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2498 # sendmsg() shares code with these functions, and requires
2499 # that it reject values over the limit.
2500 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2501 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2502
2503
2504class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2505 # Tests for file descriptor passing on Unix-domain sockets.
2506
2507 # Invalid file descriptor value that's unlikely to evaluate to a
2508 # real FD even if one of its bytes is replaced with a different
2509 # value (which shouldn't actually happen).
2510 badfd = -0x5555
2511
2512 def newFDs(self, n):
2513 # Return a list of n file descriptors for newly-created files
2514 # containing their list indices as ASCII numbers.
2515 fds = []
2516 for i in range(n):
2517 fd, path = tempfile.mkstemp()
2518 self.addCleanup(os.unlink, path)
2519 self.addCleanup(os.close, fd)
2520 os.write(fd, str(i).encode())
2521 fds.append(fd)
2522 return fds
2523
2524 def checkFDs(self, fds):
2525 # Check that the file descriptors in the given list contain
2526 # their correct list indices as ASCII numbers.
2527 for n, fd in enumerate(fds):
2528 os.lseek(fd, 0, os.SEEK_SET)
2529 self.assertEqual(os.read(fd, 1024), str(n).encode())
2530
2531 def registerRecvmsgResult(self, result):
2532 self.addCleanup(self.closeRecvmsgFDs, result)
2533
2534 def closeRecvmsgFDs(self, recvmsg_result):
2535 # Close all file descriptors specified in the ancillary data
2536 # of the given return value from recvmsg() or recvmsg_into().
2537 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2538 if (cmsg_level == socket.SOL_SOCKET and
2539 cmsg_type == socket.SCM_RIGHTS):
2540 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002541 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002542 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2543 for fd in fds:
2544 os.close(fd)
2545
2546 def createAndSendFDs(self, n):
2547 # Send n new file descriptors created by newFDs() to the
2548 # server, with the constant MSG as the non-ancillary data.
2549 self.assertEqual(
2550 self.sendmsgToServer([MSG],
2551 [(socket.SOL_SOCKET,
2552 socket.SCM_RIGHTS,
2553 array.array("i", self.newFDs(n)))]),
2554 len(MSG))
2555
2556 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2557 # Check that constant MSG was received with numfds file
2558 # descriptors in a maximum of maxcmsgs control messages (which
2559 # must contain only complete integers). By default, check
2560 # that MSG_CTRUNC is unset, but ignore any flags in
2561 # ignoreflags.
2562 msg, ancdata, flags, addr = result
2563 self.assertEqual(msg, MSG)
2564 self.checkRecvmsgAddress(addr, self.cli_addr)
2565 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2566 ignore=ignoreflags)
2567
2568 self.assertIsInstance(ancdata, list)
2569 self.assertLessEqual(len(ancdata), maxcmsgs)
2570 fds = array.array("i")
2571 for item in ancdata:
2572 self.assertIsInstance(item, tuple)
2573 cmsg_level, cmsg_type, cmsg_data = item
2574 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2575 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2576 self.assertIsInstance(cmsg_data, bytes)
2577 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002578 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002579
2580 self.assertEqual(len(fds), numfds)
2581 self.checkFDs(fds)
2582
2583 def testFDPassSimple(self):
2584 # Pass a single FD (array read from bytes object).
2585 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2586 len(MSG), 10240))
2587
2588 def _testFDPassSimple(self):
2589 self.assertEqual(
2590 self.sendmsgToServer(
2591 [MSG],
2592 [(socket.SOL_SOCKET,
2593 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002594 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002595 len(MSG))
2596
2597 def testMultipleFDPass(self):
2598 # Pass multiple FDs in a single array.
2599 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2600 len(MSG), 10240))
2601
2602 def _testMultipleFDPass(self):
2603 self.createAndSendFDs(4)
2604
2605 @requireAttrs(socket, "CMSG_SPACE")
2606 def testFDPassCMSG_SPACE(self):
2607 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2608 self.checkRecvmsgFDs(
2609 4, self.doRecvmsg(self.serv_sock, len(MSG),
2610 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2611
2612 @testFDPassCMSG_SPACE.client_skip
2613 def _testFDPassCMSG_SPACE(self):
2614 self.createAndSendFDs(4)
2615
2616 def testFDPassCMSG_LEN(self):
2617 # Test using CMSG_LEN() to calculate ancillary buffer size.
2618 self.checkRecvmsgFDs(1,
2619 self.doRecvmsg(self.serv_sock, len(MSG),
2620 socket.CMSG_LEN(4 * SIZEOF_INT)),
2621 # RFC 3542 says implementations may set
2622 # MSG_CTRUNC if there isn't enough space
2623 # for trailing padding.
2624 ignoreflags=socket.MSG_CTRUNC)
2625
2626 def _testFDPassCMSG_LEN(self):
2627 self.createAndSendFDs(1)
2628
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002629 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002630 @requireAttrs(socket, "CMSG_SPACE")
2631 def testFDPassSeparate(self):
2632 # Pass two FDs in two separate arrays. Arrays may be combined
2633 # into a single control message by the OS.
2634 self.checkRecvmsgFDs(2,
2635 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2636 maxcmsgs=2)
2637
2638 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002639 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002640 def _testFDPassSeparate(self):
2641 fd0, fd1 = self.newFDs(2)
2642 self.assertEqual(
2643 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2644 socket.SCM_RIGHTS,
2645 array.array("i", [fd0])),
2646 (socket.SOL_SOCKET,
2647 socket.SCM_RIGHTS,
2648 array.array("i", [fd1]))]),
2649 len(MSG))
2650
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002651 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002652 @requireAttrs(socket, "CMSG_SPACE")
2653 def testFDPassSeparateMinSpace(self):
2654 # Pass two FDs in two separate arrays, receiving them into the
2655 # minimum space for two arrays.
2656 self.checkRecvmsgFDs(2,
2657 self.doRecvmsg(self.serv_sock, len(MSG),
2658 socket.CMSG_SPACE(SIZEOF_INT) +
2659 socket.CMSG_LEN(SIZEOF_INT)),
2660 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2661
2662 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002663 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002664 def _testFDPassSeparateMinSpace(self):
2665 fd0, fd1 = self.newFDs(2)
2666 self.assertEqual(
2667 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2668 socket.SCM_RIGHTS,
2669 array.array("i", [fd0])),
2670 (socket.SOL_SOCKET,
2671 socket.SCM_RIGHTS,
2672 array.array("i", [fd1]))]),
2673 len(MSG))
2674
2675 def sendAncillaryIfPossible(self, msg, ancdata):
2676 # Try to send msg and ancdata to server, but if the system
2677 # call fails, just send msg with no ancillary data.
2678 try:
2679 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002680 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002681 # Check that it was the system call that failed
2682 self.assertIsInstance(e.errno, int)
2683 nbytes = self.sendmsgToServer([msg])
2684 self.assertEqual(nbytes, len(msg))
2685
2686 def testFDPassEmpty(self):
2687 # Try to pass an empty FD array. Can receive either no array
2688 # or an empty array.
2689 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2690 len(MSG), 10240),
2691 ignoreflags=socket.MSG_CTRUNC)
2692
2693 def _testFDPassEmpty(self):
2694 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2695 socket.SCM_RIGHTS,
2696 b"")])
2697
2698 def testFDPassPartialInt(self):
2699 # Try to pass a truncated FD array.
2700 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2701 len(MSG), 10240)
2702 self.assertEqual(msg, MSG)
2703 self.checkRecvmsgAddress(addr, self.cli_addr)
2704 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2705 self.assertLessEqual(len(ancdata), 1)
2706 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2707 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2708 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2709 self.assertLess(len(cmsg_data), SIZEOF_INT)
2710
2711 def _testFDPassPartialInt(self):
2712 self.sendAncillaryIfPossible(
2713 MSG,
2714 [(socket.SOL_SOCKET,
2715 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002716 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002717
2718 @requireAttrs(socket, "CMSG_SPACE")
2719 def testFDPassPartialIntInMiddle(self):
2720 # Try to pass two FD arrays, the first of which is truncated.
2721 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2722 len(MSG), 10240)
2723 self.assertEqual(msg, MSG)
2724 self.checkRecvmsgAddress(addr, self.cli_addr)
2725 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2726 self.assertLessEqual(len(ancdata), 2)
2727 fds = array.array("i")
2728 # Arrays may have been combined in a single control message
2729 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2730 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2731 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002732 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002733 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2734 self.assertLessEqual(len(fds), 2)
2735 self.checkFDs(fds)
2736
2737 @testFDPassPartialIntInMiddle.client_skip
2738 def _testFDPassPartialIntInMiddle(self):
2739 fd0, fd1 = self.newFDs(2)
2740 self.sendAncillaryIfPossible(
2741 MSG,
2742 [(socket.SOL_SOCKET,
2743 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002744 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002745 (socket.SOL_SOCKET,
2746 socket.SCM_RIGHTS,
2747 array.array("i", [fd1]))])
2748
2749 def checkTruncatedHeader(self, result, ignoreflags=0):
2750 # Check that no ancillary data items are returned when data is
2751 # truncated inside the cmsghdr structure.
2752 msg, ancdata, flags, addr = result
2753 self.assertEqual(msg, MSG)
2754 self.checkRecvmsgAddress(addr, self.cli_addr)
2755 self.assertEqual(ancdata, [])
2756 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2757 ignore=ignoreflags)
2758
2759 def testCmsgTruncNoBufSize(self):
2760 # Check that no ancillary data is received when no buffer size
2761 # is specified.
2762 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2763 # BSD seems to set MSG_CTRUNC only
2764 # if an item has been partially
2765 # received.
2766 ignoreflags=socket.MSG_CTRUNC)
2767
2768 def _testCmsgTruncNoBufSize(self):
2769 self.createAndSendFDs(1)
2770
2771 def testCmsgTrunc0(self):
2772 # Check that no ancillary data is received when buffer size is 0.
2773 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2774 ignoreflags=socket.MSG_CTRUNC)
2775
2776 def _testCmsgTrunc0(self):
2777 self.createAndSendFDs(1)
2778
2779 # Check that no ancillary data is returned for various non-zero
2780 # (but still too small) buffer sizes.
2781
2782 def testCmsgTrunc1(self):
2783 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2784
2785 def _testCmsgTrunc1(self):
2786 self.createAndSendFDs(1)
2787
2788 def testCmsgTrunc2Int(self):
2789 # The cmsghdr structure has at least three members, two of
2790 # which are ints, so we still shouldn't see any ancillary
2791 # data.
2792 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2793 SIZEOF_INT * 2))
2794
2795 def _testCmsgTrunc2Int(self):
2796 self.createAndSendFDs(1)
2797
2798 def testCmsgTruncLen0Minus1(self):
2799 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2800 socket.CMSG_LEN(0) - 1))
2801
2802 def _testCmsgTruncLen0Minus1(self):
2803 self.createAndSendFDs(1)
2804
2805 # The following tests try to truncate the control message in the
2806 # middle of the FD array.
2807
2808 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2809 # Check that file descriptor data is truncated to between
2810 # mindata and maxdata bytes when received with buffer size
2811 # ancbuf, and that any complete file descriptor numbers are
2812 # valid.
2813 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2814 len(MSG), ancbuf)
2815 self.assertEqual(msg, MSG)
2816 self.checkRecvmsgAddress(addr, self.cli_addr)
2817 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2818
2819 if mindata == 0 and ancdata == []:
2820 return
2821 self.assertEqual(len(ancdata), 1)
2822 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2823 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2824 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2825 self.assertGreaterEqual(len(cmsg_data), mindata)
2826 self.assertLessEqual(len(cmsg_data), maxdata)
2827 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002828 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002829 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2830 self.checkFDs(fds)
2831
2832 def testCmsgTruncLen0(self):
2833 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2834
2835 def _testCmsgTruncLen0(self):
2836 self.createAndSendFDs(1)
2837
2838 def testCmsgTruncLen0Plus1(self):
2839 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2840
2841 def _testCmsgTruncLen0Plus1(self):
2842 self.createAndSendFDs(2)
2843
2844 def testCmsgTruncLen1(self):
2845 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2846 maxdata=SIZEOF_INT)
2847
2848 def _testCmsgTruncLen1(self):
2849 self.createAndSendFDs(2)
2850
2851 def testCmsgTruncLen2Minus1(self):
2852 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2853 maxdata=(2 * SIZEOF_INT) - 1)
2854
2855 def _testCmsgTruncLen2Minus1(self):
2856 self.createAndSendFDs(2)
2857
2858
2859class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2860 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2861 # features of the RFC 3542 Advanced Sockets API for IPv6.
2862 # Currently we can only handle certain data items (e.g. traffic
2863 # class, hop limit, MTU discovery and fragmentation settings)
2864 # without resorting to unportable means such as the struct module,
2865 # but the tests here are aimed at testing the ancillary data
2866 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2867 # itself.
2868
2869 # Test value to use when setting hop limit of packet
2870 hop_limit = 2
2871
2872 # Test value to use when setting traffic class of packet.
2873 # -1 means "use kernel default".
2874 traffic_class = -1
2875
2876 def ancillaryMapping(self, ancdata):
2877 # Given ancillary data list ancdata, return a mapping from
2878 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2879 # Check that no (level, type) pair appears more than once.
2880 d = {}
2881 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2882 self.assertNotIn((cmsg_level, cmsg_type), d)
2883 d[(cmsg_level, cmsg_type)] = cmsg_data
2884 return d
2885
2886 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2887 # Receive hop limit into ancbufsize bytes of ancillary data
2888 # space. Check that data is MSG, ancillary data is not
2889 # truncated (but ignore any flags in ignoreflags), and hop
2890 # limit is between 0 and maxhop inclusive.
2891 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2892 socket.IPV6_RECVHOPLIMIT, 1)
2893 self.misc_event.set()
2894 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2895 len(MSG), ancbufsize)
2896
2897 self.assertEqual(msg, MSG)
2898 self.checkRecvmsgAddress(addr, self.cli_addr)
2899 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2900 ignore=ignoreflags)
2901
2902 self.assertEqual(len(ancdata), 1)
2903 self.assertIsInstance(ancdata[0], tuple)
2904 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2905 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2906 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2907 self.assertIsInstance(cmsg_data, bytes)
2908 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2909 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002910 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002911 self.assertGreaterEqual(a[0], 0)
2912 self.assertLessEqual(a[0], maxhop)
2913
2914 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2915 def testRecvHopLimit(self):
2916 # Test receiving the packet hop limit as ancillary data.
2917 self.checkHopLimit(ancbufsize=10240)
2918
2919 @testRecvHopLimit.client_skip
2920 def _testRecvHopLimit(self):
2921 # Need to wait until server has asked to receive ancillary
2922 # data, as implementations are not required to buffer it
2923 # otherwise.
2924 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2925 self.sendToServer(MSG)
2926
2927 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2928 def testRecvHopLimitCMSG_SPACE(self):
2929 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2930 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2931
2932 @testRecvHopLimitCMSG_SPACE.client_skip
2933 def _testRecvHopLimitCMSG_SPACE(self):
2934 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2935 self.sendToServer(MSG)
2936
2937 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2938 # 3542 says portable applications must provide space for trailing
2939 # padding. Implementations may set MSG_CTRUNC if there isn't
2940 # enough space for the padding.
2941
2942 @requireAttrs(socket.socket, "sendmsg")
2943 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2944 def testSetHopLimit(self):
2945 # Test setting hop limit on outgoing packet and receiving it
2946 # at the other end.
2947 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2948
2949 @testSetHopLimit.client_skip
2950 def _testSetHopLimit(self):
2951 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2952 self.assertEqual(
2953 self.sendmsgToServer([MSG],
2954 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2955 array.array("i", [self.hop_limit]))]),
2956 len(MSG))
2957
2958 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2959 ignoreflags=0):
2960 # Receive traffic class and hop limit into ancbufsize bytes of
2961 # ancillary data space. Check that data is MSG, ancillary
2962 # data is not truncated (but ignore any flags in ignoreflags),
2963 # and traffic class and hop limit are in range (hop limit no
2964 # more than maxhop).
2965 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2966 socket.IPV6_RECVHOPLIMIT, 1)
2967 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2968 socket.IPV6_RECVTCLASS, 1)
2969 self.misc_event.set()
2970 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2971 len(MSG), ancbufsize)
2972
2973 self.assertEqual(msg, MSG)
2974 self.checkRecvmsgAddress(addr, self.cli_addr)
2975 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2976 ignore=ignoreflags)
2977 self.assertEqual(len(ancdata), 2)
2978 ancmap = self.ancillaryMapping(ancdata)
2979
2980 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2981 self.assertEqual(len(tcdata), SIZEOF_INT)
2982 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002983 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002984 self.assertGreaterEqual(a[0], 0)
2985 self.assertLessEqual(a[0], 255)
2986
2987 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2988 self.assertEqual(len(hldata), SIZEOF_INT)
2989 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002990 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002991 self.assertGreaterEqual(a[0], 0)
2992 self.assertLessEqual(a[0], maxhop)
2993
2994 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2995 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2996 def testRecvTrafficClassAndHopLimit(self):
2997 # Test receiving traffic class and hop limit as ancillary data.
2998 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2999
3000 @testRecvTrafficClassAndHopLimit.client_skip
3001 def _testRecvTrafficClassAndHopLimit(self):
3002 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3003 self.sendToServer(MSG)
3004
3005 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3006 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3007 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3008 # Test receiving traffic class and hop limit, using
3009 # CMSG_SPACE() to calculate buffer size.
3010 self.checkTrafficClassAndHopLimit(
3011 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3012
3013 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3014 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3015 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3016 self.sendToServer(MSG)
3017
3018 @requireAttrs(socket.socket, "sendmsg")
3019 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3020 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3021 def testSetTrafficClassAndHopLimit(self):
3022 # Test setting traffic class and hop limit on outgoing packet,
3023 # and receiving them at the other end.
3024 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3025 maxhop=self.hop_limit)
3026
3027 @testSetTrafficClassAndHopLimit.client_skip
3028 def _testSetTrafficClassAndHopLimit(self):
3029 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3030 self.assertEqual(
3031 self.sendmsgToServer([MSG],
3032 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3033 array.array("i", [self.traffic_class])),
3034 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3035 array.array("i", [self.hop_limit]))]),
3036 len(MSG))
3037
3038 @requireAttrs(socket.socket, "sendmsg")
3039 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3040 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3041 def testOddCmsgSize(self):
3042 # Try to send ancillary data with first item one byte too
3043 # long. Fall back to sending with correct size if this fails,
3044 # and check that second item was handled correctly.
3045 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3046 maxhop=self.hop_limit)
3047
3048 @testOddCmsgSize.client_skip
3049 def _testOddCmsgSize(self):
3050 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3051 try:
3052 nbytes = self.sendmsgToServer(
3053 [MSG],
3054 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003055 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003056 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3057 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003058 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003059 self.assertIsInstance(e.errno, int)
3060 nbytes = self.sendmsgToServer(
3061 [MSG],
3062 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3063 array.array("i", [self.traffic_class])),
3064 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3065 array.array("i", [self.hop_limit]))])
3066 self.assertEqual(nbytes, len(MSG))
3067
3068 # Tests for proper handling of truncated ancillary data
3069
3070 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3071 # Receive hop limit into ancbufsize bytes of ancillary data
3072 # space, which should be too small to contain the ancillary
3073 # data header (if ancbufsize is None, pass no second argument
3074 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3075 # (unless included in ignoreflags), and no ancillary data is
3076 # returned.
3077 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3078 socket.IPV6_RECVHOPLIMIT, 1)
3079 self.misc_event.set()
3080 args = () if ancbufsize is None else (ancbufsize,)
3081 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3082 len(MSG), *args)
3083
3084 self.assertEqual(msg, MSG)
3085 self.checkRecvmsgAddress(addr, self.cli_addr)
3086 self.assertEqual(ancdata, [])
3087 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3088 ignore=ignoreflags)
3089
3090 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3091 def testCmsgTruncNoBufSize(self):
3092 # Check that no ancillary data is received when no ancillary
3093 # buffer size is provided.
3094 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3095 # BSD seems to set
3096 # MSG_CTRUNC only if an item
3097 # has been partially
3098 # received.
3099 ignoreflags=socket.MSG_CTRUNC)
3100
3101 @testCmsgTruncNoBufSize.client_skip
3102 def _testCmsgTruncNoBufSize(self):
3103 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3104 self.sendToServer(MSG)
3105
3106 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3107 def testSingleCmsgTrunc0(self):
3108 # Check that no ancillary data is received when ancillary
3109 # buffer size is zero.
3110 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3111 ignoreflags=socket.MSG_CTRUNC)
3112
3113 @testSingleCmsgTrunc0.client_skip
3114 def _testSingleCmsgTrunc0(self):
3115 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3116 self.sendToServer(MSG)
3117
3118 # Check that no ancillary data is returned for various non-zero
3119 # (but still too small) buffer sizes.
3120
3121 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3122 def testSingleCmsgTrunc1(self):
3123 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3124
3125 @testSingleCmsgTrunc1.client_skip
3126 def _testSingleCmsgTrunc1(self):
3127 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3128 self.sendToServer(MSG)
3129
3130 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3131 def testSingleCmsgTrunc2Int(self):
3132 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3133
3134 @testSingleCmsgTrunc2Int.client_skip
3135 def _testSingleCmsgTrunc2Int(self):
3136 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3137 self.sendToServer(MSG)
3138
3139 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3140 def testSingleCmsgTruncLen0Minus1(self):
3141 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3142
3143 @testSingleCmsgTruncLen0Minus1.client_skip
3144 def _testSingleCmsgTruncLen0Minus1(self):
3145 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3146 self.sendToServer(MSG)
3147
3148 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3149 def testSingleCmsgTruncInData(self):
3150 # Test truncation of a control message inside its associated
3151 # data. The message may be returned with its data truncated,
3152 # or not returned at all.
3153 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3154 socket.IPV6_RECVHOPLIMIT, 1)
3155 self.misc_event.set()
3156 msg, ancdata, flags, addr = self.doRecvmsg(
3157 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3158
3159 self.assertEqual(msg, MSG)
3160 self.checkRecvmsgAddress(addr, self.cli_addr)
3161 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3162
3163 self.assertLessEqual(len(ancdata), 1)
3164 if ancdata:
3165 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3166 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3167 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3168 self.assertLess(len(cmsg_data), SIZEOF_INT)
3169
3170 @testSingleCmsgTruncInData.client_skip
3171 def _testSingleCmsgTruncInData(self):
3172 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3173 self.sendToServer(MSG)
3174
3175 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3176 # Receive traffic class and hop limit into ancbufsize bytes of
3177 # ancillary data space, which should be large enough to
3178 # contain the first item, but too small to contain the header
3179 # of the second. Check that data is MSG, MSG_CTRUNC is set
3180 # (unless included in ignoreflags), and only one ancillary
3181 # data item is returned.
3182 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3183 socket.IPV6_RECVHOPLIMIT, 1)
3184 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3185 socket.IPV6_RECVTCLASS, 1)
3186 self.misc_event.set()
3187 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3188 len(MSG), ancbufsize)
3189
3190 self.assertEqual(msg, MSG)
3191 self.checkRecvmsgAddress(addr, self.cli_addr)
3192 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3193 ignore=ignoreflags)
3194
3195 self.assertEqual(len(ancdata), 1)
3196 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3197 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3198 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3199 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3200 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003201 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003202 self.assertGreaterEqual(a[0], 0)
3203 self.assertLessEqual(a[0], 255)
3204
3205 # Try the above test with various buffer sizes.
3206
3207 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3208 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3209 def testSecondCmsgTrunc0(self):
3210 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3211 ignoreflags=socket.MSG_CTRUNC)
3212
3213 @testSecondCmsgTrunc0.client_skip
3214 def _testSecondCmsgTrunc0(self):
3215 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3216 self.sendToServer(MSG)
3217
3218 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3219 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3220 def testSecondCmsgTrunc1(self):
3221 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3222
3223 @testSecondCmsgTrunc1.client_skip
3224 def _testSecondCmsgTrunc1(self):
3225 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3226 self.sendToServer(MSG)
3227
3228 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3229 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3230 def testSecondCmsgTrunc2Int(self):
3231 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3232 2 * SIZEOF_INT)
3233
3234 @testSecondCmsgTrunc2Int.client_skip
3235 def _testSecondCmsgTrunc2Int(self):
3236 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3237 self.sendToServer(MSG)
3238
3239 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3240 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3241 def testSecondCmsgTruncLen0Minus1(self):
3242 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3243 socket.CMSG_LEN(0) - 1)
3244
3245 @testSecondCmsgTruncLen0Minus1.client_skip
3246 def _testSecondCmsgTruncLen0Minus1(self):
3247 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3248 self.sendToServer(MSG)
3249
3250 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3251 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3252 def testSecomdCmsgTruncInData(self):
3253 # Test truncation of the second of two control messages inside
3254 # its associated data.
3255 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3256 socket.IPV6_RECVHOPLIMIT, 1)
3257 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3258 socket.IPV6_RECVTCLASS, 1)
3259 self.misc_event.set()
3260 msg, ancdata, flags, addr = self.doRecvmsg(
3261 self.serv_sock, len(MSG),
3262 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3263
3264 self.assertEqual(msg, MSG)
3265 self.checkRecvmsgAddress(addr, self.cli_addr)
3266 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3267
3268 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3269
3270 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3271 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3272 cmsg_types.remove(cmsg_type)
3273 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3274 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003275 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003276 self.assertGreaterEqual(a[0], 0)
3277 self.assertLessEqual(a[0], 255)
3278
3279 if ancdata:
3280 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3281 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3282 cmsg_types.remove(cmsg_type)
3283 self.assertLess(len(cmsg_data), SIZEOF_INT)
3284
3285 self.assertEqual(ancdata, [])
3286
3287 @testSecomdCmsgTruncInData.client_skip
3288 def _testSecomdCmsgTruncInData(self):
3289 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3290 self.sendToServer(MSG)
3291
3292
3293# Derive concrete test classes for different socket types.
3294
3295class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3296 SendrecvmsgConnectionlessBase,
3297 ThreadedSocketTestMixin, UDPTestBase):
3298 pass
3299
3300@requireAttrs(socket.socket, "sendmsg")
3301@unittest.skipUnless(thread, 'Threading required for this test.')
3302class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3303 pass
3304
3305@requireAttrs(socket.socket, "recvmsg")
3306@unittest.skipUnless(thread, 'Threading required for this test.')
3307class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3308 pass
3309
3310@requireAttrs(socket.socket, "recvmsg_into")
3311@unittest.skipUnless(thread, 'Threading required for this test.')
3312class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3313 pass
3314
3315
3316class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3317 SendrecvmsgConnectionlessBase,
3318 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003319
3320 def checkRecvmsgAddress(self, addr1, addr2):
3321 # Called to compare the received address with the address of
3322 # the peer, ignoring scope ID
3323 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003324
3325@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003326@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003327@requireSocket("AF_INET6", "SOCK_DGRAM")
3328@unittest.skipUnless(thread, 'Threading required for this test.')
3329class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3330 pass
3331
3332@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003333@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003334@requireSocket("AF_INET6", "SOCK_DGRAM")
3335@unittest.skipUnless(thread, 'Threading required for this test.')
3336class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3337 pass
3338
3339@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003340@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003341@requireSocket("AF_INET6", "SOCK_DGRAM")
3342@unittest.skipUnless(thread, 'Threading required for this test.')
3343class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3344 pass
3345
3346@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003347@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003348@requireAttrs(socket, "IPPROTO_IPV6")
3349@requireSocket("AF_INET6", "SOCK_DGRAM")
3350@unittest.skipUnless(thread, 'Threading required for this test.')
3351class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3352 SendrecvmsgUDP6TestBase):
3353 pass
3354
3355@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003356@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003357@requireAttrs(socket, "IPPROTO_IPV6")
3358@requireSocket("AF_INET6", "SOCK_DGRAM")
3359@unittest.skipUnless(thread, 'Threading required for this test.')
3360class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3361 RFC3542AncillaryTest,
3362 SendrecvmsgUDP6TestBase):
3363 pass
3364
3365
3366class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3367 ConnectedStreamTestMixin, TCPTestBase):
3368 pass
3369
3370@requireAttrs(socket.socket, "sendmsg")
3371@unittest.skipUnless(thread, 'Threading required for this test.')
3372class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3373 pass
3374
3375@requireAttrs(socket.socket, "recvmsg")
3376@unittest.skipUnless(thread, 'Threading required for this test.')
3377class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3378 SendrecvmsgTCPTestBase):
3379 pass
3380
3381@requireAttrs(socket.socket, "recvmsg_into")
3382@unittest.skipUnless(thread, 'Threading required for this test.')
3383class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3384 SendrecvmsgTCPTestBase):
3385 pass
3386
3387
3388class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3389 SendrecvmsgConnectedBase,
3390 ConnectedStreamTestMixin, SCTPStreamBase):
3391 pass
3392
3393@requireAttrs(socket.socket, "sendmsg")
3394@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3395@unittest.skipUnless(thread, 'Threading required for this test.')
3396class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3397 pass
3398
3399@requireAttrs(socket.socket, "recvmsg")
3400@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3401@unittest.skipUnless(thread, 'Threading required for this test.')
3402class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3403 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003404
3405 def testRecvmsgEOF(self):
3406 try:
3407 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3408 except OSError as e:
3409 if e.errno != errno.ENOTCONN:
3410 raise
3411 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003412
3413@requireAttrs(socket.socket, "recvmsg_into")
3414@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3415@unittest.skipUnless(thread, 'Threading required for this test.')
3416class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3417 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003418
3419 def testRecvmsgEOF(self):
3420 try:
3421 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3422 except OSError as e:
3423 if e.errno != errno.ENOTCONN:
3424 raise
3425 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003426
3427
3428class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3429 ConnectedStreamTestMixin, UnixStreamBase):
3430 pass
3431
3432@requireAttrs(socket.socket, "sendmsg")
3433@requireAttrs(socket, "AF_UNIX")
3434@unittest.skipUnless(thread, 'Threading required for this test.')
3435class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3436 pass
3437
3438@requireAttrs(socket.socket, "recvmsg")
3439@requireAttrs(socket, "AF_UNIX")
3440@unittest.skipUnless(thread, 'Threading required for this test.')
3441class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3442 SendrecvmsgUnixStreamTestBase):
3443 pass
3444
3445@requireAttrs(socket.socket, "recvmsg_into")
3446@requireAttrs(socket, "AF_UNIX")
3447@unittest.skipUnless(thread, 'Threading required for this test.')
3448class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3449 SendrecvmsgUnixStreamTestBase):
3450 pass
3451
3452@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3453@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3454@unittest.skipUnless(thread, 'Threading required for this test.')
3455class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3456 pass
3457
3458@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3459@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3460@unittest.skipUnless(thread, 'Threading required for this test.')
3461class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3462 SendrecvmsgUnixStreamTestBase):
3463 pass
3464
3465
3466# Test interrupting the interruptible send/receive methods with a
3467# signal when a timeout is set. These tests avoid having multiple
3468# threads alive during the test so that the OS cannot deliver the
3469# signal to the wrong one.
3470
3471class InterruptedTimeoutBase(unittest.TestCase):
3472 # Base class for interrupted send/receive tests. Installs an
3473 # empty handler for SIGALRM and removes it on teardown, along with
3474 # any scheduled alarms.
3475
3476 def setUp(self):
3477 super().setUp()
3478 orig_alrm_handler = signal.signal(signal.SIGALRM,
3479 lambda signum, frame: None)
3480 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3481 self.addCleanup(self.setAlarm, 0)
3482
3483 # Timeout for socket operations
3484 timeout = 4.0
3485
3486 # Provide setAlarm() method to schedule delivery of SIGALRM after
3487 # given number of seconds, or cancel it if zero, and an
3488 # appropriate time value to use. Use setitimer() if available.
3489 if hasattr(signal, "setitimer"):
3490 alarm_time = 0.05
3491
3492 def setAlarm(self, seconds):
3493 signal.setitimer(signal.ITIMER_REAL, seconds)
3494 else:
3495 # Old systems may deliver the alarm up to one second early
3496 alarm_time = 2
3497
3498 def setAlarm(self, seconds):
3499 signal.alarm(seconds)
3500
3501
3502# Require siginterrupt() in order to ensure that system calls are
3503# interrupted by default.
3504@requireAttrs(signal, "siginterrupt")
3505@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3506 "Don't have signal.alarm or signal.setitimer")
3507class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3508 # Test interrupting the recv*() methods with signals when a
3509 # timeout is set.
3510
3511 def setUp(self):
3512 super().setUp()
3513 self.serv.settimeout(self.timeout)
3514
3515 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003516 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003517 # errno of EINTR when interrupted by a signal.
3518 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003519 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003520 func(*args, **kwargs)
3521 self.assertNotIsInstance(cm.exception, socket.timeout)
3522 self.assertEqual(cm.exception.errno, errno.EINTR)
3523
3524 def testInterruptedRecvTimeout(self):
3525 self.checkInterruptedRecv(self.serv.recv, 1024)
3526
3527 def testInterruptedRecvIntoTimeout(self):
3528 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3529
3530 def testInterruptedRecvfromTimeout(self):
3531 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3532
3533 def testInterruptedRecvfromIntoTimeout(self):
3534 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3535
3536 @requireAttrs(socket.socket, "recvmsg")
3537 def testInterruptedRecvmsgTimeout(self):
3538 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3539
3540 @requireAttrs(socket.socket, "recvmsg_into")
3541 def testInterruptedRecvmsgIntoTimeout(self):
3542 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3543
3544
3545# Require siginterrupt() in order to ensure that system calls are
3546# interrupted by default.
3547@requireAttrs(signal, "siginterrupt")
3548@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3549 "Don't have signal.alarm or signal.setitimer")
3550@unittest.skipUnless(thread, 'Threading required for this test.')
3551class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3552 ThreadSafeCleanupTestCase,
3553 SocketListeningTestMixin, TCPTestBase):
3554 # Test interrupting the interruptible send*() methods with signals
3555 # when a timeout is set.
3556
3557 def setUp(self):
3558 super().setUp()
3559 self.serv_conn = self.newSocket()
3560 self.addCleanup(self.serv_conn.close)
3561 # Use a thread to complete the connection, but wait for it to
3562 # terminate before running the test, so that there is only one
3563 # thread to accept the signal.
3564 cli_thread = threading.Thread(target=self.doConnect)
3565 cli_thread.start()
3566 self.cli_conn, addr = self.serv.accept()
3567 self.addCleanup(self.cli_conn.close)
3568 cli_thread.join()
3569 self.serv_conn.settimeout(self.timeout)
3570
3571 def doConnect(self):
3572 self.serv_conn.connect(self.serv_addr)
3573
3574 def checkInterruptedSend(self, func, *args, **kwargs):
3575 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003576 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003577 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003578 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003579 while True:
3580 self.setAlarm(self.alarm_time)
3581 func(*args, **kwargs)
3582 self.assertNotIsInstance(cm.exception, socket.timeout)
3583 self.assertEqual(cm.exception.errno, errno.EINTR)
3584
Nick Coghlan2496f332011-09-19 20:26:31 +10003585 # Issue #12958: The following tests have problems on Mac OS X
3586 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003587 def testInterruptedSendTimeout(self):
3588 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3589
Nick Coghlan2496f332011-09-19 20:26:31 +10003590 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003591 def testInterruptedSendtoTimeout(self):
3592 # Passing an actual address here as Python's wrapper for
3593 # sendto() doesn't allow passing a zero-length one; POSIX
3594 # requires that the address is ignored since the socket is
3595 # connection-mode, however.
3596 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3597 self.serv_addr)
3598
Nick Coghlan2496f332011-09-19 20:26:31 +10003599 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003600 @requireAttrs(socket.socket, "sendmsg")
3601 def testInterruptedSendmsgTimeout(self):
3602 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3603
3604
Victor Stinner45df8202010-04-28 22:31:17 +00003605@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003606class TCPCloserTest(ThreadedTCPSocketTest):
3607
3608 def testClose(self):
3609 conn, addr = self.serv.accept()
3610 conn.close()
3611
3612 sd = self.cli
3613 read, write, err = select.select([sd], [], [], 1.0)
3614 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003615 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003616
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003617 # Calling close() many times should be safe.
3618 conn.close()
3619 conn.close()
3620
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003621 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003622 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003623 time.sleep(1.0)
3624
Victor Stinner45df8202010-04-28 22:31:17 +00003625@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003626class BasicSocketPairTest(SocketPairTest):
3627
3628 def __init__(self, methodName='runTest'):
3629 SocketPairTest.__init__(self, methodName=methodName)
3630
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003631 def _check_defaults(self, sock):
3632 self.assertIsInstance(sock, socket.socket)
3633 if hasattr(socket, 'AF_UNIX'):
3634 self.assertEqual(sock.family, socket.AF_UNIX)
3635 else:
3636 self.assertEqual(sock.family, socket.AF_INET)
3637 self.assertEqual(sock.type, socket.SOCK_STREAM)
3638 self.assertEqual(sock.proto, 0)
3639
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003640 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003641 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003642
3643 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003644 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003645
Dave Cole331708b2004-08-09 04:51:41 +00003646 def testRecv(self):
3647 msg = self.serv.recv(1024)
3648 self.assertEqual(msg, MSG)
3649
3650 def _testRecv(self):
3651 self.cli.send(MSG)
3652
3653 def testSend(self):
3654 self.serv.send(MSG)
3655
3656 def _testSend(self):
3657 msg = self.cli.recv(1024)
3658 self.assertEqual(msg, MSG)
3659
Victor Stinner45df8202010-04-28 22:31:17 +00003660@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003661class NonBlockingTCPTests(ThreadedTCPSocketTest):
3662
3663 def __init__(self, methodName='runTest'):
3664 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3665
3666 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003667 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003668 self.serv.setblocking(True)
3669 self.assertIsNone(self.serv.gettimeout())
3670 self.serv.setblocking(False)
3671 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003672 start = time.time()
3673 try:
3674 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003675 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003676 pass
3677 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003678 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Serhiy Storchaka78980432013-01-15 01:12:17 +02003679 # Issue 15989
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003680 if _testcapi.UINT_MAX < _testcapi.ULONG_MAX:
3681 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3682 self.assertIsNone(self.serv.gettimeout())
Guido van Rossum24e4af82002-06-12 19:18:08 +00003683
3684 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003685 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003686
Antoine Pitroub1c54962010-10-14 15:05:38 +00003687 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003688 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003689 def testInitNonBlocking(self):
3690 # reinit server socket
3691 self.serv.close()
3692 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003693 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003694 self.port = support.bind_port(self.serv)
3695 self.serv.listen(1)
3696 # actual testing
3697 start = time.time()
3698 try:
3699 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003700 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003701 pass
3702 end = time.time()
3703 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3704
3705 def _testInitNonBlocking(self):
3706 pass
3707
Antoine Pitrou600232b2011-01-05 21:03:42 +00003708 def testInheritFlags(self):
3709 # Issue #7995: when calling accept() on a listening socket with a
3710 # timeout, the resulting socket should not be non-blocking.
3711 self.serv.settimeout(10)
3712 try:
3713 conn, addr = self.serv.accept()
3714 message = conn.recv(len(MSG))
3715 finally:
3716 conn.close()
3717 self.serv.settimeout(None)
3718
3719 def _testInheritFlags(self):
3720 time.sleep(0.1)
3721 self.cli.connect((HOST, self.port))
3722 time.sleep(0.5)
3723 self.cli.send(MSG)
3724
Guido van Rossum24e4af82002-06-12 19:18:08 +00003725 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003726 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003727 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003728 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003729 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003730 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003731 pass
3732 else:
3733 self.fail("Error trying to do non-blocking accept.")
3734 read, write, err = select.select([self.serv], [], [])
3735 if self.serv in read:
3736 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003737 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003738 else:
3739 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003740
Guido van Rossum24e4af82002-06-12 19:18:08 +00003741 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003742 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003743 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003744
3745 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003746 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003747 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003748 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003749
3750 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003751 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003752 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003753
3754 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003755 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003756 conn, addr = self.serv.accept()
3757 conn.setblocking(0)
3758 try:
3759 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003760 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003761 pass
3762 else:
3763 self.fail("Error trying to do non-blocking recv.")
3764 read, write, err = select.select([conn], [], [])
3765 if conn in read:
3766 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003767 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003768 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003769 else:
3770 self.fail("Error during select call to non-blocking socket.")
3771
3772 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003773 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003774 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003775 self.cli.send(MSG)
3776
Victor Stinner45df8202010-04-28 22:31:17 +00003777@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003778class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003779 """Unit tests for the object returned by socket.makefile()
3780
Antoine Pitrou834bd812010-10-13 16:17:14 +00003781 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003782 the client connection. You can read from this file to
3783 get output from the server.
3784
Antoine Pitrou834bd812010-10-13 16:17:14 +00003785 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003786 server connection. You can write to this file to send output
3787 to the client.
3788 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003789
Guido van Rossume9f66142002-08-07 15:46:19 +00003790 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003791 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003792 errors = 'strict'
3793 newline = None
3794
3795 read_mode = 'rb'
3796 read_msg = MSG
3797 write_mode = 'wb'
3798 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003799
Guido van Rossum24e4af82002-06-12 19:18:08 +00003800 def __init__(self, methodName='runTest'):
3801 SocketConnectedTest.__init__(self, methodName=methodName)
3802
3803 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003804 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3805 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003806 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003807 self.read_file = self.cli_conn.makefile(
3808 self.read_mode, self.bufsize,
3809 encoding = self.encoding,
3810 errors = self.errors,
3811 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003812
3813 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003814 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003815 self.read_file.close()
3816 self.assertTrue(self.read_file.closed)
3817 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003818 SocketConnectedTest.tearDown(self)
3819
3820 def clientSetUp(self):
3821 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003822 self.write_file = self.serv_conn.makefile(
3823 self.write_mode, self.bufsize,
3824 encoding = self.encoding,
3825 errors = self.errors,
3826 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003827
3828 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003829 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003830 self.write_file.close()
3831 self.assertTrue(self.write_file.closed)
3832 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003833 SocketConnectedTest.clientTearDown(self)
3834
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003835 def testReadAfterTimeout(self):
3836 # Issue #7322: A file object must disallow further reads
3837 # after a timeout has occurred.
3838 self.cli_conn.settimeout(1)
3839 self.read_file.read(3)
3840 # First read raises a timeout
3841 self.assertRaises(socket.timeout, self.read_file.read, 1)
3842 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003843 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003844 self.read_file.read(1)
3845 self.assertIn("cannot read from timed out object", str(ctx.exception))
3846
3847 def _testReadAfterTimeout(self):
3848 self.write_file.write(self.write_msg[0:3])
3849 self.write_file.flush()
3850 self.serv_finished.wait()
3851
Guido van Rossum24e4af82002-06-12 19:18:08 +00003852 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003853 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003854 first_seg = self.read_file.read(len(self.read_msg)-3)
3855 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003856 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003857 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003858
3859 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003860 self.write_file.write(self.write_msg)
3861 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003862
Guido van Rossum8c943832002-08-08 01:00:28 +00003863 def testFullRead(self):
3864 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003865 msg = self.read_file.read()
3866 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003867
3868 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003869 self.write_file.write(self.write_msg)
3870 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003871
Guido van Rossum24e4af82002-06-12 19:18:08 +00003872 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003873 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003874 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003875 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003876 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003877 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003878 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003879 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003880 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003881
3882 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003883 self.write_file.write(self.write_msg)
3884 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003885
3886 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003887 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003888 line = self.read_file.readline()
3889 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003890
3891 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003892 self.write_file.write(self.write_msg)
3893 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003894
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003895 def testCloseAfterMakefile(self):
3896 # The file returned by makefile should keep the socket open.
3897 self.cli_conn.close()
3898 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003899 msg = self.read_file.read()
3900 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003901
3902 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003903 self.write_file.write(self.write_msg)
3904 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003905
3906 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003907 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003908 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003909 if isinstance(self.read_msg, str):
3910 msg = msg.decode()
3911 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003912
3913 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003914 self.write_file.write(self.write_msg)
3915 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003916
Tim Peters116d83c2004-03-28 02:20:45 +00003917 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003918 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003919
3920 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003921 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003922
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003923 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003924 self.assertEqual(self.read_file.mode, self.read_mode)
3925 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003926
3927 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003928 self.assertEqual(self.write_file.mode, self.write_mode)
3929 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003930
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003931 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003932 self.read_file.close()
3933 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003934 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003935 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003936
3937 def _testRealClose(self):
3938 pass
3939
3940
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003941class FileObjectInterruptedTestCase(unittest.TestCase):
3942 """Test that the file object correctly handles EINTR internally."""
3943
3944 class MockSocket(object):
3945 def __init__(self, recv_funcs=()):
3946 # A generator that returns callables that we'll call for each
3947 # call to recv().
3948 self._recv_step = iter(recv_funcs)
3949
3950 def recv_into(self, buffer):
3951 data = next(self._recv_step)()
3952 assert len(buffer) >= len(data)
3953 buffer[:len(data)] = data
3954 return len(data)
3955
3956 def _decref_socketios(self):
3957 pass
3958
3959 def _textiowrap_for_test(self, buffering=-1):
3960 raw = socket.SocketIO(self, "r")
3961 if buffering < 0:
3962 buffering = io.DEFAULT_BUFFER_SIZE
3963 if buffering == 0:
3964 return raw
3965 buffer = io.BufferedReader(raw, buffering)
3966 text = io.TextIOWrapper(buffer, None, None)
3967 text.mode = "rb"
3968 return text
3969
3970 @staticmethod
3971 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02003972 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003973
3974 def _textiowrap_mock_socket(self, mock, buffering=-1):
3975 raw = socket.SocketIO(mock, "r")
3976 if buffering < 0:
3977 buffering = io.DEFAULT_BUFFER_SIZE
3978 if buffering == 0:
3979 return raw
3980 buffer = io.BufferedReader(raw, buffering)
3981 text = io.TextIOWrapper(buffer, None, None)
3982 text.mode = "rb"
3983 return text
3984
3985 def _test_readline(self, size=-1, buffering=-1):
3986 mock_sock = self.MockSocket(recv_funcs=[
3987 lambda : b"This is the first line\nAnd the sec",
3988 self._raise_eintr,
3989 lambda : b"ond line is here\n",
3990 lambda : b"",
3991 lambda : b"", # XXX(gps): io library does an extra EOF read
3992 ])
3993 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003994 self.assertEqual(fo.readline(size), "This is the first line\n")
3995 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003996
3997 def _test_read(self, size=-1, buffering=-1):
3998 mock_sock = self.MockSocket(recv_funcs=[
3999 lambda : b"This is the first line\nAnd the sec",
4000 self._raise_eintr,
4001 lambda : b"ond line is here\n",
4002 lambda : b"",
4003 lambda : b"", # XXX(gps): io library does an extra EOF read
4004 ])
4005 expecting = (b"This is the first line\n"
4006 b"And the second line is here\n")
4007 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4008 if buffering == 0:
4009 data = b''
4010 else:
4011 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004012 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004013 while len(data) != len(expecting):
4014 part = fo.read(size)
4015 if not part:
4016 break
4017 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004018 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004019
4020 def test_default(self):
4021 self._test_readline()
4022 self._test_readline(size=100)
4023 self._test_read()
4024 self._test_read(size=100)
4025
4026 def test_with_1k_buffer(self):
4027 self._test_readline(buffering=1024)
4028 self._test_readline(size=100, buffering=1024)
4029 self._test_read(buffering=1024)
4030 self._test_read(size=100, buffering=1024)
4031
4032 def _test_readline_no_buffer(self, size=-1):
4033 mock_sock = self.MockSocket(recv_funcs=[
4034 lambda : b"a",
4035 lambda : b"\n",
4036 lambda : b"B",
4037 self._raise_eintr,
4038 lambda : b"b",
4039 lambda : b"",
4040 ])
4041 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004042 self.assertEqual(fo.readline(size), b"a\n")
4043 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004044
4045 def test_no_buffer(self):
4046 self._test_readline_no_buffer()
4047 self._test_readline_no_buffer(size=4)
4048 self._test_read(buffering=0)
4049 self._test_read(size=100, buffering=0)
4050
4051
Guido van Rossume9f66142002-08-07 15:46:19 +00004052class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4053
4054 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004055
Guido van Rossume9f66142002-08-07 15:46:19 +00004056 In this case (and in this case only), it should be possible to
4057 create a file object, read a line from it, create another file
4058 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004059 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004060 when reading multiple requests from the same socket."""
4061
4062 bufsize = 0 # Use unbuffered mode
4063
4064 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004065 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004066 line = self.read_file.readline() # first line
4067 self.assertEqual(line, b"A. " + self.write_msg) # first line
4068 self.read_file = self.cli_conn.makefile('rb', 0)
4069 line = self.read_file.readline() # second line
4070 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004071
4072 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004073 self.write_file.write(b"A. " + self.write_msg)
4074 self.write_file.write(b"B. " + self.write_msg)
4075 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004076
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004077 def testMakefileClose(self):
4078 # The file returned by makefile should keep the socket open...
4079 self.cli_conn.close()
4080 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004081 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004082 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004083 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004084 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004085
4086 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004087 self.write_file.write(self.write_msg)
4088 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004089
4090 def testMakefileCloseSocketDestroy(self):
4091 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004092 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004093 refcount_after = sys.getrefcount(self.cli_conn)
4094 self.assertEqual(refcount_before - 1, refcount_after)
4095
4096 def _testMakefileCloseSocketDestroy(self):
4097 pass
4098
Antoine Pitrou98b46702010-09-18 22:59:00 +00004099 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004100 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004101 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4102
4103 def testSmallReadNonBlocking(self):
4104 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004105 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4106 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004107 self.evt1.set()
4108 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004109 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004110 if first_seg is None:
4111 # Data not arrived (can happen under Windows), wait a bit
4112 time.sleep(0.5)
4113 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004114 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004115 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004116 self.assertEqual(n, 3)
4117 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004118 self.assertEqual(msg, self.read_msg)
4119 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4120 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004121
4122 def _testSmallReadNonBlocking(self):
4123 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004124 self.write_file.write(self.write_msg)
4125 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004126 self.evt2.set()
4127 # Avoid cloding the socket before the server test has finished,
4128 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4129 self.serv_finished.wait(5.0)
4130
4131 def testWriteNonBlocking(self):
4132 self.cli_finished.wait(5.0)
4133 # The client thread can't skip directly - the SkipTest exception
4134 # would appear as a failure.
4135 if self.serv_skipped:
4136 self.skipTest(self.serv_skipped)
4137
4138 def _testWriteNonBlocking(self):
4139 self.serv_skipped = None
4140 self.serv_conn.setblocking(False)
4141 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004142 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004143 LIMIT = 10
4144 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004145 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004146 self.assertGreater(n, 0)
4147 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004148 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004149 if n is None:
4150 # Succeeded
4151 break
4152 self.assertGreater(n, 0)
4153 else:
4154 # Let us know that this test didn't manage to establish
4155 # the expected conditions. This is not a failure in itself but,
4156 # if it happens repeatedly, the test should be fixed.
4157 self.serv_skipped = "failed to saturate the socket buffer"
4158
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004159
Guido van Rossum8c943832002-08-08 01:00:28 +00004160class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4161
4162 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4163
4164
4165class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4166
4167 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004168
Thomas Woutersb2137042007-02-01 18:02:27 +00004169
Antoine Pitrou834bd812010-10-13 16:17:14 +00004170class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4171 """Tests for socket.makefile() in text mode (rather than binary)"""
4172
4173 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004174 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004175 write_mode = 'wb'
4176 write_msg = MSG
4177 newline = ''
4178
4179
4180class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4181 """Tests for socket.makefile() in text mode (rather than binary)"""
4182
4183 read_mode = 'rb'
4184 read_msg = MSG
4185 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004186 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004187 newline = ''
4188
4189
4190class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4191 """Tests for socket.makefile() in text mode (rather than binary)"""
4192
4193 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004194 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004195 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004196 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004197 newline = ''
4198
4199
Guido van Rossumd8faa362007-04-27 19:54:29 +00004200class NetworkConnectionTest(object):
4201 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004202
Guido van Rossumd8faa362007-04-27 19:54:29 +00004203 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004204 # We're inherited below by BasicTCPTest2, which also inherits
4205 # BasicTCPTest, which defines self.port referenced below.
4206 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004207 self.serv_conn = self.cli
4208
4209class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4210 """Tests that NetworkConnection does not break existing TCP functionality.
4211 """
4212
4213class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004214
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004215 class MockSocket(socket.socket):
4216 def connect(self, *args):
4217 raise socket.timeout('timed out')
4218
4219 @contextlib.contextmanager
4220 def mocked_socket_module(self):
4221 """Return a socket which times out on connect"""
4222 old_socket = socket.socket
4223 socket.socket = self.MockSocket
4224 try:
4225 yield
4226 finally:
4227 socket.socket = old_socket
4228
4229 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004230 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004231 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004232 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004233 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004234 cli.connect((HOST, port))
4235 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4236
4237 def test_create_connection(self):
4238 # Issue #9792: errors raised by create_connection() should have
4239 # a proper errno attribute.
4240 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004241 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004242 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004243
4244 # Issue #16257: create_connection() calls getaddrinfo() against
4245 # 'localhost'. This may result in an IPV6 addr being returned
4246 # as well as an IPV4 one:
4247 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4248 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4249 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4250 #
4251 # create_connection() enumerates through all the addresses returned
4252 # and if it doesn't successfully bind to any of them, it propagates
4253 # the last exception it encountered.
4254 #
4255 # On Solaris, ENETUNREACH is returned in this circumstance instead
4256 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4257 # expected errnos.
4258 expected_errnos = [ errno.ECONNREFUSED, ]
4259 if hasattr(errno, 'ENETUNREACH'):
4260 expected_errnos.append(errno.ENETUNREACH)
4261
4262 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004263
4264 def test_create_connection_timeout(self):
4265 # Issue #9792: create_connection() should not recast timeout errors
4266 # as generic socket errors.
4267 with self.mocked_socket_module():
4268 with self.assertRaises(socket.timeout):
4269 socket.create_connection((HOST, 1234))
4270
Guido van Rossumd8faa362007-04-27 19:54:29 +00004271
Victor Stinner45df8202010-04-28 22:31:17 +00004272@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004273class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4274
4275 def __init__(self, methodName='runTest'):
4276 SocketTCPTest.__init__(self, methodName=methodName)
4277 ThreadableTest.__init__(self)
4278
4279 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004280 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004281
4282 def clientTearDown(self):
4283 self.cli.close()
4284 self.cli = None
4285 ThreadableTest.clientTearDown(self)
4286
4287 def _justAccept(self):
4288 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004289 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004290
4291 testFamily = _justAccept
4292 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004293 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004294 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004295 self.assertEqual(self.cli.family, 2)
4296
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004297 testSourceAddress = _justAccept
4298 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004299 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4300 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004301 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004302 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004303 # The port number being used is sufficient to show that the bind()
4304 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004305
Guido van Rossumd8faa362007-04-27 19:54:29 +00004306 testTimeoutDefault = _justAccept
4307 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004308 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004309 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004310 socket.setdefaulttimeout(42)
4311 try:
4312 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004313 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004314 finally:
4315 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004316 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004317
4318 testTimeoutNone = _justAccept
4319 def _testTimeoutNone(self):
4320 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004321 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004322 socket.setdefaulttimeout(30)
4323 try:
4324 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004325 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004326 finally:
4327 socket.setdefaulttimeout(None)
4328 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004329
4330 testTimeoutValueNamed = _justAccept
4331 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004332 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004333 self.assertEqual(self.cli.gettimeout(), 30)
4334
4335 testTimeoutValueNonamed = _justAccept
4336 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004337 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004338 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004339 self.assertEqual(self.cli.gettimeout(), 30)
4340
Victor Stinner45df8202010-04-28 22:31:17 +00004341@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004342class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4343
4344 def __init__(self, methodName='runTest'):
4345 SocketTCPTest.__init__(self, methodName=methodName)
4346 ThreadableTest.__init__(self)
4347
4348 def clientSetUp(self):
4349 pass
4350
4351 def clientTearDown(self):
4352 self.cli.close()
4353 self.cli = None
4354 ThreadableTest.clientTearDown(self)
4355
4356 def testInsideTimeout(self):
4357 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004358 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004359 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004360 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004361 testOutsideTimeout = testInsideTimeout
4362
4363 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004364 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004365 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004366 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004367
4368 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004369 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004370 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004371
4372
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004373class TCPTimeoutTest(SocketTCPTest):
4374
4375 def testTCPTimeout(self):
4376 def raise_timeout(*args, **kwargs):
4377 self.serv.settimeout(1.0)
4378 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004379 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004380 "Error generating a timeout exception (TCP)")
4381
4382 def testTimeoutZero(self):
4383 ok = False
4384 try:
4385 self.serv.settimeout(0.0)
4386 foo = self.serv.accept()
4387 except socket.timeout:
4388 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004389 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004390 ok = True
4391 except:
4392 self.fail("caught unexpected exception (TCP)")
4393 if not ok:
4394 self.fail("accept() returned success when we did not expect it")
4395
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004396 def testInterruptedTimeout(self):
4397 # XXX I don't know how to do this test on MSWindows or any other
4398 # plaform that doesn't support signal.alarm() or os.kill(), though
4399 # the bug should have existed on all platforms.
4400 if not hasattr(signal, "alarm"):
4401 return # can only test on *nix
4402 self.serv.settimeout(5.0) # must be longer than alarm
4403 class Alarm(Exception):
4404 pass
4405 def alarm_handler(signal, frame):
4406 raise Alarm
4407 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4408 try:
4409 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4410 try:
4411 foo = self.serv.accept()
4412 except socket.timeout:
4413 self.fail("caught timeout instead of Alarm")
4414 except Alarm:
4415 pass
4416 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004417 self.fail("caught other exception instead of Alarm:"
4418 " %s(%s):\n%s" %
4419 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004420 else:
4421 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004422 finally:
4423 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004424 except Alarm:
4425 self.fail("got Alarm in wrong place")
4426 finally:
4427 # no alarm can be pending. Safe to restore old handler.
4428 signal.signal(signal.SIGALRM, old_alarm)
4429
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004430class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004431
4432 def testUDPTimeout(self):
4433 def raise_timeout(*args, **kwargs):
4434 self.serv.settimeout(1.0)
4435 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004436 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004437 "Error generating a timeout exception (UDP)")
4438
4439 def testTimeoutZero(self):
4440 ok = False
4441 try:
4442 self.serv.settimeout(0.0)
4443 foo = self.serv.recv(1024)
4444 except socket.timeout:
4445 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004446 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004447 ok = True
4448 except:
4449 self.fail("caught unexpected exception (UDP)")
4450 if not ok:
4451 self.fail("recv() returned success when we did not expect it")
4452
4453class TestExceptions(unittest.TestCase):
4454
4455 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004456 self.assertTrue(issubclass(OSError, Exception))
4457 self.assertTrue(issubclass(socket.herror, OSError))
4458 self.assertTrue(issubclass(socket.gaierror, OSError))
4459 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004460
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004461class TestLinuxAbstractNamespace(unittest.TestCase):
4462
4463 UNIX_PATH_MAX = 108
4464
4465 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004466 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004467 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4468 s1.bind(address)
4469 s1.listen(1)
4470 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4471 s2.connect(s1.getsockname())
4472 with s1.accept()[0] as s3:
4473 self.assertEqual(s1.getsockname(), address)
4474 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004475
4476 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004477 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004478 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4479 s.bind(address)
4480 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004481
4482 def testNameOverflow(self):
4483 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004484 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004485 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004486
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004487 def testStrName(self):
4488 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004489 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4490 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004491 s.bind("\x00python\x00test\x00")
4492 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004493 finally:
4494 s.close()
4495
4496class TestUnixDomain(unittest.TestCase):
4497
4498 def setUp(self):
4499 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4500
4501 def tearDown(self):
4502 self.sock.close()
4503
4504 def encoded(self, path):
4505 # Return the given path encoded in the file system encoding,
4506 # or skip the test if this is not possible.
4507 try:
4508 return os.fsencode(path)
4509 except UnicodeEncodeError:
4510 self.skipTest(
4511 "Pathname {0!a} cannot be represented in file "
4512 "system encoding {1!r}".format(
4513 path, sys.getfilesystemencoding()))
4514
Antoine Pitrou16374872011-12-16 15:04:12 +01004515 def bind(self, sock, path):
4516 # Bind the socket
4517 try:
4518 sock.bind(path)
4519 except OSError as e:
4520 if str(e) == "AF_UNIX path too long":
4521 self.skipTest(
4522 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4523 .format(path))
4524 else:
4525 raise
4526
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004527 def testStrAddr(self):
4528 # Test binding to and retrieving a normal string pathname.
4529 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004530 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004531 self.addCleanup(support.unlink, path)
4532 self.assertEqual(self.sock.getsockname(), path)
4533
4534 def testBytesAddr(self):
4535 # Test binding to a bytes pathname.
4536 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004537 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004538 self.addCleanup(support.unlink, path)
4539 self.assertEqual(self.sock.getsockname(), path)
4540
4541 def testSurrogateescapeBind(self):
4542 # Test binding to a valid non-ASCII pathname, with the
4543 # non-ASCII bytes supplied using surrogateescape encoding.
4544 path = os.path.abspath(support.TESTFN_UNICODE)
4545 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004546 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004547 self.addCleanup(support.unlink, path)
4548 self.assertEqual(self.sock.getsockname(), path)
4549
4550 def testUnencodableAddr(self):
4551 # Test binding to a pathname that cannot be encoded in the
4552 # file system encoding.
4553 if support.TESTFN_UNENCODABLE is None:
4554 self.skipTest("No unencodable filename available")
4555 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004556 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004557 self.addCleanup(support.unlink, path)
4558 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004559
Victor Stinner45df8202010-04-28 22:31:17 +00004560@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004561class BufferIOTest(SocketConnectedTest):
4562 """
4563 Test the buffer versions of socket.recv() and socket.send().
4564 """
4565 def __init__(self, methodName='runTest'):
4566 SocketConnectedTest.__init__(self, methodName=methodName)
4567
Antoine Pitrou25480782010-03-17 22:50:28 +00004568 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004569 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004570 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004571 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004572 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004573 self.assertEqual(msg, MSG)
4574
Antoine Pitrou25480782010-03-17 22:50:28 +00004575 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004576 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004577 self.serv_conn.send(buf)
4578
Antoine Pitrou25480782010-03-17 22:50:28 +00004579 def testRecvIntoBytearray(self):
4580 buf = bytearray(1024)
4581 nbytes = self.cli_conn.recv_into(buf)
4582 self.assertEqual(nbytes, len(MSG))
4583 msg = buf[:len(MSG)]
4584 self.assertEqual(msg, MSG)
4585
4586 _testRecvIntoBytearray = _testRecvIntoArray
4587
4588 def testRecvIntoMemoryview(self):
4589 buf = bytearray(1024)
4590 nbytes = self.cli_conn.recv_into(memoryview(buf))
4591 self.assertEqual(nbytes, len(MSG))
4592 msg = buf[:len(MSG)]
4593 self.assertEqual(msg, MSG)
4594
4595 _testRecvIntoMemoryview = _testRecvIntoArray
4596
4597 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004598 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004599 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004600 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004601 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004602 self.assertEqual(msg, MSG)
4603
Antoine Pitrou25480782010-03-17 22:50:28 +00004604 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004605 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004606 self.serv_conn.send(buf)
4607
Antoine Pitrou25480782010-03-17 22:50:28 +00004608 def testRecvFromIntoBytearray(self):
4609 buf = bytearray(1024)
4610 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4611 self.assertEqual(nbytes, len(MSG))
4612 msg = buf[:len(MSG)]
4613 self.assertEqual(msg, MSG)
4614
4615 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4616
4617 def testRecvFromIntoMemoryview(self):
4618 buf = bytearray(1024)
4619 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4620 self.assertEqual(nbytes, len(MSG))
4621 msg = buf[:len(MSG)]
4622 self.assertEqual(msg, MSG)
4623
4624 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4625
Christian Heimes043d6f62008-01-07 17:19:16 +00004626
4627TIPC_STYPE = 2000
4628TIPC_LOWER = 200
4629TIPC_UPPER = 210
4630
4631def isTipcAvailable():
4632 """Check if the TIPC module is loaded
4633
4634 The TIPC module is not loaded automatically on Ubuntu and probably
4635 other Linux distros.
4636 """
4637 if not hasattr(socket, "AF_TIPC"):
4638 return False
4639 if not os.path.isfile("/proc/modules"):
4640 return False
4641 with open("/proc/modules") as f:
4642 for line in f:
4643 if line.startswith("tipc "):
4644 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004645 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004646 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4647 return False
4648
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004649class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004650 def testRDM(self):
4651 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4652 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004653 self.addCleanup(srv.close)
4654 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004655
4656 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4657 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4658 TIPC_LOWER, TIPC_UPPER)
4659 srv.bind(srvaddr)
4660
4661 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4662 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4663 cli.sendto(MSG, sendaddr)
4664
4665 msg, recvaddr = srv.recvfrom(1024)
4666
4667 self.assertEqual(cli.getsockname(), recvaddr)
4668 self.assertEqual(msg, MSG)
4669
4670
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004671class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004672 def __init__(self, methodName = 'runTest'):
4673 unittest.TestCase.__init__(self, methodName = methodName)
4674 ThreadableTest.__init__(self)
4675
4676 def setUp(self):
4677 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004678 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004679 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4680 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4681 TIPC_LOWER, TIPC_UPPER)
4682 self.srv.bind(srvaddr)
4683 self.srv.listen(5)
4684 self.serverExplicitReady()
4685 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004686 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004687
4688 def clientSetUp(self):
4689 # The is a hittable race between serverExplicitReady() and the
4690 # accept() call; sleep a little while to avoid it, otherwise
4691 # we could get an exception
4692 time.sleep(0.1)
4693 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004694 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004695 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4696 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4697 self.cli.connect(addr)
4698 self.cliaddr = self.cli.getsockname()
4699
4700 def testStream(self):
4701 msg = self.conn.recv(1024)
4702 self.assertEqual(msg, MSG)
4703 self.assertEqual(self.cliaddr, self.connaddr)
4704
4705 def _testStream(self):
4706 self.cli.send(MSG)
4707 self.cli.close()
4708
4709
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004710@unittest.skipUnless(thread, 'Threading required for this test.')
4711class ContextManagersTest(ThreadedTCPSocketTest):
4712
4713 def _testSocketClass(self):
4714 # base test
4715 with socket.socket() as sock:
4716 self.assertFalse(sock._closed)
4717 self.assertTrue(sock._closed)
4718 # close inside with block
4719 with socket.socket() as sock:
4720 sock.close()
4721 self.assertTrue(sock._closed)
4722 # exception inside with block
4723 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004724 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004725 self.assertTrue(sock._closed)
4726
4727 def testCreateConnectionBase(self):
4728 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004729 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004730 data = conn.recv(1024)
4731 conn.sendall(data)
4732
4733 def _testCreateConnectionBase(self):
4734 address = self.serv.getsockname()
4735 with socket.create_connection(address) as sock:
4736 self.assertFalse(sock._closed)
4737 sock.sendall(b'foo')
4738 self.assertEqual(sock.recv(1024), b'foo')
4739 self.assertTrue(sock._closed)
4740
4741 def testCreateConnectionClose(self):
4742 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004743 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004744 data = conn.recv(1024)
4745 conn.sendall(data)
4746
4747 def _testCreateConnectionClose(self):
4748 address = self.serv.getsockname()
4749 with socket.create_connection(address) as sock:
4750 sock.close()
4751 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004752 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004753
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004754
Victor Stinnerdaf45552013-08-28 00:53:59 +02004755class InheritanceTest(unittest.TestCase):
4756 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4757 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004758 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004759 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004760 with socket.socket(socket.AF_INET,
4761 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4762 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004763 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004764
4765 def test_default_inheritable(self):
4766 sock = socket.socket()
4767 with sock:
4768 self.assertEqual(sock.get_inheritable(), False)
4769
4770 def test_dup(self):
4771 sock = socket.socket()
4772 with sock:
4773 newsock = sock.dup()
4774 sock.close()
4775 with newsock:
4776 self.assertEqual(newsock.get_inheritable(), False)
4777
4778 def test_set_inheritable(self):
4779 sock = socket.socket()
4780 with sock:
4781 sock.set_inheritable(True)
4782 self.assertEqual(sock.get_inheritable(), True)
4783
4784 sock.set_inheritable(False)
4785 self.assertEqual(sock.get_inheritable(), False)
4786
4787 @unittest.skipUnless(hasattr(socket, "socketpair"),
4788 "need socket.socketpair()")
4789 def test_socketpair(self):
4790 s1, s2 = socket.socketpair()
4791 self.addCleanup(s1.close)
4792 self.addCleanup(s2.close)
4793 self.assertEqual(s1.get_inheritable(), False)
4794 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004795
4796
4797@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4798 "SOCK_NONBLOCK not defined")
4799class NonblockConstantTest(unittest.TestCase):
4800 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4801 if nonblock:
4802 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4803 self.assertEqual(s.gettimeout(), timeout)
4804 else:
4805 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4806 self.assertEqual(s.gettimeout(), None)
4807
Charles-François Natali239bb962011-06-03 12:55:15 +02004808 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004809 def test_SOCK_NONBLOCK(self):
4810 # a lot of it seems silly and redundant, but I wanted to test that
4811 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004812 with socket.socket(socket.AF_INET,
4813 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4814 self.checkNonblock(s)
4815 s.setblocking(1)
4816 self.checkNonblock(s, False)
4817 s.setblocking(0)
4818 self.checkNonblock(s)
4819 s.settimeout(None)
4820 self.checkNonblock(s, False)
4821 s.settimeout(2.0)
4822 self.checkNonblock(s, timeout=2.0)
4823 s.setblocking(1)
4824 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004825 # defaulttimeout
4826 t = socket.getdefaulttimeout()
4827 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004828 with socket.socket() as s:
4829 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004830 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004831 with socket.socket() as s:
4832 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004833 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004834 with socket.socket() as s:
4835 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004836 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004837 with socket.socket() as s:
4838 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004839 socket.setdefaulttimeout(t)
4840
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004841
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004842@unittest.skipUnless(os.name == "nt", "Windows specific")
4843@unittest.skipUnless(multiprocessing, "need multiprocessing")
4844class TestSocketSharing(SocketTCPTest):
4845 # This must be classmethod and not staticmethod or multiprocessing
4846 # won't be able to bootstrap it.
4847 @classmethod
4848 def remoteProcessServer(cls, q):
4849 # Recreate socket from shared data
4850 sdata = q.get()
4851 message = q.get()
4852
4853 s = socket.fromshare(sdata)
4854 s2, c = s.accept()
4855
4856 # Send the message
4857 s2.sendall(message)
4858 s2.close()
4859 s.close()
4860
4861 def testShare(self):
4862 # Transfer the listening server socket to another process
4863 # and service it from there.
4864
4865 # Create process:
4866 q = multiprocessing.Queue()
4867 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4868 p.start()
4869
4870 # Get the shared socket data
4871 data = self.serv.share(p.pid)
4872
4873 # Pass the shared socket to the other process
4874 addr = self.serv.getsockname()
4875 self.serv.close()
4876 q.put(data)
4877
4878 # The data that the server will send us
4879 message = b"slapmahfro"
4880 q.put(message)
4881
4882 # Connect
4883 s = socket.create_connection(addr)
4884 # listen for the data
4885 m = []
4886 while True:
4887 data = s.recv(100)
4888 if not data:
4889 break
4890 m.append(data)
4891 s.close()
4892 received = b"".join(m)
4893 self.assertEqual(received, message)
4894 p.join()
4895
4896 def testShareLength(self):
4897 data = self.serv.share(os.getpid())
4898 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4899 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4900
4901 def compareSockets(self, org, other):
4902 # socket sharing is expected to work only for blocking socket
4903 # since the internal python timout value isn't transfered.
4904 self.assertEqual(org.gettimeout(), None)
4905 self.assertEqual(org.gettimeout(), other.gettimeout())
4906
4907 self.assertEqual(org.family, other.family)
4908 self.assertEqual(org.type, other.type)
4909 # If the user specified "0" for proto, then
4910 # internally windows will have picked the correct value.
4911 # Python introspection on the socket however will still return
4912 # 0. For the shared socket, the python value is recreated
4913 # from the actual value, so it may not compare correctly.
4914 if org.proto != 0:
4915 self.assertEqual(org.proto, other.proto)
4916
4917 def testShareLocal(self):
4918 data = self.serv.share(os.getpid())
4919 s = socket.fromshare(data)
4920 try:
4921 self.compareSockets(self.serv, s)
4922 finally:
4923 s.close()
4924
4925 def testTypes(self):
4926 families = [socket.AF_INET, socket.AF_INET6]
4927 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4928 for f in families:
4929 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00004930 try:
4931 source = socket.socket(f, t)
4932 except OSError:
4933 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004934 try:
4935 data = source.share(os.getpid())
4936 shared = socket.fromshare(data)
4937 try:
4938 self.compareSockets(source, shared)
4939 finally:
4940 shared.close()
4941 finally:
4942 source.close()
4943
4944
Guido van Rossumb995eb72002-07-31 16:08:40 +00004945def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004946 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004947 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004948
4949 tests.extend([
4950 NonBlockingTCPTests,
4951 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004952 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004953 UnbufferedFileObjectClassTestCase,
4954 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004955 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004956 UnicodeReadFileObjectClassTestCase,
4957 UnicodeWriteFileObjectClassTestCase,
4958 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004959 NetworkConnectionNoServer,
4960 NetworkConnectionAttributesTest,
4961 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004962 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004963 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004964 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004965 ])
Dave Cole331708b2004-08-09 04:51:41 +00004966 if hasattr(socket, "socketpair"):
4967 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004968 if hasattr(socket, "AF_UNIX"):
4969 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004970 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004971 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004972 if isTipcAvailable():
4973 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004974 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004975 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004976 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004977 tests.extend([
4978 CmsgMacroTests,
4979 SendmsgUDPTest,
4980 RecvmsgUDPTest,
4981 RecvmsgIntoUDPTest,
4982 SendmsgUDP6Test,
4983 RecvmsgUDP6Test,
4984 RecvmsgRFC3542AncillaryUDP6Test,
4985 RecvmsgIntoRFC3542AncillaryUDP6Test,
4986 RecvmsgIntoUDP6Test,
4987 SendmsgTCPTest,
4988 RecvmsgTCPTest,
4989 RecvmsgIntoTCPTest,
4990 SendmsgSCTPStreamTest,
4991 RecvmsgSCTPStreamTest,
4992 RecvmsgIntoSCTPStreamTest,
4993 SendmsgUnixStreamTest,
4994 RecvmsgUnixStreamTest,
4995 RecvmsgIntoUnixStreamTest,
4996 RecvmsgSCMRightsStreamTest,
4997 RecvmsgIntoSCMRightsStreamTest,
4998 # These are slow when setitimer() is not available
4999 InterruptedRecvTimeoutTest,
5000 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005001 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005002 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005003
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005004 thread_info = support.threading_setup()
5005 support.run_unittest(*tests)
5006 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005007
5008if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005009 test_main()