blob: 450aee1d43343f7d56169ed2a0b0b8531f84f2e9 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Antoine Pitroub7eb5632012-06-24 01:34:13 +02003from unittest.case import _ExpectedFailure
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004
Christian Heimes5e696852008-04-09 08:37:03 +00005import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00006import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00007import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +10009import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000016import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000017import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000020import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010021import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020022import struct
Antoine Pitroub1c54962010-10-14 15:05:38 +000023try:
24 import fcntl
25except ImportError:
26 fcntl = False
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000027try:
28 import multiprocessing
29except ImportError:
30 multiprocessing = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000031
Benjamin Petersonee8712c2008-05-20 21:35:26 +000032HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000033MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000034
Victor Stinner45df8202010-04-28 22:31:17 +000035try:
36 import _thread as thread
37 import threading
38except ImportError:
39 thread = None
40 threading = None
41
Charles-François Natali47413c12011-10-06 19:47:44 +020042def _have_socket_can():
43 """Check whether CAN sockets are supported on this host."""
44 try:
45 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
46 except (AttributeError, socket.error, OSError):
47 return False
48 else:
49 s.close()
50 return True
51
Charles-François Natali10b8cf42011-11-10 19:21:37 +010052def _have_socket_rds():
53 """Check whether RDS sockets are supported on this host."""
54 try:
55 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
56 except (AttributeError, OSError):
57 return False
58 else:
59 s.close()
60 return True
61
Charles-François Natali47413c12011-10-06 19:47:44 +020062HAVE_SOCKET_CAN = _have_socket_can()
63
Charles-François Natali10b8cf42011-11-10 19:21:37 +010064HAVE_SOCKET_RDS = _have_socket_rds()
65
Nick Coghlan96fe56a2011-08-22 11:55:57 +100066# Size in bytes of the int type
67SIZEOF_INT = array.array("i").itemsize
68
Guido van Rossum24e4af82002-06-12 19:18:08 +000069class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000070
Guido van Rossum24e4af82002-06-12 19:18:08 +000071 def setUp(self):
72 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000073 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000074 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000075
Guido van Rossum24e4af82002-06-12 19:18:08 +000076 def tearDown(self):
77 self.serv.close()
78 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000079
Guido van Rossum24e4af82002-06-12 19:18:08 +000080class SocketUDPTest(unittest.TestCase):
81
82 def setUp(self):
83 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000084 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000085
86 def tearDown(self):
87 self.serv.close()
88 self.serv = None
89
Nick Coghlan96fe56a2011-08-22 11:55:57 +100090class ThreadSafeCleanupTestCase(unittest.TestCase):
91 """Subclass of unittest.TestCase with thread-safe cleanup methods.
92
93 This subclass protects the addCleanup() and doCleanups() methods
94 with a recursive lock.
95 """
96
97 if threading:
98 def __init__(self, *args, **kwargs):
99 super().__init__(*args, **kwargs)
100 self._cleanup_lock = threading.RLock()
101
102 def addCleanup(self, *args, **kwargs):
103 with self._cleanup_lock:
104 return super().addCleanup(*args, **kwargs)
105
106 def doCleanups(self, *args, **kwargs):
107 with self._cleanup_lock:
108 return super().doCleanups(*args, **kwargs)
109
Charles-François Natali47413c12011-10-06 19:47:44 +0200110class SocketCANTest(unittest.TestCase):
111
112 """To be able to run this test, a `vcan0` CAN interface can be created with
113 the following commands:
114 # modprobe vcan
115 # ip link add dev vcan0 type vcan
116 # ifconfig vcan0 up
117 """
118 interface = 'vcan0'
119 bufsize = 128
120
121 def setUp(self):
122 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200123 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200124 try:
125 self.s.bind((self.interface,))
126 except socket.error:
127 self.skipTest('network interface `%s` does not exist' %
128 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200129
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100130
131class SocketRDSTest(unittest.TestCase):
132
133 """To be able to run this test, the `rds` kernel module must be loaded:
134 # modprobe rds
135 """
136 bufsize = 8192
137
138 def setUp(self):
139 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
140 self.addCleanup(self.serv.close)
141 try:
142 self.port = support.bind_port(self.serv)
143 except OSError:
144 self.skipTest('unable to bind RDS socket')
145
146
Guido van Rossum24e4af82002-06-12 19:18:08 +0000147class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000148 """Threadable Test class
149
150 The ThreadableTest class makes it easy to create a threaded
151 client/server pair from an existing unit test. To create a
152 new threaded class from an existing unit test, use multiple
153 inheritance:
154
155 class NewClass (OldClass, ThreadableTest):
156 pass
157
158 This class defines two new fixture functions with obvious
159 purposes for overriding:
160
161 clientSetUp ()
162 clientTearDown ()
163
164 Any new test functions within the class must then define
165 tests in pairs, where the test name is preceeded with a
166 '_' to indicate the client portion of the test. Ex:
167
168 def testFoo(self):
169 # Server portion
170
171 def _testFoo(self):
172 # Client portion
173
174 Any exceptions raised by the clients during their tests
175 are caught and transferred to the main thread to alert
176 the testing framework.
177
178 Note, the server setup function cannot call any blocking
179 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000180 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000181 the blocking call (such as in setting up a client/server
182 connection and performing the accept() in setUp().
183 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000184
185 def __init__(self):
186 # Swap the true setup function
187 self.__setUp = self.setUp
188 self.__tearDown = self.tearDown
189 self.setUp = self._setUp
190 self.tearDown = self._tearDown
191
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000192 def serverExplicitReady(self):
193 """This method allows the server to explicitly indicate that
194 it wants the client thread to proceed. This is useful if the
195 server is about to execute a blocking routine that is
196 dependent upon the client thread during its setup routine."""
197 self.server_ready.set()
198
Guido van Rossum24e4af82002-06-12 19:18:08 +0000199 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000200 self.server_ready = threading.Event()
201 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000202 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000203 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200204 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000205
206 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000207 methodname = self.id()
208 i = methodname.rfind('.')
209 methodname = methodname[i+1:]
210 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000211 self.client_thread = thread.start_new_thread(
212 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000213
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200214 try:
215 self.__setUp()
216 except:
217 self.server_crashed = True
218 raise
219 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000220 self.server_ready.set()
221 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000222
223 def _tearDown(self):
224 self.__tearDown()
225 self.done.wait()
226
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000227 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000228 exc = self.queue.get()
229 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000230
231 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000232 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000233 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200234 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200235 if self.server_crashed:
236 self.clientTearDown()
237 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000238 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000239 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000240 try:
241 test_func()
Antoine Pitroub7eb5632012-06-24 01:34:13 +0200242 except _ExpectedFailure:
Nick Coghlan2496f332011-09-19 20:26:31 +1000243 # We deliberately ignore expected failures
244 pass
Antoine Pitrou98b46702010-09-18 22:59:00 +0000245 except BaseException as e:
246 self.queue.put(e)
247 finally:
248 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000249
250 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000251 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000252
253 def clientTearDown(self):
254 self.done.set()
255 thread.exit()
256
257class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
258
259 def __init__(self, methodName='runTest'):
260 SocketTCPTest.__init__(self, methodName=methodName)
261 ThreadableTest.__init__(self)
262
263 def clientSetUp(self):
264 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
265
266 def clientTearDown(self):
267 self.cli.close()
268 self.cli = None
269 ThreadableTest.clientTearDown(self)
270
271class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
272
273 def __init__(self, methodName='runTest'):
274 SocketUDPTest.__init__(self, methodName=methodName)
275 ThreadableTest.__init__(self)
276
277 def clientSetUp(self):
278 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
279
Brian Curtin3beb38f2010-11-04 03:41:43 +0000280 def clientTearDown(self):
281 self.cli.close()
282 self.cli = None
283 ThreadableTest.clientTearDown(self)
284
Charles-François Natali47413c12011-10-06 19:47:44 +0200285class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
286
287 def __init__(self, methodName='runTest'):
288 SocketCANTest.__init__(self, methodName=methodName)
289 ThreadableTest.__init__(self)
290
291 def clientSetUp(self):
292 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
293 try:
294 self.cli.bind((self.interface,))
295 except socket.error:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200296 # skipTest should not be called here, and will be called in the
297 # server instead
298 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200299
300 def clientTearDown(self):
301 self.cli.close()
302 self.cli = None
303 ThreadableTest.clientTearDown(self)
304
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100305class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
306
307 def __init__(self, methodName='runTest'):
308 SocketRDSTest.__init__(self, methodName=methodName)
309 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100310
311 def clientSetUp(self):
312 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
313 try:
314 # RDS sockets must be bound explicitly to send or receive data
315 self.cli.bind((HOST, 0))
316 self.cli_addr = self.cli.getsockname()
317 except OSError:
318 # skipTest should not be called here, and will be called in the
319 # server instead
320 pass
321
322 def clientTearDown(self):
323 self.cli.close()
324 self.cli = None
325 ThreadableTest.clientTearDown(self)
326
Guido van Rossum24e4af82002-06-12 19:18:08 +0000327class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000328 """Socket tests for client-server connection.
329
330 self.cli_conn is a client socket connected to the server. The
331 setUp() method guarantees that it is connected to the server.
332 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000333
334 def __init__(self, methodName='runTest'):
335 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
336
337 def setUp(self):
338 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000339 # Indicate explicitly we're ready for the client thread to
340 # proceed and then perform the blocking call to accept
341 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000342 conn, addr = self.serv.accept()
343 self.cli_conn = conn
344
345 def tearDown(self):
346 self.cli_conn.close()
347 self.cli_conn = None
348 ThreadedTCPSocketTest.tearDown(self)
349
350 def clientSetUp(self):
351 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000352 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000353 self.serv_conn = self.cli
354
355 def clientTearDown(self):
356 self.serv_conn.close()
357 self.serv_conn = None
358 ThreadedTCPSocketTest.clientTearDown(self)
359
Dave Cole331708b2004-08-09 04:51:41 +0000360class SocketPairTest(unittest.TestCase, ThreadableTest):
361
362 def __init__(self, methodName='runTest'):
363 unittest.TestCase.__init__(self, methodName=methodName)
364 ThreadableTest.__init__(self)
365
366 def setUp(self):
367 self.serv, self.cli = socket.socketpair()
368
369 def tearDown(self):
370 self.serv.close()
371 self.serv = None
372
373 def clientSetUp(self):
374 pass
375
376 def clientTearDown(self):
377 self.cli.close()
378 self.cli = None
379 ThreadableTest.clientTearDown(self)
380
Tim Peters494aaee2004-08-09 18:54:11 +0000381
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000382# The following classes are used by the sendmsg()/recvmsg() tests.
383# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
384# gives a drop-in replacement for SocketConnectedTest, but different
385# address families can be used, and the attributes serv_addr and
386# cli_addr will be set to the addresses of the endpoints.
387
388class SocketTestBase(unittest.TestCase):
389 """A base class for socket tests.
390
391 Subclasses must provide methods newSocket() to return a new socket
392 and bindSock(sock) to bind it to an unused address.
393
394 Creates a socket self.serv and sets self.serv_addr to its address.
395 """
396
397 def setUp(self):
398 self.serv = self.newSocket()
399 self.bindServer()
400
401 def bindServer(self):
402 """Bind server socket and set self.serv_addr to its address."""
403 self.bindSock(self.serv)
404 self.serv_addr = self.serv.getsockname()
405
406 def tearDown(self):
407 self.serv.close()
408 self.serv = None
409
410
411class SocketListeningTestMixin(SocketTestBase):
412 """Mixin to listen on the server socket."""
413
414 def setUp(self):
415 super().setUp()
416 self.serv.listen(1)
417
418
419class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
420 ThreadableTest):
421 """Mixin to add client socket and allow client/server tests.
422
423 Client socket is self.cli and its address is self.cli_addr. See
424 ThreadableTest for usage information.
425 """
426
427 def __init__(self, *args, **kwargs):
428 super().__init__(*args, **kwargs)
429 ThreadableTest.__init__(self)
430
431 def clientSetUp(self):
432 self.cli = self.newClientSocket()
433 self.bindClient()
434
435 def newClientSocket(self):
436 """Return a new socket for use as client."""
437 return self.newSocket()
438
439 def bindClient(self):
440 """Bind client socket and set self.cli_addr to its address."""
441 self.bindSock(self.cli)
442 self.cli_addr = self.cli.getsockname()
443
444 def clientTearDown(self):
445 self.cli.close()
446 self.cli = None
447 ThreadableTest.clientTearDown(self)
448
449
450class ConnectedStreamTestMixin(SocketListeningTestMixin,
451 ThreadedSocketTestMixin):
452 """Mixin to allow client/server stream tests with connected client.
453
454 Server's socket representing connection to client is self.cli_conn
455 and client's connection to server is self.serv_conn. (Based on
456 SocketConnectedTest.)
457 """
458
459 def setUp(self):
460 super().setUp()
461 # Indicate explicitly we're ready for the client thread to
462 # proceed and then perform the blocking call to accept
463 self.serverExplicitReady()
464 conn, addr = self.serv.accept()
465 self.cli_conn = conn
466
467 def tearDown(self):
468 self.cli_conn.close()
469 self.cli_conn = None
470 super().tearDown()
471
472 def clientSetUp(self):
473 super().clientSetUp()
474 self.cli.connect(self.serv_addr)
475 self.serv_conn = self.cli
476
477 def clientTearDown(self):
478 self.serv_conn.close()
479 self.serv_conn = None
480 super().clientTearDown()
481
482
483class UnixSocketTestBase(SocketTestBase):
484 """Base class for Unix-domain socket tests."""
485
486 # This class is used for file descriptor passing tests, so we
487 # create the sockets in a private directory so that other users
488 # can't send anything that might be problematic for a privileged
489 # user running the tests.
490
491 def setUp(self):
492 self.dir_path = tempfile.mkdtemp()
493 self.addCleanup(os.rmdir, self.dir_path)
494 super().setUp()
495
496 def bindSock(self, sock):
497 path = tempfile.mktemp(dir=self.dir_path)
498 sock.bind(path)
499 self.addCleanup(support.unlink, path)
500
501class UnixStreamBase(UnixSocketTestBase):
502 """Base class for Unix-domain SOCK_STREAM tests."""
503
504 def newSocket(self):
505 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
506
507
508class InetTestBase(SocketTestBase):
509 """Base class for IPv4 socket tests."""
510
511 host = HOST
512
513 def setUp(self):
514 super().setUp()
515 self.port = self.serv_addr[1]
516
517 def bindSock(self, sock):
518 support.bind_port(sock, host=self.host)
519
520class TCPTestBase(InetTestBase):
521 """Base class for TCP-over-IPv4 tests."""
522
523 def newSocket(self):
524 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
525
526class UDPTestBase(InetTestBase):
527 """Base class for UDP-over-IPv4 tests."""
528
529 def newSocket(self):
530 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
531
532class SCTPStreamBase(InetTestBase):
533 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
534
535 def newSocket(self):
536 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
537 socket.IPPROTO_SCTP)
538
539
540class Inet6TestBase(InetTestBase):
541 """Base class for IPv6 socket tests."""
542
543 # Don't use "localhost" here - it may not have an IPv6 address
544 # assigned to it by default (e.g. in /etc/hosts), and if someone
545 # has assigned it an IPv4-mapped address, then it's unlikely to
546 # work with the full IPv6 API.
547 host = "::1"
548
549class UDP6TestBase(Inet6TestBase):
550 """Base class for UDP-over-IPv6 tests."""
551
552 def newSocket(self):
553 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
554
555
556# Test-skipping decorators for use with ThreadableTest.
557
558def skipWithClientIf(condition, reason):
559 """Skip decorated test if condition is true, add client_skip decorator.
560
561 If the decorated object is not a class, sets its attribute
562 "client_skip" to a decorator which will return an empty function
563 if the test is to be skipped, or the original function if it is
564 not. This can be used to avoid running the client part of a
565 skipped test when using ThreadableTest.
566 """
567 def client_pass(*args, **kwargs):
568 pass
569 def skipdec(obj):
570 retval = unittest.skip(reason)(obj)
571 if not isinstance(obj, type):
572 retval.client_skip = lambda f: client_pass
573 return retval
574 def noskipdec(obj):
575 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
576 obj.client_skip = lambda f: f
577 return obj
578 return skipdec if condition else noskipdec
579
580
581def requireAttrs(obj, *attributes):
582 """Skip decorated test if obj is missing any of the given attributes.
583
584 Sets client_skip attribute as skipWithClientIf() does.
585 """
586 missing = [name for name in attributes if not hasattr(obj, name)]
587 return skipWithClientIf(
588 missing, "don't have " + ", ".join(name for name in missing))
589
590
591def requireSocket(*args):
592 """Skip decorated test if a socket cannot be created with given arguments.
593
594 When an argument is given as a string, will use the value of that
595 attribute of the socket module, or skip the test if it doesn't
596 exist. Sets client_skip attribute as skipWithClientIf() does.
597 """
598 err = None
599 missing = [obj for obj in args if
600 isinstance(obj, str) and not hasattr(socket, obj)]
601 if missing:
602 err = "don't have " + ", ".join(name for name in missing)
603 else:
604 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
605 for obj in args]
606 try:
607 s = socket.socket(*callargs)
608 except socket.error as e:
609 # XXX: check errno?
610 err = str(e)
611 else:
612 s.close()
613 return skipWithClientIf(
614 err is not None,
615 "can't create socket({0}): {1}".format(
616 ", ".join(str(o) for o in args), err))
617
618
Guido van Rossum24e4af82002-06-12 19:18:08 +0000619#######################################################################
620## Begin Tests
621
622class GeneralModuleTests(unittest.TestCase):
623
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000624 def test_repr(self):
625 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000626 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000627 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000628
Raymond Hettinger027bb632004-05-31 03:09:25 +0000629 def test_weakref(self):
630 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
631 p = proxy(s)
632 self.assertEqual(p.fileno(), s.fileno())
633 s.close()
634 s = None
635 try:
636 p.fileno()
637 except ReferenceError:
638 pass
639 else:
640 self.fail('Socket proxy still exists')
641
Guido van Rossum24e4af82002-06-12 19:18:08 +0000642 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000643 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300644 msg = "Error raising socket exception (%s)."
645 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000646 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300647 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000648 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300649 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000650 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000651
Ezio Melotti63e42302011-05-07 19:47:48 +0300652 def testSendtoErrors(self):
653 # Testing that sendto doens't masks failures. See #10169.
654 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
655 self.addCleanup(s.close)
656 s.bind(('', 0))
657 sockname = s.getsockname()
658 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300659 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300660 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300661 self.assertEqual(str(cm.exception),
662 "'str' does not support the buffer interface")
663 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300664 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300665 self.assertEqual(str(cm.exception),
666 "'complex' does not support the buffer interface")
667 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300668 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300669 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300670 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300671 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300672 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300673 self.assertEqual(str(cm.exception),
674 "'str' does not support the buffer interface")
675 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300676 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300677 self.assertEqual(str(cm.exception),
678 "'complex' does not support the buffer interface")
679 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300680 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300681 self.assertIn('not NoneType', str(cm.exception))
682 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300683 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300684 self.assertIn('an integer is required', str(cm.exception))
685 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300686 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300687 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300688 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300689 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300690 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300691 self.assertIn('(1 given)', str(cm.exception))
692 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300693 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300694 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300695
Guido van Rossum24e4af82002-06-12 19:18:08 +0000696 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000697 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000698 socket.AF_INET
699 socket.SOCK_STREAM
700 socket.SOCK_DGRAM
701 socket.SOCK_RAW
702 socket.SOCK_RDM
703 socket.SOCK_SEQPACKET
704 socket.SOL_SOCKET
705 socket.SO_REUSEADDR
706
Guido van Rossum654c11e2002-06-13 20:24:17 +0000707 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000708 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000709 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000710 try:
711 ip = socket.gethostbyname(hostname)
712 except socket.error:
713 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600714 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000715 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000716 try:
717 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
718 except socket.error:
719 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600720 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000721 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000722 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000723 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000724 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000725
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000726 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
727 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
728 def test_sethostname(self):
729 oldhn = socket.gethostname()
730 try:
731 socket.sethostname('new')
732 except socket.error as e:
733 if e.errno == errno.EPERM:
734 self.skipTest("test should be run as root")
735 else:
736 raise
737 try:
738 # running test as root!
739 self.assertEqual(socket.gethostname(), 'new')
740 # Should work with bytes objects too
741 socket.sethostname(b'bar')
742 self.assertEqual(socket.gethostname(), 'bar')
743 finally:
744 socket.sethostname(oldhn)
745
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700746 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
747 'socket.if_nameindex() not available.')
748 def testInterfaceNameIndex(self):
749 interfaces = socket.if_nameindex()
750 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200751 self.assertIsInstance(index, int)
752 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700753 # interface indices are non-zero integers
754 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200755 _index = socket.if_nametoindex(name)
756 self.assertIsInstance(_index, int)
757 self.assertEqual(index, _index)
758 _name = socket.if_indextoname(index)
759 self.assertIsInstance(_name, str)
760 self.assertEqual(name, _name)
761
762 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
763 'socket.if_nameindex() not available.')
764 def testInvalidInterfaceNameIndex(self):
765 # test nonexistent interface index/name
766 self.assertRaises(socket.error, socket.if_indextoname, 0)
767 self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
768 # test with invalid values
769 self.assertRaises(TypeError, socket.if_nametoindex, 0)
770 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700771
Serhiy Storchaka79080682013-11-03 21:31:18 +0200772 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
773 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000774 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000775 # Testing reference count for getnameinfo
Serhiy Storchaka79080682013-11-03 21:31:18 +0200776 try:
777 # On some versions, this loses a reference
778 orig = sys.getrefcount(__name__)
779 socket.getnameinfo(__name__,0)
780 except TypeError:
781 if sys.getrefcount(__name__) != orig:
782 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000783
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000785 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000786 try:
787 # On some versions, this crashes the interpreter.
788 socket.getnameinfo(('x', 0, 0, 0), 0)
789 except socket.error:
790 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000791
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000792 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000793 # This just checks that htons etc. are their own inverse,
794 # when looking at the lower 16 or 32 bits.
795 sizes = {socket.htonl: 32, socket.ntohl: 32,
796 socket.htons: 16, socket.ntohs: 16}
797 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000798 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000799 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
800 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000801
Guido van Rossuma2627af2002-09-14 00:58:46 +0000802 swapped = func(mask)
803 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000804 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000805
Guido van Rossum018919a2007-01-15 00:07:32 +0000806 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000807 good_values = [ 1, 2, 3, 1, 2, 3 ]
808 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000809 for k in good_values:
810 socket.ntohl(k)
811 socket.ntohs(k)
812 socket.htonl(k)
813 socket.htons(k)
814 for k in bad_values:
815 self.assertRaises(OverflowError, socket.ntohl, k)
816 self.assertRaises(OverflowError, socket.ntohs, k)
817 self.assertRaises(OverflowError, socket.htonl, k)
818 self.assertRaises(OverflowError, socket.htons, k)
819
Barry Warsaw11b91a02004-06-28 00:50:43 +0000820 def testGetServBy(self):
821 eq = self.assertEqual
822 # Find one service that exists, then check all the related interfaces.
823 # I've ordered this by protocols that have both a tcp and udp
824 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200825 if (sys.platform.startswith(('freebsd', 'netbsd'))
826 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000827 # avoid the 'echo' service on this platform, as there is an
828 # assumption breaking non-standard port/protocol entry
829 services = ('daytime', 'qotd', 'domain')
830 else:
831 services = ('echo', 'daytime', 'domain')
832 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000833 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000834 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000835 break
836 except socket.error:
837 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000838 else:
839 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000840 # Try same call with optional protocol omitted
841 port2 = socket.getservbyname(service)
842 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400843 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000844 try:
845 udpport = socket.getservbyname(service, 'udp')
846 except socket.error:
847 udpport = None
848 else:
849 eq(udpport, port)
850 # Now make sure the lookup by port returns the same service name
851 eq(socket.getservbyport(port2), service)
852 eq(socket.getservbyport(port, 'tcp'), service)
853 if udpport is not None:
854 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000855 # Make sure getservbyport does not accept out of range ports.
856 self.assertRaises(OverflowError, socket.getservbyport, -1)
857 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000858
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000859 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000860 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000861 # The default timeout should initially be None
862 self.assertEqual(socket.getdefaulttimeout(), None)
863 s = socket.socket()
864 self.assertEqual(s.gettimeout(), None)
865 s.close()
866
867 # Set the default timeout to 10, and see if it propagates
868 socket.setdefaulttimeout(10)
869 self.assertEqual(socket.getdefaulttimeout(), 10)
870 s = socket.socket()
871 self.assertEqual(s.gettimeout(), 10)
872 s.close()
873
874 # Reset the default timeout to None, and see if it propagates
875 socket.setdefaulttimeout(None)
876 self.assertEqual(socket.getdefaulttimeout(), None)
877 s = socket.socket()
878 self.assertEqual(s.gettimeout(), None)
879 s.close()
880
881 # Check that setting it to an invalid value raises ValueError
882 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
883
884 # Check that setting it to an invalid type raises TypeError
885 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
886
Serhiy Storchaka79080682013-11-03 21:31:18 +0200887 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
888 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000889 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000890 # Test that issue1008086 and issue767150 are fixed.
891 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000892 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
893 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000894
Serhiy Storchaka79080682013-11-03 21:31:18 +0200895 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
896 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000897 def testIPv4toString(self):
898 from socket import inet_aton as f, inet_pton, AF_INET
899 g = lambda a: inet_pton(AF_INET, a)
900
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100901 assertInvalid = lambda func,a: self.assertRaises(
902 (socket.error, ValueError), func, a
903 )
904
Ezio Melottib3aedd42010-11-20 19:04:17 +0000905 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
906 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
907 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
908 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
909 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100910 assertInvalid(f, '0.0.0.')
911 assertInvalid(f, '300.0.0.0')
912 assertInvalid(f, 'a.0.0.0')
913 assertInvalid(f, '1.2.3.4.5')
914 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000915
Ezio Melottib3aedd42010-11-20 19:04:17 +0000916 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
917 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
918 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
919 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100920 assertInvalid(g, '0.0.0.')
921 assertInvalid(g, '300.0.0.0')
922 assertInvalid(g, 'a.0.0.0')
923 assertInvalid(g, '1.2.3.4.5')
924 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000925
Serhiy Storchaka79080682013-11-03 21:31:18 +0200926 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
927 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000928 def testIPv6toString(self):
929 try:
930 from socket import inet_pton, AF_INET6, has_ipv6
931 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600932 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000933 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600934 self.skipTest('could not import needed symbols from socket')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000935 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100936 assertInvalid = lambda a: self.assertRaises(
937 (socket.error, ValueError), f, a
938 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000939
Ezio Melottib3aedd42010-11-20 19:04:17 +0000940 self.assertEqual(b'\x00' * 16, f('::'))
941 self.assertEqual(b'\x00' * 16, f('0::0'))
942 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
943 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000944 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 +0000945 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
946 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100947 self.assertEqual(
948 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
949 f('ad42:abc::127:0:254:2')
950 )
951 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
952 assertInvalid('0x20::')
953 assertInvalid(':::')
954 assertInvalid('::0::')
955 assertInvalid('1::abc::')
956 assertInvalid('1::abc::def')
957 assertInvalid('1:2:3:4:5:6:')
958 assertInvalid('1:2:3:4:5:6')
959 assertInvalid('1:2:3:4:5:6:7:8:')
960 assertInvalid('1:2:3:4:5:6:7:8:0')
961
962 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
963 f('::254.42.23.64')
964 )
965 self.assertEqual(
966 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
967 f('42::a29b:254.42.23.64')
968 )
969 self.assertEqual(
970 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
971 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
972 )
973 assertInvalid('255.254.253.252')
974 assertInvalid('1::260.2.3.0')
975 assertInvalid('1::0.be.e.0')
976 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
977 assertInvalid('::1.2.3.4:0')
978 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +0000979
Serhiy Storchaka79080682013-11-03 21:31:18 +0200980 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
981 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000982 def testStringToIPv4(self):
983 from socket import inet_ntoa as f, inet_ntop, AF_INET
984 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100985 assertInvalid = lambda func,a: self.assertRaises(
986 (socket.error, ValueError), func, a
987 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000988
Ezio Melottib3aedd42010-11-20 19:04:17 +0000989 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
990 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
991 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
992 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100993 assertInvalid(f, b'\x00' * 3)
994 assertInvalid(f, b'\x00' * 5)
995 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +0000996
Ezio Melottib3aedd42010-11-20 19:04:17 +0000997 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
998 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
999 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001000 assertInvalid(g, b'\x00' * 3)
1001 assertInvalid(g, b'\x00' * 5)
1002 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001003
Serhiy Storchaka79080682013-11-03 21:31:18 +02001004 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1005 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001006 def testStringToIPv6(self):
1007 try:
1008 from socket import inet_ntop, AF_INET6, has_ipv6
1009 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001010 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001011 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001012 self.skipTest('could not import needed symbols from socket')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001013 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001014 assertInvalid = lambda a: self.assertRaises(
1015 (socket.error, ValueError), f, a
1016 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001017
Ezio Melottib3aedd42010-11-20 19:04:17 +00001018 self.assertEqual('::', f(b'\x00' * 16))
1019 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1020 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001021 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001022 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 +00001023 )
1024
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001025 assertInvalid(b'\x12' * 15)
1026 assertInvalid(b'\x12' * 17)
1027 assertInvalid(b'\x12' * 4)
1028
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001029 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001030
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001031 def testSockName(self):
1032 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001033 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001034 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001035 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001036 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001037 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001038 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1039 # it reasonable to get the host's addr in addition to 0.0.0.0.
1040 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001041 try:
1042 my_ip_addr = socket.gethostbyname(socket.gethostname())
1043 except socket.error:
1044 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001045 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001046 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001047 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001048
1049 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001050 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001051 # We know a socket should start without reuse==0
1052 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001053 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001054 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001055 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001056
1057 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001058 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001059 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001060 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001061 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1062 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001063 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001064
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001065 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001066 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001067 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1068 sock.settimeout(1)
1069 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +00001070 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001071
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001072 def testNewAttributes(self):
1073 # testing .family, .type and .protocol
1074 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1075 self.assertEqual(sock.family, socket.AF_INET)
1076 self.assertEqual(sock.type, socket.SOCK_STREAM)
1077 self.assertEqual(sock.proto, 0)
1078 sock.close()
1079
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001080 def test_getsockaddrarg(self):
1081 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001082 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001083 big_port = port + 65536
1084 neg_port = port - 65536
1085 sock = socket.socket()
1086 try:
1087 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1088 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1089 sock.bind((host, port))
1090 finally:
1091 sock.close()
1092
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001093 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001094 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001095 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1096 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1097 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1098 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001099 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1100 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001101 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001102 self.assertRaises(ValueError, s.ioctl, -1, None)
1103 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001104
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001105 def testGetaddrinfo(self):
1106 try:
1107 socket.getaddrinfo('localhost', 80)
1108 except socket.gaierror as err:
1109 if err.errno == socket.EAI_SERVICE:
1110 # see http://bugs.python.org/issue1282647
1111 self.skipTest("buggy libc version")
1112 raise
1113 # len of every sequence is supposed to be == 5
1114 for info in socket.getaddrinfo(HOST, None):
1115 self.assertEqual(len(info), 5)
1116 # host can be a domain name, a string representation of an
1117 # IPv4/v6 address or None
1118 socket.getaddrinfo('localhost', 80)
1119 socket.getaddrinfo('127.0.0.1', 80)
1120 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001121 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001122 socket.getaddrinfo('::1', 80)
1123 # port can be a string service name such as "http", a numeric
1124 # port number or None
1125 socket.getaddrinfo(HOST, "http")
1126 socket.getaddrinfo(HOST, 80)
1127 socket.getaddrinfo(HOST, None)
1128 # test family and socktype filters
1129 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
1130 for family, _, _, _, _ in infos:
1131 self.assertEqual(family, socket.AF_INET)
1132 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1133 for _, socktype, _, _, _ in infos:
1134 self.assertEqual(socktype, socket.SOCK_STREAM)
1135 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001136 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001137 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1138 # a server willing to support both IPv4 and IPv6 will
1139 # usually do this
1140 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1141 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001142 # test keyword arguments
1143 a = socket.getaddrinfo(HOST, None)
1144 b = socket.getaddrinfo(host=HOST, port=None)
1145 self.assertEqual(a, b)
1146 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1147 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1148 self.assertEqual(a, b)
1149 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1150 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1151 self.assertEqual(a, b)
1152 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1153 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1154 self.assertEqual(a, b)
1155 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1156 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1157 self.assertEqual(a, b)
1158 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1159 socket.AI_PASSIVE)
1160 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1161 type=socket.SOCK_STREAM, proto=0,
1162 flags=socket.AI_PASSIVE)
1163 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001164 # Issue #6697.
1165 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001166
Ned Deilyb24f4812014-02-13 22:50:42 -08001167 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001168 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001169 try:
1170 # The arguments here are undefined and the call may succeed
1171 # or fail. All we care here is that it doesn't segfault.
1172 socket.getaddrinfo("localhost", None, 0, 0, 0,
1173 socket.AI_NUMERICSERV)
1174 except socket.gaierror:
1175 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001176
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001177 def test_getnameinfo(self):
1178 # only IP addresses are allowed
1179 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
1180
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001181 @unittest.skipUnless(support.is_resource_enabled('network'),
1182 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001183 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001184 # Check for internet access before running test (issue #12804).
1185 try:
1186 socket.gethostbyname('python.org')
1187 except socket.gaierror as e:
1188 if e.errno == socket.EAI_NODATA:
1189 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001190 # these should all be successful
1191 socket.gethostbyname('испытание.python.org')
1192 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001193 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1194 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1195 # have a reverse entry yet
1196 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001197
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001198 def check_sendall_interrupted(self, with_timeout):
1199 # socketpair() is not stricly required, but it makes things easier.
1200 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1201 self.skipTest("signal.alarm and socket.socketpair required for this test")
1202 # Our signal handlers clobber the C errno by calling a math function
1203 # with an invalid domain value.
1204 def ok_handler(*args):
1205 self.assertRaises(ValueError, math.acosh, 0)
1206 def raising_handler(*args):
1207 self.assertRaises(ValueError, math.acosh, 0)
1208 1 // 0
1209 c, s = socket.socketpair()
1210 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1211 try:
1212 if with_timeout:
1213 # Just above the one second minimum for signal.alarm
1214 c.settimeout(1.5)
1215 with self.assertRaises(ZeroDivisionError):
1216 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001217 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001218 if with_timeout:
1219 signal.signal(signal.SIGALRM, ok_handler)
1220 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001221 self.assertRaises(socket.timeout, c.sendall,
1222 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001223 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001224 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001225 signal.signal(signal.SIGALRM, old_alarm)
1226 c.close()
1227 s.close()
1228
1229 def test_sendall_interrupted(self):
1230 self.check_sendall_interrupted(False)
1231
1232 def test_sendall_interrupted_with_timeout(self):
1233 self.check_sendall_interrupted(True)
1234
Antoine Pitroue033e062010-10-29 10:38:18 +00001235 def test_dealloc_warn(self):
1236 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1237 r = repr(sock)
1238 with self.assertWarns(ResourceWarning) as cm:
1239 sock = None
1240 support.gc_collect()
1241 self.assertIn(r, str(cm.warning.args[0]))
1242 # An open socket file object gets dereferenced after the socket
1243 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1244 f = sock.makefile('rb')
1245 r = repr(sock)
1246 sock = None
1247 support.gc_collect()
1248 with self.assertWarns(ResourceWarning):
1249 f = None
1250 support.gc_collect()
1251
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001252 def test_name_closed_socketio(self):
1253 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1254 fp = sock.makefile("rb")
1255 fp.close()
1256 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1257
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001258 def test_unusable_closed_socketio(self):
1259 with socket.socket() as sock:
1260 fp = sock.makefile("rb", buffering=0)
1261 self.assertTrue(fp.readable())
1262 self.assertFalse(fp.writable())
1263 self.assertFalse(fp.seekable())
1264 fp.close()
1265 self.assertRaises(ValueError, fp.readable)
1266 self.assertRaises(ValueError, fp.writable)
1267 self.assertRaises(ValueError, fp.seekable)
1268
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001269 def test_pickle(self):
1270 sock = socket.socket()
1271 with sock:
1272 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1273 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1274
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001275 def test_listen_backlog(self):
1276 for backlog in 0, -1:
1277 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1278 srv.bind((HOST, 0))
1279 srv.listen(backlog)
1280 srv.close()
1281
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001282 @support.cpython_only
1283 def test_listen_backlog_overflow(self):
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001284 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001285 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001286 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1287 srv.bind((HOST, 0))
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001288 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001289 srv.close()
1290
Charles-François Natali42663332012-01-02 15:57:30 +01001291 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001292 def test_flowinfo(self):
1293 self.assertRaises(OverflowError, socket.getnameinfo,
1294 ('::1',0, 0xffffffff), 0)
1295 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1296 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
1297
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001298
Charles-François Natali47413c12011-10-06 19:47:44 +02001299@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1300class BasicCANTest(unittest.TestCase):
1301
1302 def testCrucialConstants(self):
1303 socket.AF_CAN
1304 socket.PF_CAN
1305 socket.CAN_RAW
1306
1307 def testCreateSocket(self):
1308 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1309 pass
1310
1311 def testBindAny(self):
1312 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1313 s.bind(('', ))
1314
1315 def testTooLongInterfaceName(self):
1316 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1317 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001318 self.assertRaisesRegex(socket.error, 'interface name too long',
1319 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001320
1321 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1322 'socket.CAN_RAW_LOOPBACK required for this test.')
1323 def testLoopback(self):
1324 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1325 for loopback in (0, 1):
1326 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1327 loopback)
1328 self.assertEqual(loopback,
1329 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1330
1331 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1332 'socket.CAN_RAW_FILTER required for this test.')
1333 def testFilter(self):
1334 can_id, can_mask = 0x200, 0x700
1335 can_filter = struct.pack("=II", can_id, can_mask)
1336 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1337 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1338 self.assertEqual(can_filter,
1339 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1340
1341
1342@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1343@unittest.skipUnless(thread, 'Threading required for this test.')
1344class CANTest(ThreadedCANSocketTest):
1345
1346 """The CAN frame structure is defined in <linux/can.h>:
1347
1348 struct can_frame {
1349 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1350 __u8 can_dlc; /* data length code: 0 .. 8 */
1351 __u8 data[8] __attribute__((aligned(8)));
1352 };
1353 """
1354 can_frame_fmt = "=IB3x8s"
1355
1356 def __init__(self, methodName='runTest'):
1357 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1358
1359 @classmethod
1360 def build_can_frame(cls, can_id, data):
1361 """Build a CAN frame."""
1362 can_dlc = len(data)
1363 data = data.ljust(8, b'\x00')
1364 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1365
1366 @classmethod
1367 def dissect_can_frame(cls, frame):
1368 """Dissect a CAN frame."""
1369 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1370 return (can_id, can_dlc, data[:can_dlc])
1371
1372 def testSendFrame(self):
1373 cf, addr = self.s.recvfrom(self.bufsize)
1374 self.assertEqual(self.cf, cf)
1375 self.assertEqual(addr[0], self.interface)
1376 self.assertEqual(addr[1], socket.AF_CAN)
1377
1378 def _testSendFrame(self):
1379 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1380 self.cli.send(self.cf)
1381
1382 def testSendMaxFrame(self):
1383 cf, addr = self.s.recvfrom(self.bufsize)
1384 self.assertEqual(self.cf, cf)
1385
1386 def _testSendMaxFrame(self):
1387 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1388 self.cli.send(self.cf)
1389
1390 def testSendMultiFrames(self):
1391 cf, addr = self.s.recvfrom(self.bufsize)
1392 self.assertEqual(self.cf1, cf)
1393
1394 cf, addr = self.s.recvfrom(self.bufsize)
1395 self.assertEqual(self.cf2, cf)
1396
1397 def _testSendMultiFrames(self):
1398 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1399 self.cli.send(self.cf1)
1400
1401 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1402 self.cli.send(self.cf2)
1403
1404
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001405@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1406class BasicRDSTest(unittest.TestCase):
1407
1408 def testCrucialConstants(self):
1409 socket.AF_RDS
1410 socket.PF_RDS
1411
1412 def testCreateSocket(self):
1413 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1414 pass
1415
1416 def testSocketBufferSize(self):
1417 bufsize = 16384
1418 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1419 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1420 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1421
1422
1423@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1424@unittest.skipUnless(thread, 'Threading required for this test.')
1425class RDSTest(ThreadedRDSSocketTest):
1426
1427 def __init__(self, methodName='runTest'):
1428 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1429
Charles-François Natali240c55f2011-11-10 20:33:36 +01001430 def setUp(self):
1431 super().setUp()
1432 self.evt = threading.Event()
1433
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001434 def testSendAndRecv(self):
1435 data, addr = self.serv.recvfrom(self.bufsize)
1436 self.assertEqual(self.data, data)
1437 self.assertEqual(self.cli_addr, addr)
1438
1439 def _testSendAndRecv(self):
1440 self.data = b'spam'
1441 self.cli.sendto(self.data, 0, (HOST, self.port))
1442
1443 def testPeek(self):
1444 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1445 self.assertEqual(self.data, data)
1446 data, addr = self.serv.recvfrom(self.bufsize)
1447 self.assertEqual(self.data, data)
1448
1449 def _testPeek(self):
1450 self.data = b'spam'
1451 self.cli.sendto(self.data, 0, (HOST, self.port))
1452
1453 @requireAttrs(socket.socket, 'recvmsg')
1454 def testSendAndRecvMsg(self):
1455 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1456 self.assertEqual(self.data, data)
1457
1458 @requireAttrs(socket.socket, 'sendmsg')
1459 def _testSendAndRecvMsg(self):
1460 self.data = b'hello ' * 10
1461 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1462
1463 def testSendAndRecvMulti(self):
1464 data, addr = self.serv.recvfrom(self.bufsize)
1465 self.assertEqual(self.data1, data)
1466
1467 data, addr = self.serv.recvfrom(self.bufsize)
1468 self.assertEqual(self.data2, data)
1469
1470 def _testSendAndRecvMulti(self):
1471 self.data1 = b'bacon'
1472 self.cli.sendto(self.data1, 0, (HOST, self.port))
1473
1474 self.data2 = b'egg'
1475 self.cli.sendto(self.data2, 0, (HOST, self.port))
1476
1477 def testSelect(self):
1478 r, w, x = select.select([self.serv], [], [], 3.0)
1479 self.assertIn(self.serv, r)
1480 data, addr = self.serv.recvfrom(self.bufsize)
1481 self.assertEqual(self.data, data)
1482
1483 def _testSelect(self):
1484 self.data = b'select'
1485 self.cli.sendto(self.data, 0, (HOST, self.port))
1486
1487 def testCongestion(self):
1488 # wait until the sender is done
1489 self.evt.wait()
1490
1491 def _testCongestion(self):
1492 # test the behavior in case of congestion
1493 self.data = b'fill'
1494 self.cli.setblocking(False)
1495 try:
1496 # try to lower the receiver's socket buffer size
1497 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1498 except OSError:
1499 pass
1500 with self.assertRaises(OSError) as cm:
1501 try:
1502 # fill the receiver's socket buffer
1503 while True:
1504 self.cli.sendto(self.data, 0, (HOST, self.port))
1505 finally:
1506 # signal the receiver we're done
1507 self.evt.set()
1508 # sendto() should have failed with ENOBUFS
1509 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1510 # and we should have received a congestion notification through poll
1511 r, w, x = select.select([self.serv], [], [], 3.0)
1512 self.assertIn(self.serv, r)
1513
1514
Victor Stinner45df8202010-04-28 22:31:17 +00001515@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001516class BasicTCPTest(SocketConnectedTest):
1517
1518 def __init__(self, methodName='runTest'):
1519 SocketConnectedTest.__init__(self, methodName=methodName)
1520
1521 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001522 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001523 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001524 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001525
1526 def _testRecv(self):
1527 self.serv_conn.send(MSG)
1528
1529 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001530 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001531 seg1 = self.cli_conn.recv(len(MSG) - 3)
1532 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001533 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001534 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001535
1536 def _testOverFlowRecv(self):
1537 self.serv_conn.send(MSG)
1538
1539 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001540 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001541 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001542 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001543
1544 def _testRecvFrom(self):
1545 self.serv_conn.send(MSG)
1546
1547 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001548 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001549 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1550 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001551 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001552 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001553
1554 def _testOverFlowRecvFrom(self):
1555 self.serv_conn.send(MSG)
1556
1557 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001558 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001559 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001560 while 1:
1561 read = self.cli_conn.recv(1024)
1562 if not read:
1563 break
Guido van Rossume531e292002-08-08 20:28:34 +00001564 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001565 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001566
1567 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001568 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001569 self.serv_conn.sendall(big_chunk)
1570
1571 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001572 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001573 fd = self.cli_conn.fileno()
1574 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001575 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001576 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001577 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001578 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001579
1580 def _testFromFd(self):
1581 self.serv_conn.send(MSG)
1582
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001583 def testDup(self):
1584 # Testing dup()
1585 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001586 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001587 msg = sock.recv(1024)
1588 self.assertEqual(msg, MSG)
1589
1590 def _testDup(self):
1591 self.serv_conn.send(MSG)
1592
Guido van Rossum24e4af82002-06-12 19:18:08 +00001593 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001594 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001595 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001596 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001597 # wait for _testShutdown to finish: on OS X, when the server
1598 # closes the connection the client also becomes disconnected,
1599 # and the client's shutdown call will fail. (Issue #4397.)
1600 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001601
1602 def _testShutdown(self):
1603 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001604 self.serv_conn.shutdown(2)
1605
1606 testShutdown_overflow = support.cpython_only(testShutdown)
1607
1608 @support.cpython_only
1609 def _testShutdown_overflow(self):
1610 import _testcapi
1611 self.serv_conn.send(MSG)
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001612 # Issue 15989
1613 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1614 _testcapi.INT_MAX + 1)
1615 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1616 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001617 self.serv_conn.shutdown(2)
1618
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001619 def testDetach(self):
1620 # Testing detach()
1621 fileno = self.cli_conn.fileno()
1622 f = self.cli_conn.detach()
1623 self.assertEqual(f, fileno)
1624 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001625 self.assertTrue(self.cli_conn._closed)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001626 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1627 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001628 # ...but we can create another socket using the (still open)
1629 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001630 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001631 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001632 msg = sock.recv(1024)
1633 self.assertEqual(msg, MSG)
1634
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001635 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001636 self.serv_conn.send(MSG)
1637
Victor Stinner45df8202010-04-28 22:31:17 +00001638@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001639class BasicUDPTest(ThreadedUDPSocketTest):
1640
1641 def __init__(self, methodName='runTest'):
1642 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1643
1644 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001645 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001646 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001647 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001648
1649 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001650 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001651
Guido van Rossum1c938012002-06-12 21:17:20 +00001652 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001653 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001654 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001655 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001656
Guido van Rossum1c938012002-06-12 21:17:20 +00001657 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001658 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001659
Guido van Rossumd8faa362007-04-27 19:54:29 +00001660 def testRecvFromNegative(self):
1661 # Negative lengths passed to recvfrom should give ValueError.
1662 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1663
1664 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001665 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001666
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001667# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1668# same test code is used with different families and types of socket
1669# (e.g. stream, datagram), and tests using recvmsg() are repeated
1670# using recvmsg_into().
1671#
1672# The generic test classes such as SendmsgTests and
1673# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1674# supplied with sockets cli_sock and serv_sock representing the
1675# client's and the server's end of the connection respectively, and
1676# attributes cli_addr and serv_addr holding their (numeric where
1677# appropriate) addresses.
1678#
1679# The final concrete test classes combine these with subclasses of
1680# SocketTestBase which set up client and server sockets of a specific
1681# type, and with subclasses of SendrecvmsgBase such as
1682# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1683# sockets to cli_sock and serv_sock and override the methods and
1684# attributes of SendrecvmsgBase to fill in destination addresses if
1685# needed when sending, check for specific flags in msg_flags, etc.
1686#
1687# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1688# recvmsg_into().
1689
1690# XXX: like the other datagram (UDP) tests in this module, the code
1691# here assumes that datagram delivery on the local machine will be
1692# reliable.
1693
1694class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1695 # Base class for sendmsg()/recvmsg() tests.
1696
1697 # Time in seconds to wait before considering a test failed, or
1698 # None for no timeout. Not all tests actually set a timeout.
1699 fail_timeout = 3.0
1700
1701 def setUp(self):
1702 self.misc_event = threading.Event()
1703 super().setUp()
1704
1705 def sendToServer(self, msg):
1706 # Send msg to the server.
1707 return self.cli_sock.send(msg)
1708
1709 # Tuple of alternative default arguments for sendmsg() when called
1710 # via sendmsgToServer() (e.g. to include a destination address).
1711 sendmsg_to_server_defaults = ()
1712
1713 def sendmsgToServer(self, *args):
1714 # Call sendmsg() on self.cli_sock with the given arguments,
1715 # filling in any arguments which are not supplied with the
1716 # corresponding items of self.sendmsg_to_server_defaults, if
1717 # any.
1718 return self.cli_sock.sendmsg(
1719 *(args + self.sendmsg_to_server_defaults[len(args):]))
1720
1721 def doRecvmsg(self, sock, bufsize, *args):
1722 # Call recvmsg() on sock with given arguments and return its
1723 # result. Should be used for tests which can use either
1724 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1725 # this method with one which emulates it using recvmsg_into(),
1726 # thus allowing the same test to be used for both methods.
1727 result = sock.recvmsg(bufsize, *args)
1728 self.registerRecvmsgResult(result)
1729 return result
1730
1731 def registerRecvmsgResult(self, result):
1732 # Called by doRecvmsg() with the return value of recvmsg() or
1733 # recvmsg_into(). Can be overridden to arrange cleanup based
1734 # on the returned ancillary data, for instance.
1735 pass
1736
1737 def checkRecvmsgAddress(self, addr1, addr2):
1738 # Called to compare the received address with the address of
1739 # the peer.
1740 self.assertEqual(addr1, addr2)
1741
1742 # Flags that are normally unset in msg_flags
1743 msg_flags_common_unset = 0
1744 for name in ("MSG_CTRUNC", "MSG_OOB"):
1745 msg_flags_common_unset |= getattr(socket, name, 0)
1746
1747 # Flags that are normally set
1748 msg_flags_common_set = 0
1749
1750 # Flags set when a complete record has been received (e.g. MSG_EOR
1751 # for SCTP)
1752 msg_flags_eor_indicator = 0
1753
1754 # Flags set when a complete record has not been received
1755 # (e.g. MSG_TRUNC for datagram sockets)
1756 msg_flags_non_eor_indicator = 0
1757
1758 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1759 # Method to check the value of msg_flags returned by recvmsg[_into]().
1760 #
1761 # Checks that all bits in msg_flags_common_set attribute are
1762 # set in "flags" and all bits in msg_flags_common_unset are
1763 # unset.
1764 #
1765 # The "eor" argument specifies whether the flags should
1766 # indicate that a full record (or datagram) has been received.
1767 # If "eor" is None, no checks are done; otherwise, checks
1768 # that:
1769 #
1770 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1771 # set and all bits in msg_flags_non_eor_indicator are unset
1772 #
1773 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1774 # are set and all bits in msg_flags_eor_indicator are unset
1775 #
1776 # If "checkset" and/or "checkunset" are supplied, they require
1777 # the given bits to be set or unset respectively, overriding
1778 # what the attributes require for those bits.
1779 #
1780 # If any bits are set in "ignore", they will not be checked,
1781 # regardless of the other inputs.
1782 #
1783 # Will raise Exception if the inputs require a bit to be both
1784 # set and unset, and it is not ignored.
1785
1786 defaultset = self.msg_flags_common_set
1787 defaultunset = self.msg_flags_common_unset
1788
1789 if eor:
1790 defaultset |= self.msg_flags_eor_indicator
1791 defaultunset |= self.msg_flags_non_eor_indicator
1792 elif eor is not None:
1793 defaultset |= self.msg_flags_non_eor_indicator
1794 defaultunset |= self.msg_flags_eor_indicator
1795
1796 # Function arguments override defaults
1797 defaultset &= ~checkunset
1798 defaultunset &= ~checkset
1799
1800 # Merge arguments with remaining defaults, and check for conflicts
1801 checkset |= defaultset
1802 checkunset |= defaultunset
1803 inboth = checkset & checkunset & ~ignore
1804 if inboth:
1805 raise Exception("contradictory set, unset requirements for flags "
1806 "{0:#x}".format(inboth))
1807
1808 # Compare with given msg_flags value
1809 mask = (checkset | checkunset) & ~ignore
1810 self.assertEqual(flags & mask, checkset & mask)
1811
1812
1813class RecvmsgIntoMixin(SendrecvmsgBase):
1814 # Mixin to implement doRecvmsg() using recvmsg_into().
1815
1816 def doRecvmsg(self, sock, bufsize, *args):
1817 buf = bytearray(bufsize)
1818 result = sock.recvmsg_into([buf], *args)
1819 self.registerRecvmsgResult(result)
1820 self.assertGreaterEqual(result[0], 0)
1821 self.assertLessEqual(result[0], bufsize)
1822 return (bytes(buf[:result[0]]),) + result[1:]
1823
1824
1825class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1826 # Defines flags to be checked in msg_flags for datagram sockets.
1827
1828 @property
1829 def msg_flags_non_eor_indicator(self):
1830 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1831
1832
1833class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1834 # Defines flags to be checked in msg_flags for SCTP sockets.
1835
1836 @property
1837 def msg_flags_eor_indicator(self):
1838 return super().msg_flags_eor_indicator | socket.MSG_EOR
1839
1840
1841class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1842 # Base class for tests on connectionless-mode sockets. Users must
1843 # supply sockets on attributes cli and serv to be mapped to
1844 # cli_sock and serv_sock respectively.
1845
1846 @property
1847 def serv_sock(self):
1848 return self.serv
1849
1850 @property
1851 def cli_sock(self):
1852 return self.cli
1853
1854 @property
1855 def sendmsg_to_server_defaults(self):
1856 return ([], [], 0, self.serv_addr)
1857
1858 def sendToServer(self, msg):
1859 return self.cli_sock.sendto(msg, self.serv_addr)
1860
1861
1862class SendrecvmsgConnectedBase(SendrecvmsgBase):
1863 # Base class for tests on connected sockets. Users must supply
1864 # sockets on attributes serv_conn and cli_conn (representing the
1865 # connections *to* the server and the client), to be mapped to
1866 # cli_sock and serv_sock respectively.
1867
1868 @property
1869 def serv_sock(self):
1870 return self.cli_conn
1871
1872 @property
1873 def cli_sock(self):
1874 return self.serv_conn
1875
1876 def checkRecvmsgAddress(self, addr1, addr2):
1877 # Address is currently "unspecified" for a connected socket,
1878 # so we don't examine it
1879 pass
1880
1881
1882class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1883 # Base class to set a timeout on server's socket.
1884
1885 def setUp(self):
1886 super().setUp()
1887 self.serv_sock.settimeout(self.fail_timeout)
1888
1889
1890class SendmsgTests(SendrecvmsgServerTimeoutBase):
1891 # Tests for sendmsg() which can use any socket type and do not
1892 # involve recvmsg() or recvmsg_into().
1893
1894 def testSendmsg(self):
1895 # Send a simple message with sendmsg().
1896 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1897
1898 def _testSendmsg(self):
1899 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1900
1901 def testSendmsgDataGenerator(self):
1902 # Send from buffer obtained from a generator (not a sequence).
1903 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1904
1905 def _testSendmsgDataGenerator(self):
1906 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1907 len(MSG))
1908
1909 def testSendmsgAncillaryGenerator(self):
1910 # Gather (empty) ancillary data from a generator.
1911 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1912
1913 def _testSendmsgAncillaryGenerator(self):
1914 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1915 len(MSG))
1916
1917 def testSendmsgArray(self):
1918 # Send data from an array instead of the usual bytes object.
1919 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1920
1921 def _testSendmsgArray(self):
1922 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1923 len(MSG))
1924
1925 def testSendmsgGather(self):
1926 # Send message data from more than one buffer (gather write).
1927 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1928
1929 def _testSendmsgGather(self):
1930 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1931
1932 def testSendmsgBadArgs(self):
1933 # Check that sendmsg() rejects invalid arguments.
1934 self.assertEqual(self.serv_sock.recv(1000), b"done")
1935
1936 def _testSendmsgBadArgs(self):
1937 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1938 self.assertRaises(TypeError, self.sendmsgToServer,
1939 b"not in an iterable")
1940 self.assertRaises(TypeError, self.sendmsgToServer,
1941 object())
1942 self.assertRaises(TypeError, self.sendmsgToServer,
1943 [object()])
1944 self.assertRaises(TypeError, self.sendmsgToServer,
1945 [MSG, object()])
1946 self.assertRaises(TypeError, self.sendmsgToServer,
1947 [MSG], object())
1948 self.assertRaises(TypeError, self.sendmsgToServer,
1949 [MSG], [], object())
1950 self.assertRaises(TypeError, self.sendmsgToServer,
1951 [MSG], [], 0, object())
1952 self.sendToServer(b"done")
1953
1954 def testSendmsgBadCmsg(self):
1955 # Check that invalid ancillary data items are rejected.
1956 self.assertEqual(self.serv_sock.recv(1000), b"done")
1957
1958 def _testSendmsgBadCmsg(self):
1959 self.assertRaises(TypeError, self.sendmsgToServer,
1960 [MSG], [object()])
1961 self.assertRaises(TypeError, self.sendmsgToServer,
1962 [MSG], [(object(), 0, b"data")])
1963 self.assertRaises(TypeError, self.sendmsgToServer,
1964 [MSG], [(0, object(), b"data")])
1965 self.assertRaises(TypeError, self.sendmsgToServer,
1966 [MSG], [(0, 0, object())])
1967 self.assertRaises(TypeError, self.sendmsgToServer,
1968 [MSG], [(0, 0)])
1969 self.assertRaises(TypeError, self.sendmsgToServer,
1970 [MSG], [(0, 0, b"data", 42)])
1971 self.sendToServer(b"done")
1972
1973 @requireAttrs(socket, "CMSG_SPACE")
1974 def testSendmsgBadMultiCmsg(self):
1975 # Check that invalid ancillary data items are rejected when
1976 # more than one item is present.
1977 self.assertEqual(self.serv_sock.recv(1000), b"done")
1978
1979 @testSendmsgBadMultiCmsg.client_skip
1980 def _testSendmsgBadMultiCmsg(self):
1981 self.assertRaises(TypeError, self.sendmsgToServer,
1982 [MSG], [0, 0, b""])
1983 self.assertRaises(TypeError, self.sendmsgToServer,
1984 [MSG], [(0, 0, b""), object()])
1985 self.sendToServer(b"done")
1986
1987 def testSendmsgExcessCmsgReject(self):
1988 # Check that sendmsg() rejects excess ancillary data items
1989 # when the number that can be sent is limited.
1990 self.assertEqual(self.serv_sock.recv(1000), b"done")
1991
1992 def _testSendmsgExcessCmsgReject(self):
1993 if not hasattr(socket, "CMSG_SPACE"):
1994 # Can only send one item
1995 with self.assertRaises(socket.error) as cm:
1996 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1997 self.assertIsNone(cm.exception.errno)
1998 self.sendToServer(b"done")
1999
2000 def testSendmsgAfterClose(self):
2001 # Check that sendmsg() fails on a closed socket.
2002 pass
2003
2004 def _testSendmsgAfterClose(self):
2005 self.cli_sock.close()
2006 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
2007
2008
2009class SendmsgStreamTests(SendmsgTests):
2010 # Tests for sendmsg() which require a stream socket and do not
2011 # involve recvmsg() or recvmsg_into().
2012
2013 def testSendmsgExplicitNoneAddr(self):
2014 # Check that peer address can be specified as None.
2015 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2016
2017 def _testSendmsgExplicitNoneAddr(self):
2018 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2019
2020 def testSendmsgTimeout(self):
2021 # Check that timeout works with sendmsg().
2022 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2023 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2024
2025 def _testSendmsgTimeout(self):
2026 try:
2027 self.cli_sock.settimeout(0.03)
2028 with self.assertRaises(socket.timeout):
2029 while True:
2030 self.sendmsgToServer([b"a"*512])
2031 finally:
2032 self.misc_event.set()
2033
2034 # XXX: would be nice to have more tests for sendmsg flags argument.
2035
2036 # Linux supports MSG_DONTWAIT when sending, but in general, it
2037 # only works when receiving. Could add other platforms if they
2038 # support it too.
2039 @skipWithClientIf(sys.platform not in {"linux2"},
2040 "MSG_DONTWAIT not known to work on this platform when "
2041 "sending")
2042 def testSendmsgDontWait(self):
2043 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2044 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2045 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2046
2047 @testSendmsgDontWait.client_skip
2048 def _testSendmsgDontWait(self):
2049 try:
2050 with self.assertRaises(socket.error) as cm:
2051 while True:
2052 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2053 self.assertIn(cm.exception.errno,
2054 (errno.EAGAIN, errno.EWOULDBLOCK))
2055 finally:
2056 self.misc_event.set()
2057
2058
2059class SendmsgConnectionlessTests(SendmsgTests):
2060 # Tests for sendmsg() which require a connectionless-mode
2061 # (e.g. datagram) socket, and do not involve recvmsg() or
2062 # recvmsg_into().
2063
2064 def testSendmsgNoDestAddr(self):
2065 # Check that sendmsg() fails when no destination address is
2066 # given for unconnected socket.
2067 pass
2068
2069 def _testSendmsgNoDestAddr(self):
2070 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2071 [MSG])
2072 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2073 [MSG], [], 0, None)
2074
2075
2076class RecvmsgGenericTests(SendrecvmsgBase):
2077 # Tests for recvmsg() which can also be emulated using
2078 # recvmsg_into(), and can use any socket type.
2079
2080 def testRecvmsg(self):
2081 # Receive a simple message with recvmsg[_into]().
2082 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2083 self.assertEqual(msg, MSG)
2084 self.checkRecvmsgAddress(addr, self.cli_addr)
2085 self.assertEqual(ancdata, [])
2086 self.checkFlags(flags, eor=True)
2087
2088 def _testRecvmsg(self):
2089 self.sendToServer(MSG)
2090
2091 def testRecvmsgExplicitDefaults(self):
2092 # Test recvmsg[_into]() with default arguments provided explicitly.
2093 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2094 len(MSG), 0, 0)
2095 self.assertEqual(msg, MSG)
2096 self.checkRecvmsgAddress(addr, self.cli_addr)
2097 self.assertEqual(ancdata, [])
2098 self.checkFlags(flags, eor=True)
2099
2100 def _testRecvmsgExplicitDefaults(self):
2101 self.sendToServer(MSG)
2102
2103 def testRecvmsgShorter(self):
2104 # Receive a message smaller than buffer.
2105 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2106 len(MSG) + 42)
2107 self.assertEqual(msg, MSG)
2108 self.checkRecvmsgAddress(addr, self.cli_addr)
2109 self.assertEqual(ancdata, [])
2110 self.checkFlags(flags, eor=True)
2111
2112 def _testRecvmsgShorter(self):
2113 self.sendToServer(MSG)
2114
Charles-François Natali8619cd72011-10-03 19:43:15 +02002115 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2116 # datagram is received (issue #13001).
2117 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002118 def testRecvmsgTrunc(self):
2119 # Receive part of message, check for truncation indicators.
2120 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2121 len(MSG) - 3)
2122 self.assertEqual(msg, MSG[:-3])
2123 self.checkRecvmsgAddress(addr, self.cli_addr)
2124 self.assertEqual(ancdata, [])
2125 self.checkFlags(flags, eor=False)
2126
Charles-François Natali8619cd72011-10-03 19:43:15 +02002127 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002128 def _testRecvmsgTrunc(self):
2129 self.sendToServer(MSG)
2130
2131 def testRecvmsgShortAncillaryBuf(self):
2132 # Test ancillary data buffer too small to hold any ancillary data.
2133 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2134 len(MSG), 1)
2135 self.assertEqual(msg, MSG)
2136 self.checkRecvmsgAddress(addr, self.cli_addr)
2137 self.assertEqual(ancdata, [])
2138 self.checkFlags(flags, eor=True)
2139
2140 def _testRecvmsgShortAncillaryBuf(self):
2141 self.sendToServer(MSG)
2142
2143 def testRecvmsgLongAncillaryBuf(self):
2144 # Test large ancillary data buffer.
2145 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2146 len(MSG), 10240)
2147 self.assertEqual(msg, MSG)
2148 self.checkRecvmsgAddress(addr, self.cli_addr)
2149 self.assertEqual(ancdata, [])
2150 self.checkFlags(flags, eor=True)
2151
2152 def _testRecvmsgLongAncillaryBuf(self):
2153 self.sendToServer(MSG)
2154
2155 def testRecvmsgAfterClose(self):
2156 # Check that recvmsg[_into]() fails on a closed socket.
2157 self.serv_sock.close()
2158 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2159
2160 def _testRecvmsgAfterClose(self):
2161 pass
2162
2163 def testRecvmsgTimeout(self):
2164 # Check that timeout works.
2165 try:
2166 self.serv_sock.settimeout(0.03)
2167 self.assertRaises(socket.timeout,
2168 self.doRecvmsg, self.serv_sock, len(MSG))
2169 finally:
2170 self.misc_event.set()
2171
2172 def _testRecvmsgTimeout(self):
2173 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2174
2175 @requireAttrs(socket, "MSG_PEEK")
2176 def testRecvmsgPeek(self):
2177 # Check that MSG_PEEK in flags enables examination of pending
2178 # data without consuming it.
2179
2180 # Receive part of data with MSG_PEEK.
2181 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2182 len(MSG) - 3, 0,
2183 socket.MSG_PEEK)
2184 self.assertEqual(msg, MSG[:-3])
2185 self.checkRecvmsgAddress(addr, self.cli_addr)
2186 self.assertEqual(ancdata, [])
2187 # Ignoring MSG_TRUNC here (so this test is the same for stream
2188 # and datagram sockets). Some wording in POSIX seems to
2189 # suggest that it needn't be set when peeking, but that may
2190 # just be a slip.
2191 self.checkFlags(flags, eor=False,
2192 ignore=getattr(socket, "MSG_TRUNC", 0))
2193
2194 # Receive all data with MSG_PEEK.
2195 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2196 len(MSG), 0,
2197 socket.MSG_PEEK)
2198 self.assertEqual(msg, MSG)
2199 self.checkRecvmsgAddress(addr, self.cli_addr)
2200 self.assertEqual(ancdata, [])
2201 self.checkFlags(flags, eor=True)
2202
2203 # Check that the same data can still be received normally.
2204 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2205 self.assertEqual(msg, MSG)
2206 self.checkRecvmsgAddress(addr, self.cli_addr)
2207 self.assertEqual(ancdata, [])
2208 self.checkFlags(flags, eor=True)
2209
2210 @testRecvmsgPeek.client_skip
2211 def _testRecvmsgPeek(self):
2212 self.sendToServer(MSG)
2213
2214 @requireAttrs(socket.socket, "sendmsg")
2215 def testRecvmsgFromSendmsg(self):
2216 # Test receiving with recvmsg[_into]() when message is sent
2217 # using sendmsg().
2218 self.serv_sock.settimeout(self.fail_timeout)
2219 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2220 self.assertEqual(msg, MSG)
2221 self.checkRecvmsgAddress(addr, self.cli_addr)
2222 self.assertEqual(ancdata, [])
2223 self.checkFlags(flags, eor=True)
2224
2225 @testRecvmsgFromSendmsg.client_skip
2226 def _testRecvmsgFromSendmsg(self):
2227 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2228
2229
2230class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2231 # Tests which require a stream socket and can use either recvmsg()
2232 # or recvmsg_into().
2233
2234 def testRecvmsgEOF(self):
2235 # Receive end-of-stream indicator (b"", peer socket closed).
2236 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2237 self.assertEqual(msg, b"")
2238 self.checkRecvmsgAddress(addr, self.cli_addr)
2239 self.assertEqual(ancdata, [])
2240 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2241
2242 def _testRecvmsgEOF(self):
2243 self.cli_sock.close()
2244
2245 def testRecvmsgOverflow(self):
2246 # Receive a message in more than one chunk.
2247 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2248 len(MSG) - 3)
2249 self.checkRecvmsgAddress(addr, self.cli_addr)
2250 self.assertEqual(ancdata, [])
2251 self.checkFlags(flags, eor=False)
2252
2253 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2254 self.checkRecvmsgAddress(addr, self.cli_addr)
2255 self.assertEqual(ancdata, [])
2256 self.checkFlags(flags, eor=True)
2257
2258 msg = seg1 + seg2
2259 self.assertEqual(msg, MSG)
2260
2261 def _testRecvmsgOverflow(self):
2262 self.sendToServer(MSG)
2263
2264
2265class RecvmsgTests(RecvmsgGenericTests):
2266 # Tests for recvmsg() which can use any socket type.
2267
2268 def testRecvmsgBadArgs(self):
2269 # Check that recvmsg() rejects invalid arguments.
2270 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2271 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2272 -1, 0, 0)
2273 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2274 len(MSG), -1, 0)
2275 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2276 [bytearray(10)], 0, 0)
2277 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2278 object(), 0, 0)
2279 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2280 len(MSG), object(), 0)
2281 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2282 len(MSG), 0, object())
2283
2284 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2285 self.assertEqual(msg, MSG)
2286 self.checkRecvmsgAddress(addr, self.cli_addr)
2287 self.assertEqual(ancdata, [])
2288 self.checkFlags(flags, eor=True)
2289
2290 def _testRecvmsgBadArgs(self):
2291 self.sendToServer(MSG)
2292
2293
2294class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2295 # Tests for recvmsg_into() which can use any socket type.
2296
2297 def testRecvmsgIntoBadArgs(self):
2298 # Check that recvmsg_into() rejects invalid arguments.
2299 buf = bytearray(len(MSG))
2300 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2301 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2302 len(MSG), 0, 0)
2303 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2304 buf, 0, 0)
2305 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2306 [object()], 0, 0)
2307 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2308 [b"I'm not writable"], 0, 0)
2309 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2310 [buf, object()], 0, 0)
2311 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2312 [buf], -1, 0)
2313 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2314 [buf], object(), 0)
2315 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2316 [buf], 0, object())
2317
2318 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2319 self.assertEqual(nbytes, len(MSG))
2320 self.assertEqual(buf, bytearray(MSG))
2321 self.checkRecvmsgAddress(addr, self.cli_addr)
2322 self.assertEqual(ancdata, [])
2323 self.checkFlags(flags, eor=True)
2324
2325 def _testRecvmsgIntoBadArgs(self):
2326 self.sendToServer(MSG)
2327
2328 def testRecvmsgIntoGenerator(self):
2329 # Receive into buffer obtained from a generator (not a sequence).
2330 buf = bytearray(len(MSG))
2331 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2332 (o for o in [buf]))
2333 self.assertEqual(nbytes, len(MSG))
2334 self.assertEqual(buf, bytearray(MSG))
2335 self.checkRecvmsgAddress(addr, self.cli_addr)
2336 self.assertEqual(ancdata, [])
2337 self.checkFlags(flags, eor=True)
2338
2339 def _testRecvmsgIntoGenerator(self):
2340 self.sendToServer(MSG)
2341
2342 def testRecvmsgIntoArray(self):
2343 # Receive into an array rather than the usual bytearray.
2344 buf = array.array("B", [0] * len(MSG))
2345 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2346 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002347 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002348 self.checkRecvmsgAddress(addr, self.cli_addr)
2349 self.assertEqual(ancdata, [])
2350 self.checkFlags(flags, eor=True)
2351
2352 def _testRecvmsgIntoArray(self):
2353 self.sendToServer(MSG)
2354
2355 def testRecvmsgIntoScatter(self):
2356 # Receive into multiple buffers (scatter write).
2357 b1 = bytearray(b"----")
2358 b2 = bytearray(b"0123456789")
2359 b3 = bytearray(b"--------------")
2360 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2361 [b1, memoryview(b2)[2:9], b3])
2362 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2363 self.assertEqual(b1, bytearray(b"Mary"))
2364 self.assertEqual(b2, bytearray(b"01 had a 9"))
2365 self.assertEqual(b3, bytearray(b"little lamb---"))
2366 self.checkRecvmsgAddress(addr, self.cli_addr)
2367 self.assertEqual(ancdata, [])
2368 self.checkFlags(flags, eor=True)
2369
2370 def _testRecvmsgIntoScatter(self):
2371 self.sendToServer(b"Mary had a little lamb")
2372
2373
2374class CmsgMacroTests(unittest.TestCase):
2375 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2376 # assumptions used by sendmsg() and recvmsg[_into](), which share
2377 # code with these functions.
2378
2379 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002380 try:
2381 import _testcapi
2382 except ImportError:
2383 socklen_t_limit = 0x7fffffff
2384 else:
2385 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002386
2387 @requireAttrs(socket, "CMSG_LEN")
2388 def testCMSG_LEN(self):
2389 # Test CMSG_LEN() with various valid and invalid values,
2390 # checking the assumptions used by recvmsg() and sendmsg().
2391 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2392 values = list(range(257)) + list(range(toobig - 257, toobig))
2393
2394 # struct cmsghdr has at least three members, two of which are ints
2395 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2396 for n in values:
2397 ret = socket.CMSG_LEN(n)
2398 # This is how recvmsg() calculates the data size
2399 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2400 self.assertLessEqual(ret, self.socklen_t_limit)
2401
2402 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2403 # sendmsg() shares code with these functions, and requires
2404 # that it reject values over the limit.
2405 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2406 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2407
2408 @requireAttrs(socket, "CMSG_SPACE")
2409 def testCMSG_SPACE(self):
2410 # Test CMSG_SPACE() with various valid and invalid values,
2411 # checking the assumptions used by sendmsg().
2412 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2413 values = list(range(257)) + list(range(toobig - 257, toobig))
2414
2415 last = socket.CMSG_SPACE(0)
2416 # struct cmsghdr has at least three members, two of which are ints
2417 self.assertGreater(last, array.array("i").itemsize * 2)
2418 for n in values:
2419 ret = socket.CMSG_SPACE(n)
2420 self.assertGreaterEqual(ret, last)
2421 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2422 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2423 self.assertLessEqual(ret, self.socklen_t_limit)
2424 last = ret
2425
2426 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2427 # sendmsg() shares code with these functions, and requires
2428 # that it reject values over the limit.
2429 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2430 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2431
2432
2433class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2434 # Tests for file descriptor passing on Unix-domain sockets.
2435
2436 # Invalid file descriptor value that's unlikely to evaluate to a
2437 # real FD even if one of its bytes is replaced with a different
2438 # value (which shouldn't actually happen).
2439 badfd = -0x5555
2440
2441 def newFDs(self, n):
2442 # Return a list of n file descriptors for newly-created files
2443 # containing their list indices as ASCII numbers.
2444 fds = []
2445 for i in range(n):
2446 fd, path = tempfile.mkstemp()
2447 self.addCleanup(os.unlink, path)
2448 self.addCleanup(os.close, fd)
2449 os.write(fd, str(i).encode())
2450 fds.append(fd)
2451 return fds
2452
2453 def checkFDs(self, fds):
2454 # Check that the file descriptors in the given list contain
2455 # their correct list indices as ASCII numbers.
2456 for n, fd in enumerate(fds):
2457 os.lseek(fd, 0, os.SEEK_SET)
2458 self.assertEqual(os.read(fd, 1024), str(n).encode())
2459
2460 def registerRecvmsgResult(self, result):
2461 self.addCleanup(self.closeRecvmsgFDs, result)
2462
2463 def closeRecvmsgFDs(self, recvmsg_result):
2464 # Close all file descriptors specified in the ancillary data
2465 # of the given return value from recvmsg() or recvmsg_into().
2466 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2467 if (cmsg_level == socket.SOL_SOCKET and
2468 cmsg_type == socket.SCM_RIGHTS):
2469 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002470 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002471 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2472 for fd in fds:
2473 os.close(fd)
2474
2475 def createAndSendFDs(self, n):
2476 # Send n new file descriptors created by newFDs() to the
2477 # server, with the constant MSG as the non-ancillary data.
2478 self.assertEqual(
2479 self.sendmsgToServer([MSG],
2480 [(socket.SOL_SOCKET,
2481 socket.SCM_RIGHTS,
2482 array.array("i", self.newFDs(n)))]),
2483 len(MSG))
2484
2485 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2486 # Check that constant MSG was received with numfds file
2487 # descriptors in a maximum of maxcmsgs control messages (which
2488 # must contain only complete integers). By default, check
2489 # that MSG_CTRUNC is unset, but ignore any flags in
2490 # ignoreflags.
2491 msg, ancdata, flags, addr = result
2492 self.assertEqual(msg, MSG)
2493 self.checkRecvmsgAddress(addr, self.cli_addr)
2494 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2495 ignore=ignoreflags)
2496
2497 self.assertIsInstance(ancdata, list)
2498 self.assertLessEqual(len(ancdata), maxcmsgs)
2499 fds = array.array("i")
2500 for item in ancdata:
2501 self.assertIsInstance(item, tuple)
2502 cmsg_level, cmsg_type, cmsg_data = item
2503 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2504 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2505 self.assertIsInstance(cmsg_data, bytes)
2506 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002507 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002508
2509 self.assertEqual(len(fds), numfds)
2510 self.checkFDs(fds)
2511
2512 def testFDPassSimple(self):
2513 # Pass a single FD (array read from bytes object).
2514 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2515 len(MSG), 10240))
2516
2517 def _testFDPassSimple(self):
2518 self.assertEqual(
2519 self.sendmsgToServer(
2520 [MSG],
2521 [(socket.SOL_SOCKET,
2522 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002523 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002524 len(MSG))
2525
2526 def testMultipleFDPass(self):
2527 # Pass multiple FDs in a single array.
2528 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2529 len(MSG), 10240))
2530
2531 def _testMultipleFDPass(self):
2532 self.createAndSendFDs(4)
2533
2534 @requireAttrs(socket, "CMSG_SPACE")
2535 def testFDPassCMSG_SPACE(self):
2536 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2537 self.checkRecvmsgFDs(
2538 4, self.doRecvmsg(self.serv_sock, len(MSG),
2539 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2540
2541 @testFDPassCMSG_SPACE.client_skip
2542 def _testFDPassCMSG_SPACE(self):
2543 self.createAndSendFDs(4)
2544
2545 def testFDPassCMSG_LEN(self):
2546 # Test using CMSG_LEN() to calculate ancillary buffer size.
2547 self.checkRecvmsgFDs(1,
2548 self.doRecvmsg(self.serv_sock, len(MSG),
2549 socket.CMSG_LEN(4 * SIZEOF_INT)),
2550 # RFC 3542 says implementations may set
2551 # MSG_CTRUNC if there isn't enough space
2552 # for trailing padding.
2553 ignoreflags=socket.MSG_CTRUNC)
2554
2555 def _testFDPassCMSG_LEN(self):
2556 self.createAndSendFDs(1)
2557
Charles-Francois Natalidd225e42013-05-20 19:08:19 +02002558 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002559 @requireAttrs(socket, "CMSG_SPACE")
2560 def testFDPassSeparate(self):
2561 # Pass two FDs in two separate arrays. Arrays may be combined
2562 # into a single control message by the OS.
2563 self.checkRecvmsgFDs(2,
2564 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2565 maxcmsgs=2)
2566
2567 @testFDPassSeparate.client_skip
Charles-Francois Natalidd225e42013-05-20 19:08:19 +02002568 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002569 def _testFDPassSeparate(self):
2570 fd0, fd1 = self.newFDs(2)
2571 self.assertEqual(
2572 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2573 socket.SCM_RIGHTS,
2574 array.array("i", [fd0])),
2575 (socket.SOL_SOCKET,
2576 socket.SCM_RIGHTS,
2577 array.array("i", [fd1]))]),
2578 len(MSG))
2579
Charles-Francois Natalidd225e42013-05-20 19:08:19 +02002580 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002581 @requireAttrs(socket, "CMSG_SPACE")
2582 def testFDPassSeparateMinSpace(self):
2583 # Pass two FDs in two separate arrays, receiving them into the
2584 # minimum space for two arrays.
2585 self.checkRecvmsgFDs(2,
2586 self.doRecvmsg(self.serv_sock, len(MSG),
2587 socket.CMSG_SPACE(SIZEOF_INT) +
2588 socket.CMSG_LEN(SIZEOF_INT)),
2589 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2590
2591 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalidd225e42013-05-20 19:08:19 +02002592 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002593 def _testFDPassSeparateMinSpace(self):
2594 fd0, fd1 = self.newFDs(2)
2595 self.assertEqual(
2596 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2597 socket.SCM_RIGHTS,
2598 array.array("i", [fd0])),
2599 (socket.SOL_SOCKET,
2600 socket.SCM_RIGHTS,
2601 array.array("i", [fd1]))]),
2602 len(MSG))
2603
2604 def sendAncillaryIfPossible(self, msg, ancdata):
2605 # Try to send msg and ancdata to server, but if the system
2606 # call fails, just send msg with no ancillary data.
2607 try:
2608 nbytes = self.sendmsgToServer([msg], ancdata)
2609 except socket.error as e:
2610 # Check that it was the system call that failed
2611 self.assertIsInstance(e.errno, int)
2612 nbytes = self.sendmsgToServer([msg])
2613 self.assertEqual(nbytes, len(msg))
2614
2615 def testFDPassEmpty(self):
2616 # Try to pass an empty FD array. Can receive either no array
2617 # or an empty array.
2618 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2619 len(MSG), 10240),
2620 ignoreflags=socket.MSG_CTRUNC)
2621
2622 def _testFDPassEmpty(self):
2623 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2624 socket.SCM_RIGHTS,
2625 b"")])
2626
2627 def testFDPassPartialInt(self):
2628 # Try to pass a truncated FD array.
2629 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2630 len(MSG), 10240)
2631 self.assertEqual(msg, MSG)
2632 self.checkRecvmsgAddress(addr, self.cli_addr)
2633 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2634 self.assertLessEqual(len(ancdata), 1)
2635 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2636 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2637 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2638 self.assertLess(len(cmsg_data), SIZEOF_INT)
2639
2640 def _testFDPassPartialInt(self):
2641 self.sendAncillaryIfPossible(
2642 MSG,
2643 [(socket.SOL_SOCKET,
2644 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002645 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002646
2647 @requireAttrs(socket, "CMSG_SPACE")
2648 def testFDPassPartialIntInMiddle(self):
2649 # Try to pass two FD arrays, the first of which is truncated.
2650 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2651 len(MSG), 10240)
2652 self.assertEqual(msg, MSG)
2653 self.checkRecvmsgAddress(addr, self.cli_addr)
2654 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2655 self.assertLessEqual(len(ancdata), 2)
2656 fds = array.array("i")
2657 # Arrays may have been combined in a single control message
2658 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2659 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2660 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002661 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002662 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2663 self.assertLessEqual(len(fds), 2)
2664 self.checkFDs(fds)
2665
2666 @testFDPassPartialIntInMiddle.client_skip
2667 def _testFDPassPartialIntInMiddle(self):
2668 fd0, fd1 = self.newFDs(2)
2669 self.sendAncillaryIfPossible(
2670 MSG,
2671 [(socket.SOL_SOCKET,
2672 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002673 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002674 (socket.SOL_SOCKET,
2675 socket.SCM_RIGHTS,
2676 array.array("i", [fd1]))])
2677
2678 def checkTruncatedHeader(self, result, ignoreflags=0):
2679 # Check that no ancillary data items are returned when data is
2680 # truncated inside the cmsghdr structure.
2681 msg, ancdata, flags, addr = result
2682 self.assertEqual(msg, MSG)
2683 self.checkRecvmsgAddress(addr, self.cli_addr)
2684 self.assertEqual(ancdata, [])
2685 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2686 ignore=ignoreflags)
2687
2688 def testCmsgTruncNoBufSize(self):
2689 # Check that no ancillary data is received when no buffer size
2690 # is specified.
2691 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2692 # BSD seems to set MSG_CTRUNC only
2693 # if an item has been partially
2694 # received.
2695 ignoreflags=socket.MSG_CTRUNC)
2696
2697 def _testCmsgTruncNoBufSize(self):
2698 self.createAndSendFDs(1)
2699
2700 def testCmsgTrunc0(self):
2701 # Check that no ancillary data is received when buffer size is 0.
2702 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2703 ignoreflags=socket.MSG_CTRUNC)
2704
2705 def _testCmsgTrunc0(self):
2706 self.createAndSendFDs(1)
2707
2708 # Check that no ancillary data is returned for various non-zero
2709 # (but still too small) buffer sizes.
2710
2711 def testCmsgTrunc1(self):
2712 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2713
2714 def _testCmsgTrunc1(self):
2715 self.createAndSendFDs(1)
2716
2717 def testCmsgTrunc2Int(self):
2718 # The cmsghdr structure has at least three members, two of
2719 # which are ints, so we still shouldn't see any ancillary
2720 # data.
2721 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2722 SIZEOF_INT * 2))
2723
2724 def _testCmsgTrunc2Int(self):
2725 self.createAndSendFDs(1)
2726
2727 def testCmsgTruncLen0Minus1(self):
2728 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2729 socket.CMSG_LEN(0) - 1))
2730
2731 def _testCmsgTruncLen0Minus1(self):
2732 self.createAndSendFDs(1)
2733
2734 # The following tests try to truncate the control message in the
2735 # middle of the FD array.
2736
2737 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2738 # Check that file descriptor data is truncated to between
2739 # mindata and maxdata bytes when received with buffer size
2740 # ancbuf, and that any complete file descriptor numbers are
2741 # valid.
2742 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2743 len(MSG), ancbuf)
2744 self.assertEqual(msg, MSG)
2745 self.checkRecvmsgAddress(addr, self.cli_addr)
2746 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2747
2748 if mindata == 0 and ancdata == []:
2749 return
2750 self.assertEqual(len(ancdata), 1)
2751 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2752 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2753 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2754 self.assertGreaterEqual(len(cmsg_data), mindata)
2755 self.assertLessEqual(len(cmsg_data), maxdata)
2756 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002757 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002758 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2759 self.checkFDs(fds)
2760
2761 def testCmsgTruncLen0(self):
2762 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2763
2764 def _testCmsgTruncLen0(self):
2765 self.createAndSendFDs(1)
2766
2767 def testCmsgTruncLen0Plus1(self):
2768 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2769
2770 def _testCmsgTruncLen0Plus1(self):
2771 self.createAndSendFDs(2)
2772
2773 def testCmsgTruncLen1(self):
2774 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2775 maxdata=SIZEOF_INT)
2776
2777 def _testCmsgTruncLen1(self):
2778 self.createAndSendFDs(2)
2779
2780 def testCmsgTruncLen2Minus1(self):
2781 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2782 maxdata=(2 * SIZEOF_INT) - 1)
2783
2784 def _testCmsgTruncLen2Minus1(self):
2785 self.createAndSendFDs(2)
2786
2787
2788class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2789 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2790 # features of the RFC 3542 Advanced Sockets API for IPv6.
2791 # Currently we can only handle certain data items (e.g. traffic
2792 # class, hop limit, MTU discovery and fragmentation settings)
2793 # without resorting to unportable means such as the struct module,
2794 # but the tests here are aimed at testing the ancillary data
2795 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2796 # itself.
2797
2798 # Test value to use when setting hop limit of packet
2799 hop_limit = 2
2800
2801 # Test value to use when setting traffic class of packet.
2802 # -1 means "use kernel default".
2803 traffic_class = -1
2804
2805 def ancillaryMapping(self, ancdata):
2806 # Given ancillary data list ancdata, return a mapping from
2807 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2808 # Check that no (level, type) pair appears more than once.
2809 d = {}
2810 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2811 self.assertNotIn((cmsg_level, cmsg_type), d)
2812 d[(cmsg_level, cmsg_type)] = cmsg_data
2813 return d
2814
2815 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2816 # Receive hop limit into ancbufsize bytes of ancillary data
2817 # space. Check that data is MSG, ancillary data is not
2818 # truncated (but ignore any flags in ignoreflags), and hop
2819 # limit is between 0 and maxhop inclusive.
2820 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2821 socket.IPV6_RECVHOPLIMIT, 1)
2822 self.misc_event.set()
2823 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2824 len(MSG), ancbufsize)
2825
2826 self.assertEqual(msg, MSG)
2827 self.checkRecvmsgAddress(addr, self.cli_addr)
2828 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2829 ignore=ignoreflags)
2830
2831 self.assertEqual(len(ancdata), 1)
2832 self.assertIsInstance(ancdata[0], tuple)
2833 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2834 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2835 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2836 self.assertIsInstance(cmsg_data, bytes)
2837 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2838 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002839 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002840 self.assertGreaterEqual(a[0], 0)
2841 self.assertLessEqual(a[0], maxhop)
2842
2843 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2844 def testRecvHopLimit(self):
2845 # Test receiving the packet hop limit as ancillary data.
2846 self.checkHopLimit(ancbufsize=10240)
2847
2848 @testRecvHopLimit.client_skip
2849 def _testRecvHopLimit(self):
2850 # Need to wait until server has asked to receive ancillary
2851 # data, as implementations are not required to buffer it
2852 # otherwise.
2853 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2854 self.sendToServer(MSG)
2855
2856 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2857 def testRecvHopLimitCMSG_SPACE(self):
2858 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2859 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2860
2861 @testRecvHopLimitCMSG_SPACE.client_skip
2862 def _testRecvHopLimitCMSG_SPACE(self):
2863 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2864 self.sendToServer(MSG)
2865
2866 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2867 # 3542 says portable applications must provide space for trailing
2868 # padding. Implementations may set MSG_CTRUNC if there isn't
2869 # enough space for the padding.
2870
2871 @requireAttrs(socket.socket, "sendmsg")
2872 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2873 def testSetHopLimit(self):
2874 # Test setting hop limit on outgoing packet and receiving it
2875 # at the other end.
2876 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2877
2878 @testSetHopLimit.client_skip
2879 def _testSetHopLimit(self):
2880 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2881 self.assertEqual(
2882 self.sendmsgToServer([MSG],
2883 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2884 array.array("i", [self.hop_limit]))]),
2885 len(MSG))
2886
2887 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2888 ignoreflags=0):
2889 # Receive traffic class and hop limit into ancbufsize bytes of
2890 # ancillary data space. Check that data is MSG, ancillary
2891 # data is not truncated (but ignore any flags in ignoreflags),
2892 # and traffic class and hop limit are in range (hop limit no
2893 # more than maxhop).
2894 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2895 socket.IPV6_RECVHOPLIMIT, 1)
2896 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2897 socket.IPV6_RECVTCLASS, 1)
2898 self.misc_event.set()
2899 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2900 len(MSG), ancbufsize)
2901
2902 self.assertEqual(msg, MSG)
2903 self.checkRecvmsgAddress(addr, self.cli_addr)
2904 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2905 ignore=ignoreflags)
2906 self.assertEqual(len(ancdata), 2)
2907 ancmap = self.ancillaryMapping(ancdata)
2908
2909 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2910 self.assertEqual(len(tcdata), SIZEOF_INT)
2911 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002912 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002913 self.assertGreaterEqual(a[0], 0)
2914 self.assertLessEqual(a[0], 255)
2915
2916 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2917 self.assertEqual(len(hldata), SIZEOF_INT)
2918 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002919 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002920 self.assertGreaterEqual(a[0], 0)
2921 self.assertLessEqual(a[0], maxhop)
2922
2923 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2924 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2925 def testRecvTrafficClassAndHopLimit(self):
2926 # Test receiving traffic class and hop limit as ancillary data.
2927 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2928
2929 @testRecvTrafficClassAndHopLimit.client_skip
2930 def _testRecvTrafficClassAndHopLimit(self):
2931 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2932 self.sendToServer(MSG)
2933
2934 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2935 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2936 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2937 # Test receiving traffic class and hop limit, using
2938 # CMSG_SPACE() to calculate buffer size.
2939 self.checkTrafficClassAndHopLimit(
2940 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2941
2942 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2943 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2944 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2945 self.sendToServer(MSG)
2946
2947 @requireAttrs(socket.socket, "sendmsg")
2948 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2949 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2950 def testSetTrafficClassAndHopLimit(self):
2951 # Test setting traffic class and hop limit on outgoing packet,
2952 # and receiving them at the other end.
2953 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2954 maxhop=self.hop_limit)
2955
2956 @testSetTrafficClassAndHopLimit.client_skip
2957 def _testSetTrafficClassAndHopLimit(self):
2958 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2959 self.assertEqual(
2960 self.sendmsgToServer([MSG],
2961 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2962 array.array("i", [self.traffic_class])),
2963 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2964 array.array("i", [self.hop_limit]))]),
2965 len(MSG))
2966
2967 @requireAttrs(socket.socket, "sendmsg")
2968 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2969 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2970 def testOddCmsgSize(self):
2971 # Try to send ancillary data with first item one byte too
2972 # long. Fall back to sending with correct size if this fails,
2973 # and check that second item was handled correctly.
2974 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2975 maxhop=self.hop_limit)
2976
2977 @testOddCmsgSize.client_skip
2978 def _testOddCmsgSize(self):
2979 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2980 try:
2981 nbytes = self.sendmsgToServer(
2982 [MSG],
2983 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002984 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002985 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2986 array.array("i", [self.hop_limit]))])
2987 except socket.error as e:
2988 self.assertIsInstance(e.errno, int)
2989 nbytes = self.sendmsgToServer(
2990 [MSG],
2991 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2992 array.array("i", [self.traffic_class])),
2993 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2994 array.array("i", [self.hop_limit]))])
2995 self.assertEqual(nbytes, len(MSG))
2996
2997 # Tests for proper handling of truncated ancillary data
2998
2999 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3000 # Receive hop limit into ancbufsize bytes of ancillary data
3001 # space, which should be too small to contain the ancillary
3002 # data header (if ancbufsize is None, pass no second argument
3003 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3004 # (unless included in ignoreflags), and no ancillary data is
3005 # returned.
3006 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3007 socket.IPV6_RECVHOPLIMIT, 1)
3008 self.misc_event.set()
3009 args = () if ancbufsize is None else (ancbufsize,)
3010 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3011 len(MSG), *args)
3012
3013 self.assertEqual(msg, MSG)
3014 self.checkRecvmsgAddress(addr, self.cli_addr)
3015 self.assertEqual(ancdata, [])
3016 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3017 ignore=ignoreflags)
3018
3019 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3020 def testCmsgTruncNoBufSize(self):
3021 # Check that no ancillary data is received when no ancillary
3022 # buffer size is provided.
3023 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3024 # BSD seems to set
3025 # MSG_CTRUNC only if an item
3026 # has been partially
3027 # received.
3028 ignoreflags=socket.MSG_CTRUNC)
3029
3030 @testCmsgTruncNoBufSize.client_skip
3031 def _testCmsgTruncNoBufSize(self):
3032 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3033 self.sendToServer(MSG)
3034
3035 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3036 def testSingleCmsgTrunc0(self):
3037 # Check that no ancillary data is received when ancillary
3038 # buffer size is zero.
3039 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3040 ignoreflags=socket.MSG_CTRUNC)
3041
3042 @testSingleCmsgTrunc0.client_skip
3043 def _testSingleCmsgTrunc0(self):
3044 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3045 self.sendToServer(MSG)
3046
3047 # Check that no ancillary data is returned for various non-zero
3048 # (but still too small) buffer sizes.
3049
3050 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3051 def testSingleCmsgTrunc1(self):
3052 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3053
3054 @testSingleCmsgTrunc1.client_skip
3055 def _testSingleCmsgTrunc1(self):
3056 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3057 self.sendToServer(MSG)
3058
3059 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3060 def testSingleCmsgTrunc2Int(self):
3061 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3062
3063 @testSingleCmsgTrunc2Int.client_skip
3064 def _testSingleCmsgTrunc2Int(self):
3065 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3066 self.sendToServer(MSG)
3067
3068 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3069 def testSingleCmsgTruncLen0Minus1(self):
3070 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3071
3072 @testSingleCmsgTruncLen0Minus1.client_skip
3073 def _testSingleCmsgTruncLen0Minus1(self):
3074 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3075 self.sendToServer(MSG)
3076
3077 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3078 def testSingleCmsgTruncInData(self):
3079 # Test truncation of a control message inside its associated
3080 # data. The message may be returned with its data truncated,
3081 # or not returned at all.
3082 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3083 socket.IPV6_RECVHOPLIMIT, 1)
3084 self.misc_event.set()
3085 msg, ancdata, flags, addr = self.doRecvmsg(
3086 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3087
3088 self.assertEqual(msg, MSG)
3089 self.checkRecvmsgAddress(addr, self.cli_addr)
3090 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3091
3092 self.assertLessEqual(len(ancdata), 1)
3093 if ancdata:
3094 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3095 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3096 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3097 self.assertLess(len(cmsg_data), SIZEOF_INT)
3098
3099 @testSingleCmsgTruncInData.client_skip
3100 def _testSingleCmsgTruncInData(self):
3101 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3102 self.sendToServer(MSG)
3103
3104 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3105 # Receive traffic class and hop limit into ancbufsize bytes of
3106 # ancillary data space, which should be large enough to
3107 # contain the first item, but too small to contain the header
3108 # of the second. Check that data is MSG, MSG_CTRUNC is set
3109 # (unless included in ignoreflags), and only one ancillary
3110 # data item is returned.
3111 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3112 socket.IPV6_RECVHOPLIMIT, 1)
3113 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3114 socket.IPV6_RECVTCLASS, 1)
3115 self.misc_event.set()
3116 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3117 len(MSG), ancbufsize)
3118
3119 self.assertEqual(msg, MSG)
3120 self.checkRecvmsgAddress(addr, self.cli_addr)
3121 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3122 ignore=ignoreflags)
3123
3124 self.assertEqual(len(ancdata), 1)
3125 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3126 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3127 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3128 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3129 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003130 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003131 self.assertGreaterEqual(a[0], 0)
3132 self.assertLessEqual(a[0], 255)
3133
3134 # Try the above test with various buffer sizes.
3135
3136 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3137 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3138 def testSecondCmsgTrunc0(self):
3139 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3140 ignoreflags=socket.MSG_CTRUNC)
3141
3142 @testSecondCmsgTrunc0.client_skip
3143 def _testSecondCmsgTrunc0(self):
3144 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3145 self.sendToServer(MSG)
3146
3147 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3148 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3149 def testSecondCmsgTrunc1(self):
3150 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3151
3152 @testSecondCmsgTrunc1.client_skip
3153 def _testSecondCmsgTrunc1(self):
3154 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3155 self.sendToServer(MSG)
3156
3157 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3158 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3159 def testSecondCmsgTrunc2Int(self):
3160 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3161 2 * SIZEOF_INT)
3162
3163 @testSecondCmsgTrunc2Int.client_skip
3164 def _testSecondCmsgTrunc2Int(self):
3165 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3166 self.sendToServer(MSG)
3167
3168 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3169 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3170 def testSecondCmsgTruncLen0Minus1(self):
3171 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3172 socket.CMSG_LEN(0) - 1)
3173
3174 @testSecondCmsgTruncLen0Minus1.client_skip
3175 def _testSecondCmsgTruncLen0Minus1(self):
3176 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3177 self.sendToServer(MSG)
3178
3179 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3180 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3181 def testSecomdCmsgTruncInData(self):
3182 # Test truncation of the second of two control messages inside
3183 # its associated data.
3184 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3185 socket.IPV6_RECVHOPLIMIT, 1)
3186 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3187 socket.IPV6_RECVTCLASS, 1)
3188 self.misc_event.set()
3189 msg, ancdata, flags, addr = self.doRecvmsg(
3190 self.serv_sock, len(MSG),
3191 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3192
3193 self.assertEqual(msg, MSG)
3194 self.checkRecvmsgAddress(addr, self.cli_addr)
3195 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3196
3197 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3198
3199 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3200 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3201 cmsg_types.remove(cmsg_type)
3202 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3203 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003204 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003205 self.assertGreaterEqual(a[0], 0)
3206 self.assertLessEqual(a[0], 255)
3207
3208 if ancdata:
3209 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3210 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3211 cmsg_types.remove(cmsg_type)
3212 self.assertLess(len(cmsg_data), SIZEOF_INT)
3213
3214 self.assertEqual(ancdata, [])
3215
3216 @testSecomdCmsgTruncInData.client_skip
3217 def _testSecomdCmsgTruncInData(self):
3218 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3219 self.sendToServer(MSG)
3220
3221
3222# Derive concrete test classes for different socket types.
3223
3224class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3225 SendrecvmsgConnectionlessBase,
3226 ThreadedSocketTestMixin, UDPTestBase):
3227 pass
3228
3229@requireAttrs(socket.socket, "sendmsg")
3230@unittest.skipUnless(thread, 'Threading required for this test.')
3231class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3232 pass
3233
3234@requireAttrs(socket.socket, "recvmsg")
3235@unittest.skipUnless(thread, 'Threading required for this test.')
3236class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3237 pass
3238
3239@requireAttrs(socket.socket, "recvmsg_into")
3240@unittest.skipUnless(thread, 'Threading required for this test.')
3241class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3242 pass
3243
3244
3245class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3246 SendrecvmsgConnectionlessBase,
3247 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003248
3249 def checkRecvmsgAddress(self, addr1, addr2):
3250 # Called to compare the received address with the address of
3251 # the peer, ignoring scope ID
3252 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003253
3254@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003255@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003256@requireSocket("AF_INET6", "SOCK_DGRAM")
3257@unittest.skipUnless(thread, 'Threading required for this test.')
3258class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3259 pass
3260
3261@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003262@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003263@requireSocket("AF_INET6", "SOCK_DGRAM")
3264@unittest.skipUnless(thread, 'Threading required for this test.')
3265class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3266 pass
3267
3268@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003269@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003270@requireSocket("AF_INET6", "SOCK_DGRAM")
3271@unittest.skipUnless(thread, 'Threading required for this test.')
3272class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3273 pass
3274
3275@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003276@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003277@requireAttrs(socket, "IPPROTO_IPV6")
3278@requireSocket("AF_INET6", "SOCK_DGRAM")
3279@unittest.skipUnless(thread, 'Threading required for this test.')
3280class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3281 SendrecvmsgUDP6TestBase):
3282 pass
3283
3284@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003285@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003286@requireAttrs(socket, "IPPROTO_IPV6")
3287@requireSocket("AF_INET6", "SOCK_DGRAM")
3288@unittest.skipUnless(thread, 'Threading required for this test.')
3289class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3290 RFC3542AncillaryTest,
3291 SendrecvmsgUDP6TestBase):
3292 pass
3293
3294
3295class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3296 ConnectedStreamTestMixin, TCPTestBase):
3297 pass
3298
3299@requireAttrs(socket.socket, "sendmsg")
3300@unittest.skipUnless(thread, 'Threading required for this test.')
3301class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3302 pass
3303
3304@requireAttrs(socket.socket, "recvmsg")
3305@unittest.skipUnless(thread, 'Threading required for this test.')
3306class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3307 SendrecvmsgTCPTestBase):
3308 pass
3309
3310@requireAttrs(socket.socket, "recvmsg_into")
3311@unittest.skipUnless(thread, 'Threading required for this test.')
3312class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3313 SendrecvmsgTCPTestBase):
3314 pass
3315
3316
3317class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3318 SendrecvmsgConnectedBase,
3319 ConnectedStreamTestMixin, SCTPStreamBase):
3320 pass
3321
3322@requireAttrs(socket.socket, "sendmsg")
3323@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3324@unittest.skipUnless(thread, 'Threading required for this test.')
3325class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3326 pass
3327
3328@requireAttrs(socket.socket, "recvmsg")
3329@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3330@unittest.skipUnless(thread, 'Threading required for this test.')
3331class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3332 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003333
3334 def testRecvmsgEOF(self):
3335 try:
3336 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3337 except OSError as e:
3338 if e.errno != errno.ENOTCONN:
3339 raise
3340 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003341
3342@requireAttrs(socket.socket, "recvmsg_into")
3343@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3344@unittest.skipUnless(thread, 'Threading required for this test.')
3345class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3346 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003347
3348 def testRecvmsgEOF(self):
3349 try:
3350 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3351 except OSError as e:
3352 if e.errno != errno.ENOTCONN:
3353 raise
3354 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003355
3356
3357class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3358 ConnectedStreamTestMixin, UnixStreamBase):
3359 pass
3360
3361@requireAttrs(socket.socket, "sendmsg")
3362@requireAttrs(socket, "AF_UNIX")
3363@unittest.skipUnless(thread, 'Threading required for this test.')
3364class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3365 pass
3366
3367@requireAttrs(socket.socket, "recvmsg")
3368@requireAttrs(socket, "AF_UNIX")
3369@unittest.skipUnless(thread, 'Threading required for this test.')
3370class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3371 SendrecvmsgUnixStreamTestBase):
3372 pass
3373
3374@requireAttrs(socket.socket, "recvmsg_into")
3375@requireAttrs(socket, "AF_UNIX")
3376@unittest.skipUnless(thread, 'Threading required for this test.')
3377class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3378 SendrecvmsgUnixStreamTestBase):
3379 pass
3380
3381@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3382@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3383@unittest.skipUnless(thread, 'Threading required for this test.')
3384class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3385 pass
3386
3387@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3388@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3389@unittest.skipUnless(thread, 'Threading required for this test.')
3390class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3391 SendrecvmsgUnixStreamTestBase):
3392 pass
3393
3394
3395# Test interrupting the interruptible send/receive methods with a
3396# signal when a timeout is set. These tests avoid having multiple
3397# threads alive during the test so that the OS cannot deliver the
3398# signal to the wrong one.
3399
3400class InterruptedTimeoutBase(unittest.TestCase):
3401 # Base class for interrupted send/receive tests. Installs an
3402 # empty handler for SIGALRM and removes it on teardown, along with
3403 # any scheduled alarms.
3404
3405 def setUp(self):
3406 super().setUp()
3407 orig_alrm_handler = signal.signal(signal.SIGALRM,
3408 lambda signum, frame: None)
3409 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3410 self.addCleanup(self.setAlarm, 0)
3411
3412 # Timeout for socket operations
3413 timeout = 4.0
3414
3415 # Provide setAlarm() method to schedule delivery of SIGALRM after
3416 # given number of seconds, or cancel it if zero, and an
3417 # appropriate time value to use. Use setitimer() if available.
3418 if hasattr(signal, "setitimer"):
3419 alarm_time = 0.05
3420
3421 def setAlarm(self, seconds):
3422 signal.setitimer(signal.ITIMER_REAL, seconds)
3423 else:
3424 # Old systems may deliver the alarm up to one second early
3425 alarm_time = 2
3426
3427 def setAlarm(self, seconds):
3428 signal.alarm(seconds)
3429
3430
3431# Require siginterrupt() in order to ensure that system calls are
3432# interrupted by default.
3433@requireAttrs(signal, "siginterrupt")
3434@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3435 "Don't have signal.alarm or signal.setitimer")
3436class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3437 # Test interrupting the recv*() methods with signals when a
3438 # timeout is set.
3439
3440 def setUp(self):
3441 super().setUp()
3442 self.serv.settimeout(self.timeout)
3443
3444 def checkInterruptedRecv(self, func, *args, **kwargs):
3445 # Check that func(*args, **kwargs) raises socket.error with an
3446 # errno of EINTR when interrupted by a signal.
3447 self.setAlarm(self.alarm_time)
3448 with self.assertRaises(socket.error) as cm:
3449 func(*args, **kwargs)
3450 self.assertNotIsInstance(cm.exception, socket.timeout)
3451 self.assertEqual(cm.exception.errno, errno.EINTR)
3452
3453 def testInterruptedRecvTimeout(self):
3454 self.checkInterruptedRecv(self.serv.recv, 1024)
3455
3456 def testInterruptedRecvIntoTimeout(self):
3457 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3458
3459 def testInterruptedRecvfromTimeout(self):
3460 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3461
3462 def testInterruptedRecvfromIntoTimeout(self):
3463 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3464
3465 @requireAttrs(socket.socket, "recvmsg")
3466 def testInterruptedRecvmsgTimeout(self):
3467 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3468
3469 @requireAttrs(socket.socket, "recvmsg_into")
3470 def testInterruptedRecvmsgIntoTimeout(self):
3471 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3472
3473
3474# Require siginterrupt() in order to ensure that system calls are
3475# interrupted by default.
3476@requireAttrs(signal, "siginterrupt")
3477@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3478 "Don't have signal.alarm or signal.setitimer")
3479@unittest.skipUnless(thread, 'Threading required for this test.')
3480class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3481 ThreadSafeCleanupTestCase,
3482 SocketListeningTestMixin, TCPTestBase):
3483 # Test interrupting the interruptible send*() methods with signals
3484 # when a timeout is set.
3485
3486 def setUp(self):
3487 super().setUp()
3488 self.serv_conn = self.newSocket()
3489 self.addCleanup(self.serv_conn.close)
3490 # Use a thread to complete the connection, but wait for it to
3491 # terminate before running the test, so that there is only one
3492 # thread to accept the signal.
3493 cli_thread = threading.Thread(target=self.doConnect)
3494 cli_thread.start()
3495 self.cli_conn, addr = self.serv.accept()
3496 self.addCleanup(self.cli_conn.close)
3497 cli_thread.join()
3498 self.serv_conn.settimeout(self.timeout)
3499
3500 def doConnect(self):
3501 self.serv_conn.connect(self.serv_addr)
3502
3503 def checkInterruptedSend(self, func, *args, **kwargs):
3504 # Check that func(*args, **kwargs), run in a loop, raises
3505 # socket.error with an errno of EINTR when interrupted by a
3506 # signal.
3507 with self.assertRaises(socket.error) as cm:
3508 while True:
3509 self.setAlarm(self.alarm_time)
3510 func(*args, **kwargs)
3511 self.assertNotIsInstance(cm.exception, socket.timeout)
3512 self.assertEqual(cm.exception.errno, errno.EINTR)
3513
Ned Deilyc5640382014-02-03 13:58:31 -08003514 # Issue #12958: The following tests have problems on OS X prior to 10.7
3515 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003516 def testInterruptedSendTimeout(self):
3517 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3518
Ned Deilyc5640382014-02-03 13:58:31 -08003519 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003520 def testInterruptedSendtoTimeout(self):
3521 # Passing an actual address here as Python's wrapper for
3522 # sendto() doesn't allow passing a zero-length one; POSIX
3523 # requires that the address is ignored since the socket is
3524 # connection-mode, however.
3525 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3526 self.serv_addr)
3527
Ned Deilyc5640382014-02-03 13:58:31 -08003528 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003529 @requireAttrs(socket.socket, "sendmsg")
3530 def testInterruptedSendmsgTimeout(self):
3531 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3532
3533
Victor Stinner45df8202010-04-28 22:31:17 +00003534@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003535class TCPCloserTest(ThreadedTCPSocketTest):
3536
3537 def testClose(self):
3538 conn, addr = self.serv.accept()
3539 conn.close()
3540
3541 sd = self.cli
3542 read, write, err = select.select([sd], [], [], 1.0)
3543 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003544 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003545
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003546 # Calling close() many times should be safe.
3547 conn.close()
3548 conn.close()
3549
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003550 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003551 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003552 time.sleep(1.0)
3553
Serhiy Storchaka79080682013-11-03 21:31:18 +02003554@unittest.skipUnless(hasattr(socket, 'socketpair'),
3555 'test needs socket.socketpair()')
Victor Stinner45df8202010-04-28 22:31:17 +00003556@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003557class BasicSocketPairTest(SocketPairTest):
3558
3559 def __init__(self, methodName='runTest'):
3560 SocketPairTest.__init__(self, methodName=methodName)
3561
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003562 def _check_defaults(self, sock):
3563 self.assertIsInstance(sock, socket.socket)
3564 if hasattr(socket, 'AF_UNIX'):
3565 self.assertEqual(sock.family, socket.AF_UNIX)
3566 else:
3567 self.assertEqual(sock.family, socket.AF_INET)
3568 self.assertEqual(sock.type, socket.SOCK_STREAM)
3569 self.assertEqual(sock.proto, 0)
3570
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003571 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003572 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003573
3574 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003575 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003576
Dave Cole331708b2004-08-09 04:51:41 +00003577 def testRecv(self):
3578 msg = self.serv.recv(1024)
3579 self.assertEqual(msg, MSG)
3580
3581 def _testRecv(self):
3582 self.cli.send(MSG)
3583
3584 def testSend(self):
3585 self.serv.send(MSG)
3586
3587 def _testSend(self):
3588 msg = self.cli.recv(1024)
3589 self.assertEqual(msg, MSG)
3590
Victor Stinner45df8202010-04-28 22:31:17 +00003591@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003592class NonBlockingTCPTests(ThreadedTCPSocketTest):
3593
3594 def __init__(self, methodName='runTest'):
3595 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3596
3597 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003598 # Testing whether set blocking works
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02003599 self.serv.setblocking(True)
3600 self.assertIsNone(self.serv.gettimeout())
3601 self.serv.setblocking(False)
3602 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003603 start = time.time()
3604 try:
3605 self.serv.accept()
3606 except socket.error:
3607 pass
3608 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003609 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003610
3611 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003612 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003613
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003614 @support.cpython_only
3615 def testSetBlocking_overflow(self):
3616 # Issue 15989
3617 import _testcapi
3618 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3619 self.skipTest('needs UINT_MAX < ULONG_MAX')
3620 self.serv.setblocking(False)
3621 self.assertEqual(self.serv.gettimeout(), 0.0)
3622 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3623 self.assertIsNone(self.serv.gettimeout())
3624
3625 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3626
Serhiy Storchaka79080682013-11-03 21:31:18 +02003627 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3628 'test needs socket.SOCK_NONBLOCK')
3629 @support.requires_linux_version(2, 6, 28)
3630 def testInitNonBlocking(self):
3631 # reinit server socket
3632 self.serv.close()
3633 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3634 socket.SOCK_NONBLOCK)
3635 self.port = support.bind_port(self.serv)
3636 self.serv.listen(1)
3637 # actual testing
3638 start = time.time()
3639 try:
3640 self.serv.accept()
3641 except socket.error:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003642 pass
Serhiy Storchaka79080682013-11-03 21:31:18 +02003643 end = time.time()
3644 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3645
3646 def _testInitNonBlocking(self):
3647 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003648
Antoine Pitrou600232b2011-01-05 21:03:42 +00003649 def testInheritFlags(self):
3650 # Issue #7995: when calling accept() on a listening socket with a
3651 # timeout, the resulting socket should not be non-blocking.
3652 self.serv.settimeout(10)
3653 try:
3654 conn, addr = self.serv.accept()
3655 message = conn.recv(len(MSG))
3656 finally:
3657 conn.close()
3658 self.serv.settimeout(None)
3659
3660 def _testInheritFlags(self):
3661 time.sleep(0.1)
3662 self.cli.connect((HOST, self.port))
3663 time.sleep(0.5)
3664 self.cli.send(MSG)
3665
Guido van Rossum24e4af82002-06-12 19:18:08 +00003666 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003667 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003668 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003669 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003670 conn, addr = self.serv.accept()
3671 except socket.error:
3672 pass
3673 else:
3674 self.fail("Error trying to do non-blocking accept.")
3675 read, write, err = select.select([self.serv], [], [])
3676 if self.serv in read:
3677 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003678 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003679 else:
3680 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003681
Guido van Rossum24e4af82002-06-12 19:18:08 +00003682 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003683 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003684 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003685
3686 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003687 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003688 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003689 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003690
3691 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003692 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003693 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003694
3695 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003696 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003697 conn, addr = self.serv.accept()
3698 conn.setblocking(0)
3699 try:
3700 msg = conn.recv(len(MSG))
3701 except socket.error:
3702 pass
3703 else:
3704 self.fail("Error trying to do non-blocking recv.")
3705 read, write, err = select.select([conn], [], [])
3706 if conn in read:
3707 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003708 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003709 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003710 else:
3711 self.fail("Error during select call to non-blocking socket.")
3712
3713 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003714 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003715 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003716 self.cli.send(MSG)
3717
Victor Stinner45df8202010-04-28 22:31:17 +00003718@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003719class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003720 """Unit tests for the object returned by socket.makefile()
3721
Antoine Pitrou834bd812010-10-13 16:17:14 +00003722 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003723 the client connection. You can read from this file to
3724 get output from the server.
3725
Antoine Pitrou834bd812010-10-13 16:17:14 +00003726 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003727 server connection. You can write to this file to send output
3728 to the client.
3729 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003730
Guido van Rossume9f66142002-08-07 15:46:19 +00003731 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003732 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003733 errors = 'strict'
3734 newline = None
3735
3736 read_mode = 'rb'
3737 read_msg = MSG
3738 write_mode = 'wb'
3739 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003740
Guido van Rossum24e4af82002-06-12 19:18:08 +00003741 def __init__(self, methodName='runTest'):
3742 SocketConnectedTest.__init__(self, methodName=methodName)
3743
3744 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003745 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3746 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003747 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003748 self.read_file = self.cli_conn.makefile(
3749 self.read_mode, self.bufsize,
3750 encoding = self.encoding,
3751 errors = self.errors,
3752 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003753
3754 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003755 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003756 self.read_file.close()
3757 self.assertTrue(self.read_file.closed)
3758 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003759 SocketConnectedTest.tearDown(self)
3760
3761 def clientSetUp(self):
3762 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003763 self.write_file = self.serv_conn.makefile(
3764 self.write_mode, self.bufsize,
3765 encoding = self.encoding,
3766 errors = self.errors,
3767 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003768
3769 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003770 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003771 self.write_file.close()
3772 self.assertTrue(self.write_file.closed)
3773 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003774 SocketConnectedTest.clientTearDown(self)
3775
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003776 def testReadAfterTimeout(self):
3777 # Issue #7322: A file object must disallow further reads
3778 # after a timeout has occurred.
3779 self.cli_conn.settimeout(1)
3780 self.read_file.read(3)
3781 # First read raises a timeout
3782 self.assertRaises(socket.timeout, self.read_file.read, 1)
3783 # Second read is disallowed
3784 with self.assertRaises(IOError) as ctx:
3785 self.read_file.read(1)
3786 self.assertIn("cannot read from timed out object", str(ctx.exception))
3787
3788 def _testReadAfterTimeout(self):
3789 self.write_file.write(self.write_msg[0:3])
3790 self.write_file.flush()
3791 self.serv_finished.wait()
3792
Guido van Rossum24e4af82002-06-12 19:18:08 +00003793 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003794 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003795 first_seg = self.read_file.read(len(self.read_msg)-3)
3796 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003797 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003798 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003799
3800 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003801 self.write_file.write(self.write_msg)
3802 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003803
Guido van Rossum8c943832002-08-08 01:00:28 +00003804 def testFullRead(self):
3805 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003806 msg = self.read_file.read()
3807 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003808
3809 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003810 self.write_file.write(self.write_msg)
3811 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003812
Guido van Rossum24e4af82002-06-12 19:18:08 +00003813 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003814 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003815 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003816 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003817 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003818 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003819 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003820 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003821 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003822
3823 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003824 self.write_file.write(self.write_msg)
3825 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003826
3827 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003828 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003829 line = self.read_file.readline()
3830 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003831
3832 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003833 self.write_file.write(self.write_msg)
3834 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003835
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003836 def testCloseAfterMakefile(self):
3837 # The file returned by makefile should keep the socket open.
3838 self.cli_conn.close()
3839 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003840 msg = self.read_file.read()
3841 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003842
3843 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003844 self.write_file.write(self.write_msg)
3845 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003846
3847 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003848 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003849 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003850 if isinstance(self.read_msg, str):
3851 msg = msg.decode()
3852 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003853
3854 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003855 self.write_file.write(self.write_msg)
3856 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003857
Tim Peters116d83c2004-03-28 02:20:45 +00003858 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003859 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003860
3861 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003862 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003863
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003864 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003865 self.assertEqual(self.read_file.mode, self.read_mode)
3866 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003867
3868 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003869 self.assertEqual(self.write_file.mode, self.write_mode)
3870 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003871
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003872 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003873 self.read_file.close()
3874 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003875 self.cli_conn.close()
3876 self.assertRaises(socket.error, self.cli_conn.getsockname)
3877
3878 def _testRealClose(self):
3879 pass
3880
3881
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003882class FileObjectInterruptedTestCase(unittest.TestCase):
3883 """Test that the file object correctly handles EINTR internally."""
3884
3885 class MockSocket(object):
3886 def __init__(self, recv_funcs=()):
3887 # A generator that returns callables that we'll call for each
3888 # call to recv().
3889 self._recv_step = iter(recv_funcs)
3890
3891 def recv_into(self, buffer):
3892 data = next(self._recv_step)()
3893 assert len(buffer) >= len(data)
3894 buffer[:len(data)] = data
3895 return len(data)
3896
3897 def _decref_socketios(self):
3898 pass
3899
3900 def _textiowrap_for_test(self, buffering=-1):
3901 raw = socket.SocketIO(self, "r")
3902 if buffering < 0:
3903 buffering = io.DEFAULT_BUFFER_SIZE
3904 if buffering == 0:
3905 return raw
3906 buffer = io.BufferedReader(raw, buffering)
3907 text = io.TextIOWrapper(buffer, None, None)
3908 text.mode = "rb"
3909 return text
3910
3911 @staticmethod
3912 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003913 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003914
3915 def _textiowrap_mock_socket(self, mock, buffering=-1):
3916 raw = socket.SocketIO(mock, "r")
3917 if buffering < 0:
3918 buffering = io.DEFAULT_BUFFER_SIZE
3919 if buffering == 0:
3920 return raw
3921 buffer = io.BufferedReader(raw, buffering)
3922 text = io.TextIOWrapper(buffer, None, None)
3923 text.mode = "rb"
3924 return text
3925
3926 def _test_readline(self, size=-1, buffering=-1):
3927 mock_sock = self.MockSocket(recv_funcs=[
3928 lambda : b"This is the first line\nAnd the sec",
3929 self._raise_eintr,
3930 lambda : b"ond line is here\n",
3931 lambda : b"",
3932 lambda : b"", # XXX(gps): io library does an extra EOF read
3933 ])
3934 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003935 self.assertEqual(fo.readline(size), "This is the first line\n")
3936 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003937
3938 def _test_read(self, size=-1, buffering=-1):
3939 mock_sock = self.MockSocket(recv_funcs=[
3940 lambda : b"This is the first line\nAnd the sec",
3941 self._raise_eintr,
3942 lambda : b"ond line is here\n",
3943 lambda : b"",
3944 lambda : b"", # XXX(gps): io library does an extra EOF read
3945 ])
3946 expecting = (b"This is the first line\n"
3947 b"And the second line is here\n")
3948 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3949 if buffering == 0:
3950 data = b''
3951 else:
3952 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003953 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003954 while len(data) != len(expecting):
3955 part = fo.read(size)
3956 if not part:
3957 break
3958 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003959 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003960
3961 def test_default(self):
3962 self._test_readline()
3963 self._test_readline(size=100)
3964 self._test_read()
3965 self._test_read(size=100)
3966
3967 def test_with_1k_buffer(self):
3968 self._test_readline(buffering=1024)
3969 self._test_readline(size=100, buffering=1024)
3970 self._test_read(buffering=1024)
3971 self._test_read(size=100, buffering=1024)
3972
3973 def _test_readline_no_buffer(self, size=-1):
3974 mock_sock = self.MockSocket(recv_funcs=[
3975 lambda : b"a",
3976 lambda : b"\n",
3977 lambda : b"B",
3978 self._raise_eintr,
3979 lambda : b"b",
3980 lambda : b"",
3981 ])
3982 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003983 self.assertEqual(fo.readline(size), b"a\n")
3984 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003985
3986 def test_no_buffer(self):
3987 self._test_readline_no_buffer()
3988 self._test_readline_no_buffer(size=4)
3989 self._test_read(buffering=0)
3990 self._test_read(size=100, buffering=0)
3991
3992
Guido van Rossume9f66142002-08-07 15:46:19 +00003993class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3994
3995 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003996
Guido van Rossume9f66142002-08-07 15:46:19 +00003997 In this case (and in this case only), it should be possible to
3998 create a file object, read a line from it, create another file
3999 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004000 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004001 when reading multiple requests from the same socket."""
4002
4003 bufsize = 0 # Use unbuffered mode
4004
4005 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004006 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004007 line = self.read_file.readline() # first line
4008 self.assertEqual(line, b"A. " + self.write_msg) # first line
4009 self.read_file = self.cli_conn.makefile('rb', 0)
4010 line = self.read_file.readline() # second line
4011 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004012
4013 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004014 self.write_file.write(b"A. " + self.write_msg)
4015 self.write_file.write(b"B. " + self.write_msg)
4016 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004017
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004018 def testMakefileClose(self):
4019 # The file returned by makefile should keep the socket open...
4020 self.cli_conn.close()
4021 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004022 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004023 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004024 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004025 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
4026
4027 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004028 self.write_file.write(self.write_msg)
4029 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004030
4031 def testMakefileCloseSocketDestroy(self):
4032 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004033 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004034 refcount_after = sys.getrefcount(self.cli_conn)
4035 self.assertEqual(refcount_before - 1, refcount_after)
4036
4037 def _testMakefileCloseSocketDestroy(self):
4038 pass
4039
Antoine Pitrou98b46702010-09-18 22:59:00 +00004040 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004041 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004042 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4043
4044 def testSmallReadNonBlocking(self):
4045 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004046 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4047 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004048 self.evt1.set()
4049 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004050 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004051 if first_seg is None:
4052 # Data not arrived (can happen under Windows), wait a bit
4053 time.sleep(0.5)
4054 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004055 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004056 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004057 self.assertEqual(n, 3)
4058 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004059 self.assertEqual(msg, self.read_msg)
4060 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4061 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004062
4063 def _testSmallReadNonBlocking(self):
4064 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004065 self.write_file.write(self.write_msg)
4066 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004067 self.evt2.set()
4068 # Avoid cloding the socket before the server test has finished,
4069 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4070 self.serv_finished.wait(5.0)
4071
4072 def testWriteNonBlocking(self):
4073 self.cli_finished.wait(5.0)
4074 # The client thread can't skip directly - the SkipTest exception
4075 # would appear as a failure.
4076 if self.serv_skipped:
4077 self.skipTest(self.serv_skipped)
4078
4079 def _testWriteNonBlocking(self):
4080 self.serv_skipped = None
4081 self.serv_conn.setblocking(False)
4082 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004083 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004084 LIMIT = 10
4085 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004086 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004087 self.assertGreater(n, 0)
4088 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004089 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004090 if n is None:
4091 # Succeeded
4092 break
4093 self.assertGreater(n, 0)
4094 else:
4095 # Let us know that this test didn't manage to establish
4096 # the expected conditions. This is not a failure in itself but,
4097 # if it happens repeatedly, the test should be fixed.
4098 self.serv_skipped = "failed to saturate the socket buffer"
4099
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004100
Guido van Rossum8c943832002-08-08 01:00:28 +00004101class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4102
4103 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4104
4105
4106class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4107
4108 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004109
Thomas Woutersb2137042007-02-01 18:02:27 +00004110
Antoine Pitrou834bd812010-10-13 16:17:14 +00004111class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4112 """Tests for socket.makefile() in text mode (rather than binary)"""
4113
4114 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004115 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004116 write_mode = 'wb'
4117 write_msg = MSG
4118 newline = ''
4119
4120
4121class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4122 """Tests for socket.makefile() in text mode (rather than binary)"""
4123
4124 read_mode = 'rb'
4125 read_msg = MSG
4126 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004127 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004128 newline = ''
4129
4130
4131class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4132 """Tests for socket.makefile() in text mode (rather than binary)"""
4133
4134 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004135 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004136 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004137 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004138 newline = ''
4139
4140
Guido van Rossumd8faa362007-04-27 19:54:29 +00004141class NetworkConnectionTest(object):
4142 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004143
Guido van Rossumd8faa362007-04-27 19:54:29 +00004144 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004145 # We're inherited below by BasicTCPTest2, which also inherits
4146 # BasicTCPTest, which defines self.port referenced below.
4147 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004148 self.serv_conn = self.cli
4149
4150class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4151 """Tests that NetworkConnection does not break existing TCP functionality.
4152 """
4153
4154class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004155
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004156 class MockSocket(socket.socket):
4157 def connect(self, *args):
4158 raise socket.timeout('timed out')
4159
4160 @contextlib.contextmanager
4161 def mocked_socket_module(self):
4162 """Return a socket which times out on connect"""
4163 old_socket = socket.socket
4164 socket.socket = self.MockSocket
4165 try:
4166 yield
4167 finally:
4168 socket.socket = old_socket
4169
4170 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004171 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004172 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004173 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004174 with self.assertRaises(socket.error) as cm:
4175 cli.connect((HOST, port))
4176 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4177
4178 def test_create_connection(self):
4179 # Issue #9792: errors raised by create_connection() should have
4180 # a proper errno attribute.
4181 port = support.find_unused_port()
4182 with self.assertRaises(socket.error) as cm:
4183 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004184
4185 # Issue #16257: create_connection() calls getaddrinfo() against
4186 # 'localhost'. This may result in an IPV6 addr being returned
4187 # as well as an IPV4 one:
4188 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4189 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4190 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4191 #
4192 # create_connection() enumerates through all the addresses returned
4193 # and if it doesn't successfully bind to any of them, it propagates
4194 # the last exception it encountered.
4195 #
4196 # On Solaris, ENETUNREACH is returned in this circumstance instead
4197 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4198 # expected errnos.
4199 expected_errnos = [ errno.ECONNREFUSED, ]
4200 if hasattr(errno, 'ENETUNREACH'):
4201 expected_errnos.append(errno.ENETUNREACH)
4202
4203 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004204
4205 def test_create_connection_timeout(self):
4206 # Issue #9792: create_connection() should not recast timeout errors
4207 # as generic socket errors.
4208 with self.mocked_socket_module():
4209 with self.assertRaises(socket.timeout):
4210 socket.create_connection((HOST, 1234))
4211
Guido van Rossumd8faa362007-04-27 19:54:29 +00004212
Victor Stinner45df8202010-04-28 22:31:17 +00004213@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004214class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4215
4216 def __init__(self, methodName='runTest'):
4217 SocketTCPTest.__init__(self, methodName=methodName)
4218 ThreadableTest.__init__(self)
4219
4220 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004221 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004222
4223 def clientTearDown(self):
4224 self.cli.close()
4225 self.cli = None
4226 ThreadableTest.clientTearDown(self)
4227
4228 def _justAccept(self):
4229 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004230 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004231
4232 testFamily = _justAccept
4233 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004234 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004235 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004236 self.assertEqual(self.cli.family, 2)
4237
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004238 testSourceAddress = _justAccept
4239 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004240 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4241 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004242 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004243 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004244 # The port number being used is sufficient to show that the bind()
4245 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004246
Guido van Rossumd8faa362007-04-27 19:54:29 +00004247 testTimeoutDefault = _justAccept
4248 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004249 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004250 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004251 socket.setdefaulttimeout(42)
4252 try:
4253 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004254 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004255 finally:
4256 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004257 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004258
4259 testTimeoutNone = _justAccept
4260 def _testTimeoutNone(self):
4261 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004262 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004263 socket.setdefaulttimeout(30)
4264 try:
4265 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004266 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004267 finally:
4268 socket.setdefaulttimeout(None)
4269 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004270
4271 testTimeoutValueNamed = _justAccept
4272 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004273 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004274 self.assertEqual(self.cli.gettimeout(), 30)
4275
4276 testTimeoutValueNonamed = _justAccept
4277 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004278 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004279 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004280 self.assertEqual(self.cli.gettimeout(), 30)
4281
Victor Stinner45df8202010-04-28 22:31:17 +00004282@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004283class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4284
4285 def __init__(self, methodName='runTest'):
4286 SocketTCPTest.__init__(self, methodName=methodName)
4287 ThreadableTest.__init__(self)
4288
4289 def clientSetUp(self):
4290 pass
4291
4292 def clientTearDown(self):
4293 self.cli.close()
4294 self.cli = None
4295 ThreadableTest.clientTearDown(self)
4296
4297 def testInsideTimeout(self):
4298 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004299 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004300 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004301 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004302 testOutsideTimeout = testInsideTimeout
4303
4304 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004305 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004306 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004307 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004308
4309 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004310 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004311 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004312
4313
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004314class TCPTimeoutTest(SocketTCPTest):
4315
4316 def testTCPTimeout(self):
4317 def raise_timeout(*args, **kwargs):
4318 self.serv.settimeout(1.0)
4319 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004320 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004321 "Error generating a timeout exception (TCP)")
4322
4323 def testTimeoutZero(self):
4324 ok = False
4325 try:
4326 self.serv.settimeout(0.0)
4327 foo = self.serv.accept()
4328 except socket.timeout:
4329 self.fail("caught timeout instead of error (TCP)")
4330 except socket.error:
4331 ok = True
4332 except:
4333 self.fail("caught unexpected exception (TCP)")
4334 if not ok:
4335 self.fail("accept() returned success when we did not expect it")
4336
Serhiy Storchaka79080682013-11-03 21:31:18 +02004337 @unittest.skipUnless(hasattr(signal, 'alarm'),
4338 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004339 def testInterruptedTimeout(self):
4340 # XXX I don't know how to do this test on MSWindows or any other
4341 # plaform that doesn't support signal.alarm() or os.kill(), though
4342 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004343 self.serv.settimeout(5.0) # must be longer than alarm
4344 class Alarm(Exception):
4345 pass
4346 def alarm_handler(signal, frame):
4347 raise Alarm
4348 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4349 try:
4350 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4351 try:
4352 foo = self.serv.accept()
4353 except socket.timeout:
4354 self.fail("caught timeout instead of Alarm")
4355 except Alarm:
4356 pass
4357 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004358 self.fail("caught other exception instead of Alarm:"
4359 " %s(%s):\n%s" %
4360 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004361 else:
4362 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004363 finally:
4364 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004365 except Alarm:
4366 self.fail("got Alarm in wrong place")
4367 finally:
4368 # no alarm can be pending. Safe to restore old handler.
4369 signal.signal(signal.SIGALRM, old_alarm)
4370
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004371class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004372
4373 def testUDPTimeout(self):
4374 def raise_timeout(*args, **kwargs):
4375 self.serv.settimeout(1.0)
4376 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004377 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004378 "Error generating a timeout exception (UDP)")
4379
4380 def testTimeoutZero(self):
4381 ok = False
4382 try:
4383 self.serv.settimeout(0.0)
4384 foo = self.serv.recv(1024)
4385 except socket.timeout:
4386 self.fail("caught timeout instead of error (UDP)")
4387 except socket.error:
4388 ok = True
4389 except:
4390 self.fail("caught unexpected exception (UDP)")
4391 if not ok:
4392 self.fail("recv() returned success when we did not expect it")
4393
4394class TestExceptions(unittest.TestCase):
4395
4396 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004397 self.assertTrue(issubclass(socket.error, Exception))
4398 self.assertTrue(issubclass(socket.herror, socket.error))
4399 self.assertTrue(issubclass(socket.gaierror, socket.error))
4400 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004401
Serhiy Storchaka79080682013-11-03 21:31:18 +02004402@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004403class TestLinuxAbstractNamespace(unittest.TestCase):
4404
4405 UNIX_PATH_MAX = 108
4406
4407 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004408 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004409 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4410 s1.bind(address)
4411 s1.listen(1)
4412 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4413 s2.connect(s1.getsockname())
4414 with s1.accept()[0] as s3:
4415 self.assertEqual(s1.getsockname(), address)
4416 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004417
4418 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004419 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004420 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4421 s.bind(address)
4422 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004423
4424 def testNameOverflow(self):
4425 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004426 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4427 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004428
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004429 def testStrName(self):
4430 # Check that an abstract name can be passed as a string.
4431 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4432 try:
4433 s.bind("\x00python\x00test\x00")
4434 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4435 finally:
4436 s.close()
4437
Serhiy Storchaka79080682013-11-03 21:31:18 +02004438@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004439class TestUnixDomain(unittest.TestCase):
4440
4441 def setUp(self):
4442 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4443
4444 def tearDown(self):
4445 self.sock.close()
4446
4447 def encoded(self, path):
4448 # Return the given path encoded in the file system encoding,
4449 # or skip the test if this is not possible.
4450 try:
4451 return os.fsencode(path)
4452 except UnicodeEncodeError:
4453 self.skipTest(
4454 "Pathname {0!a} cannot be represented in file "
4455 "system encoding {1!r}".format(
4456 path, sys.getfilesystemencoding()))
4457
Antoine Pitrou16374872011-12-16 15:04:12 +01004458 def bind(self, sock, path):
4459 # Bind the socket
4460 try:
4461 sock.bind(path)
4462 except OSError as e:
4463 if str(e) == "AF_UNIX path too long":
4464 self.skipTest(
4465 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4466 .format(path))
4467 else:
4468 raise
4469
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004470 def testStrAddr(self):
4471 # Test binding to and retrieving a normal string pathname.
4472 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004473 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004474 self.addCleanup(support.unlink, path)
4475 self.assertEqual(self.sock.getsockname(), path)
4476
4477 def testBytesAddr(self):
4478 # Test binding to a bytes pathname.
4479 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004480 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004481 self.addCleanup(support.unlink, path)
4482 self.assertEqual(self.sock.getsockname(), path)
4483
4484 def testSurrogateescapeBind(self):
4485 # Test binding to a valid non-ASCII pathname, with the
4486 # non-ASCII bytes supplied using surrogateescape encoding.
4487 path = os.path.abspath(support.TESTFN_UNICODE)
4488 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004489 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004490 self.addCleanup(support.unlink, path)
4491 self.assertEqual(self.sock.getsockname(), path)
4492
4493 def testUnencodableAddr(self):
4494 # Test binding to a pathname that cannot be encoded in the
4495 # file system encoding.
4496 if support.TESTFN_UNENCODABLE is None:
4497 self.skipTest("No unencodable filename available")
4498 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004499 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004500 self.addCleanup(support.unlink, path)
4501 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004502
Victor Stinner45df8202010-04-28 22:31:17 +00004503@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004504class BufferIOTest(SocketConnectedTest):
4505 """
4506 Test the buffer versions of socket.recv() and socket.send().
4507 """
4508 def __init__(self, methodName='runTest'):
4509 SocketConnectedTest.__init__(self, methodName=methodName)
4510
Antoine Pitrou25480782010-03-17 22:50:28 +00004511 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004512 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004513 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004514 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004515 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004516 self.assertEqual(msg, MSG)
4517
Antoine Pitrou25480782010-03-17 22:50:28 +00004518 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004519 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004520 self.serv_conn.send(buf)
4521
Antoine Pitrou25480782010-03-17 22:50:28 +00004522 def testRecvIntoBytearray(self):
4523 buf = bytearray(1024)
4524 nbytes = self.cli_conn.recv_into(buf)
4525 self.assertEqual(nbytes, len(MSG))
4526 msg = buf[:len(MSG)]
4527 self.assertEqual(msg, MSG)
4528
4529 _testRecvIntoBytearray = _testRecvIntoArray
4530
4531 def testRecvIntoMemoryview(self):
4532 buf = bytearray(1024)
4533 nbytes = self.cli_conn.recv_into(memoryview(buf))
4534 self.assertEqual(nbytes, len(MSG))
4535 msg = buf[:len(MSG)]
4536 self.assertEqual(msg, MSG)
4537
4538 _testRecvIntoMemoryview = _testRecvIntoArray
4539
4540 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004541 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004542 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004543 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004544 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004545 self.assertEqual(msg, MSG)
4546
Antoine Pitrou25480782010-03-17 22:50:28 +00004547 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004548 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004549 self.serv_conn.send(buf)
4550
Antoine Pitrou25480782010-03-17 22:50:28 +00004551 def testRecvFromIntoBytearray(self):
4552 buf = bytearray(1024)
4553 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4554 self.assertEqual(nbytes, len(MSG))
4555 msg = buf[:len(MSG)]
4556 self.assertEqual(msg, MSG)
4557
4558 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4559
4560 def testRecvFromIntoMemoryview(self):
4561 buf = bytearray(1024)
4562 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4563 self.assertEqual(nbytes, len(MSG))
4564 msg = buf[:len(MSG)]
4565 self.assertEqual(msg, MSG)
4566
4567 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4568
Benjamin Petersonfbf648e2014-01-13 22:59:38 -05004569 def testRecvFromIntoSmallBuffer(self):
4570 # See issue #20246.
4571 buf = bytearray(8)
4572 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4573
4574 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004575 self.serv_conn.send(MSG)
Benjamin Petersonfbf648e2014-01-13 22:59:38 -05004576
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004577 def testRecvFromIntoEmptyBuffer(self):
4578 buf = bytearray()
4579 self.cli_conn.recvfrom_into(buf)
4580 self.cli_conn.recvfrom_into(buf, 0)
4581
4582 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4583
Christian Heimes043d6f62008-01-07 17:19:16 +00004584
4585TIPC_STYPE = 2000
4586TIPC_LOWER = 200
4587TIPC_UPPER = 210
4588
4589def isTipcAvailable():
4590 """Check if the TIPC module is loaded
4591
4592 The TIPC module is not loaded automatically on Ubuntu and probably
4593 other Linux distros.
4594 """
4595 if not hasattr(socket, "AF_TIPC"):
4596 return False
4597 if not os.path.isfile("/proc/modules"):
4598 return False
4599 with open("/proc/modules") as f:
4600 for line in f:
4601 if line.startswith("tipc "):
4602 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004603 return False
4604
Serhiy Storchaka79080682013-11-03 21:31:18 +02004605@unittest.skipUnless(isTipcAvailable(),
4606 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004607class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004608 def testRDM(self):
4609 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4610 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004611 self.addCleanup(srv.close)
4612 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004613
4614 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4615 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4616 TIPC_LOWER, TIPC_UPPER)
4617 srv.bind(srvaddr)
4618
4619 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4620 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4621 cli.sendto(MSG, sendaddr)
4622
4623 msg, recvaddr = srv.recvfrom(1024)
4624
4625 self.assertEqual(cli.getsockname(), recvaddr)
4626 self.assertEqual(msg, MSG)
4627
4628
Serhiy Storchaka79080682013-11-03 21:31:18 +02004629@unittest.skipUnless(isTipcAvailable(),
4630 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004631class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004632 def __init__(self, methodName = 'runTest'):
4633 unittest.TestCase.__init__(self, methodName = methodName)
4634 ThreadableTest.__init__(self)
4635
4636 def setUp(self):
4637 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004638 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004639 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4640 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4641 TIPC_LOWER, TIPC_UPPER)
4642 self.srv.bind(srvaddr)
4643 self.srv.listen(5)
4644 self.serverExplicitReady()
4645 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004646 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004647
4648 def clientSetUp(self):
4649 # The is a hittable race between serverExplicitReady() and the
4650 # accept() call; sleep a little while to avoid it, otherwise
4651 # we could get an exception
4652 time.sleep(0.1)
4653 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004654 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004655 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4656 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4657 self.cli.connect(addr)
4658 self.cliaddr = self.cli.getsockname()
4659
4660 def testStream(self):
4661 msg = self.conn.recv(1024)
4662 self.assertEqual(msg, MSG)
4663 self.assertEqual(self.cliaddr, self.connaddr)
4664
4665 def _testStream(self):
4666 self.cli.send(MSG)
4667 self.cli.close()
4668
4669
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004670@unittest.skipUnless(thread, 'Threading required for this test.')
4671class ContextManagersTest(ThreadedTCPSocketTest):
4672
4673 def _testSocketClass(self):
4674 # base test
4675 with socket.socket() as sock:
4676 self.assertFalse(sock._closed)
4677 self.assertTrue(sock._closed)
4678 # close inside with block
4679 with socket.socket() as sock:
4680 sock.close()
4681 self.assertTrue(sock._closed)
4682 # exception inside with block
4683 with socket.socket() as sock:
4684 self.assertRaises(socket.error, sock.sendall, b'foo')
4685 self.assertTrue(sock._closed)
4686
4687 def testCreateConnectionBase(self):
4688 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004689 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004690 data = conn.recv(1024)
4691 conn.sendall(data)
4692
4693 def _testCreateConnectionBase(self):
4694 address = self.serv.getsockname()
4695 with socket.create_connection(address) as sock:
4696 self.assertFalse(sock._closed)
4697 sock.sendall(b'foo')
4698 self.assertEqual(sock.recv(1024), b'foo')
4699 self.assertTrue(sock._closed)
4700
4701 def testCreateConnectionClose(self):
4702 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004703 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004704 data = conn.recv(1024)
4705 conn.sendall(data)
4706
4707 def _testCreateConnectionClose(self):
4708 address = self.serv.getsockname()
4709 with socket.create_connection(address) as sock:
4710 sock.close()
4711 self.assertTrue(sock._closed)
4712 self.assertRaises(socket.error, sock.sendall, b'foo')
4713
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004714
Antoine Pitroub1c54962010-10-14 15:05:38 +00004715@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4716 "SOCK_CLOEXEC not defined")
4717@unittest.skipUnless(fcntl, "module fcntl not available")
4718class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004719 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004720 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004721 with socket.socket(socket.AF_INET,
4722 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4723 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4724 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004725
4726
4727@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4728 "SOCK_NONBLOCK not defined")
4729class NonblockConstantTest(unittest.TestCase):
4730 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4731 if nonblock:
4732 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4733 self.assertEqual(s.gettimeout(), timeout)
4734 else:
4735 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4736 self.assertEqual(s.gettimeout(), None)
4737
Charles-François Natali239bb962011-06-03 12:55:15 +02004738 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004739 def test_SOCK_NONBLOCK(self):
4740 # a lot of it seems silly and redundant, but I wanted to test that
4741 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004742 with socket.socket(socket.AF_INET,
4743 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4744 self.checkNonblock(s)
4745 s.setblocking(1)
4746 self.checkNonblock(s, False)
4747 s.setblocking(0)
4748 self.checkNonblock(s)
4749 s.settimeout(None)
4750 self.checkNonblock(s, False)
4751 s.settimeout(2.0)
4752 self.checkNonblock(s, timeout=2.0)
4753 s.setblocking(1)
4754 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004755 # defaulttimeout
4756 t = socket.getdefaulttimeout()
4757 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004758 with socket.socket() as s:
4759 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004760 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004761 with socket.socket() as s:
4762 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004763 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004764 with socket.socket() as s:
4765 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004766 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004767 with socket.socket() as s:
4768 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004769 socket.setdefaulttimeout(t)
4770
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004771
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004772@unittest.skipUnless(os.name == "nt", "Windows specific")
4773@unittest.skipUnless(multiprocessing, "need multiprocessing")
4774class TestSocketSharing(SocketTCPTest):
4775 # This must be classmethod and not staticmethod or multiprocessing
4776 # won't be able to bootstrap it.
4777 @classmethod
4778 def remoteProcessServer(cls, q):
4779 # Recreate socket from shared data
4780 sdata = q.get()
4781 message = q.get()
4782
4783 s = socket.fromshare(sdata)
4784 s2, c = s.accept()
4785
4786 # Send the message
4787 s2.sendall(message)
4788 s2.close()
4789 s.close()
4790
4791 def testShare(self):
4792 # Transfer the listening server socket to another process
4793 # and service it from there.
4794
4795 # Create process:
4796 q = multiprocessing.Queue()
4797 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4798 p.start()
4799
4800 # Get the shared socket data
4801 data = self.serv.share(p.pid)
4802
4803 # Pass the shared socket to the other process
4804 addr = self.serv.getsockname()
4805 self.serv.close()
4806 q.put(data)
4807
4808 # The data that the server will send us
4809 message = b"slapmahfro"
4810 q.put(message)
4811
4812 # Connect
4813 s = socket.create_connection(addr)
4814 # listen for the data
4815 m = []
4816 while True:
4817 data = s.recv(100)
4818 if not data:
4819 break
4820 m.append(data)
4821 s.close()
4822 received = b"".join(m)
4823 self.assertEqual(received, message)
4824 p.join()
4825
4826 def testShareLength(self):
4827 data = self.serv.share(os.getpid())
4828 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4829 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4830
4831 def compareSockets(self, org, other):
4832 # socket sharing is expected to work only for blocking socket
4833 # since the internal python timout value isn't transfered.
4834 self.assertEqual(org.gettimeout(), None)
4835 self.assertEqual(org.gettimeout(), other.gettimeout())
4836
4837 self.assertEqual(org.family, other.family)
4838 self.assertEqual(org.type, other.type)
4839 # If the user specified "0" for proto, then
4840 # internally windows will have picked the correct value.
4841 # Python introspection on the socket however will still return
4842 # 0. For the shared socket, the python value is recreated
4843 # from the actual value, so it may not compare correctly.
4844 if org.proto != 0:
4845 self.assertEqual(org.proto, other.proto)
4846
4847 def testShareLocal(self):
4848 data = self.serv.share(os.getpid())
4849 s = socket.fromshare(data)
4850 try:
4851 self.compareSockets(self.serv, s)
4852 finally:
4853 s.close()
4854
4855 def testTypes(self):
4856 families = [socket.AF_INET, socket.AF_INET6]
4857 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4858 for f in families:
4859 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00004860 try:
4861 source = socket.socket(f, t)
4862 except OSError:
4863 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004864 try:
4865 data = source.share(os.getpid())
4866 shared = socket.fromshare(data)
4867 try:
4868 self.compareSockets(source, shared)
4869 finally:
4870 shared.close()
4871 finally:
4872 source.close()
4873
4874
Guido van Rossumb995eb72002-07-31 16:08:40 +00004875def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004876 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004877 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004878
4879 tests.extend([
4880 NonBlockingTCPTests,
4881 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004882 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004883 UnbufferedFileObjectClassTestCase,
4884 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004885 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004886 UnicodeReadFileObjectClassTestCase,
4887 UnicodeWriteFileObjectClassTestCase,
4888 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004889 NetworkConnectionNoServer,
4890 NetworkConnectionAttributesTest,
4891 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004892 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004893 CloexecConstantTest,
4894 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004895 ])
Serhiy Storchaka79080682013-11-03 21:31:18 +02004896 tests.append(BasicSocketPairTest)
4897 tests.append(TestUnixDomain)
4898 tests.append(TestLinuxAbstractNamespace)
4899 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02004900 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004901 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004902 tests.extend([
4903 CmsgMacroTests,
4904 SendmsgUDPTest,
4905 RecvmsgUDPTest,
4906 RecvmsgIntoUDPTest,
4907 SendmsgUDP6Test,
4908 RecvmsgUDP6Test,
4909 RecvmsgRFC3542AncillaryUDP6Test,
4910 RecvmsgIntoRFC3542AncillaryUDP6Test,
4911 RecvmsgIntoUDP6Test,
4912 SendmsgTCPTest,
4913 RecvmsgTCPTest,
4914 RecvmsgIntoTCPTest,
4915 SendmsgSCTPStreamTest,
4916 RecvmsgSCTPStreamTest,
4917 RecvmsgIntoSCTPStreamTest,
4918 SendmsgUnixStreamTest,
4919 RecvmsgUnixStreamTest,
4920 RecvmsgIntoUnixStreamTest,
4921 RecvmsgSCMRightsStreamTest,
4922 RecvmsgIntoSCMRightsStreamTest,
4923 # These are slow when setitimer() is not available
4924 InterruptedRecvTimeoutTest,
4925 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004926 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004927 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004928
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004929 thread_info = support.threading_setup()
4930 support.run_unittest(*tests)
4931 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004932
4933if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004934 test_main()