blob: beff31a7f5932eeae8680b1540a53a7a8672694e [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
Serhiy Storchaka43767632013-11-03 21:31:38 +0200820 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
821 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000822 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000823 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200824 try:
825 # On some versions, this loses a reference
826 orig = sys.getrefcount(__name__)
827 socket.getnameinfo(__name__,0)
828 except TypeError:
829 if sys.getrefcount(__name__) != orig:
830 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000831
Guido van Rossum24e4af82002-06-12 19:18:08 +0000832 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000833 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000834 try:
835 # On some versions, this crashes the interpreter.
836 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200837 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000838 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000839
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000840 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000841 # This just checks that htons etc. are their own inverse,
842 # when looking at the lower 16 or 32 bits.
843 sizes = {socket.htonl: 32, socket.ntohl: 32,
844 socket.htons: 16, socket.ntohs: 16}
845 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000846 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000847 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
848 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000849
Guido van Rossuma2627af2002-09-14 00:58:46 +0000850 swapped = func(mask)
851 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000852 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000853
Guido van Rossum018919a2007-01-15 00:07:32 +0000854 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000855 good_values = [ 1, 2, 3, 1, 2, 3 ]
856 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000857 for k in good_values:
858 socket.ntohl(k)
859 socket.ntohs(k)
860 socket.htonl(k)
861 socket.htons(k)
862 for k in bad_values:
863 self.assertRaises(OverflowError, socket.ntohl, k)
864 self.assertRaises(OverflowError, socket.ntohs, k)
865 self.assertRaises(OverflowError, socket.htonl, k)
866 self.assertRaises(OverflowError, socket.htons, k)
867
Barry Warsaw11b91a02004-06-28 00:50:43 +0000868 def testGetServBy(self):
869 eq = self.assertEqual
870 # Find one service that exists, then check all the related interfaces.
871 # I've ordered this by protocols that have both a tcp and udp
872 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200873 if (sys.platform.startswith(('freebsd', 'netbsd'))
874 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000875 # avoid the 'echo' service on this platform, as there is an
876 # assumption breaking non-standard port/protocol entry
877 services = ('daytime', 'qotd', 'domain')
878 else:
879 services = ('echo', 'daytime', 'domain')
880 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000881 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000882 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000883 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200884 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000885 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000886 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200887 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000888 # Try same call with optional protocol omitted
889 port2 = socket.getservbyname(service)
890 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400891 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000892 try:
893 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200894 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000895 udpport = None
896 else:
897 eq(udpport, port)
898 # Now make sure the lookup by port returns the same service name
899 eq(socket.getservbyport(port2), service)
900 eq(socket.getservbyport(port, 'tcp'), service)
901 if udpport is not None:
902 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000903 # Make sure getservbyport does not accept out of range ports.
904 self.assertRaises(OverflowError, socket.getservbyport, -1)
905 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000906
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000907 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000908 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000909 # The default timeout should initially be None
910 self.assertEqual(socket.getdefaulttimeout(), None)
911 s = socket.socket()
912 self.assertEqual(s.gettimeout(), None)
913 s.close()
914
915 # Set the default timeout to 10, and see if it propagates
916 socket.setdefaulttimeout(10)
917 self.assertEqual(socket.getdefaulttimeout(), 10)
918 s = socket.socket()
919 self.assertEqual(s.gettimeout(), 10)
920 s.close()
921
922 # Reset the default timeout to None, and see if it propagates
923 socket.setdefaulttimeout(None)
924 self.assertEqual(socket.getdefaulttimeout(), None)
925 s = socket.socket()
926 self.assertEqual(s.gettimeout(), None)
927 s.close()
928
929 # Check that setting it to an invalid value raises ValueError
930 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
931
932 # Check that setting it to an invalid type raises TypeError
933 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
934
Serhiy Storchaka43767632013-11-03 21:31:38 +0200935 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
936 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000937 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000938 # Test that issue1008086 and issue767150 are fixed.
939 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000940 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
941 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000942
Serhiy Storchaka43767632013-11-03 21:31:38 +0200943 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
944 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000945 def testIPv4toString(self):
946 from socket import inet_aton as f, inet_pton, AF_INET
947 g = lambda a: inet_pton(AF_INET, a)
948
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100949 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200950 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100951 )
952
Ezio Melottib3aedd42010-11-20 19:04:17 +0000953 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
954 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
955 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
956 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
957 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100958 assertInvalid(f, '0.0.0.')
959 assertInvalid(f, '300.0.0.0')
960 assertInvalid(f, 'a.0.0.0')
961 assertInvalid(f, '1.2.3.4.5')
962 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000963
Ezio Melottib3aedd42010-11-20 19:04:17 +0000964 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
965 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
966 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
967 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100968 assertInvalid(g, '0.0.0.')
969 assertInvalid(g, '300.0.0.0')
970 assertInvalid(g, 'a.0.0.0')
971 assertInvalid(g, '1.2.3.4.5')
972 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000973
Serhiy Storchaka43767632013-11-03 21:31:38 +0200974 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
975 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000976 def testIPv6toString(self):
977 try:
978 from socket import inet_pton, AF_INET6, has_ipv6
979 if not has_ipv6:
980 return
981 except ImportError:
982 return
983 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100984 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200985 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100986 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000987
Ezio Melottib3aedd42010-11-20 19:04:17 +0000988 self.assertEqual(b'\x00' * 16, f('::'))
989 self.assertEqual(b'\x00' * 16, f('0::0'))
990 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
991 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000992 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 +0000993 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
994 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100995 self.assertEqual(
996 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
997 f('ad42:abc::127:0:254:2')
998 )
999 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1000 assertInvalid('0x20::')
1001 assertInvalid(':::')
1002 assertInvalid('::0::')
1003 assertInvalid('1::abc::')
1004 assertInvalid('1::abc::def')
1005 assertInvalid('1:2:3:4:5:6:')
1006 assertInvalid('1:2:3:4:5:6')
1007 assertInvalid('1:2:3:4:5:6:7:8:')
1008 assertInvalid('1:2:3:4:5:6:7:8:0')
1009
1010 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1011 f('::254.42.23.64')
1012 )
1013 self.assertEqual(
1014 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1015 f('42::a29b:254.42.23.64')
1016 )
1017 self.assertEqual(
1018 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1019 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1020 )
1021 assertInvalid('255.254.253.252')
1022 assertInvalid('1::260.2.3.0')
1023 assertInvalid('1::0.be.e.0')
1024 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1025 assertInvalid('::1.2.3.4:0')
1026 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001027
Serhiy Storchaka43767632013-11-03 21:31:38 +02001028 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1029 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001030 def testStringToIPv4(self):
1031 from socket import inet_ntoa as f, inet_ntop, AF_INET
1032 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001033 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001034 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001035 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001036
Ezio Melottib3aedd42010-11-20 19:04:17 +00001037 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1038 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1039 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1040 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001041 assertInvalid(f, b'\x00' * 3)
1042 assertInvalid(f, b'\x00' * 5)
1043 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +00001044
Ezio Melottib3aedd42010-11-20 19:04:17 +00001045 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1046 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1047 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001048 assertInvalid(g, b'\x00' * 3)
1049 assertInvalid(g, b'\x00' * 5)
1050 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001051
Serhiy Storchaka43767632013-11-03 21:31:38 +02001052 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1053 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001054 def testStringToIPv6(self):
1055 try:
1056 from socket import inet_ntop, AF_INET6, has_ipv6
1057 if not has_ipv6:
1058 return
1059 except ImportError:
1060 return
1061 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001062 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001063 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001064 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001065
Ezio Melottib3aedd42010-11-20 19:04:17 +00001066 self.assertEqual('::', f(b'\x00' * 16))
1067 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1068 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001069 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001070 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 +00001071 )
1072
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001073 assertInvalid(b'\x12' * 15)
1074 assertInvalid(b'\x12' * 17)
1075 assertInvalid(b'\x12' * 4)
1076
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001077 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001078
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001079 def testSockName(self):
1080 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001081 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001082 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001083 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001084 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001085 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001086 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1087 # it reasonable to get the host's addr in addition to 0.0.0.0.
1088 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001089 try:
1090 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001091 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001092 # Probably name lookup wasn't set up right; skip this test
1093 return
Benjamin Peterson577473f2010-01-19 00:09:57 +00001094 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001095 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001096
1097 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001098 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001099 # We know a socket should start without reuse==0
1100 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001101 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001102 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001103 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001104
1105 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001106 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001107 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001108 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001109 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1110 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001111 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001112
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001113 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001114 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001115 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1116 sock.settimeout(1)
1117 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001118 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001119
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001120 def testNewAttributes(self):
1121 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001122
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001123 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1124 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001125 if hasattr(socket, 'SOCK_CLOEXEC'):
1126 self.assertIn(sock.type,
1127 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1128 socket.SOCK_STREAM))
1129 else:
1130 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001131 self.assertEqual(sock.proto, 0)
1132 sock.close()
1133
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001134 def test_getsockaddrarg(self):
1135 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001136 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001137 big_port = port + 65536
1138 neg_port = port - 65536
1139 sock = socket.socket()
1140 try:
1141 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1142 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1143 sock.bind((host, port))
1144 finally:
1145 sock.close()
1146
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001147 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001148 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001149 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1150 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1151 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1152 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001153 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1154 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001155 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001156 self.assertRaises(ValueError, s.ioctl, -1, None)
1157 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001158
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001159 def testGetaddrinfo(self):
1160 try:
1161 socket.getaddrinfo('localhost', 80)
1162 except socket.gaierror as err:
1163 if err.errno == socket.EAI_SERVICE:
1164 # see http://bugs.python.org/issue1282647
1165 self.skipTest("buggy libc version")
1166 raise
1167 # len of every sequence is supposed to be == 5
1168 for info in socket.getaddrinfo(HOST, None):
1169 self.assertEqual(len(info), 5)
1170 # host can be a domain name, a string representation of an
1171 # IPv4/v6 address or None
1172 socket.getaddrinfo('localhost', 80)
1173 socket.getaddrinfo('127.0.0.1', 80)
1174 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001175 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001176 socket.getaddrinfo('::1', 80)
1177 # port can be a string service name such as "http", a numeric
1178 # port number or None
1179 socket.getaddrinfo(HOST, "http")
1180 socket.getaddrinfo(HOST, 80)
1181 socket.getaddrinfo(HOST, None)
1182 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001183 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1184 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001185 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001186 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1187 self.assertEqual(type, socket.SOCK_STREAM)
1188 self.assertEqual(str(type), 'SocketType.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001189 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1190 for _, socktype, _, _, _ in infos:
1191 self.assertEqual(socktype, socket.SOCK_STREAM)
1192 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001193 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001194 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1195 # a server willing to support both IPv4 and IPv6 will
1196 # usually do this
1197 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1198 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001199 # test keyword arguments
1200 a = socket.getaddrinfo(HOST, None)
1201 b = socket.getaddrinfo(host=HOST, port=None)
1202 self.assertEqual(a, b)
1203 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1204 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1205 self.assertEqual(a, b)
1206 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1207 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1208 self.assertEqual(a, b)
1209 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1210 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1211 self.assertEqual(a, b)
1212 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1213 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1214 self.assertEqual(a, b)
1215 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1216 socket.AI_PASSIVE)
1217 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1218 type=socket.SOCK_STREAM, proto=0,
1219 flags=socket.AI_PASSIVE)
1220 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001221 # Issue #6697.
1222 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001223
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001224 # Issue 17269
Ronald Oussorena822d3662013-06-10 10:36:28 +02001225 if hasattr(socket, 'AI_NUMERICSERV'):
1226 socket.getaddrinfo("localhost", None, 0, 0, 0, socket.AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001227
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001228 def test_getnameinfo(self):
1229 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001230 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001231
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001232 @unittest.skipUnless(support.is_resource_enabled('network'),
1233 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001234 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001235 # Check for internet access before running test (issue #12804).
1236 try:
1237 socket.gethostbyname('python.org')
1238 except socket.gaierror as e:
1239 if e.errno == socket.EAI_NODATA:
1240 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001241 # these should all be successful
1242 socket.gethostbyname('испытание.python.org')
1243 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001244 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1245 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1246 # have a reverse entry yet
1247 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001248
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001249 def check_sendall_interrupted(self, with_timeout):
1250 # socketpair() is not stricly required, but it makes things easier.
1251 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1252 self.skipTest("signal.alarm and socket.socketpair required for this test")
1253 # Our signal handlers clobber the C errno by calling a math function
1254 # with an invalid domain value.
1255 def ok_handler(*args):
1256 self.assertRaises(ValueError, math.acosh, 0)
1257 def raising_handler(*args):
1258 self.assertRaises(ValueError, math.acosh, 0)
1259 1 // 0
1260 c, s = socket.socketpair()
1261 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1262 try:
1263 if with_timeout:
1264 # Just above the one second minimum for signal.alarm
1265 c.settimeout(1.5)
1266 with self.assertRaises(ZeroDivisionError):
1267 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001268 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001269 if with_timeout:
1270 signal.signal(signal.SIGALRM, ok_handler)
1271 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001272 self.assertRaises(socket.timeout, c.sendall,
1273 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001274 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001275 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001276 signal.signal(signal.SIGALRM, old_alarm)
1277 c.close()
1278 s.close()
1279
1280 def test_sendall_interrupted(self):
1281 self.check_sendall_interrupted(False)
1282
1283 def test_sendall_interrupted_with_timeout(self):
1284 self.check_sendall_interrupted(True)
1285
Antoine Pitroue033e062010-10-29 10:38:18 +00001286 def test_dealloc_warn(self):
1287 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1288 r = repr(sock)
1289 with self.assertWarns(ResourceWarning) as cm:
1290 sock = None
1291 support.gc_collect()
1292 self.assertIn(r, str(cm.warning.args[0]))
1293 # An open socket file object gets dereferenced after the socket
1294 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1295 f = sock.makefile('rb')
1296 r = repr(sock)
1297 sock = None
1298 support.gc_collect()
1299 with self.assertWarns(ResourceWarning):
1300 f = None
1301 support.gc_collect()
1302
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001303 def test_name_closed_socketio(self):
1304 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1305 fp = sock.makefile("rb")
1306 fp.close()
1307 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1308
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001309 def test_unusable_closed_socketio(self):
1310 with socket.socket() as sock:
1311 fp = sock.makefile("rb", buffering=0)
1312 self.assertTrue(fp.readable())
1313 self.assertFalse(fp.writable())
1314 self.assertFalse(fp.seekable())
1315 fp.close()
1316 self.assertRaises(ValueError, fp.readable)
1317 self.assertRaises(ValueError, fp.writable)
1318 self.assertRaises(ValueError, fp.seekable)
1319
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001320 def test_pickle(self):
1321 sock = socket.socket()
1322 with sock:
1323 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1324 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1325
Serhiy Storchaka78980432013-01-15 01:12:17 +02001326 def test_listen_backlog(self):
1327 for backlog in 0, -1:
1328 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1329 srv.bind((HOST, 0))
1330 srv.listen(backlog)
1331 srv.close()
1332
1333 # Issue 15989
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001334 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1335 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001336 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001337 srv.close()
1338
Charles-François Natali42663332012-01-02 15:57:30 +01001339 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001340 def test_flowinfo(self):
1341 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001342 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001343 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001344 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001345
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001346 def test_str_for_enums(self):
1347 # Make sure that the AF_* and SOCK_* constants have enum-like string
1348 # reprs.
1349 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1350 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
1351 self.assertEqual(str(s.type), 'SocketType.SOCK_STREAM')
1352
1353 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1354 def test_uknown_socket_family_repr(self):
1355 # Test that when created with a family that's not one of the known
1356 # AF_*/SOCK_* constants, socket.family just returns the number.
1357 #
1358 # To do this we fool socket.socket into believing it already has an
1359 # open fd because on this path it doesn't actually verify the family and
1360 # type and populates the socket object.
1361 #
1362 # On Windows this trick won't work, so the test is skipped.
1363 fd, _ = tempfile.mkstemp()
1364 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1365 self.assertEqual(s.family, 42424)
1366 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001367
Charles-François Natali47413c12011-10-06 19:47:44 +02001368@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1369class BasicCANTest(unittest.TestCase):
1370
1371 def testCrucialConstants(self):
1372 socket.AF_CAN
1373 socket.PF_CAN
1374 socket.CAN_RAW
1375
Charles-François Natali773e42d2013-02-05 19:42:01 +01001376 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1377 'socket.CAN_BCM required for this test.')
1378 def testBCMConstants(self):
1379 socket.CAN_BCM
1380
1381 # opcodes
1382 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1383 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1384 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1385 socket.CAN_BCM_TX_SEND # send one CAN frame
1386 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1387 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1388 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1389 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1390 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1391 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1392 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1393 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1394
Charles-François Natali47413c12011-10-06 19:47:44 +02001395 def testCreateSocket(self):
1396 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1397 pass
1398
Charles-François Natali773e42d2013-02-05 19:42:01 +01001399 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1400 'socket.CAN_BCM required for this test.')
1401 def testCreateBCMSocket(self):
1402 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1403 pass
1404
Charles-François Natali47413c12011-10-06 19:47:44 +02001405 def testBindAny(self):
1406 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1407 s.bind(('', ))
1408
1409 def testTooLongInterfaceName(self):
1410 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1411 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001412 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001413 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001414
1415 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1416 'socket.CAN_RAW_LOOPBACK required for this test.')
1417 def testLoopback(self):
1418 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1419 for loopback in (0, 1):
1420 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1421 loopback)
1422 self.assertEqual(loopback,
1423 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1424
1425 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1426 'socket.CAN_RAW_FILTER required for this test.')
1427 def testFilter(self):
1428 can_id, can_mask = 0x200, 0x700
1429 can_filter = struct.pack("=II", can_id, can_mask)
1430 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1431 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1432 self.assertEqual(can_filter,
1433 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1434
1435
1436@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001437class CANTest(ThreadedCANSocketTest):
1438
Charles-François Natali47413c12011-10-06 19:47:44 +02001439 def __init__(self, methodName='runTest'):
1440 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1441
1442 @classmethod
1443 def build_can_frame(cls, can_id, data):
1444 """Build a CAN frame."""
1445 can_dlc = len(data)
1446 data = data.ljust(8, b'\x00')
1447 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1448
1449 @classmethod
1450 def dissect_can_frame(cls, frame):
1451 """Dissect a CAN frame."""
1452 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1453 return (can_id, can_dlc, data[:can_dlc])
1454
1455 def testSendFrame(self):
1456 cf, addr = self.s.recvfrom(self.bufsize)
1457 self.assertEqual(self.cf, cf)
1458 self.assertEqual(addr[0], self.interface)
1459 self.assertEqual(addr[1], socket.AF_CAN)
1460
1461 def _testSendFrame(self):
1462 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1463 self.cli.send(self.cf)
1464
1465 def testSendMaxFrame(self):
1466 cf, addr = self.s.recvfrom(self.bufsize)
1467 self.assertEqual(self.cf, cf)
1468
1469 def _testSendMaxFrame(self):
1470 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1471 self.cli.send(self.cf)
1472
1473 def testSendMultiFrames(self):
1474 cf, addr = self.s.recvfrom(self.bufsize)
1475 self.assertEqual(self.cf1, cf)
1476
1477 cf, addr = self.s.recvfrom(self.bufsize)
1478 self.assertEqual(self.cf2, cf)
1479
1480 def _testSendMultiFrames(self):
1481 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1482 self.cli.send(self.cf1)
1483
1484 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1485 self.cli.send(self.cf2)
1486
Charles-François Natali773e42d2013-02-05 19:42:01 +01001487 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1488 'socket.CAN_BCM required for this test.')
1489 def _testBCM(self):
1490 cf, addr = self.cli.recvfrom(self.bufsize)
1491 self.assertEqual(self.cf, cf)
1492 can_id, can_dlc, data = self.dissect_can_frame(cf)
1493 self.assertEqual(self.can_id, can_id)
1494 self.assertEqual(self.data, data)
1495
1496 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1497 'socket.CAN_BCM required for this test.')
1498 def testBCM(self):
1499 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1500 self.addCleanup(bcm.close)
1501 bcm.connect((self.interface,))
1502 self.can_id = 0x123
1503 self.data = bytes([0xc0, 0xff, 0xee])
1504 self.cf = self.build_can_frame(self.can_id, self.data)
1505 opcode = socket.CAN_BCM_TX_SEND
1506 flags = 0
1507 count = 0
1508 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1509 bcm_can_id = 0x0222
1510 nframes = 1
1511 assert len(self.cf) == 16
1512 header = struct.pack(self.bcm_cmd_msg_fmt,
1513 opcode,
1514 flags,
1515 count,
1516 ival1_seconds,
1517 ival1_usec,
1518 ival2_seconds,
1519 ival2_usec,
1520 bcm_can_id,
1521 nframes,
1522 )
1523 header_plus_frame = header + self.cf
1524 bytes_sent = bcm.send(header_plus_frame)
1525 self.assertEqual(bytes_sent, len(header_plus_frame))
1526
Charles-François Natali47413c12011-10-06 19:47:44 +02001527
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001528@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1529class BasicRDSTest(unittest.TestCase):
1530
1531 def testCrucialConstants(self):
1532 socket.AF_RDS
1533 socket.PF_RDS
1534
1535 def testCreateSocket(self):
1536 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1537 pass
1538
1539 def testSocketBufferSize(self):
1540 bufsize = 16384
1541 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1542 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1543 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1544
1545
1546@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1547@unittest.skipUnless(thread, 'Threading required for this test.')
1548class RDSTest(ThreadedRDSSocketTest):
1549
1550 def __init__(self, methodName='runTest'):
1551 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1552
Charles-François Natali240c55f2011-11-10 20:33:36 +01001553 def setUp(self):
1554 super().setUp()
1555 self.evt = threading.Event()
1556
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001557 def testSendAndRecv(self):
1558 data, addr = self.serv.recvfrom(self.bufsize)
1559 self.assertEqual(self.data, data)
1560 self.assertEqual(self.cli_addr, addr)
1561
1562 def _testSendAndRecv(self):
1563 self.data = b'spam'
1564 self.cli.sendto(self.data, 0, (HOST, self.port))
1565
1566 def testPeek(self):
1567 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1568 self.assertEqual(self.data, data)
1569 data, addr = self.serv.recvfrom(self.bufsize)
1570 self.assertEqual(self.data, data)
1571
1572 def _testPeek(self):
1573 self.data = b'spam'
1574 self.cli.sendto(self.data, 0, (HOST, self.port))
1575
1576 @requireAttrs(socket.socket, 'recvmsg')
1577 def testSendAndRecvMsg(self):
1578 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1579 self.assertEqual(self.data, data)
1580
1581 @requireAttrs(socket.socket, 'sendmsg')
1582 def _testSendAndRecvMsg(self):
1583 self.data = b'hello ' * 10
1584 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1585
1586 def testSendAndRecvMulti(self):
1587 data, addr = self.serv.recvfrom(self.bufsize)
1588 self.assertEqual(self.data1, data)
1589
1590 data, addr = self.serv.recvfrom(self.bufsize)
1591 self.assertEqual(self.data2, data)
1592
1593 def _testSendAndRecvMulti(self):
1594 self.data1 = b'bacon'
1595 self.cli.sendto(self.data1, 0, (HOST, self.port))
1596
1597 self.data2 = b'egg'
1598 self.cli.sendto(self.data2, 0, (HOST, self.port))
1599
1600 def testSelect(self):
1601 r, w, x = select.select([self.serv], [], [], 3.0)
1602 self.assertIn(self.serv, r)
1603 data, addr = self.serv.recvfrom(self.bufsize)
1604 self.assertEqual(self.data, data)
1605
1606 def _testSelect(self):
1607 self.data = b'select'
1608 self.cli.sendto(self.data, 0, (HOST, self.port))
1609
1610 def testCongestion(self):
1611 # wait until the sender is done
1612 self.evt.wait()
1613
1614 def _testCongestion(self):
1615 # test the behavior in case of congestion
1616 self.data = b'fill'
1617 self.cli.setblocking(False)
1618 try:
1619 # try to lower the receiver's socket buffer size
1620 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1621 except OSError:
1622 pass
1623 with self.assertRaises(OSError) as cm:
1624 try:
1625 # fill the receiver's socket buffer
1626 while True:
1627 self.cli.sendto(self.data, 0, (HOST, self.port))
1628 finally:
1629 # signal the receiver we're done
1630 self.evt.set()
1631 # sendto() should have failed with ENOBUFS
1632 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1633 # and we should have received a congestion notification through poll
1634 r, w, x = select.select([self.serv], [], [], 3.0)
1635 self.assertIn(self.serv, r)
1636
1637
Victor Stinner45df8202010-04-28 22:31:17 +00001638@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001639class BasicTCPTest(SocketConnectedTest):
1640
1641 def __init__(self, methodName='runTest'):
1642 SocketConnectedTest.__init__(self, methodName=methodName)
1643
1644 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001645 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001646 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001647 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001648
1649 def _testRecv(self):
1650 self.serv_conn.send(MSG)
1651
1652 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001653 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001654 seg1 = self.cli_conn.recv(len(MSG) - 3)
1655 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001656 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001657 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001658
1659 def _testOverFlowRecv(self):
1660 self.serv_conn.send(MSG)
1661
1662 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001663 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001664 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001665 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001666
1667 def _testRecvFrom(self):
1668 self.serv_conn.send(MSG)
1669
1670 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001671 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001672 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1673 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001674 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001675 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001676
1677 def _testOverFlowRecvFrom(self):
1678 self.serv_conn.send(MSG)
1679
1680 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001681 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001682 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001683 while 1:
1684 read = self.cli_conn.recv(1024)
1685 if not read:
1686 break
Guido van Rossume531e292002-08-08 20:28:34 +00001687 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001688 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001689
1690 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001691 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001692 self.serv_conn.sendall(big_chunk)
1693
1694 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001695 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001696 fd = self.cli_conn.fileno()
1697 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001698 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001699 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001700 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001701 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001702
1703 def _testFromFd(self):
1704 self.serv_conn.send(MSG)
1705
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001706 def testDup(self):
1707 # Testing dup()
1708 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001709 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001710 msg = sock.recv(1024)
1711 self.assertEqual(msg, MSG)
1712
1713 def _testDup(self):
1714 self.serv_conn.send(MSG)
1715
Guido van Rossum24e4af82002-06-12 19:18:08 +00001716 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001717 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001718 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001719 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001720 # wait for _testShutdown to finish: on OS X, when the server
1721 # closes the connection the client also becomes disconnected,
1722 # and the client's shutdown call will fail. (Issue #4397.)
1723 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001724
1725 def _testShutdown(self):
1726 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001727 # Issue 15989
1728 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1729 _testcapi.INT_MAX + 1)
1730 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1731 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001732 self.serv_conn.shutdown(2)
1733
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001734 def testDetach(self):
1735 # Testing detach()
1736 fileno = self.cli_conn.fileno()
1737 f = self.cli_conn.detach()
1738 self.assertEqual(f, fileno)
1739 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001740 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001741 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001742 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001743 # ...but we can create another socket using the (still open)
1744 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001745 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001746 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001747 msg = sock.recv(1024)
1748 self.assertEqual(msg, MSG)
1749
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001750 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001751 self.serv_conn.send(MSG)
1752
Victor Stinner45df8202010-04-28 22:31:17 +00001753@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001754class BasicUDPTest(ThreadedUDPSocketTest):
1755
1756 def __init__(self, methodName='runTest'):
1757 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1758
1759 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001760 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001761 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001762 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001763
1764 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001765 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001766
Guido van Rossum1c938012002-06-12 21:17:20 +00001767 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001768 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001769 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001770 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001771
Guido van Rossum1c938012002-06-12 21:17:20 +00001772 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001773 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001774
Guido van Rossumd8faa362007-04-27 19:54:29 +00001775 def testRecvFromNegative(self):
1776 # Negative lengths passed to recvfrom should give ValueError.
1777 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1778
1779 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001780 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001781
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001782# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1783# same test code is used with different families and types of socket
1784# (e.g. stream, datagram), and tests using recvmsg() are repeated
1785# using recvmsg_into().
1786#
1787# The generic test classes such as SendmsgTests and
1788# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1789# supplied with sockets cli_sock and serv_sock representing the
1790# client's and the server's end of the connection respectively, and
1791# attributes cli_addr and serv_addr holding their (numeric where
1792# appropriate) addresses.
1793#
1794# The final concrete test classes combine these with subclasses of
1795# SocketTestBase which set up client and server sockets of a specific
1796# type, and with subclasses of SendrecvmsgBase such as
1797# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1798# sockets to cli_sock and serv_sock and override the methods and
1799# attributes of SendrecvmsgBase to fill in destination addresses if
1800# needed when sending, check for specific flags in msg_flags, etc.
1801#
1802# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1803# recvmsg_into().
1804
1805# XXX: like the other datagram (UDP) tests in this module, the code
1806# here assumes that datagram delivery on the local machine will be
1807# reliable.
1808
1809class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1810 # Base class for sendmsg()/recvmsg() tests.
1811
1812 # Time in seconds to wait before considering a test failed, or
1813 # None for no timeout. Not all tests actually set a timeout.
1814 fail_timeout = 3.0
1815
1816 def setUp(self):
1817 self.misc_event = threading.Event()
1818 super().setUp()
1819
1820 def sendToServer(self, msg):
1821 # Send msg to the server.
1822 return self.cli_sock.send(msg)
1823
1824 # Tuple of alternative default arguments for sendmsg() when called
1825 # via sendmsgToServer() (e.g. to include a destination address).
1826 sendmsg_to_server_defaults = ()
1827
1828 def sendmsgToServer(self, *args):
1829 # Call sendmsg() on self.cli_sock with the given arguments,
1830 # filling in any arguments which are not supplied with the
1831 # corresponding items of self.sendmsg_to_server_defaults, if
1832 # any.
1833 return self.cli_sock.sendmsg(
1834 *(args + self.sendmsg_to_server_defaults[len(args):]))
1835
1836 def doRecvmsg(self, sock, bufsize, *args):
1837 # Call recvmsg() on sock with given arguments and return its
1838 # result. Should be used for tests which can use either
1839 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1840 # this method with one which emulates it using recvmsg_into(),
1841 # thus allowing the same test to be used for both methods.
1842 result = sock.recvmsg(bufsize, *args)
1843 self.registerRecvmsgResult(result)
1844 return result
1845
1846 def registerRecvmsgResult(self, result):
1847 # Called by doRecvmsg() with the return value of recvmsg() or
1848 # recvmsg_into(). Can be overridden to arrange cleanup based
1849 # on the returned ancillary data, for instance.
1850 pass
1851
1852 def checkRecvmsgAddress(self, addr1, addr2):
1853 # Called to compare the received address with the address of
1854 # the peer.
1855 self.assertEqual(addr1, addr2)
1856
1857 # Flags that are normally unset in msg_flags
1858 msg_flags_common_unset = 0
1859 for name in ("MSG_CTRUNC", "MSG_OOB"):
1860 msg_flags_common_unset |= getattr(socket, name, 0)
1861
1862 # Flags that are normally set
1863 msg_flags_common_set = 0
1864
1865 # Flags set when a complete record has been received (e.g. MSG_EOR
1866 # for SCTP)
1867 msg_flags_eor_indicator = 0
1868
1869 # Flags set when a complete record has not been received
1870 # (e.g. MSG_TRUNC for datagram sockets)
1871 msg_flags_non_eor_indicator = 0
1872
1873 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1874 # Method to check the value of msg_flags returned by recvmsg[_into]().
1875 #
1876 # Checks that all bits in msg_flags_common_set attribute are
1877 # set in "flags" and all bits in msg_flags_common_unset are
1878 # unset.
1879 #
1880 # The "eor" argument specifies whether the flags should
1881 # indicate that a full record (or datagram) has been received.
1882 # If "eor" is None, no checks are done; otherwise, checks
1883 # that:
1884 #
1885 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1886 # set and all bits in msg_flags_non_eor_indicator are unset
1887 #
1888 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1889 # are set and all bits in msg_flags_eor_indicator are unset
1890 #
1891 # If "checkset" and/or "checkunset" are supplied, they require
1892 # the given bits to be set or unset respectively, overriding
1893 # what the attributes require for those bits.
1894 #
1895 # If any bits are set in "ignore", they will not be checked,
1896 # regardless of the other inputs.
1897 #
1898 # Will raise Exception if the inputs require a bit to be both
1899 # set and unset, and it is not ignored.
1900
1901 defaultset = self.msg_flags_common_set
1902 defaultunset = self.msg_flags_common_unset
1903
1904 if eor:
1905 defaultset |= self.msg_flags_eor_indicator
1906 defaultunset |= self.msg_flags_non_eor_indicator
1907 elif eor is not None:
1908 defaultset |= self.msg_flags_non_eor_indicator
1909 defaultunset |= self.msg_flags_eor_indicator
1910
1911 # Function arguments override defaults
1912 defaultset &= ~checkunset
1913 defaultunset &= ~checkset
1914
1915 # Merge arguments with remaining defaults, and check for conflicts
1916 checkset |= defaultset
1917 checkunset |= defaultunset
1918 inboth = checkset & checkunset & ~ignore
1919 if inboth:
1920 raise Exception("contradictory set, unset requirements for flags "
1921 "{0:#x}".format(inboth))
1922
1923 # Compare with given msg_flags value
1924 mask = (checkset | checkunset) & ~ignore
1925 self.assertEqual(flags & mask, checkset & mask)
1926
1927
1928class RecvmsgIntoMixin(SendrecvmsgBase):
1929 # Mixin to implement doRecvmsg() using recvmsg_into().
1930
1931 def doRecvmsg(self, sock, bufsize, *args):
1932 buf = bytearray(bufsize)
1933 result = sock.recvmsg_into([buf], *args)
1934 self.registerRecvmsgResult(result)
1935 self.assertGreaterEqual(result[0], 0)
1936 self.assertLessEqual(result[0], bufsize)
1937 return (bytes(buf[:result[0]]),) + result[1:]
1938
1939
1940class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1941 # Defines flags to be checked in msg_flags for datagram sockets.
1942
1943 @property
1944 def msg_flags_non_eor_indicator(self):
1945 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1946
1947
1948class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1949 # Defines flags to be checked in msg_flags for SCTP sockets.
1950
1951 @property
1952 def msg_flags_eor_indicator(self):
1953 return super().msg_flags_eor_indicator | socket.MSG_EOR
1954
1955
1956class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1957 # Base class for tests on connectionless-mode sockets. Users must
1958 # supply sockets on attributes cli and serv to be mapped to
1959 # cli_sock and serv_sock respectively.
1960
1961 @property
1962 def serv_sock(self):
1963 return self.serv
1964
1965 @property
1966 def cli_sock(self):
1967 return self.cli
1968
1969 @property
1970 def sendmsg_to_server_defaults(self):
1971 return ([], [], 0, self.serv_addr)
1972
1973 def sendToServer(self, msg):
1974 return self.cli_sock.sendto(msg, self.serv_addr)
1975
1976
1977class SendrecvmsgConnectedBase(SendrecvmsgBase):
1978 # Base class for tests on connected sockets. Users must supply
1979 # sockets on attributes serv_conn and cli_conn (representing the
1980 # connections *to* the server and the client), to be mapped to
1981 # cli_sock and serv_sock respectively.
1982
1983 @property
1984 def serv_sock(self):
1985 return self.cli_conn
1986
1987 @property
1988 def cli_sock(self):
1989 return self.serv_conn
1990
1991 def checkRecvmsgAddress(self, addr1, addr2):
1992 # Address is currently "unspecified" for a connected socket,
1993 # so we don't examine it
1994 pass
1995
1996
1997class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1998 # Base class to set a timeout on server's socket.
1999
2000 def setUp(self):
2001 super().setUp()
2002 self.serv_sock.settimeout(self.fail_timeout)
2003
2004
2005class SendmsgTests(SendrecvmsgServerTimeoutBase):
2006 # Tests for sendmsg() which can use any socket type and do not
2007 # involve recvmsg() or recvmsg_into().
2008
2009 def testSendmsg(self):
2010 # Send a simple message with sendmsg().
2011 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2012
2013 def _testSendmsg(self):
2014 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2015
2016 def testSendmsgDataGenerator(self):
2017 # Send from buffer obtained from a generator (not a sequence).
2018 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2019
2020 def _testSendmsgDataGenerator(self):
2021 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2022 len(MSG))
2023
2024 def testSendmsgAncillaryGenerator(self):
2025 # Gather (empty) ancillary data from a generator.
2026 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2027
2028 def _testSendmsgAncillaryGenerator(self):
2029 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2030 len(MSG))
2031
2032 def testSendmsgArray(self):
2033 # Send data from an array instead of the usual bytes object.
2034 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2035
2036 def _testSendmsgArray(self):
2037 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2038 len(MSG))
2039
2040 def testSendmsgGather(self):
2041 # Send message data from more than one buffer (gather write).
2042 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2043
2044 def _testSendmsgGather(self):
2045 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2046
2047 def testSendmsgBadArgs(self):
2048 # Check that sendmsg() rejects invalid arguments.
2049 self.assertEqual(self.serv_sock.recv(1000), b"done")
2050
2051 def _testSendmsgBadArgs(self):
2052 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2053 self.assertRaises(TypeError, self.sendmsgToServer,
2054 b"not in an iterable")
2055 self.assertRaises(TypeError, self.sendmsgToServer,
2056 object())
2057 self.assertRaises(TypeError, self.sendmsgToServer,
2058 [object()])
2059 self.assertRaises(TypeError, self.sendmsgToServer,
2060 [MSG, object()])
2061 self.assertRaises(TypeError, self.sendmsgToServer,
2062 [MSG], object())
2063 self.assertRaises(TypeError, self.sendmsgToServer,
2064 [MSG], [], object())
2065 self.assertRaises(TypeError, self.sendmsgToServer,
2066 [MSG], [], 0, object())
2067 self.sendToServer(b"done")
2068
2069 def testSendmsgBadCmsg(self):
2070 # Check that invalid ancillary data items are rejected.
2071 self.assertEqual(self.serv_sock.recv(1000), b"done")
2072
2073 def _testSendmsgBadCmsg(self):
2074 self.assertRaises(TypeError, self.sendmsgToServer,
2075 [MSG], [object()])
2076 self.assertRaises(TypeError, self.sendmsgToServer,
2077 [MSG], [(object(), 0, b"data")])
2078 self.assertRaises(TypeError, self.sendmsgToServer,
2079 [MSG], [(0, object(), b"data")])
2080 self.assertRaises(TypeError, self.sendmsgToServer,
2081 [MSG], [(0, 0, object())])
2082 self.assertRaises(TypeError, self.sendmsgToServer,
2083 [MSG], [(0, 0)])
2084 self.assertRaises(TypeError, self.sendmsgToServer,
2085 [MSG], [(0, 0, b"data", 42)])
2086 self.sendToServer(b"done")
2087
2088 @requireAttrs(socket, "CMSG_SPACE")
2089 def testSendmsgBadMultiCmsg(self):
2090 # Check that invalid ancillary data items are rejected when
2091 # more than one item is present.
2092 self.assertEqual(self.serv_sock.recv(1000), b"done")
2093
2094 @testSendmsgBadMultiCmsg.client_skip
2095 def _testSendmsgBadMultiCmsg(self):
2096 self.assertRaises(TypeError, self.sendmsgToServer,
2097 [MSG], [0, 0, b""])
2098 self.assertRaises(TypeError, self.sendmsgToServer,
2099 [MSG], [(0, 0, b""), object()])
2100 self.sendToServer(b"done")
2101
2102 def testSendmsgExcessCmsgReject(self):
2103 # Check that sendmsg() rejects excess ancillary data items
2104 # when the number that can be sent is limited.
2105 self.assertEqual(self.serv_sock.recv(1000), b"done")
2106
2107 def _testSendmsgExcessCmsgReject(self):
2108 if not hasattr(socket, "CMSG_SPACE"):
2109 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002110 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002111 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2112 self.assertIsNone(cm.exception.errno)
2113 self.sendToServer(b"done")
2114
2115 def testSendmsgAfterClose(self):
2116 # Check that sendmsg() fails on a closed socket.
2117 pass
2118
2119 def _testSendmsgAfterClose(self):
2120 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002121 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002122
2123
2124class SendmsgStreamTests(SendmsgTests):
2125 # Tests for sendmsg() which require a stream socket and do not
2126 # involve recvmsg() or recvmsg_into().
2127
2128 def testSendmsgExplicitNoneAddr(self):
2129 # Check that peer address can be specified as None.
2130 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2131
2132 def _testSendmsgExplicitNoneAddr(self):
2133 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2134
2135 def testSendmsgTimeout(self):
2136 # Check that timeout works with sendmsg().
2137 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2138 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2139
2140 def _testSendmsgTimeout(self):
2141 try:
2142 self.cli_sock.settimeout(0.03)
2143 with self.assertRaises(socket.timeout):
2144 while True:
2145 self.sendmsgToServer([b"a"*512])
2146 finally:
2147 self.misc_event.set()
2148
2149 # XXX: would be nice to have more tests for sendmsg flags argument.
2150
2151 # Linux supports MSG_DONTWAIT when sending, but in general, it
2152 # only works when receiving. Could add other platforms if they
2153 # support it too.
2154 @skipWithClientIf(sys.platform not in {"linux2"},
2155 "MSG_DONTWAIT not known to work on this platform when "
2156 "sending")
2157 def testSendmsgDontWait(self):
2158 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2159 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2160 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2161
2162 @testSendmsgDontWait.client_skip
2163 def _testSendmsgDontWait(self):
2164 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002165 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002166 while True:
2167 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2168 self.assertIn(cm.exception.errno,
2169 (errno.EAGAIN, errno.EWOULDBLOCK))
2170 finally:
2171 self.misc_event.set()
2172
2173
2174class SendmsgConnectionlessTests(SendmsgTests):
2175 # Tests for sendmsg() which require a connectionless-mode
2176 # (e.g. datagram) socket, and do not involve recvmsg() or
2177 # recvmsg_into().
2178
2179 def testSendmsgNoDestAddr(self):
2180 # Check that sendmsg() fails when no destination address is
2181 # given for unconnected socket.
2182 pass
2183
2184 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002185 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002186 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002187 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002188 [MSG], [], 0, None)
2189
2190
2191class RecvmsgGenericTests(SendrecvmsgBase):
2192 # Tests for recvmsg() which can also be emulated using
2193 # recvmsg_into(), and can use any socket type.
2194
2195 def testRecvmsg(self):
2196 # Receive a simple message with recvmsg[_into]().
2197 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2198 self.assertEqual(msg, MSG)
2199 self.checkRecvmsgAddress(addr, self.cli_addr)
2200 self.assertEqual(ancdata, [])
2201 self.checkFlags(flags, eor=True)
2202
2203 def _testRecvmsg(self):
2204 self.sendToServer(MSG)
2205
2206 def testRecvmsgExplicitDefaults(self):
2207 # Test recvmsg[_into]() with default arguments provided explicitly.
2208 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2209 len(MSG), 0, 0)
2210 self.assertEqual(msg, MSG)
2211 self.checkRecvmsgAddress(addr, self.cli_addr)
2212 self.assertEqual(ancdata, [])
2213 self.checkFlags(flags, eor=True)
2214
2215 def _testRecvmsgExplicitDefaults(self):
2216 self.sendToServer(MSG)
2217
2218 def testRecvmsgShorter(self):
2219 # Receive a message smaller than buffer.
2220 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2221 len(MSG) + 42)
2222 self.assertEqual(msg, MSG)
2223 self.checkRecvmsgAddress(addr, self.cli_addr)
2224 self.assertEqual(ancdata, [])
2225 self.checkFlags(flags, eor=True)
2226
2227 def _testRecvmsgShorter(self):
2228 self.sendToServer(MSG)
2229
Charles-François Natali8619cd72011-10-03 19:43:15 +02002230 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2231 # datagram is received (issue #13001).
2232 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002233 def testRecvmsgTrunc(self):
2234 # Receive part of message, check for truncation indicators.
2235 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2236 len(MSG) - 3)
2237 self.assertEqual(msg, MSG[:-3])
2238 self.checkRecvmsgAddress(addr, self.cli_addr)
2239 self.assertEqual(ancdata, [])
2240 self.checkFlags(flags, eor=False)
2241
Charles-François Natali8619cd72011-10-03 19:43:15 +02002242 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002243 def _testRecvmsgTrunc(self):
2244 self.sendToServer(MSG)
2245
2246 def testRecvmsgShortAncillaryBuf(self):
2247 # Test ancillary data buffer too small to hold any ancillary data.
2248 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2249 len(MSG), 1)
2250 self.assertEqual(msg, MSG)
2251 self.checkRecvmsgAddress(addr, self.cli_addr)
2252 self.assertEqual(ancdata, [])
2253 self.checkFlags(flags, eor=True)
2254
2255 def _testRecvmsgShortAncillaryBuf(self):
2256 self.sendToServer(MSG)
2257
2258 def testRecvmsgLongAncillaryBuf(self):
2259 # Test large ancillary data buffer.
2260 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2261 len(MSG), 10240)
2262 self.assertEqual(msg, MSG)
2263 self.checkRecvmsgAddress(addr, self.cli_addr)
2264 self.assertEqual(ancdata, [])
2265 self.checkFlags(flags, eor=True)
2266
2267 def _testRecvmsgLongAncillaryBuf(self):
2268 self.sendToServer(MSG)
2269
2270 def testRecvmsgAfterClose(self):
2271 # Check that recvmsg[_into]() fails on a closed socket.
2272 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002273 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002274
2275 def _testRecvmsgAfterClose(self):
2276 pass
2277
2278 def testRecvmsgTimeout(self):
2279 # Check that timeout works.
2280 try:
2281 self.serv_sock.settimeout(0.03)
2282 self.assertRaises(socket.timeout,
2283 self.doRecvmsg, self.serv_sock, len(MSG))
2284 finally:
2285 self.misc_event.set()
2286
2287 def _testRecvmsgTimeout(self):
2288 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2289
2290 @requireAttrs(socket, "MSG_PEEK")
2291 def testRecvmsgPeek(self):
2292 # Check that MSG_PEEK in flags enables examination of pending
2293 # data without consuming it.
2294
2295 # Receive part of data with MSG_PEEK.
2296 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2297 len(MSG) - 3, 0,
2298 socket.MSG_PEEK)
2299 self.assertEqual(msg, MSG[:-3])
2300 self.checkRecvmsgAddress(addr, self.cli_addr)
2301 self.assertEqual(ancdata, [])
2302 # Ignoring MSG_TRUNC here (so this test is the same for stream
2303 # and datagram sockets). Some wording in POSIX seems to
2304 # suggest that it needn't be set when peeking, but that may
2305 # just be a slip.
2306 self.checkFlags(flags, eor=False,
2307 ignore=getattr(socket, "MSG_TRUNC", 0))
2308
2309 # Receive all data with MSG_PEEK.
2310 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2311 len(MSG), 0,
2312 socket.MSG_PEEK)
2313 self.assertEqual(msg, MSG)
2314 self.checkRecvmsgAddress(addr, self.cli_addr)
2315 self.assertEqual(ancdata, [])
2316 self.checkFlags(flags, eor=True)
2317
2318 # Check that the same data can still be received normally.
2319 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2320 self.assertEqual(msg, MSG)
2321 self.checkRecvmsgAddress(addr, self.cli_addr)
2322 self.assertEqual(ancdata, [])
2323 self.checkFlags(flags, eor=True)
2324
2325 @testRecvmsgPeek.client_skip
2326 def _testRecvmsgPeek(self):
2327 self.sendToServer(MSG)
2328
2329 @requireAttrs(socket.socket, "sendmsg")
2330 def testRecvmsgFromSendmsg(self):
2331 # Test receiving with recvmsg[_into]() when message is sent
2332 # using sendmsg().
2333 self.serv_sock.settimeout(self.fail_timeout)
2334 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2335 self.assertEqual(msg, MSG)
2336 self.checkRecvmsgAddress(addr, self.cli_addr)
2337 self.assertEqual(ancdata, [])
2338 self.checkFlags(flags, eor=True)
2339
2340 @testRecvmsgFromSendmsg.client_skip
2341 def _testRecvmsgFromSendmsg(self):
2342 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2343
2344
2345class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2346 # Tests which require a stream socket and can use either recvmsg()
2347 # or recvmsg_into().
2348
2349 def testRecvmsgEOF(self):
2350 # Receive end-of-stream indicator (b"", peer socket closed).
2351 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2352 self.assertEqual(msg, b"")
2353 self.checkRecvmsgAddress(addr, self.cli_addr)
2354 self.assertEqual(ancdata, [])
2355 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2356
2357 def _testRecvmsgEOF(self):
2358 self.cli_sock.close()
2359
2360 def testRecvmsgOverflow(self):
2361 # Receive a message in more than one chunk.
2362 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2363 len(MSG) - 3)
2364 self.checkRecvmsgAddress(addr, self.cli_addr)
2365 self.assertEqual(ancdata, [])
2366 self.checkFlags(flags, eor=False)
2367
2368 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2369 self.checkRecvmsgAddress(addr, self.cli_addr)
2370 self.assertEqual(ancdata, [])
2371 self.checkFlags(flags, eor=True)
2372
2373 msg = seg1 + seg2
2374 self.assertEqual(msg, MSG)
2375
2376 def _testRecvmsgOverflow(self):
2377 self.sendToServer(MSG)
2378
2379
2380class RecvmsgTests(RecvmsgGenericTests):
2381 # Tests for recvmsg() which can use any socket type.
2382
2383 def testRecvmsgBadArgs(self):
2384 # Check that recvmsg() rejects invalid arguments.
2385 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2386 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2387 -1, 0, 0)
2388 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2389 len(MSG), -1, 0)
2390 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2391 [bytearray(10)], 0, 0)
2392 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2393 object(), 0, 0)
2394 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2395 len(MSG), object(), 0)
2396 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2397 len(MSG), 0, object())
2398
2399 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2400 self.assertEqual(msg, MSG)
2401 self.checkRecvmsgAddress(addr, self.cli_addr)
2402 self.assertEqual(ancdata, [])
2403 self.checkFlags(flags, eor=True)
2404
2405 def _testRecvmsgBadArgs(self):
2406 self.sendToServer(MSG)
2407
2408
2409class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2410 # Tests for recvmsg_into() which can use any socket type.
2411
2412 def testRecvmsgIntoBadArgs(self):
2413 # Check that recvmsg_into() rejects invalid arguments.
2414 buf = bytearray(len(MSG))
2415 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2416 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2417 len(MSG), 0, 0)
2418 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2419 buf, 0, 0)
2420 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2421 [object()], 0, 0)
2422 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2423 [b"I'm not writable"], 0, 0)
2424 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2425 [buf, object()], 0, 0)
2426 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2427 [buf], -1, 0)
2428 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2429 [buf], object(), 0)
2430 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2431 [buf], 0, object())
2432
2433 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2434 self.assertEqual(nbytes, len(MSG))
2435 self.assertEqual(buf, bytearray(MSG))
2436 self.checkRecvmsgAddress(addr, self.cli_addr)
2437 self.assertEqual(ancdata, [])
2438 self.checkFlags(flags, eor=True)
2439
2440 def _testRecvmsgIntoBadArgs(self):
2441 self.sendToServer(MSG)
2442
2443 def testRecvmsgIntoGenerator(self):
2444 # Receive into buffer obtained from a generator (not a sequence).
2445 buf = bytearray(len(MSG))
2446 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2447 (o for o in [buf]))
2448 self.assertEqual(nbytes, len(MSG))
2449 self.assertEqual(buf, bytearray(MSG))
2450 self.checkRecvmsgAddress(addr, self.cli_addr)
2451 self.assertEqual(ancdata, [])
2452 self.checkFlags(flags, eor=True)
2453
2454 def _testRecvmsgIntoGenerator(self):
2455 self.sendToServer(MSG)
2456
2457 def testRecvmsgIntoArray(self):
2458 # Receive into an array rather than the usual bytearray.
2459 buf = array.array("B", [0] * len(MSG))
2460 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2461 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002462 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002463 self.checkRecvmsgAddress(addr, self.cli_addr)
2464 self.assertEqual(ancdata, [])
2465 self.checkFlags(flags, eor=True)
2466
2467 def _testRecvmsgIntoArray(self):
2468 self.sendToServer(MSG)
2469
2470 def testRecvmsgIntoScatter(self):
2471 # Receive into multiple buffers (scatter write).
2472 b1 = bytearray(b"----")
2473 b2 = bytearray(b"0123456789")
2474 b3 = bytearray(b"--------------")
2475 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2476 [b1, memoryview(b2)[2:9], b3])
2477 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2478 self.assertEqual(b1, bytearray(b"Mary"))
2479 self.assertEqual(b2, bytearray(b"01 had a 9"))
2480 self.assertEqual(b3, bytearray(b"little lamb---"))
2481 self.checkRecvmsgAddress(addr, self.cli_addr)
2482 self.assertEqual(ancdata, [])
2483 self.checkFlags(flags, eor=True)
2484
2485 def _testRecvmsgIntoScatter(self):
2486 self.sendToServer(b"Mary had a little lamb")
2487
2488
2489class CmsgMacroTests(unittest.TestCase):
2490 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2491 # assumptions used by sendmsg() and recvmsg[_into](), which share
2492 # code with these functions.
2493
2494 # Match the definition in socketmodule.c
2495 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2496
2497 @requireAttrs(socket, "CMSG_LEN")
2498 def testCMSG_LEN(self):
2499 # Test CMSG_LEN() with various valid and invalid values,
2500 # checking the assumptions used by recvmsg() and sendmsg().
2501 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2502 values = list(range(257)) + list(range(toobig - 257, toobig))
2503
2504 # struct cmsghdr has at least three members, two of which are ints
2505 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2506 for n in values:
2507 ret = socket.CMSG_LEN(n)
2508 # This is how recvmsg() calculates the data size
2509 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2510 self.assertLessEqual(ret, self.socklen_t_limit)
2511
2512 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2513 # sendmsg() shares code with these functions, and requires
2514 # that it reject values over the limit.
2515 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2516 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2517
2518 @requireAttrs(socket, "CMSG_SPACE")
2519 def testCMSG_SPACE(self):
2520 # Test CMSG_SPACE() with various valid and invalid values,
2521 # checking the assumptions used by sendmsg().
2522 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2523 values = list(range(257)) + list(range(toobig - 257, toobig))
2524
2525 last = socket.CMSG_SPACE(0)
2526 # struct cmsghdr has at least three members, two of which are ints
2527 self.assertGreater(last, array.array("i").itemsize * 2)
2528 for n in values:
2529 ret = socket.CMSG_SPACE(n)
2530 self.assertGreaterEqual(ret, last)
2531 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2532 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2533 self.assertLessEqual(ret, self.socklen_t_limit)
2534 last = ret
2535
2536 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2537 # sendmsg() shares code with these functions, and requires
2538 # that it reject values over the limit.
2539 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2540 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2541
2542
2543class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2544 # Tests for file descriptor passing on Unix-domain sockets.
2545
2546 # Invalid file descriptor value that's unlikely to evaluate to a
2547 # real FD even if one of its bytes is replaced with a different
2548 # value (which shouldn't actually happen).
2549 badfd = -0x5555
2550
2551 def newFDs(self, n):
2552 # Return a list of n file descriptors for newly-created files
2553 # containing their list indices as ASCII numbers.
2554 fds = []
2555 for i in range(n):
2556 fd, path = tempfile.mkstemp()
2557 self.addCleanup(os.unlink, path)
2558 self.addCleanup(os.close, fd)
2559 os.write(fd, str(i).encode())
2560 fds.append(fd)
2561 return fds
2562
2563 def checkFDs(self, fds):
2564 # Check that the file descriptors in the given list contain
2565 # their correct list indices as ASCII numbers.
2566 for n, fd in enumerate(fds):
2567 os.lseek(fd, 0, os.SEEK_SET)
2568 self.assertEqual(os.read(fd, 1024), str(n).encode())
2569
2570 def registerRecvmsgResult(self, result):
2571 self.addCleanup(self.closeRecvmsgFDs, result)
2572
2573 def closeRecvmsgFDs(self, recvmsg_result):
2574 # Close all file descriptors specified in the ancillary data
2575 # of the given return value from recvmsg() or recvmsg_into().
2576 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2577 if (cmsg_level == socket.SOL_SOCKET and
2578 cmsg_type == socket.SCM_RIGHTS):
2579 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002580 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002581 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2582 for fd in fds:
2583 os.close(fd)
2584
2585 def createAndSendFDs(self, n):
2586 # Send n new file descriptors created by newFDs() to the
2587 # server, with the constant MSG as the non-ancillary data.
2588 self.assertEqual(
2589 self.sendmsgToServer([MSG],
2590 [(socket.SOL_SOCKET,
2591 socket.SCM_RIGHTS,
2592 array.array("i", self.newFDs(n)))]),
2593 len(MSG))
2594
2595 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2596 # Check that constant MSG was received with numfds file
2597 # descriptors in a maximum of maxcmsgs control messages (which
2598 # must contain only complete integers). By default, check
2599 # that MSG_CTRUNC is unset, but ignore any flags in
2600 # ignoreflags.
2601 msg, ancdata, flags, addr = result
2602 self.assertEqual(msg, MSG)
2603 self.checkRecvmsgAddress(addr, self.cli_addr)
2604 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2605 ignore=ignoreflags)
2606
2607 self.assertIsInstance(ancdata, list)
2608 self.assertLessEqual(len(ancdata), maxcmsgs)
2609 fds = array.array("i")
2610 for item in ancdata:
2611 self.assertIsInstance(item, tuple)
2612 cmsg_level, cmsg_type, cmsg_data = item
2613 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2614 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2615 self.assertIsInstance(cmsg_data, bytes)
2616 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002617 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002618
2619 self.assertEqual(len(fds), numfds)
2620 self.checkFDs(fds)
2621
2622 def testFDPassSimple(self):
2623 # Pass a single FD (array read from bytes object).
2624 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2625 len(MSG), 10240))
2626
2627 def _testFDPassSimple(self):
2628 self.assertEqual(
2629 self.sendmsgToServer(
2630 [MSG],
2631 [(socket.SOL_SOCKET,
2632 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002633 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002634 len(MSG))
2635
2636 def testMultipleFDPass(self):
2637 # Pass multiple FDs in a single array.
2638 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2639 len(MSG), 10240))
2640
2641 def _testMultipleFDPass(self):
2642 self.createAndSendFDs(4)
2643
2644 @requireAttrs(socket, "CMSG_SPACE")
2645 def testFDPassCMSG_SPACE(self):
2646 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2647 self.checkRecvmsgFDs(
2648 4, self.doRecvmsg(self.serv_sock, len(MSG),
2649 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2650
2651 @testFDPassCMSG_SPACE.client_skip
2652 def _testFDPassCMSG_SPACE(self):
2653 self.createAndSendFDs(4)
2654
2655 def testFDPassCMSG_LEN(self):
2656 # Test using CMSG_LEN() to calculate ancillary buffer size.
2657 self.checkRecvmsgFDs(1,
2658 self.doRecvmsg(self.serv_sock, len(MSG),
2659 socket.CMSG_LEN(4 * SIZEOF_INT)),
2660 # RFC 3542 says implementations may set
2661 # MSG_CTRUNC if there isn't enough space
2662 # for trailing padding.
2663 ignoreflags=socket.MSG_CTRUNC)
2664
2665 def _testFDPassCMSG_LEN(self):
2666 self.createAndSendFDs(1)
2667
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002668 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002669 @requireAttrs(socket, "CMSG_SPACE")
2670 def testFDPassSeparate(self):
2671 # Pass two FDs in two separate arrays. Arrays may be combined
2672 # into a single control message by the OS.
2673 self.checkRecvmsgFDs(2,
2674 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2675 maxcmsgs=2)
2676
2677 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002678 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002679 def _testFDPassSeparate(self):
2680 fd0, fd1 = self.newFDs(2)
2681 self.assertEqual(
2682 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2683 socket.SCM_RIGHTS,
2684 array.array("i", [fd0])),
2685 (socket.SOL_SOCKET,
2686 socket.SCM_RIGHTS,
2687 array.array("i", [fd1]))]),
2688 len(MSG))
2689
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002690 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002691 @requireAttrs(socket, "CMSG_SPACE")
2692 def testFDPassSeparateMinSpace(self):
2693 # Pass two FDs in two separate arrays, receiving them into the
2694 # minimum space for two arrays.
2695 self.checkRecvmsgFDs(2,
2696 self.doRecvmsg(self.serv_sock, len(MSG),
2697 socket.CMSG_SPACE(SIZEOF_INT) +
2698 socket.CMSG_LEN(SIZEOF_INT)),
2699 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2700
2701 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002702 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002703 def _testFDPassSeparateMinSpace(self):
2704 fd0, fd1 = self.newFDs(2)
2705 self.assertEqual(
2706 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2707 socket.SCM_RIGHTS,
2708 array.array("i", [fd0])),
2709 (socket.SOL_SOCKET,
2710 socket.SCM_RIGHTS,
2711 array.array("i", [fd1]))]),
2712 len(MSG))
2713
2714 def sendAncillaryIfPossible(self, msg, ancdata):
2715 # Try to send msg and ancdata to server, but if the system
2716 # call fails, just send msg with no ancillary data.
2717 try:
2718 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002719 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002720 # Check that it was the system call that failed
2721 self.assertIsInstance(e.errno, int)
2722 nbytes = self.sendmsgToServer([msg])
2723 self.assertEqual(nbytes, len(msg))
2724
2725 def testFDPassEmpty(self):
2726 # Try to pass an empty FD array. Can receive either no array
2727 # or an empty array.
2728 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2729 len(MSG), 10240),
2730 ignoreflags=socket.MSG_CTRUNC)
2731
2732 def _testFDPassEmpty(self):
2733 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2734 socket.SCM_RIGHTS,
2735 b"")])
2736
2737 def testFDPassPartialInt(self):
2738 # Try to pass a truncated FD array.
2739 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2740 len(MSG), 10240)
2741 self.assertEqual(msg, MSG)
2742 self.checkRecvmsgAddress(addr, self.cli_addr)
2743 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2744 self.assertLessEqual(len(ancdata), 1)
2745 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2746 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2747 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2748 self.assertLess(len(cmsg_data), SIZEOF_INT)
2749
2750 def _testFDPassPartialInt(self):
2751 self.sendAncillaryIfPossible(
2752 MSG,
2753 [(socket.SOL_SOCKET,
2754 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002755 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002756
2757 @requireAttrs(socket, "CMSG_SPACE")
2758 def testFDPassPartialIntInMiddle(self):
2759 # Try to pass two FD arrays, the first of which is truncated.
2760 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2761 len(MSG), 10240)
2762 self.assertEqual(msg, MSG)
2763 self.checkRecvmsgAddress(addr, self.cli_addr)
2764 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2765 self.assertLessEqual(len(ancdata), 2)
2766 fds = array.array("i")
2767 # Arrays may have been combined in a single control message
2768 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2769 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2770 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002771 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002772 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2773 self.assertLessEqual(len(fds), 2)
2774 self.checkFDs(fds)
2775
2776 @testFDPassPartialIntInMiddle.client_skip
2777 def _testFDPassPartialIntInMiddle(self):
2778 fd0, fd1 = self.newFDs(2)
2779 self.sendAncillaryIfPossible(
2780 MSG,
2781 [(socket.SOL_SOCKET,
2782 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002783 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002784 (socket.SOL_SOCKET,
2785 socket.SCM_RIGHTS,
2786 array.array("i", [fd1]))])
2787
2788 def checkTruncatedHeader(self, result, ignoreflags=0):
2789 # Check that no ancillary data items are returned when data is
2790 # truncated inside the cmsghdr structure.
2791 msg, ancdata, flags, addr = result
2792 self.assertEqual(msg, MSG)
2793 self.checkRecvmsgAddress(addr, self.cli_addr)
2794 self.assertEqual(ancdata, [])
2795 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2796 ignore=ignoreflags)
2797
2798 def testCmsgTruncNoBufSize(self):
2799 # Check that no ancillary data is received when no buffer size
2800 # is specified.
2801 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2802 # BSD seems to set MSG_CTRUNC only
2803 # if an item has been partially
2804 # received.
2805 ignoreflags=socket.MSG_CTRUNC)
2806
2807 def _testCmsgTruncNoBufSize(self):
2808 self.createAndSendFDs(1)
2809
2810 def testCmsgTrunc0(self):
2811 # Check that no ancillary data is received when buffer size is 0.
2812 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2813 ignoreflags=socket.MSG_CTRUNC)
2814
2815 def _testCmsgTrunc0(self):
2816 self.createAndSendFDs(1)
2817
2818 # Check that no ancillary data is returned for various non-zero
2819 # (but still too small) buffer sizes.
2820
2821 def testCmsgTrunc1(self):
2822 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2823
2824 def _testCmsgTrunc1(self):
2825 self.createAndSendFDs(1)
2826
2827 def testCmsgTrunc2Int(self):
2828 # The cmsghdr structure has at least three members, two of
2829 # which are ints, so we still shouldn't see any ancillary
2830 # data.
2831 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2832 SIZEOF_INT * 2))
2833
2834 def _testCmsgTrunc2Int(self):
2835 self.createAndSendFDs(1)
2836
2837 def testCmsgTruncLen0Minus1(self):
2838 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2839 socket.CMSG_LEN(0) - 1))
2840
2841 def _testCmsgTruncLen0Minus1(self):
2842 self.createAndSendFDs(1)
2843
2844 # The following tests try to truncate the control message in the
2845 # middle of the FD array.
2846
2847 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2848 # Check that file descriptor data is truncated to between
2849 # mindata and maxdata bytes when received with buffer size
2850 # ancbuf, and that any complete file descriptor numbers are
2851 # valid.
2852 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2853 len(MSG), ancbuf)
2854 self.assertEqual(msg, MSG)
2855 self.checkRecvmsgAddress(addr, self.cli_addr)
2856 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2857
2858 if mindata == 0 and ancdata == []:
2859 return
2860 self.assertEqual(len(ancdata), 1)
2861 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2862 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2863 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2864 self.assertGreaterEqual(len(cmsg_data), mindata)
2865 self.assertLessEqual(len(cmsg_data), maxdata)
2866 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002867 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002868 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2869 self.checkFDs(fds)
2870
2871 def testCmsgTruncLen0(self):
2872 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2873
2874 def _testCmsgTruncLen0(self):
2875 self.createAndSendFDs(1)
2876
2877 def testCmsgTruncLen0Plus1(self):
2878 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2879
2880 def _testCmsgTruncLen0Plus1(self):
2881 self.createAndSendFDs(2)
2882
2883 def testCmsgTruncLen1(self):
2884 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2885 maxdata=SIZEOF_INT)
2886
2887 def _testCmsgTruncLen1(self):
2888 self.createAndSendFDs(2)
2889
2890 def testCmsgTruncLen2Minus1(self):
2891 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2892 maxdata=(2 * SIZEOF_INT) - 1)
2893
2894 def _testCmsgTruncLen2Minus1(self):
2895 self.createAndSendFDs(2)
2896
2897
2898class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2899 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2900 # features of the RFC 3542 Advanced Sockets API for IPv6.
2901 # Currently we can only handle certain data items (e.g. traffic
2902 # class, hop limit, MTU discovery and fragmentation settings)
2903 # without resorting to unportable means such as the struct module,
2904 # but the tests here are aimed at testing the ancillary data
2905 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2906 # itself.
2907
2908 # Test value to use when setting hop limit of packet
2909 hop_limit = 2
2910
2911 # Test value to use when setting traffic class of packet.
2912 # -1 means "use kernel default".
2913 traffic_class = -1
2914
2915 def ancillaryMapping(self, ancdata):
2916 # Given ancillary data list ancdata, return a mapping from
2917 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2918 # Check that no (level, type) pair appears more than once.
2919 d = {}
2920 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2921 self.assertNotIn((cmsg_level, cmsg_type), d)
2922 d[(cmsg_level, cmsg_type)] = cmsg_data
2923 return d
2924
2925 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2926 # Receive hop limit into ancbufsize bytes of ancillary data
2927 # space. Check that data is MSG, ancillary data is not
2928 # truncated (but ignore any flags in ignoreflags), and hop
2929 # limit is between 0 and maxhop inclusive.
2930 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2931 socket.IPV6_RECVHOPLIMIT, 1)
2932 self.misc_event.set()
2933 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2934 len(MSG), ancbufsize)
2935
2936 self.assertEqual(msg, MSG)
2937 self.checkRecvmsgAddress(addr, self.cli_addr)
2938 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2939 ignore=ignoreflags)
2940
2941 self.assertEqual(len(ancdata), 1)
2942 self.assertIsInstance(ancdata[0], tuple)
2943 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2944 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2945 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2946 self.assertIsInstance(cmsg_data, bytes)
2947 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2948 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002949 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002950 self.assertGreaterEqual(a[0], 0)
2951 self.assertLessEqual(a[0], maxhop)
2952
2953 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2954 def testRecvHopLimit(self):
2955 # Test receiving the packet hop limit as ancillary data.
2956 self.checkHopLimit(ancbufsize=10240)
2957
2958 @testRecvHopLimit.client_skip
2959 def _testRecvHopLimit(self):
2960 # Need to wait until server has asked to receive ancillary
2961 # data, as implementations are not required to buffer it
2962 # otherwise.
2963 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2964 self.sendToServer(MSG)
2965
2966 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2967 def testRecvHopLimitCMSG_SPACE(self):
2968 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2969 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2970
2971 @testRecvHopLimitCMSG_SPACE.client_skip
2972 def _testRecvHopLimitCMSG_SPACE(self):
2973 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2974 self.sendToServer(MSG)
2975
2976 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2977 # 3542 says portable applications must provide space for trailing
2978 # padding. Implementations may set MSG_CTRUNC if there isn't
2979 # enough space for the padding.
2980
2981 @requireAttrs(socket.socket, "sendmsg")
2982 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2983 def testSetHopLimit(self):
2984 # Test setting hop limit on outgoing packet and receiving it
2985 # at the other end.
2986 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2987
2988 @testSetHopLimit.client_skip
2989 def _testSetHopLimit(self):
2990 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2991 self.assertEqual(
2992 self.sendmsgToServer([MSG],
2993 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2994 array.array("i", [self.hop_limit]))]),
2995 len(MSG))
2996
2997 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2998 ignoreflags=0):
2999 # Receive traffic class and hop limit into ancbufsize bytes of
3000 # ancillary data space. Check that data is MSG, ancillary
3001 # data is not truncated (but ignore any flags in ignoreflags),
3002 # and traffic class and hop limit are in range (hop limit no
3003 # more than maxhop).
3004 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3005 socket.IPV6_RECVHOPLIMIT, 1)
3006 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3007 socket.IPV6_RECVTCLASS, 1)
3008 self.misc_event.set()
3009 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3010 len(MSG), ancbufsize)
3011
3012 self.assertEqual(msg, MSG)
3013 self.checkRecvmsgAddress(addr, self.cli_addr)
3014 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3015 ignore=ignoreflags)
3016 self.assertEqual(len(ancdata), 2)
3017 ancmap = self.ancillaryMapping(ancdata)
3018
3019 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3020 self.assertEqual(len(tcdata), SIZEOF_INT)
3021 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003022 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003023 self.assertGreaterEqual(a[0], 0)
3024 self.assertLessEqual(a[0], 255)
3025
3026 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3027 self.assertEqual(len(hldata), SIZEOF_INT)
3028 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003029 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003030 self.assertGreaterEqual(a[0], 0)
3031 self.assertLessEqual(a[0], maxhop)
3032
3033 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3034 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3035 def testRecvTrafficClassAndHopLimit(self):
3036 # Test receiving traffic class and hop limit as ancillary data.
3037 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3038
3039 @testRecvTrafficClassAndHopLimit.client_skip
3040 def _testRecvTrafficClassAndHopLimit(self):
3041 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3042 self.sendToServer(MSG)
3043
3044 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3045 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3046 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3047 # Test receiving traffic class and hop limit, using
3048 # CMSG_SPACE() to calculate buffer size.
3049 self.checkTrafficClassAndHopLimit(
3050 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3051
3052 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3053 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3054 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3055 self.sendToServer(MSG)
3056
3057 @requireAttrs(socket.socket, "sendmsg")
3058 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3059 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3060 def testSetTrafficClassAndHopLimit(self):
3061 # Test setting traffic class and hop limit on outgoing packet,
3062 # and receiving them at the other end.
3063 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3064 maxhop=self.hop_limit)
3065
3066 @testSetTrafficClassAndHopLimit.client_skip
3067 def _testSetTrafficClassAndHopLimit(self):
3068 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3069 self.assertEqual(
3070 self.sendmsgToServer([MSG],
3071 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3072 array.array("i", [self.traffic_class])),
3073 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3074 array.array("i", [self.hop_limit]))]),
3075 len(MSG))
3076
3077 @requireAttrs(socket.socket, "sendmsg")
3078 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3079 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3080 def testOddCmsgSize(self):
3081 # Try to send ancillary data with first item one byte too
3082 # long. Fall back to sending with correct size if this fails,
3083 # and check that second item was handled correctly.
3084 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3085 maxhop=self.hop_limit)
3086
3087 @testOddCmsgSize.client_skip
3088 def _testOddCmsgSize(self):
3089 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3090 try:
3091 nbytes = self.sendmsgToServer(
3092 [MSG],
3093 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003094 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003095 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3096 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003097 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003098 self.assertIsInstance(e.errno, int)
3099 nbytes = self.sendmsgToServer(
3100 [MSG],
3101 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3102 array.array("i", [self.traffic_class])),
3103 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3104 array.array("i", [self.hop_limit]))])
3105 self.assertEqual(nbytes, len(MSG))
3106
3107 # Tests for proper handling of truncated ancillary data
3108
3109 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3110 # Receive hop limit into ancbufsize bytes of ancillary data
3111 # space, which should be too small to contain the ancillary
3112 # data header (if ancbufsize is None, pass no second argument
3113 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3114 # (unless included in ignoreflags), and no ancillary data is
3115 # returned.
3116 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3117 socket.IPV6_RECVHOPLIMIT, 1)
3118 self.misc_event.set()
3119 args = () if ancbufsize is None else (ancbufsize,)
3120 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3121 len(MSG), *args)
3122
3123 self.assertEqual(msg, MSG)
3124 self.checkRecvmsgAddress(addr, self.cli_addr)
3125 self.assertEqual(ancdata, [])
3126 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3127 ignore=ignoreflags)
3128
3129 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3130 def testCmsgTruncNoBufSize(self):
3131 # Check that no ancillary data is received when no ancillary
3132 # buffer size is provided.
3133 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3134 # BSD seems to set
3135 # MSG_CTRUNC only if an item
3136 # has been partially
3137 # received.
3138 ignoreflags=socket.MSG_CTRUNC)
3139
3140 @testCmsgTruncNoBufSize.client_skip
3141 def _testCmsgTruncNoBufSize(self):
3142 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3143 self.sendToServer(MSG)
3144
3145 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3146 def testSingleCmsgTrunc0(self):
3147 # Check that no ancillary data is received when ancillary
3148 # buffer size is zero.
3149 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3150 ignoreflags=socket.MSG_CTRUNC)
3151
3152 @testSingleCmsgTrunc0.client_skip
3153 def _testSingleCmsgTrunc0(self):
3154 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3155 self.sendToServer(MSG)
3156
3157 # Check that no ancillary data is returned for various non-zero
3158 # (but still too small) buffer sizes.
3159
3160 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3161 def testSingleCmsgTrunc1(self):
3162 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3163
3164 @testSingleCmsgTrunc1.client_skip
3165 def _testSingleCmsgTrunc1(self):
3166 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3167 self.sendToServer(MSG)
3168
3169 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3170 def testSingleCmsgTrunc2Int(self):
3171 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3172
3173 @testSingleCmsgTrunc2Int.client_skip
3174 def _testSingleCmsgTrunc2Int(self):
3175 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3176 self.sendToServer(MSG)
3177
3178 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3179 def testSingleCmsgTruncLen0Minus1(self):
3180 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3181
3182 @testSingleCmsgTruncLen0Minus1.client_skip
3183 def _testSingleCmsgTruncLen0Minus1(self):
3184 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3185 self.sendToServer(MSG)
3186
3187 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3188 def testSingleCmsgTruncInData(self):
3189 # Test truncation of a control message inside its associated
3190 # data. The message may be returned with its data truncated,
3191 # or not returned at all.
3192 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3193 socket.IPV6_RECVHOPLIMIT, 1)
3194 self.misc_event.set()
3195 msg, ancdata, flags, addr = self.doRecvmsg(
3196 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3197
3198 self.assertEqual(msg, MSG)
3199 self.checkRecvmsgAddress(addr, self.cli_addr)
3200 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3201
3202 self.assertLessEqual(len(ancdata), 1)
3203 if ancdata:
3204 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3205 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3206 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3207 self.assertLess(len(cmsg_data), SIZEOF_INT)
3208
3209 @testSingleCmsgTruncInData.client_skip
3210 def _testSingleCmsgTruncInData(self):
3211 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3212 self.sendToServer(MSG)
3213
3214 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3215 # Receive traffic class and hop limit into ancbufsize bytes of
3216 # ancillary data space, which should be large enough to
3217 # contain the first item, but too small to contain the header
3218 # of the second. Check that data is MSG, MSG_CTRUNC is set
3219 # (unless included in ignoreflags), and only one ancillary
3220 # data item is returned.
3221 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3222 socket.IPV6_RECVHOPLIMIT, 1)
3223 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3224 socket.IPV6_RECVTCLASS, 1)
3225 self.misc_event.set()
3226 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3227 len(MSG), ancbufsize)
3228
3229 self.assertEqual(msg, MSG)
3230 self.checkRecvmsgAddress(addr, self.cli_addr)
3231 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3232 ignore=ignoreflags)
3233
3234 self.assertEqual(len(ancdata), 1)
3235 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3236 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3237 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3238 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3239 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003240 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003241 self.assertGreaterEqual(a[0], 0)
3242 self.assertLessEqual(a[0], 255)
3243
3244 # Try the above test with various buffer sizes.
3245
3246 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3247 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3248 def testSecondCmsgTrunc0(self):
3249 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3250 ignoreflags=socket.MSG_CTRUNC)
3251
3252 @testSecondCmsgTrunc0.client_skip
3253 def _testSecondCmsgTrunc0(self):
3254 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3255 self.sendToServer(MSG)
3256
3257 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3258 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3259 def testSecondCmsgTrunc1(self):
3260 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3261
3262 @testSecondCmsgTrunc1.client_skip
3263 def _testSecondCmsgTrunc1(self):
3264 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3265 self.sendToServer(MSG)
3266
3267 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3268 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3269 def testSecondCmsgTrunc2Int(self):
3270 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3271 2 * SIZEOF_INT)
3272
3273 @testSecondCmsgTrunc2Int.client_skip
3274 def _testSecondCmsgTrunc2Int(self):
3275 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3276 self.sendToServer(MSG)
3277
3278 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3279 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3280 def testSecondCmsgTruncLen0Minus1(self):
3281 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3282 socket.CMSG_LEN(0) - 1)
3283
3284 @testSecondCmsgTruncLen0Minus1.client_skip
3285 def _testSecondCmsgTruncLen0Minus1(self):
3286 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3287 self.sendToServer(MSG)
3288
3289 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3290 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3291 def testSecomdCmsgTruncInData(self):
3292 # Test truncation of the second of two control messages inside
3293 # its associated data.
3294 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3295 socket.IPV6_RECVHOPLIMIT, 1)
3296 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3297 socket.IPV6_RECVTCLASS, 1)
3298 self.misc_event.set()
3299 msg, ancdata, flags, addr = self.doRecvmsg(
3300 self.serv_sock, len(MSG),
3301 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3302
3303 self.assertEqual(msg, MSG)
3304 self.checkRecvmsgAddress(addr, self.cli_addr)
3305 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3306
3307 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3308
3309 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3310 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3311 cmsg_types.remove(cmsg_type)
3312 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3313 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003314 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003315 self.assertGreaterEqual(a[0], 0)
3316 self.assertLessEqual(a[0], 255)
3317
3318 if ancdata:
3319 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3320 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3321 cmsg_types.remove(cmsg_type)
3322 self.assertLess(len(cmsg_data), SIZEOF_INT)
3323
3324 self.assertEqual(ancdata, [])
3325
3326 @testSecomdCmsgTruncInData.client_skip
3327 def _testSecomdCmsgTruncInData(self):
3328 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3329 self.sendToServer(MSG)
3330
3331
3332# Derive concrete test classes for different socket types.
3333
3334class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3335 SendrecvmsgConnectionlessBase,
3336 ThreadedSocketTestMixin, UDPTestBase):
3337 pass
3338
3339@requireAttrs(socket.socket, "sendmsg")
3340@unittest.skipUnless(thread, 'Threading required for this test.')
3341class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3342 pass
3343
3344@requireAttrs(socket.socket, "recvmsg")
3345@unittest.skipUnless(thread, 'Threading required for this test.')
3346class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3347 pass
3348
3349@requireAttrs(socket.socket, "recvmsg_into")
3350@unittest.skipUnless(thread, 'Threading required for this test.')
3351class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3352 pass
3353
3354
3355class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3356 SendrecvmsgConnectionlessBase,
3357 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003358
3359 def checkRecvmsgAddress(self, addr1, addr2):
3360 # Called to compare the received address with the address of
3361 # the peer, ignoring scope ID
3362 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003363
3364@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003365@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003366@requireSocket("AF_INET6", "SOCK_DGRAM")
3367@unittest.skipUnless(thread, 'Threading required for this test.')
3368class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3369 pass
3370
3371@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003372@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003373@requireSocket("AF_INET6", "SOCK_DGRAM")
3374@unittest.skipUnless(thread, 'Threading required for this test.')
3375class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3376 pass
3377
3378@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003379@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003380@requireSocket("AF_INET6", "SOCK_DGRAM")
3381@unittest.skipUnless(thread, 'Threading required for this test.')
3382class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3383 pass
3384
3385@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003386@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003387@requireAttrs(socket, "IPPROTO_IPV6")
3388@requireSocket("AF_INET6", "SOCK_DGRAM")
3389@unittest.skipUnless(thread, 'Threading required for this test.')
3390class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3391 SendrecvmsgUDP6TestBase):
3392 pass
3393
3394@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003395@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003396@requireAttrs(socket, "IPPROTO_IPV6")
3397@requireSocket("AF_INET6", "SOCK_DGRAM")
3398@unittest.skipUnless(thread, 'Threading required for this test.')
3399class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3400 RFC3542AncillaryTest,
3401 SendrecvmsgUDP6TestBase):
3402 pass
3403
3404
3405class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3406 ConnectedStreamTestMixin, TCPTestBase):
3407 pass
3408
3409@requireAttrs(socket.socket, "sendmsg")
3410@unittest.skipUnless(thread, 'Threading required for this test.')
3411class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3412 pass
3413
3414@requireAttrs(socket.socket, "recvmsg")
3415@unittest.skipUnless(thread, 'Threading required for this test.')
3416class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3417 SendrecvmsgTCPTestBase):
3418 pass
3419
3420@requireAttrs(socket.socket, "recvmsg_into")
3421@unittest.skipUnless(thread, 'Threading required for this test.')
3422class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3423 SendrecvmsgTCPTestBase):
3424 pass
3425
3426
3427class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3428 SendrecvmsgConnectedBase,
3429 ConnectedStreamTestMixin, SCTPStreamBase):
3430 pass
3431
3432@requireAttrs(socket.socket, "sendmsg")
3433@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3434@unittest.skipUnless(thread, 'Threading required for this test.')
3435class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3436 pass
3437
3438@requireAttrs(socket.socket, "recvmsg")
3439@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3440@unittest.skipUnless(thread, 'Threading required for this test.')
3441class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3442 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003443
3444 def testRecvmsgEOF(self):
3445 try:
3446 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3447 except OSError as e:
3448 if e.errno != errno.ENOTCONN:
3449 raise
3450 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003451
3452@requireAttrs(socket.socket, "recvmsg_into")
3453@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3454@unittest.skipUnless(thread, 'Threading required for this test.')
3455class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3456 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003457
3458 def testRecvmsgEOF(self):
3459 try:
3460 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3461 except OSError as e:
3462 if e.errno != errno.ENOTCONN:
3463 raise
3464 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003465
3466
3467class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3468 ConnectedStreamTestMixin, UnixStreamBase):
3469 pass
3470
3471@requireAttrs(socket.socket, "sendmsg")
3472@requireAttrs(socket, "AF_UNIX")
3473@unittest.skipUnless(thread, 'Threading required for this test.')
3474class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3475 pass
3476
3477@requireAttrs(socket.socket, "recvmsg")
3478@requireAttrs(socket, "AF_UNIX")
3479@unittest.skipUnless(thread, 'Threading required for this test.')
3480class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3481 SendrecvmsgUnixStreamTestBase):
3482 pass
3483
3484@requireAttrs(socket.socket, "recvmsg_into")
3485@requireAttrs(socket, "AF_UNIX")
3486@unittest.skipUnless(thread, 'Threading required for this test.')
3487class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3488 SendrecvmsgUnixStreamTestBase):
3489 pass
3490
3491@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3492@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3493@unittest.skipUnless(thread, 'Threading required for this test.')
3494class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3495 pass
3496
3497@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3498@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3499@unittest.skipUnless(thread, 'Threading required for this test.')
3500class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3501 SendrecvmsgUnixStreamTestBase):
3502 pass
3503
3504
3505# Test interrupting the interruptible send/receive methods with a
3506# signal when a timeout is set. These tests avoid having multiple
3507# threads alive during the test so that the OS cannot deliver the
3508# signal to the wrong one.
3509
3510class InterruptedTimeoutBase(unittest.TestCase):
3511 # Base class for interrupted send/receive tests. Installs an
3512 # empty handler for SIGALRM and removes it on teardown, along with
3513 # any scheduled alarms.
3514
3515 def setUp(self):
3516 super().setUp()
3517 orig_alrm_handler = signal.signal(signal.SIGALRM,
3518 lambda signum, frame: None)
3519 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3520 self.addCleanup(self.setAlarm, 0)
3521
3522 # Timeout for socket operations
3523 timeout = 4.0
3524
3525 # Provide setAlarm() method to schedule delivery of SIGALRM after
3526 # given number of seconds, or cancel it if zero, and an
3527 # appropriate time value to use. Use setitimer() if available.
3528 if hasattr(signal, "setitimer"):
3529 alarm_time = 0.05
3530
3531 def setAlarm(self, seconds):
3532 signal.setitimer(signal.ITIMER_REAL, seconds)
3533 else:
3534 # Old systems may deliver the alarm up to one second early
3535 alarm_time = 2
3536
3537 def setAlarm(self, seconds):
3538 signal.alarm(seconds)
3539
3540
3541# Require siginterrupt() in order to ensure that system calls are
3542# interrupted by default.
3543@requireAttrs(signal, "siginterrupt")
3544@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3545 "Don't have signal.alarm or signal.setitimer")
3546class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3547 # Test interrupting the recv*() methods with signals when a
3548 # timeout is set.
3549
3550 def setUp(self):
3551 super().setUp()
3552 self.serv.settimeout(self.timeout)
3553
3554 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003555 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003556 # errno of EINTR when interrupted by a signal.
3557 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003558 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003559 func(*args, **kwargs)
3560 self.assertNotIsInstance(cm.exception, socket.timeout)
3561 self.assertEqual(cm.exception.errno, errno.EINTR)
3562
3563 def testInterruptedRecvTimeout(self):
3564 self.checkInterruptedRecv(self.serv.recv, 1024)
3565
3566 def testInterruptedRecvIntoTimeout(self):
3567 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3568
3569 def testInterruptedRecvfromTimeout(self):
3570 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3571
3572 def testInterruptedRecvfromIntoTimeout(self):
3573 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3574
3575 @requireAttrs(socket.socket, "recvmsg")
3576 def testInterruptedRecvmsgTimeout(self):
3577 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3578
3579 @requireAttrs(socket.socket, "recvmsg_into")
3580 def testInterruptedRecvmsgIntoTimeout(self):
3581 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3582
3583
3584# Require siginterrupt() in order to ensure that system calls are
3585# interrupted by default.
3586@requireAttrs(signal, "siginterrupt")
3587@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3588 "Don't have signal.alarm or signal.setitimer")
3589@unittest.skipUnless(thread, 'Threading required for this test.')
3590class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3591 ThreadSafeCleanupTestCase,
3592 SocketListeningTestMixin, TCPTestBase):
3593 # Test interrupting the interruptible send*() methods with signals
3594 # when a timeout is set.
3595
3596 def setUp(self):
3597 super().setUp()
3598 self.serv_conn = self.newSocket()
3599 self.addCleanup(self.serv_conn.close)
3600 # Use a thread to complete the connection, but wait for it to
3601 # terminate before running the test, so that there is only one
3602 # thread to accept the signal.
3603 cli_thread = threading.Thread(target=self.doConnect)
3604 cli_thread.start()
3605 self.cli_conn, addr = self.serv.accept()
3606 self.addCleanup(self.cli_conn.close)
3607 cli_thread.join()
3608 self.serv_conn.settimeout(self.timeout)
3609
3610 def doConnect(self):
3611 self.serv_conn.connect(self.serv_addr)
3612
3613 def checkInterruptedSend(self, func, *args, **kwargs):
3614 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003615 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003616 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003617 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003618 while True:
3619 self.setAlarm(self.alarm_time)
3620 func(*args, **kwargs)
3621 self.assertNotIsInstance(cm.exception, socket.timeout)
3622 self.assertEqual(cm.exception.errno, errno.EINTR)
3623
Nick Coghlan2496f332011-09-19 20:26:31 +10003624 # Issue #12958: The following tests have problems on Mac OS X
3625 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003626 def testInterruptedSendTimeout(self):
3627 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3628
Nick Coghlan2496f332011-09-19 20:26:31 +10003629 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003630 def testInterruptedSendtoTimeout(self):
3631 # Passing an actual address here as Python's wrapper for
3632 # sendto() doesn't allow passing a zero-length one; POSIX
3633 # requires that the address is ignored since the socket is
3634 # connection-mode, however.
3635 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3636 self.serv_addr)
3637
Nick Coghlan2496f332011-09-19 20:26:31 +10003638 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003639 @requireAttrs(socket.socket, "sendmsg")
3640 def testInterruptedSendmsgTimeout(self):
3641 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3642
3643
Victor Stinner45df8202010-04-28 22:31:17 +00003644@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003645class TCPCloserTest(ThreadedTCPSocketTest):
3646
3647 def testClose(self):
3648 conn, addr = self.serv.accept()
3649 conn.close()
3650
3651 sd = self.cli
3652 read, write, err = select.select([sd], [], [], 1.0)
3653 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003654 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003655
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003656 # Calling close() many times should be safe.
3657 conn.close()
3658 conn.close()
3659
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003660 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003661 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003662 time.sleep(1.0)
3663
Serhiy Storchaka43767632013-11-03 21:31:38 +02003664@unittest.skipUnless(hasattr(socket, 'socketpair'),
3665 'test needs socket.socketpair()')
Victor Stinner45df8202010-04-28 22:31:17 +00003666@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003667class BasicSocketPairTest(SocketPairTest):
3668
3669 def __init__(self, methodName='runTest'):
3670 SocketPairTest.__init__(self, methodName=methodName)
3671
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003672 def _check_defaults(self, sock):
3673 self.assertIsInstance(sock, socket.socket)
3674 if hasattr(socket, 'AF_UNIX'):
3675 self.assertEqual(sock.family, socket.AF_UNIX)
3676 else:
3677 self.assertEqual(sock.family, socket.AF_INET)
3678 self.assertEqual(sock.type, socket.SOCK_STREAM)
3679 self.assertEqual(sock.proto, 0)
3680
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003681 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003682 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003683
3684 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003685 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003686
Dave Cole331708b2004-08-09 04:51:41 +00003687 def testRecv(self):
3688 msg = self.serv.recv(1024)
3689 self.assertEqual(msg, MSG)
3690
3691 def _testRecv(self):
3692 self.cli.send(MSG)
3693
3694 def testSend(self):
3695 self.serv.send(MSG)
3696
3697 def _testSend(self):
3698 msg = self.cli.recv(1024)
3699 self.assertEqual(msg, MSG)
3700
Victor Stinner45df8202010-04-28 22:31:17 +00003701@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003702class NonBlockingTCPTests(ThreadedTCPSocketTest):
3703
3704 def __init__(self, methodName='runTest'):
3705 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3706
3707 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003708 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003709 self.serv.setblocking(True)
3710 self.assertIsNone(self.serv.gettimeout())
3711 self.serv.setblocking(False)
3712 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003713 start = time.time()
3714 try:
3715 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003716 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003717 pass
3718 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003719 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Serhiy Storchaka78980432013-01-15 01:12:17 +02003720 # Issue 15989
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003721 if _testcapi.UINT_MAX < _testcapi.ULONG_MAX:
3722 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3723 self.assertIsNone(self.serv.gettimeout())
Guido van Rossum24e4af82002-06-12 19:18:08 +00003724
3725 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003726 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003727
Serhiy Storchaka43767632013-11-03 21:31:38 +02003728 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3729 'test needs socket.SOCK_NONBLOCK')
3730 @support.requires_linux_version(2, 6, 28)
3731 def testInitNonBlocking(self):
3732 # reinit server socket
3733 self.serv.close()
3734 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3735 socket.SOCK_NONBLOCK)
3736 self.port = support.bind_port(self.serv)
3737 self.serv.listen(1)
3738 # actual testing
3739 start = time.time()
3740 try:
3741 self.serv.accept()
3742 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003743 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003744 end = time.time()
3745 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3746
3747 def _testInitNonBlocking(self):
3748 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003749
Antoine Pitrou600232b2011-01-05 21:03:42 +00003750 def testInheritFlags(self):
3751 # Issue #7995: when calling accept() on a listening socket with a
3752 # timeout, the resulting socket should not be non-blocking.
3753 self.serv.settimeout(10)
3754 try:
3755 conn, addr = self.serv.accept()
3756 message = conn.recv(len(MSG))
3757 finally:
3758 conn.close()
3759 self.serv.settimeout(None)
3760
3761 def _testInheritFlags(self):
3762 time.sleep(0.1)
3763 self.cli.connect((HOST, self.port))
3764 time.sleep(0.5)
3765 self.cli.send(MSG)
3766
Guido van Rossum24e4af82002-06-12 19:18:08 +00003767 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003768 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003769 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003770 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003771 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003772 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003773 pass
3774 else:
3775 self.fail("Error trying to do non-blocking accept.")
3776 read, write, err = select.select([self.serv], [], [])
3777 if self.serv in read:
3778 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003779 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003780 else:
3781 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003782
Guido van Rossum24e4af82002-06-12 19:18:08 +00003783 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003784 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003785 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003786
3787 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003788 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003789 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003790 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003791
3792 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003793 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003794 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003795
3796 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003797 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003798 conn, addr = self.serv.accept()
3799 conn.setblocking(0)
3800 try:
3801 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003802 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003803 pass
3804 else:
3805 self.fail("Error trying to do non-blocking recv.")
3806 read, write, err = select.select([conn], [], [])
3807 if conn in read:
3808 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003809 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003810 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003811 else:
3812 self.fail("Error during select call to non-blocking socket.")
3813
3814 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003815 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003816 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003817 self.cli.send(MSG)
3818
Victor Stinner45df8202010-04-28 22:31:17 +00003819@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003820class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003821 """Unit tests for the object returned by socket.makefile()
3822
Antoine Pitrou834bd812010-10-13 16:17:14 +00003823 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003824 the client connection. You can read from this file to
3825 get output from the server.
3826
Antoine Pitrou834bd812010-10-13 16:17:14 +00003827 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003828 server connection. You can write to this file to send output
3829 to the client.
3830 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003831
Guido van Rossume9f66142002-08-07 15:46:19 +00003832 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003833 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003834 errors = 'strict'
3835 newline = None
3836
3837 read_mode = 'rb'
3838 read_msg = MSG
3839 write_mode = 'wb'
3840 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003841
Guido van Rossum24e4af82002-06-12 19:18:08 +00003842 def __init__(self, methodName='runTest'):
3843 SocketConnectedTest.__init__(self, methodName=methodName)
3844
3845 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003846 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3847 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003848 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003849 self.read_file = self.cli_conn.makefile(
3850 self.read_mode, self.bufsize,
3851 encoding = self.encoding,
3852 errors = self.errors,
3853 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003854
3855 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003856 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003857 self.read_file.close()
3858 self.assertTrue(self.read_file.closed)
3859 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003860 SocketConnectedTest.tearDown(self)
3861
3862 def clientSetUp(self):
3863 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003864 self.write_file = self.serv_conn.makefile(
3865 self.write_mode, self.bufsize,
3866 encoding = self.encoding,
3867 errors = self.errors,
3868 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003869
3870 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003871 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003872 self.write_file.close()
3873 self.assertTrue(self.write_file.closed)
3874 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003875 SocketConnectedTest.clientTearDown(self)
3876
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003877 def testReadAfterTimeout(self):
3878 # Issue #7322: A file object must disallow further reads
3879 # after a timeout has occurred.
3880 self.cli_conn.settimeout(1)
3881 self.read_file.read(3)
3882 # First read raises a timeout
3883 self.assertRaises(socket.timeout, self.read_file.read, 1)
3884 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003885 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003886 self.read_file.read(1)
3887 self.assertIn("cannot read from timed out object", str(ctx.exception))
3888
3889 def _testReadAfterTimeout(self):
3890 self.write_file.write(self.write_msg[0:3])
3891 self.write_file.flush()
3892 self.serv_finished.wait()
3893
Guido van Rossum24e4af82002-06-12 19:18:08 +00003894 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003895 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003896 first_seg = self.read_file.read(len(self.read_msg)-3)
3897 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003898 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003899 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003900
3901 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003902 self.write_file.write(self.write_msg)
3903 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003904
Guido van Rossum8c943832002-08-08 01:00:28 +00003905 def testFullRead(self):
3906 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003907 msg = self.read_file.read()
3908 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003909
3910 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003911 self.write_file.write(self.write_msg)
3912 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003913
Guido van Rossum24e4af82002-06-12 19:18:08 +00003914 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003915 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003916 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003917 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003918 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003919 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003920 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003921 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003922 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003923
3924 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003925 self.write_file.write(self.write_msg)
3926 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003927
3928 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003929 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003930 line = self.read_file.readline()
3931 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003932
3933 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003934 self.write_file.write(self.write_msg)
3935 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003936
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003937 def testCloseAfterMakefile(self):
3938 # The file returned by makefile should keep the socket open.
3939 self.cli_conn.close()
3940 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003941 msg = self.read_file.read()
3942 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003943
3944 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003945 self.write_file.write(self.write_msg)
3946 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003947
3948 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003949 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003950 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003951 if isinstance(self.read_msg, str):
3952 msg = msg.decode()
3953 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003954
3955 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003956 self.write_file.write(self.write_msg)
3957 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003958
Tim Peters116d83c2004-03-28 02:20:45 +00003959 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003960 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003961
3962 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003963 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003964
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003965 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003966 self.assertEqual(self.read_file.mode, self.read_mode)
3967 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003968
3969 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003970 self.assertEqual(self.write_file.mode, self.write_mode)
3971 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003972
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003973 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003974 self.read_file.close()
3975 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003976 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003977 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003978
3979 def _testRealClose(self):
3980 pass
3981
3982
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003983class FileObjectInterruptedTestCase(unittest.TestCase):
3984 """Test that the file object correctly handles EINTR internally."""
3985
3986 class MockSocket(object):
3987 def __init__(self, recv_funcs=()):
3988 # A generator that returns callables that we'll call for each
3989 # call to recv().
3990 self._recv_step = iter(recv_funcs)
3991
3992 def recv_into(self, buffer):
3993 data = next(self._recv_step)()
3994 assert len(buffer) >= len(data)
3995 buffer[:len(data)] = data
3996 return len(data)
3997
3998 def _decref_socketios(self):
3999 pass
4000
4001 def _textiowrap_for_test(self, buffering=-1):
4002 raw = socket.SocketIO(self, "r")
4003 if buffering < 0:
4004 buffering = io.DEFAULT_BUFFER_SIZE
4005 if buffering == 0:
4006 return raw
4007 buffer = io.BufferedReader(raw, buffering)
4008 text = io.TextIOWrapper(buffer, None, None)
4009 text.mode = "rb"
4010 return text
4011
4012 @staticmethod
4013 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02004014 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004015
4016 def _textiowrap_mock_socket(self, mock, buffering=-1):
4017 raw = socket.SocketIO(mock, "r")
4018 if buffering < 0:
4019 buffering = io.DEFAULT_BUFFER_SIZE
4020 if buffering == 0:
4021 return raw
4022 buffer = io.BufferedReader(raw, buffering)
4023 text = io.TextIOWrapper(buffer, None, None)
4024 text.mode = "rb"
4025 return text
4026
4027 def _test_readline(self, size=-1, buffering=-1):
4028 mock_sock = self.MockSocket(recv_funcs=[
4029 lambda : b"This is the first line\nAnd the sec",
4030 self._raise_eintr,
4031 lambda : b"ond line is here\n",
4032 lambda : b"",
4033 lambda : b"", # XXX(gps): io library does an extra EOF read
4034 ])
4035 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004036 self.assertEqual(fo.readline(size), "This is the first line\n")
4037 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004038
4039 def _test_read(self, size=-1, buffering=-1):
4040 mock_sock = self.MockSocket(recv_funcs=[
4041 lambda : b"This is the first line\nAnd the sec",
4042 self._raise_eintr,
4043 lambda : b"ond line is here\n",
4044 lambda : b"",
4045 lambda : b"", # XXX(gps): io library does an extra EOF read
4046 ])
4047 expecting = (b"This is the first line\n"
4048 b"And the second line is here\n")
4049 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4050 if buffering == 0:
4051 data = b''
4052 else:
4053 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004054 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004055 while len(data) != len(expecting):
4056 part = fo.read(size)
4057 if not part:
4058 break
4059 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004060 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004061
4062 def test_default(self):
4063 self._test_readline()
4064 self._test_readline(size=100)
4065 self._test_read()
4066 self._test_read(size=100)
4067
4068 def test_with_1k_buffer(self):
4069 self._test_readline(buffering=1024)
4070 self._test_readline(size=100, buffering=1024)
4071 self._test_read(buffering=1024)
4072 self._test_read(size=100, buffering=1024)
4073
4074 def _test_readline_no_buffer(self, size=-1):
4075 mock_sock = self.MockSocket(recv_funcs=[
4076 lambda : b"a",
4077 lambda : b"\n",
4078 lambda : b"B",
4079 self._raise_eintr,
4080 lambda : b"b",
4081 lambda : b"",
4082 ])
4083 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004084 self.assertEqual(fo.readline(size), b"a\n")
4085 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004086
4087 def test_no_buffer(self):
4088 self._test_readline_no_buffer()
4089 self._test_readline_no_buffer(size=4)
4090 self._test_read(buffering=0)
4091 self._test_read(size=100, buffering=0)
4092
4093
Guido van Rossume9f66142002-08-07 15:46:19 +00004094class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4095
4096 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004097
Guido van Rossume9f66142002-08-07 15:46:19 +00004098 In this case (and in this case only), it should be possible to
4099 create a file object, read a line from it, create another file
4100 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004101 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004102 when reading multiple requests from the same socket."""
4103
4104 bufsize = 0 # Use unbuffered mode
4105
4106 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004107 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004108 line = self.read_file.readline() # first line
4109 self.assertEqual(line, b"A. " + self.write_msg) # first line
4110 self.read_file = self.cli_conn.makefile('rb', 0)
4111 line = self.read_file.readline() # second line
4112 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004113
4114 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004115 self.write_file.write(b"A. " + self.write_msg)
4116 self.write_file.write(b"B. " + self.write_msg)
4117 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004118
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004119 def testMakefileClose(self):
4120 # The file returned by makefile should keep the socket open...
4121 self.cli_conn.close()
4122 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004123 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004124 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004125 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004126 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004127
4128 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004129 self.write_file.write(self.write_msg)
4130 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004131
4132 def testMakefileCloseSocketDestroy(self):
4133 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004134 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004135 refcount_after = sys.getrefcount(self.cli_conn)
4136 self.assertEqual(refcount_before - 1, refcount_after)
4137
4138 def _testMakefileCloseSocketDestroy(self):
4139 pass
4140
Antoine Pitrou98b46702010-09-18 22:59:00 +00004141 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004142 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004143 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4144
4145 def testSmallReadNonBlocking(self):
4146 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004147 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4148 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004149 self.evt1.set()
4150 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004151 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004152 if first_seg is None:
4153 # Data not arrived (can happen under Windows), wait a bit
4154 time.sleep(0.5)
4155 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004156 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004157 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004158 self.assertEqual(n, 3)
4159 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004160 self.assertEqual(msg, self.read_msg)
4161 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4162 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004163
4164 def _testSmallReadNonBlocking(self):
4165 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004166 self.write_file.write(self.write_msg)
4167 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004168 self.evt2.set()
4169 # Avoid cloding the socket before the server test has finished,
4170 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4171 self.serv_finished.wait(5.0)
4172
4173 def testWriteNonBlocking(self):
4174 self.cli_finished.wait(5.0)
4175 # The client thread can't skip directly - the SkipTest exception
4176 # would appear as a failure.
4177 if self.serv_skipped:
4178 self.skipTest(self.serv_skipped)
4179
4180 def _testWriteNonBlocking(self):
4181 self.serv_skipped = None
4182 self.serv_conn.setblocking(False)
4183 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004184 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004185 LIMIT = 10
4186 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004187 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004188 self.assertGreater(n, 0)
4189 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004190 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004191 if n is None:
4192 # Succeeded
4193 break
4194 self.assertGreater(n, 0)
4195 else:
4196 # Let us know that this test didn't manage to establish
4197 # the expected conditions. This is not a failure in itself but,
4198 # if it happens repeatedly, the test should be fixed.
4199 self.serv_skipped = "failed to saturate the socket buffer"
4200
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004201
Guido van Rossum8c943832002-08-08 01:00:28 +00004202class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4203
4204 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4205
4206
4207class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4208
4209 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004210
Thomas Woutersb2137042007-02-01 18:02:27 +00004211
Antoine Pitrou834bd812010-10-13 16:17:14 +00004212class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4213 """Tests for socket.makefile() in text mode (rather than binary)"""
4214
4215 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004216 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004217 write_mode = 'wb'
4218 write_msg = MSG
4219 newline = ''
4220
4221
4222class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4223 """Tests for socket.makefile() in text mode (rather than binary)"""
4224
4225 read_mode = 'rb'
4226 read_msg = MSG
4227 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004228 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004229 newline = ''
4230
4231
4232class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4233 """Tests for socket.makefile() in text mode (rather than binary)"""
4234
4235 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004236 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004237 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004238 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004239 newline = ''
4240
4241
Guido van Rossumd8faa362007-04-27 19:54:29 +00004242class NetworkConnectionTest(object):
4243 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004244
Guido van Rossumd8faa362007-04-27 19:54:29 +00004245 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004246 # We're inherited below by BasicTCPTest2, which also inherits
4247 # BasicTCPTest, which defines self.port referenced below.
4248 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004249 self.serv_conn = self.cli
4250
4251class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4252 """Tests that NetworkConnection does not break existing TCP functionality.
4253 """
4254
4255class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004256
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004257 class MockSocket(socket.socket):
4258 def connect(self, *args):
4259 raise socket.timeout('timed out')
4260
4261 @contextlib.contextmanager
4262 def mocked_socket_module(self):
4263 """Return a socket which times out on connect"""
4264 old_socket = socket.socket
4265 socket.socket = self.MockSocket
4266 try:
4267 yield
4268 finally:
4269 socket.socket = old_socket
4270
4271 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004272 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004273 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004274 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004275 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004276 cli.connect((HOST, port))
4277 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4278
4279 def test_create_connection(self):
4280 # Issue #9792: errors raised by create_connection() should have
4281 # a proper errno attribute.
4282 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004283 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004284 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004285
4286 # Issue #16257: create_connection() calls getaddrinfo() against
4287 # 'localhost'. This may result in an IPV6 addr being returned
4288 # as well as an IPV4 one:
4289 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4290 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4291 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4292 #
4293 # create_connection() enumerates through all the addresses returned
4294 # and if it doesn't successfully bind to any of them, it propagates
4295 # the last exception it encountered.
4296 #
4297 # On Solaris, ENETUNREACH is returned in this circumstance instead
4298 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4299 # expected errnos.
4300 expected_errnos = [ errno.ECONNREFUSED, ]
4301 if hasattr(errno, 'ENETUNREACH'):
4302 expected_errnos.append(errno.ENETUNREACH)
4303
4304 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004305
4306 def test_create_connection_timeout(self):
4307 # Issue #9792: create_connection() should not recast timeout errors
4308 # as generic socket errors.
4309 with self.mocked_socket_module():
4310 with self.assertRaises(socket.timeout):
4311 socket.create_connection((HOST, 1234))
4312
Guido van Rossumd8faa362007-04-27 19:54:29 +00004313
Victor Stinner45df8202010-04-28 22:31:17 +00004314@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004315class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4316
4317 def __init__(self, methodName='runTest'):
4318 SocketTCPTest.__init__(self, methodName=methodName)
4319 ThreadableTest.__init__(self)
4320
4321 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004322 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004323
4324 def clientTearDown(self):
4325 self.cli.close()
4326 self.cli = None
4327 ThreadableTest.clientTearDown(self)
4328
4329 def _justAccept(self):
4330 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004331 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004332
4333 testFamily = _justAccept
4334 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004335 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004336 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004337 self.assertEqual(self.cli.family, 2)
4338
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004339 testSourceAddress = _justAccept
4340 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004341 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4342 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004343 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004344 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004345 # The port number being used is sufficient to show that the bind()
4346 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004347
Guido van Rossumd8faa362007-04-27 19:54:29 +00004348 testTimeoutDefault = _justAccept
4349 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004350 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004351 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004352 socket.setdefaulttimeout(42)
4353 try:
4354 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004355 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004356 finally:
4357 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004358 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004359
4360 testTimeoutNone = _justAccept
4361 def _testTimeoutNone(self):
4362 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004363 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004364 socket.setdefaulttimeout(30)
4365 try:
4366 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004367 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004368 finally:
4369 socket.setdefaulttimeout(None)
4370 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004371
4372 testTimeoutValueNamed = _justAccept
4373 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004374 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004375 self.assertEqual(self.cli.gettimeout(), 30)
4376
4377 testTimeoutValueNonamed = _justAccept
4378 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004379 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004380 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004381 self.assertEqual(self.cli.gettimeout(), 30)
4382
Victor Stinner45df8202010-04-28 22:31:17 +00004383@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004384class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4385
4386 def __init__(self, methodName='runTest'):
4387 SocketTCPTest.__init__(self, methodName=methodName)
4388 ThreadableTest.__init__(self)
4389
4390 def clientSetUp(self):
4391 pass
4392
4393 def clientTearDown(self):
4394 self.cli.close()
4395 self.cli = None
4396 ThreadableTest.clientTearDown(self)
4397
4398 def testInsideTimeout(self):
4399 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004400 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004401 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004402 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004403 testOutsideTimeout = testInsideTimeout
4404
4405 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004406 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004407 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004408 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004409
4410 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004411 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004412 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004413
4414
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004415class TCPTimeoutTest(SocketTCPTest):
4416
4417 def testTCPTimeout(self):
4418 def raise_timeout(*args, **kwargs):
4419 self.serv.settimeout(1.0)
4420 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004421 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004422 "Error generating a timeout exception (TCP)")
4423
4424 def testTimeoutZero(self):
4425 ok = False
4426 try:
4427 self.serv.settimeout(0.0)
4428 foo = self.serv.accept()
4429 except socket.timeout:
4430 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004431 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004432 ok = True
4433 except:
4434 self.fail("caught unexpected exception (TCP)")
4435 if not ok:
4436 self.fail("accept() returned success when we did not expect it")
4437
Serhiy Storchaka43767632013-11-03 21:31:38 +02004438 @unittest.skipUnless(hasattr(signal, 'alarm'),
4439 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004440 def testInterruptedTimeout(self):
4441 # XXX I don't know how to do this test on MSWindows or any other
4442 # plaform that doesn't support signal.alarm() or os.kill(), though
4443 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004444 self.serv.settimeout(5.0) # must be longer than alarm
4445 class Alarm(Exception):
4446 pass
4447 def alarm_handler(signal, frame):
4448 raise Alarm
4449 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4450 try:
4451 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4452 try:
4453 foo = self.serv.accept()
4454 except socket.timeout:
4455 self.fail("caught timeout instead of Alarm")
4456 except Alarm:
4457 pass
4458 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004459 self.fail("caught other exception instead of Alarm:"
4460 " %s(%s):\n%s" %
4461 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004462 else:
4463 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004464 finally:
4465 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004466 except Alarm:
4467 self.fail("got Alarm in wrong place")
4468 finally:
4469 # no alarm can be pending. Safe to restore old handler.
4470 signal.signal(signal.SIGALRM, old_alarm)
4471
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004472class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004473
4474 def testUDPTimeout(self):
4475 def raise_timeout(*args, **kwargs):
4476 self.serv.settimeout(1.0)
4477 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004478 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004479 "Error generating a timeout exception (UDP)")
4480
4481 def testTimeoutZero(self):
4482 ok = False
4483 try:
4484 self.serv.settimeout(0.0)
4485 foo = self.serv.recv(1024)
4486 except socket.timeout:
4487 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004488 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004489 ok = True
4490 except:
4491 self.fail("caught unexpected exception (UDP)")
4492 if not ok:
4493 self.fail("recv() returned success when we did not expect it")
4494
4495class TestExceptions(unittest.TestCase):
4496
4497 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004498 self.assertTrue(issubclass(OSError, Exception))
4499 self.assertTrue(issubclass(socket.herror, OSError))
4500 self.assertTrue(issubclass(socket.gaierror, OSError))
4501 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004502
Serhiy Storchaka43767632013-11-03 21:31:38 +02004503@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004504class TestLinuxAbstractNamespace(unittest.TestCase):
4505
4506 UNIX_PATH_MAX = 108
4507
4508 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004509 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004510 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4511 s1.bind(address)
4512 s1.listen(1)
4513 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4514 s2.connect(s1.getsockname())
4515 with s1.accept()[0] as s3:
4516 self.assertEqual(s1.getsockname(), address)
4517 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004518
4519 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004520 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004521 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4522 s.bind(address)
4523 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004524
4525 def testNameOverflow(self):
4526 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004527 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004528 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004529
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004530 def testStrName(self):
4531 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004532 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4533 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004534 s.bind("\x00python\x00test\x00")
4535 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004536 finally:
4537 s.close()
4538
Serhiy Storchaka43767632013-11-03 21:31:38 +02004539@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004540class TestUnixDomain(unittest.TestCase):
4541
4542 def setUp(self):
4543 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4544
4545 def tearDown(self):
4546 self.sock.close()
4547
4548 def encoded(self, path):
4549 # Return the given path encoded in the file system encoding,
4550 # or skip the test if this is not possible.
4551 try:
4552 return os.fsencode(path)
4553 except UnicodeEncodeError:
4554 self.skipTest(
4555 "Pathname {0!a} cannot be represented in file "
4556 "system encoding {1!r}".format(
4557 path, sys.getfilesystemencoding()))
4558
Antoine Pitrou16374872011-12-16 15:04:12 +01004559 def bind(self, sock, path):
4560 # Bind the socket
4561 try:
4562 sock.bind(path)
4563 except OSError as e:
4564 if str(e) == "AF_UNIX path too long":
4565 self.skipTest(
4566 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4567 .format(path))
4568 else:
4569 raise
4570
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004571 def testStrAddr(self):
4572 # Test binding to and retrieving a normal string pathname.
4573 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004574 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004575 self.addCleanup(support.unlink, path)
4576 self.assertEqual(self.sock.getsockname(), path)
4577
4578 def testBytesAddr(self):
4579 # Test binding to a bytes pathname.
4580 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004581 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004582 self.addCleanup(support.unlink, path)
4583 self.assertEqual(self.sock.getsockname(), path)
4584
4585 def testSurrogateescapeBind(self):
4586 # Test binding to a valid non-ASCII pathname, with the
4587 # non-ASCII bytes supplied using surrogateescape encoding.
4588 path = os.path.abspath(support.TESTFN_UNICODE)
4589 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004590 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004591 self.addCleanup(support.unlink, path)
4592 self.assertEqual(self.sock.getsockname(), path)
4593
4594 def testUnencodableAddr(self):
4595 # Test binding to a pathname that cannot be encoded in the
4596 # file system encoding.
4597 if support.TESTFN_UNENCODABLE is None:
4598 self.skipTest("No unencodable filename available")
4599 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004600 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004601 self.addCleanup(support.unlink, path)
4602 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004603
Victor Stinner45df8202010-04-28 22:31:17 +00004604@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004605class BufferIOTest(SocketConnectedTest):
4606 """
4607 Test the buffer versions of socket.recv() and socket.send().
4608 """
4609 def __init__(self, methodName='runTest'):
4610 SocketConnectedTest.__init__(self, methodName=methodName)
4611
Antoine Pitrou25480782010-03-17 22:50:28 +00004612 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004613 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004614 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004615 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004616 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004617 self.assertEqual(msg, MSG)
4618
Antoine Pitrou25480782010-03-17 22:50:28 +00004619 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004620 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004621 self.serv_conn.send(buf)
4622
Antoine Pitrou25480782010-03-17 22:50:28 +00004623 def testRecvIntoBytearray(self):
4624 buf = bytearray(1024)
4625 nbytes = self.cli_conn.recv_into(buf)
4626 self.assertEqual(nbytes, len(MSG))
4627 msg = buf[:len(MSG)]
4628 self.assertEqual(msg, MSG)
4629
4630 _testRecvIntoBytearray = _testRecvIntoArray
4631
4632 def testRecvIntoMemoryview(self):
4633 buf = bytearray(1024)
4634 nbytes = self.cli_conn.recv_into(memoryview(buf))
4635 self.assertEqual(nbytes, len(MSG))
4636 msg = buf[:len(MSG)]
4637 self.assertEqual(msg, MSG)
4638
4639 _testRecvIntoMemoryview = _testRecvIntoArray
4640
4641 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004642 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004643 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004644 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004645 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004646 self.assertEqual(msg, MSG)
4647
Antoine Pitrou25480782010-03-17 22:50:28 +00004648 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004649 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004650 self.serv_conn.send(buf)
4651
Antoine Pitrou25480782010-03-17 22:50:28 +00004652 def testRecvFromIntoBytearray(self):
4653 buf = bytearray(1024)
4654 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4655 self.assertEqual(nbytes, len(MSG))
4656 msg = buf[:len(MSG)]
4657 self.assertEqual(msg, MSG)
4658
4659 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4660
4661 def testRecvFromIntoMemoryview(self):
4662 buf = bytearray(1024)
4663 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4664 self.assertEqual(nbytes, len(MSG))
4665 msg = buf[:len(MSG)]
4666 self.assertEqual(msg, MSG)
4667
4668 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4669
Christian Heimes043d6f62008-01-07 17:19:16 +00004670
4671TIPC_STYPE = 2000
4672TIPC_LOWER = 200
4673TIPC_UPPER = 210
4674
4675def isTipcAvailable():
4676 """Check if the TIPC module is loaded
4677
4678 The TIPC module is not loaded automatically on Ubuntu and probably
4679 other Linux distros.
4680 """
4681 if not hasattr(socket, "AF_TIPC"):
4682 return False
4683 if not os.path.isfile("/proc/modules"):
4684 return False
4685 with open("/proc/modules") as f:
4686 for line in f:
4687 if line.startswith("tipc "):
4688 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004689 return False
4690
Serhiy Storchaka43767632013-11-03 21:31:38 +02004691@unittest.skipUnless(isTipcAvailable(),
4692 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004693class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004694 def testRDM(self):
4695 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4696 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004697 self.addCleanup(srv.close)
4698 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004699
4700 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4701 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4702 TIPC_LOWER, TIPC_UPPER)
4703 srv.bind(srvaddr)
4704
4705 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4706 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4707 cli.sendto(MSG, sendaddr)
4708
4709 msg, recvaddr = srv.recvfrom(1024)
4710
4711 self.assertEqual(cli.getsockname(), recvaddr)
4712 self.assertEqual(msg, MSG)
4713
4714
Serhiy Storchaka43767632013-11-03 21:31:38 +02004715@unittest.skipUnless(isTipcAvailable(),
4716 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004717class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004718 def __init__(self, methodName = 'runTest'):
4719 unittest.TestCase.__init__(self, methodName = methodName)
4720 ThreadableTest.__init__(self)
4721
4722 def setUp(self):
4723 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004724 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004725 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4726 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4727 TIPC_LOWER, TIPC_UPPER)
4728 self.srv.bind(srvaddr)
4729 self.srv.listen(5)
4730 self.serverExplicitReady()
4731 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004732 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004733
4734 def clientSetUp(self):
4735 # The is a hittable race between serverExplicitReady() and the
4736 # accept() call; sleep a little while to avoid it, otherwise
4737 # we could get an exception
4738 time.sleep(0.1)
4739 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004740 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004741 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4742 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4743 self.cli.connect(addr)
4744 self.cliaddr = self.cli.getsockname()
4745
4746 def testStream(self):
4747 msg = self.conn.recv(1024)
4748 self.assertEqual(msg, MSG)
4749 self.assertEqual(self.cliaddr, self.connaddr)
4750
4751 def _testStream(self):
4752 self.cli.send(MSG)
4753 self.cli.close()
4754
4755
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004756@unittest.skipUnless(thread, 'Threading required for this test.')
4757class ContextManagersTest(ThreadedTCPSocketTest):
4758
4759 def _testSocketClass(self):
4760 # base test
4761 with socket.socket() as sock:
4762 self.assertFalse(sock._closed)
4763 self.assertTrue(sock._closed)
4764 # close inside with block
4765 with socket.socket() as sock:
4766 sock.close()
4767 self.assertTrue(sock._closed)
4768 # exception inside with block
4769 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004770 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004771 self.assertTrue(sock._closed)
4772
4773 def testCreateConnectionBase(self):
4774 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004775 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004776 data = conn.recv(1024)
4777 conn.sendall(data)
4778
4779 def _testCreateConnectionBase(self):
4780 address = self.serv.getsockname()
4781 with socket.create_connection(address) as sock:
4782 self.assertFalse(sock._closed)
4783 sock.sendall(b'foo')
4784 self.assertEqual(sock.recv(1024), b'foo')
4785 self.assertTrue(sock._closed)
4786
4787 def testCreateConnectionClose(self):
4788 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004789 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004790 data = conn.recv(1024)
4791 conn.sendall(data)
4792
4793 def _testCreateConnectionClose(self):
4794 address = self.serv.getsockname()
4795 with socket.create_connection(address) as sock:
4796 sock.close()
4797 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004798 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004799
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004800
Victor Stinnerdaf45552013-08-28 00:53:59 +02004801class InheritanceTest(unittest.TestCase):
4802 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4803 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004804 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004805 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004806 with socket.socket(socket.AF_INET,
4807 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4808 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004809 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004810
4811 def test_default_inheritable(self):
4812 sock = socket.socket()
4813 with sock:
4814 self.assertEqual(sock.get_inheritable(), False)
4815
4816 def test_dup(self):
4817 sock = socket.socket()
4818 with sock:
4819 newsock = sock.dup()
4820 sock.close()
4821 with newsock:
4822 self.assertEqual(newsock.get_inheritable(), False)
4823
4824 def test_set_inheritable(self):
4825 sock = socket.socket()
4826 with sock:
4827 sock.set_inheritable(True)
4828 self.assertEqual(sock.get_inheritable(), True)
4829
4830 sock.set_inheritable(False)
4831 self.assertEqual(sock.get_inheritable(), False)
4832
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004833 @unittest.skipIf(fcntl is None, "need fcntl")
4834 def test_get_inheritable_cloexec(self):
4835 sock = socket.socket()
4836 with sock:
4837 fd = sock.fileno()
4838 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004839
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004840 # clear FD_CLOEXEC flag
4841 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4842 flags &= ~fcntl.FD_CLOEXEC
4843 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004844
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004845 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004846
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004847 @unittest.skipIf(fcntl is None, "need fcntl")
4848 def test_set_inheritable_cloexec(self):
4849 sock = socket.socket()
4850 with sock:
4851 fd = sock.fileno()
4852 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4853 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004854
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004855 sock.set_inheritable(True)
4856 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4857 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004858
4859
Victor Stinnerdaf45552013-08-28 00:53:59 +02004860 @unittest.skipUnless(hasattr(socket, "socketpair"),
4861 "need socket.socketpair()")
4862 def test_socketpair(self):
4863 s1, s2 = socket.socketpair()
4864 self.addCleanup(s1.close)
4865 self.addCleanup(s2.close)
4866 self.assertEqual(s1.get_inheritable(), False)
4867 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004868
4869
4870@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4871 "SOCK_NONBLOCK not defined")
4872class NonblockConstantTest(unittest.TestCase):
4873 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4874 if nonblock:
4875 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4876 self.assertEqual(s.gettimeout(), timeout)
4877 else:
4878 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4879 self.assertEqual(s.gettimeout(), None)
4880
Charles-François Natali239bb962011-06-03 12:55:15 +02004881 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004882 def test_SOCK_NONBLOCK(self):
4883 # a lot of it seems silly and redundant, but I wanted to test that
4884 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004885 with socket.socket(socket.AF_INET,
4886 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4887 self.checkNonblock(s)
4888 s.setblocking(1)
4889 self.checkNonblock(s, False)
4890 s.setblocking(0)
4891 self.checkNonblock(s)
4892 s.settimeout(None)
4893 self.checkNonblock(s, False)
4894 s.settimeout(2.0)
4895 self.checkNonblock(s, timeout=2.0)
4896 s.setblocking(1)
4897 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004898 # defaulttimeout
4899 t = socket.getdefaulttimeout()
4900 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004901 with socket.socket() as s:
4902 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004903 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004904 with socket.socket() as s:
4905 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004906 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004907 with socket.socket() as s:
4908 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004909 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004910 with socket.socket() as s:
4911 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004912 socket.setdefaulttimeout(t)
4913
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004914
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004915@unittest.skipUnless(os.name == "nt", "Windows specific")
4916@unittest.skipUnless(multiprocessing, "need multiprocessing")
4917class TestSocketSharing(SocketTCPTest):
4918 # This must be classmethod and not staticmethod or multiprocessing
4919 # won't be able to bootstrap it.
4920 @classmethod
4921 def remoteProcessServer(cls, q):
4922 # Recreate socket from shared data
4923 sdata = q.get()
4924 message = q.get()
4925
4926 s = socket.fromshare(sdata)
4927 s2, c = s.accept()
4928
4929 # Send the message
4930 s2.sendall(message)
4931 s2.close()
4932 s.close()
4933
4934 def testShare(self):
4935 # Transfer the listening server socket to another process
4936 # and service it from there.
4937
4938 # Create process:
4939 q = multiprocessing.Queue()
4940 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4941 p.start()
4942
4943 # Get the shared socket data
4944 data = self.serv.share(p.pid)
4945
4946 # Pass the shared socket to the other process
4947 addr = self.serv.getsockname()
4948 self.serv.close()
4949 q.put(data)
4950
4951 # The data that the server will send us
4952 message = b"slapmahfro"
4953 q.put(message)
4954
4955 # Connect
4956 s = socket.create_connection(addr)
4957 # listen for the data
4958 m = []
4959 while True:
4960 data = s.recv(100)
4961 if not data:
4962 break
4963 m.append(data)
4964 s.close()
4965 received = b"".join(m)
4966 self.assertEqual(received, message)
4967 p.join()
4968
4969 def testShareLength(self):
4970 data = self.serv.share(os.getpid())
4971 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4972 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4973
4974 def compareSockets(self, org, other):
4975 # socket sharing is expected to work only for blocking socket
4976 # since the internal python timout value isn't transfered.
4977 self.assertEqual(org.gettimeout(), None)
4978 self.assertEqual(org.gettimeout(), other.gettimeout())
4979
4980 self.assertEqual(org.family, other.family)
4981 self.assertEqual(org.type, other.type)
4982 # If the user specified "0" for proto, then
4983 # internally windows will have picked the correct value.
4984 # Python introspection on the socket however will still return
4985 # 0. For the shared socket, the python value is recreated
4986 # from the actual value, so it may not compare correctly.
4987 if org.proto != 0:
4988 self.assertEqual(org.proto, other.proto)
4989
4990 def testShareLocal(self):
4991 data = self.serv.share(os.getpid())
4992 s = socket.fromshare(data)
4993 try:
4994 self.compareSockets(self.serv, s)
4995 finally:
4996 s.close()
4997
4998 def testTypes(self):
4999 families = [socket.AF_INET, socket.AF_INET6]
5000 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5001 for f in families:
5002 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005003 try:
5004 source = socket.socket(f, t)
5005 except OSError:
5006 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005007 try:
5008 data = source.share(os.getpid())
5009 shared = socket.fromshare(data)
5010 try:
5011 self.compareSockets(source, shared)
5012 finally:
5013 shared.close()
5014 finally:
5015 source.close()
5016
5017
Guido van Rossumb995eb72002-07-31 16:08:40 +00005018def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005019 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005020 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005021
5022 tests.extend([
5023 NonBlockingTCPTests,
5024 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005025 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00005026 UnbufferedFileObjectClassTestCase,
5027 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005028 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005029 UnicodeReadFileObjectClassTestCase,
5030 UnicodeWriteFileObjectClassTestCase,
5031 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005032 NetworkConnectionNoServer,
5033 NetworkConnectionAttributesTest,
5034 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005035 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005036 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005037 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005038 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005039 tests.append(BasicSocketPairTest)
5040 tests.append(TestUnixDomain)
5041 tests.append(TestLinuxAbstractNamespace)
5042 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005043 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005044 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005045 tests.extend([
5046 CmsgMacroTests,
5047 SendmsgUDPTest,
5048 RecvmsgUDPTest,
5049 RecvmsgIntoUDPTest,
5050 SendmsgUDP6Test,
5051 RecvmsgUDP6Test,
5052 RecvmsgRFC3542AncillaryUDP6Test,
5053 RecvmsgIntoRFC3542AncillaryUDP6Test,
5054 RecvmsgIntoUDP6Test,
5055 SendmsgTCPTest,
5056 RecvmsgTCPTest,
5057 RecvmsgIntoTCPTest,
5058 SendmsgSCTPStreamTest,
5059 RecvmsgSCTPStreamTest,
5060 RecvmsgIntoSCTPStreamTest,
5061 SendmsgUnixStreamTest,
5062 RecvmsgUnixStreamTest,
5063 RecvmsgIntoUnixStreamTest,
5064 RecvmsgSCMRightsStreamTest,
5065 RecvmsgIntoSCMRightsStreamTest,
5066 # These are slow when setitimer() is not available
5067 InterruptedRecvTimeoutTest,
5068 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005069 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005070 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005071
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005072 thread_info = support.threading_setup()
5073 support.run_unittest(*tests)
5074 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005075
5076if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005077 test_main()