blob: 490f776d21e0605640444a3b7a08ee7bab3f43c8 [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
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000760 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
761 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
762 def test_sethostname(self):
763 oldhn = socket.gethostname()
764 try:
765 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200766 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000767 if e.errno == errno.EPERM:
768 self.skipTest("test should be run as root")
769 else:
770 raise
771 try:
772 # running test as root!
773 self.assertEqual(socket.gethostname(), 'new')
774 # Should work with bytes objects too
775 socket.sethostname(b'bar')
776 self.assertEqual(socket.gethostname(), 'bar')
777 finally:
778 socket.sethostname(oldhn)
779
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700780 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
781 'socket.if_nameindex() not available.')
782 def testInterfaceNameIndex(self):
783 interfaces = socket.if_nameindex()
784 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200785 self.assertIsInstance(index, int)
786 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700787 # interface indices are non-zero integers
788 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200789 _index = socket.if_nametoindex(name)
790 self.assertIsInstance(_index, int)
791 self.assertEqual(index, _index)
792 _name = socket.if_indextoname(index)
793 self.assertIsInstance(_name, str)
794 self.assertEqual(name, _name)
795
796 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
797 'socket.if_nameindex() not available.')
798 def testInvalidInterfaceNameIndex(self):
799 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200800 self.assertRaises(OSError, socket.if_indextoname, 0)
801 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200802 # test with invalid values
803 self.assertRaises(TypeError, socket.if_nametoindex, 0)
804 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700805
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000806 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000807 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000808 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000809 try:
810 # On some versions, this loses a reference
811 orig = sys.getrefcount(__name__)
812 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000813 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000814 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000815 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000816
Guido van Rossum24e4af82002-06-12 19:18:08 +0000817 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000818 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819 try:
820 # On some versions, this crashes the interpreter.
821 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200822 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000823 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000824
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000825 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000826 # This just checks that htons etc. are their own inverse,
827 # when looking at the lower 16 or 32 bits.
828 sizes = {socket.htonl: 32, socket.ntohl: 32,
829 socket.htons: 16, socket.ntohs: 16}
830 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000831 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000832 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
833 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000834
Guido van Rossuma2627af2002-09-14 00:58:46 +0000835 swapped = func(mask)
836 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000837 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000838
Guido van Rossum018919a2007-01-15 00:07:32 +0000839 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000840 good_values = [ 1, 2, 3, 1, 2, 3 ]
841 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000842 for k in good_values:
843 socket.ntohl(k)
844 socket.ntohs(k)
845 socket.htonl(k)
846 socket.htons(k)
847 for k in bad_values:
848 self.assertRaises(OverflowError, socket.ntohl, k)
849 self.assertRaises(OverflowError, socket.ntohs, k)
850 self.assertRaises(OverflowError, socket.htonl, k)
851 self.assertRaises(OverflowError, socket.htons, k)
852
Barry Warsaw11b91a02004-06-28 00:50:43 +0000853 def testGetServBy(self):
854 eq = self.assertEqual
855 # Find one service that exists, then check all the related interfaces.
856 # I've ordered this by protocols that have both a tcp and udp
857 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200858 if (sys.platform.startswith(('freebsd', 'netbsd'))
859 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000860 # avoid the 'echo' service on this platform, as there is an
861 # assumption breaking non-standard port/protocol entry
862 services = ('daytime', 'qotd', 'domain')
863 else:
864 services = ('echo', 'daytime', 'domain')
865 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000866 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000867 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000868 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200869 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000870 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000871 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200872 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000873 # Try same call with optional protocol omitted
874 port2 = socket.getservbyname(service)
875 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400876 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000877 try:
878 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200879 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000880 udpport = None
881 else:
882 eq(udpport, port)
883 # Now make sure the lookup by port returns the same service name
884 eq(socket.getservbyport(port2), service)
885 eq(socket.getservbyport(port, 'tcp'), service)
886 if udpport is not None:
887 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000888 # Make sure getservbyport does not accept out of range ports.
889 self.assertRaises(OverflowError, socket.getservbyport, -1)
890 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000891
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000892 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000893 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000894 # The default timeout should initially be None
895 self.assertEqual(socket.getdefaulttimeout(), None)
896 s = socket.socket()
897 self.assertEqual(s.gettimeout(), None)
898 s.close()
899
900 # Set the default timeout to 10, and see if it propagates
901 socket.setdefaulttimeout(10)
902 self.assertEqual(socket.getdefaulttimeout(), 10)
903 s = socket.socket()
904 self.assertEqual(s.gettimeout(), 10)
905 s.close()
906
907 # Reset the default timeout to None, and see if it propagates
908 socket.setdefaulttimeout(None)
909 self.assertEqual(socket.getdefaulttimeout(), None)
910 s = socket.socket()
911 self.assertEqual(s.gettimeout(), None)
912 s.close()
913
914 # Check that setting it to an invalid value raises ValueError
915 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
916
917 # Check that setting it to an invalid type raises TypeError
918 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
919
Benjamin Petersonf91df042009-02-13 02:50:59 +0000920 def testIPv4_inet_aton_fourbytes(self):
921 if not hasattr(socket, 'inet_aton'):
922 return # No inet_aton, nothing to check
923 # Test that issue1008086 and issue767150 are fixed.
924 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000925 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
926 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000927
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000928 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000929 if not hasattr(socket, 'inet_pton'):
930 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000931 from socket import inet_aton as f, inet_pton, AF_INET
932 g = lambda a: inet_pton(AF_INET, a)
933
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100934 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200935 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100936 )
937
Ezio Melottib3aedd42010-11-20 19:04:17 +0000938 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
939 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
940 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
941 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
942 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100943 assertInvalid(f, '0.0.0.')
944 assertInvalid(f, '300.0.0.0')
945 assertInvalid(f, 'a.0.0.0')
946 assertInvalid(f, '1.2.3.4.5')
947 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000948
Ezio Melottib3aedd42010-11-20 19:04:17 +0000949 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
950 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
951 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
952 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100953 assertInvalid(g, '0.0.0.')
954 assertInvalid(g, '300.0.0.0')
955 assertInvalid(g, 'a.0.0.0')
956 assertInvalid(g, '1.2.3.4.5')
957 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000958
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000959 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000960 if not hasattr(socket, 'inet_pton'):
961 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000962 try:
963 from socket import inet_pton, AF_INET6, has_ipv6
964 if not has_ipv6:
965 return
966 except ImportError:
967 return
968 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100969 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200970 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100971 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000972
Ezio Melottib3aedd42010-11-20 19:04:17 +0000973 self.assertEqual(b'\x00' * 16, f('::'))
974 self.assertEqual(b'\x00' * 16, f('0::0'))
975 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
976 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000977 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000978 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
979 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100980 self.assertEqual(
981 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
982 f('ad42:abc::127:0:254:2')
983 )
984 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
985 assertInvalid('0x20::')
986 assertInvalid(':::')
987 assertInvalid('::0::')
988 assertInvalid('1::abc::')
989 assertInvalid('1::abc::def')
990 assertInvalid('1:2:3:4:5:6:')
991 assertInvalid('1:2:3:4:5:6')
992 assertInvalid('1:2:3:4:5:6:7:8:')
993 assertInvalid('1:2:3:4:5:6:7:8:0')
994
995 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
996 f('::254.42.23.64')
997 )
998 self.assertEqual(
999 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1000 f('42::a29b:254.42.23.64')
1001 )
1002 self.assertEqual(
1003 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1004 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1005 )
1006 assertInvalid('255.254.253.252')
1007 assertInvalid('1::260.2.3.0')
1008 assertInvalid('1::0.be.e.0')
1009 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1010 assertInvalid('::1.2.3.4:0')
1011 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001012
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001013 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +00001014 if not hasattr(socket, 'inet_ntop'):
1015 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001016 from socket import inet_ntoa as f, inet_ntop, AF_INET
1017 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001018 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001019 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001020 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001021
Ezio Melottib3aedd42010-11-20 19:04:17 +00001022 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1023 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1024 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1025 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001026 assertInvalid(f, b'\x00' * 3)
1027 assertInvalid(f, b'\x00' * 5)
1028 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +00001029
Ezio Melottib3aedd42010-11-20 19:04:17 +00001030 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1031 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1032 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001033 assertInvalid(g, b'\x00' * 3)
1034 assertInvalid(g, b'\x00' * 5)
1035 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001036
1037 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +00001038 if not hasattr(socket, 'inet_ntop'):
1039 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001040 try:
1041 from socket import inet_ntop, AF_INET6, has_ipv6
1042 if not has_ipv6:
1043 return
1044 except ImportError:
1045 return
1046 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001047 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001048 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001049 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001050
Ezio Melottib3aedd42010-11-20 19:04:17 +00001051 self.assertEqual('::', f(b'\x00' * 16))
1052 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1053 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001054 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001055 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001056 )
1057
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001058 assertInvalid(b'\x12' * 15)
1059 assertInvalid(b'\x12' * 17)
1060 assertInvalid(b'\x12' * 4)
1061
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001062 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001063
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001064 def testSockName(self):
1065 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001066 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001067 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001068 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001069 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001070 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001071 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1072 # it reasonable to get the host's addr in addition to 0.0.0.0.
1073 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001074 try:
1075 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001076 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001077 # Probably name lookup wasn't set up right; skip this test
1078 return
Benjamin Peterson577473f2010-01-19 00:09:57 +00001079 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001080 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001081
1082 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001083 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001084 # We know a socket should start without reuse==0
1085 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001086 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001087 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001088 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001089
1090 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001091 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001092 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001093 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001094 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1095 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001096 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001097
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001098 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001099 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001100 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1101 sock.settimeout(1)
1102 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001103 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001104
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001105 def testNewAttributes(self):
1106 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001107
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001108 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1109 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001110 if hasattr(socket, 'SOCK_CLOEXEC'):
1111 self.assertIn(sock.type,
1112 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1113 socket.SOCK_STREAM))
1114 else:
1115 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001116 self.assertEqual(sock.proto, 0)
1117 sock.close()
1118
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001119 def test_getsockaddrarg(self):
1120 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001121 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001122 big_port = port + 65536
1123 neg_port = port - 65536
1124 sock = socket.socket()
1125 try:
1126 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1127 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1128 sock.bind((host, port))
1129 finally:
1130 sock.close()
1131
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001132 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001133 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001134 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1135 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1136 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1137 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001138 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1139 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001140 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001141 self.assertRaises(ValueError, s.ioctl, -1, None)
1142 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001143
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001144 def testGetaddrinfo(self):
1145 try:
1146 socket.getaddrinfo('localhost', 80)
1147 except socket.gaierror as err:
1148 if err.errno == socket.EAI_SERVICE:
1149 # see http://bugs.python.org/issue1282647
1150 self.skipTest("buggy libc version")
1151 raise
1152 # len of every sequence is supposed to be == 5
1153 for info in socket.getaddrinfo(HOST, None):
1154 self.assertEqual(len(info), 5)
1155 # host can be a domain name, a string representation of an
1156 # IPv4/v6 address or None
1157 socket.getaddrinfo('localhost', 80)
1158 socket.getaddrinfo('127.0.0.1', 80)
1159 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001160 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001161 socket.getaddrinfo('::1', 80)
1162 # port can be a string service name such as "http", a numeric
1163 # port number or None
1164 socket.getaddrinfo(HOST, "http")
1165 socket.getaddrinfo(HOST, 80)
1166 socket.getaddrinfo(HOST, None)
1167 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001168 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1169 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001170 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001171 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1172 self.assertEqual(type, socket.SOCK_STREAM)
1173 self.assertEqual(str(type), 'SocketType.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001174 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1175 for _, socktype, _, _, _ in infos:
1176 self.assertEqual(socktype, socket.SOCK_STREAM)
1177 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001178 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001179 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1180 # a server willing to support both IPv4 and IPv6 will
1181 # usually do this
1182 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1183 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001184 # test keyword arguments
1185 a = socket.getaddrinfo(HOST, None)
1186 b = socket.getaddrinfo(host=HOST, port=None)
1187 self.assertEqual(a, b)
1188 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1189 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1190 self.assertEqual(a, b)
1191 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1192 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1193 self.assertEqual(a, b)
1194 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1195 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1196 self.assertEqual(a, b)
1197 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1198 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1199 self.assertEqual(a, b)
1200 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1201 socket.AI_PASSIVE)
1202 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1203 type=socket.SOCK_STREAM, proto=0,
1204 flags=socket.AI_PASSIVE)
1205 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001206 # Issue #6697.
1207 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001208
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001209 # Issue 17269
Ronald Oussorena822d3662013-06-10 10:36:28 +02001210 if hasattr(socket, 'AI_NUMERICSERV'):
1211 socket.getaddrinfo("localhost", None, 0, 0, 0, socket.AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001212
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001213 def test_getnameinfo(self):
1214 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001215 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001216
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001217 @unittest.skipUnless(support.is_resource_enabled('network'),
1218 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001219 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001220 # Check for internet access before running test (issue #12804).
1221 try:
1222 socket.gethostbyname('python.org')
1223 except socket.gaierror as e:
1224 if e.errno == socket.EAI_NODATA:
1225 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001226 # these should all be successful
1227 socket.gethostbyname('испытание.python.org')
1228 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001229 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1230 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1231 # have a reverse entry yet
1232 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001233
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001234 def check_sendall_interrupted(self, with_timeout):
1235 # socketpair() is not stricly required, but it makes things easier.
1236 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1237 self.skipTest("signal.alarm and socket.socketpair required for this test")
1238 # Our signal handlers clobber the C errno by calling a math function
1239 # with an invalid domain value.
1240 def ok_handler(*args):
1241 self.assertRaises(ValueError, math.acosh, 0)
1242 def raising_handler(*args):
1243 self.assertRaises(ValueError, math.acosh, 0)
1244 1 // 0
1245 c, s = socket.socketpair()
1246 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1247 try:
1248 if with_timeout:
1249 # Just above the one second minimum for signal.alarm
1250 c.settimeout(1.5)
1251 with self.assertRaises(ZeroDivisionError):
1252 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001253 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001254 if with_timeout:
1255 signal.signal(signal.SIGALRM, ok_handler)
1256 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001257 self.assertRaises(socket.timeout, c.sendall,
1258 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001259 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001260 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001261 signal.signal(signal.SIGALRM, old_alarm)
1262 c.close()
1263 s.close()
1264
1265 def test_sendall_interrupted(self):
1266 self.check_sendall_interrupted(False)
1267
1268 def test_sendall_interrupted_with_timeout(self):
1269 self.check_sendall_interrupted(True)
1270
Antoine Pitroue033e062010-10-29 10:38:18 +00001271 def test_dealloc_warn(self):
1272 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1273 r = repr(sock)
1274 with self.assertWarns(ResourceWarning) as cm:
1275 sock = None
1276 support.gc_collect()
1277 self.assertIn(r, str(cm.warning.args[0]))
1278 # An open socket file object gets dereferenced after the socket
1279 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1280 f = sock.makefile('rb')
1281 r = repr(sock)
1282 sock = None
1283 support.gc_collect()
1284 with self.assertWarns(ResourceWarning):
1285 f = None
1286 support.gc_collect()
1287
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001288 def test_name_closed_socketio(self):
1289 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1290 fp = sock.makefile("rb")
1291 fp.close()
1292 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1293
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001294 def test_unusable_closed_socketio(self):
1295 with socket.socket() as sock:
1296 fp = sock.makefile("rb", buffering=0)
1297 self.assertTrue(fp.readable())
1298 self.assertFalse(fp.writable())
1299 self.assertFalse(fp.seekable())
1300 fp.close()
1301 self.assertRaises(ValueError, fp.readable)
1302 self.assertRaises(ValueError, fp.writable)
1303 self.assertRaises(ValueError, fp.seekable)
1304
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001305 def test_pickle(self):
1306 sock = socket.socket()
1307 with sock:
1308 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1309 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1310
Serhiy Storchaka78980432013-01-15 01:12:17 +02001311 def test_listen_backlog(self):
1312 for backlog in 0, -1:
1313 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1314 srv.bind((HOST, 0))
1315 srv.listen(backlog)
1316 srv.close()
1317
1318 # Issue 15989
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001319 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1320 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001321 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001322 srv.close()
1323
Charles-François Natali42663332012-01-02 15:57:30 +01001324 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001325 def test_flowinfo(self):
1326 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001327 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001328 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001329 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001330
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001331 def test_str_for_enums(self):
1332 # Make sure that the AF_* and SOCK_* constants have enum-like string
1333 # reprs.
1334 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1335 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
1336 self.assertEqual(str(s.type), 'SocketType.SOCK_STREAM')
1337
1338 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1339 def test_uknown_socket_family_repr(self):
1340 # Test that when created with a family that's not one of the known
1341 # AF_*/SOCK_* constants, socket.family just returns the number.
1342 #
1343 # To do this we fool socket.socket into believing it already has an
1344 # open fd because on this path it doesn't actually verify the family and
1345 # type and populates the socket object.
1346 #
1347 # On Windows this trick won't work, so the test is skipped.
1348 fd, _ = tempfile.mkstemp()
1349 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1350 self.assertEqual(s.family, 42424)
1351 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001352
Charles-François Natali47413c12011-10-06 19:47:44 +02001353@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1354class BasicCANTest(unittest.TestCase):
1355
1356 def testCrucialConstants(self):
1357 socket.AF_CAN
1358 socket.PF_CAN
1359 socket.CAN_RAW
1360
Charles-François Natali773e42d2013-02-05 19:42:01 +01001361 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1362 'socket.CAN_BCM required for this test.')
1363 def testBCMConstants(self):
1364 socket.CAN_BCM
1365
1366 # opcodes
1367 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1368 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1369 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1370 socket.CAN_BCM_TX_SEND # send one CAN frame
1371 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1372 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1373 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1374 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1375 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1376 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1377 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1378 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1379
Charles-François Natali47413c12011-10-06 19:47:44 +02001380 def testCreateSocket(self):
1381 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1382 pass
1383
Charles-François Natali773e42d2013-02-05 19:42:01 +01001384 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1385 'socket.CAN_BCM required for this test.')
1386 def testCreateBCMSocket(self):
1387 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1388 pass
1389
Charles-François Natali47413c12011-10-06 19:47:44 +02001390 def testBindAny(self):
1391 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1392 s.bind(('', ))
1393
1394 def testTooLongInterfaceName(self):
1395 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1396 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001397 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001398 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001399
1400 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1401 'socket.CAN_RAW_LOOPBACK required for this test.')
1402 def testLoopback(self):
1403 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1404 for loopback in (0, 1):
1405 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1406 loopback)
1407 self.assertEqual(loopback,
1408 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1409
1410 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1411 'socket.CAN_RAW_FILTER required for this test.')
1412 def testFilter(self):
1413 can_id, can_mask = 0x200, 0x700
1414 can_filter = struct.pack("=II", can_id, can_mask)
1415 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1416 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1417 self.assertEqual(can_filter,
1418 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1419
1420
1421@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001422class CANTest(ThreadedCANSocketTest):
1423
Charles-François Natali47413c12011-10-06 19:47:44 +02001424 def __init__(self, methodName='runTest'):
1425 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1426
1427 @classmethod
1428 def build_can_frame(cls, can_id, data):
1429 """Build a CAN frame."""
1430 can_dlc = len(data)
1431 data = data.ljust(8, b'\x00')
1432 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1433
1434 @classmethod
1435 def dissect_can_frame(cls, frame):
1436 """Dissect a CAN frame."""
1437 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1438 return (can_id, can_dlc, data[:can_dlc])
1439
1440 def testSendFrame(self):
1441 cf, addr = self.s.recvfrom(self.bufsize)
1442 self.assertEqual(self.cf, cf)
1443 self.assertEqual(addr[0], self.interface)
1444 self.assertEqual(addr[1], socket.AF_CAN)
1445
1446 def _testSendFrame(self):
1447 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1448 self.cli.send(self.cf)
1449
1450 def testSendMaxFrame(self):
1451 cf, addr = self.s.recvfrom(self.bufsize)
1452 self.assertEqual(self.cf, cf)
1453
1454 def _testSendMaxFrame(self):
1455 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1456 self.cli.send(self.cf)
1457
1458 def testSendMultiFrames(self):
1459 cf, addr = self.s.recvfrom(self.bufsize)
1460 self.assertEqual(self.cf1, cf)
1461
1462 cf, addr = self.s.recvfrom(self.bufsize)
1463 self.assertEqual(self.cf2, cf)
1464
1465 def _testSendMultiFrames(self):
1466 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1467 self.cli.send(self.cf1)
1468
1469 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1470 self.cli.send(self.cf2)
1471
Charles-François Natali773e42d2013-02-05 19:42:01 +01001472 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1473 'socket.CAN_BCM required for this test.')
1474 def _testBCM(self):
1475 cf, addr = self.cli.recvfrom(self.bufsize)
1476 self.assertEqual(self.cf, cf)
1477 can_id, can_dlc, data = self.dissect_can_frame(cf)
1478 self.assertEqual(self.can_id, can_id)
1479 self.assertEqual(self.data, data)
1480
1481 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1482 'socket.CAN_BCM required for this test.')
1483 def testBCM(self):
1484 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1485 self.addCleanup(bcm.close)
1486 bcm.connect((self.interface,))
1487 self.can_id = 0x123
1488 self.data = bytes([0xc0, 0xff, 0xee])
1489 self.cf = self.build_can_frame(self.can_id, self.data)
1490 opcode = socket.CAN_BCM_TX_SEND
1491 flags = 0
1492 count = 0
1493 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1494 bcm_can_id = 0x0222
1495 nframes = 1
1496 assert len(self.cf) == 16
1497 header = struct.pack(self.bcm_cmd_msg_fmt,
1498 opcode,
1499 flags,
1500 count,
1501 ival1_seconds,
1502 ival1_usec,
1503 ival2_seconds,
1504 ival2_usec,
1505 bcm_can_id,
1506 nframes,
1507 )
1508 header_plus_frame = header + self.cf
1509 bytes_sent = bcm.send(header_plus_frame)
1510 self.assertEqual(bytes_sent, len(header_plus_frame))
1511
Charles-François Natali47413c12011-10-06 19:47:44 +02001512
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001513@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1514class BasicRDSTest(unittest.TestCase):
1515
1516 def testCrucialConstants(self):
1517 socket.AF_RDS
1518 socket.PF_RDS
1519
1520 def testCreateSocket(self):
1521 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1522 pass
1523
1524 def testSocketBufferSize(self):
1525 bufsize = 16384
1526 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1527 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1528 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1529
1530
1531@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1532@unittest.skipUnless(thread, 'Threading required for this test.')
1533class RDSTest(ThreadedRDSSocketTest):
1534
1535 def __init__(self, methodName='runTest'):
1536 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1537
Charles-François Natali240c55f2011-11-10 20:33:36 +01001538 def setUp(self):
1539 super().setUp()
1540 self.evt = threading.Event()
1541
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001542 def testSendAndRecv(self):
1543 data, addr = self.serv.recvfrom(self.bufsize)
1544 self.assertEqual(self.data, data)
1545 self.assertEqual(self.cli_addr, addr)
1546
1547 def _testSendAndRecv(self):
1548 self.data = b'spam'
1549 self.cli.sendto(self.data, 0, (HOST, self.port))
1550
1551 def testPeek(self):
1552 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1553 self.assertEqual(self.data, data)
1554 data, addr = self.serv.recvfrom(self.bufsize)
1555 self.assertEqual(self.data, data)
1556
1557 def _testPeek(self):
1558 self.data = b'spam'
1559 self.cli.sendto(self.data, 0, (HOST, self.port))
1560
1561 @requireAttrs(socket.socket, 'recvmsg')
1562 def testSendAndRecvMsg(self):
1563 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1564 self.assertEqual(self.data, data)
1565
1566 @requireAttrs(socket.socket, 'sendmsg')
1567 def _testSendAndRecvMsg(self):
1568 self.data = b'hello ' * 10
1569 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1570
1571 def testSendAndRecvMulti(self):
1572 data, addr = self.serv.recvfrom(self.bufsize)
1573 self.assertEqual(self.data1, data)
1574
1575 data, addr = self.serv.recvfrom(self.bufsize)
1576 self.assertEqual(self.data2, data)
1577
1578 def _testSendAndRecvMulti(self):
1579 self.data1 = b'bacon'
1580 self.cli.sendto(self.data1, 0, (HOST, self.port))
1581
1582 self.data2 = b'egg'
1583 self.cli.sendto(self.data2, 0, (HOST, self.port))
1584
1585 def testSelect(self):
1586 r, w, x = select.select([self.serv], [], [], 3.0)
1587 self.assertIn(self.serv, r)
1588 data, addr = self.serv.recvfrom(self.bufsize)
1589 self.assertEqual(self.data, data)
1590
1591 def _testSelect(self):
1592 self.data = b'select'
1593 self.cli.sendto(self.data, 0, (HOST, self.port))
1594
1595 def testCongestion(self):
1596 # wait until the sender is done
1597 self.evt.wait()
1598
1599 def _testCongestion(self):
1600 # test the behavior in case of congestion
1601 self.data = b'fill'
1602 self.cli.setblocking(False)
1603 try:
1604 # try to lower the receiver's socket buffer size
1605 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1606 except OSError:
1607 pass
1608 with self.assertRaises(OSError) as cm:
1609 try:
1610 # fill the receiver's socket buffer
1611 while True:
1612 self.cli.sendto(self.data, 0, (HOST, self.port))
1613 finally:
1614 # signal the receiver we're done
1615 self.evt.set()
1616 # sendto() should have failed with ENOBUFS
1617 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1618 # and we should have received a congestion notification through poll
1619 r, w, x = select.select([self.serv], [], [], 3.0)
1620 self.assertIn(self.serv, r)
1621
1622
Victor Stinner45df8202010-04-28 22:31:17 +00001623@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001624class BasicTCPTest(SocketConnectedTest):
1625
1626 def __init__(self, methodName='runTest'):
1627 SocketConnectedTest.__init__(self, methodName=methodName)
1628
1629 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001630 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001631 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001632 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001633
1634 def _testRecv(self):
1635 self.serv_conn.send(MSG)
1636
1637 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001638 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001639 seg1 = self.cli_conn.recv(len(MSG) - 3)
1640 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001641 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001642 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001643
1644 def _testOverFlowRecv(self):
1645 self.serv_conn.send(MSG)
1646
1647 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001648 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001649 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001650 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001651
1652 def _testRecvFrom(self):
1653 self.serv_conn.send(MSG)
1654
1655 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001656 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001657 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1658 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001659 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001660 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001661
1662 def _testOverFlowRecvFrom(self):
1663 self.serv_conn.send(MSG)
1664
1665 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001666 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001667 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001668 while 1:
1669 read = self.cli_conn.recv(1024)
1670 if not read:
1671 break
Guido van Rossume531e292002-08-08 20:28:34 +00001672 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001673 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001674
1675 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001676 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001677 self.serv_conn.sendall(big_chunk)
1678
1679 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001680 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001681 fd = self.cli_conn.fileno()
1682 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001683 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001684 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001685 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001686 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001687
1688 def _testFromFd(self):
1689 self.serv_conn.send(MSG)
1690
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001691 def testDup(self):
1692 # Testing dup()
1693 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001694 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001695 msg = sock.recv(1024)
1696 self.assertEqual(msg, MSG)
1697
1698 def _testDup(self):
1699 self.serv_conn.send(MSG)
1700
Guido van Rossum24e4af82002-06-12 19:18:08 +00001701 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001702 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001703 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001704 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001705 # wait for _testShutdown to finish: on OS X, when the server
1706 # closes the connection the client also becomes disconnected,
1707 # and the client's shutdown call will fail. (Issue #4397.)
1708 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001709
1710 def _testShutdown(self):
1711 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001712 # Issue 15989
1713 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1714 _testcapi.INT_MAX + 1)
1715 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1716 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001717 self.serv_conn.shutdown(2)
1718
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001719 def testDetach(self):
1720 # Testing detach()
1721 fileno = self.cli_conn.fileno()
1722 f = self.cli_conn.detach()
1723 self.assertEqual(f, fileno)
1724 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001725 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001726 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001727 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001728 # ...but we can create another socket using the (still open)
1729 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001730 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001731 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001732 msg = sock.recv(1024)
1733 self.assertEqual(msg, MSG)
1734
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001735 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001736 self.serv_conn.send(MSG)
1737
Victor Stinner45df8202010-04-28 22:31:17 +00001738@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001739class BasicUDPTest(ThreadedUDPSocketTest):
1740
1741 def __init__(self, methodName='runTest'):
1742 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1743
1744 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001745 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001746 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001747 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001748
1749 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001750 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001751
Guido van Rossum1c938012002-06-12 21:17:20 +00001752 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001753 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001754 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001755 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001756
Guido van Rossum1c938012002-06-12 21:17:20 +00001757 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001758 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001759
Guido van Rossumd8faa362007-04-27 19:54:29 +00001760 def testRecvFromNegative(self):
1761 # Negative lengths passed to recvfrom should give ValueError.
1762 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1763
1764 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001765 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001766
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001767# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1768# same test code is used with different families and types of socket
1769# (e.g. stream, datagram), and tests using recvmsg() are repeated
1770# using recvmsg_into().
1771#
1772# The generic test classes such as SendmsgTests and
1773# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1774# supplied with sockets cli_sock and serv_sock representing the
1775# client's and the server's end of the connection respectively, and
1776# attributes cli_addr and serv_addr holding their (numeric where
1777# appropriate) addresses.
1778#
1779# The final concrete test classes combine these with subclasses of
1780# SocketTestBase which set up client and server sockets of a specific
1781# type, and with subclasses of SendrecvmsgBase such as
1782# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1783# sockets to cli_sock and serv_sock and override the methods and
1784# attributes of SendrecvmsgBase to fill in destination addresses if
1785# needed when sending, check for specific flags in msg_flags, etc.
1786#
1787# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1788# recvmsg_into().
1789
1790# XXX: like the other datagram (UDP) tests in this module, the code
1791# here assumes that datagram delivery on the local machine will be
1792# reliable.
1793
1794class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1795 # Base class for sendmsg()/recvmsg() tests.
1796
1797 # Time in seconds to wait before considering a test failed, or
1798 # None for no timeout. Not all tests actually set a timeout.
1799 fail_timeout = 3.0
1800
1801 def setUp(self):
1802 self.misc_event = threading.Event()
1803 super().setUp()
1804
1805 def sendToServer(self, msg):
1806 # Send msg to the server.
1807 return self.cli_sock.send(msg)
1808
1809 # Tuple of alternative default arguments for sendmsg() when called
1810 # via sendmsgToServer() (e.g. to include a destination address).
1811 sendmsg_to_server_defaults = ()
1812
1813 def sendmsgToServer(self, *args):
1814 # Call sendmsg() on self.cli_sock with the given arguments,
1815 # filling in any arguments which are not supplied with the
1816 # corresponding items of self.sendmsg_to_server_defaults, if
1817 # any.
1818 return self.cli_sock.sendmsg(
1819 *(args + self.sendmsg_to_server_defaults[len(args):]))
1820
1821 def doRecvmsg(self, sock, bufsize, *args):
1822 # Call recvmsg() on sock with given arguments and return its
1823 # result. Should be used for tests which can use either
1824 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1825 # this method with one which emulates it using recvmsg_into(),
1826 # thus allowing the same test to be used for both methods.
1827 result = sock.recvmsg(bufsize, *args)
1828 self.registerRecvmsgResult(result)
1829 return result
1830
1831 def registerRecvmsgResult(self, result):
1832 # Called by doRecvmsg() with the return value of recvmsg() or
1833 # recvmsg_into(). Can be overridden to arrange cleanup based
1834 # on the returned ancillary data, for instance.
1835 pass
1836
1837 def checkRecvmsgAddress(self, addr1, addr2):
1838 # Called to compare the received address with the address of
1839 # the peer.
1840 self.assertEqual(addr1, addr2)
1841
1842 # Flags that are normally unset in msg_flags
1843 msg_flags_common_unset = 0
1844 for name in ("MSG_CTRUNC", "MSG_OOB"):
1845 msg_flags_common_unset |= getattr(socket, name, 0)
1846
1847 # Flags that are normally set
1848 msg_flags_common_set = 0
1849
1850 # Flags set when a complete record has been received (e.g. MSG_EOR
1851 # for SCTP)
1852 msg_flags_eor_indicator = 0
1853
1854 # Flags set when a complete record has not been received
1855 # (e.g. MSG_TRUNC for datagram sockets)
1856 msg_flags_non_eor_indicator = 0
1857
1858 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1859 # Method to check the value of msg_flags returned by recvmsg[_into]().
1860 #
1861 # Checks that all bits in msg_flags_common_set attribute are
1862 # set in "flags" and all bits in msg_flags_common_unset are
1863 # unset.
1864 #
1865 # The "eor" argument specifies whether the flags should
1866 # indicate that a full record (or datagram) has been received.
1867 # If "eor" is None, no checks are done; otherwise, checks
1868 # that:
1869 #
1870 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1871 # set and all bits in msg_flags_non_eor_indicator are unset
1872 #
1873 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1874 # are set and all bits in msg_flags_eor_indicator are unset
1875 #
1876 # If "checkset" and/or "checkunset" are supplied, they require
1877 # the given bits to be set or unset respectively, overriding
1878 # what the attributes require for those bits.
1879 #
1880 # If any bits are set in "ignore", they will not be checked,
1881 # regardless of the other inputs.
1882 #
1883 # Will raise Exception if the inputs require a bit to be both
1884 # set and unset, and it is not ignored.
1885
1886 defaultset = self.msg_flags_common_set
1887 defaultunset = self.msg_flags_common_unset
1888
1889 if eor:
1890 defaultset |= self.msg_flags_eor_indicator
1891 defaultunset |= self.msg_flags_non_eor_indicator
1892 elif eor is not None:
1893 defaultset |= self.msg_flags_non_eor_indicator
1894 defaultunset |= self.msg_flags_eor_indicator
1895
1896 # Function arguments override defaults
1897 defaultset &= ~checkunset
1898 defaultunset &= ~checkset
1899
1900 # Merge arguments with remaining defaults, and check for conflicts
1901 checkset |= defaultset
1902 checkunset |= defaultunset
1903 inboth = checkset & checkunset & ~ignore
1904 if inboth:
1905 raise Exception("contradictory set, unset requirements for flags "
1906 "{0:#x}".format(inboth))
1907
1908 # Compare with given msg_flags value
1909 mask = (checkset | checkunset) & ~ignore
1910 self.assertEqual(flags & mask, checkset & mask)
1911
1912
1913class RecvmsgIntoMixin(SendrecvmsgBase):
1914 # Mixin to implement doRecvmsg() using recvmsg_into().
1915
1916 def doRecvmsg(self, sock, bufsize, *args):
1917 buf = bytearray(bufsize)
1918 result = sock.recvmsg_into([buf], *args)
1919 self.registerRecvmsgResult(result)
1920 self.assertGreaterEqual(result[0], 0)
1921 self.assertLessEqual(result[0], bufsize)
1922 return (bytes(buf[:result[0]]),) + result[1:]
1923
1924
1925class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1926 # Defines flags to be checked in msg_flags for datagram sockets.
1927
1928 @property
1929 def msg_flags_non_eor_indicator(self):
1930 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1931
1932
1933class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1934 # Defines flags to be checked in msg_flags for SCTP sockets.
1935
1936 @property
1937 def msg_flags_eor_indicator(self):
1938 return super().msg_flags_eor_indicator | socket.MSG_EOR
1939
1940
1941class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1942 # Base class for tests on connectionless-mode sockets. Users must
1943 # supply sockets on attributes cli and serv to be mapped to
1944 # cli_sock and serv_sock respectively.
1945
1946 @property
1947 def serv_sock(self):
1948 return self.serv
1949
1950 @property
1951 def cli_sock(self):
1952 return self.cli
1953
1954 @property
1955 def sendmsg_to_server_defaults(self):
1956 return ([], [], 0, self.serv_addr)
1957
1958 def sendToServer(self, msg):
1959 return self.cli_sock.sendto(msg, self.serv_addr)
1960
1961
1962class SendrecvmsgConnectedBase(SendrecvmsgBase):
1963 # Base class for tests on connected sockets. Users must supply
1964 # sockets on attributes serv_conn and cli_conn (representing the
1965 # connections *to* the server and the client), to be mapped to
1966 # cli_sock and serv_sock respectively.
1967
1968 @property
1969 def serv_sock(self):
1970 return self.cli_conn
1971
1972 @property
1973 def cli_sock(self):
1974 return self.serv_conn
1975
1976 def checkRecvmsgAddress(self, addr1, addr2):
1977 # Address is currently "unspecified" for a connected socket,
1978 # so we don't examine it
1979 pass
1980
1981
1982class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1983 # Base class to set a timeout on server's socket.
1984
1985 def setUp(self):
1986 super().setUp()
1987 self.serv_sock.settimeout(self.fail_timeout)
1988
1989
1990class SendmsgTests(SendrecvmsgServerTimeoutBase):
1991 # Tests for sendmsg() which can use any socket type and do not
1992 # involve recvmsg() or recvmsg_into().
1993
1994 def testSendmsg(self):
1995 # Send a simple message with sendmsg().
1996 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1997
1998 def _testSendmsg(self):
1999 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2000
2001 def testSendmsgDataGenerator(self):
2002 # Send from buffer obtained from a generator (not a sequence).
2003 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2004
2005 def _testSendmsgDataGenerator(self):
2006 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2007 len(MSG))
2008
2009 def testSendmsgAncillaryGenerator(self):
2010 # Gather (empty) ancillary data from a generator.
2011 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2012
2013 def _testSendmsgAncillaryGenerator(self):
2014 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2015 len(MSG))
2016
2017 def testSendmsgArray(self):
2018 # Send data from an array instead of the usual bytes object.
2019 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2020
2021 def _testSendmsgArray(self):
2022 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2023 len(MSG))
2024
2025 def testSendmsgGather(self):
2026 # Send message data from more than one buffer (gather write).
2027 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2028
2029 def _testSendmsgGather(self):
2030 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2031
2032 def testSendmsgBadArgs(self):
2033 # Check that sendmsg() rejects invalid arguments.
2034 self.assertEqual(self.serv_sock.recv(1000), b"done")
2035
2036 def _testSendmsgBadArgs(self):
2037 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2038 self.assertRaises(TypeError, self.sendmsgToServer,
2039 b"not in an iterable")
2040 self.assertRaises(TypeError, self.sendmsgToServer,
2041 object())
2042 self.assertRaises(TypeError, self.sendmsgToServer,
2043 [object()])
2044 self.assertRaises(TypeError, self.sendmsgToServer,
2045 [MSG, object()])
2046 self.assertRaises(TypeError, self.sendmsgToServer,
2047 [MSG], object())
2048 self.assertRaises(TypeError, self.sendmsgToServer,
2049 [MSG], [], object())
2050 self.assertRaises(TypeError, self.sendmsgToServer,
2051 [MSG], [], 0, object())
2052 self.sendToServer(b"done")
2053
2054 def testSendmsgBadCmsg(self):
2055 # Check that invalid ancillary data items are rejected.
2056 self.assertEqual(self.serv_sock.recv(1000), b"done")
2057
2058 def _testSendmsgBadCmsg(self):
2059 self.assertRaises(TypeError, self.sendmsgToServer,
2060 [MSG], [object()])
2061 self.assertRaises(TypeError, self.sendmsgToServer,
2062 [MSG], [(object(), 0, b"data")])
2063 self.assertRaises(TypeError, self.sendmsgToServer,
2064 [MSG], [(0, object(), b"data")])
2065 self.assertRaises(TypeError, self.sendmsgToServer,
2066 [MSG], [(0, 0, object())])
2067 self.assertRaises(TypeError, self.sendmsgToServer,
2068 [MSG], [(0, 0)])
2069 self.assertRaises(TypeError, self.sendmsgToServer,
2070 [MSG], [(0, 0, b"data", 42)])
2071 self.sendToServer(b"done")
2072
2073 @requireAttrs(socket, "CMSG_SPACE")
2074 def testSendmsgBadMultiCmsg(self):
2075 # Check that invalid ancillary data items are rejected when
2076 # more than one item is present.
2077 self.assertEqual(self.serv_sock.recv(1000), b"done")
2078
2079 @testSendmsgBadMultiCmsg.client_skip
2080 def _testSendmsgBadMultiCmsg(self):
2081 self.assertRaises(TypeError, self.sendmsgToServer,
2082 [MSG], [0, 0, b""])
2083 self.assertRaises(TypeError, self.sendmsgToServer,
2084 [MSG], [(0, 0, b""), object()])
2085 self.sendToServer(b"done")
2086
2087 def testSendmsgExcessCmsgReject(self):
2088 # Check that sendmsg() rejects excess ancillary data items
2089 # when the number that can be sent is limited.
2090 self.assertEqual(self.serv_sock.recv(1000), b"done")
2091
2092 def _testSendmsgExcessCmsgReject(self):
2093 if not hasattr(socket, "CMSG_SPACE"):
2094 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002095 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002096 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2097 self.assertIsNone(cm.exception.errno)
2098 self.sendToServer(b"done")
2099
2100 def testSendmsgAfterClose(self):
2101 # Check that sendmsg() fails on a closed socket.
2102 pass
2103
2104 def _testSendmsgAfterClose(self):
2105 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002106 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002107
2108
2109class SendmsgStreamTests(SendmsgTests):
2110 # Tests for sendmsg() which require a stream socket and do not
2111 # involve recvmsg() or recvmsg_into().
2112
2113 def testSendmsgExplicitNoneAddr(self):
2114 # Check that peer address can be specified as None.
2115 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2116
2117 def _testSendmsgExplicitNoneAddr(self):
2118 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2119
2120 def testSendmsgTimeout(self):
2121 # Check that timeout works with sendmsg().
2122 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2123 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2124
2125 def _testSendmsgTimeout(self):
2126 try:
2127 self.cli_sock.settimeout(0.03)
2128 with self.assertRaises(socket.timeout):
2129 while True:
2130 self.sendmsgToServer([b"a"*512])
2131 finally:
2132 self.misc_event.set()
2133
2134 # XXX: would be nice to have more tests for sendmsg flags argument.
2135
2136 # Linux supports MSG_DONTWAIT when sending, but in general, it
2137 # only works when receiving. Could add other platforms if they
2138 # support it too.
2139 @skipWithClientIf(sys.platform not in {"linux2"},
2140 "MSG_DONTWAIT not known to work on this platform when "
2141 "sending")
2142 def testSendmsgDontWait(self):
2143 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2144 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2145 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2146
2147 @testSendmsgDontWait.client_skip
2148 def _testSendmsgDontWait(self):
2149 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002150 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002151 while True:
2152 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2153 self.assertIn(cm.exception.errno,
2154 (errno.EAGAIN, errno.EWOULDBLOCK))
2155 finally:
2156 self.misc_event.set()
2157
2158
2159class SendmsgConnectionlessTests(SendmsgTests):
2160 # Tests for sendmsg() which require a connectionless-mode
2161 # (e.g. datagram) socket, and do not involve recvmsg() or
2162 # recvmsg_into().
2163
2164 def testSendmsgNoDestAddr(self):
2165 # Check that sendmsg() fails when no destination address is
2166 # given for unconnected socket.
2167 pass
2168
2169 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002170 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002171 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002172 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002173 [MSG], [], 0, None)
2174
2175
2176class RecvmsgGenericTests(SendrecvmsgBase):
2177 # Tests for recvmsg() which can also be emulated using
2178 # recvmsg_into(), and can use any socket type.
2179
2180 def testRecvmsg(self):
2181 # Receive a simple message with recvmsg[_into]().
2182 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2183 self.assertEqual(msg, MSG)
2184 self.checkRecvmsgAddress(addr, self.cli_addr)
2185 self.assertEqual(ancdata, [])
2186 self.checkFlags(flags, eor=True)
2187
2188 def _testRecvmsg(self):
2189 self.sendToServer(MSG)
2190
2191 def testRecvmsgExplicitDefaults(self):
2192 # Test recvmsg[_into]() with default arguments provided explicitly.
2193 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2194 len(MSG), 0, 0)
2195 self.assertEqual(msg, MSG)
2196 self.checkRecvmsgAddress(addr, self.cli_addr)
2197 self.assertEqual(ancdata, [])
2198 self.checkFlags(flags, eor=True)
2199
2200 def _testRecvmsgExplicitDefaults(self):
2201 self.sendToServer(MSG)
2202
2203 def testRecvmsgShorter(self):
2204 # Receive a message smaller than buffer.
2205 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2206 len(MSG) + 42)
2207 self.assertEqual(msg, MSG)
2208 self.checkRecvmsgAddress(addr, self.cli_addr)
2209 self.assertEqual(ancdata, [])
2210 self.checkFlags(flags, eor=True)
2211
2212 def _testRecvmsgShorter(self):
2213 self.sendToServer(MSG)
2214
Charles-François Natali8619cd72011-10-03 19:43:15 +02002215 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2216 # datagram is received (issue #13001).
2217 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002218 def testRecvmsgTrunc(self):
2219 # Receive part of message, check for truncation indicators.
2220 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2221 len(MSG) - 3)
2222 self.assertEqual(msg, MSG[:-3])
2223 self.checkRecvmsgAddress(addr, self.cli_addr)
2224 self.assertEqual(ancdata, [])
2225 self.checkFlags(flags, eor=False)
2226
Charles-François Natali8619cd72011-10-03 19:43:15 +02002227 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002228 def _testRecvmsgTrunc(self):
2229 self.sendToServer(MSG)
2230
2231 def testRecvmsgShortAncillaryBuf(self):
2232 # Test ancillary data buffer too small to hold any ancillary data.
2233 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2234 len(MSG), 1)
2235 self.assertEqual(msg, MSG)
2236 self.checkRecvmsgAddress(addr, self.cli_addr)
2237 self.assertEqual(ancdata, [])
2238 self.checkFlags(flags, eor=True)
2239
2240 def _testRecvmsgShortAncillaryBuf(self):
2241 self.sendToServer(MSG)
2242
2243 def testRecvmsgLongAncillaryBuf(self):
2244 # Test large ancillary data buffer.
2245 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2246 len(MSG), 10240)
2247 self.assertEqual(msg, MSG)
2248 self.checkRecvmsgAddress(addr, self.cli_addr)
2249 self.assertEqual(ancdata, [])
2250 self.checkFlags(flags, eor=True)
2251
2252 def _testRecvmsgLongAncillaryBuf(self):
2253 self.sendToServer(MSG)
2254
2255 def testRecvmsgAfterClose(self):
2256 # Check that recvmsg[_into]() fails on a closed socket.
2257 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002258 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002259
2260 def _testRecvmsgAfterClose(self):
2261 pass
2262
2263 def testRecvmsgTimeout(self):
2264 # Check that timeout works.
2265 try:
2266 self.serv_sock.settimeout(0.03)
2267 self.assertRaises(socket.timeout,
2268 self.doRecvmsg, self.serv_sock, len(MSG))
2269 finally:
2270 self.misc_event.set()
2271
2272 def _testRecvmsgTimeout(self):
2273 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2274
2275 @requireAttrs(socket, "MSG_PEEK")
2276 def testRecvmsgPeek(self):
2277 # Check that MSG_PEEK in flags enables examination of pending
2278 # data without consuming it.
2279
2280 # Receive part of data with MSG_PEEK.
2281 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2282 len(MSG) - 3, 0,
2283 socket.MSG_PEEK)
2284 self.assertEqual(msg, MSG[:-3])
2285 self.checkRecvmsgAddress(addr, self.cli_addr)
2286 self.assertEqual(ancdata, [])
2287 # Ignoring MSG_TRUNC here (so this test is the same for stream
2288 # and datagram sockets). Some wording in POSIX seems to
2289 # suggest that it needn't be set when peeking, but that may
2290 # just be a slip.
2291 self.checkFlags(flags, eor=False,
2292 ignore=getattr(socket, "MSG_TRUNC", 0))
2293
2294 # Receive all data with MSG_PEEK.
2295 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2296 len(MSG), 0,
2297 socket.MSG_PEEK)
2298 self.assertEqual(msg, MSG)
2299 self.checkRecvmsgAddress(addr, self.cli_addr)
2300 self.assertEqual(ancdata, [])
2301 self.checkFlags(flags, eor=True)
2302
2303 # Check that the same data can still be received normally.
2304 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2305 self.assertEqual(msg, MSG)
2306 self.checkRecvmsgAddress(addr, self.cli_addr)
2307 self.assertEqual(ancdata, [])
2308 self.checkFlags(flags, eor=True)
2309
2310 @testRecvmsgPeek.client_skip
2311 def _testRecvmsgPeek(self):
2312 self.sendToServer(MSG)
2313
2314 @requireAttrs(socket.socket, "sendmsg")
2315 def testRecvmsgFromSendmsg(self):
2316 # Test receiving with recvmsg[_into]() when message is sent
2317 # using sendmsg().
2318 self.serv_sock.settimeout(self.fail_timeout)
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 @testRecvmsgFromSendmsg.client_skip
2326 def _testRecvmsgFromSendmsg(self):
2327 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2328
2329
2330class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2331 # Tests which require a stream socket and can use either recvmsg()
2332 # or recvmsg_into().
2333
2334 def testRecvmsgEOF(self):
2335 # Receive end-of-stream indicator (b"", peer socket closed).
2336 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2337 self.assertEqual(msg, b"")
2338 self.checkRecvmsgAddress(addr, self.cli_addr)
2339 self.assertEqual(ancdata, [])
2340 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2341
2342 def _testRecvmsgEOF(self):
2343 self.cli_sock.close()
2344
2345 def testRecvmsgOverflow(self):
2346 # Receive a message in more than one chunk.
2347 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2348 len(MSG) - 3)
2349 self.checkRecvmsgAddress(addr, self.cli_addr)
2350 self.assertEqual(ancdata, [])
2351 self.checkFlags(flags, eor=False)
2352
2353 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2354 self.checkRecvmsgAddress(addr, self.cli_addr)
2355 self.assertEqual(ancdata, [])
2356 self.checkFlags(flags, eor=True)
2357
2358 msg = seg1 + seg2
2359 self.assertEqual(msg, MSG)
2360
2361 def _testRecvmsgOverflow(self):
2362 self.sendToServer(MSG)
2363
2364
2365class RecvmsgTests(RecvmsgGenericTests):
2366 # Tests for recvmsg() which can use any socket type.
2367
2368 def testRecvmsgBadArgs(self):
2369 # Check that recvmsg() rejects invalid arguments.
2370 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2371 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2372 -1, 0, 0)
2373 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2374 len(MSG), -1, 0)
2375 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2376 [bytearray(10)], 0, 0)
2377 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2378 object(), 0, 0)
2379 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2380 len(MSG), object(), 0)
2381 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2382 len(MSG), 0, object())
2383
2384 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2385 self.assertEqual(msg, MSG)
2386 self.checkRecvmsgAddress(addr, self.cli_addr)
2387 self.assertEqual(ancdata, [])
2388 self.checkFlags(flags, eor=True)
2389
2390 def _testRecvmsgBadArgs(self):
2391 self.sendToServer(MSG)
2392
2393
2394class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2395 # Tests for recvmsg_into() which can use any socket type.
2396
2397 def testRecvmsgIntoBadArgs(self):
2398 # Check that recvmsg_into() rejects invalid arguments.
2399 buf = bytearray(len(MSG))
2400 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2401 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2402 len(MSG), 0, 0)
2403 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2404 buf, 0, 0)
2405 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2406 [object()], 0, 0)
2407 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2408 [b"I'm not writable"], 0, 0)
2409 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2410 [buf, object()], 0, 0)
2411 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2412 [buf], -1, 0)
2413 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2414 [buf], object(), 0)
2415 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2416 [buf], 0, object())
2417
2418 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2419 self.assertEqual(nbytes, len(MSG))
2420 self.assertEqual(buf, bytearray(MSG))
2421 self.checkRecvmsgAddress(addr, self.cli_addr)
2422 self.assertEqual(ancdata, [])
2423 self.checkFlags(flags, eor=True)
2424
2425 def _testRecvmsgIntoBadArgs(self):
2426 self.sendToServer(MSG)
2427
2428 def testRecvmsgIntoGenerator(self):
2429 # Receive into buffer obtained from a generator (not a sequence).
2430 buf = bytearray(len(MSG))
2431 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2432 (o for o in [buf]))
2433 self.assertEqual(nbytes, len(MSG))
2434 self.assertEqual(buf, bytearray(MSG))
2435 self.checkRecvmsgAddress(addr, self.cli_addr)
2436 self.assertEqual(ancdata, [])
2437 self.checkFlags(flags, eor=True)
2438
2439 def _testRecvmsgIntoGenerator(self):
2440 self.sendToServer(MSG)
2441
2442 def testRecvmsgIntoArray(self):
2443 # Receive into an array rather than the usual bytearray.
2444 buf = array.array("B", [0] * len(MSG))
2445 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2446 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002447 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002448 self.checkRecvmsgAddress(addr, self.cli_addr)
2449 self.assertEqual(ancdata, [])
2450 self.checkFlags(flags, eor=True)
2451
2452 def _testRecvmsgIntoArray(self):
2453 self.sendToServer(MSG)
2454
2455 def testRecvmsgIntoScatter(self):
2456 # Receive into multiple buffers (scatter write).
2457 b1 = bytearray(b"----")
2458 b2 = bytearray(b"0123456789")
2459 b3 = bytearray(b"--------------")
2460 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2461 [b1, memoryview(b2)[2:9], b3])
2462 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2463 self.assertEqual(b1, bytearray(b"Mary"))
2464 self.assertEqual(b2, bytearray(b"01 had a 9"))
2465 self.assertEqual(b3, bytearray(b"little lamb---"))
2466 self.checkRecvmsgAddress(addr, self.cli_addr)
2467 self.assertEqual(ancdata, [])
2468 self.checkFlags(flags, eor=True)
2469
2470 def _testRecvmsgIntoScatter(self):
2471 self.sendToServer(b"Mary had a little lamb")
2472
2473
2474class CmsgMacroTests(unittest.TestCase):
2475 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2476 # assumptions used by sendmsg() and recvmsg[_into](), which share
2477 # code with these functions.
2478
2479 # Match the definition in socketmodule.c
2480 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2481
2482 @requireAttrs(socket, "CMSG_LEN")
2483 def testCMSG_LEN(self):
2484 # Test CMSG_LEN() with various valid and invalid values,
2485 # checking the assumptions used by recvmsg() and sendmsg().
2486 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2487 values = list(range(257)) + list(range(toobig - 257, toobig))
2488
2489 # struct cmsghdr has at least three members, two of which are ints
2490 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2491 for n in values:
2492 ret = socket.CMSG_LEN(n)
2493 # This is how recvmsg() calculates the data size
2494 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2495 self.assertLessEqual(ret, self.socklen_t_limit)
2496
2497 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2498 # sendmsg() shares code with these functions, and requires
2499 # that it reject values over the limit.
2500 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2501 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2502
2503 @requireAttrs(socket, "CMSG_SPACE")
2504 def testCMSG_SPACE(self):
2505 # Test CMSG_SPACE() with various valid and invalid values,
2506 # checking the assumptions used by sendmsg().
2507 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2508 values = list(range(257)) + list(range(toobig - 257, toobig))
2509
2510 last = socket.CMSG_SPACE(0)
2511 # struct cmsghdr has at least three members, two of which are ints
2512 self.assertGreater(last, array.array("i").itemsize * 2)
2513 for n in values:
2514 ret = socket.CMSG_SPACE(n)
2515 self.assertGreaterEqual(ret, last)
2516 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2517 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2518 self.assertLessEqual(ret, self.socklen_t_limit)
2519 last = ret
2520
2521 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2522 # sendmsg() shares code with these functions, and requires
2523 # that it reject values over the limit.
2524 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2525 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2526
2527
2528class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2529 # Tests for file descriptor passing on Unix-domain sockets.
2530
2531 # Invalid file descriptor value that's unlikely to evaluate to a
2532 # real FD even if one of its bytes is replaced with a different
2533 # value (which shouldn't actually happen).
2534 badfd = -0x5555
2535
2536 def newFDs(self, n):
2537 # Return a list of n file descriptors for newly-created files
2538 # containing their list indices as ASCII numbers.
2539 fds = []
2540 for i in range(n):
2541 fd, path = tempfile.mkstemp()
2542 self.addCleanup(os.unlink, path)
2543 self.addCleanup(os.close, fd)
2544 os.write(fd, str(i).encode())
2545 fds.append(fd)
2546 return fds
2547
2548 def checkFDs(self, fds):
2549 # Check that the file descriptors in the given list contain
2550 # their correct list indices as ASCII numbers.
2551 for n, fd in enumerate(fds):
2552 os.lseek(fd, 0, os.SEEK_SET)
2553 self.assertEqual(os.read(fd, 1024), str(n).encode())
2554
2555 def registerRecvmsgResult(self, result):
2556 self.addCleanup(self.closeRecvmsgFDs, result)
2557
2558 def closeRecvmsgFDs(self, recvmsg_result):
2559 # Close all file descriptors specified in the ancillary data
2560 # of the given return value from recvmsg() or recvmsg_into().
2561 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2562 if (cmsg_level == socket.SOL_SOCKET and
2563 cmsg_type == socket.SCM_RIGHTS):
2564 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002565 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002566 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2567 for fd in fds:
2568 os.close(fd)
2569
2570 def createAndSendFDs(self, n):
2571 # Send n new file descriptors created by newFDs() to the
2572 # server, with the constant MSG as the non-ancillary data.
2573 self.assertEqual(
2574 self.sendmsgToServer([MSG],
2575 [(socket.SOL_SOCKET,
2576 socket.SCM_RIGHTS,
2577 array.array("i", self.newFDs(n)))]),
2578 len(MSG))
2579
2580 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2581 # Check that constant MSG was received with numfds file
2582 # descriptors in a maximum of maxcmsgs control messages (which
2583 # must contain only complete integers). By default, check
2584 # that MSG_CTRUNC is unset, but ignore any flags in
2585 # ignoreflags.
2586 msg, ancdata, flags, addr = result
2587 self.assertEqual(msg, MSG)
2588 self.checkRecvmsgAddress(addr, self.cli_addr)
2589 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2590 ignore=ignoreflags)
2591
2592 self.assertIsInstance(ancdata, list)
2593 self.assertLessEqual(len(ancdata), maxcmsgs)
2594 fds = array.array("i")
2595 for item in ancdata:
2596 self.assertIsInstance(item, tuple)
2597 cmsg_level, cmsg_type, cmsg_data = item
2598 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2599 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2600 self.assertIsInstance(cmsg_data, bytes)
2601 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002602 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002603
2604 self.assertEqual(len(fds), numfds)
2605 self.checkFDs(fds)
2606
2607 def testFDPassSimple(self):
2608 # Pass a single FD (array read from bytes object).
2609 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2610 len(MSG), 10240))
2611
2612 def _testFDPassSimple(self):
2613 self.assertEqual(
2614 self.sendmsgToServer(
2615 [MSG],
2616 [(socket.SOL_SOCKET,
2617 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002618 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002619 len(MSG))
2620
2621 def testMultipleFDPass(self):
2622 # Pass multiple FDs in a single array.
2623 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2624 len(MSG), 10240))
2625
2626 def _testMultipleFDPass(self):
2627 self.createAndSendFDs(4)
2628
2629 @requireAttrs(socket, "CMSG_SPACE")
2630 def testFDPassCMSG_SPACE(self):
2631 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2632 self.checkRecvmsgFDs(
2633 4, self.doRecvmsg(self.serv_sock, len(MSG),
2634 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2635
2636 @testFDPassCMSG_SPACE.client_skip
2637 def _testFDPassCMSG_SPACE(self):
2638 self.createAndSendFDs(4)
2639
2640 def testFDPassCMSG_LEN(self):
2641 # Test using CMSG_LEN() to calculate ancillary buffer size.
2642 self.checkRecvmsgFDs(1,
2643 self.doRecvmsg(self.serv_sock, len(MSG),
2644 socket.CMSG_LEN(4 * SIZEOF_INT)),
2645 # RFC 3542 says implementations may set
2646 # MSG_CTRUNC if there isn't enough space
2647 # for trailing padding.
2648 ignoreflags=socket.MSG_CTRUNC)
2649
2650 def _testFDPassCMSG_LEN(self):
2651 self.createAndSendFDs(1)
2652
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002653 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002654 @requireAttrs(socket, "CMSG_SPACE")
2655 def testFDPassSeparate(self):
2656 # Pass two FDs in two separate arrays. Arrays may be combined
2657 # into a single control message by the OS.
2658 self.checkRecvmsgFDs(2,
2659 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2660 maxcmsgs=2)
2661
2662 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002663 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002664 def _testFDPassSeparate(self):
2665 fd0, fd1 = self.newFDs(2)
2666 self.assertEqual(
2667 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2668 socket.SCM_RIGHTS,
2669 array.array("i", [fd0])),
2670 (socket.SOL_SOCKET,
2671 socket.SCM_RIGHTS,
2672 array.array("i", [fd1]))]),
2673 len(MSG))
2674
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002675 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002676 @requireAttrs(socket, "CMSG_SPACE")
2677 def testFDPassSeparateMinSpace(self):
2678 # Pass two FDs in two separate arrays, receiving them into the
2679 # minimum space for two arrays.
2680 self.checkRecvmsgFDs(2,
2681 self.doRecvmsg(self.serv_sock, len(MSG),
2682 socket.CMSG_SPACE(SIZEOF_INT) +
2683 socket.CMSG_LEN(SIZEOF_INT)),
2684 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2685
2686 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002687 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002688 def _testFDPassSeparateMinSpace(self):
2689 fd0, fd1 = self.newFDs(2)
2690 self.assertEqual(
2691 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2692 socket.SCM_RIGHTS,
2693 array.array("i", [fd0])),
2694 (socket.SOL_SOCKET,
2695 socket.SCM_RIGHTS,
2696 array.array("i", [fd1]))]),
2697 len(MSG))
2698
2699 def sendAncillaryIfPossible(self, msg, ancdata):
2700 # Try to send msg and ancdata to server, but if the system
2701 # call fails, just send msg with no ancillary data.
2702 try:
2703 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002704 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002705 # Check that it was the system call that failed
2706 self.assertIsInstance(e.errno, int)
2707 nbytes = self.sendmsgToServer([msg])
2708 self.assertEqual(nbytes, len(msg))
2709
2710 def testFDPassEmpty(self):
2711 # Try to pass an empty FD array. Can receive either no array
2712 # or an empty array.
2713 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2714 len(MSG), 10240),
2715 ignoreflags=socket.MSG_CTRUNC)
2716
2717 def _testFDPassEmpty(self):
2718 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2719 socket.SCM_RIGHTS,
2720 b"")])
2721
2722 def testFDPassPartialInt(self):
2723 # Try to pass a truncated FD array.
2724 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2725 len(MSG), 10240)
2726 self.assertEqual(msg, MSG)
2727 self.checkRecvmsgAddress(addr, self.cli_addr)
2728 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2729 self.assertLessEqual(len(ancdata), 1)
2730 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2731 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2732 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2733 self.assertLess(len(cmsg_data), SIZEOF_INT)
2734
2735 def _testFDPassPartialInt(self):
2736 self.sendAncillaryIfPossible(
2737 MSG,
2738 [(socket.SOL_SOCKET,
2739 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002740 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002741
2742 @requireAttrs(socket, "CMSG_SPACE")
2743 def testFDPassPartialIntInMiddle(self):
2744 # Try to pass two FD arrays, the first of which is truncated.
2745 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2746 len(MSG), 10240)
2747 self.assertEqual(msg, MSG)
2748 self.checkRecvmsgAddress(addr, self.cli_addr)
2749 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2750 self.assertLessEqual(len(ancdata), 2)
2751 fds = array.array("i")
2752 # Arrays may have been combined in a single control message
2753 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2754 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2755 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002756 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002757 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2758 self.assertLessEqual(len(fds), 2)
2759 self.checkFDs(fds)
2760
2761 @testFDPassPartialIntInMiddle.client_skip
2762 def _testFDPassPartialIntInMiddle(self):
2763 fd0, fd1 = self.newFDs(2)
2764 self.sendAncillaryIfPossible(
2765 MSG,
2766 [(socket.SOL_SOCKET,
2767 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002768 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002769 (socket.SOL_SOCKET,
2770 socket.SCM_RIGHTS,
2771 array.array("i", [fd1]))])
2772
2773 def checkTruncatedHeader(self, result, ignoreflags=0):
2774 # Check that no ancillary data items are returned when data is
2775 # truncated inside the cmsghdr structure.
2776 msg, ancdata, flags, addr = result
2777 self.assertEqual(msg, MSG)
2778 self.checkRecvmsgAddress(addr, self.cli_addr)
2779 self.assertEqual(ancdata, [])
2780 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2781 ignore=ignoreflags)
2782
2783 def testCmsgTruncNoBufSize(self):
2784 # Check that no ancillary data is received when no buffer size
2785 # is specified.
2786 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2787 # BSD seems to set MSG_CTRUNC only
2788 # if an item has been partially
2789 # received.
2790 ignoreflags=socket.MSG_CTRUNC)
2791
2792 def _testCmsgTruncNoBufSize(self):
2793 self.createAndSendFDs(1)
2794
2795 def testCmsgTrunc0(self):
2796 # Check that no ancillary data is received when buffer size is 0.
2797 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2798 ignoreflags=socket.MSG_CTRUNC)
2799
2800 def _testCmsgTrunc0(self):
2801 self.createAndSendFDs(1)
2802
2803 # Check that no ancillary data is returned for various non-zero
2804 # (but still too small) buffer sizes.
2805
2806 def testCmsgTrunc1(self):
2807 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2808
2809 def _testCmsgTrunc1(self):
2810 self.createAndSendFDs(1)
2811
2812 def testCmsgTrunc2Int(self):
2813 # The cmsghdr structure has at least three members, two of
2814 # which are ints, so we still shouldn't see any ancillary
2815 # data.
2816 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2817 SIZEOF_INT * 2))
2818
2819 def _testCmsgTrunc2Int(self):
2820 self.createAndSendFDs(1)
2821
2822 def testCmsgTruncLen0Minus1(self):
2823 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2824 socket.CMSG_LEN(0) - 1))
2825
2826 def _testCmsgTruncLen0Minus1(self):
2827 self.createAndSendFDs(1)
2828
2829 # The following tests try to truncate the control message in the
2830 # middle of the FD array.
2831
2832 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2833 # Check that file descriptor data is truncated to between
2834 # mindata and maxdata bytes when received with buffer size
2835 # ancbuf, and that any complete file descriptor numbers are
2836 # valid.
2837 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2838 len(MSG), ancbuf)
2839 self.assertEqual(msg, MSG)
2840 self.checkRecvmsgAddress(addr, self.cli_addr)
2841 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2842
2843 if mindata == 0 and ancdata == []:
2844 return
2845 self.assertEqual(len(ancdata), 1)
2846 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2847 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2848 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2849 self.assertGreaterEqual(len(cmsg_data), mindata)
2850 self.assertLessEqual(len(cmsg_data), maxdata)
2851 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002852 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002853 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2854 self.checkFDs(fds)
2855
2856 def testCmsgTruncLen0(self):
2857 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2858
2859 def _testCmsgTruncLen0(self):
2860 self.createAndSendFDs(1)
2861
2862 def testCmsgTruncLen0Plus1(self):
2863 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2864
2865 def _testCmsgTruncLen0Plus1(self):
2866 self.createAndSendFDs(2)
2867
2868 def testCmsgTruncLen1(self):
2869 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2870 maxdata=SIZEOF_INT)
2871
2872 def _testCmsgTruncLen1(self):
2873 self.createAndSendFDs(2)
2874
2875 def testCmsgTruncLen2Minus1(self):
2876 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2877 maxdata=(2 * SIZEOF_INT) - 1)
2878
2879 def _testCmsgTruncLen2Minus1(self):
2880 self.createAndSendFDs(2)
2881
2882
2883class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2884 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2885 # features of the RFC 3542 Advanced Sockets API for IPv6.
2886 # Currently we can only handle certain data items (e.g. traffic
2887 # class, hop limit, MTU discovery and fragmentation settings)
2888 # without resorting to unportable means such as the struct module,
2889 # but the tests here are aimed at testing the ancillary data
2890 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2891 # itself.
2892
2893 # Test value to use when setting hop limit of packet
2894 hop_limit = 2
2895
2896 # Test value to use when setting traffic class of packet.
2897 # -1 means "use kernel default".
2898 traffic_class = -1
2899
2900 def ancillaryMapping(self, ancdata):
2901 # Given ancillary data list ancdata, return a mapping from
2902 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2903 # Check that no (level, type) pair appears more than once.
2904 d = {}
2905 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2906 self.assertNotIn((cmsg_level, cmsg_type), d)
2907 d[(cmsg_level, cmsg_type)] = cmsg_data
2908 return d
2909
2910 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2911 # Receive hop limit into ancbufsize bytes of ancillary data
2912 # space. Check that data is MSG, ancillary data is not
2913 # truncated (but ignore any flags in ignoreflags), and hop
2914 # limit is between 0 and maxhop inclusive.
2915 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2916 socket.IPV6_RECVHOPLIMIT, 1)
2917 self.misc_event.set()
2918 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2919 len(MSG), ancbufsize)
2920
2921 self.assertEqual(msg, MSG)
2922 self.checkRecvmsgAddress(addr, self.cli_addr)
2923 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2924 ignore=ignoreflags)
2925
2926 self.assertEqual(len(ancdata), 1)
2927 self.assertIsInstance(ancdata[0], tuple)
2928 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2929 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2930 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2931 self.assertIsInstance(cmsg_data, bytes)
2932 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2933 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002934 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002935 self.assertGreaterEqual(a[0], 0)
2936 self.assertLessEqual(a[0], maxhop)
2937
2938 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2939 def testRecvHopLimit(self):
2940 # Test receiving the packet hop limit as ancillary data.
2941 self.checkHopLimit(ancbufsize=10240)
2942
2943 @testRecvHopLimit.client_skip
2944 def _testRecvHopLimit(self):
2945 # Need to wait until server has asked to receive ancillary
2946 # data, as implementations are not required to buffer it
2947 # otherwise.
2948 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2949 self.sendToServer(MSG)
2950
2951 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2952 def testRecvHopLimitCMSG_SPACE(self):
2953 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2954 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2955
2956 @testRecvHopLimitCMSG_SPACE.client_skip
2957 def _testRecvHopLimitCMSG_SPACE(self):
2958 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2959 self.sendToServer(MSG)
2960
2961 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2962 # 3542 says portable applications must provide space for trailing
2963 # padding. Implementations may set MSG_CTRUNC if there isn't
2964 # enough space for the padding.
2965
2966 @requireAttrs(socket.socket, "sendmsg")
2967 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2968 def testSetHopLimit(self):
2969 # Test setting hop limit on outgoing packet and receiving it
2970 # at the other end.
2971 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2972
2973 @testSetHopLimit.client_skip
2974 def _testSetHopLimit(self):
2975 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2976 self.assertEqual(
2977 self.sendmsgToServer([MSG],
2978 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2979 array.array("i", [self.hop_limit]))]),
2980 len(MSG))
2981
2982 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2983 ignoreflags=0):
2984 # Receive traffic class and hop limit into ancbufsize bytes of
2985 # ancillary data space. Check that data is MSG, ancillary
2986 # data is not truncated (but ignore any flags in ignoreflags),
2987 # and traffic class and hop limit are in range (hop limit no
2988 # more than maxhop).
2989 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2990 socket.IPV6_RECVHOPLIMIT, 1)
2991 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2992 socket.IPV6_RECVTCLASS, 1)
2993 self.misc_event.set()
2994 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2995 len(MSG), ancbufsize)
2996
2997 self.assertEqual(msg, MSG)
2998 self.checkRecvmsgAddress(addr, self.cli_addr)
2999 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3000 ignore=ignoreflags)
3001 self.assertEqual(len(ancdata), 2)
3002 ancmap = self.ancillaryMapping(ancdata)
3003
3004 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3005 self.assertEqual(len(tcdata), SIZEOF_INT)
3006 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003007 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003008 self.assertGreaterEqual(a[0], 0)
3009 self.assertLessEqual(a[0], 255)
3010
3011 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3012 self.assertEqual(len(hldata), SIZEOF_INT)
3013 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003014 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003015 self.assertGreaterEqual(a[0], 0)
3016 self.assertLessEqual(a[0], maxhop)
3017
3018 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3019 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3020 def testRecvTrafficClassAndHopLimit(self):
3021 # Test receiving traffic class and hop limit as ancillary data.
3022 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3023
3024 @testRecvTrafficClassAndHopLimit.client_skip
3025 def _testRecvTrafficClassAndHopLimit(self):
3026 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3027 self.sendToServer(MSG)
3028
3029 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3030 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3031 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3032 # Test receiving traffic class and hop limit, using
3033 # CMSG_SPACE() to calculate buffer size.
3034 self.checkTrafficClassAndHopLimit(
3035 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3036
3037 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3038 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3039 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3040 self.sendToServer(MSG)
3041
3042 @requireAttrs(socket.socket, "sendmsg")
3043 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3044 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3045 def testSetTrafficClassAndHopLimit(self):
3046 # Test setting traffic class and hop limit on outgoing packet,
3047 # and receiving them at the other end.
3048 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3049 maxhop=self.hop_limit)
3050
3051 @testSetTrafficClassAndHopLimit.client_skip
3052 def _testSetTrafficClassAndHopLimit(self):
3053 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3054 self.assertEqual(
3055 self.sendmsgToServer([MSG],
3056 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3057 array.array("i", [self.traffic_class])),
3058 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3059 array.array("i", [self.hop_limit]))]),
3060 len(MSG))
3061
3062 @requireAttrs(socket.socket, "sendmsg")
3063 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3064 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3065 def testOddCmsgSize(self):
3066 # Try to send ancillary data with first item one byte too
3067 # long. Fall back to sending with correct size if this fails,
3068 # and check that second item was handled correctly.
3069 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3070 maxhop=self.hop_limit)
3071
3072 @testOddCmsgSize.client_skip
3073 def _testOddCmsgSize(self):
3074 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3075 try:
3076 nbytes = self.sendmsgToServer(
3077 [MSG],
3078 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003079 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003080 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3081 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003082 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003083 self.assertIsInstance(e.errno, int)
3084 nbytes = self.sendmsgToServer(
3085 [MSG],
3086 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3087 array.array("i", [self.traffic_class])),
3088 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3089 array.array("i", [self.hop_limit]))])
3090 self.assertEqual(nbytes, len(MSG))
3091
3092 # Tests for proper handling of truncated ancillary data
3093
3094 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3095 # Receive hop limit into ancbufsize bytes of ancillary data
3096 # space, which should be too small to contain the ancillary
3097 # data header (if ancbufsize is None, pass no second argument
3098 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3099 # (unless included in ignoreflags), and no ancillary data is
3100 # returned.
3101 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3102 socket.IPV6_RECVHOPLIMIT, 1)
3103 self.misc_event.set()
3104 args = () if ancbufsize is None else (ancbufsize,)
3105 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3106 len(MSG), *args)
3107
3108 self.assertEqual(msg, MSG)
3109 self.checkRecvmsgAddress(addr, self.cli_addr)
3110 self.assertEqual(ancdata, [])
3111 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3112 ignore=ignoreflags)
3113
3114 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3115 def testCmsgTruncNoBufSize(self):
3116 # Check that no ancillary data is received when no ancillary
3117 # buffer size is provided.
3118 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3119 # BSD seems to set
3120 # MSG_CTRUNC only if an item
3121 # has been partially
3122 # received.
3123 ignoreflags=socket.MSG_CTRUNC)
3124
3125 @testCmsgTruncNoBufSize.client_skip
3126 def _testCmsgTruncNoBufSize(self):
3127 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3128 self.sendToServer(MSG)
3129
3130 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3131 def testSingleCmsgTrunc0(self):
3132 # Check that no ancillary data is received when ancillary
3133 # buffer size is zero.
3134 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3135 ignoreflags=socket.MSG_CTRUNC)
3136
3137 @testSingleCmsgTrunc0.client_skip
3138 def _testSingleCmsgTrunc0(self):
3139 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3140 self.sendToServer(MSG)
3141
3142 # Check that no ancillary data is returned for various non-zero
3143 # (but still too small) buffer sizes.
3144
3145 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3146 def testSingleCmsgTrunc1(self):
3147 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3148
3149 @testSingleCmsgTrunc1.client_skip
3150 def _testSingleCmsgTrunc1(self):
3151 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3152 self.sendToServer(MSG)
3153
3154 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3155 def testSingleCmsgTrunc2Int(self):
3156 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3157
3158 @testSingleCmsgTrunc2Int.client_skip
3159 def _testSingleCmsgTrunc2Int(self):
3160 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3161 self.sendToServer(MSG)
3162
3163 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3164 def testSingleCmsgTruncLen0Minus1(self):
3165 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3166
3167 @testSingleCmsgTruncLen0Minus1.client_skip
3168 def _testSingleCmsgTruncLen0Minus1(self):
3169 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3170 self.sendToServer(MSG)
3171
3172 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3173 def testSingleCmsgTruncInData(self):
3174 # Test truncation of a control message inside its associated
3175 # data. The message may be returned with its data truncated,
3176 # or not returned at all.
3177 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3178 socket.IPV6_RECVHOPLIMIT, 1)
3179 self.misc_event.set()
3180 msg, ancdata, flags, addr = self.doRecvmsg(
3181 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3182
3183 self.assertEqual(msg, MSG)
3184 self.checkRecvmsgAddress(addr, self.cli_addr)
3185 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3186
3187 self.assertLessEqual(len(ancdata), 1)
3188 if ancdata:
3189 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3190 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3191 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3192 self.assertLess(len(cmsg_data), SIZEOF_INT)
3193
3194 @testSingleCmsgTruncInData.client_skip
3195 def _testSingleCmsgTruncInData(self):
3196 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3197 self.sendToServer(MSG)
3198
3199 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3200 # Receive traffic class and hop limit into ancbufsize bytes of
3201 # ancillary data space, which should be large enough to
3202 # contain the first item, but too small to contain the header
3203 # of the second. Check that data is MSG, MSG_CTRUNC is set
3204 # (unless included in ignoreflags), and only one ancillary
3205 # data item is returned.
3206 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3207 socket.IPV6_RECVHOPLIMIT, 1)
3208 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3209 socket.IPV6_RECVTCLASS, 1)
3210 self.misc_event.set()
3211 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3212 len(MSG), ancbufsize)
3213
3214 self.assertEqual(msg, MSG)
3215 self.checkRecvmsgAddress(addr, self.cli_addr)
3216 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3217 ignore=ignoreflags)
3218
3219 self.assertEqual(len(ancdata), 1)
3220 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3221 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3222 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3223 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3224 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003225 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003226 self.assertGreaterEqual(a[0], 0)
3227 self.assertLessEqual(a[0], 255)
3228
3229 # Try the above test with various buffer sizes.
3230
3231 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3232 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3233 def testSecondCmsgTrunc0(self):
3234 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3235 ignoreflags=socket.MSG_CTRUNC)
3236
3237 @testSecondCmsgTrunc0.client_skip
3238 def _testSecondCmsgTrunc0(self):
3239 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3240 self.sendToServer(MSG)
3241
3242 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3243 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3244 def testSecondCmsgTrunc1(self):
3245 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3246
3247 @testSecondCmsgTrunc1.client_skip
3248 def _testSecondCmsgTrunc1(self):
3249 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3250 self.sendToServer(MSG)
3251
3252 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3253 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3254 def testSecondCmsgTrunc2Int(self):
3255 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3256 2 * SIZEOF_INT)
3257
3258 @testSecondCmsgTrunc2Int.client_skip
3259 def _testSecondCmsgTrunc2Int(self):
3260 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3261 self.sendToServer(MSG)
3262
3263 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3264 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3265 def testSecondCmsgTruncLen0Minus1(self):
3266 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3267 socket.CMSG_LEN(0) - 1)
3268
3269 @testSecondCmsgTruncLen0Minus1.client_skip
3270 def _testSecondCmsgTruncLen0Minus1(self):
3271 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3272 self.sendToServer(MSG)
3273
3274 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3275 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3276 def testSecomdCmsgTruncInData(self):
3277 # Test truncation of the second of two control messages inside
3278 # its associated data.
3279 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3280 socket.IPV6_RECVHOPLIMIT, 1)
3281 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3282 socket.IPV6_RECVTCLASS, 1)
3283 self.misc_event.set()
3284 msg, ancdata, flags, addr = self.doRecvmsg(
3285 self.serv_sock, len(MSG),
3286 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3287
3288 self.assertEqual(msg, MSG)
3289 self.checkRecvmsgAddress(addr, self.cli_addr)
3290 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3291
3292 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3293
3294 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3295 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3296 cmsg_types.remove(cmsg_type)
3297 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3298 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003299 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003300 self.assertGreaterEqual(a[0], 0)
3301 self.assertLessEqual(a[0], 255)
3302
3303 if ancdata:
3304 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3305 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3306 cmsg_types.remove(cmsg_type)
3307 self.assertLess(len(cmsg_data), SIZEOF_INT)
3308
3309 self.assertEqual(ancdata, [])
3310
3311 @testSecomdCmsgTruncInData.client_skip
3312 def _testSecomdCmsgTruncInData(self):
3313 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3314 self.sendToServer(MSG)
3315
3316
3317# Derive concrete test classes for different socket types.
3318
3319class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3320 SendrecvmsgConnectionlessBase,
3321 ThreadedSocketTestMixin, UDPTestBase):
3322 pass
3323
3324@requireAttrs(socket.socket, "sendmsg")
3325@unittest.skipUnless(thread, 'Threading required for this test.')
3326class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3327 pass
3328
3329@requireAttrs(socket.socket, "recvmsg")
3330@unittest.skipUnless(thread, 'Threading required for this test.')
3331class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3332 pass
3333
3334@requireAttrs(socket.socket, "recvmsg_into")
3335@unittest.skipUnless(thread, 'Threading required for this test.')
3336class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3337 pass
3338
3339
3340class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3341 SendrecvmsgConnectionlessBase,
3342 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003343
3344 def checkRecvmsgAddress(self, addr1, addr2):
3345 # Called to compare the received address with the address of
3346 # the peer, ignoring scope ID
3347 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003348
3349@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003350@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003351@requireSocket("AF_INET6", "SOCK_DGRAM")
3352@unittest.skipUnless(thread, 'Threading required for this test.')
3353class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3354 pass
3355
3356@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003357@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003358@requireSocket("AF_INET6", "SOCK_DGRAM")
3359@unittest.skipUnless(thread, 'Threading required for this test.')
3360class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3361 pass
3362
3363@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003364@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003365@requireSocket("AF_INET6", "SOCK_DGRAM")
3366@unittest.skipUnless(thread, 'Threading required for this test.')
3367class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3368 pass
3369
3370@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003371@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003372@requireAttrs(socket, "IPPROTO_IPV6")
3373@requireSocket("AF_INET6", "SOCK_DGRAM")
3374@unittest.skipUnless(thread, 'Threading required for this test.')
3375class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3376 SendrecvmsgUDP6TestBase):
3377 pass
3378
3379@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003380@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003381@requireAttrs(socket, "IPPROTO_IPV6")
3382@requireSocket("AF_INET6", "SOCK_DGRAM")
3383@unittest.skipUnless(thread, 'Threading required for this test.')
3384class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3385 RFC3542AncillaryTest,
3386 SendrecvmsgUDP6TestBase):
3387 pass
3388
3389
3390class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3391 ConnectedStreamTestMixin, TCPTestBase):
3392 pass
3393
3394@requireAttrs(socket.socket, "sendmsg")
3395@unittest.skipUnless(thread, 'Threading required for this test.')
3396class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3397 pass
3398
3399@requireAttrs(socket.socket, "recvmsg")
3400@unittest.skipUnless(thread, 'Threading required for this test.')
3401class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3402 SendrecvmsgTCPTestBase):
3403 pass
3404
3405@requireAttrs(socket.socket, "recvmsg_into")
3406@unittest.skipUnless(thread, 'Threading required for this test.')
3407class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3408 SendrecvmsgTCPTestBase):
3409 pass
3410
3411
3412class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3413 SendrecvmsgConnectedBase,
3414 ConnectedStreamTestMixin, SCTPStreamBase):
3415 pass
3416
3417@requireAttrs(socket.socket, "sendmsg")
3418@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3419@unittest.skipUnless(thread, 'Threading required for this test.')
3420class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3421 pass
3422
3423@requireAttrs(socket.socket, "recvmsg")
3424@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3425@unittest.skipUnless(thread, 'Threading required for this test.')
3426class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3427 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003428
3429 def testRecvmsgEOF(self):
3430 try:
3431 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3432 except OSError as e:
3433 if e.errno != errno.ENOTCONN:
3434 raise
3435 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003436
3437@requireAttrs(socket.socket, "recvmsg_into")
3438@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3439@unittest.skipUnless(thread, 'Threading required for this test.')
3440class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3441 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003442
3443 def testRecvmsgEOF(self):
3444 try:
3445 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3446 except OSError as e:
3447 if e.errno != errno.ENOTCONN:
3448 raise
3449 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003450
3451
3452class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3453 ConnectedStreamTestMixin, UnixStreamBase):
3454 pass
3455
3456@requireAttrs(socket.socket, "sendmsg")
3457@requireAttrs(socket, "AF_UNIX")
3458@unittest.skipUnless(thread, 'Threading required for this test.')
3459class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3460 pass
3461
3462@requireAttrs(socket.socket, "recvmsg")
3463@requireAttrs(socket, "AF_UNIX")
3464@unittest.skipUnless(thread, 'Threading required for this test.')
3465class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3466 SendrecvmsgUnixStreamTestBase):
3467 pass
3468
3469@requireAttrs(socket.socket, "recvmsg_into")
3470@requireAttrs(socket, "AF_UNIX")
3471@unittest.skipUnless(thread, 'Threading required for this test.')
3472class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3473 SendrecvmsgUnixStreamTestBase):
3474 pass
3475
3476@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3477@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3478@unittest.skipUnless(thread, 'Threading required for this test.')
3479class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3480 pass
3481
3482@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3483@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3484@unittest.skipUnless(thread, 'Threading required for this test.')
3485class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3486 SendrecvmsgUnixStreamTestBase):
3487 pass
3488
3489
3490# Test interrupting the interruptible send/receive methods with a
3491# signal when a timeout is set. These tests avoid having multiple
3492# threads alive during the test so that the OS cannot deliver the
3493# signal to the wrong one.
3494
3495class InterruptedTimeoutBase(unittest.TestCase):
3496 # Base class for interrupted send/receive tests. Installs an
3497 # empty handler for SIGALRM and removes it on teardown, along with
3498 # any scheduled alarms.
3499
3500 def setUp(self):
3501 super().setUp()
3502 orig_alrm_handler = signal.signal(signal.SIGALRM,
3503 lambda signum, frame: None)
3504 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3505 self.addCleanup(self.setAlarm, 0)
3506
3507 # Timeout for socket operations
3508 timeout = 4.0
3509
3510 # Provide setAlarm() method to schedule delivery of SIGALRM after
3511 # given number of seconds, or cancel it if zero, and an
3512 # appropriate time value to use. Use setitimer() if available.
3513 if hasattr(signal, "setitimer"):
3514 alarm_time = 0.05
3515
3516 def setAlarm(self, seconds):
3517 signal.setitimer(signal.ITIMER_REAL, seconds)
3518 else:
3519 # Old systems may deliver the alarm up to one second early
3520 alarm_time = 2
3521
3522 def setAlarm(self, seconds):
3523 signal.alarm(seconds)
3524
3525
3526# Require siginterrupt() in order to ensure that system calls are
3527# interrupted by default.
3528@requireAttrs(signal, "siginterrupt")
3529@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3530 "Don't have signal.alarm or signal.setitimer")
3531class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3532 # Test interrupting the recv*() methods with signals when a
3533 # timeout is set.
3534
3535 def setUp(self):
3536 super().setUp()
3537 self.serv.settimeout(self.timeout)
3538
3539 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003540 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003541 # errno of EINTR when interrupted by a signal.
3542 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003543 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003544 func(*args, **kwargs)
3545 self.assertNotIsInstance(cm.exception, socket.timeout)
3546 self.assertEqual(cm.exception.errno, errno.EINTR)
3547
3548 def testInterruptedRecvTimeout(self):
3549 self.checkInterruptedRecv(self.serv.recv, 1024)
3550
3551 def testInterruptedRecvIntoTimeout(self):
3552 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3553
3554 def testInterruptedRecvfromTimeout(self):
3555 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3556
3557 def testInterruptedRecvfromIntoTimeout(self):
3558 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3559
3560 @requireAttrs(socket.socket, "recvmsg")
3561 def testInterruptedRecvmsgTimeout(self):
3562 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3563
3564 @requireAttrs(socket.socket, "recvmsg_into")
3565 def testInterruptedRecvmsgIntoTimeout(self):
3566 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3567
3568
3569# Require siginterrupt() in order to ensure that system calls are
3570# interrupted by default.
3571@requireAttrs(signal, "siginterrupt")
3572@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3573 "Don't have signal.alarm or signal.setitimer")
3574@unittest.skipUnless(thread, 'Threading required for this test.')
3575class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3576 ThreadSafeCleanupTestCase,
3577 SocketListeningTestMixin, TCPTestBase):
3578 # Test interrupting the interruptible send*() methods with signals
3579 # when a timeout is set.
3580
3581 def setUp(self):
3582 super().setUp()
3583 self.serv_conn = self.newSocket()
3584 self.addCleanup(self.serv_conn.close)
3585 # Use a thread to complete the connection, but wait for it to
3586 # terminate before running the test, so that there is only one
3587 # thread to accept the signal.
3588 cli_thread = threading.Thread(target=self.doConnect)
3589 cli_thread.start()
3590 self.cli_conn, addr = self.serv.accept()
3591 self.addCleanup(self.cli_conn.close)
3592 cli_thread.join()
3593 self.serv_conn.settimeout(self.timeout)
3594
3595 def doConnect(self):
3596 self.serv_conn.connect(self.serv_addr)
3597
3598 def checkInterruptedSend(self, func, *args, **kwargs):
3599 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003600 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003601 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003602 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003603 while True:
3604 self.setAlarm(self.alarm_time)
3605 func(*args, **kwargs)
3606 self.assertNotIsInstance(cm.exception, socket.timeout)
3607 self.assertEqual(cm.exception.errno, errno.EINTR)
3608
Nick Coghlan2496f332011-09-19 20:26:31 +10003609 # Issue #12958: The following tests have problems on Mac OS X
3610 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003611 def testInterruptedSendTimeout(self):
3612 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3613
Nick Coghlan2496f332011-09-19 20:26:31 +10003614 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003615 def testInterruptedSendtoTimeout(self):
3616 # Passing an actual address here as Python's wrapper for
3617 # sendto() doesn't allow passing a zero-length one; POSIX
3618 # requires that the address is ignored since the socket is
3619 # connection-mode, however.
3620 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3621 self.serv_addr)
3622
Nick Coghlan2496f332011-09-19 20:26:31 +10003623 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003624 @requireAttrs(socket.socket, "sendmsg")
3625 def testInterruptedSendmsgTimeout(self):
3626 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3627
3628
Victor Stinner45df8202010-04-28 22:31:17 +00003629@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003630class TCPCloserTest(ThreadedTCPSocketTest):
3631
3632 def testClose(self):
3633 conn, addr = self.serv.accept()
3634 conn.close()
3635
3636 sd = self.cli
3637 read, write, err = select.select([sd], [], [], 1.0)
3638 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003639 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003640
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003641 # Calling close() many times should be safe.
3642 conn.close()
3643 conn.close()
3644
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003645 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003646 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003647 time.sleep(1.0)
3648
Victor Stinner45df8202010-04-28 22:31:17 +00003649@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003650class BasicSocketPairTest(SocketPairTest):
3651
3652 def __init__(self, methodName='runTest'):
3653 SocketPairTest.__init__(self, methodName=methodName)
3654
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003655 def _check_defaults(self, sock):
3656 self.assertIsInstance(sock, socket.socket)
3657 if hasattr(socket, 'AF_UNIX'):
3658 self.assertEqual(sock.family, socket.AF_UNIX)
3659 else:
3660 self.assertEqual(sock.family, socket.AF_INET)
3661 self.assertEqual(sock.type, socket.SOCK_STREAM)
3662 self.assertEqual(sock.proto, 0)
3663
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003664 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003665 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003666
3667 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003668 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003669
Dave Cole331708b2004-08-09 04:51:41 +00003670 def testRecv(self):
3671 msg = self.serv.recv(1024)
3672 self.assertEqual(msg, MSG)
3673
3674 def _testRecv(self):
3675 self.cli.send(MSG)
3676
3677 def testSend(self):
3678 self.serv.send(MSG)
3679
3680 def _testSend(self):
3681 msg = self.cli.recv(1024)
3682 self.assertEqual(msg, MSG)
3683
Victor Stinner45df8202010-04-28 22:31:17 +00003684@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003685class NonBlockingTCPTests(ThreadedTCPSocketTest):
3686
3687 def __init__(self, methodName='runTest'):
3688 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3689
3690 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003691 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003692 self.serv.setblocking(True)
3693 self.assertIsNone(self.serv.gettimeout())
3694 self.serv.setblocking(False)
3695 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003696 start = time.time()
3697 try:
3698 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003699 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003700 pass
3701 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003702 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Serhiy Storchaka78980432013-01-15 01:12:17 +02003703 # Issue 15989
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003704 if _testcapi.UINT_MAX < _testcapi.ULONG_MAX:
3705 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3706 self.assertIsNone(self.serv.gettimeout())
Guido van Rossum24e4af82002-06-12 19:18:08 +00003707
3708 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003709 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003710
Antoine Pitroub1c54962010-10-14 15:05:38 +00003711 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003712 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003713 def testInitNonBlocking(self):
3714 # reinit server socket
3715 self.serv.close()
3716 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003717 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003718 self.port = support.bind_port(self.serv)
3719 self.serv.listen(1)
3720 # actual testing
3721 start = time.time()
3722 try:
3723 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003724 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003725 pass
3726 end = time.time()
3727 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3728
3729 def _testInitNonBlocking(self):
3730 pass
3731
Antoine Pitrou600232b2011-01-05 21:03:42 +00003732 def testInheritFlags(self):
3733 # Issue #7995: when calling accept() on a listening socket with a
3734 # timeout, the resulting socket should not be non-blocking.
3735 self.serv.settimeout(10)
3736 try:
3737 conn, addr = self.serv.accept()
3738 message = conn.recv(len(MSG))
3739 finally:
3740 conn.close()
3741 self.serv.settimeout(None)
3742
3743 def _testInheritFlags(self):
3744 time.sleep(0.1)
3745 self.cli.connect((HOST, self.port))
3746 time.sleep(0.5)
3747 self.cli.send(MSG)
3748
Guido van Rossum24e4af82002-06-12 19:18:08 +00003749 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003750 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003751 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003752 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003753 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003754 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003755 pass
3756 else:
3757 self.fail("Error trying to do non-blocking accept.")
3758 read, write, err = select.select([self.serv], [], [])
3759 if self.serv in read:
3760 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003761 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003762 else:
3763 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003764
Guido van Rossum24e4af82002-06-12 19:18:08 +00003765 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003766 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003767 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003768
3769 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003770 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003771 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003772 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003773
3774 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003775 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003776 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003777
3778 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003779 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003780 conn, addr = self.serv.accept()
3781 conn.setblocking(0)
3782 try:
3783 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003784 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003785 pass
3786 else:
3787 self.fail("Error trying to do non-blocking recv.")
3788 read, write, err = select.select([conn], [], [])
3789 if conn in read:
3790 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003791 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003792 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003793 else:
3794 self.fail("Error during select call to non-blocking socket.")
3795
3796 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003797 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003798 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003799 self.cli.send(MSG)
3800
Victor Stinner45df8202010-04-28 22:31:17 +00003801@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003802class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003803 """Unit tests for the object returned by socket.makefile()
3804
Antoine Pitrou834bd812010-10-13 16:17:14 +00003805 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003806 the client connection. You can read from this file to
3807 get output from the server.
3808
Antoine Pitrou834bd812010-10-13 16:17:14 +00003809 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003810 server connection. You can write to this file to send output
3811 to the client.
3812 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003813
Guido van Rossume9f66142002-08-07 15:46:19 +00003814 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003815 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003816 errors = 'strict'
3817 newline = None
3818
3819 read_mode = 'rb'
3820 read_msg = MSG
3821 write_mode = 'wb'
3822 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003823
Guido van Rossum24e4af82002-06-12 19:18:08 +00003824 def __init__(self, methodName='runTest'):
3825 SocketConnectedTest.__init__(self, methodName=methodName)
3826
3827 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003828 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3829 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003830 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003831 self.read_file = self.cli_conn.makefile(
3832 self.read_mode, self.bufsize,
3833 encoding = self.encoding,
3834 errors = self.errors,
3835 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003836
3837 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003838 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003839 self.read_file.close()
3840 self.assertTrue(self.read_file.closed)
3841 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003842 SocketConnectedTest.tearDown(self)
3843
3844 def clientSetUp(self):
3845 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003846 self.write_file = self.serv_conn.makefile(
3847 self.write_mode, self.bufsize,
3848 encoding = self.encoding,
3849 errors = self.errors,
3850 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003851
3852 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003853 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003854 self.write_file.close()
3855 self.assertTrue(self.write_file.closed)
3856 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003857 SocketConnectedTest.clientTearDown(self)
3858
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003859 def testReadAfterTimeout(self):
3860 # Issue #7322: A file object must disallow further reads
3861 # after a timeout has occurred.
3862 self.cli_conn.settimeout(1)
3863 self.read_file.read(3)
3864 # First read raises a timeout
3865 self.assertRaises(socket.timeout, self.read_file.read, 1)
3866 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003867 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003868 self.read_file.read(1)
3869 self.assertIn("cannot read from timed out object", str(ctx.exception))
3870
3871 def _testReadAfterTimeout(self):
3872 self.write_file.write(self.write_msg[0:3])
3873 self.write_file.flush()
3874 self.serv_finished.wait()
3875
Guido van Rossum24e4af82002-06-12 19:18:08 +00003876 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003877 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003878 first_seg = self.read_file.read(len(self.read_msg)-3)
3879 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003880 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003881 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003882
3883 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003884 self.write_file.write(self.write_msg)
3885 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003886
Guido van Rossum8c943832002-08-08 01:00:28 +00003887 def testFullRead(self):
3888 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003889 msg = self.read_file.read()
3890 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003891
3892 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003893 self.write_file.write(self.write_msg)
3894 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003895
Guido van Rossum24e4af82002-06-12 19:18:08 +00003896 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003897 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003898 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003899 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003900 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003901 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003902 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003903 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003904 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003905
3906 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003907 self.write_file.write(self.write_msg)
3908 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003909
3910 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003911 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003912 line = self.read_file.readline()
3913 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003914
3915 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003916 self.write_file.write(self.write_msg)
3917 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003918
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003919 def testCloseAfterMakefile(self):
3920 # The file returned by makefile should keep the socket open.
3921 self.cli_conn.close()
3922 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003923 msg = self.read_file.read()
3924 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003925
3926 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003927 self.write_file.write(self.write_msg)
3928 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003929
3930 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003931 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003932 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003933 if isinstance(self.read_msg, str):
3934 msg = msg.decode()
3935 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003936
3937 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003938 self.write_file.write(self.write_msg)
3939 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003940
Tim Peters116d83c2004-03-28 02:20:45 +00003941 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003942 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003943
3944 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003945 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003946
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003947 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003948 self.assertEqual(self.read_file.mode, self.read_mode)
3949 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003950
3951 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003952 self.assertEqual(self.write_file.mode, self.write_mode)
3953 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003954
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003955 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003956 self.read_file.close()
3957 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003958 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003959 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003960
3961 def _testRealClose(self):
3962 pass
3963
3964
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003965class FileObjectInterruptedTestCase(unittest.TestCase):
3966 """Test that the file object correctly handles EINTR internally."""
3967
3968 class MockSocket(object):
3969 def __init__(self, recv_funcs=()):
3970 # A generator that returns callables that we'll call for each
3971 # call to recv().
3972 self._recv_step = iter(recv_funcs)
3973
3974 def recv_into(self, buffer):
3975 data = next(self._recv_step)()
3976 assert len(buffer) >= len(data)
3977 buffer[:len(data)] = data
3978 return len(data)
3979
3980 def _decref_socketios(self):
3981 pass
3982
3983 def _textiowrap_for_test(self, buffering=-1):
3984 raw = socket.SocketIO(self, "r")
3985 if buffering < 0:
3986 buffering = io.DEFAULT_BUFFER_SIZE
3987 if buffering == 0:
3988 return raw
3989 buffer = io.BufferedReader(raw, buffering)
3990 text = io.TextIOWrapper(buffer, None, None)
3991 text.mode = "rb"
3992 return text
3993
3994 @staticmethod
3995 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02003996 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003997
3998 def _textiowrap_mock_socket(self, mock, buffering=-1):
3999 raw = socket.SocketIO(mock, "r")
4000 if buffering < 0:
4001 buffering = io.DEFAULT_BUFFER_SIZE
4002 if buffering == 0:
4003 return raw
4004 buffer = io.BufferedReader(raw, buffering)
4005 text = io.TextIOWrapper(buffer, None, None)
4006 text.mode = "rb"
4007 return text
4008
4009 def _test_readline(self, size=-1, buffering=-1):
4010 mock_sock = self.MockSocket(recv_funcs=[
4011 lambda : b"This is the first line\nAnd the sec",
4012 self._raise_eintr,
4013 lambda : b"ond line is here\n",
4014 lambda : b"",
4015 lambda : b"", # XXX(gps): io library does an extra EOF read
4016 ])
4017 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004018 self.assertEqual(fo.readline(size), "This is the first line\n")
4019 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004020
4021 def _test_read(self, size=-1, buffering=-1):
4022 mock_sock = self.MockSocket(recv_funcs=[
4023 lambda : b"This is the first line\nAnd the sec",
4024 self._raise_eintr,
4025 lambda : b"ond line is here\n",
4026 lambda : b"",
4027 lambda : b"", # XXX(gps): io library does an extra EOF read
4028 ])
4029 expecting = (b"This is the first line\n"
4030 b"And the second line is here\n")
4031 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4032 if buffering == 0:
4033 data = b''
4034 else:
4035 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004036 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004037 while len(data) != len(expecting):
4038 part = fo.read(size)
4039 if not part:
4040 break
4041 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004042 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004043
4044 def test_default(self):
4045 self._test_readline()
4046 self._test_readline(size=100)
4047 self._test_read()
4048 self._test_read(size=100)
4049
4050 def test_with_1k_buffer(self):
4051 self._test_readline(buffering=1024)
4052 self._test_readline(size=100, buffering=1024)
4053 self._test_read(buffering=1024)
4054 self._test_read(size=100, buffering=1024)
4055
4056 def _test_readline_no_buffer(self, size=-1):
4057 mock_sock = self.MockSocket(recv_funcs=[
4058 lambda : b"a",
4059 lambda : b"\n",
4060 lambda : b"B",
4061 self._raise_eintr,
4062 lambda : b"b",
4063 lambda : b"",
4064 ])
4065 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004066 self.assertEqual(fo.readline(size), b"a\n")
4067 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004068
4069 def test_no_buffer(self):
4070 self._test_readline_no_buffer()
4071 self._test_readline_no_buffer(size=4)
4072 self._test_read(buffering=0)
4073 self._test_read(size=100, buffering=0)
4074
4075
Guido van Rossume9f66142002-08-07 15:46:19 +00004076class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4077
4078 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004079
Guido van Rossume9f66142002-08-07 15:46:19 +00004080 In this case (and in this case only), it should be possible to
4081 create a file object, read a line from it, create another file
4082 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004083 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004084 when reading multiple requests from the same socket."""
4085
4086 bufsize = 0 # Use unbuffered mode
4087
4088 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004089 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004090 line = self.read_file.readline() # first line
4091 self.assertEqual(line, b"A. " + self.write_msg) # first line
4092 self.read_file = self.cli_conn.makefile('rb', 0)
4093 line = self.read_file.readline() # second line
4094 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004095
4096 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004097 self.write_file.write(b"A. " + self.write_msg)
4098 self.write_file.write(b"B. " + self.write_msg)
4099 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004100
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004101 def testMakefileClose(self):
4102 # The file returned by makefile should keep the socket open...
4103 self.cli_conn.close()
4104 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004105 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004106 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004107 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004108 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004109
4110 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004111 self.write_file.write(self.write_msg)
4112 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004113
4114 def testMakefileCloseSocketDestroy(self):
4115 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004116 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004117 refcount_after = sys.getrefcount(self.cli_conn)
4118 self.assertEqual(refcount_before - 1, refcount_after)
4119
4120 def _testMakefileCloseSocketDestroy(self):
4121 pass
4122
Antoine Pitrou98b46702010-09-18 22:59:00 +00004123 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004124 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004125 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4126
4127 def testSmallReadNonBlocking(self):
4128 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004129 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4130 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004131 self.evt1.set()
4132 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004133 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004134 if first_seg is None:
4135 # Data not arrived (can happen under Windows), wait a bit
4136 time.sleep(0.5)
4137 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004138 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004139 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004140 self.assertEqual(n, 3)
4141 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004142 self.assertEqual(msg, self.read_msg)
4143 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4144 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004145
4146 def _testSmallReadNonBlocking(self):
4147 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004148 self.write_file.write(self.write_msg)
4149 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004150 self.evt2.set()
4151 # Avoid cloding the socket before the server test has finished,
4152 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4153 self.serv_finished.wait(5.0)
4154
4155 def testWriteNonBlocking(self):
4156 self.cli_finished.wait(5.0)
4157 # The client thread can't skip directly - the SkipTest exception
4158 # would appear as a failure.
4159 if self.serv_skipped:
4160 self.skipTest(self.serv_skipped)
4161
4162 def _testWriteNonBlocking(self):
4163 self.serv_skipped = None
4164 self.serv_conn.setblocking(False)
4165 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004166 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004167 LIMIT = 10
4168 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004169 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004170 self.assertGreater(n, 0)
4171 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004172 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004173 if n is None:
4174 # Succeeded
4175 break
4176 self.assertGreater(n, 0)
4177 else:
4178 # Let us know that this test didn't manage to establish
4179 # the expected conditions. This is not a failure in itself but,
4180 # if it happens repeatedly, the test should be fixed.
4181 self.serv_skipped = "failed to saturate the socket buffer"
4182
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004183
Guido van Rossum8c943832002-08-08 01:00:28 +00004184class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4185
4186 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4187
4188
4189class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4190
4191 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004192
Thomas Woutersb2137042007-02-01 18:02:27 +00004193
Antoine Pitrou834bd812010-10-13 16:17:14 +00004194class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4195 """Tests for socket.makefile() in text mode (rather than binary)"""
4196
4197 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004198 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004199 write_mode = 'wb'
4200 write_msg = MSG
4201 newline = ''
4202
4203
4204class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4205 """Tests for socket.makefile() in text mode (rather than binary)"""
4206
4207 read_mode = 'rb'
4208 read_msg = MSG
4209 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004210 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004211 newline = ''
4212
4213
4214class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4215 """Tests for socket.makefile() in text mode (rather than binary)"""
4216
4217 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004218 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004219 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004220 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004221 newline = ''
4222
4223
Guido van Rossumd8faa362007-04-27 19:54:29 +00004224class NetworkConnectionTest(object):
4225 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004226
Guido van Rossumd8faa362007-04-27 19:54:29 +00004227 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004228 # We're inherited below by BasicTCPTest2, which also inherits
4229 # BasicTCPTest, which defines self.port referenced below.
4230 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004231 self.serv_conn = self.cli
4232
4233class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4234 """Tests that NetworkConnection does not break existing TCP functionality.
4235 """
4236
4237class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004238
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004239 class MockSocket(socket.socket):
4240 def connect(self, *args):
4241 raise socket.timeout('timed out')
4242
4243 @contextlib.contextmanager
4244 def mocked_socket_module(self):
4245 """Return a socket which times out on connect"""
4246 old_socket = socket.socket
4247 socket.socket = self.MockSocket
4248 try:
4249 yield
4250 finally:
4251 socket.socket = old_socket
4252
4253 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004254 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004255 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004256 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004257 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004258 cli.connect((HOST, port))
4259 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4260
4261 def test_create_connection(self):
4262 # Issue #9792: errors raised by create_connection() should have
4263 # a proper errno attribute.
4264 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004265 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004266 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004267
4268 # Issue #16257: create_connection() calls getaddrinfo() against
4269 # 'localhost'. This may result in an IPV6 addr being returned
4270 # as well as an IPV4 one:
4271 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4272 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4273 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4274 #
4275 # create_connection() enumerates through all the addresses returned
4276 # and if it doesn't successfully bind to any of them, it propagates
4277 # the last exception it encountered.
4278 #
4279 # On Solaris, ENETUNREACH is returned in this circumstance instead
4280 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4281 # expected errnos.
4282 expected_errnos = [ errno.ECONNREFUSED, ]
4283 if hasattr(errno, 'ENETUNREACH'):
4284 expected_errnos.append(errno.ENETUNREACH)
4285
4286 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004287
4288 def test_create_connection_timeout(self):
4289 # Issue #9792: create_connection() should not recast timeout errors
4290 # as generic socket errors.
4291 with self.mocked_socket_module():
4292 with self.assertRaises(socket.timeout):
4293 socket.create_connection((HOST, 1234))
4294
Guido van Rossumd8faa362007-04-27 19:54:29 +00004295
Victor Stinner45df8202010-04-28 22:31:17 +00004296@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004297class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4298
4299 def __init__(self, methodName='runTest'):
4300 SocketTCPTest.__init__(self, methodName=methodName)
4301 ThreadableTest.__init__(self)
4302
4303 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004304 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004305
4306 def clientTearDown(self):
4307 self.cli.close()
4308 self.cli = None
4309 ThreadableTest.clientTearDown(self)
4310
4311 def _justAccept(self):
4312 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004313 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004314
4315 testFamily = _justAccept
4316 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004317 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004318 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004319 self.assertEqual(self.cli.family, 2)
4320
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004321 testSourceAddress = _justAccept
4322 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004323 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4324 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004325 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004326 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004327 # The port number being used is sufficient to show that the bind()
4328 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004329
Guido van Rossumd8faa362007-04-27 19:54:29 +00004330 testTimeoutDefault = _justAccept
4331 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004332 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004333 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004334 socket.setdefaulttimeout(42)
4335 try:
4336 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004337 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004338 finally:
4339 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004340 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004341
4342 testTimeoutNone = _justAccept
4343 def _testTimeoutNone(self):
4344 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004345 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004346 socket.setdefaulttimeout(30)
4347 try:
4348 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004349 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004350 finally:
4351 socket.setdefaulttimeout(None)
4352 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004353
4354 testTimeoutValueNamed = _justAccept
4355 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004356 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004357 self.assertEqual(self.cli.gettimeout(), 30)
4358
4359 testTimeoutValueNonamed = _justAccept
4360 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004361 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004362 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004363 self.assertEqual(self.cli.gettimeout(), 30)
4364
Victor Stinner45df8202010-04-28 22:31:17 +00004365@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004366class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4367
4368 def __init__(self, methodName='runTest'):
4369 SocketTCPTest.__init__(self, methodName=methodName)
4370 ThreadableTest.__init__(self)
4371
4372 def clientSetUp(self):
4373 pass
4374
4375 def clientTearDown(self):
4376 self.cli.close()
4377 self.cli = None
4378 ThreadableTest.clientTearDown(self)
4379
4380 def testInsideTimeout(self):
4381 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004382 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004383 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004384 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004385 testOutsideTimeout = testInsideTimeout
4386
4387 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004388 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004389 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004390 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004391
4392 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004393 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004394 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004395
4396
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004397class TCPTimeoutTest(SocketTCPTest):
4398
4399 def testTCPTimeout(self):
4400 def raise_timeout(*args, **kwargs):
4401 self.serv.settimeout(1.0)
4402 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004403 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004404 "Error generating a timeout exception (TCP)")
4405
4406 def testTimeoutZero(self):
4407 ok = False
4408 try:
4409 self.serv.settimeout(0.0)
4410 foo = self.serv.accept()
4411 except socket.timeout:
4412 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004413 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004414 ok = True
4415 except:
4416 self.fail("caught unexpected exception (TCP)")
4417 if not ok:
4418 self.fail("accept() returned success when we did not expect it")
4419
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004420 def testInterruptedTimeout(self):
4421 # XXX I don't know how to do this test on MSWindows or any other
4422 # plaform that doesn't support signal.alarm() or os.kill(), though
4423 # the bug should have existed on all platforms.
4424 if not hasattr(signal, "alarm"):
4425 return # can only test on *nix
4426 self.serv.settimeout(5.0) # must be longer than alarm
4427 class Alarm(Exception):
4428 pass
4429 def alarm_handler(signal, frame):
4430 raise Alarm
4431 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4432 try:
4433 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4434 try:
4435 foo = self.serv.accept()
4436 except socket.timeout:
4437 self.fail("caught timeout instead of Alarm")
4438 except Alarm:
4439 pass
4440 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004441 self.fail("caught other exception instead of Alarm:"
4442 " %s(%s):\n%s" %
4443 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004444 else:
4445 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004446 finally:
4447 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004448 except Alarm:
4449 self.fail("got Alarm in wrong place")
4450 finally:
4451 # no alarm can be pending. Safe to restore old handler.
4452 signal.signal(signal.SIGALRM, old_alarm)
4453
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004454class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004455
4456 def testUDPTimeout(self):
4457 def raise_timeout(*args, **kwargs):
4458 self.serv.settimeout(1.0)
4459 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004460 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004461 "Error generating a timeout exception (UDP)")
4462
4463 def testTimeoutZero(self):
4464 ok = False
4465 try:
4466 self.serv.settimeout(0.0)
4467 foo = self.serv.recv(1024)
4468 except socket.timeout:
4469 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004470 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004471 ok = True
4472 except:
4473 self.fail("caught unexpected exception (UDP)")
4474 if not ok:
4475 self.fail("recv() returned success when we did not expect it")
4476
4477class TestExceptions(unittest.TestCase):
4478
4479 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004480 self.assertTrue(issubclass(OSError, Exception))
4481 self.assertTrue(issubclass(socket.herror, OSError))
4482 self.assertTrue(issubclass(socket.gaierror, OSError))
4483 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004484
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004485class TestLinuxAbstractNamespace(unittest.TestCase):
4486
4487 UNIX_PATH_MAX = 108
4488
4489 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004490 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004491 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4492 s1.bind(address)
4493 s1.listen(1)
4494 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4495 s2.connect(s1.getsockname())
4496 with s1.accept()[0] as s3:
4497 self.assertEqual(s1.getsockname(), address)
4498 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004499
4500 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004501 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004502 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4503 s.bind(address)
4504 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004505
4506 def testNameOverflow(self):
4507 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004508 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004509 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004510
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004511 def testStrName(self):
4512 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004513 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4514 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004515 s.bind("\x00python\x00test\x00")
4516 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004517 finally:
4518 s.close()
4519
4520class TestUnixDomain(unittest.TestCase):
4521
4522 def setUp(self):
4523 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4524
4525 def tearDown(self):
4526 self.sock.close()
4527
4528 def encoded(self, path):
4529 # Return the given path encoded in the file system encoding,
4530 # or skip the test if this is not possible.
4531 try:
4532 return os.fsencode(path)
4533 except UnicodeEncodeError:
4534 self.skipTest(
4535 "Pathname {0!a} cannot be represented in file "
4536 "system encoding {1!r}".format(
4537 path, sys.getfilesystemencoding()))
4538
Antoine Pitrou16374872011-12-16 15:04:12 +01004539 def bind(self, sock, path):
4540 # Bind the socket
4541 try:
4542 sock.bind(path)
4543 except OSError as e:
4544 if str(e) == "AF_UNIX path too long":
4545 self.skipTest(
4546 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4547 .format(path))
4548 else:
4549 raise
4550
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004551 def testStrAddr(self):
4552 # Test binding to and retrieving a normal string pathname.
4553 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004554 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004555 self.addCleanup(support.unlink, path)
4556 self.assertEqual(self.sock.getsockname(), path)
4557
4558 def testBytesAddr(self):
4559 # Test binding to a bytes pathname.
4560 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004561 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004562 self.addCleanup(support.unlink, path)
4563 self.assertEqual(self.sock.getsockname(), path)
4564
4565 def testSurrogateescapeBind(self):
4566 # Test binding to a valid non-ASCII pathname, with the
4567 # non-ASCII bytes supplied using surrogateescape encoding.
4568 path = os.path.abspath(support.TESTFN_UNICODE)
4569 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004570 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004571 self.addCleanup(support.unlink, path)
4572 self.assertEqual(self.sock.getsockname(), path)
4573
4574 def testUnencodableAddr(self):
4575 # Test binding to a pathname that cannot be encoded in the
4576 # file system encoding.
4577 if support.TESTFN_UNENCODABLE is None:
4578 self.skipTest("No unencodable filename available")
4579 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004580 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004581 self.addCleanup(support.unlink, path)
4582 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004583
Victor Stinner45df8202010-04-28 22:31:17 +00004584@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004585class BufferIOTest(SocketConnectedTest):
4586 """
4587 Test the buffer versions of socket.recv() and socket.send().
4588 """
4589 def __init__(self, methodName='runTest'):
4590 SocketConnectedTest.__init__(self, methodName=methodName)
4591
Antoine Pitrou25480782010-03-17 22:50:28 +00004592 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004593 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004594 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004595 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004596 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004597 self.assertEqual(msg, MSG)
4598
Antoine Pitrou25480782010-03-17 22:50:28 +00004599 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004600 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004601 self.serv_conn.send(buf)
4602
Antoine Pitrou25480782010-03-17 22:50:28 +00004603 def testRecvIntoBytearray(self):
4604 buf = bytearray(1024)
4605 nbytes = self.cli_conn.recv_into(buf)
4606 self.assertEqual(nbytes, len(MSG))
4607 msg = buf[:len(MSG)]
4608 self.assertEqual(msg, MSG)
4609
4610 _testRecvIntoBytearray = _testRecvIntoArray
4611
4612 def testRecvIntoMemoryview(self):
4613 buf = bytearray(1024)
4614 nbytes = self.cli_conn.recv_into(memoryview(buf))
4615 self.assertEqual(nbytes, len(MSG))
4616 msg = buf[:len(MSG)]
4617 self.assertEqual(msg, MSG)
4618
4619 _testRecvIntoMemoryview = _testRecvIntoArray
4620
4621 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004622 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004623 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004624 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004625 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004626 self.assertEqual(msg, MSG)
4627
Antoine Pitrou25480782010-03-17 22:50:28 +00004628 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004629 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004630 self.serv_conn.send(buf)
4631
Antoine Pitrou25480782010-03-17 22:50:28 +00004632 def testRecvFromIntoBytearray(self):
4633 buf = bytearray(1024)
4634 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4635 self.assertEqual(nbytes, len(MSG))
4636 msg = buf[:len(MSG)]
4637 self.assertEqual(msg, MSG)
4638
4639 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4640
4641 def testRecvFromIntoMemoryview(self):
4642 buf = bytearray(1024)
4643 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4644 self.assertEqual(nbytes, len(MSG))
4645 msg = buf[:len(MSG)]
4646 self.assertEqual(msg, MSG)
4647
4648 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4649
Christian Heimes043d6f62008-01-07 17:19:16 +00004650
4651TIPC_STYPE = 2000
4652TIPC_LOWER = 200
4653TIPC_UPPER = 210
4654
4655def isTipcAvailable():
4656 """Check if the TIPC module is loaded
4657
4658 The TIPC module is not loaded automatically on Ubuntu and probably
4659 other Linux distros.
4660 """
4661 if not hasattr(socket, "AF_TIPC"):
4662 return False
4663 if not os.path.isfile("/proc/modules"):
4664 return False
4665 with open("/proc/modules") as f:
4666 for line in f:
4667 if line.startswith("tipc "):
4668 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004669 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004670 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4671 return False
4672
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004673class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004674 def testRDM(self):
4675 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4676 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004677 self.addCleanup(srv.close)
4678 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004679
4680 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4681 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4682 TIPC_LOWER, TIPC_UPPER)
4683 srv.bind(srvaddr)
4684
4685 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4686 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4687 cli.sendto(MSG, sendaddr)
4688
4689 msg, recvaddr = srv.recvfrom(1024)
4690
4691 self.assertEqual(cli.getsockname(), recvaddr)
4692 self.assertEqual(msg, MSG)
4693
4694
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004695class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004696 def __init__(self, methodName = 'runTest'):
4697 unittest.TestCase.__init__(self, methodName = methodName)
4698 ThreadableTest.__init__(self)
4699
4700 def setUp(self):
4701 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004702 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004703 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4704 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4705 TIPC_LOWER, TIPC_UPPER)
4706 self.srv.bind(srvaddr)
4707 self.srv.listen(5)
4708 self.serverExplicitReady()
4709 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004710 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004711
4712 def clientSetUp(self):
4713 # The is a hittable race between serverExplicitReady() and the
4714 # accept() call; sleep a little while to avoid it, otherwise
4715 # we could get an exception
4716 time.sleep(0.1)
4717 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004718 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004719 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4720 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4721 self.cli.connect(addr)
4722 self.cliaddr = self.cli.getsockname()
4723
4724 def testStream(self):
4725 msg = self.conn.recv(1024)
4726 self.assertEqual(msg, MSG)
4727 self.assertEqual(self.cliaddr, self.connaddr)
4728
4729 def _testStream(self):
4730 self.cli.send(MSG)
4731 self.cli.close()
4732
4733
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004734@unittest.skipUnless(thread, 'Threading required for this test.')
4735class ContextManagersTest(ThreadedTCPSocketTest):
4736
4737 def _testSocketClass(self):
4738 # base test
4739 with socket.socket() as sock:
4740 self.assertFalse(sock._closed)
4741 self.assertTrue(sock._closed)
4742 # close inside with block
4743 with socket.socket() as sock:
4744 sock.close()
4745 self.assertTrue(sock._closed)
4746 # exception inside with block
4747 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004748 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004749 self.assertTrue(sock._closed)
4750
4751 def testCreateConnectionBase(self):
4752 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004753 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004754 data = conn.recv(1024)
4755 conn.sendall(data)
4756
4757 def _testCreateConnectionBase(self):
4758 address = self.serv.getsockname()
4759 with socket.create_connection(address) as sock:
4760 self.assertFalse(sock._closed)
4761 sock.sendall(b'foo')
4762 self.assertEqual(sock.recv(1024), b'foo')
4763 self.assertTrue(sock._closed)
4764
4765 def testCreateConnectionClose(self):
4766 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004767 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004768 data = conn.recv(1024)
4769 conn.sendall(data)
4770
4771 def _testCreateConnectionClose(self):
4772 address = self.serv.getsockname()
4773 with socket.create_connection(address) as sock:
4774 sock.close()
4775 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004776 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004777
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004778
Victor Stinnerdaf45552013-08-28 00:53:59 +02004779class InheritanceTest(unittest.TestCase):
4780 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4781 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004782 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004783 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004784 with socket.socket(socket.AF_INET,
4785 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4786 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004787 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004788
4789 def test_default_inheritable(self):
4790 sock = socket.socket()
4791 with sock:
4792 self.assertEqual(sock.get_inheritable(), False)
4793
4794 def test_dup(self):
4795 sock = socket.socket()
4796 with sock:
4797 newsock = sock.dup()
4798 sock.close()
4799 with newsock:
4800 self.assertEqual(newsock.get_inheritable(), False)
4801
4802 def test_set_inheritable(self):
4803 sock = socket.socket()
4804 with sock:
4805 sock.set_inheritable(True)
4806 self.assertEqual(sock.get_inheritable(), True)
4807
4808 sock.set_inheritable(False)
4809 self.assertEqual(sock.get_inheritable(), False)
4810
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004811 @unittest.skipIf(fcntl is None, "need fcntl")
4812 def test_get_inheritable_cloexec(self):
4813 sock = socket.socket()
4814 with sock:
4815 fd = sock.fileno()
4816 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004817
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004818 # clear FD_CLOEXEC flag
4819 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4820 flags &= ~fcntl.FD_CLOEXEC
4821 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004822
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004823 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004824
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004825 @unittest.skipIf(fcntl is None, "need fcntl")
4826 def test_set_inheritable_cloexec(self):
4827 sock = socket.socket()
4828 with sock:
4829 fd = sock.fileno()
4830 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4831 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004832
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004833 sock.set_inheritable(True)
4834 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4835 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004836
4837
Victor Stinnerdaf45552013-08-28 00:53:59 +02004838 @unittest.skipUnless(hasattr(socket, "socketpair"),
4839 "need socket.socketpair()")
4840 def test_socketpair(self):
4841 s1, s2 = socket.socketpair()
4842 self.addCleanup(s1.close)
4843 self.addCleanup(s2.close)
4844 self.assertEqual(s1.get_inheritable(), False)
4845 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004846
4847
4848@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4849 "SOCK_NONBLOCK not defined")
4850class NonblockConstantTest(unittest.TestCase):
4851 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4852 if nonblock:
4853 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4854 self.assertEqual(s.gettimeout(), timeout)
4855 else:
4856 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4857 self.assertEqual(s.gettimeout(), None)
4858
Charles-François Natali239bb962011-06-03 12:55:15 +02004859 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004860 def test_SOCK_NONBLOCK(self):
4861 # a lot of it seems silly and redundant, but I wanted to test that
4862 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004863 with socket.socket(socket.AF_INET,
4864 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4865 self.checkNonblock(s)
4866 s.setblocking(1)
4867 self.checkNonblock(s, False)
4868 s.setblocking(0)
4869 self.checkNonblock(s)
4870 s.settimeout(None)
4871 self.checkNonblock(s, False)
4872 s.settimeout(2.0)
4873 self.checkNonblock(s, timeout=2.0)
4874 s.setblocking(1)
4875 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004876 # defaulttimeout
4877 t = socket.getdefaulttimeout()
4878 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004879 with socket.socket() as s:
4880 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004881 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004882 with socket.socket() as s:
4883 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004884 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004885 with socket.socket() as s:
4886 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004887 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004888 with socket.socket() as s:
4889 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004890 socket.setdefaulttimeout(t)
4891
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004892
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004893@unittest.skipUnless(os.name == "nt", "Windows specific")
4894@unittest.skipUnless(multiprocessing, "need multiprocessing")
4895class TestSocketSharing(SocketTCPTest):
4896 # This must be classmethod and not staticmethod or multiprocessing
4897 # won't be able to bootstrap it.
4898 @classmethod
4899 def remoteProcessServer(cls, q):
4900 # Recreate socket from shared data
4901 sdata = q.get()
4902 message = q.get()
4903
4904 s = socket.fromshare(sdata)
4905 s2, c = s.accept()
4906
4907 # Send the message
4908 s2.sendall(message)
4909 s2.close()
4910 s.close()
4911
4912 def testShare(self):
4913 # Transfer the listening server socket to another process
4914 # and service it from there.
4915
4916 # Create process:
4917 q = multiprocessing.Queue()
4918 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4919 p.start()
4920
4921 # Get the shared socket data
4922 data = self.serv.share(p.pid)
4923
4924 # Pass the shared socket to the other process
4925 addr = self.serv.getsockname()
4926 self.serv.close()
4927 q.put(data)
4928
4929 # The data that the server will send us
4930 message = b"slapmahfro"
4931 q.put(message)
4932
4933 # Connect
4934 s = socket.create_connection(addr)
4935 # listen for the data
4936 m = []
4937 while True:
4938 data = s.recv(100)
4939 if not data:
4940 break
4941 m.append(data)
4942 s.close()
4943 received = b"".join(m)
4944 self.assertEqual(received, message)
4945 p.join()
4946
4947 def testShareLength(self):
4948 data = self.serv.share(os.getpid())
4949 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4950 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4951
4952 def compareSockets(self, org, other):
4953 # socket sharing is expected to work only for blocking socket
4954 # since the internal python timout value isn't transfered.
4955 self.assertEqual(org.gettimeout(), None)
4956 self.assertEqual(org.gettimeout(), other.gettimeout())
4957
4958 self.assertEqual(org.family, other.family)
4959 self.assertEqual(org.type, other.type)
4960 # If the user specified "0" for proto, then
4961 # internally windows will have picked the correct value.
4962 # Python introspection on the socket however will still return
4963 # 0. For the shared socket, the python value is recreated
4964 # from the actual value, so it may not compare correctly.
4965 if org.proto != 0:
4966 self.assertEqual(org.proto, other.proto)
4967
4968 def testShareLocal(self):
4969 data = self.serv.share(os.getpid())
4970 s = socket.fromshare(data)
4971 try:
4972 self.compareSockets(self.serv, s)
4973 finally:
4974 s.close()
4975
4976 def testTypes(self):
4977 families = [socket.AF_INET, socket.AF_INET6]
4978 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4979 for f in families:
4980 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00004981 try:
4982 source = socket.socket(f, t)
4983 except OSError:
4984 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004985 try:
4986 data = source.share(os.getpid())
4987 shared = socket.fromshare(data)
4988 try:
4989 self.compareSockets(source, shared)
4990 finally:
4991 shared.close()
4992 finally:
4993 source.close()
4994
4995
Guido van Rossumb995eb72002-07-31 16:08:40 +00004996def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004997 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004998 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004999
5000 tests.extend([
5001 NonBlockingTCPTests,
5002 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005003 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00005004 UnbufferedFileObjectClassTestCase,
5005 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005006 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005007 UnicodeReadFileObjectClassTestCase,
5008 UnicodeWriteFileObjectClassTestCase,
5009 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005010 NetworkConnectionNoServer,
5011 NetworkConnectionAttributesTest,
5012 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005013 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005014 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005015 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005016 ])
Dave Cole331708b2004-08-09 04:51:41 +00005017 if hasattr(socket, "socketpair"):
5018 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005019 if hasattr(socket, "AF_UNIX"):
5020 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02005021 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005022 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00005023 if isTipcAvailable():
5024 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00005025 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02005026 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005027 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005028 tests.extend([
5029 CmsgMacroTests,
5030 SendmsgUDPTest,
5031 RecvmsgUDPTest,
5032 RecvmsgIntoUDPTest,
5033 SendmsgUDP6Test,
5034 RecvmsgUDP6Test,
5035 RecvmsgRFC3542AncillaryUDP6Test,
5036 RecvmsgIntoRFC3542AncillaryUDP6Test,
5037 RecvmsgIntoUDP6Test,
5038 SendmsgTCPTest,
5039 RecvmsgTCPTest,
5040 RecvmsgIntoTCPTest,
5041 SendmsgSCTPStreamTest,
5042 RecvmsgSCTPStreamTest,
5043 RecvmsgIntoSCTPStreamTest,
5044 SendmsgUnixStreamTest,
5045 RecvmsgUnixStreamTest,
5046 RecvmsgIntoUnixStreamTest,
5047 RecvmsgSCMRightsStreamTest,
5048 RecvmsgIntoSCMRightsStreamTest,
5049 # These are slow when setitimer() is not available
5050 InterruptedRecvTimeoutTest,
5051 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005052 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005053 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005054
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005055 thread_info = support.threading_setup()
5056 support.run_unittest(*tests)
5057 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005058
5059if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005060 test_main()