blob: d20e37bff6f7024787449cb0fed104590d5beb92 [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
717 return
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
723 return
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
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000775 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000776 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000777 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000778 try:
779 # On some versions, this loses a reference
780 orig = sys.getrefcount(__name__)
781 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000782 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000783 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000785
Guido van Rossum24e4af82002-06-12 19:18:08 +0000786 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000787 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000788 try:
789 # On some versions, this crashes the interpreter.
790 socket.getnameinfo(('x', 0, 0, 0), 0)
791 except socket.error:
792 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000793
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000794 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000795 # This just checks that htons etc. are their own inverse,
796 # when looking at the lower 16 or 32 bits.
797 sizes = {socket.htonl: 32, socket.ntohl: 32,
798 socket.htons: 16, socket.ntohs: 16}
799 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000800 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000801 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
802 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000803
Guido van Rossuma2627af2002-09-14 00:58:46 +0000804 swapped = func(mask)
805 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000806 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000807
Guido van Rossum018919a2007-01-15 00:07:32 +0000808 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000809 good_values = [ 1, 2, 3, 1, 2, 3 ]
810 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000811 for k in good_values:
812 socket.ntohl(k)
813 socket.ntohs(k)
814 socket.htonl(k)
815 socket.htons(k)
816 for k in bad_values:
817 self.assertRaises(OverflowError, socket.ntohl, k)
818 self.assertRaises(OverflowError, socket.ntohs, k)
819 self.assertRaises(OverflowError, socket.htonl, k)
820 self.assertRaises(OverflowError, socket.htons, k)
821
Barry Warsaw11b91a02004-06-28 00:50:43 +0000822 def testGetServBy(self):
823 eq = self.assertEqual
824 # Find one service that exists, then check all the related interfaces.
825 # I've ordered this by protocols that have both a tcp and udp
826 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200827 if (sys.platform.startswith(('freebsd', 'netbsd'))
828 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000829 # avoid the 'echo' service on this platform, as there is an
830 # assumption breaking non-standard port/protocol entry
831 services = ('daytime', 'qotd', 'domain')
832 else:
833 services = ('echo', 'daytime', 'domain')
834 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000835 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000836 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000837 break
838 except socket.error:
839 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000840 else:
841 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000842 # Try same call with optional protocol omitted
843 port2 = socket.getservbyname(service)
844 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400845 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000846 try:
847 udpport = socket.getservbyname(service, 'udp')
848 except socket.error:
849 udpport = None
850 else:
851 eq(udpport, port)
852 # Now make sure the lookup by port returns the same service name
853 eq(socket.getservbyport(port2), service)
854 eq(socket.getservbyport(port, 'tcp'), service)
855 if udpport is not None:
856 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000857 # Make sure getservbyport does not accept out of range ports.
858 self.assertRaises(OverflowError, socket.getservbyport, -1)
859 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000860
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000861 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000862 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000863 # The default timeout should initially be None
864 self.assertEqual(socket.getdefaulttimeout(), None)
865 s = socket.socket()
866 self.assertEqual(s.gettimeout(), None)
867 s.close()
868
869 # Set the default timeout to 10, and see if it propagates
870 socket.setdefaulttimeout(10)
871 self.assertEqual(socket.getdefaulttimeout(), 10)
872 s = socket.socket()
873 self.assertEqual(s.gettimeout(), 10)
874 s.close()
875
876 # Reset the default timeout to None, and see if it propagates
877 socket.setdefaulttimeout(None)
878 self.assertEqual(socket.getdefaulttimeout(), None)
879 s = socket.socket()
880 self.assertEqual(s.gettimeout(), None)
881 s.close()
882
883 # Check that setting it to an invalid value raises ValueError
884 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
885
886 # Check that setting it to an invalid type raises TypeError
887 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
888
Benjamin Petersonf91df042009-02-13 02:50:59 +0000889 def testIPv4_inet_aton_fourbytes(self):
890 if not hasattr(socket, 'inet_aton'):
891 return # No inet_aton, nothing to check
892 # Test that issue1008086 and issue767150 are fixed.
893 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000894 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
895 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000896
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000897 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000898 if not hasattr(socket, 'inet_pton'):
899 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000900 from socket import inet_aton as f, inet_pton, AF_INET
901 g = lambda a: inet_pton(AF_INET, a)
902
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100903 assertInvalid = lambda func,a: self.assertRaises(
904 (socket.error, ValueError), func, a
905 )
906
Ezio Melottib3aedd42010-11-20 19:04:17 +0000907 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
908 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
909 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
910 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
911 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100912 assertInvalid(f, '0.0.0.')
913 assertInvalid(f, '300.0.0.0')
914 assertInvalid(f, 'a.0.0.0')
915 assertInvalid(f, '1.2.3.4.5')
916 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000917
Ezio Melottib3aedd42010-11-20 19:04:17 +0000918 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
919 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
920 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
921 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100922 assertInvalid(g, '0.0.0.')
923 assertInvalid(g, '300.0.0.0')
924 assertInvalid(g, 'a.0.0.0')
925 assertInvalid(g, '1.2.3.4.5')
926 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000927
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000928 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000929 if not hasattr(socket, 'inet_pton'):
930 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000931 try:
932 from socket import inet_pton, AF_INET6, has_ipv6
933 if not has_ipv6:
934 return
935 except ImportError:
936 return
937 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100938 assertInvalid = lambda a: self.assertRaises(
939 (socket.error, ValueError), f, a
940 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000941
Ezio Melottib3aedd42010-11-20 19:04:17 +0000942 self.assertEqual(b'\x00' * 16, f('::'))
943 self.assertEqual(b'\x00' * 16, f('0::0'))
944 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
945 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000946 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 +0000947 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
948 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100949 self.assertEqual(
950 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
951 f('ad42:abc::127:0:254:2')
952 )
953 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
954 assertInvalid('0x20::')
955 assertInvalid(':::')
956 assertInvalid('::0::')
957 assertInvalid('1::abc::')
958 assertInvalid('1::abc::def')
959 assertInvalid('1:2:3:4:5:6:')
960 assertInvalid('1:2:3:4:5:6')
961 assertInvalid('1:2:3:4:5:6:7:8:')
962 assertInvalid('1:2:3:4:5:6:7:8:0')
963
964 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
965 f('::254.42.23.64')
966 )
967 self.assertEqual(
968 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
969 f('42::a29b:254.42.23.64')
970 )
971 self.assertEqual(
972 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
973 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
974 )
975 assertInvalid('255.254.253.252')
976 assertInvalid('1::260.2.3.0')
977 assertInvalid('1::0.be.e.0')
978 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
979 assertInvalid('::1.2.3.4:0')
980 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +0000981
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000982 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000983 if not hasattr(socket, 'inet_ntop'):
984 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000985 from socket import inet_ntoa as f, inet_ntop, AF_INET
986 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100987 assertInvalid = lambda func,a: self.assertRaises(
988 (socket.error, ValueError), func, a
989 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000990
Ezio Melottib3aedd42010-11-20 19:04:17 +0000991 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
992 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
993 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
994 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100995 assertInvalid(f, b'\x00' * 3)
996 assertInvalid(f, b'\x00' * 5)
997 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +0000998
Ezio Melottib3aedd42010-11-20 19:04:17 +0000999 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1000 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1001 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001002 assertInvalid(g, b'\x00' * 3)
1003 assertInvalid(g, b'\x00' * 5)
1004 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001005
1006 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +00001007 if not hasattr(socket, 'inet_ntop'):
1008 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001009 try:
1010 from socket import inet_ntop, AF_INET6, has_ipv6
1011 if not has_ipv6:
1012 return
1013 except ImportError:
1014 return
1015 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001016 assertInvalid = lambda a: self.assertRaises(
1017 (socket.error, ValueError), f, a
1018 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001019
Ezio Melottib3aedd42010-11-20 19:04:17 +00001020 self.assertEqual('::', f(b'\x00' * 16))
1021 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1022 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001023 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001024 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 +00001025 )
1026
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001027 assertInvalid(b'\x12' * 15)
1028 assertInvalid(b'\x12' * 17)
1029 assertInvalid(b'\x12' * 4)
1030
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001031 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001032
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001033 def testSockName(self):
1034 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001035 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001036 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001037 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001038 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001039 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001040 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1041 # it reasonable to get the host's addr in addition to 0.0.0.0.
1042 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001043 try:
1044 my_ip_addr = socket.gethostbyname(socket.gethostname())
1045 except socket.error:
1046 # Probably name lookup wasn't set up right; skip this test
1047 return
Benjamin Peterson577473f2010-01-19 00:09:57 +00001048 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001049 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001050
1051 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001052 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001053 # We know a socket should start without reuse==0
1054 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001055 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001056 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001057 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001058
1059 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001060 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001061 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001062 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001063 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1064 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001065 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001066
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001067 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001068 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001069 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1070 sock.settimeout(1)
1071 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +00001072 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001073
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001074 def testNewAttributes(self):
1075 # testing .family, .type and .protocol
1076 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1077 self.assertEqual(sock.family, socket.AF_INET)
1078 self.assertEqual(sock.type, socket.SOCK_STREAM)
1079 self.assertEqual(sock.proto, 0)
1080 sock.close()
1081
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001082 def test_getsockaddrarg(self):
1083 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001084 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001085 big_port = port + 65536
1086 neg_port = port - 65536
1087 sock = socket.socket()
1088 try:
1089 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1090 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1091 sock.bind((host, port))
1092 finally:
1093 sock.close()
1094
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001095 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001096 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001097 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1098 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1099 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1100 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001101 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1102 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001103 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001104 self.assertRaises(ValueError, s.ioctl, -1, None)
1105 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001106
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001107 def testGetaddrinfo(self):
1108 try:
1109 socket.getaddrinfo('localhost', 80)
1110 except socket.gaierror as err:
1111 if err.errno == socket.EAI_SERVICE:
1112 # see http://bugs.python.org/issue1282647
1113 self.skipTest("buggy libc version")
1114 raise
1115 # len of every sequence is supposed to be == 5
1116 for info in socket.getaddrinfo(HOST, None):
1117 self.assertEqual(len(info), 5)
1118 # host can be a domain name, a string representation of an
1119 # IPv4/v6 address or None
1120 socket.getaddrinfo('localhost', 80)
1121 socket.getaddrinfo('127.0.0.1', 80)
1122 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001123 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001124 socket.getaddrinfo('::1', 80)
1125 # port can be a string service name such as "http", a numeric
1126 # port number or None
1127 socket.getaddrinfo(HOST, "http")
1128 socket.getaddrinfo(HOST, 80)
1129 socket.getaddrinfo(HOST, None)
1130 # test family and socktype filters
1131 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
1132 for family, _, _, _, _ in infos:
1133 self.assertEqual(family, socket.AF_INET)
1134 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1135 for _, socktype, _, _, _ in infos:
1136 self.assertEqual(socktype, socket.SOCK_STREAM)
1137 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001138 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001139 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1140 # a server willing to support both IPv4 and IPv6 will
1141 # usually do this
1142 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1143 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001144 # test keyword arguments
1145 a = socket.getaddrinfo(HOST, None)
1146 b = socket.getaddrinfo(host=HOST, port=None)
1147 self.assertEqual(a, b)
1148 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1149 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1150 self.assertEqual(a, b)
1151 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1152 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1153 self.assertEqual(a, b)
1154 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1155 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1156 self.assertEqual(a, b)
1157 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1158 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1159 self.assertEqual(a, b)
1160 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1161 socket.AI_PASSIVE)
1162 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1163 type=socket.SOCK_STREAM, proto=0,
1164 flags=socket.AI_PASSIVE)
1165 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001166 # Issue #6697.
1167 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001168
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001169 def test_getnameinfo(self):
1170 # only IP addresses are allowed
1171 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
1172
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001173 @unittest.skipUnless(support.is_resource_enabled('network'),
1174 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001175 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001176 # Check for internet access before running test (issue #12804).
1177 try:
1178 socket.gethostbyname('python.org')
1179 except socket.gaierror as e:
1180 if e.errno == socket.EAI_NODATA:
1181 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001182 # these should all be successful
1183 socket.gethostbyname('испытание.python.org')
1184 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001185 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1186 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1187 # have a reverse entry yet
1188 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001189
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001190 def check_sendall_interrupted(self, with_timeout):
1191 # socketpair() is not stricly required, but it makes things easier.
1192 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1193 self.skipTest("signal.alarm and socket.socketpair required for this test")
1194 # Our signal handlers clobber the C errno by calling a math function
1195 # with an invalid domain value.
1196 def ok_handler(*args):
1197 self.assertRaises(ValueError, math.acosh, 0)
1198 def raising_handler(*args):
1199 self.assertRaises(ValueError, math.acosh, 0)
1200 1 // 0
1201 c, s = socket.socketpair()
1202 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1203 try:
1204 if with_timeout:
1205 # Just above the one second minimum for signal.alarm
1206 c.settimeout(1.5)
1207 with self.assertRaises(ZeroDivisionError):
1208 signal.alarm(1)
1209 c.sendall(b"x" * (1024**2))
1210 if with_timeout:
1211 signal.signal(signal.SIGALRM, ok_handler)
1212 signal.alarm(1)
1213 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1214 finally:
1215 signal.signal(signal.SIGALRM, old_alarm)
1216 c.close()
1217 s.close()
1218
1219 def test_sendall_interrupted(self):
1220 self.check_sendall_interrupted(False)
1221
1222 def test_sendall_interrupted_with_timeout(self):
1223 self.check_sendall_interrupted(True)
1224
Antoine Pitroue033e062010-10-29 10:38:18 +00001225 def test_dealloc_warn(self):
1226 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1227 r = repr(sock)
1228 with self.assertWarns(ResourceWarning) as cm:
1229 sock = None
1230 support.gc_collect()
1231 self.assertIn(r, str(cm.warning.args[0]))
1232 # An open socket file object gets dereferenced after the socket
1233 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1234 f = sock.makefile('rb')
1235 r = repr(sock)
1236 sock = None
1237 support.gc_collect()
1238 with self.assertWarns(ResourceWarning):
1239 f = None
1240 support.gc_collect()
1241
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001242 def test_name_closed_socketio(self):
1243 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1244 fp = sock.makefile("rb")
1245 fp.close()
1246 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1247
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001248 def test_unusable_closed_socketio(self):
1249 with socket.socket() as sock:
1250 fp = sock.makefile("rb", buffering=0)
1251 self.assertTrue(fp.readable())
1252 self.assertFalse(fp.writable())
1253 self.assertFalse(fp.seekable())
1254 fp.close()
1255 self.assertRaises(ValueError, fp.readable)
1256 self.assertRaises(ValueError, fp.writable)
1257 self.assertRaises(ValueError, fp.seekable)
1258
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001259 def test_pickle(self):
1260 sock = socket.socket()
1261 with sock:
1262 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1263 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1264
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001265 def test_listen_backlog(self):
1266 for backlog in 0, -1:
1267 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1268 srv.bind((HOST, 0))
1269 srv.listen(backlog)
1270 srv.close()
1271
1272 # Issue 15989
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001273 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1274 srv.bind((HOST, 0))
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001275 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001276 srv.close()
1277
Charles-François Natali42663332012-01-02 15:57:30 +01001278 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001279 def test_flowinfo(self):
1280 self.assertRaises(OverflowError, socket.getnameinfo,
1281 ('::1',0, 0xffffffff), 0)
1282 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1283 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
1284
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001285
Charles-François Natali47413c12011-10-06 19:47:44 +02001286@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1287class BasicCANTest(unittest.TestCase):
1288
1289 def testCrucialConstants(self):
1290 socket.AF_CAN
1291 socket.PF_CAN
1292 socket.CAN_RAW
1293
1294 def testCreateSocket(self):
1295 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1296 pass
1297
1298 def testBindAny(self):
1299 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1300 s.bind(('', ))
1301
1302 def testTooLongInterfaceName(self):
1303 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1304 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001305 self.assertRaisesRegex(socket.error, 'interface name too long',
1306 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001307
1308 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1309 'socket.CAN_RAW_LOOPBACK required for this test.')
1310 def testLoopback(self):
1311 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1312 for loopback in (0, 1):
1313 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1314 loopback)
1315 self.assertEqual(loopback,
1316 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1317
1318 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1319 'socket.CAN_RAW_FILTER required for this test.')
1320 def testFilter(self):
1321 can_id, can_mask = 0x200, 0x700
1322 can_filter = struct.pack("=II", can_id, can_mask)
1323 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1324 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1325 self.assertEqual(can_filter,
1326 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1327
1328
1329@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1330@unittest.skipUnless(thread, 'Threading required for this test.')
1331class CANTest(ThreadedCANSocketTest):
1332
1333 """The CAN frame structure is defined in <linux/can.h>:
1334
1335 struct can_frame {
1336 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1337 __u8 can_dlc; /* data length code: 0 .. 8 */
1338 __u8 data[8] __attribute__((aligned(8)));
1339 };
1340 """
1341 can_frame_fmt = "=IB3x8s"
1342
1343 def __init__(self, methodName='runTest'):
1344 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1345
1346 @classmethod
1347 def build_can_frame(cls, can_id, data):
1348 """Build a CAN frame."""
1349 can_dlc = len(data)
1350 data = data.ljust(8, b'\x00')
1351 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1352
1353 @classmethod
1354 def dissect_can_frame(cls, frame):
1355 """Dissect a CAN frame."""
1356 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1357 return (can_id, can_dlc, data[:can_dlc])
1358
1359 def testSendFrame(self):
1360 cf, addr = self.s.recvfrom(self.bufsize)
1361 self.assertEqual(self.cf, cf)
1362 self.assertEqual(addr[0], self.interface)
1363 self.assertEqual(addr[1], socket.AF_CAN)
1364
1365 def _testSendFrame(self):
1366 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1367 self.cli.send(self.cf)
1368
1369 def testSendMaxFrame(self):
1370 cf, addr = self.s.recvfrom(self.bufsize)
1371 self.assertEqual(self.cf, cf)
1372
1373 def _testSendMaxFrame(self):
1374 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1375 self.cli.send(self.cf)
1376
1377 def testSendMultiFrames(self):
1378 cf, addr = self.s.recvfrom(self.bufsize)
1379 self.assertEqual(self.cf1, cf)
1380
1381 cf, addr = self.s.recvfrom(self.bufsize)
1382 self.assertEqual(self.cf2, cf)
1383
1384 def _testSendMultiFrames(self):
1385 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1386 self.cli.send(self.cf1)
1387
1388 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1389 self.cli.send(self.cf2)
1390
1391
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001392@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1393class BasicRDSTest(unittest.TestCase):
1394
1395 def testCrucialConstants(self):
1396 socket.AF_RDS
1397 socket.PF_RDS
1398
1399 def testCreateSocket(self):
1400 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1401 pass
1402
1403 def testSocketBufferSize(self):
1404 bufsize = 16384
1405 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1406 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1407 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1408
1409
1410@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1411@unittest.skipUnless(thread, 'Threading required for this test.')
1412class RDSTest(ThreadedRDSSocketTest):
1413
1414 def __init__(self, methodName='runTest'):
1415 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1416
Charles-François Natali240c55f2011-11-10 20:33:36 +01001417 def setUp(self):
1418 super().setUp()
1419 self.evt = threading.Event()
1420
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001421 def testSendAndRecv(self):
1422 data, addr = self.serv.recvfrom(self.bufsize)
1423 self.assertEqual(self.data, data)
1424 self.assertEqual(self.cli_addr, addr)
1425
1426 def _testSendAndRecv(self):
1427 self.data = b'spam'
1428 self.cli.sendto(self.data, 0, (HOST, self.port))
1429
1430 def testPeek(self):
1431 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1432 self.assertEqual(self.data, data)
1433 data, addr = self.serv.recvfrom(self.bufsize)
1434 self.assertEqual(self.data, data)
1435
1436 def _testPeek(self):
1437 self.data = b'spam'
1438 self.cli.sendto(self.data, 0, (HOST, self.port))
1439
1440 @requireAttrs(socket.socket, 'recvmsg')
1441 def testSendAndRecvMsg(self):
1442 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1443 self.assertEqual(self.data, data)
1444
1445 @requireAttrs(socket.socket, 'sendmsg')
1446 def _testSendAndRecvMsg(self):
1447 self.data = b'hello ' * 10
1448 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1449
1450 def testSendAndRecvMulti(self):
1451 data, addr = self.serv.recvfrom(self.bufsize)
1452 self.assertEqual(self.data1, data)
1453
1454 data, addr = self.serv.recvfrom(self.bufsize)
1455 self.assertEqual(self.data2, data)
1456
1457 def _testSendAndRecvMulti(self):
1458 self.data1 = b'bacon'
1459 self.cli.sendto(self.data1, 0, (HOST, self.port))
1460
1461 self.data2 = b'egg'
1462 self.cli.sendto(self.data2, 0, (HOST, self.port))
1463
1464 def testSelect(self):
1465 r, w, x = select.select([self.serv], [], [], 3.0)
1466 self.assertIn(self.serv, r)
1467 data, addr = self.serv.recvfrom(self.bufsize)
1468 self.assertEqual(self.data, data)
1469
1470 def _testSelect(self):
1471 self.data = b'select'
1472 self.cli.sendto(self.data, 0, (HOST, self.port))
1473
1474 def testCongestion(self):
1475 # wait until the sender is done
1476 self.evt.wait()
1477
1478 def _testCongestion(self):
1479 # test the behavior in case of congestion
1480 self.data = b'fill'
1481 self.cli.setblocking(False)
1482 try:
1483 # try to lower the receiver's socket buffer size
1484 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1485 except OSError:
1486 pass
1487 with self.assertRaises(OSError) as cm:
1488 try:
1489 # fill the receiver's socket buffer
1490 while True:
1491 self.cli.sendto(self.data, 0, (HOST, self.port))
1492 finally:
1493 # signal the receiver we're done
1494 self.evt.set()
1495 # sendto() should have failed with ENOBUFS
1496 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1497 # and we should have received a congestion notification through poll
1498 r, w, x = select.select([self.serv], [], [], 3.0)
1499 self.assertIn(self.serv, r)
1500
1501
Victor Stinner45df8202010-04-28 22:31:17 +00001502@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001503class BasicTCPTest(SocketConnectedTest):
1504
1505 def __init__(self, methodName='runTest'):
1506 SocketConnectedTest.__init__(self, methodName=methodName)
1507
1508 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001509 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001510 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001511 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001512
1513 def _testRecv(self):
1514 self.serv_conn.send(MSG)
1515
1516 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001517 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001518 seg1 = self.cli_conn.recv(len(MSG) - 3)
1519 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001520 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001521 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001522
1523 def _testOverFlowRecv(self):
1524 self.serv_conn.send(MSG)
1525
1526 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001527 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001528 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001529 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001530
1531 def _testRecvFrom(self):
1532 self.serv_conn.send(MSG)
1533
1534 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001535 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001536 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1537 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001538 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001539 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001540
1541 def _testOverFlowRecvFrom(self):
1542 self.serv_conn.send(MSG)
1543
1544 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001545 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001546 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001547 while 1:
1548 read = self.cli_conn.recv(1024)
1549 if not read:
1550 break
Guido van Rossume531e292002-08-08 20:28:34 +00001551 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001552 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001553
1554 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001555 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001556 self.serv_conn.sendall(big_chunk)
1557
1558 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001559 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001560 fd = self.cli_conn.fileno()
1561 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001562 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001563 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001564 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001565 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001566
1567 def _testFromFd(self):
1568 self.serv_conn.send(MSG)
1569
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001570 def testDup(self):
1571 # Testing dup()
1572 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001573 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001574 msg = sock.recv(1024)
1575 self.assertEqual(msg, MSG)
1576
1577 def _testDup(self):
1578 self.serv_conn.send(MSG)
1579
Guido van Rossum24e4af82002-06-12 19:18:08 +00001580 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001581 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001582 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001583 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001584 # wait for _testShutdown to finish: on OS X, when the server
1585 # closes the connection the client also becomes disconnected,
1586 # and the client's shutdown call will fail. (Issue #4397.)
1587 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001588
1589 def _testShutdown(self):
1590 self.serv_conn.send(MSG)
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001591 # Issue 15989
1592 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1593 _testcapi.INT_MAX + 1)
1594 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1595 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001596 self.serv_conn.shutdown(2)
1597
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001598 def testDetach(self):
1599 # Testing detach()
1600 fileno = self.cli_conn.fileno()
1601 f = self.cli_conn.detach()
1602 self.assertEqual(f, fileno)
1603 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001604 self.assertTrue(self.cli_conn._closed)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001605 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1606 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001607 # ...but we can create another socket using the (still open)
1608 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001609 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001610 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001611 msg = sock.recv(1024)
1612 self.assertEqual(msg, MSG)
1613
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001614 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001615 self.serv_conn.send(MSG)
1616
Victor Stinner45df8202010-04-28 22:31:17 +00001617@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001618class BasicUDPTest(ThreadedUDPSocketTest):
1619
1620 def __init__(self, methodName='runTest'):
1621 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1622
1623 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001624 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001625 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001626 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001627
1628 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001629 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001630
Guido van Rossum1c938012002-06-12 21:17:20 +00001631 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001632 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001633 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001634 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001635
Guido van Rossum1c938012002-06-12 21:17:20 +00001636 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001637 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001638
Guido van Rossumd8faa362007-04-27 19:54:29 +00001639 def testRecvFromNegative(self):
1640 # Negative lengths passed to recvfrom should give ValueError.
1641 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1642
1643 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001644 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001645
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001646# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1647# same test code is used with different families and types of socket
1648# (e.g. stream, datagram), and tests using recvmsg() are repeated
1649# using recvmsg_into().
1650#
1651# The generic test classes such as SendmsgTests and
1652# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1653# supplied with sockets cli_sock and serv_sock representing the
1654# client's and the server's end of the connection respectively, and
1655# attributes cli_addr and serv_addr holding their (numeric where
1656# appropriate) addresses.
1657#
1658# The final concrete test classes combine these with subclasses of
1659# SocketTestBase which set up client and server sockets of a specific
1660# type, and with subclasses of SendrecvmsgBase such as
1661# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1662# sockets to cli_sock and serv_sock and override the methods and
1663# attributes of SendrecvmsgBase to fill in destination addresses if
1664# needed when sending, check for specific flags in msg_flags, etc.
1665#
1666# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1667# recvmsg_into().
1668
1669# XXX: like the other datagram (UDP) tests in this module, the code
1670# here assumes that datagram delivery on the local machine will be
1671# reliable.
1672
1673class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1674 # Base class for sendmsg()/recvmsg() tests.
1675
1676 # Time in seconds to wait before considering a test failed, or
1677 # None for no timeout. Not all tests actually set a timeout.
1678 fail_timeout = 3.0
1679
1680 def setUp(self):
1681 self.misc_event = threading.Event()
1682 super().setUp()
1683
1684 def sendToServer(self, msg):
1685 # Send msg to the server.
1686 return self.cli_sock.send(msg)
1687
1688 # Tuple of alternative default arguments for sendmsg() when called
1689 # via sendmsgToServer() (e.g. to include a destination address).
1690 sendmsg_to_server_defaults = ()
1691
1692 def sendmsgToServer(self, *args):
1693 # Call sendmsg() on self.cli_sock with the given arguments,
1694 # filling in any arguments which are not supplied with the
1695 # corresponding items of self.sendmsg_to_server_defaults, if
1696 # any.
1697 return self.cli_sock.sendmsg(
1698 *(args + self.sendmsg_to_server_defaults[len(args):]))
1699
1700 def doRecvmsg(self, sock, bufsize, *args):
1701 # Call recvmsg() on sock with given arguments and return its
1702 # result. Should be used for tests which can use either
1703 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1704 # this method with one which emulates it using recvmsg_into(),
1705 # thus allowing the same test to be used for both methods.
1706 result = sock.recvmsg(bufsize, *args)
1707 self.registerRecvmsgResult(result)
1708 return result
1709
1710 def registerRecvmsgResult(self, result):
1711 # Called by doRecvmsg() with the return value of recvmsg() or
1712 # recvmsg_into(). Can be overridden to arrange cleanup based
1713 # on the returned ancillary data, for instance.
1714 pass
1715
1716 def checkRecvmsgAddress(self, addr1, addr2):
1717 # Called to compare the received address with the address of
1718 # the peer.
1719 self.assertEqual(addr1, addr2)
1720
1721 # Flags that are normally unset in msg_flags
1722 msg_flags_common_unset = 0
1723 for name in ("MSG_CTRUNC", "MSG_OOB"):
1724 msg_flags_common_unset |= getattr(socket, name, 0)
1725
1726 # Flags that are normally set
1727 msg_flags_common_set = 0
1728
1729 # Flags set when a complete record has been received (e.g. MSG_EOR
1730 # for SCTP)
1731 msg_flags_eor_indicator = 0
1732
1733 # Flags set when a complete record has not been received
1734 # (e.g. MSG_TRUNC for datagram sockets)
1735 msg_flags_non_eor_indicator = 0
1736
1737 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1738 # Method to check the value of msg_flags returned by recvmsg[_into]().
1739 #
1740 # Checks that all bits in msg_flags_common_set attribute are
1741 # set in "flags" and all bits in msg_flags_common_unset are
1742 # unset.
1743 #
1744 # The "eor" argument specifies whether the flags should
1745 # indicate that a full record (or datagram) has been received.
1746 # If "eor" is None, no checks are done; otherwise, checks
1747 # that:
1748 #
1749 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1750 # set and all bits in msg_flags_non_eor_indicator are unset
1751 #
1752 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1753 # are set and all bits in msg_flags_eor_indicator are unset
1754 #
1755 # If "checkset" and/or "checkunset" are supplied, they require
1756 # the given bits to be set or unset respectively, overriding
1757 # what the attributes require for those bits.
1758 #
1759 # If any bits are set in "ignore", they will not be checked,
1760 # regardless of the other inputs.
1761 #
1762 # Will raise Exception if the inputs require a bit to be both
1763 # set and unset, and it is not ignored.
1764
1765 defaultset = self.msg_flags_common_set
1766 defaultunset = self.msg_flags_common_unset
1767
1768 if eor:
1769 defaultset |= self.msg_flags_eor_indicator
1770 defaultunset |= self.msg_flags_non_eor_indicator
1771 elif eor is not None:
1772 defaultset |= self.msg_flags_non_eor_indicator
1773 defaultunset |= self.msg_flags_eor_indicator
1774
1775 # Function arguments override defaults
1776 defaultset &= ~checkunset
1777 defaultunset &= ~checkset
1778
1779 # Merge arguments with remaining defaults, and check for conflicts
1780 checkset |= defaultset
1781 checkunset |= defaultunset
1782 inboth = checkset & checkunset & ~ignore
1783 if inboth:
1784 raise Exception("contradictory set, unset requirements for flags "
1785 "{0:#x}".format(inboth))
1786
1787 # Compare with given msg_flags value
1788 mask = (checkset | checkunset) & ~ignore
1789 self.assertEqual(flags & mask, checkset & mask)
1790
1791
1792class RecvmsgIntoMixin(SendrecvmsgBase):
1793 # Mixin to implement doRecvmsg() using recvmsg_into().
1794
1795 def doRecvmsg(self, sock, bufsize, *args):
1796 buf = bytearray(bufsize)
1797 result = sock.recvmsg_into([buf], *args)
1798 self.registerRecvmsgResult(result)
1799 self.assertGreaterEqual(result[0], 0)
1800 self.assertLessEqual(result[0], bufsize)
1801 return (bytes(buf[:result[0]]),) + result[1:]
1802
1803
1804class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1805 # Defines flags to be checked in msg_flags for datagram sockets.
1806
1807 @property
1808 def msg_flags_non_eor_indicator(self):
1809 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1810
1811
1812class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1813 # Defines flags to be checked in msg_flags for SCTP sockets.
1814
1815 @property
1816 def msg_flags_eor_indicator(self):
1817 return super().msg_flags_eor_indicator | socket.MSG_EOR
1818
1819
1820class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1821 # Base class for tests on connectionless-mode sockets. Users must
1822 # supply sockets on attributes cli and serv to be mapped to
1823 # cli_sock and serv_sock respectively.
1824
1825 @property
1826 def serv_sock(self):
1827 return self.serv
1828
1829 @property
1830 def cli_sock(self):
1831 return self.cli
1832
1833 @property
1834 def sendmsg_to_server_defaults(self):
1835 return ([], [], 0, self.serv_addr)
1836
1837 def sendToServer(self, msg):
1838 return self.cli_sock.sendto(msg, self.serv_addr)
1839
1840
1841class SendrecvmsgConnectedBase(SendrecvmsgBase):
1842 # Base class for tests on connected sockets. Users must supply
1843 # sockets on attributes serv_conn and cli_conn (representing the
1844 # connections *to* the server and the client), to be mapped to
1845 # cli_sock and serv_sock respectively.
1846
1847 @property
1848 def serv_sock(self):
1849 return self.cli_conn
1850
1851 @property
1852 def cli_sock(self):
1853 return self.serv_conn
1854
1855 def checkRecvmsgAddress(self, addr1, addr2):
1856 # Address is currently "unspecified" for a connected socket,
1857 # so we don't examine it
1858 pass
1859
1860
1861class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1862 # Base class to set a timeout on server's socket.
1863
1864 def setUp(self):
1865 super().setUp()
1866 self.serv_sock.settimeout(self.fail_timeout)
1867
1868
1869class SendmsgTests(SendrecvmsgServerTimeoutBase):
1870 # Tests for sendmsg() which can use any socket type and do not
1871 # involve recvmsg() or recvmsg_into().
1872
1873 def testSendmsg(self):
1874 # Send a simple message with sendmsg().
1875 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1876
1877 def _testSendmsg(self):
1878 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1879
1880 def testSendmsgDataGenerator(self):
1881 # Send from buffer obtained from a generator (not a sequence).
1882 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1883
1884 def _testSendmsgDataGenerator(self):
1885 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1886 len(MSG))
1887
1888 def testSendmsgAncillaryGenerator(self):
1889 # Gather (empty) ancillary data from a generator.
1890 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1891
1892 def _testSendmsgAncillaryGenerator(self):
1893 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1894 len(MSG))
1895
1896 def testSendmsgArray(self):
1897 # Send data from an array instead of the usual bytes object.
1898 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1899
1900 def _testSendmsgArray(self):
1901 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1902 len(MSG))
1903
1904 def testSendmsgGather(self):
1905 # Send message data from more than one buffer (gather write).
1906 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1907
1908 def _testSendmsgGather(self):
1909 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1910
1911 def testSendmsgBadArgs(self):
1912 # Check that sendmsg() rejects invalid arguments.
1913 self.assertEqual(self.serv_sock.recv(1000), b"done")
1914
1915 def _testSendmsgBadArgs(self):
1916 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1917 self.assertRaises(TypeError, self.sendmsgToServer,
1918 b"not in an iterable")
1919 self.assertRaises(TypeError, self.sendmsgToServer,
1920 object())
1921 self.assertRaises(TypeError, self.sendmsgToServer,
1922 [object()])
1923 self.assertRaises(TypeError, self.sendmsgToServer,
1924 [MSG, object()])
1925 self.assertRaises(TypeError, self.sendmsgToServer,
1926 [MSG], object())
1927 self.assertRaises(TypeError, self.sendmsgToServer,
1928 [MSG], [], object())
1929 self.assertRaises(TypeError, self.sendmsgToServer,
1930 [MSG], [], 0, object())
1931 self.sendToServer(b"done")
1932
1933 def testSendmsgBadCmsg(self):
1934 # Check that invalid ancillary data items are rejected.
1935 self.assertEqual(self.serv_sock.recv(1000), b"done")
1936
1937 def _testSendmsgBadCmsg(self):
1938 self.assertRaises(TypeError, self.sendmsgToServer,
1939 [MSG], [object()])
1940 self.assertRaises(TypeError, self.sendmsgToServer,
1941 [MSG], [(object(), 0, b"data")])
1942 self.assertRaises(TypeError, self.sendmsgToServer,
1943 [MSG], [(0, object(), b"data")])
1944 self.assertRaises(TypeError, self.sendmsgToServer,
1945 [MSG], [(0, 0, object())])
1946 self.assertRaises(TypeError, self.sendmsgToServer,
1947 [MSG], [(0, 0)])
1948 self.assertRaises(TypeError, self.sendmsgToServer,
1949 [MSG], [(0, 0, b"data", 42)])
1950 self.sendToServer(b"done")
1951
1952 @requireAttrs(socket, "CMSG_SPACE")
1953 def testSendmsgBadMultiCmsg(self):
1954 # Check that invalid ancillary data items are rejected when
1955 # more than one item is present.
1956 self.assertEqual(self.serv_sock.recv(1000), b"done")
1957
1958 @testSendmsgBadMultiCmsg.client_skip
1959 def _testSendmsgBadMultiCmsg(self):
1960 self.assertRaises(TypeError, self.sendmsgToServer,
1961 [MSG], [0, 0, b""])
1962 self.assertRaises(TypeError, self.sendmsgToServer,
1963 [MSG], [(0, 0, b""), object()])
1964 self.sendToServer(b"done")
1965
1966 def testSendmsgExcessCmsgReject(self):
1967 # Check that sendmsg() rejects excess ancillary data items
1968 # when the number that can be sent is limited.
1969 self.assertEqual(self.serv_sock.recv(1000), b"done")
1970
1971 def _testSendmsgExcessCmsgReject(self):
1972 if not hasattr(socket, "CMSG_SPACE"):
1973 # Can only send one item
1974 with self.assertRaises(socket.error) as cm:
1975 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1976 self.assertIsNone(cm.exception.errno)
1977 self.sendToServer(b"done")
1978
1979 def testSendmsgAfterClose(self):
1980 # Check that sendmsg() fails on a closed socket.
1981 pass
1982
1983 def _testSendmsgAfterClose(self):
1984 self.cli_sock.close()
1985 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1986
1987
1988class SendmsgStreamTests(SendmsgTests):
1989 # Tests for sendmsg() which require a stream socket and do not
1990 # involve recvmsg() or recvmsg_into().
1991
1992 def testSendmsgExplicitNoneAddr(self):
1993 # Check that peer address can be specified as None.
1994 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1995
1996 def _testSendmsgExplicitNoneAddr(self):
1997 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1998
1999 def testSendmsgTimeout(self):
2000 # Check that timeout works with sendmsg().
2001 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2002 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2003
2004 def _testSendmsgTimeout(self):
2005 try:
2006 self.cli_sock.settimeout(0.03)
2007 with self.assertRaises(socket.timeout):
2008 while True:
2009 self.sendmsgToServer([b"a"*512])
2010 finally:
2011 self.misc_event.set()
2012
2013 # XXX: would be nice to have more tests for sendmsg flags argument.
2014
2015 # Linux supports MSG_DONTWAIT when sending, but in general, it
2016 # only works when receiving. Could add other platforms if they
2017 # support it too.
2018 @skipWithClientIf(sys.platform not in {"linux2"},
2019 "MSG_DONTWAIT not known to work on this platform when "
2020 "sending")
2021 def testSendmsgDontWait(self):
2022 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2023 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2024 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2025
2026 @testSendmsgDontWait.client_skip
2027 def _testSendmsgDontWait(self):
2028 try:
2029 with self.assertRaises(socket.error) as cm:
2030 while True:
2031 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2032 self.assertIn(cm.exception.errno,
2033 (errno.EAGAIN, errno.EWOULDBLOCK))
2034 finally:
2035 self.misc_event.set()
2036
2037
2038class SendmsgConnectionlessTests(SendmsgTests):
2039 # Tests for sendmsg() which require a connectionless-mode
2040 # (e.g. datagram) socket, and do not involve recvmsg() or
2041 # recvmsg_into().
2042
2043 def testSendmsgNoDestAddr(self):
2044 # Check that sendmsg() fails when no destination address is
2045 # given for unconnected socket.
2046 pass
2047
2048 def _testSendmsgNoDestAddr(self):
2049 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2050 [MSG])
2051 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2052 [MSG], [], 0, None)
2053
2054
2055class RecvmsgGenericTests(SendrecvmsgBase):
2056 # Tests for recvmsg() which can also be emulated using
2057 # recvmsg_into(), and can use any socket type.
2058
2059 def testRecvmsg(self):
2060 # Receive a simple message with recvmsg[_into]().
2061 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2062 self.assertEqual(msg, MSG)
2063 self.checkRecvmsgAddress(addr, self.cli_addr)
2064 self.assertEqual(ancdata, [])
2065 self.checkFlags(flags, eor=True)
2066
2067 def _testRecvmsg(self):
2068 self.sendToServer(MSG)
2069
2070 def testRecvmsgExplicitDefaults(self):
2071 # Test recvmsg[_into]() with default arguments provided explicitly.
2072 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2073 len(MSG), 0, 0)
2074 self.assertEqual(msg, MSG)
2075 self.checkRecvmsgAddress(addr, self.cli_addr)
2076 self.assertEqual(ancdata, [])
2077 self.checkFlags(flags, eor=True)
2078
2079 def _testRecvmsgExplicitDefaults(self):
2080 self.sendToServer(MSG)
2081
2082 def testRecvmsgShorter(self):
2083 # Receive a message smaller than buffer.
2084 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2085 len(MSG) + 42)
2086 self.assertEqual(msg, MSG)
2087 self.checkRecvmsgAddress(addr, self.cli_addr)
2088 self.assertEqual(ancdata, [])
2089 self.checkFlags(flags, eor=True)
2090
2091 def _testRecvmsgShorter(self):
2092 self.sendToServer(MSG)
2093
Charles-François Natali8619cd72011-10-03 19:43:15 +02002094 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2095 # datagram is received (issue #13001).
2096 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002097 def testRecvmsgTrunc(self):
2098 # Receive part of message, check for truncation indicators.
2099 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2100 len(MSG) - 3)
2101 self.assertEqual(msg, MSG[:-3])
2102 self.checkRecvmsgAddress(addr, self.cli_addr)
2103 self.assertEqual(ancdata, [])
2104 self.checkFlags(flags, eor=False)
2105
Charles-François Natali8619cd72011-10-03 19:43:15 +02002106 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002107 def _testRecvmsgTrunc(self):
2108 self.sendToServer(MSG)
2109
2110 def testRecvmsgShortAncillaryBuf(self):
2111 # Test ancillary data buffer too small to hold any ancillary data.
2112 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2113 len(MSG), 1)
2114 self.assertEqual(msg, MSG)
2115 self.checkRecvmsgAddress(addr, self.cli_addr)
2116 self.assertEqual(ancdata, [])
2117 self.checkFlags(flags, eor=True)
2118
2119 def _testRecvmsgShortAncillaryBuf(self):
2120 self.sendToServer(MSG)
2121
2122 def testRecvmsgLongAncillaryBuf(self):
2123 # Test large ancillary data buffer.
2124 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2125 len(MSG), 10240)
2126 self.assertEqual(msg, MSG)
2127 self.checkRecvmsgAddress(addr, self.cli_addr)
2128 self.assertEqual(ancdata, [])
2129 self.checkFlags(flags, eor=True)
2130
2131 def _testRecvmsgLongAncillaryBuf(self):
2132 self.sendToServer(MSG)
2133
2134 def testRecvmsgAfterClose(self):
2135 # Check that recvmsg[_into]() fails on a closed socket.
2136 self.serv_sock.close()
2137 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2138
2139 def _testRecvmsgAfterClose(self):
2140 pass
2141
2142 def testRecvmsgTimeout(self):
2143 # Check that timeout works.
2144 try:
2145 self.serv_sock.settimeout(0.03)
2146 self.assertRaises(socket.timeout,
2147 self.doRecvmsg, self.serv_sock, len(MSG))
2148 finally:
2149 self.misc_event.set()
2150
2151 def _testRecvmsgTimeout(self):
2152 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2153
2154 @requireAttrs(socket, "MSG_PEEK")
2155 def testRecvmsgPeek(self):
2156 # Check that MSG_PEEK in flags enables examination of pending
2157 # data without consuming it.
2158
2159 # Receive part of data with MSG_PEEK.
2160 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2161 len(MSG) - 3, 0,
2162 socket.MSG_PEEK)
2163 self.assertEqual(msg, MSG[:-3])
2164 self.checkRecvmsgAddress(addr, self.cli_addr)
2165 self.assertEqual(ancdata, [])
2166 # Ignoring MSG_TRUNC here (so this test is the same for stream
2167 # and datagram sockets). Some wording in POSIX seems to
2168 # suggest that it needn't be set when peeking, but that may
2169 # just be a slip.
2170 self.checkFlags(flags, eor=False,
2171 ignore=getattr(socket, "MSG_TRUNC", 0))
2172
2173 # Receive all data with MSG_PEEK.
2174 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2175 len(MSG), 0,
2176 socket.MSG_PEEK)
2177 self.assertEqual(msg, MSG)
2178 self.checkRecvmsgAddress(addr, self.cli_addr)
2179 self.assertEqual(ancdata, [])
2180 self.checkFlags(flags, eor=True)
2181
2182 # Check that the same data can still be received normally.
2183 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2184 self.assertEqual(msg, MSG)
2185 self.checkRecvmsgAddress(addr, self.cli_addr)
2186 self.assertEqual(ancdata, [])
2187 self.checkFlags(flags, eor=True)
2188
2189 @testRecvmsgPeek.client_skip
2190 def _testRecvmsgPeek(self):
2191 self.sendToServer(MSG)
2192
2193 @requireAttrs(socket.socket, "sendmsg")
2194 def testRecvmsgFromSendmsg(self):
2195 # Test receiving with recvmsg[_into]() when message is sent
2196 # using sendmsg().
2197 self.serv_sock.settimeout(self.fail_timeout)
2198 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2199 self.assertEqual(msg, MSG)
2200 self.checkRecvmsgAddress(addr, self.cli_addr)
2201 self.assertEqual(ancdata, [])
2202 self.checkFlags(flags, eor=True)
2203
2204 @testRecvmsgFromSendmsg.client_skip
2205 def _testRecvmsgFromSendmsg(self):
2206 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2207
2208
2209class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2210 # Tests which require a stream socket and can use either recvmsg()
2211 # or recvmsg_into().
2212
2213 def testRecvmsgEOF(self):
2214 # Receive end-of-stream indicator (b"", peer socket closed).
2215 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2216 self.assertEqual(msg, b"")
2217 self.checkRecvmsgAddress(addr, self.cli_addr)
2218 self.assertEqual(ancdata, [])
2219 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2220
2221 def _testRecvmsgEOF(self):
2222 self.cli_sock.close()
2223
2224 def testRecvmsgOverflow(self):
2225 # Receive a message in more than one chunk.
2226 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2227 len(MSG) - 3)
2228 self.checkRecvmsgAddress(addr, self.cli_addr)
2229 self.assertEqual(ancdata, [])
2230 self.checkFlags(flags, eor=False)
2231
2232 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2233 self.checkRecvmsgAddress(addr, self.cli_addr)
2234 self.assertEqual(ancdata, [])
2235 self.checkFlags(flags, eor=True)
2236
2237 msg = seg1 + seg2
2238 self.assertEqual(msg, MSG)
2239
2240 def _testRecvmsgOverflow(self):
2241 self.sendToServer(MSG)
2242
2243
2244class RecvmsgTests(RecvmsgGenericTests):
2245 # Tests for recvmsg() which can use any socket type.
2246
2247 def testRecvmsgBadArgs(self):
2248 # Check that recvmsg() rejects invalid arguments.
2249 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2250 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2251 -1, 0, 0)
2252 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2253 len(MSG), -1, 0)
2254 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2255 [bytearray(10)], 0, 0)
2256 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2257 object(), 0, 0)
2258 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2259 len(MSG), object(), 0)
2260 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2261 len(MSG), 0, object())
2262
2263 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2264 self.assertEqual(msg, MSG)
2265 self.checkRecvmsgAddress(addr, self.cli_addr)
2266 self.assertEqual(ancdata, [])
2267 self.checkFlags(flags, eor=True)
2268
2269 def _testRecvmsgBadArgs(self):
2270 self.sendToServer(MSG)
2271
2272
2273class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2274 # Tests for recvmsg_into() which can use any socket type.
2275
2276 def testRecvmsgIntoBadArgs(self):
2277 # Check that recvmsg_into() rejects invalid arguments.
2278 buf = bytearray(len(MSG))
2279 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2280 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2281 len(MSG), 0, 0)
2282 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2283 buf, 0, 0)
2284 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2285 [object()], 0, 0)
2286 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2287 [b"I'm not writable"], 0, 0)
2288 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2289 [buf, object()], 0, 0)
2290 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2291 [buf], -1, 0)
2292 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2293 [buf], object(), 0)
2294 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2295 [buf], 0, object())
2296
2297 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2298 self.assertEqual(nbytes, len(MSG))
2299 self.assertEqual(buf, bytearray(MSG))
2300 self.checkRecvmsgAddress(addr, self.cli_addr)
2301 self.assertEqual(ancdata, [])
2302 self.checkFlags(flags, eor=True)
2303
2304 def _testRecvmsgIntoBadArgs(self):
2305 self.sendToServer(MSG)
2306
2307 def testRecvmsgIntoGenerator(self):
2308 # Receive into buffer obtained from a generator (not a sequence).
2309 buf = bytearray(len(MSG))
2310 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2311 (o for o in [buf]))
2312 self.assertEqual(nbytes, len(MSG))
2313 self.assertEqual(buf, bytearray(MSG))
2314 self.checkRecvmsgAddress(addr, self.cli_addr)
2315 self.assertEqual(ancdata, [])
2316 self.checkFlags(flags, eor=True)
2317
2318 def _testRecvmsgIntoGenerator(self):
2319 self.sendToServer(MSG)
2320
2321 def testRecvmsgIntoArray(self):
2322 # Receive into an array rather than the usual bytearray.
2323 buf = array.array("B", [0] * len(MSG))
2324 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2325 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002326 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002327 self.checkRecvmsgAddress(addr, self.cli_addr)
2328 self.assertEqual(ancdata, [])
2329 self.checkFlags(flags, eor=True)
2330
2331 def _testRecvmsgIntoArray(self):
2332 self.sendToServer(MSG)
2333
2334 def testRecvmsgIntoScatter(self):
2335 # Receive into multiple buffers (scatter write).
2336 b1 = bytearray(b"----")
2337 b2 = bytearray(b"0123456789")
2338 b3 = bytearray(b"--------------")
2339 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2340 [b1, memoryview(b2)[2:9], b3])
2341 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2342 self.assertEqual(b1, bytearray(b"Mary"))
2343 self.assertEqual(b2, bytearray(b"01 had a 9"))
2344 self.assertEqual(b3, bytearray(b"little lamb---"))
2345 self.checkRecvmsgAddress(addr, self.cli_addr)
2346 self.assertEqual(ancdata, [])
2347 self.checkFlags(flags, eor=True)
2348
2349 def _testRecvmsgIntoScatter(self):
2350 self.sendToServer(b"Mary had a little lamb")
2351
2352
2353class CmsgMacroTests(unittest.TestCase):
2354 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2355 # assumptions used by sendmsg() and recvmsg[_into](), which share
2356 # code with these functions.
2357
2358 # Match the definition in socketmodule.c
2359 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2360
2361 @requireAttrs(socket, "CMSG_LEN")
2362 def testCMSG_LEN(self):
2363 # Test CMSG_LEN() with various valid and invalid values,
2364 # checking the assumptions used by recvmsg() and sendmsg().
2365 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2366 values = list(range(257)) + list(range(toobig - 257, toobig))
2367
2368 # struct cmsghdr has at least three members, two of which are ints
2369 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2370 for n in values:
2371 ret = socket.CMSG_LEN(n)
2372 # This is how recvmsg() calculates the data size
2373 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2374 self.assertLessEqual(ret, self.socklen_t_limit)
2375
2376 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2377 # sendmsg() shares code with these functions, and requires
2378 # that it reject values over the limit.
2379 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2380 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2381
2382 @requireAttrs(socket, "CMSG_SPACE")
2383 def testCMSG_SPACE(self):
2384 # Test CMSG_SPACE() with various valid and invalid values,
2385 # checking the assumptions used by sendmsg().
2386 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2387 values = list(range(257)) + list(range(toobig - 257, toobig))
2388
2389 last = socket.CMSG_SPACE(0)
2390 # struct cmsghdr has at least three members, two of which are ints
2391 self.assertGreater(last, array.array("i").itemsize * 2)
2392 for n in values:
2393 ret = socket.CMSG_SPACE(n)
2394 self.assertGreaterEqual(ret, last)
2395 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2396 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2397 self.assertLessEqual(ret, self.socklen_t_limit)
2398 last = ret
2399
2400 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2401 # sendmsg() shares code with these functions, and requires
2402 # that it reject values over the limit.
2403 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2404 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2405
2406
2407class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2408 # Tests for file descriptor passing on Unix-domain sockets.
2409
2410 # Invalid file descriptor value that's unlikely to evaluate to a
2411 # real FD even if one of its bytes is replaced with a different
2412 # value (which shouldn't actually happen).
2413 badfd = -0x5555
2414
2415 def newFDs(self, n):
2416 # Return a list of n file descriptors for newly-created files
2417 # containing their list indices as ASCII numbers.
2418 fds = []
2419 for i in range(n):
2420 fd, path = tempfile.mkstemp()
2421 self.addCleanup(os.unlink, path)
2422 self.addCleanup(os.close, fd)
2423 os.write(fd, str(i).encode())
2424 fds.append(fd)
2425 return fds
2426
2427 def checkFDs(self, fds):
2428 # Check that the file descriptors in the given list contain
2429 # their correct list indices as ASCII numbers.
2430 for n, fd in enumerate(fds):
2431 os.lseek(fd, 0, os.SEEK_SET)
2432 self.assertEqual(os.read(fd, 1024), str(n).encode())
2433
2434 def registerRecvmsgResult(self, result):
2435 self.addCleanup(self.closeRecvmsgFDs, result)
2436
2437 def closeRecvmsgFDs(self, recvmsg_result):
2438 # Close all file descriptors specified in the ancillary data
2439 # of the given return value from recvmsg() or recvmsg_into().
2440 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2441 if (cmsg_level == socket.SOL_SOCKET and
2442 cmsg_type == socket.SCM_RIGHTS):
2443 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002444 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002445 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2446 for fd in fds:
2447 os.close(fd)
2448
2449 def createAndSendFDs(self, n):
2450 # Send n new file descriptors created by newFDs() to the
2451 # server, with the constant MSG as the non-ancillary data.
2452 self.assertEqual(
2453 self.sendmsgToServer([MSG],
2454 [(socket.SOL_SOCKET,
2455 socket.SCM_RIGHTS,
2456 array.array("i", self.newFDs(n)))]),
2457 len(MSG))
2458
2459 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2460 # Check that constant MSG was received with numfds file
2461 # descriptors in a maximum of maxcmsgs control messages (which
2462 # must contain only complete integers). By default, check
2463 # that MSG_CTRUNC is unset, but ignore any flags in
2464 # ignoreflags.
2465 msg, ancdata, flags, addr = result
2466 self.assertEqual(msg, MSG)
2467 self.checkRecvmsgAddress(addr, self.cli_addr)
2468 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2469 ignore=ignoreflags)
2470
2471 self.assertIsInstance(ancdata, list)
2472 self.assertLessEqual(len(ancdata), maxcmsgs)
2473 fds = array.array("i")
2474 for item in ancdata:
2475 self.assertIsInstance(item, tuple)
2476 cmsg_level, cmsg_type, cmsg_data = item
2477 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2478 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2479 self.assertIsInstance(cmsg_data, bytes)
2480 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002481 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002482
2483 self.assertEqual(len(fds), numfds)
2484 self.checkFDs(fds)
2485
2486 def testFDPassSimple(self):
2487 # Pass a single FD (array read from bytes object).
2488 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2489 len(MSG), 10240))
2490
2491 def _testFDPassSimple(self):
2492 self.assertEqual(
2493 self.sendmsgToServer(
2494 [MSG],
2495 [(socket.SOL_SOCKET,
2496 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002497 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002498 len(MSG))
2499
2500 def testMultipleFDPass(self):
2501 # Pass multiple FDs in a single array.
2502 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2503 len(MSG), 10240))
2504
2505 def _testMultipleFDPass(self):
2506 self.createAndSendFDs(4)
2507
2508 @requireAttrs(socket, "CMSG_SPACE")
2509 def testFDPassCMSG_SPACE(self):
2510 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2511 self.checkRecvmsgFDs(
2512 4, self.doRecvmsg(self.serv_sock, len(MSG),
2513 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2514
2515 @testFDPassCMSG_SPACE.client_skip
2516 def _testFDPassCMSG_SPACE(self):
2517 self.createAndSendFDs(4)
2518
2519 def testFDPassCMSG_LEN(self):
2520 # Test using CMSG_LEN() to calculate ancillary buffer size.
2521 self.checkRecvmsgFDs(1,
2522 self.doRecvmsg(self.serv_sock, len(MSG),
2523 socket.CMSG_LEN(4 * SIZEOF_INT)),
2524 # RFC 3542 says implementations may set
2525 # MSG_CTRUNC if there isn't enough space
2526 # for trailing padding.
2527 ignoreflags=socket.MSG_CTRUNC)
2528
2529 def _testFDPassCMSG_LEN(self):
2530 self.createAndSendFDs(1)
2531
Nick Coghlan2496f332011-09-19 20:26:31 +10002532 # Issue #12958: The following test has problems on Mac OS X
2533 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002534 @requireAttrs(socket, "CMSG_SPACE")
2535 def testFDPassSeparate(self):
2536 # Pass two FDs in two separate arrays. Arrays may be combined
2537 # into a single control message by the OS.
2538 self.checkRecvmsgFDs(2,
2539 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2540 maxcmsgs=2)
2541
2542 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002543 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002544 def _testFDPassSeparate(self):
2545 fd0, fd1 = self.newFDs(2)
2546 self.assertEqual(
2547 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2548 socket.SCM_RIGHTS,
2549 array.array("i", [fd0])),
2550 (socket.SOL_SOCKET,
2551 socket.SCM_RIGHTS,
2552 array.array("i", [fd1]))]),
2553 len(MSG))
2554
Nick Coghlan2496f332011-09-19 20:26:31 +10002555 # Issue #12958: The following test has problems on Mac OS X
2556 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002557 @requireAttrs(socket, "CMSG_SPACE")
2558 def testFDPassSeparateMinSpace(self):
2559 # Pass two FDs in two separate arrays, receiving them into the
2560 # minimum space for two arrays.
2561 self.checkRecvmsgFDs(2,
2562 self.doRecvmsg(self.serv_sock, len(MSG),
2563 socket.CMSG_SPACE(SIZEOF_INT) +
2564 socket.CMSG_LEN(SIZEOF_INT)),
2565 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2566
2567 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002568 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002569 def _testFDPassSeparateMinSpace(self):
2570 fd0, fd1 = self.newFDs(2)
2571 self.assertEqual(
2572 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2573 socket.SCM_RIGHTS,
2574 array.array("i", [fd0])),
2575 (socket.SOL_SOCKET,
2576 socket.SCM_RIGHTS,
2577 array.array("i", [fd1]))]),
2578 len(MSG))
2579
2580 def sendAncillaryIfPossible(self, msg, ancdata):
2581 # Try to send msg and ancdata to server, but if the system
2582 # call fails, just send msg with no ancillary data.
2583 try:
2584 nbytes = self.sendmsgToServer([msg], ancdata)
2585 except socket.error as e:
2586 # Check that it was the system call that failed
2587 self.assertIsInstance(e.errno, int)
2588 nbytes = self.sendmsgToServer([msg])
2589 self.assertEqual(nbytes, len(msg))
2590
2591 def testFDPassEmpty(self):
2592 # Try to pass an empty FD array. Can receive either no array
2593 # or an empty array.
2594 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2595 len(MSG), 10240),
2596 ignoreflags=socket.MSG_CTRUNC)
2597
2598 def _testFDPassEmpty(self):
2599 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2600 socket.SCM_RIGHTS,
2601 b"")])
2602
2603 def testFDPassPartialInt(self):
2604 # Try to pass a truncated FD array.
2605 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2606 len(MSG), 10240)
2607 self.assertEqual(msg, MSG)
2608 self.checkRecvmsgAddress(addr, self.cli_addr)
2609 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2610 self.assertLessEqual(len(ancdata), 1)
2611 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2612 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2613 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2614 self.assertLess(len(cmsg_data), SIZEOF_INT)
2615
2616 def _testFDPassPartialInt(self):
2617 self.sendAncillaryIfPossible(
2618 MSG,
2619 [(socket.SOL_SOCKET,
2620 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002621 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002622
2623 @requireAttrs(socket, "CMSG_SPACE")
2624 def testFDPassPartialIntInMiddle(self):
2625 # Try to pass two FD arrays, the first of which is truncated.
2626 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2627 len(MSG), 10240)
2628 self.assertEqual(msg, MSG)
2629 self.checkRecvmsgAddress(addr, self.cli_addr)
2630 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2631 self.assertLessEqual(len(ancdata), 2)
2632 fds = array.array("i")
2633 # Arrays may have been combined in a single control message
2634 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2635 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2636 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002637 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002638 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2639 self.assertLessEqual(len(fds), 2)
2640 self.checkFDs(fds)
2641
2642 @testFDPassPartialIntInMiddle.client_skip
2643 def _testFDPassPartialIntInMiddle(self):
2644 fd0, fd1 = self.newFDs(2)
2645 self.sendAncillaryIfPossible(
2646 MSG,
2647 [(socket.SOL_SOCKET,
2648 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002649 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002650 (socket.SOL_SOCKET,
2651 socket.SCM_RIGHTS,
2652 array.array("i", [fd1]))])
2653
2654 def checkTruncatedHeader(self, result, ignoreflags=0):
2655 # Check that no ancillary data items are returned when data is
2656 # truncated inside the cmsghdr structure.
2657 msg, ancdata, flags, addr = result
2658 self.assertEqual(msg, MSG)
2659 self.checkRecvmsgAddress(addr, self.cli_addr)
2660 self.assertEqual(ancdata, [])
2661 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2662 ignore=ignoreflags)
2663
2664 def testCmsgTruncNoBufSize(self):
2665 # Check that no ancillary data is received when no buffer size
2666 # is specified.
2667 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2668 # BSD seems to set MSG_CTRUNC only
2669 # if an item has been partially
2670 # received.
2671 ignoreflags=socket.MSG_CTRUNC)
2672
2673 def _testCmsgTruncNoBufSize(self):
2674 self.createAndSendFDs(1)
2675
2676 def testCmsgTrunc0(self):
2677 # Check that no ancillary data is received when buffer size is 0.
2678 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2679 ignoreflags=socket.MSG_CTRUNC)
2680
2681 def _testCmsgTrunc0(self):
2682 self.createAndSendFDs(1)
2683
2684 # Check that no ancillary data is returned for various non-zero
2685 # (but still too small) buffer sizes.
2686
2687 def testCmsgTrunc1(self):
2688 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2689
2690 def _testCmsgTrunc1(self):
2691 self.createAndSendFDs(1)
2692
2693 def testCmsgTrunc2Int(self):
2694 # The cmsghdr structure has at least three members, two of
2695 # which are ints, so we still shouldn't see any ancillary
2696 # data.
2697 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2698 SIZEOF_INT * 2))
2699
2700 def _testCmsgTrunc2Int(self):
2701 self.createAndSendFDs(1)
2702
2703 def testCmsgTruncLen0Minus1(self):
2704 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2705 socket.CMSG_LEN(0) - 1))
2706
2707 def _testCmsgTruncLen0Minus1(self):
2708 self.createAndSendFDs(1)
2709
2710 # The following tests try to truncate the control message in the
2711 # middle of the FD array.
2712
2713 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2714 # Check that file descriptor data is truncated to between
2715 # mindata and maxdata bytes when received with buffer size
2716 # ancbuf, and that any complete file descriptor numbers are
2717 # valid.
2718 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2719 len(MSG), ancbuf)
2720 self.assertEqual(msg, MSG)
2721 self.checkRecvmsgAddress(addr, self.cli_addr)
2722 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2723
2724 if mindata == 0 and ancdata == []:
2725 return
2726 self.assertEqual(len(ancdata), 1)
2727 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2728 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2729 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2730 self.assertGreaterEqual(len(cmsg_data), mindata)
2731 self.assertLessEqual(len(cmsg_data), maxdata)
2732 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002733 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002734 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2735 self.checkFDs(fds)
2736
2737 def testCmsgTruncLen0(self):
2738 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2739
2740 def _testCmsgTruncLen0(self):
2741 self.createAndSendFDs(1)
2742
2743 def testCmsgTruncLen0Plus1(self):
2744 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2745
2746 def _testCmsgTruncLen0Plus1(self):
2747 self.createAndSendFDs(2)
2748
2749 def testCmsgTruncLen1(self):
2750 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2751 maxdata=SIZEOF_INT)
2752
2753 def _testCmsgTruncLen1(self):
2754 self.createAndSendFDs(2)
2755
2756 def testCmsgTruncLen2Minus1(self):
2757 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2758 maxdata=(2 * SIZEOF_INT) - 1)
2759
2760 def _testCmsgTruncLen2Minus1(self):
2761 self.createAndSendFDs(2)
2762
2763
2764class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2765 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2766 # features of the RFC 3542 Advanced Sockets API for IPv6.
2767 # Currently we can only handle certain data items (e.g. traffic
2768 # class, hop limit, MTU discovery and fragmentation settings)
2769 # without resorting to unportable means such as the struct module,
2770 # but the tests here are aimed at testing the ancillary data
2771 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2772 # itself.
2773
2774 # Test value to use when setting hop limit of packet
2775 hop_limit = 2
2776
2777 # Test value to use when setting traffic class of packet.
2778 # -1 means "use kernel default".
2779 traffic_class = -1
2780
2781 def ancillaryMapping(self, ancdata):
2782 # Given ancillary data list ancdata, return a mapping from
2783 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2784 # Check that no (level, type) pair appears more than once.
2785 d = {}
2786 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2787 self.assertNotIn((cmsg_level, cmsg_type), d)
2788 d[(cmsg_level, cmsg_type)] = cmsg_data
2789 return d
2790
2791 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2792 # Receive hop limit into ancbufsize bytes of ancillary data
2793 # space. Check that data is MSG, ancillary data is not
2794 # truncated (but ignore any flags in ignoreflags), and hop
2795 # limit is between 0 and maxhop inclusive.
2796 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2797 socket.IPV6_RECVHOPLIMIT, 1)
2798 self.misc_event.set()
2799 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2800 len(MSG), ancbufsize)
2801
2802 self.assertEqual(msg, MSG)
2803 self.checkRecvmsgAddress(addr, self.cli_addr)
2804 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2805 ignore=ignoreflags)
2806
2807 self.assertEqual(len(ancdata), 1)
2808 self.assertIsInstance(ancdata[0], tuple)
2809 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2810 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2811 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2812 self.assertIsInstance(cmsg_data, bytes)
2813 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2814 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002815 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002816 self.assertGreaterEqual(a[0], 0)
2817 self.assertLessEqual(a[0], maxhop)
2818
2819 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2820 def testRecvHopLimit(self):
2821 # Test receiving the packet hop limit as ancillary data.
2822 self.checkHopLimit(ancbufsize=10240)
2823
2824 @testRecvHopLimit.client_skip
2825 def _testRecvHopLimit(self):
2826 # Need to wait until server has asked to receive ancillary
2827 # data, as implementations are not required to buffer it
2828 # otherwise.
2829 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2830 self.sendToServer(MSG)
2831
2832 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2833 def testRecvHopLimitCMSG_SPACE(self):
2834 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2835 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2836
2837 @testRecvHopLimitCMSG_SPACE.client_skip
2838 def _testRecvHopLimitCMSG_SPACE(self):
2839 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2840 self.sendToServer(MSG)
2841
2842 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2843 # 3542 says portable applications must provide space for trailing
2844 # padding. Implementations may set MSG_CTRUNC if there isn't
2845 # enough space for the padding.
2846
2847 @requireAttrs(socket.socket, "sendmsg")
2848 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2849 def testSetHopLimit(self):
2850 # Test setting hop limit on outgoing packet and receiving it
2851 # at the other end.
2852 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2853
2854 @testSetHopLimit.client_skip
2855 def _testSetHopLimit(self):
2856 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2857 self.assertEqual(
2858 self.sendmsgToServer([MSG],
2859 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2860 array.array("i", [self.hop_limit]))]),
2861 len(MSG))
2862
2863 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2864 ignoreflags=0):
2865 # Receive traffic class and hop limit into ancbufsize bytes of
2866 # ancillary data space. Check that data is MSG, ancillary
2867 # data is not truncated (but ignore any flags in ignoreflags),
2868 # and traffic class and hop limit are in range (hop limit no
2869 # more than maxhop).
2870 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2871 socket.IPV6_RECVHOPLIMIT, 1)
2872 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2873 socket.IPV6_RECVTCLASS, 1)
2874 self.misc_event.set()
2875 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2876 len(MSG), ancbufsize)
2877
2878 self.assertEqual(msg, MSG)
2879 self.checkRecvmsgAddress(addr, self.cli_addr)
2880 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2881 ignore=ignoreflags)
2882 self.assertEqual(len(ancdata), 2)
2883 ancmap = self.ancillaryMapping(ancdata)
2884
2885 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2886 self.assertEqual(len(tcdata), SIZEOF_INT)
2887 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002888 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002889 self.assertGreaterEqual(a[0], 0)
2890 self.assertLessEqual(a[0], 255)
2891
2892 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2893 self.assertEqual(len(hldata), SIZEOF_INT)
2894 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002895 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002896 self.assertGreaterEqual(a[0], 0)
2897 self.assertLessEqual(a[0], maxhop)
2898
2899 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2900 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2901 def testRecvTrafficClassAndHopLimit(self):
2902 # Test receiving traffic class and hop limit as ancillary data.
2903 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2904
2905 @testRecvTrafficClassAndHopLimit.client_skip
2906 def _testRecvTrafficClassAndHopLimit(self):
2907 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2908 self.sendToServer(MSG)
2909
2910 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2911 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2912 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2913 # Test receiving traffic class and hop limit, using
2914 # CMSG_SPACE() to calculate buffer size.
2915 self.checkTrafficClassAndHopLimit(
2916 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2917
2918 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2919 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2920 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2921 self.sendToServer(MSG)
2922
2923 @requireAttrs(socket.socket, "sendmsg")
2924 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2925 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2926 def testSetTrafficClassAndHopLimit(self):
2927 # Test setting traffic class and hop limit on outgoing packet,
2928 # and receiving them at the other end.
2929 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2930 maxhop=self.hop_limit)
2931
2932 @testSetTrafficClassAndHopLimit.client_skip
2933 def _testSetTrafficClassAndHopLimit(self):
2934 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2935 self.assertEqual(
2936 self.sendmsgToServer([MSG],
2937 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2938 array.array("i", [self.traffic_class])),
2939 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2940 array.array("i", [self.hop_limit]))]),
2941 len(MSG))
2942
2943 @requireAttrs(socket.socket, "sendmsg")
2944 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2945 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2946 def testOddCmsgSize(self):
2947 # Try to send ancillary data with first item one byte too
2948 # long. Fall back to sending with correct size if this fails,
2949 # and check that second item was handled correctly.
2950 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2951 maxhop=self.hop_limit)
2952
2953 @testOddCmsgSize.client_skip
2954 def _testOddCmsgSize(self):
2955 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2956 try:
2957 nbytes = self.sendmsgToServer(
2958 [MSG],
2959 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002960 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002961 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2962 array.array("i", [self.hop_limit]))])
2963 except socket.error as e:
2964 self.assertIsInstance(e.errno, int)
2965 nbytes = self.sendmsgToServer(
2966 [MSG],
2967 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2968 array.array("i", [self.traffic_class])),
2969 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2970 array.array("i", [self.hop_limit]))])
2971 self.assertEqual(nbytes, len(MSG))
2972
2973 # Tests for proper handling of truncated ancillary data
2974
2975 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2976 # Receive hop limit into ancbufsize bytes of ancillary data
2977 # space, which should be too small to contain the ancillary
2978 # data header (if ancbufsize is None, pass no second argument
2979 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2980 # (unless included in ignoreflags), and no ancillary data is
2981 # returned.
2982 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2983 socket.IPV6_RECVHOPLIMIT, 1)
2984 self.misc_event.set()
2985 args = () if ancbufsize is None else (ancbufsize,)
2986 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2987 len(MSG), *args)
2988
2989 self.assertEqual(msg, MSG)
2990 self.checkRecvmsgAddress(addr, self.cli_addr)
2991 self.assertEqual(ancdata, [])
2992 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2993 ignore=ignoreflags)
2994
2995 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2996 def testCmsgTruncNoBufSize(self):
2997 # Check that no ancillary data is received when no ancillary
2998 # buffer size is provided.
2999 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3000 # BSD seems to set
3001 # MSG_CTRUNC only if an item
3002 # has been partially
3003 # received.
3004 ignoreflags=socket.MSG_CTRUNC)
3005
3006 @testCmsgTruncNoBufSize.client_skip
3007 def _testCmsgTruncNoBufSize(self):
3008 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3009 self.sendToServer(MSG)
3010
3011 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3012 def testSingleCmsgTrunc0(self):
3013 # Check that no ancillary data is received when ancillary
3014 # buffer size is zero.
3015 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3016 ignoreflags=socket.MSG_CTRUNC)
3017
3018 @testSingleCmsgTrunc0.client_skip
3019 def _testSingleCmsgTrunc0(self):
3020 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3021 self.sendToServer(MSG)
3022
3023 # Check that no ancillary data is returned for various non-zero
3024 # (but still too small) buffer sizes.
3025
3026 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3027 def testSingleCmsgTrunc1(self):
3028 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3029
3030 @testSingleCmsgTrunc1.client_skip
3031 def _testSingleCmsgTrunc1(self):
3032 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3033 self.sendToServer(MSG)
3034
3035 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3036 def testSingleCmsgTrunc2Int(self):
3037 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3038
3039 @testSingleCmsgTrunc2Int.client_skip
3040 def _testSingleCmsgTrunc2Int(self):
3041 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3042 self.sendToServer(MSG)
3043
3044 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3045 def testSingleCmsgTruncLen0Minus1(self):
3046 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3047
3048 @testSingleCmsgTruncLen0Minus1.client_skip
3049 def _testSingleCmsgTruncLen0Minus1(self):
3050 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3051 self.sendToServer(MSG)
3052
3053 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3054 def testSingleCmsgTruncInData(self):
3055 # Test truncation of a control message inside its associated
3056 # data. The message may be returned with its data truncated,
3057 # or not returned at all.
3058 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3059 socket.IPV6_RECVHOPLIMIT, 1)
3060 self.misc_event.set()
3061 msg, ancdata, flags, addr = self.doRecvmsg(
3062 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3063
3064 self.assertEqual(msg, MSG)
3065 self.checkRecvmsgAddress(addr, self.cli_addr)
3066 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3067
3068 self.assertLessEqual(len(ancdata), 1)
3069 if ancdata:
3070 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3071 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3072 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3073 self.assertLess(len(cmsg_data), SIZEOF_INT)
3074
3075 @testSingleCmsgTruncInData.client_skip
3076 def _testSingleCmsgTruncInData(self):
3077 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3078 self.sendToServer(MSG)
3079
3080 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3081 # Receive traffic class and hop limit into ancbufsize bytes of
3082 # ancillary data space, which should be large enough to
3083 # contain the first item, but too small to contain the header
3084 # of the second. Check that data is MSG, MSG_CTRUNC is set
3085 # (unless included in ignoreflags), and only one ancillary
3086 # data item is returned.
3087 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3088 socket.IPV6_RECVHOPLIMIT, 1)
3089 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3090 socket.IPV6_RECVTCLASS, 1)
3091 self.misc_event.set()
3092 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3093 len(MSG), ancbufsize)
3094
3095 self.assertEqual(msg, MSG)
3096 self.checkRecvmsgAddress(addr, self.cli_addr)
3097 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3098 ignore=ignoreflags)
3099
3100 self.assertEqual(len(ancdata), 1)
3101 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3102 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3103 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3104 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3105 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003106 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003107 self.assertGreaterEqual(a[0], 0)
3108 self.assertLessEqual(a[0], 255)
3109
3110 # Try the above test with various buffer sizes.
3111
3112 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3113 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3114 def testSecondCmsgTrunc0(self):
3115 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3116 ignoreflags=socket.MSG_CTRUNC)
3117
3118 @testSecondCmsgTrunc0.client_skip
3119 def _testSecondCmsgTrunc0(self):
3120 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3121 self.sendToServer(MSG)
3122
3123 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3124 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3125 def testSecondCmsgTrunc1(self):
3126 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3127
3128 @testSecondCmsgTrunc1.client_skip
3129 def _testSecondCmsgTrunc1(self):
3130 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3131 self.sendToServer(MSG)
3132
3133 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3134 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3135 def testSecondCmsgTrunc2Int(self):
3136 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3137 2 * SIZEOF_INT)
3138
3139 @testSecondCmsgTrunc2Int.client_skip
3140 def _testSecondCmsgTrunc2Int(self):
3141 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3142 self.sendToServer(MSG)
3143
3144 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3145 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3146 def testSecondCmsgTruncLen0Minus1(self):
3147 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3148 socket.CMSG_LEN(0) - 1)
3149
3150 @testSecondCmsgTruncLen0Minus1.client_skip
3151 def _testSecondCmsgTruncLen0Minus1(self):
3152 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3153 self.sendToServer(MSG)
3154
3155 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3156 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3157 def testSecomdCmsgTruncInData(self):
3158 # Test truncation of the second of two control messages inside
3159 # its associated data.
3160 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3161 socket.IPV6_RECVHOPLIMIT, 1)
3162 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3163 socket.IPV6_RECVTCLASS, 1)
3164 self.misc_event.set()
3165 msg, ancdata, flags, addr = self.doRecvmsg(
3166 self.serv_sock, len(MSG),
3167 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3168
3169 self.assertEqual(msg, MSG)
3170 self.checkRecvmsgAddress(addr, self.cli_addr)
3171 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3172
3173 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3174
3175 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3176 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3177 cmsg_types.remove(cmsg_type)
3178 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3179 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003180 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003181 self.assertGreaterEqual(a[0], 0)
3182 self.assertLessEqual(a[0], 255)
3183
3184 if ancdata:
3185 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3186 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3187 cmsg_types.remove(cmsg_type)
3188 self.assertLess(len(cmsg_data), SIZEOF_INT)
3189
3190 self.assertEqual(ancdata, [])
3191
3192 @testSecomdCmsgTruncInData.client_skip
3193 def _testSecomdCmsgTruncInData(self):
3194 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3195 self.sendToServer(MSG)
3196
3197
3198# Derive concrete test classes for different socket types.
3199
3200class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3201 SendrecvmsgConnectionlessBase,
3202 ThreadedSocketTestMixin, UDPTestBase):
3203 pass
3204
3205@requireAttrs(socket.socket, "sendmsg")
3206@unittest.skipUnless(thread, 'Threading required for this test.')
3207class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3208 pass
3209
3210@requireAttrs(socket.socket, "recvmsg")
3211@unittest.skipUnless(thread, 'Threading required for this test.')
3212class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3213 pass
3214
3215@requireAttrs(socket.socket, "recvmsg_into")
3216@unittest.skipUnless(thread, 'Threading required for this test.')
3217class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3218 pass
3219
3220
3221class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3222 SendrecvmsgConnectionlessBase,
3223 ThreadedSocketTestMixin, UDP6TestBase):
3224 pass
3225
3226@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003227@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003228@requireSocket("AF_INET6", "SOCK_DGRAM")
3229@unittest.skipUnless(thread, 'Threading required for this test.')
3230class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3231 pass
3232
3233@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003234@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003235@requireSocket("AF_INET6", "SOCK_DGRAM")
3236@unittest.skipUnless(thread, 'Threading required for this test.')
3237class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3238 pass
3239
3240@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003241@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003242@requireSocket("AF_INET6", "SOCK_DGRAM")
3243@unittest.skipUnless(thread, 'Threading required for this test.')
3244class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3245 pass
3246
3247@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003248@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003249@requireAttrs(socket, "IPPROTO_IPV6")
3250@requireSocket("AF_INET6", "SOCK_DGRAM")
3251@unittest.skipUnless(thread, 'Threading required for this test.')
3252class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3253 SendrecvmsgUDP6TestBase):
3254 pass
3255
3256@requireAttrs(socket.socket, "recvmsg_into")
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 RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3262 RFC3542AncillaryTest,
3263 SendrecvmsgUDP6TestBase):
3264 pass
3265
3266
3267class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3268 ConnectedStreamTestMixin, TCPTestBase):
3269 pass
3270
3271@requireAttrs(socket.socket, "sendmsg")
3272@unittest.skipUnless(thread, 'Threading required for this test.')
3273class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3274 pass
3275
3276@requireAttrs(socket.socket, "recvmsg")
3277@unittest.skipUnless(thread, 'Threading required for this test.')
3278class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3279 SendrecvmsgTCPTestBase):
3280 pass
3281
3282@requireAttrs(socket.socket, "recvmsg_into")
3283@unittest.skipUnless(thread, 'Threading required for this test.')
3284class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3285 SendrecvmsgTCPTestBase):
3286 pass
3287
3288
3289class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3290 SendrecvmsgConnectedBase,
3291 ConnectedStreamTestMixin, SCTPStreamBase):
3292 pass
3293
3294@requireAttrs(socket.socket, "sendmsg")
3295@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3296@unittest.skipUnless(thread, 'Threading required for this test.')
3297class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3298 pass
3299
3300@requireAttrs(socket.socket, "recvmsg")
3301@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3302@unittest.skipUnless(thread, 'Threading required for this test.')
3303class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3304 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003305
3306 def testRecvmsgEOF(self):
3307 try:
3308 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3309 except OSError as e:
3310 if e.errno != errno.ENOTCONN:
3311 raise
3312 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003313
3314@requireAttrs(socket.socket, "recvmsg_into")
3315@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3316@unittest.skipUnless(thread, 'Threading required for this test.')
3317class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3318 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003319
3320 def testRecvmsgEOF(self):
3321 try:
3322 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3323 except OSError as e:
3324 if e.errno != errno.ENOTCONN:
3325 raise
3326 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003327
3328
3329class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3330 ConnectedStreamTestMixin, UnixStreamBase):
3331 pass
3332
3333@requireAttrs(socket.socket, "sendmsg")
3334@requireAttrs(socket, "AF_UNIX")
3335@unittest.skipUnless(thread, 'Threading required for this test.')
3336class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3337 pass
3338
3339@requireAttrs(socket.socket, "recvmsg")
3340@requireAttrs(socket, "AF_UNIX")
3341@unittest.skipUnless(thread, 'Threading required for this test.')
3342class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3343 SendrecvmsgUnixStreamTestBase):
3344 pass
3345
3346@requireAttrs(socket.socket, "recvmsg_into")
3347@requireAttrs(socket, "AF_UNIX")
3348@unittest.skipUnless(thread, 'Threading required for this test.')
3349class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3350 SendrecvmsgUnixStreamTestBase):
3351 pass
3352
3353@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3354@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3355@unittest.skipUnless(thread, 'Threading required for this test.')
3356class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3357 pass
3358
3359@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3360@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3361@unittest.skipUnless(thread, 'Threading required for this test.')
3362class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3363 SendrecvmsgUnixStreamTestBase):
3364 pass
3365
3366
3367# Test interrupting the interruptible send/receive methods with a
3368# signal when a timeout is set. These tests avoid having multiple
3369# threads alive during the test so that the OS cannot deliver the
3370# signal to the wrong one.
3371
3372class InterruptedTimeoutBase(unittest.TestCase):
3373 # Base class for interrupted send/receive tests. Installs an
3374 # empty handler for SIGALRM and removes it on teardown, along with
3375 # any scheduled alarms.
3376
3377 def setUp(self):
3378 super().setUp()
3379 orig_alrm_handler = signal.signal(signal.SIGALRM,
3380 lambda signum, frame: None)
3381 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3382 self.addCleanup(self.setAlarm, 0)
3383
3384 # Timeout for socket operations
3385 timeout = 4.0
3386
3387 # Provide setAlarm() method to schedule delivery of SIGALRM after
3388 # given number of seconds, or cancel it if zero, and an
3389 # appropriate time value to use. Use setitimer() if available.
3390 if hasattr(signal, "setitimer"):
3391 alarm_time = 0.05
3392
3393 def setAlarm(self, seconds):
3394 signal.setitimer(signal.ITIMER_REAL, seconds)
3395 else:
3396 # Old systems may deliver the alarm up to one second early
3397 alarm_time = 2
3398
3399 def setAlarm(self, seconds):
3400 signal.alarm(seconds)
3401
3402
3403# Require siginterrupt() in order to ensure that system calls are
3404# interrupted by default.
3405@requireAttrs(signal, "siginterrupt")
3406@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3407 "Don't have signal.alarm or signal.setitimer")
3408class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3409 # Test interrupting the recv*() methods with signals when a
3410 # timeout is set.
3411
3412 def setUp(self):
3413 super().setUp()
3414 self.serv.settimeout(self.timeout)
3415
3416 def checkInterruptedRecv(self, func, *args, **kwargs):
3417 # Check that func(*args, **kwargs) raises socket.error with an
3418 # errno of EINTR when interrupted by a signal.
3419 self.setAlarm(self.alarm_time)
3420 with self.assertRaises(socket.error) as cm:
3421 func(*args, **kwargs)
3422 self.assertNotIsInstance(cm.exception, socket.timeout)
3423 self.assertEqual(cm.exception.errno, errno.EINTR)
3424
3425 def testInterruptedRecvTimeout(self):
3426 self.checkInterruptedRecv(self.serv.recv, 1024)
3427
3428 def testInterruptedRecvIntoTimeout(self):
3429 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3430
3431 def testInterruptedRecvfromTimeout(self):
3432 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3433
3434 def testInterruptedRecvfromIntoTimeout(self):
3435 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3436
3437 @requireAttrs(socket.socket, "recvmsg")
3438 def testInterruptedRecvmsgTimeout(self):
3439 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3440
3441 @requireAttrs(socket.socket, "recvmsg_into")
3442 def testInterruptedRecvmsgIntoTimeout(self):
3443 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3444
3445
3446# Require siginterrupt() in order to ensure that system calls are
3447# interrupted by default.
3448@requireAttrs(signal, "siginterrupt")
3449@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3450 "Don't have signal.alarm or signal.setitimer")
3451@unittest.skipUnless(thread, 'Threading required for this test.')
3452class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3453 ThreadSafeCleanupTestCase,
3454 SocketListeningTestMixin, TCPTestBase):
3455 # Test interrupting the interruptible send*() methods with signals
3456 # when a timeout is set.
3457
3458 def setUp(self):
3459 super().setUp()
3460 self.serv_conn = self.newSocket()
3461 self.addCleanup(self.serv_conn.close)
3462 # Use a thread to complete the connection, but wait for it to
3463 # terminate before running the test, so that there is only one
3464 # thread to accept the signal.
3465 cli_thread = threading.Thread(target=self.doConnect)
3466 cli_thread.start()
3467 self.cli_conn, addr = self.serv.accept()
3468 self.addCleanup(self.cli_conn.close)
3469 cli_thread.join()
3470 self.serv_conn.settimeout(self.timeout)
3471
3472 def doConnect(self):
3473 self.serv_conn.connect(self.serv_addr)
3474
3475 def checkInterruptedSend(self, func, *args, **kwargs):
3476 # Check that func(*args, **kwargs), run in a loop, raises
3477 # socket.error with an errno of EINTR when interrupted by a
3478 # signal.
3479 with self.assertRaises(socket.error) as cm:
3480 while True:
3481 self.setAlarm(self.alarm_time)
3482 func(*args, **kwargs)
3483 self.assertNotIsInstance(cm.exception, socket.timeout)
3484 self.assertEqual(cm.exception.errno, errno.EINTR)
3485
Nick Coghlan2496f332011-09-19 20:26:31 +10003486 # Issue #12958: The following tests have problems on Mac OS X
3487 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003488 def testInterruptedSendTimeout(self):
3489 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3490
Nick Coghlan2496f332011-09-19 20:26:31 +10003491 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003492 def testInterruptedSendtoTimeout(self):
3493 # Passing an actual address here as Python's wrapper for
3494 # sendto() doesn't allow passing a zero-length one; POSIX
3495 # requires that the address is ignored since the socket is
3496 # connection-mode, however.
3497 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3498 self.serv_addr)
3499
Nick Coghlan2496f332011-09-19 20:26:31 +10003500 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003501 @requireAttrs(socket.socket, "sendmsg")
3502 def testInterruptedSendmsgTimeout(self):
3503 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3504
3505
Victor Stinner45df8202010-04-28 22:31:17 +00003506@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003507class TCPCloserTest(ThreadedTCPSocketTest):
3508
3509 def testClose(self):
3510 conn, addr = self.serv.accept()
3511 conn.close()
3512
3513 sd = self.cli
3514 read, write, err = select.select([sd], [], [], 1.0)
3515 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003516 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003517
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003518 # Calling close() many times should be safe.
3519 conn.close()
3520 conn.close()
3521
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003522 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003523 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003524 time.sleep(1.0)
3525
Victor Stinner45df8202010-04-28 22:31:17 +00003526@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003527class BasicSocketPairTest(SocketPairTest):
3528
3529 def __init__(self, methodName='runTest'):
3530 SocketPairTest.__init__(self, methodName=methodName)
3531
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003532 def _check_defaults(self, sock):
3533 self.assertIsInstance(sock, socket.socket)
3534 if hasattr(socket, 'AF_UNIX'):
3535 self.assertEqual(sock.family, socket.AF_UNIX)
3536 else:
3537 self.assertEqual(sock.family, socket.AF_INET)
3538 self.assertEqual(sock.type, socket.SOCK_STREAM)
3539 self.assertEqual(sock.proto, 0)
3540
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003541 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003542 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003543
3544 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003545 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003546
Dave Cole331708b2004-08-09 04:51:41 +00003547 def testRecv(self):
3548 msg = self.serv.recv(1024)
3549 self.assertEqual(msg, MSG)
3550
3551 def _testRecv(self):
3552 self.cli.send(MSG)
3553
3554 def testSend(self):
3555 self.serv.send(MSG)
3556
3557 def _testSend(self):
3558 msg = self.cli.recv(1024)
3559 self.assertEqual(msg, MSG)
3560
Victor Stinner45df8202010-04-28 22:31:17 +00003561@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003562class NonBlockingTCPTests(ThreadedTCPSocketTest):
3563
3564 def __init__(self, methodName='runTest'):
3565 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3566
3567 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003568 # Testing whether set blocking works
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02003569 self.serv.setblocking(True)
3570 self.assertIsNone(self.serv.gettimeout())
3571 self.serv.setblocking(False)
3572 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003573 start = time.time()
3574 try:
3575 self.serv.accept()
3576 except socket.error:
3577 pass
3578 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003579 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02003580 # Issue 15989
3581 if _testcapi.UINT_MAX < _testcapi.ULONG_MAX:
3582 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3583 self.assertIsNone(self.serv.gettimeout())
Guido van Rossum24e4af82002-06-12 19:18:08 +00003584
3585 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003586 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003587
Antoine Pitroub1c54962010-10-14 15:05:38 +00003588 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003589 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003590 def testInitNonBlocking(self):
3591 # reinit server socket
3592 self.serv.close()
3593 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003594 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003595 self.port = support.bind_port(self.serv)
3596 self.serv.listen(1)
3597 # actual testing
3598 start = time.time()
3599 try:
3600 self.serv.accept()
3601 except socket.error:
3602 pass
3603 end = time.time()
3604 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3605
3606 def _testInitNonBlocking(self):
3607 pass
3608
Antoine Pitrou600232b2011-01-05 21:03:42 +00003609 def testInheritFlags(self):
3610 # Issue #7995: when calling accept() on a listening socket with a
3611 # timeout, the resulting socket should not be non-blocking.
3612 self.serv.settimeout(10)
3613 try:
3614 conn, addr = self.serv.accept()
3615 message = conn.recv(len(MSG))
3616 finally:
3617 conn.close()
3618 self.serv.settimeout(None)
3619
3620 def _testInheritFlags(self):
3621 time.sleep(0.1)
3622 self.cli.connect((HOST, self.port))
3623 time.sleep(0.5)
3624 self.cli.send(MSG)
3625
Guido van Rossum24e4af82002-06-12 19:18:08 +00003626 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003627 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003628 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003629 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003630 conn, addr = self.serv.accept()
3631 except socket.error:
3632 pass
3633 else:
3634 self.fail("Error trying to do non-blocking accept.")
3635 read, write, err = select.select([self.serv], [], [])
3636 if self.serv in read:
3637 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003638 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003639 else:
3640 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003641
Guido van Rossum24e4af82002-06-12 19:18:08 +00003642 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003643 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003644 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003645
3646 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003647 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003648 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003649 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003650
3651 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003652 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003653 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003654
3655 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003656 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003657 conn, addr = self.serv.accept()
3658 conn.setblocking(0)
3659 try:
3660 msg = conn.recv(len(MSG))
3661 except socket.error:
3662 pass
3663 else:
3664 self.fail("Error trying to do non-blocking recv.")
3665 read, write, err = select.select([conn], [], [])
3666 if conn in read:
3667 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003668 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003669 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003670 else:
3671 self.fail("Error during select call to non-blocking socket.")
3672
3673 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003674 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003675 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003676 self.cli.send(MSG)
3677
Victor Stinner45df8202010-04-28 22:31:17 +00003678@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003679class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003680 """Unit tests for the object returned by socket.makefile()
3681
Antoine Pitrou834bd812010-10-13 16:17:14 +00003682 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003683 the client connection. You can read from this file to
3684 get output from the server.
3685
Antoine Pitrou834bd812010-10-13 16:17:14 +00003686 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003687 server connection. You can write to this file to send output
3688 to the client.
3689 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003690
Guido van Rossume9f66142002-08-07 15:46:19 +00003691 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003692 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003693 errors = 'strict'
3694 newline = None
3695
3696 read_mode = 'rb'
3697 read_msg = MSG
3698 write_mode = 'wb'
3699 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003700
Guido van Rossum24e4af82002-06-12 19:18:08 +00003701 def __init__(self, methodName='runTest'):
3702 SocketConnectedTest.__init__(self, methodName=methodName)
3703
3704 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003705 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3706 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003707 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003708 self.read_file = self.cli_conn.makefile(
3709 self.read_mode, self.bufsize,
3710 encoding = self.encoding,
3711 errors = self.errors,
3712 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003713
3714 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003715 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003716 self.read_file.close()
3717 self.assertTrue(self.read_file.closed)
3718 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003719 SocketConnectedTest.tearDown(self)
3720
3721 def clientSetUp(self):
3722 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003723 self.write_file = self.serv_conn.makefile(
3724 self.write_mode, self.bufsize,
3725 encoding = self.encoding,
3726 errors = self.errors,
3727 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003728
3729 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003730 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003731 self.write_file.close()
3732 self.assertTrue(self.write_file.closed)
3733 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003734 SocketConnectedTest.clientTearDown(self)
3735
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003736 def testReadAfterTimeout(self):
3737 # Issue #7322: A file object must disallow further reads
3738 # after a timeout has occurred.
3739 self.cli_conn.settimeout(1)
3740 self.read_file.read(3)
3741 # First read raises a timeout
3742 self.assertRaises(socket.timeout, self.read_file.read, 1)
3743 # Second read is disallowed
3744 with self.assertRaises(IOError) as ctx:
3745 self.read_file.read(1)
3746 self.assertIn("cannot read from timed out object", str(ctx.exception))
3747
3748 def _testReadAfterTimeout(self):
3749 self.write_file.write(self.write_msg[0:3])
3750 self.write_file.flush()
3751 self.serv_finished.wait()
3752
Guido van Rossum24e4af82002-06-12 19:18:08 +00003753 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003754 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003755 first_seg = self.read_file.read(len(self.read_msg)-3)
3756 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003757 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003758 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003759
3760 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003761 self.write_file.write(self.write_msg)
3762 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003763
Guido van Rossum8c943832002-08-08 01:00:28 +00003764 def testFullRead(self):
3765 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003766 msg = self.read_file.read()
3767 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003768
3769 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003770 self.write_file.write(self.write_msg)
3771 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003772
Guido van Rossum24e4af82002-06-12 19:18:08 +00003773 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003774 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003775 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003776 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003777 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003778 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003779 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003780 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003781 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003782
3783 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003784 self.write_file.write(self.write_msg)
3785 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003786
3787 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003788 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003789 line = self.read_file.readline()
3790 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003791
3792 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003793 self.write_file.write(self.write_msg)
3794 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003795
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003796 def testCloseAfterMakefile(self):
3797 # The file returned by makefile should keep the socket open.
3798 self.cli_conn.close()
3799 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003800 msg = self.read_file.read()
3801 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003802
3803 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003804 self.write_file.write(self.write_msg)
3805 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003806
3807 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003808 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003809 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003810 if isinstance(self.read_msg, str):
3811 msg = msg.decode()
3812 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003813
3814 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003815 self.write_file.write(self.write_msg)
3816 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003817
Tim Peters116d83c2004-03-28 02:20:45 +00003818 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003819 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003820
3821 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003822 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003823
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003824 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003825 self.assertEqual(self.read_file.mode, self.read_mode)
3826 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003827
3828 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003829 self.assertEqual(self.write_file.mode, self.write_mode)
3830 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003831
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003832 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003833 self.read_file.close()
3834 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003835 self.cli_conn.close()
3836 self.assertRaises(socket.error, self.cli_conn.getsockname)
3837
3838 def _testRealClose(self):
3839 pass
3840
3841
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003842class FileObjectInterruptedTestCase(unittest.TestCase):
3843 """Test that the file object correctly handles EINTR internally."""
3844
3845 class MockSocket(object):
3846 def __init__(self, recv_funcs=()):
3847 # A generator that returns callables that we'll call for each
3848 # call to recv().
3849 self._recv_step = iter(recv_funcs)
3850
3851 def recv_into(self, buffer):
3852 data = next(self._recv_step)()
3853 assert len(buffer) >= len(data)
3854 buffer[:len(data)] = data
3855 return len(data)
3856
3857 def _decref_socketios(self):
3858 pass
3859
3860 def _textiowrap_for_test(self, buffering=-1):
3861 raw = socket.SocketIO(self, "r")
3862 if buffering < 0:
3863 buffering = io.DEFAULT_BUFFER_SIZE
3864 if buffering == 0:
3865 return raw
3866 buffer = io.BufferedReader(raw, buffering)
3867 text = io.TextIOWrapper(buffer, None, None)
3868 text.mode = "rb"
3869 return text
3870
3871 @staticmethod
3872 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003873 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003874
3875 def _textiowrap_mock_socket(self, mock, buffering=-1):
3876 raw = socket.SocketIO(mock, "r")
3877 if buffering < 0:
3878 buffering = io.DEFAULT_BUFFER_SIZE
3879 if buffering == 0:
3880 return raw
3881 buffer = io.BufferedReader(raw, buffering)
3882 text = io.TextIOWrapper(buffer, None, None)
3883 text.mode = "rb"
3884 return text
3885
3886 def _test_readline(self, size=-1, buffering=-1):
3887 mock_sock = self.MockSocket(recv_funcs=[
3888 lambda : b"This is the first line\nAnd the sec",
3889 self._raise_eintr,
3890 lambda : b"ond line is here\n",
3891 lambda : b"",
3892 lambda : b"", # XXX(gps): io library does an extra EOF read
3893 ])
3894 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003895 self.assertEqual(fo.readline(size), "This is the first line\n")
3896 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003897
3898 def _test_read(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 expecting = (b"This is the first line\n"
3907 b"And the second line is here\n")
3908 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3909 if buffering == 0:
3910 data = b''
3911 else:
3912 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003913 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003914 while len(data) != len(expecting):
3915 part = fo.read(size)
3916 if not part:
3917 break
3918 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003919 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003920
3921 def test_default(self):
3922 self._test_readline()
3923 self._test_readline(size=100)
3924 self._test_read()
3925 self._test_read(size=100)
3926
3927 def test_with_1k_buffer(self):
3928 self._test_readline(buffering=1024)
3929 self._test_readline(size=100, buffering=1024)
3930 self._test_read(buffering=1024)
3931 self._test_read(size=100, buffering=1024)
3932
3933 def _test_readline_no_buffer(self, size=-1):
3934 mock_sock = self.MockSocket(recv_funcs=[
3935 lambda : b"a",
3936 lambda : b"\n",
3937 lambda : b"B",
3938 self._raise_eintr,
3939 lambda : b"b",
3940 lambda : b"",
3941 ])
3942 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003943 self.assertEqual(fo.readline(size), b"a\n")
3944 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003945
3946 def test_no_buffer(self):
3947 self._test_readline_no_buffer()
3948 self._test_readline_no_buffer(size=4)
3949 self._test_read(buffering=0)
3950 self._test_read(size=100, buffering=0)
3951
3952
Guido van Rossume9f66142002-08-07 15:46:19 +00003953class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3954
3955 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003956
Guido van Rossume9f66142002-08-07 15:46:19 +00003957 In this case (and in this case only), it should be possible to
3958 create a file object, read a line from it, create another file
3959 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003960 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003961 when reading multiple requests from the same socket."""
3962
3963 bufsize = 0 # Use unbuffered mode
3964
3965 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003966 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003967 line = self.read_file.readline() # first line
3968 self.assertEqual(line, b"A. " + self.write_msg) # first line
3969 self.read_file = self.cli_conn.makefile('rb', 0)
3970 line = self.read_file.readline() # second line
3971 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003972
3973 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003974 self.write_file.write(b"A. " + self.write_msg)
3975 self.write_file.write(b"B. " + self.write_msg)
3976 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003977
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003978 def testMakefileClose(self):
3979 # The file returned by makefile should keep the socket open...
3980 self.cli_conn.close()
3981 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003982 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003983 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003984 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003985 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3986
3987 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003988 self.write_file.write(self.write_msg)
3989 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003990
3991 def testMakefileCloseSocketDestroy(self):
3992 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003993 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003994 refcount_after = sys.getrefcount(self.cli_conn)
3995 self.assertEqual(refcount_before - 1, refcount_after)
3996
3997 def _testMakefileCloseSocketDestroy(self):
3998 pass
3999
Antoine Pitrou98b46702010-09-18 22:59:00 +00004000 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004001 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004002 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4003
4004 def testSmallReadNonBlocking(self):
4005 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004006 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4007 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004008 self.evt1.set()
4009 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004010 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004011 if first_seg is None:
4012 # Data not arrived (can happen under Windows), wait a bit
4013 time.sleep(0.5)
4014 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004015 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004016 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004017 self.assertEqual(n, 3)
4018 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004019 self.assertEqual(msg, self.read_msg)
4020 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4021 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004022
4023 def _testSmallReadNonBlocking(self):
4024 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004025 self.write_file.write(self.write_msg)
4026 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004027 self.evt2.set()
4028 # Avoid cloding the socket before the server test has finished,
4029 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4030 self.serv_finished.wait(5.0)
4031
4032 def testWriteNonBlocking(self):
4033 self.cli_finished.wait(5.0)
4034 # The client thread can't skip directly - the SkipTest exception
4035 # would appear as a failure.
4036 if self.serv_skipped:
4037 self.skipTest(self.serv_skipped)
4038
4039 def _testWriteNonBlocking(self):
4040 self.serv_skipped = None
4041 self.serv_conn.setblocking(False)
4042 # Try to saturate the socket buffer pipe with repeated large writes.
4043 BIG = b"x" * (1024 ** 2)
4044 LIMIT = 10
4045 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004046 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004047 self.assertGreater(n, 0)
4048 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004049 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004050 if n is None:
4051 # Succeeded
4052 break
4053 self.assertGreater(n, 0)
4054 else:
4055 # Let us know that this test didn't manage to establish
4056 # the expected conditions. This is not a failure in itself but,
4057 # if it happens repeatedly, the test should be fixed.
4058 self.serv_skipped = "failed to saturate the socket buffer"
4059
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004060
Guido van Rossum8c943832002-08-08 01:00:28 +00004061class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4062
4063 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4064
4065
4066class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4067
4068 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004069
Thomas Woutersb2137042007-02-01 18:02:27 +00004070
Antoine Pitrou834bd812010-10-13 16:17:14 +00004071class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4072 """Tests for socket.makefile() in text mode (rather than binary)"""
4073
4074 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004075 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004076 write_mode = 'wb'
4077 write_msg = MSG
4078 newline = ''
4079
4080
4081class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4082 """Tests for socket.makefile() in text mode (rather than binary)"""
4083
4084 read_mode = 'rb'
4085 read_msg = MSG
4086 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004087 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004088 newline = ''
4089
4090
4091class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4092 """Tests for socket.makefile() in text mode (rather than binary)"""
4093
4094 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004095 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004096 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004097 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004098 newline = ''
4099
4100
Guido van Rossumd8faa362007-04-27 19:54:29 +00004101class NetworkConnectionTest(object):
4102 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004103
Guido van Rossumd8faa362007-04-27 19:54:29 +00004104 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004105 # We're inherited below by BasicTCPTest2, which also inherits
4106 # BasicTCPTest, which defines self.port referenced below.
4107 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004108 self.serv_conn = self.cli
4109
4110class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4111 """Tests that NetworkConnection does not break existing TCP functionality.
4112 """
4113
4114class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004115
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004116 class MockSocket(socket.socket):
4117 def connect(self, *args):
4118 raise socket.timeout('timed out')
4119
4120 @contextlib.contextmanager
4121 def mocked_socket_module(self):
4122 """Return a socket which times out on connect"""
4123 old_socket = socket.socket
4124 socket.socket = self.MockSocket
4125 try:
4126 yield
4127 finally:
4128 socket.socket = old_socket
4129
4130 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004131 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004132 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004133 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004134 with self.assertRaises(socket.error) as cm:
4135 cli.connect((HOST, port))
4136 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4137
4138 def test_create_connection(self):
4139 # Issue #9792: errors raised by create_connection() should have
4140 # a proper errno attribute.
4141 port = support.find_unused_port()
4142 with self.assertRaises(socket.error) as cm:
4143 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004144
4145 # Issue #16257: create_connection() calls getaddrinfo() against
4146 # 'localhost'. This may result in an IPV6 addr being returned
4147 # as well as an IPV4 one:
4148 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4149 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4150 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4151 #
4152 # create_connection() enumerates through all the addresses returned
4153 # and if it doesn't successfully bind to any of them, it propagates
4154 # the last exception it encountered.
4155 #
4156 # On Solaris, ENETUNREACH is returned in this circumstance instead
4157 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4158 # expected errnos.
4159 expected_errnos = [ errno.ECONNREFUSED, ]
4160 if hasattr(errno, 'ENETUNREACH'):
4161 expected_errnos.append(errno.ENETUNREACH)
4162
4163 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004164
4165 def test_create_connection_timeout(self):
4166 # Issue #9792: create_connection() should not recast timeout errors
4167 # as generic socket errors.
4168 with self.mocked_socket_module():
4169 with self.assertRaises(socket.timeout):
4170 socket.create_connection((HOST, 1234))
4171
Guido van Rossumd8faa362007-04-27 19:54:29 +00004172
Victor Stinner45df8202010-04-28 22:31:17 +00004173@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004174class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4175
4176 def __init__(self, methodName='runTest'):
4177 SocketTCPTest.__init__(self, methodName=methodName)
4178 ThreadableTest.__init__(self)
4179
4180 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004181 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004182
4183 def clientTearDown(self):
4184 self.cli.close()
4185 self.cli = None
4186 ThreadableTest.clientTearDown(self)
4187
4188 def _justAccept(self):
4189 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004190 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004191
4192 testFamily = _justAccept
4193 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004194 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004195 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004196 self.assertEqual(self.cli.family, 2)
4197
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004198 testSourceAddress = _justAccept
4199 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004200 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4201 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004202 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004203 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004204 # The port number being used is sufficient to show that the bind()
4205 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004206
Guido van Rossumd8faa362007-04-27 19:54:29 +00004207 testTimeoutDefault = _justAccept
4208 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004209 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004210 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004211 socket.setdefaulttimeout(42)
4212 try:
4213 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004214 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004215 finally:
4216 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004217 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004218
4219 testTimeoutNone = _justAccept
4220 def _testTimeoutNone(self):
4221 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004222 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004223 socket.setdefaulttimeout(30)
4224 try:
4225 self.cli = socket.create_connection((HOST, self.port), timeout=None)
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)
4229 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004230
4231 testTimeoutValueNamed = _justAccept
4232 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004233 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004234 self.assertEqual(self.cli.gettimeout(), 30)
4235
4236 testTimeoutValueNonamed = _justAccept
4237 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004238 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004239 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004240 self.assertEqual(self.cli.gettimeout(), 30)
4241
Victor Stinner45df8202010-04-28 22:31:17 +00004242@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004243class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4244
4245 def __init__(self, methodName='runTest'):
4246 SocketTCPTest.__init__(self, methodName=methodName)
4247 ThreadableTest.__init__(self)
4248
4249 def clientSetUp(self):
4250 pass
4251
4252 def clientTearDown(self):
4253 self.cli.close()
4254 self.cli = None
4255 ThreadableTest.clientTearDown(self)
4256
4257 def testInsideTimeout(self):
4258 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004259 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004260 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004261 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004262 testOutsideTimeout = testInsideTimeout
4263
4264 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004265 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004266 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004267 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004268
4269 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004270 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004271 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004272
4273
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004274class TCPTimeoutTest(SocketTCPTest):
4275
4276 def testTCPTimeout(self):
4277 def raise_timeout(*args, **kwargs):
4278 self.serv.settimeout(1.0)
4279 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004280 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004281 "Error generating a timeout exception (TCP)")
4282
4283 def testTimeoutZero(self):
4284 ok = False
4285 try:
4286 self.serv.settimeout(0.0)
4287 foo = self.serv.accept()
4288 except socket.timeout:
4289 self.fail("caught timeout instead of error (TCP)")
4290 except socket.error:
4291 ok = True
4292 except:
4293 self.fail("caught unexpected exception (TCP)")
4294 if not ok:
4295 self.fail("accept() returned success when we did not expect it")
4296
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004297 def testInterruptedTimeout(self):
4298 # XXX I don't know how to do this test on MSWindows or any other
4299 # plaform that doesn't support signal.alarm() or os.kill(), though
4300 # the bug should have existed on all platforms.
4301 if not hasattr(signal, "alarm"):
4302 return # can only test on *nix
4303 self.serv.settimeout(5.0) # must be longer than alarm
4304 class Alarm(Exception):
4305 pass
4306 def alarm_handler(signal, frame):
4307 raise Alarm
4308 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4309 try:
4310 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4311 try:
4312 foo = self.serv.accept()
4313 except socket.timeout:
4314 self.fail("caught timeout instead of Alarm")
4315 except Alarm:
4316 pass
4317 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004318 self.fail("caught other exception instead of Alarm:"
4319 " %s(%s):\n%s" %
4320 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004321 else:
4322 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004323 finally:
4324 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004325 except Alarm:
4326 self.fail("got Alarm in wrong place")
4327 finally:
4328 # no alarm can be pending. Safe to restore old handler.
4329 signal.signal(signal.SIGALRM, old_alarm)
4330
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004331class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004332
4333 def testUDPTimeout(self):
4334 def raise_timeout(*args, **kwargs):
4335 self.serv.settimeout(1.0)
4336 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004337 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004338 "Error generating a timeout exception (UDP)")
4339
4340 def testTimeoutZero(self):
4341 ok = False
4342 try:
4343 self.serv.settimeout(0.0)
4344 foo = self.serv.recv(1024)
4345 except socket.timeout:
4346 self.fail("caught timeout instead of error (UDP)")
4347 except socket.error:
4348 ok = True
4349 except:
4350 self.fail("caught unexpected exception (UDP)")
4351 if not ok:
4352 self.fail("recv() returned success when we did not expect it")
4353
4354class TestExceptions(unittest.TestCase):
4355
4356 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004357 self.assertTrue(issubclass(socket.error, Exception))
4358 self.assertTrue(issubclass(socket.herror, socket.error))
4359 self.assertTrue(issubclass(socket.gaierror, socket.error))
4360 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004361
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004362class TestLinuxAbstractNamespace(unittest.TestCase):
4363
4364 UNIX_PATH_MAX = 108
4365
4366 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004367 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004368 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4369 s1.bind(address)
4370 s1.listen(1)
4371 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4372 s2.connect(s1.getsockname())
4373 with s1.accept()[0] as s3:
4374 self.assertEqual(s1.getsockname(), address)
4375 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004376
4377 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004378 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004379 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4380 s.bind(address)
4381 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004382
4383 def testNameOverflow(self):
4384 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004385 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4386 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004387
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004388 def testStrName(self):
4389 # Check that an abstract name can be passed as a string.
4390 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4391 try:
4392 s.bind("\x00python\x00test\x00")
4393 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4394 finally:
4395 s.close()
4396
4397class TestUnixDomain(unittest.TestCase):
4398
4399 def setUp(self):
4400 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4401
4402 def tearDown(self):
4403 self.sock.close()
4404
4405 def encoded(self, path):
4406 # Return the given path encoded in the file system encoding,
4407 # or skip the test if this is not possible.
4408 try:
4409 return os.fsencode(path)
4410 except UnicodeEncodeError:
4411 self.skipTest(
4412 "Pathname {0!a} cannot be represented in file "
4413 "system encoding {1!r}".format(
4414 path, sys.getfilesystemencoding()))
4415
Antoine Pitrou16374872011-12-16 15:04:12 +01004416 def bind(self, sock, path):
4417 # Bind the socket
4418 try:
4419 sock.bind(path)
4420 except OSError as e:
4421 if str(e) == "AF_UNIX path too long":
4422 self.skipTest(
4423 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4424 .format(path))
4425 else:
4426 raise
4427
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004428 def testStrAddr(self):
4429 # Test binding to and retrieving a normal string pathname.
4430 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004431 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004432 self.addCleanup(support.unlink, path)
4433 self.assertEqual(self.sock.getsockname(), path)
4434
4435 def testBytesAddr(self):
4436 # Test binding to a bytes pathname.
4437 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004438 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004439 self.addCleanup(support.unlink, path)
4440 self.assertEqual(self.sock.getsockname(), path)
4441
4442 def testSurrogateescapeBind(self):
4443 # Test binding to a valid non-ASCII pathname, with the
4444 # non-ASCII bytes supplied using surrogateescape encoding.
4445 path = os.path.abspath(support.TESTFN_UNICODE)
4446 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004447 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004448 self.addCleanup(support.unlink, path)
4449 self.assertEqual(self.sock.getsockname(), path)
4450
4451 def testUnencodableAddr(self):
4452 # Test binding to a pathname that cannot be encoded in the
4453 # file system encoding.
4454 if support.TESTFN_UNENCODABLE is None:
4455 self.skipTest("No unencodable filename available")
4456 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004457 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004458 self.addCleanup(support.unlink, path)
4459 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004460
Victor Stinner45df8202010-04-28 22:31:17 +00004461@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004462class BufferIOTest(SocketConnectedTest):
4463 """
4464 Test the buffer versions of socket.recv() and socket.send().
4465 """
4466 def __init__(self, methodName='runTest'):
4467 SocketConnectedTest.__init__(self, methodName=methodName)
4468
Antoine Pitrou25480782010-03-17 22:50:28 +00004469 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004470 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004471 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004472 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004473 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004474 self.assertEqual(msg, MSG)
4475
Antoine Pitrou25480782010-03-17 22:50:28 +00004476 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004477 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004478 self.serv_conn.send(buf)
4479
Antoine Pitrou25480782010-03-17 22:50:28 +00004480 def testRecvIntoBytearray(self):
4481 buf = bytearray(1024)
4482 nbytes = self.cli_conn.recv_into(buf)
4483 self.assertEqual(nbytes, len(MSG))
4484 msg = buf[:len(MSG)]
4485 self.assertEqual(msg, MSG)
4486
4487 _testRecvIntoBytearray = _testRecvIntoArray
4488
4489 def testRecvIntoMemoryview(self):
4490 buf = bytearray(1024)
4491 nbytes = self.cli_conn.recv_into(memoryview(buf))
4492 self.assertEqual(nbytes, len(MSG))
4493 msg = buf[:len(MSG)]
4494 self.assertEqual(msg, MSG)
4495
4496 _testRecvIntoMemoryview = _testRecvIntoArray
4497
4498 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004499 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004500 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004501 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004502 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004503 self.assertEqual(msg, MSG)
4504
Antoine Pitrou25480782010-03-17 22:50:28 +00004505 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004506 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004507 self.serv_conn.send(buf)
4508
Antoine Pitrou25480782010-03-17 22:50:28 +00004509 def testRecvFromIntoBytearray(self):
4510 buf = bytearray(1024)
4511 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4512 self.assertEqual(nbytes, len(MSG))
4513 msg = buf[:len(MSG)]
4514 self.assertEqual(msg, MSG)
4515
4516 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4517
4518 def testRecvFromIntoMemoryview(self):
4519 buf = bytearray(1024)
4520 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4521 self.assertEqual(nbytes, len(MSG))
4522 msg = buf[:len(MSG)]
4523 self.assertEqual(msg, MSG)
4524
4525 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4526
Christian Heimes043d6f62008-01-07 17:19:16 +00004527
4528TIPC_STYPE = 2000
4529TIPC_LOWER = 200
4530TIPC_UPPER = 210
4531
4532def isTipcAvailable():
4533 """Check if the TIPC module is loaded
4534
4535 The TIPC module is not loaded automatically on Ubuntu and probably
4536 other Linux distros.
4537 """
4538 if not hasattr(socket, "AF_TIPC"):
4539 return False
4540 if not os.path.isfile("/proc/modules"):
4541 return False
4542 with open("/proc/modules") as f:
4543 for line in f:
4544 if line.startswith("tipc "):
4545 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004546 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004547 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4548 return False
4549
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004550class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004551 def testRDM(self):
4552 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4553 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004554 self.addCleanup(srv.close)
4555 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004556
4557 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4558 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4559 TIPC_LOWER, TIPC_UPPER)
4560 srv.bind(srvaddr)
4561
4562 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4563 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4564 cli.sendto(MSG, sendaddr)
4565
4566 msg, recvaddr = srv.recvfrom(1024)
4567
4568 self.assertEqual(cli.getsockname(), recvaddr)
4569 self.assertEqual(msg, MSG)
4570
4571
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004572class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004573 def __init__(self, methodName = 'runTest'):
4574 unittest.TestCase.__init__(self, methodName = methodName)
4575 ThreadableTest.__init__(self)
4576
4577 def setUp(self):
4578 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004579 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004580 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4581 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4582 TIPC_LOWER, TIPC_UPPER)
4583 self.srv.bind(srvaddr)
4584 self.srv.listen(5)
4585 self.serverExplicitReady()
4586 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004587 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004588
4589 def clientSetUp(self):
4590 # The is a hittable race between serverExplicitReady() and the
4591 # accept() call; sleep a little while to avoid it, otherwise
4592 # we could get an exception
4593 time.sleep(0.1)
4594 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004595 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004596 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4597 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4598 self.cli.connect(addr)
4599 self.cliaddr = self.cli.getsockname()
4600
4601 def testStream(self):
4602 msg = self.conn.recv(1024)
4603 self.assertEqual(msg, MSG)
4604 self.assertEqual(self.cliaddr, self.connaddr)
4605
4606 def _testStream(self):
4607 self.cli.send(MSG)
4608 self.cli.close()
4609
4610
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004611@unittest.skipUnless(thread, 'Threading required for this test.')
4612class ContextManagersTest(ThreadedTCPSocketTest):
4613
4614 def _testSocketClass(self):
4615 # base test
4616 with socket.socket() as sock:
4617 self.assertFalse(sock._closed)
4618 self.assertTrue(sock._closed)
4619 # close inside with block
4620 with socket.socket() as sock:
4621 sock.close()
4622 self.assertTrue(sock._closed)
4623 # exception inside with block
4624 with socket.socket() as sock:
4625 self.assertRaises(socket.error, sock.sendall, b'foo')
4626 self.assertTrue(sock._closed)
4627
4628 def testCreateConnectionBase(self):
4629 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004630 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004631 data = conn.recv(1024)
4632 conn.sendall(data)
4633
4634 def _testCreateConnectionBase(self):
4635 address = self.serv.getsockname()
4636 with socket.create_connection(address) as sock:
4637 self.assertFalse(sock._closed)
4638 sock.sendall(b'foo')
4639 self.assertEqual(sock.recv(1024), b'foo')
4640 self.assertTrue(sock._closed)
4641
4642 def testCreateConnectionClose(self):
4643 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004644 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004645 data = conn.recv(1024)
4646 conn.sendall(data)
4647
4648 def _testCreateConnectionClose(self):
4649 address = self.serv.getsockname()
4650 with socket.create_connection(address) as sock:
4651 sock.close()
4652 self.assertTrue(sock._closed)
4653 self.assertRaises(socket.error, sock.sendall, b'foo')
4654
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004655
Antoine Pitroub1c54962010-10-14 15:05:38 +00004656@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4657 "SOCK_CLOEXEC not defined")
4658@unittest.skipUnless(fcntl, "module fcntl not available")
4659class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004660 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004661 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004662 with socket.socket(socket.AF_INET,
4663 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4664 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4665 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004666
4667
4668@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4669 "SOCK_NONBLOCK not defined")
4670class NonblockConstantTest(unittest.TestCase):
4671 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4672 if nonblock:
4673 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4674 self.assertEqual(s.gettimeout(), timeout)
4675 else:
4676 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4677 self.assertEqual(s.gettimeout(), None)
4678
Charles-François Natali239bb962011-06-03 12:55:15 +02004679 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004680 def test_SOCK_NONBLOCK(self):
4681 # a lot of it seems silly and redundant, but I wanted to test that
4682 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004683 with socket.socket(socket.AF_INET,
4684 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4685 self.checkNonblock(s)
4686 s.setblocking(1)
4687 self.checkNonblock(s, False)
4688 s.setblocking(0)
4689 self.checkNonblock(s)
4690 s.settimeout(None)
4691 self.checkNonblock(s, False)
4692 s.settimeout(2.0)
4693 self.checkNonblock(s, timeout=2.0)
4694 s.setblocking(1)
4695 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004696 # defaulttimeout
4697 t = socket.getdefaulttimeout()
4698 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004699 with socket.socket() as s:
4700 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004701 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004702 with socket.socket() as s:
4703 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004704 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004705 with socket.socket() as s:
4706 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004707 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004708 with socket.socket() as s:
4709 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004710 socket.setdefaulttimeout(t)
4711
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004712
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004713@unittest.skipUnless(os.name == "nt", "Windows specific")
4714@unittest.skipUnless(multiprocessing, "need multiprocessing")
4715class TestSocketSharing(SocketTCPTest):
4716 # This must be classmethod and not staticmethod or multiprocessing
4717 # won't be able to bootstrap it.
4718 @classmethod
4719 def remoteProcessServer(cls, q):
4720 # Recreate socket from shared data
4721 sdata = q.get()
4722 message = q.get()
4723
4724 s = socket.fromshare(sdata)
4725 s2, c = s.accept()
4726
4727 # Send the message
4728 s2.sendall(message)
4729 s2.close()
4730 s.close()
4731
4732 def testShare(self):
4733 # Transfer the listening server socket to another process
4734 # and service it from there.
4735
4736 # Create process:
4737 q = multiprocessing.Queue()
4738 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4739 p.start()
4740
4741 # Get the shared socket data
4742 data = self.serv.share(p.pid)
4743
4744 # Pass the shared socket to the other process
4745 addr = self.serv.getsockname()
4746 self.serv.close()
4747 q.put(data)
4748
4749 # The data that the server will send us
4750 message = b"slapmahfro"
4751 q.put(message)
4752
4753 # Connect
4754 s = socket.create_connection(addr)
4755 # listen for the data
4756 m = []
4757 while True:
4758 data = s.recv(100)
4759 if not data:
4760 break
4761 m.append(data)
4762 s.close()
4763 received = b"".join(m)
4764 self.assertEqual(received, message)
4765 p.join()
4766
4767 def testShareLength(self):
4768 data = self.serv.share(os.getpid())
4769 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4770 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4771
4772 def compareSockets(self, org, other):
4773 # socket sharing is expected to work only for blocking socket
4774 # since the internal python timout value isn't transfered.
4775 self.assertEqual(org.gettimeout(), None)
4776 self.assertEqual(org.gettimeout(), other.gettimeout())
4777
4778 self.assertEqual(org.family, other.family)
4779 self.assertEqual(org.type, other.type)
4780 # If the user specified "0" for proto, then
4781 # internally windows will have picked the correct value.
4782 # Python introspection on the socket however will still return
4783 # 0. For the shared socket, the python value is recreated
4784 # from the actual value, so it may not compare correctly.
4785 if org.proto != 0:
4786 self.assertEqual(org.proto, other.proto)
4787
4788 def testShareLocal(self):
4789 data = self.serv.share(os.getpid())
4790 s = socket.fromshare(data)
4791 try:
4792 self.compareSockets(self.serv, s)
4793 finally:
4794 s.close()
4795
4796 def testTypes(self):
4797 families = [socket.AF_INET, socket.AF_INET6]
4798 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4799 for f in families:
4800 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00004801 try:
4802 source = socket.socket(f, t)
4803 except OSError:
4804 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004805 try:
4806 data = source.share(os.getpid())
4807 shared = socket.fromshare(data)
4808 try:
4809 self.compareSockets(source, shared)
4810 finally:
4811 shared.close()
4812 finally:
4813 source.close()
4814
4815
Guido van Rossumb995eb72002-07-31 16:08:40 +00004816def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004817 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004818 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004819
4820 tests.extend([
4821 NonBlockingTCPTests,
4822 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004823 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004824 UnbufferedFileObjectClassTestCase,
4825 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004826 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004827 UnicodeReadFileObjectClassTestCase,
4828 UnicodeWriteFileObjectClassTestCase,
4829 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004830 NetworkConnectionNoServer,
4831 NetworkConnectionAttributesTest,
4832 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004833 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004834 CloexecConstantTest,
4835 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004836 ])
Dave Cole331708b2004-08-09 04:51:41 +00004837 if hasattr(socket, "socketpair"):
4838 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004839 if hasattr(socket, "AF_UNIX"):
4840 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004841 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004842 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004843 if isTipcAvailable():
4844 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004845 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004846 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004847 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004848 tests.extend([
4849 CmsgMacroTests,
4850 SendmsgUDPTest,
4851 RecvmsgUDPTest,
4852 RecvmsgIntoUDPTest,
4853 SendmsgUDP6Test,
4854 RecvmsgUDP6Test,
4855 RecvmsgRFC3542AncillaryUDP6Test,
4856 RecvmsgIntoRFC3542AncillaryUDP6Test,
4857 RecvmsgIntoUDP6Test,
4858 SendmsgTCPTest,
4859 RecvmsgTCPTest,
4860 RecvmsgIntoTCPTest,
4861 SendmsgSCTPStreamTest,
4862 RecvmsgSCTPStreamTest,
4863 RecvmsgIntoSCTPStreamTest,
4864 SendmsgUnixStreamTest,
4865 RecvmsgUnixStreamTest,
4866 RecvmsgIntoUnixStreamTest,
4867 RecvmsgSCMRightsStreamTest,
4868 RecvmsgIntoSCMRightsStreamTest,
4869 # These are slow when setitimer() is not available
4870 InterruptedRecvTimeoutTest,
4871 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004872 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004873 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004874
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004875 thread_info = support.threading_setup()
4876 support.run_unittest(*tests)
4877 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004878
4879if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004880 test_main()