blob: ce3c16ca821611d0bb8bb899f7b3f218213a4a56 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Antoine Pitroub7eb5632012-06-24 01:34:13 +02005from unittest.case import _ExpectedFailure
Barry Warsawcf3d4b51997-01-03 20:03:32 +00006
Christian Heimes5e696852008-04-09 08:37:03 +00007import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00008import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00009import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +000010import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +100011import tempfile
12import _testcapi
Christian Heimesbbe741d2008-03-28 10:53:29 +000013import time
14import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000015import queue
Jack Jansen522e7692002-09-06 21:57:50 +000016import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000017import os
18import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000019import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000020import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000021from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000022import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000023import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010024import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020025import struct
Antoine Pitroub1c54962010-10-14 15:05:38 +000026try:
27 import fcntl
28except ImportError:
29 fcntl = False
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000030try:
31 import multiprocessing
32except ImportError:
33 multiprocessing = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000034
Benjamin Petersonee8712c2008-05-20 21:35:26 +000035HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000036MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000037
Victor Stinner45df8202010-04-28 22:31:17 +000038try:
39 import _thread as thread
40 import threading
41except ImportError:
42 thread = None
43 threading = None
44
Charles-François Natali47413c12011-10-06 19:47:44 +020045def _have_socket_can():
46 """Check whether CAN sockets are supported on this host."""
47 try:
48 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
49 except (AttributeError, socket.error, OSError):
50 return False
51 else:
52 s.close()
53 return True
54
Charles-François Natali10b8cf42011-11-10 19:21:37 +010055def _have_socket_rds():
56 """Check whether RDS sockets are supported on this host."""
57 try:
58 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
59 except (AttributeError, OSError):
60 return False
61 else:
62 s.close()
63 return True
64
Charles-François Natali47413c12011-10-06 19:47:44 +020065HAVE_SOCKET_CAN = _have_socket_can()
66
Charles-François Natali10b8cf42011-11-10 19:21:37 +010067HAVE_SOCKET_RDS = _have_socket_rds()
68
Nick Coghlan96fe56a2011-08-22 11:55:57 +100069# Size in bytes of the int type
70SIZEOF_INT = array.array("i").itemsize
71
Guido van Rossum24e4af82002-06-12 19:18:08 +000072class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000073
Guido van Rossum24e4af82002-06-12 19:18:08 +000074 def setUp(self):
75 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000076 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000077 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000078
Guido van Rossum24e4af82002-06-12 19:18:08 +000079 def tearDown(self):
80 self.serv.close()
81 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000082
Guido van Rossum24e4af82002-06-12 19:18:08 +000083class SocketUDPTest(unittest.TestCase):
84
85 def setUp(self):
86 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000087 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000088
89 def tearDown(self):
90 self.serv.close()
91 self.serv = None
92
Nick Coghlan96fe56a2011-08-22 11:55:57 +100093class ThreadSafeCleanupTestCase(unittest.TestCase):
94 """Subclass of unittest.TestCase with thread-safe cleanup methods.
95
96 This subclass protects the addCleanup() and doCleanups() methods
97 with a recursive lock.
98 """
99
100 if threading:
101 def __init__(self, *args, **kwargs):
102 super().__init__(*args, **kwargs)
103 self._cleanup_lock = threading.RLock()
104
105 def addCleanup(self, *args, **kwargs):
106 with self._cleanup_lock:
107 return super().addCleanup(*args, **kwargs)
108
109 def doCleanups(self, *args, **kwargs):
110 with self._cleanup_lock:
111 return super().doCleanups(*args, **kwargs)
112
Charles-François Natali47413c12011-10-06 19:47:44 +0200113class SocketCANTest(unittest.TestCase):
114
115 """To be able to run this test, a `vcan0` CAN interface can be created with
116 the following commands:
117 # modprobe vcan
118 # ip link add dev vcan0 type vcan
119 # ifconfig vcan0 up
120 """
121 interface = 'vcan0'
122 bufsize = 128
123
124 def setUp(self):
125 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200126 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200127 try:
128 self.s.bind((self.interface,))
129 except socket.error:
130 self.skipTest('network interface `%s` does not exist' %
131 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200132
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100133
134class SocketRDSTest(unittest.TestCase):
135
136 """To be able to run this test, the `rds` kernel module must be loaded:
137 # modprobe rds
138 """
139 bufsize = 8192
140
141 def setUp(self):
142 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
143 self.addCleanup(self.serv.close)
144 try:
145 self.port = support.bind_port(self.serv)
146 except OSError:
147 self.skipTest('unable to bind RDS socket')
148
149
Guido van Rossum24e4af82002-06-12 19:18:08 +0000150class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000151 """Threadable Test class
152
153 The ThreadableTest class makes it easy to create a threaded
154 client/server pair from an existing unit test. To create a
155 new threaded class from an existing unit test, use multiple
156 inheritance:
157
158 class NewClass (OldClass, ThreadableTest):
159 pass
160
161 This class defines two new fixture functions with obvious
162 purposes for overriding:
163
164 clientSetUp ()
165 clientTearDown ()
166
167 Any new test functions within the class must then define
168 tests in pairs, where the test name is preceeded with a
169 '_' to indicate the client portion of the test. Ex:
170
171 def testFoo(self):
172 # Server portion
173
174 def _testFoo(self):
175 # Client portion
176
177 Any exceptions raised by the clients during their tests
178 are caught and transferred to the main thread to alert
179 the testing framework.
180
181 Note, the server setup function cannot call any blocking
182 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000183 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000184 the blocking call (such as in setting up a client/server
185 connection and performing the accept() in setUp().
186 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000187
188 def __init__(self):
189 # Swap the true setup function
190 self.__setUp = self.setUp
191 self.__tearDown = self.tearDown
192 self.setUp = self._setUp
193 self.tearDown = self._tearDown
194
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000195 def serverExplicitReady(self):
196 """This method allows the server to explicitly indicate that
197 it wants the client thread to proceed. This is useful if the
198 server is about to execute a blocking routine that is
199 dependent upon the client thread during its setup routine."""
200 self.server_ready.set()
201
Guido van Rossum24e4af82002-06-12 19:18:08 +0000202 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000203 self.server_ready = threading.Event()
204 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000205 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000206 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200207 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000208
209 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000210 methodname = self.id()
211 i = methodname.rfind('.')
212 methodname = methodname[i+1:]
213 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000214 self.client_thread = thread.start_new_thread(
215 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000216
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200217 try:
218 self.__setUp()
219 except:
220 self.server_crashed = True
221 raise
222 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000223 self.server_ready.set()
224 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000225
226 def _tearDown(self):
227 self.__tearDown()
228 self.done.wait()
229
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000230 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000231 exc = self.queue.get()
232 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000233
234 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000235 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000236 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200237 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200238 if self.server_crashed:
239 self.clientTearDown()
240 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000241 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000242 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000243 try:
244 test_func()
Antoine Pitroub7eb5632012-06-24 01:34:13 +0200245 except _ExpectedFailure:
Nick Coghlan2496f332011-09-19 20:26:31 +1000246 # We deliberately ignore expected failures
247 pass
Antoine Pitrou98b46702010-09-18 22:59:00 +0000248 except BaseException as e:
249 self.queue.put(e)
250 finally:
251 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000252
253 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000254 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000255
256 def clientTearDown(self):
257 self.done.set()
258 thread.exit()
259
260class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
261
262 def __init__(self, methodName='runTest'):
263 SocketTCPTest.__init__(self, methodName=methodName)
264 ThreadableTest.__init__(self)
265
266 def clientSetUp(self):
267 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
268
269 def clientTearDown(self):
270 self.cli.close()
271 self.cli = None
272 ThreadableTest.clientTearDown(self)
273
274class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
275
276 def __init__(self, methodName='runTest'):
277 SocketUDPTest.__init__(self, methodName=methodName)
278 ThreadableTest.__init__(self)
279
280 def clientSetUp(self):
281 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
282
Brian Curtin3beb38f2010-11-04 03:41:43 +0000283 def clientTearDown(self):
284 self.cli.close()
285 self.cli = None
286 ThreadableTest.clientTearDown(self)
287
Charles-François Natali47413c12011-10-06 19:47:44 +0200288class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
289
290 def __init__(self, methodName='runTest'):
291 SocketCANTest.__init__(self, methodName=methodName)
292 ThreadableTest.__init__(self)
293
294 def clientSetUp(self):
295 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
296 try:
297 self.cli.bind((self.interface,))
298 except socket.error:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200299 # skipTest should not be called here, and will be called in the
300 # server instead
301 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200302
303 def clientTearDown(self):
304 self.cli.close()
305 self.cli = None
306 ThreadableTest.clientTearDown(self)
307
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100308class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
309
310 def __init__(self, methodName='runTest'):
311 SocketRDSTest.__init__(self, methodName=methodName)
312 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100313
314 def clientSetUp(self):
315 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
316 try:
317 # RDS sockets must be bound explicitly to send or receive data
318 self.cli.bind((HOST, 0))
319 self.cli_addr = self.cli.getsockname()
320 except OSError:
321 # skipTest should not be called here, and will be called in the
322 # server instead
323 pass
324
325 def clientTearDown(self):
326 self.cli.close()
327 self.cli = None
328 ThreadableTest.clientTearDown(self)
329
Guido van Rossum24e4af82002-06-12 19:18:08 +0000330class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000331 """Socket tests for client-server connection.
332
333 self.cli_conn is a client socket connected to the server. The
334 setUp() method guarantees that it is connected to the server.
335 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000336
337 def __init__(self, methodName='runTest'):
338 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
339
340 def setUp(self):
341 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000342 # Indicate explicitly we're ready for the client thread to
343 # proceed and then perform the blocking call to accept
344 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000345 conn, addr = self.serv.accept()
346 self.cli_conn = conn
347
348 def tearDown(self):
349 self.cli_conn.close()
350 self.cli_conn = None
351 ThreadedTCPSocketTest.tearDown(self)
352
353 def clientSetUp(self):
354 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000355 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000356 self.serv_conn = self.cli
357
358 def clientTearDown(self):
359 self.serv_conn.close()
360 self.serv_conn = None
361 ThreadedTCPSocketTest.clientTearDown(self)
362
Dave Cole331708b2004-08-09 04:51:41 +0000363class SocketPairTest(unittest.TestCase, ThreadableTest):
364
365 def __init__(self, methodName='runTest'):
366 unittest.TestCase.__init__(self, methodName=methodName)
367 ThreadableTest.__init__(self)
368
369 def setUp(self):
370 self.serv, self.cli = socket.socketpair()
371
372 def tearDown(self):
373 self.serv.close()
374 self.serv = None
375
376 def clientSetUp(self):
377 pass
378
379 def clientTearDown(self):
380 self.cli.close()
381 self.cli = None
382 ThreadableTest.clientTearDown(self)
383
Tim Peters494aaee2004-08-09 18:54:11 +0000384
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000385# The following classes are used by the sendmsg()/recvmsg() tests.
386# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
387# gives a drop-in replacement for SocketConnectedTest, but different
388# address families can be used, and the attributes serv_addr and
389# cli_addr will be set to the addresses of the endpoints.
390
391class SocketTestBase(unittest.TestCase):
392 """A base class for socket tests.
393
394 Subclasses must provide methods newSocket() to return a new socket
395 and bindSock(sock) to bind it to an unused address.
396
397 Creates a socket self.serv and sets self.serv_addr to its address.
398 """
399
400 def setUp(self):
401 self.serv = self.newSocket()
402 self.bindServer()
403
404 def bindServer(self):
405 """Bind server socket and set self.serv_addr to its address."""
406 self.bindSock(self.serv)
407 self.serv_addr = self.serv.getsockname()
408
409 def tearDown(self):
410 self.serv.close()
411 self.serv = None
412
413
414class SocketListeningTestMixin(SocketTestBase):
415 """Mixin to listen on the server socket."""
416
417 def setUp(self):
418 super().setUp()
419 self.serv.listen(1)
420
421
422class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
423 ThreadableTest):
424 """Mixin to add client socket and allow client/server tests.
425
426 Client socket is self.cli and its address is self.cli_addr. See
427 ThreadableTest for usage information.
428 """
429
430 def __init__(self, *args, **kwargs):
431 super().__init__(*args, **kwargs)
432 ThreadableTest.__init__(self)
433
434 def clientSetUp(self):
435 self.cli = self.newClientSocket()
436 self.bindClient()
437
438 def newClientSocket(self):
439 """Return a new socket for use as client."""
440 return self.newSocket()
441
442 def bindClient(self):
443 """Bind client socket and set self.cli_addr to its address."""
444 self.bindSock(self.cli)
445 self.cli_addr = self.cli.getsockname()
446
447 def clientTearDown(self):
448 self.cli.close()
449 self.cli = None
450 ThreadableTest.clientTearDown(self)
451
452
453class ConnectedStreamTestMixin(SocketListeningTestMixin,
454 ThreadedSocketTestMixin):
455 """Mixin to allow client/server stream tests with connected client.
456
457 Server's socket representing connection to client is self.cli_conn
458 and client's connection to server is self.serv_conn. (Based on
459 SocketConnectedTest.)
460 """
461
462 def setUp(self):
463 super().setUp()
464 # Indicate explicitly we're ready for the client thread to
465 # proceed and then perform the blocking call to accept
466 self.serverExplicitReady()
467 conn, addr = self.serv.accept()
468 self.cli_conn = conn
469
470 def tearDown(self):
471 self.cli_conn.close()
472 self.cli_conn = None
473 super().tearDown()
474
475 def clientSetUp(self):
476 super().clientSetUp()
477 self.cli.connect(self.serv_addr)
478 self.serv_conn = self.cli
479
480 def clientTearDown(self):
481 self.serv_conn.close()
482 self.serv_conn = None
483 super().clientTearDown()
484
485
486class UnixSocketTestBase(SocketTestBase):
487 """Base class for Unix-domain socket tests."""
488
489 # This class is used for file descriptor passing tests, so we
490 # create the sockets in a private directory so that other users
491 # can't send anything that might be problematic for a privileged
492 # user running the tests.
493
494 def setUp(self):
495 self.dir_path = tempfile.mkdtemp()
496 self.addCleanup(os.rmdir, self.dir_path)
497 super().setUp()
498
499 def bindSock(self, sock):
500 path = tempfile.mktemp(dir=self.dir_path)
501 sock.bind(path)
502 self.addCleanup(support.unlink, path)
503
504class UnixStreamBase(UnixSocketTestBase):
505 """Base class for Unix-domain SOCK_STREAM tests."""
506
507 def newSocket(self):
508 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
509
510
511class InetTestBase(SocketTestBase):
512 """Base class for IPv4 socket tests."""
513
514 host = HOST
515
516 def setUp(self):
517 super().setUp()
518 self.port = self.serv_addr[1]
519
520 def bindSock(self, sock):
521 support.bind_port(sock, host=self.host)
522
523class TCPTestBase(InetTestBase):
524 """Base class for TCP-over-IPv4 tests."""
525
526 def newSocket(self):
527 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
528
529class UDPTestBase(InetTestBase):
530 """Base class for UDP-over-IPv4 tests."""
531
532 def newSocket(self):
533 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
534
535class SCTPStreamBase(InetTestBase):
536 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
537
538 def newSocket(self):
539 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
540 socket.IPPROTO_SCTP)
541
542
543class Inet6TestBase(InetTestBase):
544 """Base class for IPv6 socket tests."""
545
546 # Don't use "localhost" here - it may not have an IPv6 address
547 # assigned to it by default (e.g. in /etc/hosts), and if someone
548 # has assigned it an IPv4-mapped address, then it's unlikely to
549 # work with the full IPv6 API.
550 host = "::1"
551
552class UDP6TestBase(Inet6TestBase):
553 """Base class for UDP-over-IPv6 tests."""
554
555 def newSocket(self):
556 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
557
558
559# Test-skipping decorators for use with ThreadableTest.
560
561def skipWithClientIf(condition, reason):
562 """Skip decorated test if condition is true, add client_skip decorator.
563
564 If the decorated object is not a class, sets its attribute
565 "client_skip" to a decorator which will return an empty function
566 if the test is to be skipped, or the original function if it is
567 not. This can be used to avoid running the client part of a
568 skipped test when using ThreadableTest.
569 """
570 def client_pass(*args, **kwargs):
571 pass
572 def skipdec(obj):
573 retval = unittest.skip(reason)(obj)
574 if not isinstance(obj, type):
575 retval.client_skip = lambda f: client_pass
576 return retval
577 def noskipdec(obj):
578 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
579 obj.client_skip = lambda f: f
580 return obj
581 return skipdec if condition else noskipdec
582
583
584def requireAttrs(obj, *attributes):
585 """Skip decorated test if obj is missing any of the given attributes.
586
587 Sets client_skip attribute as skipWithClientIf() does.
588 """
589 missing = [name for name in attributes if not hasattr(obj, name)]
590 return skipWithClientIf(
591 missing, "don't have " + ", ".join(name for name in missing))
592
593
594def requireSocket(*args):
595 """Skip decorated test if a socket cannot be created with given arguments.
596
597 When an argument is given as a string, will use the value of that
598 attribute of the socket module, or skip the test if it doesn't
599 exist. Sets client_skip attribute as skipWithClientIf() does.
600 """
601 err = None
602 missing = [obj for obj in args if
603 isinstance(obj, str) and not hasattr(socket, obj)]
604 if missing:
605 err = "don't have " + ", ".join(name for name in missing)
606 else:
607 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
608 for obj in args]
609 try:
610 s = socket.socket(*callargs)
611 except socket.error as e:
612 # XXX: check errno?
613 err = str(e)
614 else:
615 s.close()
616 return skipWithClientIf(
617 err is not None,
618 "can't create socket({0}): {1}".format(
619 ", ".join(str(o) for o in args), err))
620
621
Guido van Rossum24e4af82002-06-12 19:18:08 +0000622#######################################################################
623## Begin Tests
624
625class GeneralModuleTests(unittest.TestCase):
626
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000627 def test_repr(self):
628 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000629 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000630 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000631
Raymond Hettinger027bb632004-05-31 03:09:25 +0000632 def test_weakref(self):
633 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
634 p = proxy(s)
635 self.assertEqual(p.fileno(), s.fileno())
636 s.close()
637 s = None
638 try:
639 p.fileno()
640 except ReferenceError:
641 pass
642 else:
643 self.fail('Socket proxy still exists')
644
Guido van Rossum24e4af82002-06-12 19:18:08 +0000645 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000646 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300647 msg = "Error raising socket exception (%s)."
648 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000649 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300650 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000651 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300652 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000653 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000654
Ezio Melotti63e42302011-05-07 19:47:48 +0300655 def testSendtoErrors(self):
656 # Testing that sendto doens't masks failures. See #10169.
657 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
658 self.addCleanup(s.close)
659 s.bind(('', 0))
660 sockname = s.getsockname()
661 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300662 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300663 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300664 self.assertEqual(str(cm.exception),
665 "'str' does not support the buffer interface")
666 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300667 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300668 self.assertEqual(str(cm.exception),
669 "'complex' does not support the buffer interface")
670 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300671 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300672 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300673 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300674 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300675 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300676 self.assertEqual(str(cm.exception),
677 "'str' does not support the buffer interface")
678 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300679 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300680 self.assertEqual(str(cm.exception),
681 "'complex' does not support the buffer interface")
682 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300683 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300684 self.assertIn('not NoneType', str(cm.exception))
685 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300686 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300687 self.assertIn('an integer is required', str(cm.exception))
688 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300689 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300690 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300691 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300692 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300693 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300694 self.assertIn('(1 given)', str(cm.exception))
695 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300696 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300697 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300698
Guido van Rossum24e4af82002-06-12 19:18:08 +0000699 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000700 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000701 socket.AF_INET
702 socket.SOCK_STREAM
703 socket.SOCK_DGRAM
704 socket.SOCK_RAW
705 socket.SOCK_RDM
706 socket.SOCK_SEQPACKET
707 socket.SOL_SOCKET
708 socket.SO_REUSEADDR
709
Guido van Rossum654c11e2002-06-13 20:24:17 +0000710 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000711 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000712 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000713 try:
714 ip = socket.gethostbyname(hostname)
715 except socket.error:
716 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600717 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000718 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000719 try:
720 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
721 except socket.error:
722 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600723 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000724 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000725 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000726 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000727 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000728
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000729 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
730 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
731 def test_sethostname(self):
732 oldhn = socket.gethostname()
733 try:
734 socket.sethostname('new')
735 except socket.error as e:
736 if e.errno == errno.EPERM:
737 self.skipTest("test should be run as root")
738 else:
739 raise
740 try:
741 # running test as root!
742 self.assertEqual(socket.gethostname(), 'new')
743 # Should work with bytes objects too
744 socket.sethostname(b'bar')
745 self.assertEqual(socket.gethostname(), 'bar')
746 finally:
747 socket.sethostname(oldhn)
748
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700749 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
750 'socket.if_nameindex() not available.')
751 def testInterfaceNameIndex(self):
752 interfaces = socket.if_nameindex()
753 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200754 self.assertIsInstance(index, int)
755 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700756 # interface indices are non-zero integers
757 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200758 _index = socket.if_nametoindex(name)
759 self.assertIsInstance(_index, int)
760 self.assertEqual(index, _index)
761 _name = socket.if_indextoname(index)
762 self.assertIsInstance(_name, str)
763 self.assertEqual(name, _name)
764
765 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
766 'socket.if_nameindex() not available.')
767 def testInvalidInterfaceNameIndex(self):
768 # test nonexistent interface index/name
769 self.assertRaises(socket.error, socket.if_indextoname, 0)
770 self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
771 # test with invalid values
772 self.assertRaises(TypeError, socket.if_nametoindex, 0)
773 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700774
Serhiy Storchaka79080682013-11-03 21:31:18 +0200775 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
776 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000777 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000778 # Testing reference count for getnameinfo
Serhiy Storchaka79080682013-11-03 21:31:18 +0200779 try:
780 # On some versions, this loses a reference
781 orig = sys.getrefcount(__name__)
782 socket.getnameinfo(__name__,0)
783 except TypeError:
784 if sys.getrefcount(__name__) != orig:
785 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000786
Guido van Rossum24e4af82002-06-12 19:18:08 +0000787 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000788 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000789 try:
790 # On some versions, this crashes the interpreter.
791 socket.getnameinfo(('x', 0, 0, 0), 0)
792 except socket.error:
793 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000794
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000795 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000796 # This just checks that htons etc. are their own inverse,
797 # when looking at the lower 16 or 32 bits.
798 sizes = {socket.htonl: 32, socket.ntohl: 32,
799 socket.htons: 16, socket.ntohs: 16}
800 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000801 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000802 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
803 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000804
Guido van Rossuma2627af2002-09-14 00:58:46 +0000805 swapped = func(mask)
806 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000807 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000808
Guido van Rossum018919a2007-01-15 00:07:32 +0000809 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000810 good_values = [ 1, 2, 3, 1, 2, 3 ]
811 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000812 for k in good_values:
813 socket.ntohl(k)
814 socket.ntohs(k)
815 socket.htonl(k)
816 socket.htons(k)
817 for k in bad_values:
818 self.assertRaises(OverflowError, socket.ntohl, k)
819 self.assertRaises(OverflowError, socket.ntohs, k)
820 self.assertRaises(OverflowError, socket.htonl, k)
821 self.assertRaises(OverflowError, socket.htons, k)
822
Barry Warsaw11b91a02004-06-28 00:50:43 +0000823 def testGetServBy(self):
824 eq = self.assertEqual
825 # Find one service that exists, then check all the related interfaces.
826 # I've ordered this by protocols that have both a tcp and udp
827 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200828 if (sys.platform.startswith(('freebsd', 'netbsd'))
829 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000830 # avoid the 'echo' service on this platform, as there is an
831 # assumption breaking non-standard port/protocol entry
832 services = ('daytime', 'qotd', 'domain')
833 else:
834 services = ('echo', 'daytime', 'domain')
835 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000836 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000837 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000838 break
839 except socket.error:
840 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000841 else:
842 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000843 # Try same call with optional protocol omitted
844 port2 = socket.getservbyname(service)
845 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400846 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000847 try:
848 udpport = socket.getservbyname(service, 'udp')
849 except socket.error:
850 udpport = None
851 else:
852 eq(udpport, port)
853 # Now make sure the lookup by port returns the same service name
854 eq(socket.getservbyport(port2), service)
855 eq(socket.getservbyport(port, 'tcp'), service)
856 if udpport is not None:
857 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000858 # Make sure getservbyport does not accept out of range ports.
859 self.assertRaises(OverflowError, socket.getservbyport, -1)
860 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000861
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000862 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000863 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000864 # The default timeout should initially be None
865 self.assertEqual(socket.getdefaulttimeout(), None)
866 s = socket.socket()
867 self.assertEqual(s.gettimeout(), None)
868 s.close()
869
870 # Set the default timeout to 10, and see if it propagates
871 socket.setdefaulttimeout(10)
872 self.assertEqual(socket.getdefaulttimeout(), 10)
873 s = socket.socket()
874 self.assertEqual(s.gettimeout(), 10)
875 s.close()
876
877 # Reset the default timeout to None, and see if it propagates
878 socket.setdefaulttimeout(None)
879 self.assertEqual(socket.getdefaulttimeout(), None)
880 s = socket.socket()
881 self.assertEqual(s.gettimeout(), None)
882 s.close()
883
884 # Check that setting it to an invalid value raises ValueError
885 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
886
887 # Check that setting it to an invalid type raises TypeError
888 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
889
Serhiy Storchaka79080682013-11-03 21:31:18 +0200890 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
891 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000892 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000893 # Test that issue1008086 and issue767150 are fixed.
894 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000895 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
896 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000897
Serhiy Storchaka79080682013-11-03 21:31:18 +0200898 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
899 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000900 def testIPv4toString(self):
901 from socket import inet_aton as f, inet_pton, AF_INET
902 g = lambda a: inet_pton(AF_INET, a)
903
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100904 assertInvalid = lambda func,a: self.assertRaises(
905 (socket.error, ValueError), func, a
906 )
907
Ezio Melottib3aedd42010-11-20 19:04:17 +0000908 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
909 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
910 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
911 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
912 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100913 assertInvalid(f, '0.0.0.')
914 assertInvalid(f, '300.0.0.0')
915 assertInvalid(f, 'a.0.0.0')
916 assertInvalid(f, '1.2.3.4.5')
917 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000918
Ezio Melottib3aedd42010-11-20 19:04:17 +0000919 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
920 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
921 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
922 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100923 assertInvalid(g, '0.0.0.')
924 assertInvalid(g, '300.0.0.0')
925 assertInvalid(g, 'a.0.0.0')
926 assertInvalid(g, '1.2.3.4.5')
927 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000928
Serhiy Storchaka79080682013-11-03 21:31:18 +0200929 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
930 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000931 def testIPv6toString(self):
932 try:
933 from socket import inet_pton, AF_INET6, has_ipv6
934 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600935 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000936 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600937 self.skipTest('could not import needed symbols from socket')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000938 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100939 assertInvalid = lambda a: self.assertRaises(
940 (socket.error, ValueError), f, a
941 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000942
Ezio Melottib3aedd42010-11-20 19:04:17 +0000943 self.assertEqual(b'\x00' * 16, f('::'))
944 self.assertEqual(b'\x00' * 16, f('0::0'))
945 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
946 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000947 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 +0000948 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
949 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100950 self.assertEqual(
951 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
952 f('ad42:abc::127:0:254:2')
953 )
954 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
955 assertInvalid('0x20::')
956 assertInvalid(':::')
957 assertInvalid('::0::')
958 assertInvalid('1::abc::')
959 assertInvalid('1::abc::def')
960 assertInvalid('1:2:3:4:5:6:')
961 assertInvalid('1:2:3:4:5:6')
962 assertInvalid('1:2:3:4:5:6:7:8:')
963 assertInvalid('1:2:3:4:5:6:7:8:0')
964
965 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
966 f('::254.42.23.64')
967 )
968 self.assertEqual(
969 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
970 f('42::a29b:254.42.23.64')
971 )
972 self.assertEqual(
973 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
974 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
975 )
976 assertInvalid('255.254.253.252')
977 assertInvalid('1::260.2.3.0')
978 assertInvalid('1::0.be.e.0')
979 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
980 assertInvalid('::1.2.3.4:0')
981 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +0000982
Serhiy Storchaka79080682013-11-03 21:31:18 +0200983 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
984 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000985 def testStringToIPv4(self):
986 from socket import inet_ntoa as f, inet_ntop, AF_INET
987 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100988 assertInvalid = lambda func,a: self.assertRaises(
989 (socket.error, ValueError), func, a
990 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000991
Ezio Melottib3aedd42010-11-20 19:04:17 +0000992 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
993 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
994 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
995 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100996 assertInvalid(f, b'\x00' * 3)
997 assertInvalid(f, b'\x00' * 5)
998 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +0000999
Ezio Melottib3aedd42010-11-20 19:04:17 +00001000 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1001 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1002 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001003 assertInvalid(g, b'\x00' * 3)
1004 assertInvalid(g, b'\x00' * 5)
1005 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001006
Serhiy Storchaka79080682013-11-03 21:31:18 +02001007 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1008 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001009 def testStringToIPv6(self):
1010 try:
1011 from socket import inet_ntop, AF_INET6, has_ipv6
1012 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001013 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001014 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001015 self.skipTest('could not import needed symbols from socket')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001016 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001017 assertInvalid = lambda a: self.assertRaises(
1018 (socket.error, ValueError), f, a
1019 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001020
Ezio Melottib3aedd42010-11-20 19:04:17 +00001021 self.assertEqual('::', f(b'\x00' * 16))
1022 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1023 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001024 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001025 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 +00001026 )
1027
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001028 assertInvalid(b'\x12' * 15)
1029 assertInvalid(b'\x12' * 17)
1030 assertInvalid(b'\x12' * 4)
1031
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001032 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001033
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001034 def testSockName(self):
1035 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001036 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001037 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001038 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001039 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001040 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001041 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1042 # it reasonable to get the host's addr in addition to 0.0.0.0.
1043 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001044 try:
1045 my_ip_addr = socket.gethostbyname(socket.gethostname())
1046 except socket.error:
1047 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001048 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001049 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001050 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001051
1052 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001053 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001054 # We know a socket should start without reuse==0
1055 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001056 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001057 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001058 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001059
1060 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001061 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001062 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001063 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001064 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1065 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001066 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001067
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001068 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001069 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001070 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1071 sock.settimeout(1)
1072 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +00001073 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001074
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001075 def testNewAttributes(self):
1076 # testing .family, .type and .protocol
1077 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1078 self.assertEqual(sock.family, socket.AF_INET)
1079 self.assertEqual(sock.type, socket.SOCK_STREAM)
1080 self.assertEqual(sock.proto, 0)
1081 sock.close()
1082
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001083 def test_getsockaddrarg(self):
1084 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001085 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001086 big_port = port + 65536
1087 neg_port = port - 65536
1088 sock = socket.socket()
1089 try:
1090 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1091 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1092 sock.bind((host, port))
1093 finally:
1094 sock.close()
1095
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001096 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001097 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001098 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1099 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1100 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1101 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001102 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1103 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001104 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001105 self.assertRaises(ValueError, s.ioctl, -1, None)
1106 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001107
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001108 def testGetaddrinfo(self):
1109 try:
1110 socket.getaddrinfo('localhost', 80)
1111 except socket.gaierror as err:
1112 if err.errno == socket.EAI_SERVICE:
1113 # see http://bugs.python.org/issue1282647
1114 self.skipTest("buggy libc version")
1115 raise
1116 # len of every sequence is supposed to be == 5
1117 for info in socket.getaddrinfo(HOST, None):
1118 self.assertEqual(len(info), 5)
1119 # host can be a domain name, a string representation of an
1120 # IPv4/v6 address or None
1121 socket.getaddrinfo('localhost', 80)
1122 socket.getaddrinfo('127.0.0.1', 80)
1123 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001124 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001125 socket.getaddrinfo('::1', 80)
1126 # port can be a string service name such as "http", a numeric
1127 # port number or None
1128 socket.getaddrinfo(HOST, "http")
1129 socket.getaddrinfo(HOST, 80)
1130 socket.getaddrinfo(HOST, None)
1131 # test family and socktype filters
1132 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
1133 for family, _, _, _, _ in infos:
1134 self.assertEqual(family, socket.AF_INET)
1135 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1136 for _, socktype, _, _, _ in infos:
1137 self.assertEqual(socktype, socket.SOCK_STREAM)
1138 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001139 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001140 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1141 # a server willing to support both IPv4 and IPv6 will
1142 # usually do this
1143 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1144 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001145 # test keyword arguments
1146 a = socket.getaddrinfo(HOST, None)
1147 b = socket.getaddrinfo(host=HOST, port=None)
1148 self.assertEqual(a, b)
1149 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1150 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1151 self.assertEqual(a, b)
1152 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1153 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1154 self.assertEqual(a, b)
1155 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1156 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1157 self.assertEqual(a, b)
1158 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1159 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1160 self.assertEqual(a, b)
1161 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1162 socket.AI_PASSIVE)
1163 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1164 type=socket.SOCK_STREAM, proto=0,
1165 flags=socket.AI_PASSIVE)
1166 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001167 # Issue #6697.
1168 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001169
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001170 # Issue 17269
Ronald Oussorena822d3662013-06-10 10:36:28 +02001171 if hasattr(socket, 'AI_NUMERICSERV'):
1172 socket.getaddrinfo("localhost", None, 0, 0, 0, socket.AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001173
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001174 def test_getnameinfo(self):
1175 # only IP addresses are allowed
1176 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
1177
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001178 @unittest.skipUnless(support.is_resource_enabled('network'),
1179 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001180 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001181 # Check for internet access before running test (issue #12804).
1182 try:
1183 socket.gethostbyname('python.org')
1184 except socket.gaierror as e:
1185 if e.errno == socket.EAI_NODATA:
1186 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001187 # these should all be successful
1188 socket.gethostbyname('испытание.python.org')
1189 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001190 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1191 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1192 # have a reverse entry yet
1193 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001194
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001195 def check_sendall_interrupted(self, with_timeout):
1196 # socketpair() is not stricly required, but it makes things easier.
1197 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1198 self.skipTest("signal.alarm and socket.socketpair required for this test")
1199 # Our signal handlers clobber the C errno by calling a math function
1200 # with an invalid domain value.
1201 def ok_handler(*args):
1202 self.assertRaises(ValueError, math.acosh, 0)
1203 def raising_handler(*args):
1204 self.assertRaises(ValueError, math.acosh, 0)
1205 1 // 0
1206 c, s = socket.socketpair()
1207 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1208 try:
1209 if with_timeout:
1210 # Just above the one second minimum for signal.alarm
1211 c.settimeout(1.5)
1212 with self.assertRaises(ZeroDivisionError):
1213 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001214 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001215 if with_timeout:
1216 signal.signal(signal.SIGALRM, ok_handler)
1217 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001218 self.assertRaises(socket.timeout, c.sendall,
1219 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001220 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001221 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001222 signal.signal(signal.SIGALRM, old_alarm)
1223 c.close()
1224 s.close()
1225
1226 def test_sendall_interrupted(self):
1227 self.check_sendall_interrupted(False)
1228
1229 def test_sendall_interrupted_with_timeout(self):
1230 self.check_sendall_interrupted(True)
1231
Antoine Pitroue033e062010-10-29 10:38:18 +00001232 def test_dealloc_warn(self):
1233 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1234 r = repr(sock)
1235 with self.assertWarns(ResourceWarning) as cm:
1236 sock = None
1237 support.gc_collect()
1238 self.assertIn(r, str(cm.warning.args[0]))
1239 # An open socket file object gets dereferenced after the socket
1240 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1241 f = sock.makefile('rb')
1242 r = repr(sock)
1243 sock = None
1244 support.gc_collect()
1245 with self.assertWarns(ResourceWarning):
1246 f = None
1247 support.gc_collect()
1248
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001249 def test_name_closed_socketio(self):
1250 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1251 fp = sock.makefile("rb")
1252 fp.close()
1253 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1254
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001255 def test_unusable_closed_socketio(self):
1256 with socket.socket() as sock:
1257 fp = sock.makefile("rb", buffering=0)
1258 self.assertTrue(fp.readable())
1259 self.assertFalse(fp.writable())
1260 self.assertFalse(fp.seekable())
1261 fp.close()
1262 self.assertRaises(ValueError, fp.readable)
1263 self.assertRaises(ValueError, fp.writable)
1264 self.assertRaises(ValueError, fp.seekable)
1265
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001266 def test_pickle(self):
1267 sock = socket.socket()
1268 with sock:
1269 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1270 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1271
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001272 def test_listen_backlog(self):
1273 for backlog in 0, -1:
1274 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1275 srv.bind((HOST, 0))
1276 srv.listen(backlog)
1277 srv.close()
1278
1279 # Issue 15989
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001280 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1281 srv.bind((HOST, 0))
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001282 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001283 srv.close()
1284
Charles-François Natali42663332012-01-02 15:57:30 +01001285 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001286 def test_flowinfo(self):
1287 self.assertRaises(OverflowError, socket.getnameinfo,
1288 ('::1',0, 0xffffffff), 0)
1289 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1290 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
1291
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001292
Charles-François Natali47413c12011-10-06 19:47:44 +02001293@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1294class BasicCANTest(unittest.TestCase):
1295
1296 def testCrucialConstants(self):
1297 socket.AF_CAN
1298 socket.PF_CAN
1299 socket.CAN_RAW
1300
1301 def testCreateSocket(self):
1302 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1303 pass
1304
1305 def testBindAny(self):
1306 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1307 s.bind(('', ))
1308
1309 def testTooLongInterfaceName(self):
1310 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1311 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001312 self.assertRaisesRegex(socket.error, 'interface name too long',
1313 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001314
1315 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1316 'socket.CAN_RAW_LOOPBACK required for this test.')
1317 def testLoopback(self):
1318 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1319 for loopback in (0, 1):
1320 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1321 loopback)
1322 self.assertEqual(loopback,
1323 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1324
1325 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1326 'socket.CAN_RAW_FILTER required for this test.')
1327 def testFilter(self):
1328 can_id, can_mask = 0x200, 0x700
1329 can_filter = struct.pack("=II", can_id, can_mask)
1330 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1331 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1332 self.assertEqual(can_filter,
1333 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1334
1335
1336@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1337@unittest.skipUnless(thread, 'Threading required for this test.')
1338class CANTest(ThreadedCANSocketTest):
1339
1340 """The CAN frame structure is defined in <linux/can.h>:
1341
1342 struct can_frame {
1343 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1344 __u8 can_dlc; /* data length code: 0 .. 8 */
1345 __u8 data[8] __attribute__((aligned(8)));
1346 };
1347 """
1348 can_frame_fmt = "=IB3x8s"
1349
1350 def __init__(self, methodName='runTest'):
1351 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1352
1353 @classmethod
1354 def build_can_frame(cls, can_id, data):
1355 """Build a CAN frame."""
1356 can_dlc = len(data)
1357 data = data.ljust(8, b'\x00')
1358 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1359
1360 @classmethod
1361 def dissect_can_frame(cls, frame):
1362 """Dissect a CAN frame."""
1363 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1364 return (can_id, can_dlc, data[:can_dlc])
1365
1366 def testSendFrame(self):
1367 cf, addr = self.s.recvfrom(self.bufsize)
1368 self.assertEqual(self.cf, cf)
1369 self.assertEqual(addr[0], self.interface)
1370 self.assertEqual(addr[1], socket.AF_CAN)
1371
1372 def _testSendFrame(self):
1373 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1374 self.cli.send(self.cf)
1375
1376 def testSendMaxFrame(self):
1377 cf, addr = self.s.recvfrom(self.bufsize)
1378 self.assertEqual(self.cf, cf)
1379
1380 def _testSendMaxFrame(self):
1381 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1382 self.cli.send(self.cf)
1383
1384 def testSendMultiFrames(self):
1385 cf, addr = self.s.recvfrom(self.bufsize)
1386 self.assertEqual(self.cf1, cf)
1387
1388 cf, addr = self.s.recvfrom(self.bufsize)
1389 self.assertEqual(self.cf2, cf)
1390
1391 def _testSendMultiFrames(self):
1392 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1393 self.cli.send(self.cf1)
1394
1395 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1396 self.cli.send(self.cf2)
1397
1398
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001399@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1400class BasicRDSTest(unittest.TestCase):
1401
1402 def testCrucialConstants(self):
1403 socket.AF_RDS
1404 socket.PF_RDS
1405
1406 def testCreateSocket(self):
1407 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1408 pass
1409
1410 def testSocketBufferSize(self):
1411 bufsize = 16384
1412 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1413 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1414 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1415
1416
1417@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1418@unittest.skipUnless(thread, 'Threading required for this test.')
1419class RDSTest(ThreadedRDSSocketTest):
1420
1421 def __init__(self, methodName='runTest'):
1422 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1423
Charles-François Natali240c55f2011-11-10 20:33:36 +01001424 def setUp(self):
1425 super().setUp()
1426 self.evt = threading.Event()
1427
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001428 def testSendAndRecv(self):
1429 data, addr = self.serv.recvfrom(self.bufsize)
1430 self.assertEqual(self.data, data)
1431 self.assertEqual(self.cli_addr, addr)
1432
1433 def _testSendAndRecv(self):
1434 self.data = b'spam'
1435 self.cli.sendto(self.data, 0, (HOST, self.port))
1436
1437 def testPeek(self):
1438 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1439 self.assertEqual(self.data, data)
1440 data, addr = self.serv.recvfrom(self.bufsize)
1441 self.assertEqual(self.data, data)
1442
1443 def _testPeek(self):
1444 self.data = b'spam'
1445 self.cli.sendto(self.data, 0, (HOST, self.port))
1446
1447 @requireAttrs(socket.socket, 'recvmsg')
1448 def testSendAndRecvMsg(self):
1449 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1450 self.assertEqual(self.data, data)
1451
1452 @requireAttrs(socket.socket, 'sendmsg')
1453 def _testSendAndRecvMsg(self):
1454 self.data = b'hello ' * 10
1455 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1456
1457 def testSendAndRecvMulti(self):
1458 data, addr = self.serv.recvfrom(self.bufsize)
1459 self.assertEqual(self.data1, data)
1460
1461 data, addr = self.serv.recvfrom(self.bufsize)
1462 self.assertEqual(self.data2, data)
1463
1464 def _testSendAndRecvMulti(self):
1465 self.data1 = b'bacon'
1466 self.cli.sendto(self.data1, 0, (HOST, self.port))
1467
1468 self.data2 = b'egg'
1469 self.cli.sendto(self.data2, 0, (HOST, self.port))
1470
1471 def testSelect(self):
1472 r, w, x = select.select([self.serv], [], [], 3.0)
1473 self.assertIn(self.serv, r)
1474 data, addr = self.serv.recvfrom(self.bufsize)
1475 self.assertEqual(self.data, data)
1476
1477 def _testSelect(self):
1478 self.data = b'select'
1479 self.cli.sendto(self.data, 0, (HOST, self.port))
1480
1481 def testCongestion(self):
1482 # wait until the sender is done
1483 self.evt.wait()
1484
1485 def _testCongestion(self):
1486 # test the behavior in case of congestion
1487 self.data = b'fill'
1488 self.cli.setblocking(False)
1489 try:
1490 # try to lower the receiver's socket buffer size
1491 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1492 except OSError:
1493 pass
1494 with self.assertRaises(OSError) as cm:
1495 try:
1496 # fill the receiver's socket buffer
1497 while True:
1498 self.cli.sendto(self.data, 0, (HOST, self.port))
1499 finally:
1500 # signal the receiver we're done
1501 self.evt.set()
1502 # sendto() should have failed with ENOBUFS
1503 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1504 # and we should have received a congestion notification through poll
1505 r, w, x = select.select([self.serv], [], [], 3.0)
1506 self.assertIn(self.serv, r)
1507
1508
Victor Stinner45df8202010-04-28 22:31:17 +00001509@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001510class BasicTCPTest(SocketConnectedTest):
1511
1512 def __init__(self, methodName='runTest'):
1513 SocketConnectedTest.__init__(self, methodName=methodName)
1514
1515 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001516 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001517 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001518 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001519
1520 def _testRecv(self):
1521 self.serv_conn.send(MSG)
1522
1523 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001524 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001525 seg1 = self.cli_conn.recv(len(MSG) - 3)
1526 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001527 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001528 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001529
1530 def _testOverFlowRecv(self):
1531 self.serv_conn.send(MSG)
1532
1533 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001534 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001535 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001536 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001537
1538 def _testRecvFrom(self):
1539 self.serv_conn.send(MSG)
1540
1541 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001542 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001543 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1544 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001545 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001546 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001547
1548 def _testOverFlowRecvFrom(self):
1549 self.serv_conn.send(MSG)
1550
1551 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001552 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001553 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001554 while 1:
1555 read = self.cli_conn.recv(1024)
1556 if not read:
1557 break
Guido van Rossume531e292002-08-08 20:28:34 +00001558 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001559 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001560
1561 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001562 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001563 self.serv_conn.sendall(big_chunk)
1564
1565 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001566 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001567 fd = self.cli_conn.fileno()
1568 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001569 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001570 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001571 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001572 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001573
1574 def _testFromFd(self):
1575 self.serv_conn.send(MSG)
1576
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001577 def testDup(self):
1578 # Testing dup()
1579 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001580 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001581 msg = sock.recv(1024)
1582 self.assertEqual(msg, MSG)
1583
1584 def _testDup(self):
1585 self.serv_conn.send(MSG)
1586
Guido van Rossum24e4af82002-06-12 19:18:08 +00001587 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001588 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001589 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001590 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001591 # wait for _testShutdown to finish: on OS X, when the server
1592 # closes the connection the client also becomes disconnected,
1593 # and the client's shutdown call will fail. (Issue #4397.)
1594 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001595
1596 def _testShutdown(self):
1597 self.serv_conn.send(MSG)
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001598 # Issue 15989
1599 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1600 _testcapi.INT_MAX + 1)
1601 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1602 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001603 self.serv_conn.shutdown(2)
1604
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001605 def testDetach(self):
1606 # Testing detach()
1607 fileno = self.cli_conn.fileno()
1608 f = self.cli_conn.detach()
1609 self.assertEqual(f, fileno)
1610 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001611 self.assertTrue(self.cli_conn._closed)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001612 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1613 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001614 # ...but we can create another socket using the (still open)
1615 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001616 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001617 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001618 msg = sock.recv(1024)
1619 self.assertEqual(msg, MSG)
1620
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001621 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001622 self.serv_conn.send(MSG)
1623
Victor Stinner45df8202010-04-28 22:31:17 +00001624@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001625class BasicUDPTest(ThreadedUDPSocketTest):
1626
1627 def __init__(self, methodName='runTest'):
1628 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1629
1630 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001631 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001632 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001633 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001634
1635 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001636 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001637
Guido van Rossum1c938012002-06-12 21:17:20 +00001638 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001639 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001640 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001641 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001642
Guido van Rossum1c938012002-06-12 21:17:20 +00001643 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001644 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001645
Guido van Rossumd8faa362007-04-27 19:54:29 +00001646 def testRecvFromNegative(self):
1647 # Negative lengths passed to recvfrom should give ValueError.
1648 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1649
1650 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001651 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001652
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001653# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1654# same test code is used with different families and types of socket
1655# (e.g. stream, datagram), and tests using recvmsg() are repeated
1656# using recvmsg_into().
1657#
1658# The generic test classes such as SendmsgTests and
1659# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1660# supplied with sockets cli_sock and serv_sock representing the
1661# client's and the server's end of the connection respectively, and
1662# attributes cli_addr and serv_addr holding their (numeric where
1663# appropriate) addresses.
1664#
1665# The final concrete test classes combine these with subclasses of
1666# SocketTestBase which set up client and server sockets of a specific
1667# type, and with subclasses of SendrecvmsgBase such as
1668# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1669# sockets to cli_sock and serv_sock and override the methods and
1670# attributes of SendrecvmsgBase to fill in destination addresses if
1671# needed when sending, check for specific flags in msg_flags, etc.
1672#
1673# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1674# recvmsg_into().
1675
1676# XXX: like the other datagram (UDP) tests in this module, the code
1677# here assumes that datagram delivery on the local machine will be
1678# reliable.
1679
1680class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1681 # Base class for sendmsg()/recvmsg() tests.
1682
1683 # Time in seconds to wait before considering a test failed, or
1684 # None for no timeout. Not all tests actually set a timeout.
1685 fail_timeout = 3.0
1686
1687 def setUp(self):
1688 self.misc_event = threading.Event()
1689 super().setUp()
1690
1691 def sendToServer(self, msg):
1692 # Send msg to the server.
1693 return self.cli_sock.send(msg)
1694
1695 # Tuple of alternative default arguments for sendmsg() when called
1696 # via sendmsgToServer() (e.g. to include a destination address).
1697 sendmsg_to_server_defaults = ()
1698
1699 def sendmsgToServer(self, *args):
1700 # Call sendmsg() on self.cli_sock with the given arguments,
1701 # filling in any arguments which are not supplied with the
1702 # corresponding items of self.sendmsg_to_server_defaults, if
1703 # any.
1704 return self.cli_sock.sendmsg(
1705 *(args + self.sendmsg_to_server_defaults[len(args):]))
1706
1707 def doRecvmsg(self, sock, bufsize, *args):
1708 # Call recvmsg() on sock with given arguments and return its
1709 # result. Should be used for tests which can use either
1710 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1711 # this method with one which emulates it using recvmsg_into(),
1712 # thus allowing the same test to be used for both methods.
1713 result = sock.recvmsg(bufsize, *args)
1714 self.registerRecvmsgResult(result)
1715 return result
1716
1717 def registerRecvmsgResult(self, result):
1718 # Called by doRecvmsg() with the return value of recvmsg() or
1719 # recvmsg_into(). Can be overridden to arrange cleanup based
1720 # on the returned ancillary data, for instance.
1721 pass
1722
1723 def checkRecvmsgAddress(self, addr1, addr2):
1724 # Called to compare the received address with the address of
1725 # the peer.
1726 self.assertEqual(addr1, addr2)
1727
1728 # Flags that are normally unset in msg_flags
1729 msg_flags_common_unset = 0
1730 for name in ("MSG_CTRUNC", "MSG_OOB"):
1731 msg_flags_common_unset |= getattr(socket, name, 0)
1732
1733 # Flags that are normally set
1734 msg_flags_common_set = 0
1735
1736 # Flags set when a complete record has been received (e.g. MSG_EOR
1737 # for SCTP)
1738 msg_flags_eor_indicator = 0
1739
1740 # Flags set when a complete record has not been received
1741 # (e.g. MSG_TRUNC for datagram sockets)
1742 msg_flags_non_eor_indicator = 0
1743
1744 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1745 # Method to check the value of msg_flags returned by recvmsg[_into]().
1746 #
1747 # Checks that all bits in msg_flags_common_set attribute are
1748 # set in "flags" and all bits in msg_flags_common_unset are
1749 # unset.
1750 #
1751 # The "eor" argument specifies whether the flags should
1752 # indicate that a full record (or datagram) has been received.
1753 # If "eor" is None, no checks are done; otherwise, checks
1754 # that:
1755 #
1756 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1757 # set and all bits in msg_flags_non_eor_indicator are unset
1758 #
1759 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1760 # are set and all bits in msg_flags_eor_indicator are unset
1761 #
1762 # If "checkset" and/or "checkunset" are supplied, they require
1763 # the given bits to be set or unset respectively, overriding
1764 # what the attributes require for those bits.
1765 #
1766 # If any bits are set in "ignore", they will not be checked,
1767 # regardless of the other inputs.
1768 #
1769 # Will raise Exception if the inputs require a bit to be both
1770 # set and unset, and it is not ignored.
1771
1772 defaultset = self.msg_flags_common_set
1773 defaultunset = self.msg_flags_common_unset
1774
1775 if eor:
1776 defaultset |= self.msg_flags_eor_indicator
1777 defaultunset |= self.msg_flags_non_eor_indicator
1778 elif eor is not None:
1779 defaultset |= self.msg_flags_non_eor_indicator
1780 defaultunset |= self.msg_flags_eor_indicator
1781
1782 # Function arguments override defaults
1783 defaultset &= ~checkunset
1784 defaultunset &= ~checkset
1785
1786 # Merge arguments with remaining defaults, and check for conflicts
1787 checkset |= defaultset
1788 checkunset |= defaultunset
1789 inboth = checkset & checkunset & ~ignore
1790 if inboth:
1791 raise Exception("contradictory set, unset requirements for flags "
1792 "{0:#x}".format(inboth))
1793
1794 # Compare with given msg_flags value
1795 mask = (checkset | checkunset) & ~ignore
1796 self.assertEqual(flags & mask, checkset & mask)
1797
1798
1799class RecvmsgIntoMixin(SendrecvmsgBase):
1800 # Mixin to implement doRecvmsg() using recvmsg_into().
1801
1802 def doRecvmsg(self, sock, bufsize, *args):
1803 buf = bytearray(bufsize)
1804 result = sock.recvmsg_into([buf], *args)
1805 self.registerRecvmsgResult(result)
1806 self.assertGreaterEqual(result[0], 0)
1807 self.assertLessEqual(result[0], bufsize)
1808 return (bytes(buf[:result[0]]),) + result[1:]
1809
1810
1811class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1812 # Defines flags to be checked in msg_flags for datagram sockets.
1813
1814 @property
1815 def msg_flags_non_eor_indicator(self):
1816 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1817
1818
1819class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1820 # Defines flags to be checked in msg_flags for SCTP sockets.
1821
1822 @property
1823 def msg_flags_eor_indicator(self):
1824 return super().msg_flags_eor_indicator | socket.MSG_EOR
1825
1826
1827class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1828 # Base class for tests on connectionless-mode sockets. Users must
1829 # supply sockets on attributes cli and serv to be mapped to
1830 # cli_sock and serv_sock respectively.
1831
1832 @property
1833 def serv_sock(self):
1834 return self.serv
1835
1836 @property
1837 def cli_sock(self):
1838 return self.cli
1839
1840 @property
1841 def sendmsg_to_server_defaults(self):
1842 return ([], [], 0, self.serv_addr)
1843
1844 def sendToServer(self, msg):
1845 return self.cli_sock.sendto(msg, self.serv_addr)
1846
1847
1848class SendrecvmsgConnectedBase(SendrecvmsgBase):
1849 # Base class for tests on connected sockets. Users must supply
1850 # sockets on attributes serv_conn and cli_conn (representing the
1851 # connections *to* the server and the client), to be mapped to
1852 # cli_sock and serv_sock respectively.
1853
1854 @property
1855 def serv_sock(self):
1856 return self.cli_conn
1857
1858 @property
1859 def cli_sock(self):
1860 return self.serv_conn
1861
1862 def checkRecvmsgAddress(self, addr1, addr2):
1863 # Address is currently "unspecified" for a connected socket,
1864 # so we don't examine it
1865 pass
1866
1867
1868class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1869 # Base class to set a timeout on server's socket.
1870
1871 def setUp(self):
1872 super().setUp()
1873 self.serv_sock.settimeout(self.fail_timeout)
1874
1875
1876class SendmsgTests(SendrecvmsgServerTimeoutBase):
1877 # Tests for sendmsg() which can use any socket type and do not
1878 # involve recvmsg() or recvmsg_into().
1879
1880 def testSendmsg(self):
1881 # Send a simple message with sendmsg().
1882 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1883
1884 def _testSendmsg(self):
1885 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1886
1887 def testSendmsgDataGenerator(self):
1888 # Send from buffer obtained from a generator (not a sequence).
1889 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1890
1891 def _testSendmsgDataGenerator(self):
1892 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1893 len(MSG))
1894
1895 def testSendmsgAncillaryGenerator(self):
1896 # Gather (empty) ancillary data from a generator.
1897 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1898
1899 def _testSendmsgAncillaryGenerator(self):
1900 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1901 len(MSG))
1902
1903 def testSendmsgArray(self):
1904 # Send data from an array instead of the usual bytes object.
1905 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1906
1907 def _testSendmsgArray(self):
1908 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1909 len(MSG))
1910
1911 def testSendmsgGather(self):
1912 # Send message data from more than one buffer (gather write).
1913 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1914
1915 def _testSendmsgGather(self):
1916 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1917
1918 def testSendmsgBadArgs(self):
1919 # Check that sendmsg() rejects invalid arguments.
1920 self.assertEqual(self.serv_sock.recv(1000), b"done")
1921
1922 def _testSendmsgBadArgs(self):
1923 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1924 self.assertRaises(TypeError, self.sendmsgToServer,
1925 b"not in an iterable")
1926 self.assertRaises(TypeError, self.sendmsgToServer,
1927 object())
1928 self.assertRaises(TypeError, self.sendmsgToServer,
1929 [object()])
1930 self.assertRaises(TypeError, self.sendmsgToServer,
1931 [MSG, object()])
1932 self.assertRaises(TypeError, self.sendmsgToServer,
1933 [MSG], object())
1934 self.assertRaises(TypeError, self.sendmsgToServer,
1935 [MSG], [], object())
1936 self.assertRaises(TypeError, self.sendmsgToServer,
1937 [MSG], [], 0, object())
1938 self.sendToServer(b"done")
1939
1940 def testSendmsgBadCmsg(self):
1941 # Check that invalid ancillary data items are rejected.
1942 self.assertEqual(self.serv_sock.recv(1000), b"done")
1943
1944 def _testSendmsgBadCmsg(self):
1945 self.assertRaises(TypeError, self.sendmsgToServer,
1946 [MSG], [object()])
1947 self.assertRaises(TypeError, self.sendmsgToServer,
1948 [MSG], [(object(), 0, b"data")])
1949 self.assertRaises(TypeError, self.sendmsgToServer,
1950 [MSG], [(0, object(), b"data")])
1951 self.assertRaises(TypeError, self.sendmsgToServer,
1952 [MSG], [(0, 0, object())])
1953 self.assertRaises(TypeError, self.sendmsgToServer,
1954 [MSG], [(0, 0)])
1955 self.assertRaises(TypeError, self.sendmsgToServer,
1956 [MSG], [(0, 0, b"data", 42)])
1957 self.sendToServer(b"done")
1958
1959 @requireAttrs(socket, "CMSG_SPACE")
1960 def testSendmsgBadMultiCmsg(self):
1961 # Check that invalid ancillary data items are rejected when
1962 # more than one item is present.
1963 self.assertEqual(self.serv_sock.recv(1000), b"done")
1964
1965 @testSendmsgBadMultiCmsg.client_skip
1966 def _testSendmsgBadMultiCmsg(self):
1967 self.assertRaises(TypeError, self.sendmsgToServer,
1968 [MSG], [0, 0, b""])
1969 self.assertRaises(TypeError, self.sendmsgToServer,
1970 [MSG], [(0, 0, b""), object()])
1971 self.sendToServer(b"done")
1972
1973 def testSendmsgExcessCmsgReject(self):
1974 # Check that sendmsg() rejects excess ancillary data items
1975 # when the number that can be sent is limited.
1976 self.assertEqual(self.serv_sock.recv(1000), b"done")
1977
1978 def _testSendmsgExcessCmsgReject(self):
1979 if not hasattr(socket, "CMSG_SPACE"):
1980 # Can only send one item
1981 with self.assertRaises(socket.error) as cm:
1982 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1983 self.assertIsNone(cm.exception.errno)
1984 self.sendToServer(b"done")
1985
1986 def testSendmsgAfterClose(self):
1987 # Check that sendmsg() fails on a closed socket.
1988 pass
1989
1990 def _testSendmsgAfterClose(self):
1991 self.cli_sock.close()
1992 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1993
1994
1995class SendmsgStreamTests(SendmsgTests):
1996 # Tests for sendmsg() which require a stream socket and do not
1997 # involve recvmsg() or recvmsg_into().
1998
1999 def testSendmsgExplicitNoneAddr(self):
2000 # Check that peer address can be specified as None.
2001 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2002
2003 def _testSendmsgExplicitNoneAddr(self):
2004 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2005
2006 def testSendmsgTimeout(self):
2007 # Check that timeout works with sendmsg().
2008 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2009 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2010
2011 def _testSendmsgTimeout(self):
2012 try:
2013 self.cli_sock.settimeout(0.03)
2014 with self.assertRaises(socket.timeout):
2015 while True:
2016 self.sendmsgToServer([b"a"*512])
2017 finally:
2018 self.misc_event.set()
2019
2020 # XXX: would be nice to have more tests for sendmsg flags argument.
2021
2022 # Linux supports MSG_DONTWAIT when sending, but in general, it
2023 # only works when receiving. Could add other platforms if they
2024 # support it too.
2025 @skipWithClientIf(sys.platform not in {"linux2"},
2026 "MSG_DONTWAIT not known to work on this platform when "
2027 "sending")
2028 def testSendmsgDontWait(self):
2029 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2030 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2031 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2032
2033 @testSendmsgDontWait.client_skip
2034 def _testSendmsgDontWait(self):
2035 try:
2036 with self.assertRaises(socket.error) as cm:
2037 while True:
2038 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2039 self.assertIn(cm.exception.errno,
2040 (errno.EAGAIN, errno.EWOULDBLOCK))
2041 finally:
2042 self.misc_event.set()
2043
2044
2045class SendmsgConnectionlessTests(SendmsgTests):
2046 # Tests for sendmsg() which require a connectionless-mode
2047 # (e.g. datagram) socket, and do not involve recvmsg() or
2048 # recvmsg_into().
2049
2050 def testSendmsgNoDestAddr(self):
2051 # Check that sendmsg() fails when no destination address is
2052 # given for unconnected socket.
2053 pass
2054
2055 def _testSendmsgNoDestAddr(self):
2056 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2057 [MSG])
2058 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2059 [MSG], [], 0, None)
2060
2061
2062class RecvmsgGenericTests(SendrecvmsgBase):
2063 # Tests for recvmsg() which can also be emulated using
2064 # recvmsg_into(), and can use any socket type.
2065
2066 def testRecvmsg(self):
2067 # Receive a simple message with recvmsg[_into]().
2068 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2069 self.assertEqual(msg, MSG)
2070 self.checkRecvmsgAddress(addr, self.cli_addr)
2071 self.assertEqual(ancdata, [])
2072 self.checkFlags(flags, eor=True)
2073
2074 def _testRecvmsg(self):
2075 self.sendToServer(MSG)
2076
2077 def testRecvmsgExplicitDefaults(self):
2078 # Test recvmsg[_into]() with default arguments provided explicitly.
2079 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2080 len(MSG), 0, 0)
2081 self.assertEqual(msg, MSG)
2082 self.checkRecvmsgAddress(addr, self.cli_addr)
2083 self.assertEqual(ancdata, [])
2084 self.checkFlags(flags, eor=True)
2085
2086 def _testRecvmsgExplicitDefaults(self):
2087 self.sendToServer(MSG)
2088
2089 def testRecvmsgShorter(self):
2090 # Receive a message smaller than buffer.
2091 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2092 len(MSG) + 42)
2093 self.assertEqual(msg, MSG)
2094 self.checkRecvmsgAddress(addr, self.cli_addr)
2095 self.assertEqual(ancdata, [])
2096 self.checkFlags(flags, eor=True)
2097
2098 def _testRecvmsgShorter(self):
2099 self.sendToServer(MSG)
2100
Charles-François Natali8619cd72011-10-03 19:43:15 +02002101 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2102 # datagram is received (issue #13001).
2103 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002104 def testRecvmsgTrunc(self):
2105 # Receive part of message, check for truncation indicators.
2106 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2107 len(MSG) - 3)
2108 self.assertEqual(msg, MSG[:-3])
2109 self.checkRecvmsgAddress(addr, self.cli_addr)
2110 self.assertEqual(ancdata, [])
2111 self.checkFlags(flags, eor=False)
2112
Charles-François Natali8619cd72011-10-03 19:43:15 +02002113 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002114 def _testRecvmsgTrunc(self):
2115 self.sendToServer(MSG)
2116
2117 def testRecvmsgShortAncillaryBuf(self):
2118 # Test ancillary data buffer too small to hold any ancillary data.
2119 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2120 len(MSG), 1)
2121 self.assertEqual(msg, MSG)
2122 self.checkRecvmsgAddress(addr, self.cli_addr)
2123 self.assertEqual(ancdata, [])
2124 self.checkFlags(flags, eor=True)
2125
2126 def _testRecvmsgShortAncillaryBuf(self):
2127 self.sendToServer(MSG)
2128
2129 def testRecvmsgLongAncillaryBuf(self):
2130 # Test large ancillary data buffer.
2131 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2132 len(MSG), 10240)
2133 self.assertEqual(msg, MSG)
2134 self.checkRecvmsgAddress(addr, self.cli_addr)
2135 self.assertEqual(ancdata, [])
2136 self.checkFlags(flags, eor=True)
2137
2138 def _testRecvmsgLongAncillaryBuf(self):
2139 self.sendToServer(MSG)
2140
2141 def testRecvmsgAfterClose(self):
2142 # Check that recvmsg[_into]() fails on a closed socket.
2143 self.serv_sock.close()
2144 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2145
2146 def _testRecvmsgAfterClose(self):
2147 pass
2148
2149 def testRecvmsgTimeout(self):
2150 # Check that timeout works.
2151 try:
2152 self.serv_sock.settimeout(0.03)
2153 self.assertRaises(socket.timeout,
2154 self.doRecvmsg, self.serv_sock, len(MSG))
2155 finally:
2156 self.misc_event.set()
2157
2158 def _testRecvmsgTimeout(self):
2159 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2160
2161 @requireAttrs(socket, "MSG_PEEK")
2162 def testRecvmsgPeek(self):
2163 # Check that MSG_PEEK in flags enables examination of pending
2164 # data without consuming it.
2165
2166 # Receive part of data with MSG_PEEK.
2167 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2168 len(MSG) - 3, 0,
2169 socket.MSG_PEEK)
2170 self.assertEqual(msg, MSG[:-3])
2171 self.checkRecvmsgAddress(addr, self.cli_addr)
2172 self.assertEqual(ancdata, [])
2173 # Ignoring MSG_TRUNC here (so this test is the same for stream
2174 # and datagram sockets). Some wording in POSIX seems to
2175 # suggest that it needn't be set when peeking, but that may
2176 # just be a slip.
2177 self.checkFlags(flags, eor=False,
2178 ignore=getattr(socket, "MSG_TRUNC", 0))
2179
2180 # Receive all data with MSG_PEEK.
2181 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2182 len(MSG), 0,
2183 socket.MSG_PEEK)
2184 self.assertEqual(msg, MSG)
2185 self.checkRecvmsgAddress(addr, self.cli_addr)
2186 self.assertEqual(ancdata, [])
2187 self.checkFlags(flags, eor=True)
2188
2189 # Check that the same data can still be received normally.
2190 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2191 self.assertEqual(msg, MSG)
2192 self.checkRecvmsgAddress(addr, self.cli_addr)
2193 self.assertEqual(ancdata, [])
2194 self.checkFlags(flags, eor=True)
2195
2196 @testRecvmsgPeek.client_skip
2197 def _testRecvmsgPeek(self):
2198 self.sendToServer(MSG)
2199
2200 @requireAttrs(socket.socket, "sendmsg")
2201 def testRecvmsgFromSendmsg(self):
2202 # Test receiving with recvmsg[_into]() when message is sent
2203 # using sendmsg().
2204 self.serv_sock.settimeout(self.fail_timeout)
2205 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2206 self.assertEqual(msg, MSG)
2207 self.checkRecvmsgAddress(addr, self.cli_addr)
2208 self.assertEqual(ancdata, [])
2209 self.checkFlags(flags, eor=True)
2210
2211 @testRecvmsgFromSendmsg.client_skip
2212 def _testRecvmsgFromSendmsg(self):
2213 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2214
2215
2216class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2217 # Tests which require a stream socket and can use either recvmsg()
2218 # or recvmsg_into().
2219
2220 def testRecvmsgEOF(self):
2221 # Receive end-of-stream indicator (b"", peer socket closed).
2222 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2223 self.assertEqual(msg, b"")
2224 self.checkRecvmsgAddress(addr, self.cli_addr)
2225 self.assertEqual(ancdata, [])
2226 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2227
2228 def _testRecvmsgEOF(self):
2229 self.cli_sock.close()
2230
2231 def testRecvmsgOverflow(self):
2232 # Receive a message in more than one chunk.
2233 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2234 len(MSG) - 3)
2235 self.checkRecvmsgAddress(addr, self.cli_addr)
2236 self.assertEqual(ancdata, [])
2237 self.checkFlags(flags, eor=False)
2238
2239 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2240 self.checkRecvmsgAddress(addr, self.cli_addr)
2241 self.assertEqual(ancdata, [])
2242 self.checkFlags(flags, eor=True)
2243
2244 msg = seg1 + seg2
2245 self.assertEqual(msg, MSG)
2246
2247 def _testRecvmsgOverflow(self):
2248 self.sendToServer(MSG)
2249
2250
2251class RecvmsgTests(RecvmsgGenericTests):
2252 # Tests for recvmsg() which can use any socket type.
2253
2254 def testRecvmsgBadArgs(self):
2255 # Check that recvmsg() rejects invalid arguments.
2256 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2257 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2258 -1, 0, 0)
2259 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2260 len(MSG), -1, 0)
2261 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2262 [bytearray(10)], 0, 0)
2263 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2264 object(), 0, 0)
2265 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2266 len(MSG), object(), 0)
2267 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2268 len(MSG), 0, object())
2269
2270 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2271 self.assertEqual(msg, MSG)
2272 self.checkRecvmsgAddress(addr, self.cli_addr)
2273 self.assertEqual(ancdata, [])
2274 self.checkFlags(flags, eor=True)
2275
2276 def _testRecvmsgBadArgs(self):
2277 self.sendToServer(MSG)
2278
2279
2280class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2281 # Tests for recvmsg_into() which can use any socket type.
2282
2283 def testRecvmsgIntoBadArgs(self):
2284 # Check that recvmsg_into() rejects invalid arguments.
2285 buf = bytearray(len(MSG))
2286 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2287 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2288 len(MSG), 0, 0)
2289 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2290 buf, 0, 0)
2291 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2292 [object()], 0, 0)
2293 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2294 [b"I'm not writable"], 0, 0)
2295 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2296 [buf, object()], 0, 0)
2297 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2298 [buf], -1, 0)
2299 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2300 [buf], object(), 0)
2301 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2302 [buf], 0, object())
2303
2304 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2305 self.assertEqual(nbytes, len(MSG))
2306 self.assertEqual(buf, bytearray(MSG))
2307 self.checkRecvmsgAddress(addr, self.cli_addr)
2308 self.assertEqual(ancdata, [])
2309 self.checkFlags(flags, eor=True)
2310
2311 def _testRecvmsgIntoBadArgs(self):
2312 self.sendToServer(MSG)
2313
2314 def testRecvmsgIntoGenerator(self):
2315 # Receive into buffer obtained from a generator (not a sequence).
2316 buf = bytearray(len(MSG))
2317 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2318 (o for o in [buf]))
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 _testRecvmsgIntoGenerator(self):
2326 self.sendToServer(MSG)
2327
2328 def testRecvmsgIntoArray(self):
2329 # Receive into an array rather than the usual bytearray.
2330 buf = array.array("B", [0] * len(MSG))
2331 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2332 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002333 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002334 self.checkRecvmsgAddress(addr, self.cli_addr)
2335 self.assertEqual(ancdata, [])
2336 self.checkFlags(flags, eor=True)
2337
2338 def _testRecvmsgIntoArray(self):
2339 self.sendToServer(MSG)
2340
2341 def testRecvmsgIntoScatter(self):
2342 # Receive into multiple buffers (scatter write).
2343 b1 = bytearray(b"----")
2344 b2 = bytearray(b"0123456789")
2345 b3 = bytearray(b"--------------")
2346 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2347 [b1, memoryview(b2)[2:9], b3])
2348 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2349 self.assertEqual(b1, bytearray(b"Mary"))
2350 self.assertEqual(b2, bytearray(b"01 had a 9"))
2351 self.assertEqual(b3, bytearray(b"little lamb---"))
2352 self.checkRecvmsgAddress(addr, self.cli_addr)
2353 self.assertEqual(ancdata, [])
2354 self.checkFlags(flags, eor=True)
2355
2356 def _testRecvmsgIntoScatter(self):
2357 self.sendToServer(b"Mary had a little lamb")
2358
2359
2360class CmsgMacroTests(unittest.TestCase):
2361 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2362 # assumptions used by sendmsg() and recvmsg[_into](), which share
2363 # code with these functions.
2364
2365 # Match the definition in socketmodule.c
2366 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2367
2368 @requireAttrs(socket, "CMSG_LEN")
2369 def testCMSG_LEN(self):
2370 # Test CMSG_LEN() with various valid and invalid values,
2371 # checking the assumptions used by recvmsg() and sendmsg().
2372 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2373 values = list(range(257)) + list(range(toobig - 257, toobig))
2374
2375 # struct cmsghdr has at least three members, two of which are ints
2376 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2377 for n in values:
2378 ret = socket.CMSG_LEN(n)
2379 # This is how recvmsg() calculates the data size
2380 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2381 self.assertLessEqual(ret, self.socklen_t_limit)
2382
2383 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2384 # sendmsg() shares code with these functions, and requires
2385 # that it reject values over the limit.
2386 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2387 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2388
2389 @requireAttrs(socket, "CMSG_SPACE")
2390 def testCMSG_SPACE(self):
2391 # Test CMSG_SPACE() with various valid and invalid values,
2392 # checking the assumptions used by sendmsg().
2393 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2394 values = list(range(257)) + list(range(toobig - 257, toobig))
2395
2396 last = socket.CMSG_SPACE(0)
2397 # struct cmsghdr has at least three members, two of which are ints
2398 self.assertGreater(last, array.array("i").itemsize * 2)
2399 for n in values:
2400 ret = socket.CMSG_SPACE(n)
2401 self.assertGreaterEqual(ret, last)
2402 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2403 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2404 self.assertLessEqual(ret, self.socklen_t_limit)
2405 last = ret
2406
2407 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2408 # sendmsg() shares code with these functions, and requires
2409 # that it reject values over the limit.
2410 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2411 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2412
2413
2414class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2415 # Tests for file descriptor passing on Unix-domain sockets.
2416
2417 # Invalid file descriptor value that's unlikely to evaluate to a
2418 # real FD even if one of its bytes is replaced with a different
2419 # value (which shouldn't actually happen).
2420 badfd = -0x5555
2421
2422 def newFDs(self, n):
2423 # Return a list of n file descriptors for newly-created files
2424 # containing their list indices as ASCII numbers.
2425 fds = []
2426 for i in range(n):
2427 fd, path = tempfile.mkstemp()
2428 self.addCleanup(os.unlink, path)
2429 self.addCleanup(os.close, fd)
2430 os.write(fd, str(i).encode())
2431 fds.append(fd)
2432 return fds
2433
2434 def checkFDs(self, fds):
2435 # Check that the file descriptors in the given list contain
2436 # their correct list indices as ASCII numbers.
2437 for n, fd in enumerate(fds):
2438 os.lseek(fd, 0, os.SEEK_SET)
2439 self.assertEqual(os.read(fd, 1024), str(n).encode())
2440
2441 def registerRecvmsgResult(self, result):
2442 self.addCleanup(self.closeRecvmsgFDs, result)
2443
2444 def closeRecvmsgFDs(self, recvmsg_result):
2445 # Close all file descriptors specified in the ancillary data
2446 # of the given return value from recvmsg() or recvmsg_into().
2447 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2448 if (cmsg_level == socket.SOL_SOCKET and
2449 cmsg_type == socket.SCM_RIGHTS):
2450 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002451 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002452 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2453 for fd in fds:
2454 os.close(fd)
2455
2456 def createAndSendFDs(self, n):
2457 # Send n new file descriptors created by newFDs() to the
2458 # server, with the constant MSG as the non-ancillary data.
2459 self.assertEqual(
2460 self.sendmsgToServer([MSG],
2461 [(socket.SOL_SOCKET,
2462 socket.SCM_RIGHTS,
2463 array.array("i", self.newFDs(n)))]),
2464 len(MSG))
2465
2466 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2467 # Check that constant MSG was received with numfds file
2468 # descriptors in a maximum of maxcmsgs control messages (which
2469 # must contain only complete integers). By default, check
2470 # that MSG_CTRUNC is unset, but ignore any flags in
2471 # ignoreflags.
2472 msg, ancdata, flags, addr = result
2473 self.assertEqual(msg, MSG)
2474 self.checkRecvmsgAddress(addr, self.cli_addr)
2475 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2476 ignore=ignoreflags)
2477
2478 self.assertIsInstance(ancdata, list)
2479 self.assertLessEqual(len(ancdata), maxcmsgs)
2480 fds = array.array("i")
2481 for item in ancdata:
2482 self.assertIsInstance(item, tuple)
2483 cmsg_level, cmsg_type, cmsg_data = item
2484 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2485 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2486 self.assertIsInstance(cmsg_data, bytes)
2487 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002488 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002489
2490 self.assertEqual(len(fds), numfds)
2491 self.checkFDs(fds)
2492
2493 def testFDPassSimple(self):
2494 # Pass a single FD (array read from bytes object).
2495 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2496 len(MSG), 10240))
2497
2498 def _testFDPassSimple(self):
2499 self.assertEqual(
2500 self.sendmsgToServer(
2501 [MSG],
2502 [(socket.SOL_SOCKET,
2503 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002504 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002505 len(MSG))
2506
2507 def testMultipleFDPass(self):
2508 # Pass multiple FDs in a single array.
2509 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2510 len(MSG), 10240))
2511
2512 def _testMultipleFDPass(self):
2513 self.createAndSendFDs(4)
2514
2515 @requireAttrs(socket, "CMSG_SPACE")
2516 def testFDPassCMSG_SPACE(self):
2517 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2518 self.checkRecvmsgFDs(
2519 4, self.doRecvmsg(self.serv_sock, len(MSG),
2520 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2521
2522 @testFDPassCMSG_SPACE.client_skip
2523 def _testFDPassCMSG_SPACE(self):
2524 self.createAndSendFDs(4)
2525
2526 def testFDPassCMSG_LEN(self):
2527 # Test using CMSG_LEN() to calculate ancillary buffer size.
2528 self.checkRecvmsgFDs(1,
2529 self.doRecvmsg(self.serv_sock, len(MSG),
2530 socket.CMSG_LEN(4 * SIZEOF_INT)),
2531 # RFC 3542 says implementations may set
2532 # MSG_CTRUNC if there isn't enough space
2533 # for trailing padding.
2534 ignoreflags=socket.MSG_CTRUNC)
2535
2536 def _testFDPassCMSG_LEN(self):
2537 self.createAndSendFDs(1)
2538
Charles-Francois Natalidd225e42013-05-20 19:08:19 +02002539 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002540 @requireAttrs(socket, "CMSG_SPACE")
2541 def testFDPassSeparate(self):
2542 # Pass two FDs in two separate arrays. Arrays may be combined
2543 # into a single control message by the OS.
2544 self.checkRecvmsgFDs(2,
2545 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2546 maxcmsgs=2)
2547
2548 @testFDPassSeparate.client_skip
Charles-Francois Natalidd225e42013-05-20 19:08:19 +02002549 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002550 def _testFDPassSeparate(self):
2551 fd0, fd1 = self.newFDs(2)
2552 self.assertEqual(
2553 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2554 socket.SCM_RIGHTS,
2555 array.array("i", [fd0])),
2556 (socket.SOL_SOCKET,
2557 socket.SCM_RIGHTS,
2558 array.array("i", [fd1]))]),
2559 len(MSG))
2560
Charles-Francois Natalidd225e42013-05-20 19:08:19 +02002561 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002562 @requireAttrs(socket, "CMSG_SPACE")
2563 def testFDPassSeparateMinSpace(self):
2564 # Pass two FDs in two separate arrays, receiving them into the
2565 # minimum space for two arrays.
2566 self.checkRecvmsgFDs(2,
2567 self.doRecvmsg(self.serv_sock, len(MSG),
2568 socket.CMSG_SPACE(SIZEOF_INT) +
2569 socket.CMSG_LEN(SIZEOF_INT)),
2570 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2571
2572 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalidd225e42013-05-20 19:08:19 +02002573 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002574 def _testFDPassSeparateMinSpace(self):
2575 fd0, fd1 = self.newFDs(2)
2576 self.assertEqual(
2577 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2578 socket.SCM_RIGHTS,
2579 array.array("i", [fd0])),
2580 (socket.SOL_SOCKET,
2581 socket.SCM_RIGHTS,
2582 array.array("i", [fd1]))]),
2583 len(MSG))
2584
2585 def sendAncillaryIfPossible(self, msg, ancdata):
2586 # Try to send msg and ancdata to server, but if the system
2587 # call fails, just send msg with no ancillary data.
2588 try:
2589 nbytes = self.sendmsgToServer([msg], ancdata)
2590 except socket.error as e:
2591 # Check that it was the system call that failed
2592 self.assertIsInstance(e.errno, int)
2593 nbytes = self.sendmsgToServer([msg])
2594 self.assertEqual(nbytes, len(msg))
2595
2596 def testFDPassEmpty(self):
2597 # Try to pass an empty FD array. Can receive either no array
2598 # or an empty array.
2599 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2600 len(MSG), 10240),
2601 ignoreflags=socket.MSG_CTRUNC)
2602
2603 def _testFDPassEmpty(self):
2604 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2605 socket.SCM_RIGHTS,
2606 b"")])
2607
2608 def testFDPassPartialInt(self):
2609 # Try to pass a truncated FD array.
2610 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2611 len(MSG), 10240)
2612 self.assertEqual(msg, MSG)
2613 self.checkRecvmsgAddress(addr, self.cli_addr)
2614 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2615 self.assertLessEqual(len(ancdata), 1)
2616 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2617 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2618 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2619 self.assertLess(len(cmsg_data), SIZEOF_INT)
2620
2621 def _testFDPassPartialInt(self):
2622 self.sendAncillaryIfPossible(
2623 MSG,
2624 [(socket.SOL_SOCKET,
2625 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002626 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002627
2628 @requireAttrs(socket, "CMSG_SPACE")
2629 def testFDPassPartialIntInMiddle(self):
2630 # Try to pass two FD arrays, the first of which is truncated.
2631 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2632 len(MSG), 10240)
2633 self.assertEqual(msg, MSG)
2634 self.checkRecvmsgAddress(addr, self.cli_addr)
2635 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2636 self.assertLessEqual(len(ancdata), 2)
2637 fds = array.array("i")
2638 # Arrays may have been combined in a single control message
2639 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2640 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2641 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002642 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002643 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2644 self.assertLessEqual(len(fds), 2)
2645 self.checkFDs(fds)
2646
2647 @testFDPassPartialIntInMiddle.client_skip
2648 def _testFDPassPartialIntInMiddle(self):
2649 fd0, fd1 = self.newFDs(2)
2650 self.sendAncillaryIfPossible(
2651 MSG,
2652 [(socket.SOL_SOCKET,
2653 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002654 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002655 (socket.SOL_SOCKET,
2656 socket.SCM_RIGHTS,
2657 array.array("i", [fd1]))])
2658
2659 def checkTruncatedHeader(self, result, ignoreflags=0):
2660 # Check that no ancillary data items are returned when data is
2661 # truncated inside the cmsghdr structure.
2662 msg, ancdata, flags, addr = result
2663 self.assertEqual(msg, MSG)
2664 self.checkRecvmsgAddress(addr, self.cli_addr)
2665 self.assertEqual(ancdata, [])
2666 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2667 ignore=ignoreflags)
2668
2669 def testCmsgTruncNoBufSize(self):
2670 # Check that no ancillary data is received when no buffer size
2671 # is specified.
2672 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2673 # BSD seems to set MSG_CTRUNC only
2674 # if an item has been partially
2675 # received.
2676 ignoreflags=socket.MSG_CTRUNC)
2677
2678 def _testCmsgTruncNoBufSize(self):
2679 self.createAndSendFDs(1)
2680
2681 def testCmsgTrunc0(self):
2682 # Check that no ancillary data is received when buffer size is 0.
2683 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2684 ignoreflags=socket.MSG_CTRUNC)
2685
2686 def _testCmsgTrunc0(self):
2687 self.createAndSendFDs(1)
2688
2689 # Check that no ancillary data is returned for various non-zero
2690 # (but still too small) buffer sizes.
2691
2692 def testCmsgTrunc1(self):
2693 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2694
2695 def _testCmsgTrunc1(self):
2696 self.createAndSendFDs(1)
2697
2698 def testCmsgTrunc2Int(self):
2699 # The cmsghdr structure has at least three members, two of
2700 # which are ints, so we still shouldn't see any ancillary
2701 # data.
2702 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2703 SIZEOF_INT * 2))
2704
2705 def _testCmsgTrunc2Int(self):
2706 self.createAndSendFDs(1)
2707
2708 def testCmsgTruncLen0Minus1(self):
2709 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2710 socket.CMSG_LEN(0) - 1))
2711
2712 def _testCmsgTruncLen0Minus1(self):
2713 self.createAndSendFDs(1)
2714
2715 # The following tests try to truncate the control message in the
2716 # middle of the FD array.
2717
2718 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2719 # Check that file descriptor data is truncated to between
2720 # mindata and maxdata bytes when received with buffer size
2721 # ancbuf, and that any complete file descriptor numbers are
2722 # valid.
2723 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2724 len(MSG), ancbuf)
2725 self.assertEqual(msg, MSG)
2726 self.checkRecvmsgAddress(addr, self.cli_addr)
2727 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2728
2729 if mindata == 0 and ancdata == []:
2730 return
2731 self.assertEqual(len(ancdata), 1)
2732 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2733 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2734 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2735 self.assertGreaterEqual(len(cmsg_data), mindata)
2736 self.assertLessEqual(len(cmsg_data), maxdata)
2737 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002738 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002739 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2740 self.checkFDs(fds)
2741
2742 def testCmsgTruncLen0(self):
2743 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2744
2745 def _testCmsgTruncLen0(self):
2746 self.createAndSendFDs(1)
2747
2748 def testCmsgTruncLen0Plus1(self):
2749 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2750
2751 def _testCmsgTruncLen0Plus1(self):
2752 self.createAndSendFDs(2)
2753
2754 def testCmsgTruncLen1(self):
2755 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2756 maxdata=SIZEOF_INT)
2757
2758 def _testCmsgTruncLen1(self):
2759 self.createAndSendFDs(2)
2760
2761 def testCmsgTruncLen2Minus1(self):
2762 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2763 maxdata=(2 * SIZEOF_INT) - 1)
2764
2765 def _testCmsgTruncLen2Minus1(self):
2766 self.createAndSendFDs(2)
2767
2768
2769class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2770 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2771 # features of the RFC 3542 Advanced Sockets API for IPv6.
2772 # Currently we can only handle certain data items (e.g. traffic
2773 # class, hop limit, MTU discovery and fragmentation settings)
2774 # without resorting to unportable means such as the struct module,
2775 # but the tests here are aimed at testing the ancillary data
2776 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2777 # itself.
2778
2779 # Test value to use when setting hop limit of packet
2780 hop_limit = 2
2781
2782 # Test value to use when setting traffic class of packet.
2783 # -1 means "use kernel default".
2784 traffic_class = -1
2785
2786 def ancillaryMapping(self, ancdata):
2787 # Given ancillary data list ancdata, return a mapping from
2788 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2789 # Check that no (level, type) pair appears more than once.
2790 d = {}
2791 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2792 self.assertNotIn((cmsg_level, cmsg_type), d)
2793 d[(cmsg_level, cmsg_type)] = cmsg_data
2794 return d
2795
2796 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2797 # Receive hop limit into ancbufsize bytes of ancillary data
2798 # space. Check that data is MSG, ancillary data is not
2799 # truncated (but ignore any flags in ignoreflags), and hop
2800 # limit is between 0 and maxhop inclusive.
2801 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2802 socket.IPV6_RECVHOPLIMIT, 1)
2803 self.misc_event.set()
2804 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2805 len(MSG), ancbufsize)
2806
2807 self.assertEqual(msg, MSG)
2808 self.checkRecvmsgAddress(addr, self.cli_addr)
2809 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2810 ignore=ignoreflags)
2811
2812 self.assertEqual(len(ancdata), 1)
2813 self.assertIsInstance(ancdata[0], tuple)
2814 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2815 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2816 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2817 self.assertIsInstance(cmsg_data, bytes)
2818 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2819 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002820 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002821 self.assertGreaterEqual(a[0], 0)
2822 self.assertLessEqual(a[0], maxhop)
2823
2824 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2825 def testRecvHopLimit(self):
2826 # Test receiving the packet hop limit as ancillary data.
2827 self.checkHopLimit(ancbufsize=10240)
2828
2829 @testRecvHopLimit.client_skip
2830 def _testRecvHopLimit(self):
2831 # Need to wait until server has asked to receive ancillary
2832 # data, as implementations are not required to buffer it
2833 # otherwise.
2834 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2835 self.sendToServer(MSG)
2836
2837 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2838 def testRecvHopLimitCMSG_SPACE(self):
2839 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2840 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2841
2842 @testRecvHopLimitCMSG_SPACE.client_skip
2843 def _testRecvHopLimitCMSG_SPACE(self):
2844 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2845 self.sendToServer(MSG)
2846
2847 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2848 # 3542 says portable applications must provide space for trailing
2849 # padding. Implementations may set MSG_CTRUNC if there isn't
2850 # enough space for the padding.
2851
2852 @requireAttrs(socket.socket, "sendmsg")
2853 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2854 def testSetHopLimit(self):
2855 # Test setting hop limit on outgoing packet and receiving it
2856 # at the other end.
2857 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2858
2859 @testSetHopLimit.client_skip
2860 def _testSetHopLimit(self):
2861 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2862 self.assertEqual(
2863 self.sendmsgToServer([MSG],
2864 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2865 array.array("i", [self.hop_limit]))]),
2866 len(MSG))
2867
2868 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2869 ignoreflags=0):
2870 # Receive traffic class and hop limit into ancbufsize bytes of
2871 # ancillary data space. Check that data is MSG, ancillary
2872 # data is not truncated (but ignore any flags in ignoreflags),
2873 # and traffic class and hop limit are in range (hop limit no
2874 # more than maxhop).
2875 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2876 socket.IPV6_RECVHOPLIMIT, 1)
2877 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2878 socket.IPV6_RECVTCLASS, 1)
2879 self.misc_event.set()
2880 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2881 len(MSG), ancbufsize)
2882
2883 self.assertEqual(msg, MSG)
2884 self.checkRecvmsgAddress(addr, self.cli_addr)
2885 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2886 ignore=ignoreflags)
2887 self.assertEqual(len(ancdata), 2)
2888 ancmap = self.ancillaryMapping(ancdata)
2889
2890 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2891 self.assertEqual(len(tcdata), SIZEOF_INT)
2892 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002893 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002894 self.assertGreaterEqual(a[0], 0)
2895 self.assertLessEqual(a[0], 255)
2896
2897 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2898 self.assertEqual(len(hldata), SIZEOF_INT)
2899 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002900 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002901 self.assertGreaterEqual(a[0], 0)
2902 self.assertLessEqual(a[0], maxhop)
2903
2904 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2905 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2906 def testRecvTrafficClassAndHopLimit(self):
2907 # Test receiving traffic class and hop limit as ancillary data.
2908 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2909
2910 @testRecvTrafficClassAndHopLimit.client_skip
2911 def _testRecvTrafficClassAndHopLimit(self):
2912 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2913 self.sendToServer(MSG)
2914
2915 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2916 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2917 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2918 # Test receiving traffic class and hop limit, using
2919 # CMSG_SPACE() to calculate buffer size.
2920 self.checkTrafficClassAndHopLimit(
2921 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2922
2923 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2924 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2925 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2926 self.sendToServer(MSG)
2927
2928 @requireAttrs(socket.socket, "sendmsg")
2929 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2930 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2931 def testSetTrafficClassAndHopLimit(self):
2932 # Test setting traffic class and hop limit on outgoing packet,
2933 # and receiving them at the other end.
2934 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2935 maxhop=self.hop_limit)
2936
2937 @testSetTrafficClassAndHopLimit.client_skip
2938 def _testSetTrafficClassAndHopLimit(self):
2939 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2940 self.assertEqual(
2941 self.sendmsgToServer([MSG],
2942 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2943 array.array("i", [self.traffic_class])),
2944 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2945 array.array("i", [self.hop_limit]))]),
2946 len(MSG))
2947
2948 @requireAttrs(socket.socket, "sendmsg")
2949 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2950 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2951 def testOddCmsgSize(self):
2952 # Try to send ancillary data with first item one byte too
2953 # long. Fall back to sending with correct size if this fails,
2954 # and check that second item was handled correctly.
2955 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2956 maxhop=self.hop_limit)
2957
2958 @testOddCmsgSize.client_skip
2959 def _testOddCmsgSize(self):
2960 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2961 try:
2962 nbytes = self.sendmsgToServer(
2963 [MSG],
2964 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002965 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002966 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2967 array.array("i", [self.hop_limit]))])
2968 except socket.error as e:
2969 self.assertIsInstance(e.errno, int)
2970 nbytes = self.sendmsgToServer(
2971 [MSG],
2972 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2973 array.array("i", [self.traffic_class])),
2974 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2975 array.array("i", [self.hop_limit]))])
2976 self.assertEqual(nbytes, len(MSG))
2977
2978 # Tests for proper handling of truncated ancillary data
2979
2980 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2981 # Receive hop limit into ancbufsize bytes of ancillary data
2982 # space, which should be too small to contain the ancillary
2983 # data header (if ancbufsize is None, pass no second argument
2984 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2985 # (unless included in ignoreflags), and no ancillary data is
2986 # returned.
2987 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2988 socket.IPV6_RECVHOPLIMIT, 1)
2989 self.misc_event.set()
2990 args = () if ancbufsize is None else (ancbufsize,)
2991 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2992 len(MSG), *args)
2993
2994 self.assertEqual(msg, MSG)
2995 self.checkRecvmsgAddress(addr, self.cli_addr)
2996 self.assertEqual(ancdata, [])
2997 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2998 ignore=ignoreflags)
2999
3000 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3001 def testCmsgTruncNoBufSize(self):
3002 # Check that no ancillary data is received when no ancillary
3003 # buffer size is provided.
3004 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3005 # BSD seems to set
3006 # MSG_CTRUNC only if an item
3007 # has been partially
3008 # received.
3009 ignoreflags=socket.MSG_CTRUNC)
3010
3011 @testCmsgTruncNoBufSize.client_skip
3012 def _testCmsgTruncNoBufSize(self):
3013 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3014 self.sendToServer(MSG)
3015
3016 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3017 def testSingleCmsgTrunc0(self):
3018 # Check that no ancillary data is received when ancillary
3019 # buffer size is zero.
3020 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3021 ignoreflags=socket.MSG_CTRUNC)
3022
3023 @testSingleCmsgTrunc0.client_skip
3024 def _testSingleCmsgTrunc0(self):
3025 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3026 self.sendToServer(MSG)
3027
3028 # Check that no ancillary data is returned for various non-zero
3029 # (but still too small) buffer sizes.
3030
3031 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3032 def testSingleCmsgTrunc1(self):
3033 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3034
3035 @testSingleCmsgTrunc1.client_skip
3036 def _testSingleCmsgTrunc1(self):
3037 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3038 self.sendToServer(MSG)
3039
3040 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3041 def testSingleCmsgTrunc2Int(self):
3042 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3043
3044 @testSingleCmsgTrunc2Int.client_skip
3045 def _testSingleCmsgTrunc2Int(self):
3046 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3047 self.sendToServer(MSG)
3048
3049 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3050 def testSingleCmsgTruncLen0Minus1(self):
3051 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3052
3053 @testSingleCmsgTruncLen0Minus1.client_skip
3054 def _testSingleCmsgTruncLen0Minus1(self):
3055 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3056 self.sendToServer(MSG)
3057
3058 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3059 def testSingleCmsgTruncInData(self):
3060 # Test truncation of a control message inside its associated
3061 # data. The message may be returned with its data truncated,
3062 # or not returned at all.
3063 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3064 socket.IPV6_RECVHOPLIMIT, 1)
3065 self.misc_event.set()
3066 msg, ancdata, flags, addr = self.doRecvmsg(
3067 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3068
3069 self.assertEqual(msg, MSG)
3070 self.checkRecvmsgAddress(addr, self.cli_addr)
3071 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3072
3073 self.assertLessEqual(len(ancdata), 1)
3074 if ancdata:
3075 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3076 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3077 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3078 self.assertLess(len(cmsg_data), SIZEOF_INT)
3079
3080 @testSingleCmsgTruncInData.client_skip
3081 def _testSingleCmsgTruncInData(self):
3082 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3083 self.sendToServer(MSG)
3084
3085 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3086 # Receive traffic class and hop limit into ancbufsize bytes of
3087 # ancillary data space, which should be large enough to
3088 # contain the first item, but too small to contain the header
3089 # of the second. Check that data is MSG, MSG_CTRUNC is set
3090 # (unless included in ignoreflags), and only one ancillary
3091 # data item is returned.
3092 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3093 socket.IPV6_RECVHOPLIMIT, 1)
3094 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3095 socket.IPV6_RECVTCLASS, 1)
3096 self.misc_event.set()
3097 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3098 len(MSG), ancbufsize)
3099
3100 self.assertEqual(msg, MSG)
3101 self.checkRecvmsgAddress(addr, self.cli_addr)
3102 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3103 ignore=ignoreflags)
3104
3105 self.assertEqual(len(ancdata), 1)
3106 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3107 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3108 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3109 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3110 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003111 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003112 self.assertGreaterEqual(a[0], 0)
3113 self.assertLessEqual(a[0], 255)
3114
3115 # Try the above test with various buffer sizes.
3116
3117 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3118 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3119 def testSecondCmsgTrunc0(self):
3120 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3121 ignoreflags=socket.MSG_CTRUNC)
3122
3123 @testSecondCmsgTrunc0.client_skip
3124 def _testSecondCmsgTrunc0(self):
3125 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3126 self.sendToServer(MSG)
3127
3128 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3129 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3130 def testSecondCmsgTrunc1(self):
3131 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3132
3133 @testSecondCmsgTrunc1.client_skip
3134 def _testSecondCmsgTrunc1(self):
3135 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3136 self.sendToServer(MSG)
3137
3138 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3139 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3140 def testSecondCmsgTrunc2Int(self):
3141 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3142 2 * SIZEOF_INT)
3143
3144 @testSecondCmsgTrunc2Int.client_skip
3145 def _testSecondCmsgTrunc2Int(self):
3146 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3147 self.sendToServer(MSG)
3148
3149 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3150 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3151 def testSecondCmsgTruncLen0Minus1(self):
3152 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3153 socket.CMSG_LEN(0) - 1)
3154
3155 @testSecondCmsgTruncLen0Minus1.client_skip
3156 def _testSecondCmsgTruncLen0Minus1(self):
3157 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3158 self.sendToServer(MSG)
3159
3160 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3161 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3162 def testSecomdCmsgTruncInData(self):
3163 # Test truncation of the second of two control messages inside
3164 # its associated data.
3165 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3166 socket.IPV6_RECVHOPLIMIT, 1)
3167 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3168 socket.IPV6_RECVTCLASS, 1)
3169 self.misc_event.set()
3170 msg, ancdata, flags, addr = self.doRecvmsg(
3171 self.serv_sock, len(MSG),
3172 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3173
3174 self.assertEqual(msg, MSG)
3175 self.checkRecvmsgAddress(addr, self.cli_addr)
3176 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3177
3178 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3179
3180 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3181 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3182 cmsg_types.remove(cmsg_type)
3183 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3184 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003185 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003186 self.assertGreaterEqual(a[0], 0)
3187 self.assertLessEqual(a[0], 255)
3188
3189 if ancdata:
3190 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3191 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3192 cmsg_types.remove(cmsg_type)
3193 self.assertLess(len(cmsg_data), SIZEOF_INT)
3194
3195 self.assertEqual(ancdata, [])
3196
3197 @testSecomdCmsgTruncInData.client_skip
3198 def _testSecomdCmsgTruncInData(self):
3199 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3200 self.sendToServer(MSG)
3201
3202
3203# Derive concrete test classes for different socket types.
3204
3205class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3206 SendrecvmsgConnectionlessBase,
3207 ThreadedSocketTestMixin, UDPTestBase):
3208 pass
3209
3210@requireAttrs(socket.socket, "sendmsg")
3211@unittest.skipUnless(thread, 'Threading required for this test.')
3212class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3213 pass
3214
3215@requireAttrs(socket.socket, "recvmsg")
3216@unittest.skipUnless(thread, 'Threading required for this test.')
3217class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3218 pass
3219
3220@requireAttrs(socket.socket, "recvmsg_into")
3221@unittest.skipUnless(thread, 'Threading required for this test.')
3222class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3223 pass
3224
3225
3226class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3227 SendrecvmsgConnectionlessBase,
3228 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003229
3230 def checkRecvmsgAddress(self, addr1, addr2):
3231 # Called to compare the received address with the address of
3232 # the peer, ignoring scope ID
3233 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003234
3235@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003236@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003237@requireSocket("AF_INET6", "SOCK_DGRAM")
3238@unittest.skipUnless(thread, 'Threading required for this test.')
3239class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3240 pass
3241
3242@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003243@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003244@requireSocket("AF_INET6", "SOCK_DGRAM")
3245@unittest.skipUnless(thread, 'Threading required for this test.')
3246class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3247 pass
3248
3249@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003250@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003251@requireSocket("AF_INET6", "SOCK_DGRAM")
3252@unittest.skipUnless(thread, 'Threading required for this test.')
3253class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3254 pass
3255
3256@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003257@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003258@requireAttrs(socket, "IPPROTO_IPV6")
3259@requireSocket("AF_INET6", "SOCK_DGRAM")
3260@unittest.skipUnless(thread, 'Threading required for this test.')
3261class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3262 SendrecvmsgUDP6TestBase):
3263 pass
3264
3265@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003266@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003267@requireAttrs(socket, "IPPROTO_IPV6")
3268@requireSocket("AF_INET6", "SOCK_DGRAM")
3269@unittest.skipUnless(thread, 'Threading required for this test.')
3270class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3271 RFC3542AncillaryTest,
3272 SendrecvmsgUDP6TestBase):
3273 pass
3274
3275
3276class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3277 ConnectedStreamTestMixin, TCPTestBase):
3278 pass
3279
3280@requireAttrs(socket.socket, "sendmsg")
3281@unittest.skipUnless(thread, 'Threading required for this test.')
3282class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3283 pass
3284
3285@requireAttrs(socket.socket, "recvmsg")
3286@unittest.skipUnless(thread, 'Threading required for this test.')
3287class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3288 SendrecvmsgTCPTestBase):
3289 pass
3290
3291@requireAttrs(socket.socket, "recvmsg_into")
3292@unittest.skipUnless(thread, 'Threading required for this test.')
3293class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3294 SendrecvmsgTCPTestBase):
3295 pass
3296
3297
3298class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3299 SendrecvmsgConnectedBase,
3300 ConnectedStreamTestMixin, SCTPStreamBase):
3301 pass
3302
3303@requireAttrs(socket.socket, "sendmsg")
3304@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3305@unittest.skipUnless(thread, 'Threading required for this test.')
3306class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3307 pass
3308
3309@requireAttrs(socket.socket, "recvmsg")
3310@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3311@unittest.skipUnless(thread, 'Threading required for this test.')
3312class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3313 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003314
3315 def testRecvmsgEOF(self):
3316 try:
3317 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3318 except OSError as e:
3319 if e.errno != errno.ENOTCONN:
3320 raise
3321 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003322
3323@requireAttrs(socket.socket, "recvmsg_into")
3324@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3325@unittest.skipUnless(thread, 'Threading required for this test.')
3326class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3327 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003328
3329 def testRecvmsgEOF(self):
3330 try:
3331 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3332 except OSError as e:
3333 if e.errno != errno.ENOTCONN:
3334 raise
3335 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003336
3337
3338class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3339 ConnectedStreamTestMixin, UnixStreamBase):
3340 pass
3341
3342@requireAttrs(socket.socket, "sendmsg")
3343@requireAttrs(socket, "AF_UNIX")
3344@unittest.skipUnless(thread, 'Threading required for this test.')
3345class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3346 pass
3347
3348@requireAttrs(socket.socket, "recvmsg")
3349@requireAttrs(socket, "AF_UNIX")
3350@unittest.skipUnless(thread, 'Threading required for this test.')
3351class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3352 SendrecvmsgUnixStreamTestBase):
3353 pass
3354
3355@requireAttrs(socket.socket, "recvmsg_into")
3356@requireAttrs(socket, "AF_UNIX")
3357@unittest.skipUnless(thread, 'Threading required for this test.')
3358class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3359 SendrecvmsgUnixStreamTestBase):
3360 pass
3361
3362@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3363@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3364@unittest.skipUnless(thread, 'Threading required for this test.')
3365class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3366 pass
3367
3368@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3369@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3370@unittest.skipUnless(thread, 'Threading required for this test.')
3371class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3372 SendrecvmsgUnixStreamTestBase):
3373 pass
3374
3375
3376# Test interrupting the interruptible send/receive methods with a
3377# signal when a timeout is set. These tests avoid having multiple
3378# threads alive during the test so that the OS cannot deliver the
3379# signal to the wrong one.
3380
3381class InterruptedTimeoutBase(unittest.TestCase):
3382 # Base class for interrupted send/receive tests. Installs an
3383 # empty handler for SIGALRM and removes it on teardown, along with
3384 # any scheduled alarms.
3385
3386 def setUp(self):
3387 super().setUp()
3388 orig_alrm_handler = signal.signal(signal.SIGALRM,
3389 lambda signum, frame: None)
3390 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3391 self.addCleanup(self.setAlarm, 0)
3392
3393 # Timeout for socket operations
3394 timeout = 4.0
3395
3396 # Provide setAlarm() method to schedule delivery of SIGALRM after
3397 # given number of seconds, or cancel it if zero, and an
3398 # appropriate time value to use. Use setitimer() if available.
3399 if hasattr(signal, "setitimer"):
3400 alarm_time = 0.05
3401
3402 def setAlarm(self, seconds):
3403 signal.setitimer(signal.ITIMER_REAL, seconds)
3404 else:
3405 # Old systems may deliver the alarm up to one second early
3406 alarm_time = 2
3407
3408 def setAlarm(self, seconds):
3409 signal.alarm(seconds)
3410
3411
3412# Require siginterrupt() in order to ensure that system calls are
3413# interrupted by default.
3414@requireAttrs(signal, "siginterrupt")
3415@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3416 "Don't have signal.alarm or signal.setitimer")
3417class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3418 # Test interrupting the recv*() methods with signals when a
3419 # timeout is set.
3420
3421 def setUp(self):
3422 super().setUp()
3423 self.serv.settimeout(self.timeout)
3424
3425 def checkInterruptedRecv(self, func, *args, **kwargs):
3426 # Check that func(*args, **kwargs) raises socket.error with an
3427 # errno of EINTR when interrupted by a signal.
3428 self.setAlarm(self.alarm_time)
3429 with self.assertRaises(socket.error) as cm:
3430 func(*args, **kwargs)
3431 self.assertNotIsInstance(cm.exception, socket.timeout)
3432 self.assertEqual(cm.exception.errno, errno.EINTR)
3433
3434 def testInterruptedRecvTimeout(self):
3435 self.checkInterruptedRecv(self.serv.recv, 1024)
3436
3437 def testInterruptedRecvIntoTimeout(self):
3438 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3439
3440 def testInterruptedRecvfromTimeout(self):
3441 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3442
3443 def testInterruptedRecvfromIntoTimeout(self):
3444 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3445
3446 @requireAttrs(socket.socket, "recvmsg")
3447 def testInterruptedRecvmsgTimeout(self):
3448 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3449
3450 @requireAttrs(socket.socket, "recvmsg_into")
3451 def testInterruptedRecvmsgIntoTimeout(self):
3452 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3453
3454
3455# Require siginterrupt() in order to ensure that system calls are
3456# interrupted by default.
3457@requireAttrs(signal, "siginterrupt")
3458@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3459 "Don't have signal.alarm or signal.setitimer")
3460@unittest.skipUnless(thread, 'Threading required for this test.')
3461class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3462 ThreadSafeCleanupTestCase,
3463 SocketListeningTestMixin, TCPTestBase):
3464 # Test interrupting the interruptible send*() methods with signals
3465 # when a timeout is set.
3466
3467 def setUp(self):
3468 super().setUp()
3469 self.serv_conn = self.newSocket()
3470 self.addCleanup(self.serv_conn.close)
3471 # Use a thread to complete the connection, but wait for it to
3472 # terminate before running the test, so that there is only one
3473 # thread to accept the signal.
3474 cli_thread = threading.Thread(target=self.doConnect)
3475 cli_thread.start()
3476 self.cli_conn, addr = self.serv.accept()
3477 self.addCleanup(self.cli_conn.close)
3478 cli_thread.join()
3479 self.serv_conn.settimeout(self.timeout)
3480
3481 def doConnect(self):
3482 self.serv_conn.connect(self.serv_addr)
3483
3484 def checkInterruptedSend(self, func, *args, **kwargs):
3485 # Check that func(*args, **kwargs), run in a loop, raises
3486 # socket.error with an errno of EINTR when interrupted by a
3487 # signal.
3488 with self.assertRaises(socket.error) as cm:
3489 while True:
3490 self.setAlarm(self.alarm_time)
3491 func(*args, **kwargs)
3492 self.assertNotIsInstance(cm.exception, socket.timeout)
3493 self.assertEqual(cm.exception.errno, errno.EINTR)
3494
Nick Coghlan2496f332011-09-19 20:26:31 +10003495 # Issue #12958: The following tests have problems on Mac OS X
3496 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003497 def testInterruptedSendTimeout(self):
3498 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3499
Nick Coghlan2496f332011-09-19 20:26:31 +10003500 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003501 def testInterruptedSendtoTimeout(self):
3502 # Passing an actual address here as Python's wrapper for
3503 # sendto() doesn't allow passing a zero-length one; POSIX
3504 # requires that the address is ignored since the socket is
3505 # connection-mode, however.
3506 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3507 self.serv_addr)
3508
Nick Coghlan2496f332011-09-19 20:26:31 +10003509 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003510 @requireAttrs(socket.socket, "sendmsg")
3511 def testInterruptedSendmsgTimeout(self):
3512 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3513
3514
Victor Stinner45df8202010-04-28 22:31:17 +00003515@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003516class TCPCloserTest(ThreadedTCPSocketTest):
3517
3518 def testClose(self):
3519 conn, addr = self.serv.accept()
3520 conn.close()
3521
3522 sd = self.cli
3523 read, write, err = select.select([sd], [], [], 1.0)
3524 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003525 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003526
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003527 # Calling close() many times should be safe.
3528 conn.close()
3529 conn.close()
3530
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003531 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003532 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003533 time.sleep(1.0)
3534
Serhiy Storchaka79080682013-11-03 21:31:18 +02003535@unittest.skipUnless(hasattr(socket, 'socketpair'),
3536 'test needs socket.socketpair()')
Victor Stinner45df8202010-04-28 22:31:17 +00003537@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003538class BasicSocketPairTest(SocketPairTest):
3539
3540 def __init__(self, methodName='runTest'):
3541 SocketPairTest.__init__(self, methodName=methodName)
3542
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003543 def _check_defaults(self, sock):
3544 self.assertIsInstance(sock, socket.socket)
3545 if hasattr(socket, 'AF_UNIX'):
3546 self.assertEqual(sock.family, socket.AF_UNIX)
3547 else:
3548 self.assertEqual(sock.family, socket.AF_INET)
3549 self.assertEqual(sock.type, socket.SOCK_STREAM)
3550 self.assertEqual(sock.proto, 0)
3551
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003552 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003553 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003554
3555 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003556 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003557
Dave Cole331708b2004-08-09 04:51:41 +00003558 def testRecv(self):
3559 msg = self.serv.recv(1024)
3560 self.assertEqual(msg, MSG)
3561
3562 def _testRecv(self):
3563 self.cli.send(MSG)
3564
3565 def testSend(self):
3566 self.serv.send(MSG)
3567
3568 def _testSend(self):
3569 msg = self.cli.recv(1024)
3570 self.assertEqual(msg, MSG)
3571
Victor Stinner45df8202010-04-28 22:31:17 +00003572@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003573class NonBlockingTCPTests(ThreadedTCPSocketTest):
3574
3575 def __init__(self, methodName='runTest'):
3576 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3577
3578 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003579 # Testing whether set blocking works
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02003580 self.serv.setblocking(True)
3581 self.assertIsNone(self.serv.gettimeout())
3582 self.serv.setblocking(False)
3583 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003584 start = time.time()
3585 try:
3586 self.serv.accept()
3587 except socket.error:
3588 pass
3589 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003590 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02003591 # Issue 15989
3592 if _testcapi.UINT_MAX < _testcapi.ULONG_MAX:
3593 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3594 self.assertIsNone(self.serv.gettimeout())
Guido van Rossum24e4af82002-06-12 19:18:08 +00003595
3596 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003597 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003598
Serhiy Storchaka79080682013-11-03 21:31:18 +02003599 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3600 'test needs socket.SOCK_NONBLOCK')
3601 @support.requires_linux_version(2, 6, 28)
3602 def testInitNonBlocking(self):
3603 # reinit server socket
3604 self.serv.close()
3605 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3606 socket.SOCK_NONBLOCK)
3607 self.port = support.bind_port(self.serv)
3608 self.serv.listen(1)
3609 # actual testing
3610 start = time.time()
3611 try:
3612 self.serv.accept()
3613 except socket.error:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003614 pass
Serhiy Storchaka79080682013-11-03 21:31:18 +02003615 end = time.time()
3616 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3617
3618 def _testInitNonBlocking(self):
3619 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003620
Antoine Pitrou600232b2011-01-05 21:03:42 +00003621 def testInheritFlags(self):
3622 # Issue #7995: when calling accept() on a listening socket with a
3623 # timeout, the resulting socket should not be non-blocking.
3624 self.serv.settimeout(10)
3625 try:
3626 conn, addr = self.serv.accept()
3627 message = conn.recv(len(MSG))
3628 finally:
3629 conn.close()
3630 self.serv.settimeout(None)
3631
3632 def _testInheritFlags(self):
3633 time.sleep(0.1)
3634 self.cli.connect((HOST, self.port))
3635 time.sleep(0.5)
3636 self.cli.send(MSG)
3637
Guido van Rossum24e4af82002-06-12 19:18:08 +00003638 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003639 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003640 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003641 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003642 conn, addr = self.serv.accept()
3643 except socket.error:
3644 pass
3645 else:
3646 self.fail("Error trying to do non-blocking accept.")
3647 read, write, err = select.select([self.serv], [], [])
3648 if self.serv in read:
3649 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003650 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003651 else:
3652 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003653
Guido van Rossum24e4af82002-06-12 19:18:08 +00003654 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003655 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003656 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003657
3658 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003659 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003660 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003661 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003662
3663 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003664 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003665 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003666
3667 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003668 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003669 conn, addr = self.serv.accept()
3670 conn.setblocking(0)
3671 try:
3672 msg = conn.recv(len(MSG))
3673 except socket.error:
3674 pass
3675 else:
3676 self.fail("Error trying to do non-blocking recv.")
3677 read, write, err = select.select([conn], [], [])
3678 if conn in read:
3679 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003680 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003681 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003682 else:
3683 self.fail("Error during select call to non-blocking socket.")
3684
3685 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003686 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003687 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003688 self.cli.send(MSG)
3689
Victor Stinner45df8202010-04-28 22:31:17 +00003690@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003691class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003692 """Unit tests for the object returned by socket.makefile()
3693
Antoine Pitrou834bd812010-10-13 16:17:14 +00003694 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003695 the client connection. You can read from this file to
3696 get output from the server.
3697
Antoine Pitrou834bd812010-10-13 16:17:14 +00003698 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003699 server connection. You can write to this file to send output
3700 to the client.
3701 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003702
Guido van Rossume9f66142002-08-07 15:46:19 +00003703 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003704 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003705 errors = 'strict'
3706 newline = None
3707
3708 read_mode = 'rb'
3709 read_msg = MSG
3710 write_mode = 'wb'
3711 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003712
Guido van Rossum24e4af82002-06-12 19:18:08 +00003713 def __init__(self, methodName='runTest'):
3714 SocketConnectedTest.__init__(self, methodName=methodName)
3715
3716 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003717 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3718 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003719 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003720 self.read_file = self.cli_conn.makefile(
3721 self.read_mode, self.bufsize,
3722 encoding = self.encoding,
3723 errors = self.errors,
3724 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003725
3726 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003727 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003728 self.read_file.close()
3729 self.assertTrue(self.read_file.closed)
3730 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003731 SocketConnectedTest.tearDown(self)
3732
3733 def clientSetUp(self):
3734 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003735 self.write_file = self.serv_conn.makefile(
3736 self.write_mode, self.bufsize,
3737 encoding = self.encoding,
3738 errors = self.errors,
3739 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003740
3741 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003742 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003743 self.write_file.close()
3744 self.assertTrue(self.write_file.closed)
3745 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003746 SocketConnectedTest.clientTearDown(self)
3747
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003748 def testReadAfterTimeout(self):
3749 # Issue #7322: A file object must disallow further reads
3750 # after a timeout has occurred.
3751 self.cli_conn.settimeout(1)
3752 self.read_file.read(3)
3753 # First read raises a timeout
3754 self.assertRaises(socket.timeout, self.read_file.read, 1)
3755 # Second read is disallowed
3756 with self.assertRaises(IOError) as ctx:
3757 self.read_file.read(1)
3758 self.assertIn("cannot read from timed out object", str(ctx.exception))
3759
3760 def _testReadAfterTimeout(self):
3761 self.write_file.write(self.write_msg[0:3])
3762 self.write_file.flush()
3763 self.serv_finished.wait()
3764
Guido van Rossum24e4af82002-06-12 19:18:08 +00003765 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003766 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003767 first_seg = self.read_file.read(len(self.read_msg)-3)
3768 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003769 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003770 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003771
3772 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003773 self.write_file.write(self.write_msg)
3774 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003775
Guido van Rossum8c943832002-08-08 01:00:28 +00003776 def testFullRead(self):
3777 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003778 msg = self.read_file.read()
3779 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003780
3781 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003782 self.write_file.write(self.write_msg)
3783 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003784
Guido van Rossum24e4af82002-06-12 19:18:08 +00003785 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003786 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003787 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003788 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003789 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003790 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003791 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003792 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003793 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003794
3795 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003796 self.write_file.write(self.write_msg)
3797 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003798
3799 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003800 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003801 line = self.read_file.readline()
3802 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003803
3804 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003805 self.write_file.write(self.write_msg)
3806 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003807
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003808 def testCloseAfterMakefile(self):
3809 # The file returned by makefile should keep the socket open.
3810 self.cli_conn.close()
3811 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003812 msg = self.read_file.read()
3813 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003814
3815 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003816 self.write_file.write(self.write_msg)
3817 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003818
3819 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003820 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003821 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003822 if isinstance(self.read_msg, str):
3823 msg = msg.decode()
3824 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003825
3826 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003827 self.write_file.write(self.write_msg)
3828 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003829
Tim Peters116d83c2004-03-28 02:20:45 +00003830 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003831 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003832
3833 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003834 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003835
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003836 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003837 self.assertEqual(self.read_file.mode, self.read_mode)
3838 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003839
3840 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003841 self.assertEqual(self.write_file.mode, self.write_mode)
3842 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003843
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003844 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003845 self.read_file.close()
3846 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003847 self.cli_conn.close()
3848 self.assertRaises(socket.error, self.cli_conn.getsockname)
3849
3850 def _testRealClose(self):
3851 pass
3852
3853
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003854class FileObjectInterruptedTestCase(unittest.TestCase):
3855 """Test that the file object correctly handles EINTR internally."""
3856
3857 class MockSocket(object):
3858 def __init__(self, recv_funcs=()):
3859 # A generator that returns callables that we'll call for each
3860 # call to recv().
3861 self._recv_step = iter(recv_funcs)
3862
3863 def recv_into(self, buffer):
3864 data = next(self._recv_step)()
3865 assert len(buffer) >= len(data)
3866 buffer[:len(data)] = data
3867 return len(data)
3868
3869 def _decref_socketios(self):
3870 pass
3871
3872 def _textiowrap_for_test(self, buffering=-1):
3873 raw = socket.SocketIO(self, "r")
3874 if buffering < 0:
3875 buffering = io.DEFAULT_BUFFER_SIZE
3876 if buffering == 0:
3877 return raw
3878 buffer = io.BufferedReader(raw, buffering)
3879 text = io.TextIOWrapper(buffer, None, None)
3880 text.mode = "rb"
3881 return text
3882
3883 @staticmethod
3884 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003885 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003886
3887 def _textiowrap_mock_socket(self, mock, buffering=-1):
3888 raw = socket.SocketIO(mock, "r")
3889 if buffering < 0:
3890 buffering = io.DEFAULT_BUFFER_SIZE
3891 if buffering == 0:
3892 return raw
3893 buffer = io.BufferedReader(raw, buffering)
3894 text = io.TextIOWrapper(buffer, None, None)
3895 text.mode = "rb"
3896 return text
3897
3898 def _test_readline(self, size=-1, buffering=-1):
3899 mock_sock = self.MockSocket(recv_funcs=[
3900 lambda : b"This is the first line\nAnd the sec",
3901 self._raise_eintr,
3902 lambda : b"ond line is here\n",
3903 lambda : b"",
3904 lambda : b"", # XXX(gps): io library does an extra EOF read
3905 ])
3906 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003907 self.assertEqual(fo.readline(size), "This is the first line\n")
3908 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003909
3910 def _test_read(self, size=-1, buffering=-1):
3911 mock_sock = self.MockSocket(recv_funcs=[
3912 lambda : b"This is the first line\nAnd the sec",
3913 self._raise_eintr,
3914 lambda : b"ond line is here\n",
3915 lambda : b"",
3916 lambda : b"", # XXX(gps): io library does an extra EOF read
3917 ])
3918 expecting = (b"This is the first line\n"
3919 b"And the second line is here\n")
3920 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3921 if buffering == 0:
3922 data = b''
3923 else:
3924 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003925 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003926 while len(data) != len(expecting):
3927 part = fo.read(size)
3928 if not part:
3929 break
3930 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003931 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003932
3933 def test_default(self):
3934 self._test_readline()
3935 self._test_readline(size=100)
3936 self._test_read()
3937 self._test_read(size=100)
3938
3939 def test_with_1k_buffer(self):
3940 self._test_readline(buffering=1024)
3941 self._test_readline(size=100, buffering=1024)
3942 self._test_read(buffering=1024)
3943 self._test_read(size=100, buffering=1024)
3944
3945 def _test_readline_no_buffer(self, size=-1):
3946 mock_sock = self.MockSocket(recv_funcs=[
3947 lambda : b"a",
3948 lambda : b"\n",
3949 lambda : b"B",
3950 self._raise_eintr,
3951 lambda : b"b",
3952 lambda : b"",
3953 ])
3954 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003955 self.assertEqual(fo.readline(size), b"a\n")
3956 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003957
3958 def test_no_buffer(self):
3959 self._test_readline_no_buffer()
3960 self._test_readline_no_buffer(size=4)
3961 self._test_read(buffering=0)
3962 self._test_read(size=100, buffering=0)
3963
3964
Guido van Rossume9f66142002-08-07 15:46:19 +00003965class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3966
3967 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003968
Guido van Rossume9f66142002-08-07 15:46:19 +00003969 In this case (and in this case only), it should be possible to
3970 create a file object, read a line from it, create another file
3971 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003972 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003973 when reading multiple requests from the same socket."""
3974
3975 bufsize = 0 # Use unbuffered mode
3976
3977 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003978 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003979 line = self.read_file.readline() # first line
3980 self.assertEqual(line, b"A. " + self.write_msg) # first line
3981 self.read_file = self.cli_conn.makefile('rb', 0)
3982 line = self.read_file.readline() # second line
3983 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003984
3985 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003986 self.write_file.write(b"A. " + self.write_msg)
3987 self.write_file.write(b"B. " + self.write_msg)
3988 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003989
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003990 def testMakefileClose(self):
3991 # The file returned by makefile should keep the socket open...
3992 self.cli_conn.close()
3993 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003994 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003995 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003996 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003997 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3998
3999 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004000 self.write_file.write(self.write_msg)
4001 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004002
4003 def testMakefileCloseSocketDestroy(self):
4004 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004005 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004006 refcount_after = sys.getrefcount(self.cli_conn)
4007 self.assertEqual(refcount_before - 1, refcount_after)
4008
4009 def _testMakefileCloseSocketDestroy(self):
4010 pass
4011
Antoine Pitrou98b46702010-09-18 22:59:00 +00004012 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004013 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004014 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4015
4016 def testSmallReadNonBlocking(self):
4017 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004018 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4019 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004020 self.evt1.set()
4021 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004022 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004023 if first_seg is None:
4024 # Data not arrived (can happen under Windows), wait a bit
4025 time.sleep(0.5)
4026 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004027 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004028 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004029 self.assertEqual(n, 3)
4030 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004031 self.assertEqual(msg, self.read_msg)
4032 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4033 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004034
4035 def _testSmallReadNonBlocking(self):
4036 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004037 self.write_file.write(self.write_msg)
4038 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004039 self.evt2.set()
4040 # Avoid cloding the socket before the server test has finished,
4041 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4042 self.serv_finished.wait(5.0)
4043
4044 def testWriteNonBlocking(self):
4045 self.cli_finished.wait(5.0)
4046 # The client thread can't skip directly - the SkipTest exception
4047 # would appear as a failure.
4048 if self.serv_skipped:
4049 self.skipTest(self.serv_skipped)
4050
4051 def _testWriteNonBlocking(self):
4052 self.serv_skipped = None
4053 self.serv_conn.setblocking(False)
4054 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004055 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004056 LIMIT = 10
4057 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004058 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004059 self.assertGreater(n, 0)
4060 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004061 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004062 if n is None:
4063 # Succeeded
4064 break
4065 self.assertGreater(n, 0)
4066 else:
4067 # Let us know that this test didn't manage to establish
4068 # the expected conditions. This is not a failure in itself but,
4069 # if it happens repeatedly, the test should be fixed.
4070 self.serv_skipped = "failed to saturate the socket buffer"
4071
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004072
Guido van Rossum8c943832002-08-08 01:00:28 +00004073class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4074
4075 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4076
4077
4078class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4079
4080 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004081
Thomas Woutersb2137042007-02-01 18:02:27 +00004082
Antoine Pitrou834bd812010-10-13 16:17:14 +00004083class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4084 """Tests for socket.makefile() in text mode (rather than binary)"""
4085
4086 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004087 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004088 write_mode = 'wb'
4089 write_msg = MSG
4090 newline = ''
4091
4092
4093class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4094 """Tests for socket.makefile() in text mode (rather than binary)"""
4095
4096 read_mode = 'rb'
4097 read_msg = MSG
4098 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004099 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004100 newline = ''
4101
4102
4103class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4104 """Tests for socket.makefile() in text mode (rather than binary)"""
4105
4106 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004107 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004108 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004109 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004110 newline = ''
4111
4112
Guido van Rossumd8faa362007-04-27 19:54:29 +00004113class NetworkConnectionTest(object):
4114 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004115
Guido van Rossumd8faa362007-04-27 19:54:29 +00004116 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004117 # We're inherited below by BasicTCPTest2, which also inherits
4118 # BasicTCPTest, which defines self.port referenced below.
4119 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004120 self.serv_conn = self.cli
4121
4122class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4123 """Tests that NetworkConnection does not break existing TCP functionality.
4124 """
4125
4126class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004127
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004128 class MockSocket(socket.socket):
4129 def connect(self, *args):
4130 raise socket.timeout('timed out')
4131
4132 @contextlib.contextmanager
4133 def mocked_socket_module(self):
4134 """Return a socket which times out on connect"""
4135 old_socket = socket.socket
4136 socket.socket = self.MockSocket
4137 try:
4138 yield
4139 finally:
4140 socket.socket = old_socket
4141
4142 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004143 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004144 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004145 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004146 with self.assertRaises(socket.error) as cm:
4147 cli.connect((HOST, port))
4148 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4149
4150 def test_create_connection(self):
4151 # Issue #9792: errors raised by create_connection() should have
4152 # a proper errno attribute.
4153 port = support.find_unused_port()
4154 with self.assertRaises(socket.error) as cm:
4155 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004156
4157 # Issue #16257: create_connection() calls getaddrinfo() against
4158 # 'localhost'. This may result in an IPV6 addr being returned
4159 # as well as an IPV4 one:
4160 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4161 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4162 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4163 #
4164 # create_connection() enumerates through all the addresses returned
4165 # and if it doesn't successfully bind to any of them, it propagates
4166 # the last exception it encountered.
4167 #
4168 # On Solaris, ENETUNREACH is returned in this circumstance instead
4169 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4170 # expected errnos.
4171 expected_errnos = [ errno.ECONNREFUSED, ]
4172 if hasattr(errno, 'ENETUNREACH'):
4173 expected_errnos.append(errno.ENETUNREACH)
4174
4175 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004176
4177 def test_create_connection_timeout(self):
4178 # Issue #9792: create_connection() should not recast timeout errors
4179 # as generic socket errors.
4180 with self.mocked_socket_module():
4181 with self.assertRaises(socket.timeout):
4182 socket.create_connection((HOST, 1234))
4183
Guido van Rossumd8faa362007-04-27 19:54:29 +00004184
Victor Stinner45df8202010-04-28 22:31:17 +00004185@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004186class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4187
4188 def __init__(self, methodName='runTest'):
4189 SocketTCPTest.__init__(self, methodName=methodName)
4190 ThreadableTest.__init__(self)
4191
4192 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004193 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004194
4195 def clientTearDown(self):
4196 self.cli.close()
4197 self.cli = None
4198 ThreadableTest.clientTearDown(self)
4199
4200 def _justAccept(self):
4201 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004202 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004203
4204 testFamily = _justAccept
4205 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004206 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004207 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004208 self.assertEqual(self.cli.family, 2)
4209
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004210 testSourceAddress = _justAccept
4211 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004212 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4213 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004214 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004215 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004216 # The port number being used is sufficient to show that the bind()
4217 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004218
Guido van Rossumd8faa362007-04-27 19:54:29 +00004219 testTimeoutDefault = _justAccept
4220 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004221 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004222 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004223 socket.setdefaulttimeout(42)
4224 try:
4225 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004226 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004227 finally:
4228 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004229 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004230
4231 testTimeoutNone = _justAccept
4232 def _testTimeoutNone(self):
4233 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004234 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004235 socket.setdefaulttimeout(30)
4236 try:
4237 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004238 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004239 finally:
4240 socket.setdefaulttimeout(None)
4241 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004242
4243 testTimeoutValueNamed = _justAccept
4244 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004245 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004246 self.assertEqual(self.cli.gettimeout(), 30)
4247
4248 testTimeoutValueNonamed = _justAccept
4249 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004250 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004251 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004252 self.assertEqual(self.cli.gettimeout(), 30)
4253
Victor Stinner45df8202010-04-28 22:31:17 +00004254@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004255class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4256
4257 def __init__(self, methodName='runTest'):
4258 SocketTCPTest.__init__(self, methodName=methodName)
4259 ThreadableTest.__init__(self)
4260
4261 def clientSetUp(self):
4262 pass
4263
4264 def clientTearDown(self):
4265 self.cli.close()
4266 self.cli = None
4267 ThreadableTest.clientTearDown(self)
4268
4269 def testInsideTimeout(self):
4270 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004271 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004272 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004273 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004274 testOutsideTimeout = testInsideTimeout
4275
4276 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004277 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004278 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004279 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004280
4281 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004282 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004283 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004284
4285
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004286class TCPTimeoutTest(SocketTCPTest):
4287
4288 def testTCPTimeout(self):
4289 def raise_timeout(*args, **kwargs):
4290 self.serv.settimeout(1.0)
4291 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004292 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004293 "Error generating a timeout exception (TCP)")
4294
4295 def testTimeoutZero(self):
4296 ok = False
4297 try:
4298 self.serv.settimeout(0.0)
4299 foo = self.serv.accept()
4300 except socket.timeout:
4301 self.fail("caught timeout instead of error (TCP)")
4302 except socket.error:
4303 ok = True
4304 except:
4305 self.fail("caught unexpected exception (TCP)")
4306 if not ok:
4307 self.fail("accept() returned success when we did not expect it")
4308
Serhiy Storchaka79080682013-11-03 21:31:18 +02004309 @unittest.skipUnless(hasattr(signal, 'alarm'),
4310 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004311 def testInterruptedTimeout(self):
4312 # XXX I don't know how to do this test on MSWindows or any other
4313 # plaform that doesn't support signal.alarm() or os.kill(), though
4314 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004315 self.serv.settimeout(5.0) # must be longer than alarm
4316 class Alarm(Exception):
4317 pass
4318 def alarm_handler(signal, frame):
4319 raise Alarm
4320 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4321 try:
4322 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4323 try:
4324 foo = self.serv.accept()
4325 except socket.timeout:
4326 self.fail("caught timeout instead of Alarm")
4327 except Alarm:
4328 pass
4329 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004330 self.fail("caught other exception instead of Alarm:"
4331 " %s(%s):\n%s" %
4332 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004333 else:
4334 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004335 finally:
4336 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004337 except Alarm:
4338 self.fail("got Alarm in wrong place")
4339 finally:
4340 # no alarm can be pending. Safe to restore old handler.
4341 signal.signal(signal.SIGALRM, old_alarm)
4342
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004343class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004344
4345 def testUDPTimeout(self):
4346 def raise_timeout(*args, **kwargs):
4347 self.serv.settimeout(1.0)
4348 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004349 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004350 "Error generating a timeout exception (UDP)")
4351
4352 def testTimeoutZero(self):
4353 ok = False
4354 try:
4355 self.serv.settimeout(0.0)
4356 foo = self.serv.recv(1024)
4357 except socket.timeout:
4358 self.fail("caught timeout instead of error (UDP)")
4359 except socket.error:
4360 ok = True
4361 except:
4362 self.fail("caught unexpected exception (UDP)")
4363 if not ok:
4364 self.fail("recv() returned success when we did not expect it")
4365
4366class TestExceptions(unittest.TestCase):
4367
4368 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004369 self.assertTrue(issubclass(socket.error, Exception))
4370 self.assertTrue(issubclass(socket.herror, socket.error))
4371 self.assertTrue(issubclass(socket.gaierror, socket.error))
4372 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004373
Serhiy Storchaka79080682013-11-03 21:31:18 +02004374@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004375class TestLinuxAbstractNamespace(unittest.TestCase):
4376
4377 UNIX_PATH_MAX = 108
4378
4379 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004380 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004381 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4382 s1.bind(address)
4383 s1.listen(1)
4384 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4385 s2.connect(s1.getsockname())
4386 with s1.accept()[0] as s3:
4387 self.assertEqual(s1.getsockname(), address)
4388 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004389
4390 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004391 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004392 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4393 s.bind(address)
4394 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004395
4396 def testNameOverflow(self):
4397 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004398 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4399 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004400
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004401 def testStrName(self):
4402 # Check that an abstract name can be passed as a string.
4403 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4404 try:
4405 s.bind("\x00python\x00test\x00")
4406 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4407 finally:
4408 s.close()
4409
Serhiy Storchaka79080682013-11-03 21:31:18 +02004410@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004411class TestUnixDomain(unittest.TestCase):
4412
4413 def setUp(self):
4414 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4415
4416 def tearDown(self):
4417 self.sock.close()
4418
4419 def encoded(self, path):
4420 # Return the given path encoded in the file system encoding,
4421 # or skip the test if this is not possible.
4422 try:
4423 return os.fsencode(path)
4424 except UnicodeEncodeError:
4425 self.skipTest(
4426 "Pathname {0!a} cannot be represented in file "
4427 "system encoding {1!r}".format(
4428 path, sys.getfilesystemencoding()))
4429
Antoine Pitrou16374872011-12-16 15:04:12 +01004430 def bind(self, sock, path):
4431 # Bind the socket
4432 try:
4433 sock.bind(path)
4434 except OSError as e:
4435 if str(e) == "AF_UNIX path too long":
4436 self.skipTest(
4437 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4438 .format(path))
4439 else:
4440 raise
4441
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004442 def testStrAddr(self):
4443 # Test binding to and retrieving a normal string pathname.
4444 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004445 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004446 self.addCleanup(support.unlink, path)
4447 self.assertEqual(self.sock.getsockname(), path)
4448
4449 def testBytesAddr(self):
4450 # Test binding to a bytes pathname.
4451 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004452 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004453 self.addCleanup(support.unlink, path)
4454 self.assertEqual(self.sock.getsockname(), path)
4455
4456 def testSurrogateescapeBind(self):
4457 # Test binding to a valid non-ASCII pathname, with the
4458 # non-ASCII bytes supplied using surrogateescape encoding.
4459 path = os.path.abspath(support.TESTFN_UNICODE)
4460 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004461 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004462 self.addCleanup(support.unlink, path)
4463 self.assertEqual(self.sock.getsockname(), path)
4464
4465 def testUnencodableAddr(self):
4466 # Test binding to a pathname that cannot be encoded in the
4467 # file system encoding.
4468 if support.TESTFN_UNENCODABLE is None:
4469 self.skipTest("No unencodable filename available")
4470 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004471 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004472 self.addCleanup(support.unlink, path)
4473 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004474
Victor Stinner45df8202010-04-28 22:31:17 +00004475@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004476class BufferIOTest(SocketConnectedTest):
4477 """
4478 Test the buffer versions of socket.recv() and socket.send().
4479 """
4480 def __init__(self, methodName='runTest'):
4481 SocketConnectedTest.__init__(self, methodName=methodName)
4482
Antoine Pitrou25480782010-03-17 22:50:28 +00004483 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004484 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004485 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004486 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004487 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004488 self.assertEqual(msg, MSG)
4489
Antoine Pitrou25480782010-03-17 22:50:28 +00004490 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004491 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004492 self.serv_conn.send(buf)
4493
Antoine Pitrou25480782010-03-17 22:50:28 +00004494 def testRecvIntoBytearray(self):
4495 buf = bytearray(1024)
4496 nbytes = self.cli_conn.recv_into(buf)
4497 self.assertEqual(nbytes, len(MSG))
4498 msg = buf[:len(MSG)]
4499 self.assertEqual(msg, MSG)
4500
4501 _testRecvIntoBytearray = _testRecvIntoArray
4502
4503 def testRecvIntoMemoryview(self):
4504 buf = bytearray(1024)
4505 nbytes = self.cli_conn.recv_into(memoryview(buf))
4506 self.assertEqual(nbytes, len(MSG))
4507 msg = buf[:len(MSG)]
4508 self.assertEqual(msg, MSG)
4509
4510 _testRecvIntoMemoryview = _testRecvIntoArray
4511
4512 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004513 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004514 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004515 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004516 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004517 self.assertEqual(msg, MSG)
4518
Antoine Pitrou25480782010-03-17 22:50:28 +00004519 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004520 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004521 self.serv_conn.send(buf)
4522
Antoine Pitrou25480782010-03-17 22:50:28 +00004523 def testRecvFromIntoBytearray(self):
4524 buf = bytearray(1024)
4525 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4526 self.assertEqual(nbytes, len(MSG))
4527 msg = buf[:len(MSG)]
4528 self.assertEqual(msg, MSG)
4529
4530 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4531
4532 def testRecvFromIntoMemoryview(self):
4533 buf = bytearray(1024)
4534 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4535 self.assertEqual(nbytes, len(MSG))
4536 msg = buf[:len(MSG)]
4537 self.assertEqual(msg, MSG)
4538
4539 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4540
Benjamin Petersonfbf648e2014-01-13 22:59:38 -05004541 def testRecvFromIntoSmallBuffer(self):
4542 # See issue #20246.
4543 buf = bytearray(8)
4544 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4545
4546 def _testRecvFromIntoSmallBuffer(self):
4547 self.serv_conn.send(MSG*2048)
4548
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004549 def testRecvFromIntoEmptyBuffer(self):
4550 buf = bytearray()
4551 self.cli_conn.recvfrom_into(buf)
4552 self.cli_conn.recvfrom_into(buf, 0)
4553
4554 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4555
Christian Heimes043d6f62008-01-07 17:19:16 +00004556
4557TIPC_STYPE = 2000
4558TIPC_LOWER = 200
4559TIPC_UPPER = 210
4560
4561def isTipcAvailable():
4562 """Check if the TIPC module is loaded
4563
4564 The TIPC module is not loaded automatically on Ubuntu and probably
4565 other Linux distros.
4566 """
4567 if not hasattr(socket, "AF_TIPC"):
4568 return False
4569 if not os.path.isfile("/proc/modules"):
4570 return False
4571 with open("/proc/modules") as f:
4572 for line in f:
4573 if line.startswith("tipc "):
4574 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004575 return False
4576
Serhiy Storchaka79080682013-11-03 21:31:18 +02004577@unittest.skipUnless(isTipcAvailable(),
4578 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004579class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004580 def testRDM(self):
4581 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4582 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004583 self.addCleanup(srv.close)
4584 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004585
4586 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4587 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4588 TIPC_LOWER, TIPC_UPPER)
4589 srv.bind(srvaddr)
4590
4591 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4592 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4593 cli.sendto(MSG, sendaddr)
4594
4595 msg, recvaddr = srv.recvfrom(1024)
4596
4597 self.assertEqual(cli.getsockname(), recvaddr)
4598 self.assertEqual(msg, MSG)
4599
4600
Serhiy Storchaka79080682013-11-03 21:31:18 +02004601@unittest.skipUnless(isTipcAvailable(),
4602 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004603class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004604 def __init__(self, methodName = 'runTest'):
4605 unittest.TestCase.__init__(self, methodName = methodName)
4606 ThreadableTest.__init__(self)
4607
4608 def setUp(self):
4609 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004610 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004611 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4612 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4613 TIPC_LOWER, TIPC_UPPER)
4614 self.srv.bind(srvaddr)
4615 self.srv.listen(5)
4616 self.serverExplicitReady()
4617 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004618 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004619
4620 def clientSetUp(self):
4621 # The is a hittable race between serverExplicitReady() and the
4622 # accept() call; sleep a little while to avoid it, otherwise
4623 # we could get an exception
4624 time.sleep(0.1)
4625 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004626 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004627 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4628 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4629 self.cli.connect(addr)
4630 self.cliaddr = self.cli.getsockname()
4631
4632 def testStream(self):
4633 msg = self.conn.recv(1024)
4634 self.assertEqual(msg, MSG)
4635 self.assertEqual(self.cliaddr, self.connaddr)
4636
4637 def _testStream(self):
4638 self.cli.send(MSG)
4639 self.cli.close()
4640
4641
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004642@unittest.skipUnless(thread, 'Threading required for this test.')
4643class ContextManagersTest(ThreadedTCPSocketTest):
4644
4645 def _testSocketClass(self):
4646 # base test
4647 with socket.socket() as sock:
4648 self.assertFalse(sock._closed)
4649 self.assertTrue(sock._closed)
4650 # close inside with block
4651 with socket.socket() as sock:
4652 sock.close()
4653 self.assertTrue(sock._closed)
4654 # exception inside with block
4655 with socket.socket() as sock:
4656 self.assertRaises(socket.error, sock.sendall, b'foo')
4657 self.assertTrue(sock._closed)
4658
4659 def testCreateConnectionBase(self):
4660 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004661 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004662 data = conn.recv(1024)
4663 conn.sendall(data)
4664
4665 def _testCreateConnectionBase(self):
4666 address = self.serv.getsockname()
4667 with socket.create_connection(address) as sock:
4668 self.assertFalse(sock._closed)
4669 sock.sendall(b'foo')
4670 self.assertEqual(sock.recv(1024), b'foo')
4671 self.assertTrue(sock._closed)
4672
4673 def testCreateConnectionClose(self):
4674 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004675 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004676 data = conn.recv(1024)
4677 conn.sendall(data)
4678
4679 def _testCreateConnectionClose(self):
4680 address = self.serv.getsockname()
4681 with socket.create_connection(address) as sock:
4682 sock.close()
4683 self.assertTrue(sock._closed)
4684 self.assertRaises(socket.error, sock.sendall, b'foo')
4685
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004686
Antoine Pitroub1c54962010-10-14 15:05:38 +00004687@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4688 "SOCK_CLOEXEC not defined")
4689@unittest.skipUnless(fcntl, "module fcntl not available")
4690class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004691 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004692 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004693 with socket.socket(socket.AF_INET,
4694 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4695 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4696 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004697
4698
4699@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4700 "SOCK_NONBLOCK not defined")
4701class NonblockConstantTest(unittest.TestCase):
4702 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4703 if nonblock:
4704 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4705 self.assertEqual(s.gettimeout(), timeout)
4706 else:
4707 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4708 self.assertEqual(s.gettimeout(), None)
4709
Charles-François Natali239bb962011-06-03 12:55:15 +02004710 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004711 def test_SOCK_NONBLOCK(self):
4712 # a lot of it seems silly and redundant, but I wanted to test that
4713 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004714 with socket.socket(socket.AF_INET,
4715 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4716 self.checkNonblock(s)
4717 s.setblocking(1)
4718 self.checkNonblock(s, False)
4719 s.setblocking(0)
4720 self.checkNonblock(s)
4721 s.settimeout(None)
4722 self.checkNonblock(s, False)
4723 s.settimeout(2.0)
4724 self.checkNonblock(s, timeout=2.0)
4725 s.setblocking(1)
4726 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004727 # defaulttimeout
4728 t = socket.getdefaulttimeout()
4729 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004730 with socket.socket() as s:
4731 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004732 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004733 with socket.socket() as s:
4734 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004735 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004736 with socket.socket() as s:
4737 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004738 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004739 with socket.socket() as s:
4740 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004741 socket.setdefaulttimeout(t)
4742
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004743
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004744@unittest.skipUnless(os.name == "nt", "Windows specific")
4745@unittest.skipUnless(multiprocessing, "need multiprocessing")
4746class TestSocketSharing(SocketTCPTest):
4747 # This must be classmethod and not staticmethod or multiprocessing
4748 # won't be able to bootstrap it.
4749 @classmethod
4750 def remoteProcessServer(cls, q):
4751 # Recreate socket from shared data
4752 sdata = q.get()
4753 message = q.get()
4754
4755 s = socket.fromshare(sdata)
4756 s2, c = s.accept()
4757
4758 # Send the message
4759 s2.sendall(message)
4760 s2.close()
4761 s.close()
4762
4763 def testShare(self):
4764 # Transfer the listening server socket to another process
4765 # and service it from there.
4766
4767 # Create process:
4768 q = multiprocessing.Queue()
4769 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4770 p.start()
4771
4772 # Get the shared socket data
4773 data = self.serv.share(p.pid)
4774
4775 # Pass the shared socket to the other process
4776 addr = self.serv.getsockname()
4777 self.serv.close()
4778 q.put(data)
4779
4780 # The data that the server will send us
4781 message = b"slapmahfro"
4782 q.put(message)
4783
4784 # Connect
4785 s = socket.create_connection(addr)
4786 # listen for the data
4787 m = []
4788 while True:
4789 data = s.recv(100)
4790 if not data:
4791 break
4792 m.append(data)
4793 s.close()
4794 received = b"".join(m)
4795 self.assertEqual(received, message)
4796 p.join()
4797
4798 def testShareLength(self):
4799 data = self.serv.share(os.getpid())
4800 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4801 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4802
4803 def compareSockets(self, org, other):
4804 # socket sharing is expected to work only for blocking socket
4805 # since the internal python timout value isn't transfered.
4806 self.assertEqual(org.gettimeout(), None)
4807 self.assertEqual(org.gettimeout(), other.gettimeout())
4808
4809 self.assertEqual(org.family, other.family)
4810 self.assertEqual(org.type, other.type)
4811 # If the user specified "0" for proto, then
4812 # internally windows will have picked the correct value.
4813 # Python introspection on the socket however will still return
4814 # 0. For the shared socket, the python value is recreated
4815 # from the actual value, so it may not compare correctly.
4816 if org.proto != 0:
4817 self.assertEqual(org.proto, other.proto)
4818
4819 def testShareLocal(self):
4820 data = self.serv.share(os.getpid())
4821 s = socket.fromshare(data)
4822 try:
4823 self.compareSockets(self.serv, s)
4824 finally:
4825 s.close()
4826
4827 def testTypes(self):
4828 families = [socket.AF_INET, socket.AF_INET6]
4829 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4830 for f in families:
4831 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00004832 try:
4833 source = socket.socket(f, t)
4834 except OSError:
4835 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004836 try:
4837 data = source.share(os.getpid())
4838 shared = socket.fromshare(data)
4839 try:
4840 self.compareSockets(source, shared)
4841 finally:
4842 shared.close()
4843 finally:
4844 source.close()
4845
4846
Guido van Rossumb995eb72002-07-31 16:08:40 +00004847def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004848 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004849 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004850
4851 tests.extend([
4852 NonBlockingTCPTests,
4853 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004854 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004855 UnbufferedFileObjectClassTestCase,
4856 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004857 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004858 UnicodeReadFileObjectClassTestCase,
4859 UnicodeWriteFileObjectClassTestCase,
4860 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004861 NetworkConnectionNoServer,
4862 NetworkConnectionAttributesTest,
4863 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004864 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004865 CloexecConstantTest,
4866 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004867 ])
Serhiy Storchaka79080682013-11-03 21:31:18 +02004868 tests.append(BasicSocketPairTest)
4869 tests.append(TestUnixDomain)
4870 tests.append(TestLinuxAbstractNamespace)
4871 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02004872 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004873 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004874 tests.extend([
4875 CmsgMacroTests,
4876 SendmsgUDPTest,
4877 RecvmsgUDPTest,
4878 RecvmsgIntoUDPTest,
4879 SendmsgUDP6Test,
4880 RecvmsgUDP6Test,
4881 RecvmsgRFC3542AncillaryUDP6Test,
4882 RecvmsgIntoRFC3542AncillaryUDP6Test,
4883 RecvmsgIntoUDP6Test,
4884 SendmsgTCPTest,
4885 RecvmsgTCPTest,
4886 RecvmsgIntoTCPTest,
4887 SendmsgSCTPStreamTest,
4888 RecvmsgSCTPStreamTest,
4889 RecvmsgIntoSCTPStreamTest,
4890 SendmsgUnixStreamTest,
4891 RecvmsgUnixStreamTest,
4892 RecvmsgIntoUnixStreamTest,
4893 RecvmsgSCMRightsStreamTest,
4894 RecvmsgIntoSCMRightsStreamTest,
4895 # These are slow when setitimer() is not available
4896 InterruptedRecvTimeoutTest,
4897 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004898 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004899 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004900
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004901 thread_info = support.threading_setup()
4902 support.run_unittest(*tests)
4903 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004904
4905if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004906 test_main()