blob: e995c99df1fe6a0608d9cfe7e9e377a27c038060 [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
Victor Stinnera3c18d02013-09-08 11:53:09 +020029try:
30 import fcntl
31except ImportError:
32 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000033
Benjamin Petersonee8712c2008-05-20 21:35:26 +000034HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000035MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000036
Victor Stinner45df8202010-04-28 22:31:17 +000037try:
38 import _thread as thread
39 import threading
40except ImportError:
41 thread = None
42 threading = None
43
Charles-François Natali47413c12011-10-06 19:47:44 +020044def _have_socket_can():
45 """Check whether CAN sockets are supported on this host."""
46 try:
47 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020048 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020049 return False
50 else:
51 s.close()
52 return True
53
Charles-François Natali10b8cf42011-11-10 19:21:37 +010054def _have_socket_rds():
55 """Check whether RDS sockets are supported on this host."""
56 try:
57 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
58 except (AttributeError, OSError):
59 return False
60 else:
61 s.close()
62 return True
63
Charles-François Natali47413c12011-10-06 19:47:44 +020064HAVE_SOCKET_CAN = _have_socket_can()
65
Charles-François Natali10b8cf42011-11-10 19:21:37 +010066HAVE_SOCKET_RDS = _have_socket_rds()
67
Nick Coghlan96fe56a2011-08-22 11:55:57 +100068# Size in bytes of the int type
69SIZEOF_INT = array.array("i").itemsize
70
Guido van Rossum24e4af82002-06-12 19:18:08 +000071class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000072
Guido van Rossum24e4af82002-06-12 19:18:08 +000073 def setUp(self):
74 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000075 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000076 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000077
Guido van Rossum24e4af82002-06-12 19:18:08 +000078 def tearDown(self):
79 self.serv.close()
80 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000081
Guido van Rossum24e4af82002-06-12 19:18:08 +000082class SocketUDPTest(unittest.TestCase):
83
84 def setUp(self):
85 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000086 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000087
88 def tearDown(self):
89 self.serv.close()
90 self.serv = None
91
Nick Coghlan96fe56a2011-08-22 11:55:57 +100092class ThreadSafeCleanupTestCase(unittest.TestCase):
93 """Subclass of unittest.TestCase with thread-safe cleanup methods.
94
95 This subclass protects the addCleanup() and doCleanups() methods
96 with a recursive lock.
97 """
98
99 if threading:
100 def __init__(self, *args, **kwargs):
101 super().__init__(*args, **kwargs)
102 self._cleanup_lock = threading.RLock()
103
104 def addCleanup(self, *args, **kwargs):
105 with self._cleanup_lock:
106 return super().addCleanup(*args, **kwargs)
107
108 def doCleanups(self, *args, **kwargs):
109 with self._cleanup_lock:
110 return super().doCleanups(*args, **kwargs)
111
Charles-François Natali47413c12011-10-06 19:47:44 +0200112class SocketCANTest(unittest.TestCase):
113
114 """To be able to run this test, a `vcan0` CAN interface can be created with
115 the following commands:
116 # modprobe vcan
117 # ip link add dev vcan0 type vcan
118 # ifconfig vcan0 up
119 """
120 interface = 'vcan0'
121 bufsize = 128
122
Charles-François Natali773e42d2013-02-05 19:42:01 +0100123 """The CAN frame structure is defined in <linux/can.h>:
124
125 struct can_frame {
126 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
127 __u8 can_dlc; /* data length code: 0 .. 8 */
128 __u8 data[8] __attribute__((aligned(8)));
129 };
130 """
131 can_frame_fmt = "=IB3x8s"
132 can_frame_size = struct.calcsize(can_frame_fmt)
133
134 """The Broadcast Management Command frame structure is defined
135 in <linux/can/bcm.h>:
136
137 struct bcm_msg_head {
138 __u32 opcode;
139 __u32 flags;
140 __u32 count;
141 struct timeval ival1, ival2;
142 canid_t can_id;
143 __u32 nframes;
144 struct can_frame frames[0];
145 }
146
147 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
148 `struct can_frame` definition). Must use native not standard types for packing.
149 """
150 bcm_cmd_msg_fmt = "@3I4l2I"
151 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
152
Charles-François Natali47413c12011-10-06 19:47:44 +0200153 def setUp(self):
154 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200155 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200156 try:
157 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200158 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200159 self.skipTest('network interface `%s` does not exist' %
160 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200161
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100162
163class SocketRDSTest(unittest.TestCase):
164
165 """To be able to run this test, the `rds` kernel module must be loaded:
166 # modprobe rds
167 """
168 bufsize = 8192
169
170 def setUp(self):
171 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
172 self.addCleanup(self.serv.close)
173 try:
174 self.port = support.bind_port(self.serv)
175 except OSError:
176 self.skipTest('unable to bind RDS socket')
177
178
Guido van Rossum24e4af82002-06-12 19:18:08 +0000179class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000180 """Threadable Test class
181
182 The ThreadableTest class makes it easy to create a threaded
183 client/server pair from an existing unit test. To create a
184 new threaded class from an existing unit test, use multiple
185 inheritance:
186
187 class NewClass (OldClass, ThreadableTest):
188 pass
189
190 This class defines two new fixture functions with obvious
191 purposes for overriding:
192
193 clientSetUp ()
194 clientTearDown ()
195
196 Any new test functions within the class must then define
197 tests in pairs, where the test name is preceeded with a
198 '_' to indicate the client portion of the test. Ex:
199
200 def testFoo(self):
201 # Server portion
202
203 def _testFoo(self):
204 # Client portion
205
206 Any exceptions raised by the clients during their tests
207 are caught and transferred to the main thread to alert
208 the testing framework.
209
210 Note, the server setup function cannot call any blocking
211 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000212 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000213 the blocking call (such as in setting up a client/server
214 connection and performing the accept() in setUp().
215 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000216
217 def __init__(self):
218 # Swap the true setup function
219 self.__setUp = self.setUp
220 self.__tearDown = self.tearDown
221 self.setUp = self._setUp
222 self.tearDown = self._tearDown
223
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000224 def serverExplicitReady(self):
225 """This method allows the server to explicitly indicate that
226 it wants the client thread to proceed. This is useful if the
227 server is about to execute a blocking routine that is
228 dependent upon the client thread during its setup routine."""
229 self.server_ready.set()
230
Guido van Rossum24e4af82002-06-12 19:18:08 +0000231 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000232 self.server_ready = threading.Event()
233 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000234 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000235 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200236 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000237
238 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000239 methodname = self.id()
240 i = methodname.rfind('.')
241 methodname = methodname[i+1:]
242 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000243 self.client_thread = thread.start_new_thread(
244 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000245
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200246 try:
247 self.__setUp()
248 except:
249 self.server_crashed = True
250 raise
251 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000252 self.server_ready.set()
253 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000254
255 def _tearDown(self):
256 self.__tearDown()
257 self.done.wait()
258
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000259 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000260 exc = self.queue.get()
261 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000262
263 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000264 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000265 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200266 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200267 if self.server_crashed:
268 self.clientTearDown()
269 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000270 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000271 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000272 try:
273 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000274 except BaseException as e:
275 self.queue.put(e)
276 finally:
277 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000278
279 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000280 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000281
282 def clientTearDown(self):
283 self.done.set()
284 thread.exit()
285
286class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
287
288 def __init__(self, methodName='runTest'):
289 SocketTCPTest.__init__(self, methodName=methodName)
290 ThreadableTest.__init__(self)
291
292 def clientSetUp(self):
293 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
294
295 def clientTearDown(self):
296 self.cli.close()
297 self.cli = None
298 ThreadableTest.clientTearDown(self)
299
300class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
301
302 def __init__(self, methodName='runTest'):
303 SocketUDPTest.__init__(self, methodName=methodName)
304 ThreadableTest.__init__(self)
305
306 def clientSetUp(self):
307 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
308
Brian Curtin3beb38f2010-11-04 03:41:43 +0000309 def clientTearDown(self):
310 self.cli.close()
311 self.cli = None
312 ThreadableTest.clientTearDown(self)
313
Charles-François Natali47413c12011-10-06 19:47:44 +0200314class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
315
316 def __init__(self, methodName='runTest'):
317 SocketCANTest.__init__(self, methodName=methodName)
318 ThreadableTest.__init__(self)
319
320 def clientSetUp(self):
321 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
322 try:
323 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200324 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200325 # skipTest should not be called here, and will be called in the
326 # server instead
327 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200328
329 def clientTearDown(self):
330 self.cli.close()
331 self.cli = None
332 ThreadableTest.clientTearDown(self)
333
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100334class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
335
336 def __init__(self, methodName='runTest'):
337 SocketRDSTest.__init__(self, methodName=methodName)
338 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100339
340 def clientSetUp(self):
341 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
342 try:
343 # RDS sockets must be bound explicitly to send or receive data
344 self.cli.bind((HOST, 0))
345 self.cli_addr = self.cli.getsockname()
346 except OSError:
347 # skipTest should not be called here, and will be called in the
348 # server instead
349 pass
350
351 def clientTearDown(self):
352 self.cli.close()
353 self.cli = None
354 ThreadableTest.clientTearDown(self)
355
Guido van Rossum24e4af82002-06-12 19:18:08 +0000356class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000357 """Socket tests for client-server connection.
358
359 self.cli_conn is a client socket connected to the server. The
360 setUp() method guarantees that it is connected to the server.
361 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000362
363 def __init__(self, methodName='runTest'):
364 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
365
366 def setUp(self):
367 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000368 # Indicate explicitly we're ready for the client thread to
369 # proceed and then perform the blocking call to accept
370 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000371 conn, addr = self.serv.accept()
372 self.cli_conn = conn
373
374 def tearDown(self):
375 self.cli_conn.close()
376 self.cli_conn = None
377 ThreadedTCPSocketTest.tearDown(self)
378
379 def clientSetUp(self):
380 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000381 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000382 self.serv_conn = self.cli
383
384 def clientTearDown(self):
385 self.serv_conn.close()
386 self.serv_conn = None
387 ThreadedTCPSocketTest.clientTearDown(self)
388
Dave Cole331708b2004-08-09 04:51:41 +0000389class SocketPairTest(unittest.TestCase, ThreadableTest):
390
391 def __init__(self, methodName='runTest'):
392 unittest.TestCase.__init__(self, methodName=methodName)
393 ThreadableTest.__init__(self)
394
395 def setUp(self):
396 self.serv, self.cli = socket.socketpair()
397
398 def tearDown(self):
399 self.serv.close()
400 self.serv = None
401
402 def clientSetUp(self):
403 pass
404
405 def clientTearDown(self):
406 self.cli.close()
407 self.cli = None
408 ThreadableTest.clientTearDown(self)
409
Tim Peters494aaee2004-08-09 18:54:11 +0000410
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000411# The following classes are used by the sendmsg()/recvmsg() tests.
412# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
413# gives a drop-in replacement for SocketConnectedTest, but different
414# address families can be used, and the attributes serv_addr and
415# cli_addr will be set to the addresses of the endpoints.
416
417class SocketTestBase(unittest.TestCase):
418 """A base class for socket tests.
419
420 Subclasses must provide methods newSocket() to return a new socket
421 and bindSock(sock) to bind it to an unused address.
422
423 Creates a socket self.serv and sets self.serv_addr to its address.
424 """
425
426 def setUp(self):
427 self.serv = self.newSocket()
428 self.bindServer()
429
430 def bindServer(self):
431 """Bind server socket and set self.serv_addr to its address."""
432 self.bindSock(self.serv)
433 self.serv_addr = self.serv.getsockname()
434
435 def tearDown(self):
436 self.serv.close()
437 self.serv = None
438
439
440class SocketListeningTestMixin(SocketTestBase):
441 """Mixin to listen on the server socket."""
442
443 def setUp(self):
444 super().setUp()
445 self.serv.listen(1)
446
447
448class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
449 ThreadableTest):
450 """Mixin to add client socket and allow client/server tests.
451
452 Client socket is self.cli and its address is self.cli_addr. See
453 ThreadableTest for usage information.
454 """
455
456 def __init__(self, *args, **kwargs):
457 super().__init__(*args, **kwargs)
458 ThreadableTest.__init__(self)
459
460 def clientSetUp(self):
461 self.cli = self.newClientSocket()
462 self.bindClient()
463
464 def newClientSocket(self):
465 """Return a new socket for use as client."""
466 return self.newSocket()
467
468 def bindClient(self):
469 """Bind client socket and set self.cli_addr to its address."""
470 self.bindSock(self.cli)
471 self.cli_addr = self.cli.getsockname()
472
473 def clientTearDown(self):
474 self.cli.close()
475 self.cli = None
476 ThreadableTest.clientTearDown(self)
477
478
479class ConnectedStreamTestMixin(SocketListeningTestMixin,
480 ThreadedSocketTestMixin):
481 """Mixin to allow client/server stream tests with connected client.
482
483 Server's socket representing connection to client is self.cli_conn
484 and client's connection to server is self.serv_conn. (Based on
485 SocketConnectedTest.)
486 """
487
488 def setUp(self):
489 super().setUp()
490 # Indicate explicitly we're ready for the client thread to
491 # proceed and then perform the blocking call to accept
492 self.serverExplicitReady()
493 conn, addr = self.serv.accept()
494 self.cli_conn = conn
495
496 def tearDown(self):
497 self.cli_conn.close()
498 self.cli_conn = None
499 super().tearDown()
500
501 def clientSetUp(self):
502 super().clientSetUp()
503 self.cli.connect(self.serv_addr)
504 self.serv_conn = self.cli
505
506 def clientTearDown(self):
507 self.serv_conn.close()
508 self.serv_conn = None
509 super().clientTearDown()
510
511
512class UnixSocketTestBase(SocketTestBase):
513 """Base class for Unix-domain socket tests."""
514
515 # This class is used for file descriptor passing tests, so we
516 # create the sockets in a private directory so that other users
517 # can't send anything that might be problematic for a privileged
518 # user running the tests.
519
520 def setUp(self):
521 self.dir_path = tempfile.mkdtemp()
522 self.addCleanup(os.rmdir, self.dir_path)
523 super().setUp()
524
525 def bindSock(self, sock):
526 path = tempfile.mktemp(dir=self.dir_path)
527 sock.bind(path)
528 self.addCleanup(support.unlink, path)
529
530class UnixStreamBase(UnixSocketTestBase):
531 """Base class for Unix-domain SOCK_STREAM tests."""
532
533 def newSocket(self):
534 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
535
536
537class InetTestBase(SocketTestBase):
538 """Base class for IPv4 socket tests."""
539
540 host = HOST
541
542 def setUp(self):
543 super().setUp()
544 self.port = self.serv_addr[1]
545
546 def bindSock(self, sock):
547 support.bind_port(sock, host=self.host)
548
549class TCPTestBase(InetTestBase):
550 """Base class for TCP-over-IPv4 tests."""
551
552 def newSocket(self):
553 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
554
555class UDPTestBase(InetTestBase):
556 """Base class for UDP-over-IPv4 tests."""
557
558 def newSocket(self):
559 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
560
561class SCTPStreamBase(InetTestBase):
562 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
563
564 def newSocket(self):
565 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
566 socket.IPPROTO_SCTP)
567
568
569class Inet6TestBase(InetTestBase):
570 """Base class for IPv6 socket tests."""
571
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200572 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000573
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
Charles-François Natali0cc86852013-09-13 19:53:08 +0200760 def test_host_resolution(self):
761 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
762 '1:1:1:1:1:1:1:1:1']:
763 self.assertRaises(OSError, socket.gethostbyname, addr)
764 self.assertRaises(OSError, socket.gethostbyaddr, addr)
765
766 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
767 self.assertEqual(socket.gethostbyname(addr), addr)
768
769 # we don't test support.HOSTv6 because there's a chance it doesn't have
770 # a matching name entry (e.g. 'ip6-localhost')
771 for host in [support.HOST]:
772 self.assertIn(host, socket.gethostbyaddr(host)[2])
773
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000774 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
775 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
776 def test_sethostname(self):
777 oldhn = socket.gethostname()
778 try:
779 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200780 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000781 if e.errno == errno.EPERM:
782 self.skipTest("test should be run as root")
783 else:
784 raise
785 try:
786 # running test as root!
787 self.assertEqual(socket.gethostname(), 'new')
788 # Should work with bytes objects too
789 socket.sethostname(b'bar')
790 self.assertEqual(socket.gethostname(), 'bar')
791 finally:
792 socket.sethostname(oldhn)
793
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700794 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
795 'socket.if_nameindex() not available.')
796 def testInterfaceNameIndex(self):
797 interfaces = socket.if_nameindex()
798 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200799 self.assertIsInstance(index, int)
800 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700801 # interface indices are non-zero integers
802 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200803 _index = socket.if_nametoindex(name)
804 self.assertIsInstance(_index, int)
805 self.assertEqual(index, _index)
806 _name = socket.if_indextoname(index)
807 self.assertIsInstance(_name, str)
808 self.assertEqual(name, _name)
809
810 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
811 'socket.if_nameindex() not available.')
812 def testInvalidInterfaceNameIndex(self):
813 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200814 self.assertRaises(OSError, socket.if_indextoname, 0)
815 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200816 # test with invalid values
817 self.assertRaises(TypeError, socket.if_nametoindex, 0)
818 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700819
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000820 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000821 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000822 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000823 try:
824 # On some versions, this loses a reference
825 orig = sys.getrefcount(__name__)
826 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000827 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000828 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000829 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000830
Guido van Rossum24e4af82002-06-12 19:18:08 +0000831 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000832 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000833 try:
834 # On some versions, this crashes the interpreter.
835 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200836 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000837 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000838
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000839 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000840 # This just checks that htons etc. are their own inverse,
841 # when looking at the lower 16 or 32 bits.
842 sizes = {socket.htonl: 32, socket.ntohl: 32,
843 socket.htons: 16, socket.ntohs: 16}
844 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000845 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000846 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
847 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000848
Guido van Rossuma2627af2002-09-14 00:58:46 +0000849 swapped = func(mask)
850 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000851 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000852
Guido van Rossum018919a2007-01-15 00:07:32 +0000853 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000854 good_values = [ 1, 2, 3, 1, 2, 3 ]
855 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000856 for k in good_values:
857 socket.ntohl(k)
858 socket.ntohs(k)
859 socket.htonl(k)
860 socket.htons(k)
861 for k in bad_values:
862 self.assertRaises(OverflowError, socket.ntohl, k)
863 self.assertRaises(OverflowError, socket.ntohs, k)
864 self.assertRaises(OverflowError, socket.htonl, k)
865 self.assertRaises(OverflowError, socket.htons, k)
866
Barry Warsaw11b91a02004-06-28 00:50:43 +0000867 def testGetServBy(self):
868 eq = self.assertEqual
869 # Find one service that exists, then check all the related interfaces.
870 # I've ordered this by protocols that have both a tcp and udp
871 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200872 if (sys.platform.startswith(('freebsd', 'netbsd'))
873 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000874 # avoid the 'echo' service on this platform, as there is an
875 # assumption breaking non-standard port/protocol entry
876 services = ('daytime', 'qotd', 'domain')
877 else:
878 services = ('echo', 'daytime', 'domain')
879 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000880 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000881 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000882 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200883 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000884 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000885 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200886 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000887 # Try same call with optional protocol omitted
888 port2 = socket.getservbyname(service)
889 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400890 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000891 try:
892 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200893 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000894 udpport = None
895 else:
896 eq(udpport, port)
897 # Now make sure the lookup by port returns the same service name
898 eq(socket.getservbyport(port2), service)
899 eq(socket.getservbyport(port, 'tcp'), service)
900 if udpport is not None:
901 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000902 # Make sure getservbyport does not accept out of range ports.
903 self.assertRaises(OverflowError, socket.getservbyport, -1)
904 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000905
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000906 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000907 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000908 # The default timeout should initially be None
909 self.assertEqual(socket.getdefaulttimeout(), None)
910 s = socket.socket()
911 self.assertEqual(s.gettimeout(), None)
912 s.close()
913
914 # Set the default timeout to 10, and see if it propagates
915 socket.setdefaulttimeout(10)
916 self.assertEqual(socket.getdefaulttimeout(), 10)
917 s = socket.socket()
918 self.assertEqual(s.gettimeout(), 10)
919 s.close()
920
921 # Reset the default timeout to None, and see if it propagates
922 socket.setdefaulttimeout(None)
923 self.assertEqual(socket.getdefaulttimeout(), None)
924 s = socket.socket()
925 self.assertEqual(s.gettimeout(), None)
926 s.close()
927
928 # Check that setting it to an invalid value raises ValueError
929 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
930
931 # Check that setting it to an invalid type raises TypeError
932 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
933
Benjamin Petersonf91df042009-02-13 02:50:59 +0000934 def testIPv4_inet_aton_fourbytes(self):
935 if not hasattr(socket, 'inet_aton'):
936 return # No inet_aton, nothing to check
937 # Test that issue1008086 and issue767150 are fixed.
938 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000939 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
940 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000941
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000942 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000943 if not hasattr(socket, 'inet_pton'):
944 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000945 from socket import inet_aton as f, inet_pton, AF_INET
946 g = lambda a: inet_pton(AF_INET, a)
947
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100948 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200949 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100950 )
951
Ezio Melottib3aedd42010-11-20 19:04:17 +0000952 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
953 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
954 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
955 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
956 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100957 assertInvalid(f, '0.0.0.')
958 assertInvalid(f, '300.0.0.0')
959 assertInvalid(f, 'a.0.0.0')
960 assertInvalid(f, '1.2.3.4.5')
961 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000962
Ezio Melottib3aedd42010-11-20 19:04:17 +0000963 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
964 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
965 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
966 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100967 assertInvalid(g, '0.0.0.')
968 assertInvalid(g, '300.0.0.0')
969 assertInvalid(g, 'a.0.0.0')
970 assertInvalid(g, '1.2.3.4.5')
971 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000972
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000973 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000974 if not hasattr(socket, 'inet_pton'):
975 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000976 try:
977 from socket import inet_pton, AF_INET6, has_ipv6
978 if not has_ipv6:
979 return
980 except ImportError:
981 return
982 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100983 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200984 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100985 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000986
Ezio Melottib3aedd42010-11-20 19:04:17 +0000987 self.assertEqual(b'\x00' * 16, f('::'))
988 self.assertEqual(b'\x00' * 16, f('0::0'))
989 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
990 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000991 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 +0000992 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
993 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100994 self.assertEqual(
995 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
996 f('ad42:abc::127:0:254:2')
997 )
998 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
999 assertInvalid('0x20::')
1000 assertInvalid(':::')
1001 assertInvalid('::0::')
1002 assertInvalid('1::abc::')
1003 assertInvalid('1::abc::def')
1004 assertInvalid('1:2:3:4:5:6:')
1005 assertInvalid('1:2:3:4:5:6')
1006 assertInvalid('1:2:3:4:5:6:7:8:')
1007 assertInvalid('1:2:3:4:5:6:7:8:0')
1008
1009 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1010 f('::254.42.23.64')
1011 )
1012 self.assertEqual(
1013 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1014 f('42::a29b:254.42.23.64')
1015 )
1016 self.assertEqual(
1017 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1018 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1019 )
1020 assertInvalid('255.254.253.252')
1021 assertInvalid('1::260.2.3.0')
1022 assertInvalid('1::0.be.e.0')
1023 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1024 assertInvalid('::1.2.3.4:0')
1025 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001026
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001027 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +00001028 if not hasattr(socket, 'inet_ntop'):
1029 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001030 from socket import inet_ntoa as f, inet_ntop, AF_INET
1031 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001032 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001033 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001034 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001035
Ezio Melottib3aedd42010-11-20 19:04:17 +00001036 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1037 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1038 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1039 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001040 assertInvalid(f, b'\x00' * 3)
1041 assertInvalid(f, b'\x00' * 5)
1042 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +00001043
Ezio Melottib3aedd42010-11-20 19:04:17 +00001044 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1045 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1046 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001047 assertInvalid(g, b'\x00' * 3)
1048 assertInvalid(g, b'\x00' * 5)
1049 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001050
1051 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +00001052 if not hasattr(socket, 'inet_ntop'):
1053 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001054 try:
1055 from socket import inet_ntop, AF_INET6, has_ipv6
1056 if not has_ipv6:
1057 return
1058 except ImportError:
1059 return
1060 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001061 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001062 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001063 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001064
Ezio Melottib3aedd42010-11-20 19:04:17 +00001065 self.assertEqual('::', f(b'\x00' * 16))
1066 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1067 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001068 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001069 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 +00001070 )
1071
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001072 assertInvalid(b'\x12' * 15)
1073 assertInvalid(b'\x12' * 17)
1074 assertInvalid(b'\x12' * 4)
1075
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001076 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001077
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001078 def testSockName(self):
1079 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001080 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001081 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001082 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001083 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001084 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001085 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1086 # it reasonable to get the host's addr in addition to 0.0.0.0.
1087 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001088 try:
1089 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001090 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001091 # Probably name lookup wasn't set up right; skip this test
1092 return
Benjamin Peterson577473f2010-01-19 00:09:57 +00001093 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001094 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001095
1096 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001097 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001098 # We know a socket should start without reuse==0
1099 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001100 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001101 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001102 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001103
1104 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001105 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001106 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001107 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001108 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1109 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001110 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001111
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001112 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001113 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001114 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1115 sock.settimeout(1)
1116 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001117 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001118
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001119 def testNewAttributes(self):
1120 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001121
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001122 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1123 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001124 if hasattr(socket, 'SOCK_CLOEXEC'):
1125 self.assertIn(sock.type,
1126 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1127 socket.SOCK_STREAM))
1128 else:
1129 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001130 self.assertEqual(sock.proto, 0)
1131 sock.close()
1132
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001133 def test_getsockaddrarg(self):
1134 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001135 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001136 big_port = port + 65536
1137 neg_port = port - 65536
1138 sock = socket.socket()
1139 try:
1140 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1141 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1142 sock.bind((host, port))
1143 finally:
1144 sock.close()
1145
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001146 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001147 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001148 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1149 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1150 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1151 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001152 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1153 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001154 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001155 self.assertRaises(ValueError, s.ioctl, -1, None)
1156 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001157
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001158 def testGetaddrinfo(self):
1159 try:
1160 socket.getaddrinfo('localhost', 80)
1161 except socket.gaierror as err:
1162 if err.errno == socket.EAI_SERVICE:
1163 # see http://bugs.python.org/issue1282647
1164 self.skipTest("buggy libc version")
1165 raise
1166 # len of every sequence is supposed to be == 5
1167 for info in socket.getaddrinfo(HOST, None):
1168 self.assertEqual(len(info), 5)
1169 # host can be a domain name, a string representation of an
1170 # IPv4/v6 address or None
1171 socket.getaddrinfo('localhost', 80)
1172 socket.getaddrinfo('127.0.0.1', 80)
1173 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001174 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001175 socket.getaddrinfo('::1', 80)
1176 # port can be a string service name such as "http", a numeric
1177 # port number or None
1178 socket.getaddrinfo(HOST, "http")
1179 socket.getaddrinfo(HOST, 80)
1180 socket.getaddrinfo(HOST, None)
1181 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001182 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1183 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001184 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001185 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1186 self.assertEqual(type, socket.SOCK_STREAM)
1187 self.assertEqual(str(type), 'SocketType.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001188 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1189 for _, socktype, _, _, _ in infos:
1190 self.assertEqual(socktype, socket.SOCK_STREAM)
1191 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001192 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001193 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1194 # a server willing to support both IPv4 and IPv6 will
1195 # usually do this
1196 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1197 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001198 # test keyword arguments
1199 a = socket.getaddrinfo(HOST, None)
1200 b = socket.getaddrinfo(host=HOST, port=None)
1201 self.assertEqual(a, b)
1202 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1203 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1204 self.assertEqual(a, b)
1205 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1206 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1207 self.assertEqual(a, b)
1208 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1209 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1210 self.assertEqual(a, b)
1211 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1212 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1213 self.assertEqual(a, b)
1214 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1215 socket.AI_PASSIVE)
1216 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1217 type=socket.SOCK_STREAM, proto=0,
1218 flags=socket.AI_PASSIVE)
1219 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001220 # Issue #6697.
1221 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001222
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001223 # Issue 17269
Ronald Oussorena822d3662013-06-10 10:36:28 +02001224 if hasattr(socket, 'AI_NUMERICSERV'):
1225 socket.getaddrinfo("localhost", None, 0, 0, 0, socket.AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001226
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001227 def test_getnameinfo(self):
1228 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001229 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001230
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001231 @unittest.skipUnless(support.is_resource_enabled('network'),
1232 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001233 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001234 # Check for internet access before running test (issue #12804).
1235 try:
1236 socket.gethostbyname('python.org')
1237 except socket.gaierror as e:
1238 if e.errno == socket.EAI_NODATA:
1239 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001240 # these should all be successful
1241 socket.gethostbyname('испытание.python.org')
1242 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001243 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1244 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1245 # have a reverse entry yet
1246 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001247
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001248 def check_sendall_interrupted(self, with_timeout):
1249 # socketpair() is not stricly required, but it makes things easier.
1250 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1251 self.skipTest("signal.alarm and socket.socketpair required for this test")
1252 # Our signal handlers clobber the C errno by calling a math function
1253 # with an invalid domain value.
1254 def ok_handler(*args):
1255 self.assertRaises(ValueError, math.acosh, 0)
1256 def raising_handler(*args):
1257 self.assertRaises(ValueError, math.acosh, 0)
1258 1 // 0
1259 c, s = socket.socketpair()
1260 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1261 try:
1262 if with_timeout:
1263 # Just above the one second minimum for signal.alarm
1264 c.settimeout(1.5)
1265 with self.assertRaises(ZeroDivisionError):
1266 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001267 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001268 if with_timeout:
1269 signal.signal(signal.SIGALRM, ok_handler)
1270 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001271 self.assertRaises(socket.timeout, c.sendall,
1272 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001273 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001274 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001275 signal.signal(signal.SIGALRM, old_alarm)
1276 c.close()
1277 s.close()
1278
1279 def test_sendall_interrupted(self):
1280 self.check_sendall_interrupted(False)
1281
1282 def test_sendall_interrupted_with_timeout(self):
1283 self.check_sendall_interrupted(True)
1284
Antoine Pitroue033e062010-10-29 10:38:18 +00001285 def test_dealloc_warn(self):
1286 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1287 r = repr(sock)
1288 with self.assertWarns(ResourceWarning) as cm:
1289 sock = None
1290 support.gc_collect()
1291 self.assertIn(r, str(cm.warning.args[0]))
1292 # An open socket file object gets dereferenced after the socket
1293 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1294 f = sock.makefile('rb')
1295 r = repr(sock)
1296 sock = None
1297 support.gc_collect()
1298 with self.assertWarns(ResourceWarning):
1299 f = None
1300 support.gc_collect()
1301
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001302 def test_name_closed_socketio(self):
1303 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1304 fp = sock.makefile("rb")
1305 fp.close()
1306 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1307
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001308 def test_unusable_closed_socketio(self):
1309 with socket.socket() as sock:
1310 fp = sock.makefile("rb", buffering=0)
1311 self.assertTrue(fp.readable())
1312 self.assertFalse(fp.writable())
1313 self.assertFalse(fp.seekable())
1314 fp.close()
1315 self.assertRaises(ValueError, fp.readable)
1316 self.assertRaises(ValueError, fp.writable)
1317 self.assertRaises(ValueError, fp.seekable)
1318
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001319 def test_pickle(self):
1320 sock = socket.socket()
1321 with sock:
1322 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1323 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1324
Serhiy Storchaka78980432013-01-15 01:12:17 +02001325 def test_listen_backlog(self):
1326 for backlog in 0, -1:
1327 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1328 srv.bind((HOST, 0))
1329 srv.listen(backlog)
1330 srv.close()
1331
1332 # Issue 15989
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001333 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1334 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001335 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001336 srv.close()
1337
Charles-François Natali42663332012-01-02 15:57:30 +01001338 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001339 def test_flowinfo(self):
1340 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001341 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001342 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001343 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001344
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001345 def test_str_for_enums(self):
1346 # Make sure that the AF_* and SOCK_* constants have enum-like string
1347 # reprs.
1348 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1349 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
1350 self.assertEqual(str(s.type), 'SocketType.SOCK_STREAM')
1351
1352 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1353 def test_uknown_socket_family_repr(self):
1354 # Test that when created with a family that's not one of the known
1355 # AF_*/SOCK_* constants, socket.family just returns the number.
1356 #
1357 # To do this we fool socket.socket into believing it already has an
1358 # open fd because on this path it doesn't actually verify the family and
1359 # type and populates the socket object.
1360 #
1361 # On Windows this trick won't work, so the test is skipped.
1362 fd, _ = tempfile.mkstemp()
1363 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1364 self.assertEqual(s.family, 42424)
1365 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001366
Charles-François Natali47413c12011-10-06 19:47:44 +02001367@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1368class BasicCANTest(unittest.TestCase):
1369
1370 def testCrucialConstants(self):
1371 socket.AF_CAN
1372 socket.PF_CAN
1373 socket.CAN_RAW
1374
Charles-François Natali773e42d2013-02-05 19:42:01 +01001375 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1376 'socket.CAN_BCM required for this test.')
1377 def testBCMConstants(self):
1378 socket.CAN_BCM
1379
1380 # opcodes
1381 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1382 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1383 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1384 socket.CAN_BCM_TX_SEND # send one CAN frame
1385 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1386 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1387 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1388 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1389 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1390 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1391 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1392 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1393
Charles-François Natali47413c12011-10-06 19:47:44 +02001394 def testCreateSocket(self):
1395 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1396 pass
1397
Charles-François Natali773e42d2013-02-05 19:42:01 +01001398 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1399 'socket.CAN_BCM required for this test.')
1400 def testCreateBCMSocket(self):
1401 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1402 pass
1403
Charles-François Natali47413c12011-10-06 19:47:44 +02001404 def testBindAny(self):
1405 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1406 s.bind(('', ))
1407
1408 def testTooLongInterfaceName(self):
1409 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1410 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001411 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001412 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001413
1414 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1415 'socket.CAN_RAW_LOOPBACK required for this test.')
1416 def testLoopback(self):
1417 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1418 for loopback in (0, 1):
1419 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1420 loopback)
1421 self.assertEqual(loopback,
1422 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1423
1424 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1425 'socket.CAN_RAW_FILTER required for this test.')
1426 def testFilter(self):
1427 can_id, can_mask = 0x200, 0x700
1428 can_filter = struct.pack("=II", can_id, can_mask)
1429 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1430 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1431 self.assertEqual(can_filter,
1432 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1433
1434
1435@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001436class CANTest(ThreadedCANSocketTest):
1437
Charles-François Natali47413c12011-10-06 19:47:44 +02001438 def __init__(self, methodName='runTest'):
1439 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1440
1441 @classmethod
1442 def build_can_frame(cls, can_id, data):
1443 """Build a CAN frame."""
1444 can_dlc = len(data)
1445 data = data.ljust(8, b'\x00')
1446 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1447
1448 @classmethod
1449 def dissect_can_frame(cls, frame):
1450 """Dissect a CAN frame."""
1451 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1452 return (can_id, can_dlc, data[:can_dlc])
1453
1454 def testSendFrame(self):
1455 cf, addr = self.s.recvfrom(self.bufsize)
1456 self.assertEqual(self.cf, cf)
1457 self.assertEqual(addr[0], self.interface)
1458 self.assertEqual(addr[1], socket.AF_CAN)
1459
1460 def _testSendFrame(self):
1461 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1462 self.cli.send(self.cf)
1463
1464 def testSendMaxFrame(self):
1465 cf, addr = self.s.recvfrom(self.bufsize)
1466 self.assertEqual(self.cf, cf)
1467
1468 def _testSendMaxFrame(self):
1469 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1470 self.cli.send(self.cf)
1471
1472 def testSendMultiFrames(self):
1473 cf, addr = self.s.recvfrom(self.bufsize)
1474 self.assertEqual(self.cf1, cf)
1475
1476 cf, addr = self.s.recvfrom(self.bufsize)
1477 self.assertEqual(self.cf2, cf)
1478
1479 def _testSendMultiFrames(self):
1480 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1481 self.cli.send(self.cf1)
1482
1483 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1484 self.cli.send(self.cf2)
1485
Charles-François Natali773e42d2013-02-05 19:42:01 +01001486 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1487 'socket.CAN_BCM required for this test.')
1488 def _testBCM(self):
1489 cf, addr = self.cli.recvfrom(self.bufsize)
1490 self.assertEqual(self.cf, cf)
1491 can_id, can_dlc, data = self.dissect_can_frame(cf)
1492 self.assertEqual(self.can_id, can_id)
1493 self.assertEqual(self.data, data)
1494
1495 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1496 'socket.CAN_BCM required for this test.')
1497 def testBCM(self):
1498 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1499 self.addCleanup(bcm.close)
1500 bcm.connect((self.interface,))
1501 self.can_id = 0x123
1502 self.data = bytes([0xc0, 0xff, 0xee])
1503 self.cf = self.build_can_frame(self.can_id, self.data)
1504 opcode = socket.CAN_BCM_TX_SEND
1505 flags = 0
1506 count = 0
1507 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1508 bcm_can_id = 0x0222
1509 nframes = 1
1510 assert len(self.cf) == 16
1511 header = struct.pack(self.bcm_cmd_msg_fmt,
1512 opcode,
1513 flags,
1514 count,
1515 ival1_seconds,
1516 ival1_usec,
1517 ival2_seconds,
1518 ival2_usec,
1519 bcm_can_id,
1520 nframes,
1521 )
1522 header_plus_frame = header + self.cf
1523 bytes_sent = bcm.send(header_plus_frame)
1524 self.assertEqual(bytes_sent, len(header_plus_frame))
1525
Charles-François Natali47413c12011-10-06 19:47:44 +02001526
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001527@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1528class BasicRDSTest(unittest.TestCase):
1529
1530 def testCrucialConstants(self):
1531 socket.AF_RDS
1532 socket.PF_RDS
1533
1534 def testCreateSocket(self):
1535 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1536 pass
1537
1538 def testSocketBufferSize(self):
1539 bufsize = 16384
1540 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1541 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1542 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1543
1544
1545@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1546@unittest.skipUnless(thread, 'Threading required for this test.')
1547class RDSTest(ThreadedRDSSocketTest):
1548
1549 def __init__(self, methodName='runTest'):
1550 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1551
Charles-François Natali240c55f2011-11-10 20:33:36 +01001552 def setUp(self):
1553 super().setUp()
1554 self.evt = threading.Event()
1555
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001556 def testSendAndRecv(self):
1557 data, addr = self.serv.recvfrom(self.bufsize)
1558 self.assertEqual(self.data, data)
1559 self.assertEqual(self.cli_addr, addr)
1560
1561 def _testSendAndRecv(self):
1562 self.data = b'spam'
1563 self.cli.sendto(self.data, 0, (HOST, self.port))
1564
1565 def testPeek(self):
1566 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1567 self.assertEqual(self.data, data)
1568 data, addr = self.serv.recvfrom(self.bufsize)
1569 self.assertEqual(self.data, data)
1570
1571 def _testPeek(self):
1572 self.data = b'spam'
1573 self.cli.sendto(self.data, 0, (HOST, self.port))
1574
1575 @requireAttrs(socket.socket, 'recvmsg')
1576 def testSendAndRecvMsg(self):
1577 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1578 self.assertEqual(self.data, data)
1579
1580 @requireAttrs(socket.socket, 'sendmsg')
1581 def _testSendAndRecvMsg(self):
1582 self.data = b'hello ' * 10
1583 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1584
1585 def testSendAndRecvMulti(self):
1586 data, addr = self.serv.recvfrom(self.bufsize)
1587 self.assertEqual(self.data1, data)
1588
1589 data, addr = self.serv.recvfrom(self.bufsize)
1590 self.assertEqual(self.data2, data)
1591
1592 def _testSendAndRecvMulti(self):
1593 self.data1 = b'bacon'
1594 self.cli.sendto(self.data1, 0, (HOST, self.port))
1595
1596 self.data2 = b'egg'
1597 self.cli.sendto(self.data2, 0, (HOST, self.port))
1598
1599 def testSelect(self):
1600 r, w, x = select.select([self.serv], [], [], 3.0)
1601 self.assertIn(self.serv, r)
1602 data, addr = self.serv.recvfrom(self.bufsize)
1603 self.assertEqual(self.data, data)
1604
1605 def _testSelect(self):
1606 self.data = b'select'
1607 self.cli.sendto(self.data, 0, (HOST, self.port))
1608
1609 def testCongestion(self):
1610 # wait until the sender is done
1611 self.evt.wait()
1612
1613 def _testCongestion(self):
1614 # test the behavior in case of congestion
1615 self.data = b'fill'
1616 self.cli.setblocking(False)
1617 try:
1618 # try to lower the receiver's socket buffer size
1619 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1620 except OSError:
1621 pass
1622 with self.assertRaises(OSError) as cm:
1623 try:
1624 # fill the receiver's socket buffer
1625 while True:
1626 self.cli.sendto(self.data, 0, (HOST, self.port))
1627 finally:
1628 # signal the receiver we're done
1629 self.evt.set()
1630 # sendto() should have failed with ENOBUFS
1631 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1632 # and we should have received a congestion notification through poll
1633 r, w, x = select.select([self.serv], [], [], 3.0)
1634 self.assertIn(self.serv, r)
1635
1636
Victor Stinner45df8202010-04-28 22:31:17 +00001637@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001638class BasicTCPTest(SocketConnectedTest):
1639
1640 def __init__(self, methodName='runTest'):
1641 SocketConnectedTest.__init__(self, methodName=methodName)
1642
1643 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001644 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001645 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001646 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001647
1648 def _testRecv(self):
1649 self.serv_conn.send(MSG)
1650
1651 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001652 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001653 seg1 = self.cli_conn.recv(len(MSG) - 3)
1654 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001655 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001656 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001657
1658 def _testOverFlowRecv(self):
1659 self.serv_conn.send(MSG)
1660
1661 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001662 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001663 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001664 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001665
1666 def _testRecvFrom(self):
1667 self.serv_conn.send(MSG)
1668
1669 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001670 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001671 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1672 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001673 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001674 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001675
1676 def _testOverFlowRecvFrom(self):
1677 self.serv_conn.send(MSG)
1678
1679 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001680 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001681 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001682 while 1:
1683 read = self.cli_conn.recv(1024)
1684 if not read:
1685 break
Guido van Rossume531e292002-08-08 20:28:34 +00001686 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001687 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001688
1689 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001690 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001691 self.serv_conn.sendall(big_chunk)
1692
1693 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001694 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001695 fd = self.cli_conn.fileno()
1696 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001697 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001698 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001699 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001700 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001701
1702 def _testFromFd(self):
1703 self.serv_conn.send(MSG)
1704
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001705 def testDup(self):
1706 # Testing dup()
1707 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001708 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001709 msg = sock.recv(1024)
1710 self.assertEqual(msg, MSG)
1711
1712 def _testDup(self):
1713 self.serv_conn.send(MSG)
1714
Guido van Rossum24e4af82002-06-12 19:18:08 +00001715 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001716 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001717 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001718 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001719 # wait for _testShutdown to finish: on OS X, when the server
1720 # closes the connection the client also becomes disconnected,
1721 # and the client's shutdown call will fail. (Issue #4397.)
1722 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001723
1724 def _testShutdown(self):
1725 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001726 # Issue 15989
1727 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1728 _testcapi.INT_MAX + 1)
1729 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1730 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001731 self.serv_conn.shutdown(2)
1732
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001733 def testDetach(self):
1734 # Testing detach()
1735 fileno = self.cli_conn.fileno()
1736 f = self.cli_conn.detach()
1737 self.assertEqual(f, fileno)
1738 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001739 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001740 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001741 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001742 # ...but we can create another socket using the (still open)
1743 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001744 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001745 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001746 msg = sock.recv(1024)
1747 self.assertEqual(msg, MSG)
1748
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001749 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001750 self.serv_conn.send(MSG)
1751
Victor Stinner45df8202010-04-28 22:31:17 +00001752@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001753class BasicUDPTest(ThreadedUDPSocketTest):
1754
1755 def __init__(self, methodName='runTest'):
1756 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1757
1758 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001759 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001760 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001761 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001762
1763 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001764 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001765
Guido van Rossum1c938012002-06-12 21:17:20 +00001766 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001767 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001768 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001769 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001770
Guido van Rossum1c938012002-06-12 21:17:20 +00001771 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001772 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001773
Guido van Rossumd8faa362007-04-27 19:54:29 +00001774 def testRecvFromNegative(self):
1775 # Negative lengths passed to recvfrom should give ValueError.
1776 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1777
1778 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001779 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001780
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001781# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1782# same test code is used with different families and types of socket
1783# (e.g. stream, datagram), and tests using recvmsg() are repeated
1784# using recvmsg_into().
1785#
1786# The generic test classes such as SendmsgTests and
1787# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1788# supplied with sockets cli_sock and serv_sock representing the
1789# client's and the server's end of the connection respectively, and
1790# attributes cli_addr and serv_addr holding their (numeric where
1791# appropriate) addresses.
1792#
1793# The final concrete test classes combine these with subclasses of
1794# SocketTestBase which set up client and server sockets of a specific
1795# type, and with subclasses of SendrecvmsgBase such as
1796# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1797# sockets to cli_sock and serv_sock and override the methods and
1798# attributes of SendrecvmsgBase to fill in destination addresses if
1799# needed when sending, check for specific flags in msg_flags, etc.
1800#
1801# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1802# recvmsg_into().
1803
1804# XXX: like the other datagram (UDP) tests in this module, the code
1805# here assumes that datagram delivery on the local machine will be
1806# reliable.
1807
1808class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1809 # Base class for sendmsg()/recvmsg() tests.
1810
1811 # Time in seconds to wait before considering a test failed, or
1812 # None for no timeout. Not all tests actually set a timeout.
1813 fail_timeout = 3.0
1814
1815 def setUp(self):
1816 self.misc_event = threading.Event()
1817 super().setUp()
1818
1819 def sendToServer(self, msg):
1820 # Send msg to the server.
1821 return self.cli_sock.send(msg)
1822
1823 # Tuple of alternative default arguments for sendmsg() when called
1824 # via sendmsgToServer() (e.g. to include a destination address).
1825 sendmsg_to_server_defaults = ()
1826
1827 def sendmsgToServer(self, *args):
1828 # Call sendmsg() on self.cli_sock with the given arguments,
1829 # filling in any arguments which are not supplied with the
1830 # corresponding items of self.sendmsg_to_server_defaults, if
1831 # any.
1832 return self.cli_sock.sendmsg(
1833 *(args + self.sendmsg_to_server_defaults[len(args):]))
1834
1835 def doRecvmsg(self, sock, bufsize, *args):
1836 # Call recvmsg() on sock with given arguments and return its
1837 # result. Should be used for tests which can use either
1838 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1839 # this method with one which emulates it using recvmsg_into(),
1840 # thus allowing the same test to be used for both methods.
1841 result = sock.recvmsg(bufsize, *args)
1842 self.registerRecvmsgResult(result)
1843 return result
1844
1845 def registerRecvmsgResult(self, result):
1846 # Called by doRecvmsg() with the return value of recvmsg() or
1847 # recvmsg_into(). Can be overridden to arrange cleanup based
1848 # on the returned ancillary data, for instance.
1849 pass
1850
1851 def checkRecvmsgAddress(self, addr1, addr2):
1852 # Called to compare the received address with the address of
1853 # the peer.
1854 self.assertEqual(addr1, addr2)
1855
1856 # Flags that are normally unset in msg_flags
1857 msg_flags_common_unset = 0
1858 for name in ("MSG_CTRUNC", "MSG_OOB"):
1859 msg_flags_common_unset |= getattr(socket, name, 0)
1860
1861 # Flags that are normally set
1862 msg_flags_common_set = 0
1863
1864 # Flags set when a complete record has been received (e.g. MSG_EOR
1865 # for SCTP)
1866 msg_flags_eor_indicator = 0
1867
1868 # Flags set when a complete record has not been received
1869 # (e.g. MSG_TRUNC for datagram sockets)
1870 msg_flags_non_eor_indicator = 0
1871
1872 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1873 # Method to check the value of msg_flags returned by recvmsg[_into]().
1874 #
1875 # Checks that all bits in msg_flags_common_set attribute are
1876 # set in "flags" and all bits in msg_flags_common_unset are
1877 # unset.
1878 #
1879 # The "eor" argument specifies whether the flags should
1880 # indicate that a full record (or datagram) has been received.
1881 # If "eor" is None, no checks are done; otherwise, checks
1882 # that:
1883 #
1884 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1885 # set and all bits in msg_flags_non_eor_indicator are unset
1886 #
1887 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1888 # are set and all bits in msg_flags_eor_indicator are unset
1889 #
1890 # If "checkset" and/or "checkunset" are supplied, they require
1891 # the given bits to be set or unset respectively, overriding
1892 # what the attributes require for those bits.
1893 #
1894 # If any bits are set in "ignore", they will not be checked,
1895 # regardless of the other inputs.
1896 #
1897 # Will raise Exception if the inputs require a bit to be both
1898 # set and unset, and it is not ignored.
1899
1900 defaultset = self.msg_flags_common_set
1901 defaultunset = self.msg_flags_common_unset
1902
1903 if eor:
1904 defaultset |= self.msg_flags_eor_indicator
1905 defaultunset |= self.msg_flags_non_eor_indicator
1906 elif eor is not None:
1907 defaultset |= self.msg_flags_non_eor_indicator
1908 defaultunset |= self.msg_flags_eor_indicator
1909
1910 # Function arguments override defaults
1911 defaultset &= ~checkunset
1912 defaultunset &= ~checkset
1913
1914 # Merge arguments with remaining defaults, and check for conflicts
1915 checkset |= defaultset
1916 checkunset |= defaultunset
1917 inboth = checkset & checkunset & ~ignore
1918 if inboth:
1919 raise Exception("contradictory set, unset requirements for flags "
1920 "{0:#x}".format(inboth))
1921
1922 # Compare with given msg_flags value
1923 mask = (checkset | checkunset) & ~ignore
1924 self.assertEqual(flags & mask, checkset & mask)
1925
1926
1927class RecvmsgIntoMixin(SendrecvmsgBase):
1928 # Mixin to implement doRecvmsg() using recvmsg_into().
1929
1930 def doRecvmsg(self, sock, bufsize, *args):
1931 buf = bytearray(bufsize)
1932 result = sock.recvmsg_into([buf], *args)
1933 self.registerRecvmsgResult(result)
1934 self.assertGreaterEqual(result[0], 0)
1935 self.assertLessEqual(result[0], bufsize)
1936 return (bytes(buf[:result[0]]),) + result[1:]
1937
1938
1939class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1940 # Defines flags to be checked in msg_flags for datagram sockets.
1941
1942 @property
1943 def msg_flags_non_eor_indicator(self):
1944 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1945
1946
1947class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1948 # Defines flags to be checked in msg_flags for SCTP sockets.
1949
1950 @property
1951 def msg_flags_eor_indicator(self):
1952 return super().msg_flags_eor_indicator | socket.MSG_EOR
1953
1954
1955class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1956 # Base class for tests on connectionless-mode sockets. Users must
1957 # supply sockets on attributes cli and serv to be mapped to
1958 # cli_sock and serv_sock respectively.
1959
1960 @property
1961 def serv_sock(self):
1962 return self.serv
1963
1964 @property
1965 def cli_sock(self):
1966 return self.cli
1967
1968 @property
1969 def sendmsg_to_server_defaults(self):
1970 return ([], [], 0, self.serv_addr)
1971
1972 def sendToServer(self, msg):
1973 return self.cli_sock.sendto(msg, self.serv_addr)
1974
1975
1976class SendrecvmsgConnectedBase(SendrecvmsgBase):
1977 # Base class for tests on connected sockets. Users must supply
1978 # sockets on attributes serv_conn and cli_conn (representing the
1979 # connections *to* the server and the client), to be mapped to
1980 # cli_sock and serv_sock respectively.
1981
1982 @property
1983 def serv_sock(self):
1984 return self.cli_conn
1985
1986 @property
1987 def cli_sock(self):
1988 return self.serv_conn
1989
1990 def checkRecvmsgAddress(self, addr1, addr2):
1991 # Address is currently "unspecified" for a connected socket,
1992 # so we don't examine it
1993 pass
1994
1995
1996class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1997 # Base class to set a timeout on server's socket.
1998
1999 def setUp(self):
2000 super().setUp()
2001 self.serv_sock.settimeout(self.fail_timeout)
2002
2003
2004class SendmsgTests(SendrecvmsgServerTimeoutBase):
2005 # Tests for sendmsg() which can use any socket type and do not
2006 # involve recvmsg() or recvmsg_into().
2007
2008 def testSendmsg(self):
2009 # Send a simple message with sendmsg().
2010 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2011
2012 def _testSendmsg(self):
2013 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2014
2015 def testSendmsgDataGenerator(self):
2016 # Send from buffer obtained from a generator (not a sequence).
2017 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2018
2019 def _testSendmsgDataGenerator(self):
2020 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2021 len(MSG))
2022
2023 def testSendmsgAncillaryGenerator(self):
2024 # Gather (empty) ancillary data from a generator.
2025 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2026
2027 def _testSendmsgAncillaryGenerator(self):
2028 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2029 len(MSG))
2030
2031 def testSendmsgArray(self):
2032 # Send data from an array instead of the usual bytes object.
2033 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2034
2035 def _testSendmsgArray(self):
2036 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2037 len(MSG))
2038
2039 def testSendmsgGather(self):
2040 # Send message data from more than one buffer (gather write).
2041 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2042
2043 def _testSendmsgGather(self):
2044 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2045
2046 def testSendmsgBadArgs(self):
2047 # Check that sendmsg() rejects invalid arguments.
2048 self.assertEqual(self.serv_sock.recv(1000), b"done")
2049
2050 def _testSendmsgBadArgs(self):
2051 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2052 self.assertRaises(TypeError, self.sendmsgToServer,
2053 b"not in an iterable")
2054 self.assertRaises(TypeError, self.sendmsgToServer,
2055 object())
2056 self.assertRaises(TypeError, self.sendmsgToServer,
2057 [object()])
2058 self.assertRaises(TypeError, self.sendmsgToServer,
2059 [MSG, object()])
2060 self.assertRaises(TypeError, self.sendmsgToServer,
2061 [MSG], object())
2062 self.assertRaises(TypeError, self.sendmsgToServer,
2063 [MSG], [], object())
2064 self.assertRaises(TypeError, self.sendmsgToServer,
2065 [MSG], [], 0, object())
2066 self.sendToServer(b"done")
2067
2068 def testSendmsgBadCmsg(self):
2069 # Check that invalid ancillary data items are rejected.
2070 self.assertEqual(self.serv_sock.recv(1000), b"done")
2071
2072 def _testSendmsgBadCmsg(self):
2073 self.assertRaises(TypeError, self.sendmsgToServer,
2074 [MSG], [object()])
2075 self.assertRaises(TypeError, self.sendmsgToServer,
2076 [MSG], [(object(), 0, b"data")])
2077 self.assertRaises(TypeError, self.sendmsgToServer,
2078 [MSG], [(0, object(), b"data")])
2079 self.assertRaises(TypeError, self.sendmsgToServer,
2080 [MSG], [(0, 0, object())])
2081 self.assertRaises(TypeError, self.sendmsgToServer,
2082 [MSG], [(0, 0)])
2083 self.assertRaises(TypeError, self.sendmsgToServer,
2084 [MSG], [(0, 0, b"data", 42)])
2085 self.sendToServer(b"done")
2086
2087 @requireAttrs(socket, "CMSG_SPACE")
2088 def testSendmsgBadMultiCmsg(self):
2089 # Check that invalid ancillary data items are rejected when
2090 # more than one item is present.
2091 self.assertEqual(self.serv_sock.recv(1000), b"done")
2092
2093 @testSendmsgBadMultiCmsg.client_skip
2094 def _testSendmsgBadMultiCmsg(self):
2095 self.assertRaises(TypeError, self.sendmsgToServer,
2096 [MSG], [0, 0, b""])
2097 self.assertRaises(TypeError, self.sendmsgToServer,
2098 [MSG], [(0, 0, b""), object()])
2099 self.sendToServer(b"done")
2100
2101 def testSendmsgExcessCmsgReject(self):
2102 # Check that sendmsg() rejects excess ancillary data items
2103 # when the number that can be sent is limited.
2104 self.assertEqual(self.serv_sock.recv(1000), b"done")
2105
2106 def _testSendmsgExcessCmsgReject(self):
2107 if not hasattr(socket, "CMSG_SPACE"):
2108 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002109 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002110 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2111 self.assertIsNone(cm.exception.errno)
2112 self.sendToServer(b"done")
2113
2114 def testSendmsgAfterClose(self):
2115 # Check that sendmsg() fails on a closed socket.
2116 pass
2117
2118 def _testSendmsgAfterClose(self):
2119 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002120 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002121
2122
2123class SendmsgStreamTests(SendmsgTests):
2124 # Tests for sendmsg() which require a stream socket and do not
2125 # involve recvmsg() or recvmsg_into().
2126
2127 def testSendmsgExplicitNoneAddr(self):
2128 # Check that peer address can be specified as None.
2129 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2130
2131 def _testSendmsgExplicitNoneAddr(self):
2132 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2133
2134 def testSendmsgTimeout(self):
2135 # Check that timeout works with sendmsg().
2136 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2137 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2138
2139 def _testSendmsgTimeout(self):
2140 try:
2141 self.cli_sock.settimeout(0.03)
2142 with self.assertRaises(socket.timeout):
2143 while True:
2144 self.sendmsgToServer([b"a"*512])
2145 finally:
2146 self.misc_event.set()
2147
2148 # XXX: would be nice to have more tests for sendmsg flags argument.
2149
2150 # Linux supports MSG_DONTWAIT when sending, but in general, it
2151 # only works when receiving. Could add other platforms if they
2152 # support it too.
2153 @skipWithClientIf(sys.platform not in {"linux2"},
2154 "MSG_DONTWAIT not known to work on this platform when "
2155 "sending")
2156 def testSendmsgDontWait(self):
2157 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2158 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2159 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2160
2161 @testSendmsgDontWait.client_skip
2162 def _testSendmsgDontWait(self):
2163 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002164 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002165 while True:
2166 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2167 self.assertIn(cm.exception.errno,
2168 (errno.EAGAIN, errno.EWOULDBLOCK))
2169 finally:
2170 self.misc_event.set()
2171
2172
2173class SendmsgConnectionlessTests(SendmsgTests):
2174 # Tests for sendmsg() which require a connectionless-mode
2175 # (e.g. datagram) socket, and do not involve recvmsg() or
2176 # recvmsg_into().
2177
2178 def testSendmsgNoDestAddr(self):
2179 # Check that sendmsg() fails when no destination address is
2180 # given for unconnected socket.
2181 pass
2182
2183 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002184 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002185 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002186 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002187 [MSG], [], 0, None)
2188
2189
2190class RecvmsgGenericTests(SendrecvmsgBase):
2191 # Tests for recvmsg() which can also be emulated using
2192 # recvmsg_into(), and can use any socket type.
2193
2194 def testRecvmsg(self):
2195 # Receive a simple message with recvmsg[_into]().
2196 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2197 self.assertEqual(msg, MSG)
2198 self.checkRecvmsgAddress(addr, self.cli_addr)
2199 self.assertEqual(ancdata, [])
2200 self.checkFlags(flags, eor=True)
2201
2202 def _testRecvmsg(self):
2203 self.sendToServer(MSG)
2204
2205 def testRecvmsgExplicitDefaults(self):
2206 # Test recvmsg[_into]() with default arguments provided explicitly.
2207 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2208 len(MSG), 0, 0)
2209 self.assertEqual(msg, MSG)
2210 self.checkRecvmsgAddress(addr, self.cli_addr)
2211 self.assertEqual(ancdata, [])
2212 self.checkFlags(flags, eor=True)
2213
2214 def _testRecvmsgExplicitDefaults(self):
2215 self.sendToServer(MSG)
2216
2217 def testRecvmsgShorter(self):
2218 # Receive a message smaller than buffer.
2219 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2220 len(MSG) + 42)
2221 self.assertEqual(msg, MSG)
2222 self.checkRecvmsgAddress(addr, self.cli_addr)
2223 self.assertEqual(ancdata, [])
2224 self.checkFlags(flags, eor=True)
2225
2226 def _testRecvmsgShorter(self):
2227 self.sendToServer(MSG)
2228
Charles-François Natali8619cd72011-10-03 19:43:15 +02002229 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2230 # datagram is received (issue #13001).
2231 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002232 def testRecvmsgTrunc(self):
2233 # Receive part of message, check for truncation indicators.
2234 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2235 len(MSG) - 3)
2236 self.assertEqual(msg, MSG[:-3])
2237 self.checkRecvmsgAddress(addr, self.cli_addr)
2238 self.assertEqual(ancdata, [])
2239 self.checkFlags(flags, eor=False)
2240
Charles-François Natali8619cd72011-10-03 19:43:15 +02002241 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002242 def _testRecvmsgTrunc(self):
2243 self.sendToServer(MSG)
2244
2245 def testRecvmsgShortAncillaryBuf(self):
2246 # Test ancillary data buffer too small to hold any ancillary data.
2247 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2248 len(MSG), 1)
2249 self.assertEqual(msg, MSG)
2250 self.checkRecvmsgAddress(addr, self.cli_addr)
2251 self.assertEqual(ancdata, [])
2252 self.checkFlags(flags, eor=True)
2253
2254 def _testRecvmsgShortAncillaryBuf(self):
2255 self.sendToServer(MSG)
2256
2257 def testRecvmsgLongAncillaryBuf(self):
2258 # Test large ancillary data buffer.
2259 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2260 len(MSG), 10240)
2261 self.assertEqual(msg, MSG)
2262 self.checkRecvmsgAddress(addr, self.cli_addr)
2263 self.assertEqual(ancdata, [])
2264 self.checkFlags(flags, eor=True)
2265
2266 def _testRecvmsgLongAncillaryBuf(self):
2267 self.sendToServer(MSG)
2268
2269 def testRecvmsgAfterClose(self):
2270 # Check that recvmsg[_into]() fails on a closed socket.
2271 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002272 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002273
2274 def _testRecvmsgAfterClose(self):
2275 pass
2276
2277 def testRecvmsgTimeout(self):
2278 # Check that timeout works.
2279 try:
2280 self.serv_sock.settimeout(0.03)
2281 self.assertRaises(socket.timeout,
2282 self.doRecvmsg, self.serv_sock, len(MSG))
2283 finally:
2284 self.misc_event.set()
2285
2286 def _testRecvmsgTimeout(self):
2287 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2288
2289 @requireAttrs(socket, "MSG_PEEK")
2290 def testRecvmsgPeek(self):
2291 # Check that MSG_PEEK in flags enables examination of pending
2292 # data without consuming it.
2293
2294 # Receive part of data with MSG_PEEK.
2295 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2296 len(MSG) - 3, 0,
2297 socket.MSG_PEEK)
2298 self.assertEqual(msg, MSG[:-3])
2299 self.checkRecvmsgAddress(addr, self.cli_addr)
2300 self.assertEqual(ancdata, [])
2301 # Ignoring MSG_TRUNC here (so this test is the same for stream
2302 # and datagram sockets). Some wording in POSIX seems to
2303 # suggest that it needn't be set when peeking, but that may
2304 # just be a slip.
2305 self.checkFlags(flags, eor=False,
2306 ignore=getattr(socket, "MSG_TRUNC", 0))
2307
2308 # Receive all data with MSG_PEEK.
2309 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2310 len(MSG), 0,
2311 socket.MSG_PEEK)
2312 self.assertEqual(msg, MSG)
2313 self.checkRecvmsgAddress(addr, self.cli_addr)
2314 self.assertEqual(ancdata, [])
2315 self.checkFlags(flags, eor=True)
2316
2317 # Check that the same data can still be received normally.
2318 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2319 self.assertEqual(msg, MSG)
2320 self.checkRecvmsgAddress(addr, self.cli_addr)
2321 self.assertEqual(ancdata, [])
2322 self.checkFlags(flags, eor=True)
2323
2324 @testRecvmsgPeek.client_skip
2325 def _testRecvmsgPeek(self):
2326 self.sendToServer(MSG)
2327
2328 @requireAttrs(socket.socket, "sendmsg")
2329 def testRecvmsgFromSendmsg(self):
2330 # Test receiving with recvmsg[_into]() when message is sent
2331 # using sendmsg().
2332 self.serv_sock.settimeout(self.fail_timeout)
2333 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2334 self.assertEqual(msg, MSG)
2335 self.checkRecvmsgAddress(addr, self.cli_addr)
2336 self.assertEqual(ancdata, [])
2337 self.checkFlags(flags, eor=True)
2338
2339 @testRecvmsgFromSendmsg.client_skip
2340 def _testRecvmsgFromSendmsg(self):
2341 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2342
2343
2344class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2345 # Tests which require a stream socket and can use either recvmsg()
2346 # or recvmsg_into().
2347
2348 def testRecvmsgEOF(self):
2349 # Receive end-of-stream indicator (b"", peer socket closed).
2350 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2351 self.assertEqual(msg, b"")
2352 self.checkRecvmsgAddress(addr, self.cli_addr)
2353 self.assertEqual(ancdata, [])
2354 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2355
2356 def _testRecvmsgEOF(self):
2357 self.cli_sock.close()
2358
2359 def testRecvmsgOverflow(self):
2360 # Receive a message in more than one chunk.
2361 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2362 len(MSG) - 3)
2363 self.checkRecvmsgAddress(addr, self.cli_addr)
2364 self.assertEqual(ancdata, [])
2365 self.checkFlags(flags, eor=False)
2366
2367 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2368 self.checkRecvmsgAddress(addr, self.cli_addr)
2369 self.assertEqual(ancdata, [])
2370 self.checkFlags(flags, eor=True)
2371
2372 msg = seg1 + seg2
2373 self.assertEqual(msg, MSG)
2374
2375 def _testRecvmsgOverflow(self):
2376 self.sendToServer(MSG)
2377
2378
2379class RecvmsgTests(RecvmsgGenericTests):
2380 # Tests for recvmsg() which can use any socket type.
2381
2382 def testRecvmsgBadArgs(self):
2383 # Check that recvmsg() rejects invalid arguments.
2384 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2385 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2386 -1, 0, 0)
2387 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2388 len(MSG), -1, 0)
2389 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2390 [bytearray(10)], 0, 0)
2391 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2392 object(), 0, 0)
2393 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2394 len(MSG), object(), 0)
2395 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2396 len(MSG), 0, object())
2397
2398 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2399 self.assertEqual(msg, MSG)
2400 self.checkRecvmsgAddress(addr, self.cli_addr)
2401 self.assertEqual(ancdata, [])
2402 self.checkFlags(flags, eor=True)
2403
2404 def _testRecvmsgBadArgs(self):
2405 self.sendToServer(MSG)
2406
2407
2408class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2409 # Tests for recvmsg_into() which can use any socket type.
2410
2411 def testRecvmsgIntoBadArgs(self):
2412 # Check that recvmsg_into() rejects invalid arguments.
2413 buf = bytearray(len(MSG))
2414 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2415 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2416 len(MSG), 0, 0)
2417 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2418 buf, 0, 0)
2419 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2420 [object()], 0, 0)
2421 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2422 [b"I'm not writable"], 0, 0)
2423 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2424 [buf, object()], 0, 0)
2425 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2426 [buf], -1, 0)
2427 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2428 [buf], object(), 0)
2429 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2430 [buf], 0, object())
2431
2432 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2433 self.assertEqual(nbytes, len(MSG))
2434 self.assertEqual(buf, bytearray(MSG))
2435 self.checkRecvmsgAddress(addr, self.cli_addr)
2436 self.assertEqual(ancdata, [])
2437 self.checkFlags(flags, eor=True)
2438
2439 def _testRecvmsgIntoBadArgs(self):
2440 self.sendToServer(MSG)
2441
2442 def testRecvmsgIntoGenerator(self):
2443 # Receive into buffer obtained from a generator (not a sequence).
2444 buf = bytearray(len(MSG))
2445 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2446 (o for o in [buf]))
2447 self.assertEqual(nbytes, len(MSG))
2448 self.assertEqual(buf, bytearray(MSG))
2449 self.checkRecvmsgAddress(addr, self.cli_addr)
2450 self.assertEqual(ancdata, [])
2451 self.checkFlags(flags, eor=True)
2452
2453 def _testRecvmsgIntoGenerator(self):
2454 self.sendToServer(MSG)
2455
2456 def testRecvmsgIntoArray(self):
2457 # Receive into an array rather than the usual bytearray.
2458 buf = array.array("B", [0] * len(MSG))
2459 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2460 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002461 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002462 self.checkRecvmsgAddress(addr, self.cli_addr)
2463 self.assertEqual(ancdata, [])
2464 self.checkFlags(flags, eor=True)
2465
2466 def _testRecvmsgIntoArray(self):
2467 self.sendToServer(MSG)
2468
2469 def testRecvmsgIntoScatter(self):
2470 # Receive into multiple buffers (scatter write).
2471 b1 = bytearray(b"----")
2472 b2 = bytearray(b"0123456789")
2473 b3 = bytearray(b"--------------")
2474 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2475 [b1, memoryview(b2)[2:9], b3])
2476 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2477 self.assertEqual(b1, bytearray(b"Mary"))
2478 self.assertEqual(b2, bytearray(b"01 had a 9"))
2479 self.assertEqual(b3, bytearray(b"little lamb---"))
2480 self.checkRecvmsgAddress(addr, self.cli_addr)
2481 self.assertEqual(ancdata, [])
2482 self.checkFlags(flags, eor=True)
2483
2484 def _testRecvmsgIntoScatter(self):
2485 self.sendToServer(b"Mary had a little lamb")
2486
2487
2488class CmsgMacroTests(unittest.TestCase):
2489 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2490 # assumptions used by sendmsg() and recvmsg[_into](), which share
2491 # code with these functions.
2492
2493 # Match the definition in socketmodule.c
2494 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2495
2496 @requireAttrs(socket, "CMSG_LEN")
2497 def testCMSG_LEN(self):
2498 # Test CMSG_LEN() with various valid and invalid values,
2499 # checking the assumptions used by recvmsg() and sendmsg().
2500 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2501 values = list(range(257)) + list(range(toobig - 257, toobig))
2502
2503 # struct cmsghdr has at least three members, two of which are ints
2504 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2505 for n in values:
2506 ret = socket.CMSG_LEN(n)
2507 # This is how recvmsg() calculates the data size
2508 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2509 self.assertLessEqual(ret, self.socklen_t_limit)
2510
2511 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2512 # sendmsg() shares code with these functions, and requires
2513 # that it reject values over the limit.
2514 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2515 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2516
2517 @requireAttrs(socket, "CMSG_SPACE")
2518 def testCMSG_SPACE(self):
2519 # Test CMSG_SPACE() with various valid and invalid values,
2520 # checking the assumptions used by sendmsg().
2521 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2522 values = list(range(257)) + list(range(toobig - 257, toobig))
2523
2524 last = socket.CMSG_SPACE(0)
2525 # struct cmsghdr has at least three members, two of which are ints
2526 self.assertGreater(last, array.array("i").itemsize * 2)
2527 for n in values:
2528 ret = socket.CMSG_SPACE(n)
2529 self.assertGreaterEqual(ret, last)
2530 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2531 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2532 self.assertLessEqual(ret, self.socklen_t_limit)
2533 last = ret
2534
2535 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2536 # sendmsg() shares code with these functions, and requires
2537 # that it reject values over the limit.
2538 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2539 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2540
2541
2542class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2543 # Tests for file descriptor passing on Unix-domain sockets.
2544
2545 # Invalid file descriptor value that's unlikely to evaluate to a
2546 # real FD even if one of its bytes is replaced with a different
2547 # value (which shouldn't actually happen).
2548 badfd = -0x5555
2549
2550 def newFDs(self, n):
2551 # Return a list of n file descriptors for newly-created files
2552 # containing their list indices as ASCII numbers.
2553 fds = []
2554 for i in range(n):
2555 fd, path = tempfile.mkstemp()
2556 self.addCleanup(os.unlink, path)
2557 self.addCleanup(os.close, fd)
2558 os.write(fd, str(i).encode())
2559 fds.append(fd)
2560 return fds
2561
2562 def checkFDs(self, fds):
2563 # Check that the file descriptors in the given list contain
2564 # their correct list indices as ASCII numbers.
2565 for n, fd in enumerate(fds):
2566 os.lseek(fd, 0, os.SEEK_SET)
2567 self.assertEqual(os.read(fd, 1024), str(n).encode())
2568
2569 def registerRecvmsgResult(self, result):
2570 self.addCleanup(self.closeRecvmsgFDs, result)
2571
2572 def closeRecvmsgFDs(self, recvmsg_result):
2573 # Close all file descriptors specified in the ancillary data
2574 # of the given return value from recvmsg() or recvmsg_into().
2575 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2576 if (cmsg_level == socket.SOL_SOCKET and
2577 cmsg_type == socket.SCM_RIGHTS):
2578 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002579 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002580 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2581 for fd in fds:
2582 os.close(fd)
2583
2584 def createAndSendFDs(self, n):
2585 # Send n new file descriptors created by newFDs() to the
2586 # server, with the constant MSG as the non-ancillary data.
2587 self.assertEqual(
2588 self.sendmsgToServer([MSG],
2589 [(socket.SOL_SOCKET,
2590 socket.SCM_RIGHTS,
2591 array.array("i", self.newFDs(n)))]),
2592 len(MSG))
2593
2594 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2595 # Check that constant MSG was received with numfds file
2596 # descriptors in a maximum of maxcmsgs control messages (which
2597 # must contain only complete integers). By default, check
2598 # that MSG_CTRUNC is unset, but ignore any flags in
2599 # ignoreflags.
2600 msg, ancdata, flags, addr = result
2601 self.assertEqual(msg, MSG)
2602 self.checkRecvmsgAddress(addr, self.cli_addr)
2603 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2604 ignore=ignoreflags)
2605
2606 self.assertIsInstance(ancdata, list)
2607 self.assertLessEqual(len(ancdata), maxcmsgs)
2608 fds = array.array("i")
2609 for item in ancdata:
2610 self.assertIsInstance(item, tuple)
2611 cmsg_level, cmsg_type, cmsg_data = item
2612 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2613 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2614 self.assertIsInstance(cmsg_data, bytes)
2615 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002616 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002617
2618 self.assertEqual(len(fds), numfds)
2619 self.checkFDs(fds)
2620
2621 def testFDPassSimple(self):
2622 # Pass a single FD (array read from bytes object).
2623 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2624 len(MSG), 10240))
2625
2626 def _testFDPassSimple(self):
2627 self.assertEqual(
2628 self.sendmsgToServer(
2629 [MSG],
2630 [(socket.SOL_SOCKET,
2631 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002632 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002633 len(MSG))
2634
2635 def testMultipleFDPass(self):
2636 # Pass multiple FDs in a single array.
2637 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2638 len(MSG), 10240))
2639
2640 def _testMultipleFDPass(self):
2641 self.createAndSendFDs(4)
2642
2643 @requireAttrs(socket, "CMSG_SPACE")
2644 def testFDPassCMSG_SPACE(self):
2645 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2646 self.checkRecvmsgFDs(
2647 4, self.doRecvmsg(self.serv_sock, len(MSG),
2648 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2649
2650 @testFDPassCMSG_SPACE.client_skip
2651 def _testFDPassCMSG_SPACE(self):
2652 self.createAndSendFDs(4)
2653
2654 def testFDPassCMSG_LEN(self):
2655 # Test using CMSG_LEN() to calculate ancillary buffer size.
2656 self.checkRecvmsgFDs(1,
2657 self.doRecvmsg(self.serv_sock, len(MSG),
2658 socket.CMSG_LEN(4 * SIZEOF_INT)),
2659 # RFC 3542 says implementations may set
2660 # MSG_CTRUNC if there isn't enough space
2661 # for trailing padding.
2662 ignoreflags=socket.MSG_CTRUNC)
2663
2664 def _testFDPassCMSG_LEN(self):
2665 self.createAndSendFDs(1)
2666
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002667 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002668 @requireAttrs(socket, "CMSG_SPACE")
2669 def testFDPassSeparate(self):
2670 # Pass two FDs in two separate arrays. Arrays may be combined
2671 # into a single control message by the OS.
2672 self.checkRecvmsgFDs(2,
2673 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2674 maxcmsgs=2)
2675
2676 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002677 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002678 def _testFDPassSeparate(self):
2679 fd0, fd1 = self.newFDs(2)
2680 self.assertEqual(
2681 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2682 socket.SCM_RIGHTS,
2683 array.array("i", [fd0])),
2684 (socket.SOL_SOCKET,
2685 socket.SCM_RIGHTS,
2686 array.array("i", [fd1]))]),
2687 len(MSG))
2688
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002689 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002690 @requireAttrs(socket, "CMSG_SPACE")
2691 def testFDPassSeparateMinSpace(self):
2692 # Pass two FDs in two separate arrays, receiving them into the
2693 # minimum space for two arrays.
2694 self.checkRecvmsgFDs(2,
2695 self.doRecvmsg(self.serv_sock, len(MSG),
2696 socket.CMSG_SPACE(SIZEOF_INT) +
2697 socket.CMSG_LEN(SIZEOF_INT)),
2698 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2699
2700 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002701 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002702 def _testFDPassSeparateMinSpace(self):
2703 fd0, fd1 = self.newFDs(2)
2704 self.assertEqual(
2705 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2706 socket.SCM_RIGHTS,
2707 array.array("i", [fd0])),
2708 (socket.SOL_SOCKET,
2709 socket.SCM_RIGHTS,
2710 array.array("i", [fd1]))]),
2711 len(MSG))
2712
2713 def sendAncillaryIfPossible(self, msg, ancdata):
2714 # Try to send msg and ancdata to server, but if the system
2715 # call fails, just send msg with no ancillary data.
2716 try:
2717 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002718 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002719 # Check that it was the system call that failed
2720 self.assertIsInstance(e.errno, int)
2721 nbytes = self.sendmsgToServer([msg])
2722 self.assertEqual(nbytes, len(msg))
2723
2724 def testFDPassEmpty(self):
2725 # Try to pass an empty FD array. Can receive either no array
2726 # or an empty array.
2727 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2728 len(MSG), 10240),
2729 ignoreflags=socket.MSG_CTRUNC)
2730
2731 def _testFDPassEmpty(self):
2732 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2733 socket.SCM_RIGHTS,
2734 b"")])
2735
2736 def testFDPassPartialInt(self):
2737 # Try to pass a truncated FD array.
2738 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2739 len(MSG), 10240)
2740 self.assertEqual(msg, MSG)
2741 self.checkRecvmsgAddress(addr, self.cli_addr)
2742 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2743 self.assertLessEqual(len(ancdata), 1)
2744 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2745 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2746 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2747 self.assertLess(len(cmsg_data), SIZEOF_INT)
2748
2749 def _testFDPassPartialInt(self):
2750 self.sendAncillaryIfPossible(
2751 MSG,
2752 [(socket.SOL_SOCKET,
2753 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002754 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002755
2756 @requireAttrs(socket, "CMSG_SPACE")
2757 def testFDPassPartialIntInMiddle(self):
2758 # Try to pass two FD arrays, the first of which is truncated.
2759 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2760 len(MSG), 10240)
2761 self.assertEqual(msg, MSG)
2762 self.checkRecvmsgAddress(addr, self.cli_addr)
2763 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2764 self.assertLessEqual(len(ancdata), 2)
2765 fds = array.array("i")
2766 # Arrays may have been combined in a single control message
2767 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2768 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2769 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002770 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002771 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2772 self.assertLessEqual(len(fds), 2)
2773 self.checkFDs(fds)
2774
2775 @testFDPassPartialIntInMiddle.client_skip
2776 def _testFDPassPartialIntInMiddle(self):
2777 fd0, fd1 = self.newFDs(2)
2778 self.sendAncillaryIfPossible(
2779 MSG,
2780 [(socket.SOL_SOCKET,
2781 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002782 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002783 (socket.SOL_SOCKET,
2784 socket.SCM_RIGHTS,
2785 array.array("i", [fd1]))])
2786
2787 def checkTruncatedHeader(self, result, ignoreflags=0):
2788 # Check that no ancillary data items are returned when data is
2789 # truncated inside the cmsghdr structure.
2790 msg, ancdata, flags, addr = result
2791 self.assertEqual(msg, MSG)
2792 self.checkRecvmsgAddress(addr, self.cli_addr)
2793 self.assertEqual(ancdata, [])
2794 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2795 ignore=ignoreflags)
2796
2797 def testCmsgTruncNoBufSize(self):
2798 # Check that no ancillary data is received when no buffer size
2799 # is specified.
2800 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2801 # BSD seems to set MSG_CTRUNC only
2802 # if an item has been partially
2803 # received.
2804 ignoreflags=socket.MSG_CTRUNC)
2805
2806 def _testCmsgTruncNoBufSize(self):
2807 self.createAndSendFDs(1)
2808
2809 def testCmsgTrunc0(self):
2810 # Check that no ancillary data is received when buffer size is 0.
2811 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2812 ignoreflags=socket.MSG_CTRUNC)
2813
2814 def _testCmsgTrunc0(self):
2815 self.createAndSendFDs(1)
2816
2817 # Check that no ancillary data is returned for various non-zero
2818 # (but still too small) buffer sizes.
2819
2820 def testCmsgTrunc1(self):
2821 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2822
2823 def _testCmsgTrunc1(self):
2824 self.createAndSendFDs(1)
2825
2826 def testCmsgTrunc2Int(self):
2827 # The cmsghdr structure has at least three members, two of
2828 # which are ints, so we still shouldn't see any ancillary
2829 # data.
2830 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2831 SIZEOF_INT * 2))
2832
2833 def _testCmsgTrunc2Int(self):
2834 self.createAndSendFDs(1)
2835
2836 def testCmsgTruncLen0Minus1(self):
2837 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2838 socket.CMSG_LEN(0) - 1))
2839
2840 def _testCmsgTruncLen0Minus1(self):
2841 self.createAndSendFDs(1)
2842
2843 # The following tests try to truncate the control message in the
2844 # middle of the FD array.
2845
2846 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2847 # Check that file descriptor data is truncated to between
2848 # mindata and maxdata bytes when received with buffer size
2849 # ancbuf, and that any complete file descriptor numbers are
2850 # valid.
2851 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2852 len(MSG), ancbuf)
2853 self.assertEqual(msg, MSG)
2854 self.checkRecvmsgAddress(addr, self.cli_addr)
2855 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2856
2857 if mindata == 0 and ancdata == []:
2858 return
2859 self.assertEqual(len(ancdata), 1)
2860 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2861 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2862 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2863 self.assertGreaterEqual(len(cmsg_data), mindata)
2864 self.assertLessEqual(len(cmsg_data), maxdata)
2865 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002866 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002867 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2868 self.checkFDs(fds)
2869
2870 def testCmsgTruncLen0(self):
2871 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2872
2873 def _testCmsgTruncLen0(self):
2874 self.createAndSendFDs(1)
2875
2876 def testCmsgTruncLen0Plus1(self):
2877 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2878
2879 def _testCmsgTruncLen0Plus1(self):
2880 self.createAndSendFDs(2)
2881
2882 def testCmsgTruncLen1(self):
2883 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2884 maxdata=SIZEOF_INT)
2885
2886 def _testCmsgTruncLen1(self):
2887 self.createAndSendFDs(2)
2888
2889 def testCmsgTruncLen2Minus1(self):
2890 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2891 maxdata=(2 * SIZEOF_INT) - 1)
2892
2893 def _testCmsgTruncLen2Minus1(self):
2894 self.createAndSendFDs(2)
2895
2896
2897class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2898 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2899 # features of the RFC 3542 Advanced Sockets API for IPv6.
2900 # Currently we can only handle certain data items (e.g. traffic
2901 # class, hop limit, MTU discovery and fragmentation settings)
2902 # without resorting to unportable means such as the struct module,
2903 # but the tests here are aimed at testing the ancillary data
2904 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2905 # itself.
2906
2907 # Test value to use when setting hop limit of packet
2908 hop_limit = 2
2909
2910 # Test value to use when setting traffic class of packet.
2911 # -1 means "use kernel default".
2912 traffic_class = -1
2913
2914 def ancillaryMapping(self, ancdata):
2915 # Given ancillary data list ancdata, return a mapping from
2916 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2917 # Check that no (level, type) pair appears more than once.
2918 d = {}
2919 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2920 self.assertNotIn((cmsg_level, cmsg_type), d)
2921 d[(cmsg_level, cmsg_type)] = cmsg_data
2922 return d
2923
2924 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2925 # Receive hop limit into ancbufsize bytes of ancillary data
2926 # space. Check that data is MSG, ancillary data is not
2927 # truncated (but ignore any flags in ignoreflags), and hop
2928 # limit is between 0 and maxhop inclusive.
2929 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2930 socket.IPV6_RECVHOPLIMIT, 1)
2931 self.misc_event.set()
2932 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2933 len(MSG), ancbufsize)
2934
2935 self.assertEqual(msg, MSG)
2936 self.checkRecvmsgAddress(addr, self.cli_addr)
2937 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2938 ignore=ignoreflags)
2939
2940 self.assertEqual(len(ancdata), 1)
2941 self.assertIsInstance(ancdata[0], tuple)
2942 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2943 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2944 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2945 self.assertIsInstance(cmsg_data, bytes)
2946 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2947 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002948 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002949 self.assertGreaterEqual(a[0], 0)
2950 self.assertLessEqual(a[0], maxhop)
2951
2952 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2953 def testRecvHopLimit(self):
2954 # Test receiving the packet hop limit as ancillary data.
2955 self.checkHopLimit(ancbufsize=10240)
2956
2957 @testRecvHopLimit.client_skip
2958 def _testRecvHopLimit(self):
2959 # Need to wait until server has asked to receive ancillary
2960 # data, as implementations are not required to buffer it
2961 # otherwise.
2962 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2963 self.sendToServer(MSG)
2964
2965 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2966 def testRecvHopLimitCMSG_SPACE(self):
2967 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2968 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2969
2970 @testRecvHopLimitCMSG_SPACE.client_skip
2971 def _testRecvHopLimitCMSG_SPACE(self):
2972 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2973 self.sendToServer(MSG)
2974
2975 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2976 # 3542 says portable applications must provide space for trailing
2977 # padding. Implementations may set MSG_CTRUNC if there isn't
2978 # enough space for the padding.
2979
2980 @requireAttrs(socket.socket, "sendmsg")
2981 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2982 def testSetHopLimit(self):
2983 # Test setting hop limit on outgoing packet and receiving it
2984 # at the other end.
2985 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2986
2987 @testSetHopLimit.client_skip
2988 def _testSetHopLimit(self):
2989 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2990 self.assertEqual(
2991 self.sendmsgToServer([MSG],
2992 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2993 array.array("i", [self.hop_limit]))]),
2994 len(MSG))
2995
2996 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2997 ignoreflags=0):
2998 # Receive traffic class and hop limit into ancbufsize bytes of
2999 # ancillary data space. Check that data is MSG, ancillary
3000 # data is not truncated (but ignore any flags in ignoreflags),
3001 # and traffic class and hop limit are in range (hop limit no
3002 # more than maxhop).
3003 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3004 socket.IPV6_RECVHOPLIMIT, 1)
3005 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3006 socket.IPV6_RECVTCLASS, 1)
3007 self.misc_event.set()
3008 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3009 len(MSG), ancbufsize)
3010
3011 self.assertEqual(msg, MSG)
3012 self.checkRecvmsgAddress(addr, self.cli_addr)
3013 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3014 ignore=ignoreflags)
3015 self.assertEqual(len(ancdata), 2)
3016 ancmap = self.ancillaryMapping(ancdata)
3017
3018 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3019 self.assertEqual(len(tcdata), SIZEOF_INT)
3020 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003021 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003022 self.assertGreaterEqual(a[0], 0)
3023 self.assertLessEqual(a[0], 255)
3024
3025 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3026 self.assertEqual(len(hldata), SIZEOF_INT)
3027 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003028 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003029 self.assertGreaterEqual(a[0], 0)
3030 self.assertLessEqual(a[0], maxhop)
3031
3032 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3033 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3034 def testRecvTrafficClassAndHopLimit(self):
3035 # Test receiving traffic class and hop limit as ancillary data.
3036 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3037
3038 @testRecvTrafficClassAndHopLimit.client_skip
3039 def _testRecvTrafficClassAndHopLimit(self):
3040 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3041 self.sendToServer(MSG)
3042
3043 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3044 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3045 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3046 # Test receiving traffic class and hop limit, using
3047 # CMSG_SPACE() to calculate buffer size.
3048 self.checkTrafficClassAndHopLimit(
3049 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3050
3051 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3052 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3053 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3054 self.sendToServer(MSG)
3055
3056 @requireAttrs(socket.socket, "sendmsg")
3057 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3058 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3059 def testSetTrafficClassAndHopLimit(self):
3060 # Test setting traffic class and hop limit on outgoing packet,
3061 # and receiving them at the other end.
3062 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3063 maxhop=self.hop_limit)
3064
3065 @testSetTrafficClassAndHopLimit.client_skip
3066 def _testSetTrafficClassAndHopLimit(self):
3067 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3068 self.assertEqual(
3069 self.sendmsgToServer([MSG],
3070 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3071 array.array("i", [self.traffic_class])),
3072 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3073 array.array("i", [self.hop_limit]))]),
3074 len(MSG))
3075
3076 @requireAttrs(socket.socket, "sendmsg")
3077 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3078 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3079 def testOddCmsgSize(self):
3080 # Try to send ancillary data with first item one byte too
3081 # long. Fall back to sending with correct size if this fails,
3082 # and check that second item was handled correctly.
3083 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3084 maxhop=self.hop_limit)
3085
3086 @testOddCmsgSize.client_skip
3087 def _testOddCmsgSize(self):
3088 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3089 try:
3090 nbytes = self.sendmsgToServer(
3091 [MSG],
3092 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003093 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003094 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3095 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003096 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003097 self.assertIsInstance(e.errno, int)
3098 nbytes = self.sendmsgToServer(
3099 [MSG],
3100 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3101 array.array("i", [self.traffic_class])),
3102 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3103 array.array("i", [self.hop_limit]))])
3104 self.assertEqual(nbytes, len(MSG))
3105
3106 # Tests for proper handling of truncated ancillary data
3107
3108 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3109 # Receive hop limit into ancbufsize bytes of ancillary data
3110 # space, which should be too small to contain the ancillary
3111 # data header (if ancbufsize is None, pass no second argument
3112 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3113 # (unless included in ignoreflags), and no ancillary data is
3114 # returned.
3115 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3116 socket.IPV6_RECVHOPLIMIT, 1)
3117 self.misc_event.set()
3118 args = () if ancbufsize is None else (ancbufsize,)
3119 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3120 len(MSG), *args)
3121
3122 self.assertEqual(msg, MSG)
3123 self.checkRecvmsgAddress(addr, self.cli_addr)
3124 self.assertEqual(ancdata, [])
3125 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3126 ignore=ignoreflags)
3127
3128 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3129 def testCmsgTruncNoBufSize(self):
3130 # Check that no ancillary data is received when no ancillary
3131 # buffer size is provided.
3132 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3133 # BSD seems to set
3134 # MSG_CTRUNC only if an item
3135 # has been partially
3136 # received.
3137 ignoreflags=socket.MSG_CTRUNC)
3138
3139 @testCmsgTruncNoBufSize.client_skip
3140 def _testCmsgTruncNoBufSize(self):
3141 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3142 self.sendToServer(MSG)
3143
3144 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3145 def testSingleCmsgTrunc0(self):
3146 # Check that no ancillary data is received when ancillary
3147 # buffer size is zero.
3148 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3149 ignoreflags=socket.MSG_CTRUNC)
3150
3151 @testSingleCmsgTrunc0.client_skip
3152 def _testSingleCmsgTrunc0(self):
3153 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3154 self.sendToServer(MSG)
3155
3156 # Check that no ancillary data is returned for various non-zero
3157 # (but still too small) buffer sizes.
3158
3159 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3160 def testSingleCmsgTrunc1(self):
3161 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3162
3163 @testSingleCmsgTrunc1.client_skip
3164 def _testSingleCmsgTrunc1(self):
3165 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3166 self.sendToServer(MSG)
3167
3168 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3169 def testSingleCmsgTrunc2Int(self):
3170 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3171
3172 @testSingleCmsgTrunc2Int.client_skip
3173 def _testSingleCmsgTrunc2Int(self):
3174 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3175 self.sendToServer(MSG)
3176
3177 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3178 def testSingleCmsgTruncLen0Minus1(self):
3179 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3180
3181 @testSingleCmsgTruncLen0Minus1.client_skip
3182 def _testSingleCmsgTruncLen0Minus1(self):
3183 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3184 self.sendToServer(MSG)
3185
3186 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3187 def testSingleCmsgTruncInData(self):
3188 # Test truncation of a control message inside its associated
3189 # data. The message may be returned with its data truncated,
3190 # or not returned at all.
3191 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3192 socket.IPV6_RECVHOPLIMIT, 1)
3193 self.misc_event.set()
3194 msg, ancdata, flags, addr = self.doRecvmsg(
3195 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3196
3197 self.assertEqual(msg, MSG)
3198 self.checkRecvmsgAddress(addr, self.cli_addr)
3199 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3200
3201 self.assertLessEqual(len(ancdata), 1)
3202 if ancdata:
3203 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3204 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3205 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3206 self.assertLess(len(cmsg_data), SIZEOF_INT)
3207
3208 @testSingleCmsgTruncInData.client_skip
3209 def _testSingleCmsgTruncInData(self):
3210 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3211 self.sendToServer(MSG)
3212
3213 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3214 # Receive traffic class and hop limit into ancbufsize bytes of
3215 # ancillary data space, which should be large enough to
3216 # contain the first item, but too small to contain the header
3217 # of the second. Check that data is MSG, MSG_CTRUNC is set
3218 # (unless included in ignoreflags), and only one ancillary
3219 # data item is returned.
3220 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3221 socket.IPV6_RECVHOPLIMIT, 1)
3222 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3223 socket.IPV6_RECVTCLASS, 1)
3224 self.misc_event.set()
3225 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3226 len(MSG), ancbufsize)
3227
3228 self.assertEqual(msg, MSG)
3229 self.checkRecvmsgAddress(addr, self.cli_addr)
3230 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3231 ignore=ignoreflags)
3232
3233 self.assertEqual(len(ancdata), 1)
3234 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3235 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3236 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3237 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3238 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003239 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003240 self.assertGreaterEqual(a[0], 0)
3241 self.assertLessEqual(a[0], 255)
3242
3243 # Try the above test with various buffer sizes.
3244
3245 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3246 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3247 def testSecondCmsgTrunc0(self):
3248 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3249 ignoreflags=socket.MSG_CTRUNC)
3250
3251 @testSecondCmsgTrunc0.client_skip
3252 def _testSecondCmsgTrunc0(self):
3253 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3254 self.sendToServer(MSG)
3255
3256 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3257 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3258 def testSecondCmsgTrunc1(self):
3259 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3260
3261 @testSecondCmsgTrunc1.client_skip
3262 def _testSecondCmsgTrunc1(self):
3263 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3264 self.sendToServer(MSG)
3265
3266 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3267 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3268 def testSecondCmsgTrunc2Int(self):
3269 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3270 2 * SIZEOF_INT)
3271
3272 @testSecondCmsgTrunc2Int.client_skip
3273 def _testSecondCmsgTrunc2Int(self):
3274 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3275 self.sendToServer(MSG)
3276
3277 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3278 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3279 def testSecondCmsgTruncLen0Minus1(self):
3280 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3281 socket.CMSG_LEN(0) - 1)
3282
3283 @testSecondCmsgTruncLen0Minus1.client_skip
3284 def _testSecondCmsgTruncLen0Minus1(self):
3285 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3286 self.sendToServer(MSG)
3287
3288 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3289 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3290 def testSecomdCmsgTruncInData(self):
3291 # Test truncation of the second of two control messages inside
3292 # its associated data.
3293 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3294 socket.IPV6_RECVHOPLIMIT, 1)
3295 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3296 socket.IPV6_RECVTCLASS, 1)
3297 self.misc_event.set()
3298 msg, ancdata, flags, addr = self.doRecvmsg(
3299 self.serv_sock, len(MSG),
3300 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3301
3302 self.assertEqual(msg, MSG)
3303 self.checkRecvmsgAddress(addr, self.cli_addr)
3304 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3305
3306 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3307
3308 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3309 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3310 cmsg_types.remove(cmsg_type)
3311 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3312 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003313 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003314 self.assertGreaterEqual(a[0], 0)
3315 self.assertLessEqual(a[0], 255)
3316
3317 if ancdata:
3318 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3319 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3320 cmsg_types.remove(cmsg_type)
3321 self.assertLess(len(cmsg_data), SIZEOF_INT)
3322
3323 self.assertEqual(ancdata, [])
3324
3325 @testSecomdCmsgTruncInData.client_skip
3326 def _testSecomdCmsgTruncInData(self):
3327 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3328 self.sendToServer(MSG)
3329
3330
3331# Derive concrete test classes for different socket types.
3332
3333class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3334 SendrecvmsgConnectionlessBase,
3335 ThreadedSocketTestMixin, UDPTestBase):
3336 pass
3337
3338@requireAttrs(socket.socket, "sendmsg")
3339@unittest.skipUnless(thread, 'Threading required for this test.')
3340class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3341 pass
3342
3343@requireAttrs(socket.socket, "recvmsg")
3344@unittest.skipUnless(thread, 'Threading required for this test.')
3345class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3346 pass
3347
3348@requireAttrs(socket.socket, "recvmsg_into")
3349@unittest.skipUnless(thread, 'Threading required for this test.')
3350class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3351 pass
3352
3353
3354class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3355 SendrecvmsgConnectionlessBase,
3356 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003357
3358 def checkRecvmsgAddress(self, addr1, addr2):
3359 # Called to compare the received address with the address of
3360 # the peer, ignoring scope ID
3361 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003362
3363@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003364@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003365@requireSocket("AF_INET6", "SOCK_DGRAM")
3366@unittest.skipUnless(thread, 'Threading required for this test.')
3367class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3368 pass
3369
3370@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003371@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003372@requireSocket("AF_INET6", "SOCK_DGRAM")
3373@unittest.skipUnless(thread, 'Threading required for this test.')
3374class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3375 pass
3376
3377@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003378@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003379@requireSocket("AF_INET6", "SOCK_DGRAM")
3380@unittest.skipUnless(thread, 'Threading required for this test.')
3381class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3382 pass
3383
3384@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003385@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003386@requireAttrs(socket, "IPPROTO_IPV6")
3387@requireSocket("AF_INET6", "SOCK_DGRAM")
3388@unittest.skipUnless(thread, 'Threading required for this test.')
3389class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3390 SendrecvmsgUDP6TestBase):
3391 pass
3392
3393@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003394@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003395@requireAttrs(socket, "IPPROTO_IPV6")
3396@requireSocket("AF_INET6", "SOCK_DGRAM")
3397@unittest.skipUnless(thread, 'Threading required for this test.')
3398class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3399 RFC3542AncillaryTest,
3400 SendrecvmsgUDP6TestBase):
3401 pass
3402
3403
3404class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3405 ConnectedStreamTestMixin, TCPTestBase):
3406 pass
3407
3408@requireAttrs(socket.socket, "sendmsg")
3409@unittest.skipUnless(thread, 'Threading required for this test.')
3410class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3411 pass
3412
3413@requireAttrs(socket.socket, "recvmsg")
3414@unittest.skipUnless(thread, 'Threading required for this test.')
3415class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3416 SendrecvmsgTCPTestBase):
3417 pass
3418
3419@requireAttrs(socket.socket, "recvmsg_into")
3420@unittest.skipUnless(thread, 'Threading required for this test.')
3421class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3422 SendrecvmsgTCPTestBase):
3423 pass
3424
3425
3426class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3427 SendrecvmsgConnectedBase,
3428 ConnectedStreamTestMixin, SCTPStreamBase):
3429 pass
3430
3431@requireAttrs(socket.socket, "sendmsg")
3432@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3433@unittest.skipUnless(thread, 'Threading required for this test.')
3434class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3435 pass
3436
3437@requireAttrs(socket.socket, "recvmsg")
3438@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3439@unittest.skipUnless(thread, 'Threading required for this test.')
3440class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3441 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003442
3443 def testRecvmsgEOF(self):
3444 try:
3445 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3446 except OSError as e:
3447 if e.errno != errno.ENOTCONN:
3448 raise
3449 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003450
3451@requireAttrs(socket.socket, "recvmsg_into")
3452@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3453@unittest.skipUnless(thread, 'Threading required for this test.')
3454class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3455 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003456
3457 def testRecvmsgEOF(self):
3458 try:
3459 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3460 except OSError as e:
3461 if e.errno != errno.ENOTCONN:
3462 raise
3463 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003464
3465
3466class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3467 ConnectedStreamTestMixin, UnixStreamBase):
3468 pass
3469
3470@requireAttrs(socket.socket, "sendmsg")
3471@requireAttrs(socket, "AF_UNIX")
3472@unittest.skipUnless(thread, 'Threading required for this test.')
3473class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3474 pass
3475
3476@requireAttrs(socket.socket, "recvmsg")
3477@requireAttrs(socket, "AF_UNIX")
3478@unittest.skipUnless(thread, 'Threading required for this test.')
3479class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3480 SendrecvmsgUnixStreamTestBase):
3481 pass
3482
3483@requireAttrs(socket.socket, "recvmsg_into")
3484@requireAttrs(socket, "AF_UNIX")
3485@unittest.skipUnless(thread, 'Threading required for this test.')
3486class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3487 SendrecvmsgUnixStreamTestBase):
3488 pass
3489
3490@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3491@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3492@unittest.skipUnless(thread, 'Threading required for this test.')
3493class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3494 pass
3495
3496@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3497@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3498@unittest.skipUnless(thread, 'Threading required for this test.')
3499class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3500 SendrecvmsgUnixStreamTestBase):
3501 pass
3502
3503
3504# Test interrupting the interruptible send/receive methods with a
3505# signal when a timeout is set. These tests avoid having multiple
3506# threads alive during the test so that the OS cannot deliver the
3507# signal to the wrong one.
3508
3509class InterruptedTimeoutBase(unittest.TestCase):
3510 # Base class for interrupted send/receive tests. Installs an
3511 # empty handler for SIGALRM and removes it on teardown, along with
3512 # any scheduled alarms.
3513
3514 def setUp(self):
3515 super().setUp()
3516 orig_alrm_handler = signal.signal(signal.SIGALRM,
3517 lambda signum, frame: None)
3518 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3519 self.addCleanup(self.setAlarm, 0)
3520
3521 # Timeout for socket operations
3522 timeout = 4.0
3523
3524 # Provide setAlarm() method to schedule delivery of SIGALRM after
3525 # given number of seconds, or cancel it if zero, and an
3526 # appropriate time value to use. Use setitimer() if available.
3527 if hasattr(signal, "setitimer"):
3528 alarm_time = 0.05
3529
3530 def setAlarm(self, seconds):
3531 signal.setitimer(signal.ITIMER_REAL, seconds)
3532 else:
3533 # Old systems may deliver the alarm up to one second early
3534 alarm_time = 2
3535
3536 def setAlarm(self, seconds):
3537 signal.alarm(seconds)
3538
3539
3540# Require siginterrupt() in order to ensure that system calls are
3541# interrupted by default.
3542@requireAttrs(signal, "siginterrupt")
3543@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3544 "Don't have signal.alarm or signal.setitimer")
3545class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3546 # Test interrupting the recv*() methods with signals when a
3547 # timeout is set.
3548
3549 def setUp(self):
3550 super().setUp()
3551 self.serv.settimeout(self.timeout)
3552
3553 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003554 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003555 # errno of EINTR when interrupted by a signal.
3556 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003557 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003558 func(*args, **kwargs)
3559 self.assertNotIsInstance(cm.exception, socket.timeout)
3560 self.assertEqual(cm.exception.errno, errno.EINTR)
3561
3562 def testInterruptedRecvTimeout(self):
3563 self.checkInterruptedRecv(self.serv.recv, 1024)
3564
3565 def testInterruptedRecvIntoTimeout(self):
3566 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3567
3568 def testInterruptedRecvfromTimeout(self):
3569 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3570
3571 def testInterruptedRecvfromIntoTimeout(self):
3572 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3573
3574 @requireAttrs(socket.socket, "recvmsg")
3575 def testInterruptedRecvmsgTimeout(self):
3576 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3577
3578 @requireAttrs(socket.socket, "recvmsg_into")
3579 def testInterruptedRecvmsgIntoTimeout(self):
3580 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3581
3582
3583# Require siginterrupt() in order to ensure that system calls are
3584# interrupted by default.
3585@requireAttrs(signal, "siginterrupt")
3586@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3587 "Don't have signal.alarm or signal.setitimer")
3588@unittest.skipUnless(thread, 'Threading required for this test.')
3589class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3590 ThreadSafeCleanupTestCase,
3591 SocketListeningTestMixin, TCPTestBase):
3592 # Test interrupting the interruptible send*() methods with signals
3593 # when a timeout is set.
3594
3595 def setUp(self):
3596 super().setUp()
3597 self.serv_conn = self.newSocket()
3598 self.addCleanup(self.serv_conn.close)
3599 # Use a thread to complete the connection, but wait for it to
3600 # terminate before running the test, so that there is only one
3601 # thread to accept the signal.
3602 cli_thread = threading.Thread(target=self.doConnect)
3603 cli_thread.start()
3604 self.cli_conn, addr = self.serv.accept()
3605 self.addCleanup(self.cli_conn.close)
3606 cli_thread.join()
3607 self.serv_conn.settimeout(self.timeout)
3608
3609 def doConnect(self):
3610 self.serv_conn.connect(self.serv_addr)
3611
3612 def checkInterruptedSend(self, func, *args, **kwargs):
3613 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003614 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003615 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003616 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003617 while True:
3618 self.setAlarm(self.alarm_time)
3619 func(*args, **kwargs)
3620 self.assertNotIsInstance(cm.exception, socket.timeout)
3621 self.assertEqual(cm.exception.errno, errno.EINTR)
3622
Nick Coghlan2496f332011-09-19 20:26:31 +10003623 # Issue #12958: The following tests have problems on Mac OS X
3624 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003625 def testInterruptedSendTimeout(self):
3626 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3627
Nick Coghlan2496f332011-09-19 20:26:31 +10003628 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003629 def testInterruptedSendtoTimeout(self):
3630 # Passing an actual address here as Python's wrapper for
3631 # sendto() doesn't allow passing a zero-length one; POSIX
3632 # requires that the address is ignored since the socket is
3633 # connection-mode, however.
3634 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3635 self.serv_addr)
3636
Nick Coghlan2496f332011-09-19 20:26:31 +10003637 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003638 @requireAttrs(socket.socket, "sendmsg")
3639 def testInterruptedSendmsgTimeout(self):
3640 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3641
3642
Victor Stinner45df8202010-04-28 22:31:17 +00003643@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003644class TCPCloserTest(ThreadedTCPSocketTest):
3645
3646 def testClose(self):
3647 conn, addr = self.serv.accept()
3648 conn.close()
3649
3650 sd = self.cli
3651 read, write, err = select.select([sd], [], [], 1.0)
3652 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003653 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003654
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003655 # Calling close() many times should be safe.
3656 conn.close()
3657 conn.close()
3658
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003659 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003660 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003661 time.sleep(1.0)
3662
Victor Stinner45df8202010-04-28 22:31:17 +00003663@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003664class BasicSocketPairTest(SocketPairTest):
3665
3666 def __init__(self, methodName='runTest'):
3667 SocketPairTest.__init__(self, methodName=methodName)
3668
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003669 def _check_defaults(self, sock):
3670 self.assertIsInstance(sock, socket.socket)
3671 if hasattr(socket, 'AF_UNIX'):
3672 self.assertEqual(sock.family, socket.AF_UNIX)
3673 else:
3674 self.assertEqual(sock.family, socket.AF_INET)
3675 self.assertEqual(sock.type, socket.SOCK_STREAM)
3676 self.assertEqual(sock.proto, 0)
3677
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003678 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003679 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003680
3681 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003682 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003683
Dave Cole331708b2004-08-09 04:51:41 +00003684 def testRecv(self):
3685 msg = self.serv.recv(1024)
3686 self.assertEqual(msg, MSG)
3687
3688 def _testRecv(self):
3689 self.cli.send(MSG)
3690
3691 def testSend(self):
3692 self.serv.send(MSG)
3693
3694 def _testSend(self):
3695 msg = self.cli.recv(1024)
3696 self.assertEqual(msg, MSG)
3697
Victor Stinner45df8202010-04-28 22:31:17 +00003698@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003699class NonBlockingTCPTests(ThreadedTCPSocketTest):
3700
3701 def __init__(self, methodName='runTest'):
3702 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3703
3704 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003705 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003706 self.serv.setblocking(True)
3707 self.assertIsNone(self.serv.gettimeout())
3708 self.serv.setblocking(False)
3709 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003710 start = time.time()
3711 try:
3712 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003713 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003714 pass
3715 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003716 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Serhiy Storchaka78980432013-01-15 01:12:17 +02003717 # Issue 15989
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003718 if _testcapi.UINT_MAX < _testcapi.ULONG_MAX:
3719 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3720 self.assertIsNone(self.serv.gettimeout())
Guido van Rossum24e4af82002-06-12 19:18:08 +00003721
3722 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003723 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003724
Antoine Pitroub1c54962010-10-14 15:05:38 +00003725 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003726 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003727 def testInitNonBlocking(self):
3728 # reinit server socket
3729 self.serv.close()
3730 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003731 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003732 self.port = support.bind_port(self.serv)
3733 self.serv.listen(1)
3734 # actual testing
3735 start = time.time()
3736 try:
3737 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003738 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003739 pass
3740 end = time.time()
3741 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3742
3743 def _testInitNonBlocking(self):
3744 pass
3745
Antoine Pitrou600232b2011-01-05 21:03:42 +00003746 def testInheritFlags(self):
3747 # Issue #7995: when calling accept() on a listening socket with a
3748 # timeout, the resulting socket should not be non-blocking.
3749 self.serv.settimeout(10)
3750 try:
3751 conn, addr = self.serv.accept()
3752 message = conn.recv(len(MSG))
3753 finally:
3754 conn.close()
3755 self.serv.settimeout(None)
3756
3757 def _testInheritFlags(self):
3758 time.sleep(0.1)
3759 self.cli.connect((HOST, self.port))
3760 time.sleep(0.5)
3761 self.cli.send(MSG)
3762
Guido van Rossum24e4af82002-06-12 19:18:08 +00003763 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003764 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003765 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003766 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003767 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003768 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003769 pass
3770 else:
3771 self.fail("Error trying to do non-blocking accept.")
3772 read, write, err = select.select([self.serv], [], [])
3773 if self.serv in read:
3774 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003775 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003776 else:
3777 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003778
Guido van Rossum24e4af82002-06-12 19:18:08 +00003779 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003780 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003781 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003782
3783 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003784 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003785 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003786 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003787
3788 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003789 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003790 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003791
3792 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003793 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003794 conn, addr = self.serv.accept()
3795 conn.setblocking(0)
3796 try:
3797 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003798 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003799 pass
3800 else:
3801 self.fail("Error trying to do non-blocking recv.")
3802 read, write, err = select.select([conn], [], [])
3803 if conn in read:
3804 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003805 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003806 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003807 else:
3808 self.fail("Error during select call to non-blocking socket.")
3809
3810 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003811 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003812 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003813 self.cli.send(MSG)
3814
Victor Stinner45df8202010-04-28 22:31:17 +00003815@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003816class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003817 """Unit tests for the object returned by socket.makefile()
3818
Antoine Pitrou834bd812010-10-13 16:17:14 +00003819 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003820 the client connection. You can read from this file to
3821 get output from the server.
3822
Antoine Pitrou834bd812010-10-13 16:17:14 +00003823 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003824 server connection. You can write to this file to send output
3825 to the client.
3826 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003827
Guido van Rossume9f66142002-08-07 15:46:19 +00003828 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003829 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003830 errors = 'strict'
3831 newline = None
3832
3833 read_mode = 'rb'
3834 read_msg = MSG
3835 write_mode = 'wb'
3836 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003837
Guido van Rossum24e4af82002-06-12 19:18:08 +00003838 def __init__(self, methodName='runTest'):
3839 SocketConnectedTest.__init__(self, methodName=methodName)
3840
3841 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003842 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3843 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003844 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003845 self.read_file = self.cli_conn.makefile(
3846 self.read_mode, self.bufsize,
3847 encoding = self.encoding,
3848 errors = self.errors,
3849 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003850
3851 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003852 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003853 self.read_file.close()
3854 self.assertTrue(self.read_file.closed)
3855 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003856 SocketConnectedTest.tearDown(self)
3857
3858 def clientSetUp(self):
3859 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003860 self.write_file = self.serv_conn.makefile(
3861 self.write_mode, self.bufsize,
3862 encoding = self.encoding,
3863 errors = self.errors,
3864 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003865
3866 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003867 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003868 self.write_file.close()
3869 self.assertTrue(self.write_file.closed)
3870 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003871 SocketConnectedTest.clientTearDown(self)
3872
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003873 def testReadAfterTimeout(self):
3874 # Issue #7322: A file object must disallow further reads
3875 # after a timeout has occurred.
3876 self.cli_conn.settimeout(1)
3877 self.read_file.read(3)
3878 # First read raises a timeout
3879 self.assertRaises(socket.timeout, self.read_file.read, 1)
3880 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003881 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003882 self.read_file.read(1)
3883 self.assertIn("cannot read from timed out object", str(ctx.exception))
3884
3885 def _testReadAfterTimeout(self):
3886 self.write_file.write(self.write_msg[0:3])
3887 self.write_file.flush()
3888 self.serv_finished.wait()
3889
Guido van Rossum24e4af82002-06-12 19:18:08 +00003890 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003891 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003892 first_seg = self.read_file.read(len(self.read_msg)-3)
3893 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003894 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003895 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003896
3897 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003898 self.write_file.write(self.write_msg)
3899 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003900
Guido van Rossum8c943832002-08-08 01:00:28 +00003901 def testFullRead(self):
3902 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003903 msg = self.read_file.read()
3904 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003905
3906 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003907 self.write_file.write(self.write_msg)
3908 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003909
Guido van Rossum24e4af82002-06-12 19:18:08 +00003910 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003911 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003912 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003913 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003914 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003915 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003916 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003917 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003918 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003919
3920 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003921 self.write_file.write(self.write_msg)
3922 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003923
3924 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003925 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003926 line = self.read_file.readline()
3927 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003928
3929 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003930 self.write_file.write(self.write_msg)
3931 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003932
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003933 def testCloseAfterMakefile(self):
3934 # The file returned by makefile should keep the socket open.
3935 self.cli_conn.close()
3936 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003937 msg = self.read_file.read()
3938 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003939
3940 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003941 self.write_file.write(self.write_msg)
3942 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003943
3944 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003945 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003946 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003947 if isinstance(self.read_msg, str):
3948 msg = msg.decode()
3949 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003950
3951 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003952 self.write_file.write(self.write_msg)
3953 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003954
Tim Peters116d83c2004-03-28 02:20:45 +00003955 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003956 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003957
3958 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003959 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003960
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003961 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003962 self.assertEqual(self.read_file.mode, self.read_mode)
3963 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003964
3965 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003966 self.assertEqual(self.write_file.mode, self.write_mode)
3967 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003968
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003969 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003970 self.read_file.close()
3971 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003972 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003973 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003974
3975 def _testRealClose(self):
3976 pass
3977
3978
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003979class FileObjectInterruptedTestCase(unittest.TestCase):
3980 """Test that the file object correctly handles EINTR internally."""
3981
3982 class MockSocket(object):
3983 def __init__(self, recv_funcs=()):
3984 # A generator that returns callables that we'll call for each
3985 # call to recv().
3986 self._recv_step = iter(recv_funcs)
3987
3988 def recv_into(self, buffer):
3989 data = next(self._recv_step)()
3990 assert len(buffer) >= len(data)
3991 buffer[:len(data)] = data
3992 return len(data)
3993
3994 def _decref_socketios(self):
3995 pass
3996
3997 def _textiowrap_for_test(self, buffering=-1):
3998 raw = socket.SocketIO(self, "r")
3999 if buffering < 0:
4000 buffering = io.DEFAULT_BUFFER_SIZE
4001 if buffering == 0:
4002 return raw
4003 buffer = io.BufferedReader(raw, buffering)
4004 text = io.TextIOWrapper(buffer, None, None)
4005 text.mode = "rb"
4006 return text
4007
4008 @staticmethod
4009 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02004010 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004011
4012 def _textiowrap_mock_socket(self, mock, buffering=-1):
4013 raw = socket.SocketIO(mock, "r")
4014 if buffering < 0:
4015 buffering = io.DEFAULT_BUFFER_SIZE
4016 if buffering == 0:
4017 return raw
4018 buffer = io.BufferedReader(raw, buffering)
4019 text = io.TextIOWrapper(buffer, None, None)
4020 text.mode = "rb"
4021 return text
4022
4023 def _test_readline(self, size=-1, buffering=-1):
4024 mock_sock = self.MockSocket(recv_funcs=[
4025 lambda : b"This is the first line\nAnd the sec",
4026 self._raise_eintr,
4027 lambda : b"ond line is here\n",
4028 lambda : b"",
4029 lambda : b"", # XXX(gps): io library does an extra EOF read
4030 ])
4031 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004032 self.assertEqual(fo.readline(size), "This is the first line\n")
4033 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004034
4035 def _test_read(self, size=-1, buffering=-1):
4036 mock_sock = self.MockSocket(recv_funcs=[
4037 lambda : b"This is the first line\nAnd the sec",
4038 self._raise_eintr,
4039 lambda : b"ond line is here\n",
4040 lambda : b"",
4041 lambda : b"", # XXX(gps): io library does an extra EOF read
4042 ])
4043 expecting = (b"This is the first line\n"
4044 b"And the second line is here\n")
4045 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4046 if buffering == 0:
4047 data = b''
4048 else:
4049 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004050 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004051 while len(data) != len(expecting):
4052 part = fo.read(size)
4053 if not part:
4054 break
4055 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004056 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004057
4058 def test_default(self):
4059 self._test_readline()
4060 self._test_readline(size=100)
4061 self._test_read()
4062 self._test_read(size=100)
4063
4064 def test_with_1k_buffer(self):
4065 self._test_readline(buffering=1024)
4066 self._test_readline(size=100, buffering=1024)
4067 self._test_read(buffering=1024)
4068 self._test_read(size=100, buffering=1024)
4069
4070 def _test_readline_no_buffer(self, size=-1):
4071 mock_sock = self.MockSocket(recv_funcs=[
4072 lambda : b"a",
4073 lambda : b"\n",
4074 lambda : b"B",
4075 self._raise_eintr,
4076 lambda : b"b",
4077 lambda : b"",
4078 ])
4079 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004080 self.assertEqual(fo.readline(size), b"a\n")
4081 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004082
4083 def test_no_buffer(self):
4084 self._test_readline_no_buffer()
4085 self._test_readline_no_buffer(size=4)
4086 self._test_read(buffering=0)
4087 self._test_read(size=100, buffering=0)
4088
4089
Guido van Rossume9f66142002-08-07 15:46:19 +00004090class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4091
4092 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004093
Guido van Rossume9f66142002-08-07 15:46:19 +00004094 In this case (and in this case only), it should be possible to
4095 create a file object, read a line from it, create another file
4096 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004097 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004098 when reading multiple requests from the same socket."""
4099
4100 bufsize = 0 # Use unbuffered mode
4101
4102 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004103 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004104 line = self.read_file.readline() # first line
4105 self.assertEqual(line, b"A. " + self.write_msg) # first line
4106 self.read_file = self.cli_conn.makefile('rb', 0)
4107 line = self.read_file.readline() # second line
4108 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004109
4110 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004111 self.write_file.write(b"A. " + self.write_msg)
4112 self.write_file.write(b"B. " + self.write_msg)
4113 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004114
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004115 def testMakefileClose(self):
4116 # The file returned by makefile should keep the socket open...
4117 self.cli_conn.close()
4118 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004119 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004120 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004121 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004122 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004123
4124 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004125 self.write_file.write(self.write_msg)
4126 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004127
4128 def testMakefileCloseSocketDestroy(self):
4129 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004130 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004131 refcount_after = sys.getrefcount(self.cli_conn)
4132 self.assertEqual(refcount_before - 1, refcount_after)
4133
4134 def _testMakefileCloseSocketDestroy(self):
4135 pass
4136
Antoine Pitrou98b46702010-09-18 22:59:00 +00004137 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004138 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004139 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4140
4141 def testSmallReadNonBlocking(self):
4142 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004143 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4144 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004145 self.evt1.set()
4146 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004147 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004148 if first_seg is None:
4149 # Data not arrived (can happen under Windows), wait a bit
4150 time.sleep(0.5)
4151 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004152 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004153 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004154 self.assertEqual(n, 3)
4155 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004156 self.assertEqual(msg, self.read_msg)
4157 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4158 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004159
4160 def _testSmallReadNonBlocking(self):
4161 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004162 self.write_file.write(self.write_msg)
4163 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004164 self.evt2.set()
4165 # Avoid cloding the socket before the server test has finished,
4166 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4167 self.serv_finished.wait(5.0)
4168
4169 def testWriteNonBlocking(self):
4170 self.cli_finished.wait(5.0)
4171 # The client thread can't skip directly - the SkipTest exception
4172 # would appear as a failure.
4173 if self.serv_skipped:
4174 self.skipTest(self.serv_skipped)
4175
4176 def _testWriteNonBlocking(self):
4177 self.serv_skipped = None
4178 self.serv_conn.setblocking(False)
4179 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004180 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004181 LIMIT = 10
4182 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004183 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004184 self.assertGreater(n, 0)
4185 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004186 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004187 if n is None:
4188 # Succeeded
4189 break
4190 self.assertGreater(n, 0)
4191 else:
4192 # Let us know that this test didn't manage to establish
4193 # the expected conditions. This is not a failure in itself but,
4194 # if it happens repeatedly, the test should be fixed.
4195 self.serv_skipped = "failed to saturate the socket buffer"
4196
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004197
Guido van Rossum8c943832002-08-08 01:00:28 +00004198class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4199
4200 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4201
4202
4203class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4204
4205 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004206
Thomas Woutersb2137042007-02-01 18:02:27 +00004207
Antoine Pitrou834bd812010-10-13 16:17:14 +00004208class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4209 """Tests for socket.makefile() in text mode (rather than binary)"""
4210
4211 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004212 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004213 write_mode = 'wb'
4214 write_msg = MSG
4215 newline = ''
4216
4217
4218class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4219 """Tests for socket.makefile() in text mode (rather than binary)"""
4220
4221 read_mode = 'rb'
4222 read_msg = MSG
4223 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004224 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004225 newline = ''
4226
4227
4228class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4229 """Tests for socket.makefile() in text mode (rather than binary)"""
4230
4231 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004232 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004233 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004234 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004235 newline = ''
4236
4237
Guido van Rossumd8faa362007-04-27 19:54:29 +00004238class NetworkConnectionTest(object):
4239 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004240
Guido van Rossumd8faa362007-04-27 19:54:29 +00004241 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004242 # We're inherited below by BasicTCPTest2, which also inherits
4243 # BasicTCPTest, which defines self.port referenced below.
4244 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004245 self.serv_conn = self.cli
4246
4247class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4248 """Tests that NetworkConnection does not break existing TCP functionality.
4249 """
4250
4251class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004252
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004253 class MockSocket(socket.socket):
4254 def connect(self, *args):
4255 raise socket.timeout('timed out')
4256
4257 @contextlib.contextmanager
4258 def mocked_socket_module(self):
4259 """Return a socket which times out on connect"""
4260 old_socket = socket.socket
4261 socket.socket = self.MockSocket
4262 try:
4263 yield
4264 finally:
4265 socket.socket = old_socket
4266
4267 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004268 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004269 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004270 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004271 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004272 cli.connect((HOST, port))
4273 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4274
4275 def test_create_connection(self):
4276 # Issue #9792: errors raised by create_connection() should have
4277 # a proper errno attribute.
4278 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004279 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004280 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004281
4282 # Issue #16257: create_connection() calls getaddrinfo() against
4283 # 'localhost'. This may result in an IPV6 addr being returned
4284 # as well as an IPV4 one:
4285 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4286 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4287 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4288 #
4289 # create_connection() enumerates through all the addresses returned
4290 # and if it doesn't successfully bind to any of them, it propagates
4291 # the last exception it encountered.
4292 #
4293 # On Solaris, ENETUNREACH is returned in this circumstance instead
4294 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4295 # expected errnos.
4296 expected_errnos = [ errno.ECONNREFUSED, ]
4297 if hasattr(errno, 'ENETUNREACH'):
4298 expected_errnos.append(errno.ENETUNREACH)
4299
4300 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004301
4302 def test_create_connection_timeout(self):
4303 # Issue #9792: create_connection() should not recast timeout errors
4304 # as generic socket errors.
4305 with self.mocked_socket_module():
4306 with self.assertRaises(socket.timeout):
4307 socket.create_connection((HOST, 1234))
4308
Guido van Rossumd8faa362007-04-27 19:54:29 +00004309
Victor Stinner45df8202010-04-28 22:31:17 +00004310@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004311class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4312
4313 def __init__(self, methodName='runTest'):
4314 SocketTCPTest.__init__(self, methodName=methodName)
4315 ThreadableTest.__init__(self)
4316
4317 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004318 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004319
4320 def clientTearDown(self):
4321 self.cli.close()
4322 self.cli = None
4323 ThreadableTest.clientTearDown(self)
4324
4325 def _justAccept(self):
4326 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004327 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004328
4329 testFamily = _justAccept
4330 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004331 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004332 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004333 self.assertEqual(self.cli.family, 2)
4334
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004335 testSourceAddress = _justAccept
4336 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004337 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4338 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004339 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004340 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004341 # The port number being used is sufficient to show that the bind()
4342 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004343
Guido van Rossumd8faa362007-04-27 19:54:29 +00004344 testTimeoutDefault = _justAccept
4345 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004346 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004347 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004348 socket.setdefaulttimeout(42)
4349 try:
4350 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004351 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004352 finally:
4353 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004354 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004355
4356 testTimeoutNone = _justAccept
4357 def _testTimeoutNone(self):
4358 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004359 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004360 socket.setdefaulttimeout(30)
4361 try:
4362 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004363 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004364 finally:
4365 socket.setdefaulttimeout(None)
4366 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004367
4368 testTimeoutValueNamed = _justAccept
4369 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004370 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004371 self.assertEqual(self.cli.gettimeout(), 30)
4372
4373 testTimeoutValueNonamed = _justAccept
4374 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004375 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004376 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004377 self.assertEqual(self.cli.gettimeout(), 30)
4378
Victor Stinner45df8202010-04-28 22:31:17 +00004379@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004380class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4381
4382 def __init__(self, methodName='runTest'):
4383 SocketTCPTest.__init__(self, methodName=methodName)
4384 ThreadableTest.__init__(self)
4385
4386 def clientSetUp(self):
4387 pass
4388
4389 def clientTearDown(self):
4390 self.cli.close()
4391 self.cli = None
4392 ThreadableTest.clientTearDown(self)
4393
4394 def testInsideTimeout(self):
4395 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004396 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004397 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004398 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004399 testOutsideTimeout = testInsideTimeout
4400
4401 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004402 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004403 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004404 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004405
4406 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004407 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004408 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004409
4410
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004411class TCPTimeoutTest(SocketTCPTest):
4412
4413 def testTCPTimeout(self):
4414 def raise_timeout(*args, **kwargs):
4415 self.serv.settimeout(1.0)
4416 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004417 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004418 "Error generating a timeout exception (TCP)")
4419
4420 def testTimeoutZero(self):
4421 ok = False
4422 try:
4423 self.serv.settimeout(0.0)
4424 foo = self.serv.accept()
4425 except socket.timeout:
4426 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004427 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004428 ok = True
4429 except:
4430 self.fail("caught unexpected exception (TCP)")
4431 if not ok:
4432 self.fail("accept() returned success when we did not expect it")
4433
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004434 def testInterruptedTimeout(self):
4435 # XXX I don't know how to do this test on MSWindows or any other
4436 # plaform that doesn't support signal.alarm() or os.kill(), though
4437 # the bug should have existed on all platforms.
4438 if not hasattr(signal, "alarm"):
4439 return # can only test on *nix
4440 self.serv.settimeout(5.0) # must be longer than alarm
4441 class Alarm(Exception):
4442 pass
4443 def alarm_handler(signal, frame):
4444 raise Alarm
4445 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4446 try:
4447 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4448 try:
4449 foo = self.serv.accept()
4450 except socket.timeout:
4451 self.fail("caught timeout instead of Alarm")
4452 except Alarm:
4453 pass
4454 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004455 self.fail("caught other exception instead of Alarm:"
4456 " %s(%s):\n%s" %
4457 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004458 else:
4459 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004460 finally:
4461 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004462 except Alarm:
4463 self.fail("got Alarm in wrong place")
4464 finally:
4465 # no alarm can be pending. Safe to restore old handler.
4466 signal.signal(signal.SIGALRM, old_alarm)
4467
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004468class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004469
4470 def testUDPTimeout(self):
4471 def raise_timeout(*args, **kwargs):
4472 self.serv.settimeout(1.0)
4473 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004474 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004475 "Error generating a timeout exception (UDP)")
4476
4477 def testTimeoutZero(self):
4478 ok = False
4479 try:
4480 self.serv.settimeout(0.0)
4481 foo = self.serv.recv(1024)
4482 except socket.timeout:
4483 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004484 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004485 ok = True
4486 except:
4487 self.fail("caught unexpected exception (UDP)")
4488 if not ok:
4489 self.fail("recv() returned success when we did not expect it")
4490
4491class TestExceptions(unittest.TestCase):
4492
4493 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004494 self.assertTrue(issubclass(OSError, Exception))
4495 self.assertTrue(issubclass(socket.herror, OSError))
4496 self.assertTrue(issubclass(socket.gaierror, OSError))
4497 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004498
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004499class TestLinuxAbstractNamespace(unittest.TestCase):
4500
4501 UNIX_PATH_MAX = 108
4502
4503 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004504 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004505 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4506 s1.bind(address)
4507 s1.listen(1)
4508 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4509 s2.connect(s1.getsockname())
4510 with s1.accept()[0] as s3:
4511 self.assertEqual(s1.getsockname(), address)
4512 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004513
4514 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004515 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004516 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4517 s.bind(address)
4518 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004519
4520 def testNameOverflow(self):
4521 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004522 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004523 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004524
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004525 def testStrName(self):
4526 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004527 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4528 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004529 s.bind("\x00python\x00test\x00")
4530 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004531 finally:
4532 s.close()
4533
4534class TestUnixDomain(unittest.TestCase):
4535
4536 def setUp(self):
4537 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4538
4539 def tearDown(self):
4540 self.sock.close()
4541
4542 def encoded(self, path):
4543 # Return the given path encoded in the file system encoding,
4544 # or skip the test if this is not possible.
4545 try:
4546 return os.fsencode(path)
4547 except UnicodeEncodeError:
4548 self.skipTest(
4549 "Pathname {0!a} cannot be represented in file "
4550 "system encoding {1!r}".format(
4551 path, sys.getfilesystemencoding()))
4552
Antoine Pitrou16374872011-12-16 15:04:12 +01004553 def bind(self, sock, path):
4554 # Bind the socket
4555 try:
4556 sock.bind(path)
4557 except OSError as e:
4558 if str(e) == "AF_UNIX path too long":
4559 self.skipTest(
4560 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4561 .format(path))
4562 else:
4563 raise
4564
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004565 def testStrAddr(self):
4566 # Test binding to and retrieving a normal string pathname.
4567 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004568 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004569 self.addCleanup(support.unlink, path)
4570 self.assertEqual(self.sock.getsockname(), path)
4571
4572 def testBytesAddr(self):
4573 # Test binding to a bytes pathname.
4574 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004575 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004576 self.addCleanup(support.unlink, path)
4577 self.assertEqual(self.sock.getsockname(), path)
4578
4579 def testSurrogateescapeBind(self):
4580 # Test binding to a valid non-ASCII pathname, with the
4581 # non-ASCII bytes supplied using surrogateescape encoding.
4582 path = os.path.abspath(support.TESTFN_UNICODE)
4583 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004584 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004585 self.addCleanup(support.unlink, path)
4586 self.assertEqual(self.sock.getsockname(), path)
4587
4588 def testUnencodableAddr(self):
4589 # Test binding to a pathname that cannot be encoded in the
4590 # file system encoding.
4591 if support.TESTFN_UNENCODABLE is None:
4592 self.skipTest("No unencodable filename available")
4593 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004594 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004595 self.addCleanup(support.unlink, path)
4596 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004597
Victor Stinner45df8202010-04-28 22:31:17 +00004598@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004599class BufferIOTest(SocketConnectedTest):
4600 """
4601 Test the buffer versions of socket.recv() and socket.send().
4602 """
4603 def __init__(self, methodName='runTest'):
4604 SocketConnectedTest.__init__(self, methodName=methodName)
4605
Antoine Pitrou25480782010-03-17 22:50:28 +00004606 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004607 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004608 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004609 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004610 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004611 self.assertEqual(msg, MSG)
4612
Antoine Pitrou25480782010-03-17 22:50:28 +00004613 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004614 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004615 self.serv_conn.send(buf)
4616
Antoine Pitrou25480782010-03-17 22:50:28 +00004617 def testRecvIntoBytearray(self):
4618 buf = bytearray(1024)
4619 nbytes = self.cli_conn.recv_into(buf)
4620 self.assertEqual(nbytes, len(MSG))
4621 msg = buf[:len(MSG)]
4622 self.assertEqual(msg, MSG)
4623
4624 _testRecvIntoBytearray = _testRecvIntoArray
4625
4626 def testRecvIntoMemoryview(self):
4627 buf = bytearray(1024)
4628 nbytes = self.cli_conn.recv_into(memoryview(buf))
4629 self.assertEqual(nbytes, len(MSG))
4630 msg = buf[:len(MSG)]
4631 self.assertEqual(msg, MSG)
4632
4633 _testRecvIntoMemoryview = _testRecvIntoArray
4634
4635 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004636 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004637 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004638 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004639 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004640 self.assertEqual(msg, MSG)
4641
Antoine Pitrou25480782010-03-17 22:50:28 +00004642 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004643 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004644 self.serv_conn.send(buf)
4645
Antoine Pitrou25480782010-03-17 22:50:28 +00004646 def testRecvFromIntoBytearray(self):
4647 buf = bytearray(1024)
4648 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4649 self.assertEqual(nbytes, len(MSG))
4650 msg = buf[:len(MSG)]
4651 self.assertEqual(msg, MSG)
4652
4653 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4654
4655 def testRecvFromIntoMemoryview(self):
4656 buf = bytearray(1024)
4657 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4658 self.assertEqual(nbytes, len(MSG))
4659 msg = buf[:len(MSG)]
4660 self.assertEqual(msg, MSG)
4661
4662 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4663
Christian Heimes043d6f62008-01-07 17:19:16 +00004664
4665TIPC_STYPE = 2000
4666TIPC_LOWER = 200
4667TIPC_UPPER = 210
4668
4669def isTipcAvailable():
4670 """Check if the TIPC module is loaded
4671
4672 The TIPC module is not loaded automatically on Ubuntu and probably
4673 other Linux distros.
4674 """
4675 if not hasattr(socket, "AF_TIPC"):
4676 return False
4677 if not os.path.isfile("/proc/modules"):
4678 return False
4679 with open("/proc/modules") as f:
4680 for line in f:
4681 if line.startswith("tipc "):
4682 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004683 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004684 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4685 return False
4686
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004687class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004688 def testRDM(self):
4689 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4690 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004691 self.addCleanup(srv.close)
4692 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004693
4694 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4695 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4696 TIPC_LOWER, TIPC_UPPER)
4697 srv.bind(srvaddr)
4698
4699 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4700 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4701 cli.sendto(MSG, sendaddr)
4702
4703 msg, recvaddr = srv.recvfrom(1024)
4704
4705 self.assertEqual(cli.getsockname(), recvaddr)
4706 self.assertEqual(msg, MSG)
4707
4708
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004709class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004710 def __init__(self, methodName = 'runTest'):
4711 unittest.TestCase.__init__(self, methodName = methodName)
4712 ThreadableTest.__init__(self)
4713
4714 def setUp(self):
4715 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004716 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004717 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4718 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4719 TIPC_LOWER, TIPC_UPPER)
4720 self.srv.bind(srvaddr)
4721 self.srv.listen(5)
4722 self.serverExplicitReady()
4723 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004724 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004725
4726 def clientSetUp(self):
4727 # The is a hittable race between serverExplicitReady() and the
4728 # accept() call; sleep a little while to avoid it, otherwise
4729 # we could get an exception
4730 time.sleep(0.1)
4731 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004732 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004733 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4734 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4735 self.cli.connect(addr)
4736 self.cliaddr = self.cli.getsockname()
4737
4738 def testStream(self):
4739 msg = self.conn.recv(1024)
4740 self.assertEqual(msg, MSG)
4741 self.assertEqual(self.cliaddr, self.connaddr)
4742
4743 def _testStream(self):
4744 self.cli.send(MSG)
4745 self.cli.close()
4746
4747
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004748@unittest.skipUnless(thread, 'Threading required for this test.')
4749class ContextManagersTest(ThreadedTCPSocketTest):
4750
4751 def _testSocketClass(self):
4752 # base test
4753 with socket.socket() as sock:
4754 self.assertFalse(sock._closed)
4755 self.assertTrue(sock._closed)
4756 # close inside with block
4757 with socket.socket() as sock:
4758 sock.close()
4759 self.assertTrue(sock._closed)
4760 # exception inside with block
4761 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004762 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004763 self.assertTrue(sock._closed)
4764
4765 def testCreateConnectionBase(self):
4766 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004767 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004768 data = conn.recv(1024)
4769 conn.sendall(data)
4770
4771 def _testCreateConnectionBase(self):
4772 address = self.serv.getsockname()
4773 with socket.create_connection(address) as sock:
4774 self.assertFalse(sock._closed)
4775 sock.sendall(b'foo')
4776 self.assertEqual(sock.recv(1024), b'foo')
4777 self.assertTrue(sock._closed)
4778
4779 def testCreateConnectionClose(self):
4780 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004781 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004782 data = conn.recv(1024)
4783 conn.sendall(data)
4784
4785 def _testCreateConnectionClose(self):
4786 address = self.serv.getsockname()
4787 with socket.create_connection(address) as sock:
4788 sock.close()
4789 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004790 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004791
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004792
Victor Stinnerdaf45552013-08-28 00:53:59 +02004793class InheritanceTest(unittest.TestCase):
4794 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4795 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004796 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004797 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004798 with socket.socket(socket.AF_INET,
4799 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4800 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004801 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004802
4803 def test_default_inheritable(self):
4804 sock = socket.socket()
4805 with sock:
4806 self.assertEqual(sock.get_inheritable(), False)
4807
4808 def test_dup(self):
4809 sock = socket.socket()
4810 with sock:
4811 newsock = sock.dup()
4812 sock.close()
4813 with newsock:
4814 self.assertEqual(newsock.get_inheritable(), False)
4815
4816 def test_set_inheritable(self):
4817 sock = socket.socket()
4818 with sock:
4819 sock.set_inheritable(True)
4820 self.assertEqual(sock.get_inheritable(), True)
4821
4822 sock.set_inheritable(False)
4823 self.assertEqual(sock.get_inheritable(), False)
4824
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004825 @unittest.skipIf(fcntl is None, "need fcntl")
4826 def test_get_inheritable_cloexec(self):
4827 sock = socket.socket()
4828 with sock:
4829 fd = sock.fileno()
4830 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004831
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004832 # clear FD_CLOEXEC flag
4833 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4834 flags &= ~fcntl.FD_CLOEXEC
4835 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004836
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004837 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004838
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004839 @unittest.skipIf(fcntl is None, "need fcntl")
4840 def test_set_inheritable_cloexec(self):
4841 sock = socket.socket()
4842 with sock:
4843 fd = sock.fileno()
4844 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4845 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004846
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004847 sock.set_inheritable(True)
4848 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4849 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004850
4851
Victor Stinnerdaf45552013-08-28 00:53:59 +02004852 @unittest.skipUnless(hasattr(socket, "socketpair"),
4853 "need socket.socketpair()")
4854 def test_socketpair(self):
4855 s1, s2 = socket.socketpair()
4856 self.addCleanup(s1.close)
4857 self.addCleanup(s2.close)
4858 self.assertEqual(s1.get_inheritable(), False)
4859 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004860
4861
4862@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4863 "SOCK_NONBLOCK not defined")
4864class NonblockConstantTest(unittest.TestCase):
4865 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4866 if nonblock:
4867 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4868 self.assertEqual(s.gettimeout(), timeout)
4869 else:
4870 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4871 self.assertEqual(s.gettimeout(), None)
4872
Charles-François Natali239bb962011-06-03 12:55:15 +02004873 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004874 def test_SOCK_NONBLOCK(self):
4875 # a lot of it seems silly and redundant, but I wanted to test that
4876 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004877 with socket.socket(socket.AF_INET,
4878 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4879 self.checkNonblock(s)
4880 s.setblocking(1)
4881 self.checkNonblock(s, False)
4882 s.setblocking(0)
4883 self.checkNonblock(s)
4884 s.settimeout(None)
4885 self.checkNonblock(s, False)
4886 s.settimeout(2.0)
4887 self.checkNonblock(s, timeout=2.0)
4888 s.setblocking(1)
4889 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004890 # defaulttimeout
4891 t = socket.getdefaulttimeout()
4892 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004893 with socket.socket() as s:
4894 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004895 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004896 with socket.socket() as s:
4897 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004898 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004899 with socket.socket() as s:
4900 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004901 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004902 with socket.socket() as s:
4903 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004904 socket.setdefaulttimeout(t)
4905
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004906
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004907@unittest.skipUnless(os.name == "nt", "Windows specific")
4908@unittest.skipUnless(multiprocessing, "need multiprocessing")
4909class TestSocketSharing(SocketTCPTest):
4910 # This must be classmethod and not staticmethod or multiprocessing
4911 # won't be able to bootstrap it.
4912 @classmethod
4913 def remoteProcessServer(cls, q):
4914 # Recreate socket from shared data
4915 sdata = q.get()
4916 message = q.get()
4917
4918 s = socket.fromshare(sdata)
4919 s2, c = s.accept()
4920
4921 # Send the message
4922 s2.sendall(message)
4923 s2.close()
4924 s.close()
4925
4926 def testShare(self):
4927 # Transfer the listening server socket to another process
4928 # and service it from there.
4929
4930 # Create process:
4931 q = multiprocessing.Queue()
4932 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4933 p.start()
4934
4935 # Get the shared socket data
4936 data = self.serv.share(p.pid)
4937
4938 # Pass the shared socket to the other process
4939 addr = self.serv.getsockname()
4940 self.serv.close()
4941 q.put(data)
4942
4943 # The data that the server will send us
4944 message = b"slapmahfro"
4945 q.put(message)
4946
4947 # Connect
4948 s = socket.create_connection(addr)
4949 # listen for the data
4950 m = []
4951 while True:
4952 data = s.recv(100)
4953 if not data:
4954 break
4955 m.append(data)
4956 s.close()
4957 received = b"".join(m)
4958 self.assertEqual(received, message)
4959 p.join()
4960
4961 def testShareLength(self):
4962 data = self.serv.share(os.getpid())
4963 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4964 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4965
4966 def compareSockets(self, org, other):
4967 # socket sharing is expected to work only for blocking socket
4968 # since the internal python timout value isn't transfered.
4969 self.assertEqual(org.gettimeout(), None)
4970 self.assertEqual(org.gettimeout(), other.gettimeout())
4971
4972 self.assertEqual(org.family, other.family)
4973 self.assertEqual(org.type, other.type)
4974 # If the user specified "0" for proto, then
4975 # internally windows will have picked the correct value.
4976 # Python introspection on the socket however will still return
4977 # 0. For the shared socket, the python value is recreated
4978 # from the actual value, so it may not compare correctly.
4979 if org.proto != 0:
4980 self.assertEqual(org.proto, other.proto)
4981
4982 def testShareLocal(self):
4983 data = self.serv.share(os.getpid())
4984 s = socket.fromshare(data)
4985 try:
4986 self.compareSockets(self.serv, s)
4987 finally:
4988 s.close()
4989
4990 def testTypes(self):
4991 families = [socket.AF_INET, socket.AF_INET6]
4992 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4993 for f in families:
4994 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00004995 try:
4996 source = socket.socket(f, t)
4997 except OSError:
4998 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004999 try:
5000 data = source.share(os.getpid())
5001 shared = socket.fromshare(data)
5002 try:
5003 self.compareSockets(source, shared)
5004 finally:
5005 shared.close()
5006 finally:
5007 source.close()
5008
5009
Guido van Rossumb995eb72002-07-31 16:08:40 +00005010def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005011 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005012 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005013
5014 tests.extend([
5015 NonBlockingTCPTests,
5016 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005017 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00005018 UnbufferedFileObjectClassTestCase,
5019 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005020 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005021 UnicodeReadFileObjectClassTestCase,
5022 UnicodeWriteFileObjectClassTestCase,
5023 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005024 NetworkConnectionNoServer,
5025 NetworkConnectionAttributesTest,
5026 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005027 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005028 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005029 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005030 ])
Dave Cole331708b2004-08-09 04:51:41 +00005031 if hasattr(socket, "socketpair"):
5032 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005033 if hasattr(socket, "AF_UNIX"):
5034 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02005035 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005036 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00005037 if isTipcAvailable():
5038 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00005039 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02005040 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005041 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005042 tests.extend([
5043 CmsgMacroTests,
5044 SendmsgUDPTest,
5045 RecvmsgUDPTest,
5046 RecvmsgIntoUDPTest,
5047 SendmsgUDP6Test,
5048 RecvmsgUDP6Test,
5049 RecvmsgRFC3542AncillaryUDP6Test,
5050 RecvmsgIntoRFC3542AncillaryUDP6Test,
5051 RecvmsgIntoUDP6Test,
5052 SendmsgTCPTest,
5053 RecvmsgTCPTest,
5054 RecvmsgIntoTCPTest,
5055 SendmsgSCTPStreamTest,
5056 RecvmsgSCTPStreamTest,
5057 RecvmsgIntoSCTPStreamTest,
5058 SendmsgUnixStreamTest,
5059 RecvmsgUnixStreamTest,
5060 RecvmsgIntoUnixStreamTest,
5061 RecvmsgSCMRightsStreamTest,
5062 RecvmsgIntoSCMRightsStreamTest,
5063 # These are slow when setitimer() is not available
5064 InterruptedRecvTimeoutTest,
5065 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005066 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005067 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005068
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005069 thread_info = support.threading_setup()
5070 support.run_unittest(*tests)
5071 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005072
5073if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005074 test_main()