blob: 25bf0a189fa4852ed3a559168d4fbc9f2363f1f7 [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
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001169 # Issue 17269
Ronald Oussorena822d3662013-06-10 10:36:28 +02001170 if hasattr(socket, 'AI_NUMERICSERV'):
1171 socket.getaddrinfo("localhost", None, 0, 0, 0, socket.AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001172
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001173 def test_getnameinfo(self):
1174 # only IP addresses are allowed
1175 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
1176
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001177 @unittest.skipUnless(support.is_resource_enabled('network'),
1178 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001179 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001180 # Check for internet access before running test (issue #12804).
1181 try:
1182 socket.gethostbyname('python.org')
1183 except socket.gaierror as e:
1184 if e.errno == socket.EAI_NODATA:
1185 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001186 # these should all be successful
1187 socket.gethostbyname('испытание.python.org')
1188 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001189 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1190 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1191 # have a reverse entry yet
1192 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001193
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001194 def check_sendall_interrupted(self, with_timeout):
1195 # socketpair() is not stricly required, but it makes things easier.
1196 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1197 self.skipTest("signal.alarm and socket.socketpair required for this test")
1198 # Our signal handlers clobber the C errno by calling a math function
1199 # with an invalid domain value.
1200 def ok_handler(*args):
1201 self.assertRaises(ValueError, math.acosh, 0)
1202 def raising_handler(*args):
1203 self.assertRaises(ValueError, math.acosh, 0)
1204 1 // 0
1205 c, s = socket.socketpair()
1206 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1207 try:
1208 if with_timeout:
1209 # Just above the one second minimum for signal.alarm
1210 c.settimeout(1.5)
1211 with self.assertRaises(ZeroDivisionError):
1212 signal.alarm(1)
1213 c.sendall(b"x" * (1024**2))
1214 if with_timeout:
1215 signal.signal(signal.SIGALRM, ok_handler)
1216 signal.alarm(1)
1217 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1218 finally:
1219 signal.signal(signal.SIGALRM, old_alarm)
1220 c.close()
1221 s.close()
1222
1223 def test_sendall_interrupted(self):
1224 self.check_sendall_interrupted(False)
1225
1226 def test_sendall_interrupted_with_timeout(self):
1227 self.check_sendall_interrupted(True)
1228
Antoine Pitroue033e062010-10-29 10:38:18 +00001229 def test_dealloc_warn(self):
1230 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1231 r = repr(sock)
1232 with self.assertWarns(ResourceWarning) as cm:
1233 sock = None
1234 support.gc_collect()
1235 self.assertIn(r, str(cm.warning.args[0]))
1236 # An open socket file object gets dereferenced after the socket
1237 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1238 f = sock.makefile('rb')
1239 r = repr(sock)
1240 sock = None
1241 support.gc_collect()
1242 with self.assertWarns(ResourceWarning):
1243 f = None
1244 support.gc_collect()
1245
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001246 def test_name_closed_socketio(self):
1247 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1248 fp = sock.makefile("rb")
1249 fp.close()
1250 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1251
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001252 def test_unusable_closed_socketio(self):
1253 with socket.socket() as sock:
1254 fp = sock.makefile("rb", buffering=0)
1255 self.assertTrue(fp.readable())
1256 self.assertFalse(fp.writable())
1257 self.assertFalse(fp.seekable())
1258 fp.close()
1259 self.assertRaises(ValueError, fp.readable)
1260 self.assertRaises(ValueError, fp.writable)
1261 self.assertRaises(ValueError, fp.seekable)
1262
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001263 def test_pickle(self):
1264 sock = socket.socket()
1265 with sock:
1266 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1267 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1268
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001269 def test_listen_backlog(self):
1270 for backlog in 0, -1:
1271 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1272 srv.bind((HOST, 0))
1273 srv.listen(backlog)
1274 srv.close()
1275
1276 # Issue 15989
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001277 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1278 srv.bind((HOST, 0))
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001279 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001280 srv.close()
1281
Charles-François Natali42663332012-01-02 15:57:30 +01001282 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001283 def test_flowinfo(self):
1284 self.assertRaises(OverflowError, socket.getnameinfo,
1285 ('::1',0, 0xffffffff), 0)
1286 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1287 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
1288
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001289
Charles-François Natali47413c12011-10-06 19:47:44 +02001290@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1291class BasicCANTest(unittest.TestCase):
1292
1293 def testCrucialConstants(self):
1294 socket.AF_CAN
1295 socket.PF_CAN
1296 socket.CAN_RAW
1297
1298 def testCreateSocket(self):
1299 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1300 pass
1301
1302 def testBindAny(self):
1303 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1304 s.bind(('', ))
1305
1306 def testTooLongInterfaceName(self):
1307 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1308 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001309 self.assertRaisesRegex(socket.error, 'interface name too long',
1310 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001311
1312 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1313 'socket.CAN_RAW_LOOPBACK required for this test.')
1314 def testLoopback(self):
1315 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1316 for loopback in (0, 1):
1317 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1318 loopback)
1319 self.assertEqual(loopback,
1320 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1321
1322 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1323 'socket.CAN_RAW_FILTER required for this test.')
1324 def testFilter(self):
1325 can_id, can_mask = 0x200, 0x700
1326 can_filter = struct.pack("=II", can_id, can_mask)
1327 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1328 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1329 self.assertEqual(can_filter,
1330 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1331
1332
1333@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1334@unittest.skipUnless(thread, 'Threading required for this test.')
1335class CANTest(ThreadedCANSocketTest):
1336
1337 """The CAN frame structure is defined in <linux/can.h>:
1338
1339 struct can_frame {
1340 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1341 __u8 can_dlc; /* data length code: 0 .. 8 */
1342 __u8 data[8] __attribute__((aligned(8)));
1343 };
1344 """
1345 can_frame_fmt = "=IB3x8s"
1346
1347 def __init__(self, methodName='runTest'):
1348 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1349
1350 @classmethod
1351 def build_can_frame(cls, can_id, data):
1352 """Build a CAN frame."""
1353 can_dlc = len(data)
1354 data = data.ljust(8, b'\x00')
1355 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1356
1357 @classmethod
1358 def dissect_can_frame(cls, frame):
1359 """Dissect a CAN frame."""
1360 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1361 return (can_id, can_dlc, data[:can_dlc])
1362
1363 def testSendFrame(self):
1364 cf, addr = self.s.recvfrom(self.bufsize)
1365 self.assertEqual(self.cf, cf)
1366 self.assertEqual(addr[0], self.interface)
1367 self.assertEqual(addr[1], socket.AF_CAN)
1368
1369 def _testSendFrame(self):
1370 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1371 self.cli.send(self.cf)
1372
1373 def testSendMaxFrame(self):
1374 cf, addr = self.s.recvfrom(self.bufsize)
1375 self.assertEqual(self.cf, cf)
1376
1377 def _testSendMaxFrame(self):
1378 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1379 self.cli.send(self.cf)
1380
1381 def testSendMultiFrames(self):
1382 cf, addr = self.s.recvfrom(self.bufsize)
1383 self.assertEqual(self.cf1, cf)
1384
1385 cf, addr = self.s.recvfrom(self.bufsize)
1386 self.assertEqual(self.cf2, cf)
1387
1388 def _testSendMultiFrames(self):
1389 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1390 self.cli.send(self.cf1)
1391
1392 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1393 self.cli.send(self.cf2)
1394
1395
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001396@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1397class BasicRDSTest(unittest.TestCase):
1398
1399 def testCrucialConstants(self):
1400 socket.AF_RDS
1401 socket.PF_RDS
1402
1403 def testCreateSocket(self):
1404 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1405 pass
1406
1407 def testSocketBufferSize(self):
1408 bufsize = 16384
1409 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1410 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1411 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1412
1413
1414@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1415@unittest.skipUnless(thread, 'Threading required for this test.')
1416class RDSTest(ThreadedRDSSocketTest):
1417
1418 def __init__(self, methodName='runTest'):
1419 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1420
Charles-François Natali240c55f2011-11-10 20:33:36 +01001421 def setUp(self):
1422 super().setUp()
1423 self.evt = threading.Event()
1424
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001425 def testSendAndRecv(self):
1426 data, addr = self.serv.recvfrom(self.bufsize)
1427 self.assertEqual(self.data, data)
1428 self.assertEqual(self.cli_addr, addr)
1429
1430 def _testSendAndRecv(self):
1431 self.data = b'spam'
1432 self.cli.sendto(self.data, 0, (HOST, self.port))
1433
1434 def testPeek(self):
1435 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1436 self.assertEqual(self.data, data)
1437 data, addr = self.serv.recvfrom(self.bufsize)
1438 self.assertEqual(self.data, data)
1439
1440 def _testPeek(self):
1441 self.data = b'spam'
1442 self.cli.sendto(self.data, 0, (HOST, self.port))
1443
1444 @requireAttrs(socket.socket, 'recvmsg')
1445 def testSendAndRecvMsg(self):
1446 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1447 self.assertEqual(self.data, data)
1448
1449 @requireAttrs(socket.socket, 'sendmsg')
1450 def _testSendAndRecvMsg(self):
1451 self.data = b'hello ' * 10
1452 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1453
1454 def testSendAndRecvMulti(self):
1455 data, addr = self.serv.recvfrom(self.bufsize)
1456 self.assertEqual(self.data1, data)
1457
1458 data, addr = self.serv.recvfrom(self.bufsize)
1459 self.assertEqual(self.data2, data)
1460
1461 def _testSendAndRecvMulti(self):
1462 self.data1 = b'bacon'
1463 self.cli.sendto(self.data1, 0, (HOST, self.port))
1464
1465 self.data2 = b'egg'
1466 self.cli.sendto(self.data2, 0, (HOST, self.port))
1467
1468 def testSelect(self):
1469 r, w, x = select.select([self.serv], [], [], 3.0)
1470 self.assertIn(self.serv, r)
1471 data, addr = self.serv.recvfrom(self.bufsize)
1472 self.assertEqual(self.data, data)
1473
1474 def _testSelect(self):
1475 self.data = b'select'
1476 self.cli.sendto(self.data, 0, (HOST, self.port))
1477
1478 def testCongestion(self):
1479 # wait until the sender is done
1480 self.evt.wait()
1481
1482 def _testCongestion(self):
1483 # test the behavior in case of congestion
1484 self.data = b'fill'
1485 self.cli.setblocking(False)
1486 try:
1487 # try to lower the receiver's socket buffer size
1488 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1489 except OSError:
1490 pass
1491 with self.assertRaises(OSError) as cm:
1492 try:
1493 # fill the receiver's socket buffer
1494 while True:
1495 self.cli.sendto(self.data, 0, (HOST, self.port))
1496 finally:
1497 # signal the receiver we're done
1498 self.evt.set()
1499 # sendto() should have failed with ENOBUFS
1500 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1501 # and we should have received a congestion notification through poll
1502 r, w, x = select.select([self.serv], [], [], 3.0)
1503 self.assertIn(self.serv, r)
1504
1505
Victor Stinner45df8202010-04-28 22:31:17 +00001506@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001507class BasicTCPTest(SocketConnectedTest):
1508
1509 def __init__(self, methodName='runTest'):
1510 SocketConnectedTest.__init__(self, methodName=methodName)
1511
1512 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001513 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001514 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001515 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001516
1517 def _testRecv(self):
1518 self.serv_conn.send(MSG)
1519
1520 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001521 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001522 seg1 = self.cli_conn.recv(len(MSG) - 3)
1523 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001524 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001525 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001526
1527 def _testOverFlowRecv(self):
1528 self.serv_conn.send(MSG)
1529
1530 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001531 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001532 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001533 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001534
1535 def _testRecvFrom(self):
1536 self.serv_conn.send(MSG)
1537
1538 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001539 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001540 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1541 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001542 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001543 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001544
1545 def _testOverFlowRecvFrom(self):
1546 self.serv_conn.send(MSG)
1547
1548 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001549 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001550 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001551 while 1:
1552 read = self.cli_conn.recv(1024)
1553 if not read:
1554 break
Guido van Rossume531e292002-08-08 20:28:34 +00001555 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001556 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001557
1558 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001559 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001560 self.serv_conn.sendall(big_chunk)
1561
1562 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001563 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001564 fd = self.cli_conn.fileno()
1565 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001566 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001567 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001568 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001569 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001570
1571 def _testFromFd(self):
1572 self.serv_conn.send(MSG)
1573
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001574 def testDup(self):
1575 # Testing dup()
1576 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001577 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001578 msg = sock.recv(1024)
1579 self.assertEqual(msg, MSG)
1580
1581 def _testDup(self):
1582 self.serv_conn.send(MSG)
1583
Guido van Rossum24e4af82002-06-12 19:18:08 +00001584 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001585 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001586 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001587 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001588 # wait for _testShutdown to finish: on OS X, when the server
1589 # closes the connection the client also becomes disconnected,
1590 # and the client's shutdown call will fail. (Issue #4397.)
1591 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001592
1593 def _testShutdown(self):
1594 self.serv_conn.send(MSG)
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001595 # Issue 15989
1596 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1597 _testcapi.INT_MAX + 1)
1598 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1599 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001600 self.serv_conn.shutdown(2)
1601
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001602 def testDetach(self):
1603 # Testing detach()
1604 fileno = self.cli_conn.fileno()
1605 f = self.cli_conn.detach()
1606 self.assertEqual(f, fileno)
1607 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001608 self.assertTrue(self.cli_conn._closed)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001609 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1610 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001611 # ...but we can create another socket using the (still open)
1612 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001613 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001614 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001615 msg = sock.recv(1024)
1616 self.assertEqual(msg, MSG)
1617
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001618 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001619 self.serv_conn.send(MSG)
1620
Victor Stinner45df8202010-04-28 22:31:17 +00001621@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001622class BasicUDPTest(ThreadedUDPSocketTest):
1623
1624 def __init__(self, methodName='runTest'):
1625 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1626
1627 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001628 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001629 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001630 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001631
1632 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001633 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001634
Guido van Rossum1c938012002-06-12 21:17:20 +00001635 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001636 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001637 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001638 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001639
Guido van Rossum1c938012002-06-12 21:17:20 +00001640 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001641 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001642
Guido van Rossumd8faa362007-04-27 19:54:29 +00001643 def testRecvFromNegative(self):
1644 # Negative lengths passed to recvfrom should give ValueError.
1645 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1646
1647 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001648 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001649
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001650# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1651# same test code is used with different families and types of socket
1652# (e.g. stream, datagram), and tests using recvmsg() are repeated
1653# using recvmsg_into().
1654#
1655# The generic test classes such as SendmsgTests and
1656# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1657# supplied with sockets cli_sock and serv_sock representing the
1658# client's and the server's end of the connection respectively, and
1659# attributes cli_addr and serv_addr holding their (numeric where
1660# appropriate) addresses.
1661#
1662# The final concrete test classes combine these with subclasses of
1663# SocketTestBase which set up client and server sockets of a specific
1664# type, and with subclasses of SendrecvmsgBase such as
1665# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1666# sockets to cli_sock and serv_sock and override the methods and
1667# attributes of SendrecvmsgBase to fill in destination addresses if
1668# needed when sending, check for specific flags in msg_flags, etc.
1669#
1670# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1671# recvmsg_into().
1672
1673# XXX: like the other datagram (UDP) tests in this module, the code
1674# here assumes that datagram delivery on the local machine will be
1675# reliable.
1676
1677class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1678 # Base class for sendmsg()/recvmsg() tests.
1679
1680 # Time in seconds to wait before considering a test failed, or
1681 # None for no timeout. Not all tests actually set a timeout.
1682 fail_timeout = 3.0
1683
1684 def setUp(self):
1685 self.misc_event = threading.Event()
1686 super().setUp()
1687
1688 def sendToServer(self, msg):
1689 # Send msg to the server.
1690 return self.cli_sock.send(msg)
1691
1692 # Tuple of alternative default arguments for sendmsg() when called
1693 # via sendmsgToServer() (e.g. to include a destination address).
1694 sendmsg_to_server_defaults = ()
1695
1696 def sendmsgToServer(self, *args):
1697 # Call sendmsg() on self.cli_sock with the given arguments,
1698 # filling in any arguments which are not supplied with the
1699 # corresponding items of self.sendmsg_to_server_defaults, if
1700 # any.
1701 return self.cli_sock.sendmsg(
1702 *(args + self.sendmsg_to_server_defaults[len(args):]))
1703
1704 def doRecvmsg(self, sock, bufsize, *args):
1705 # Call recvmsg() on sock with given arguments and return its
1706 # result. Should be used for tests which can use either
1707 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1708 # this method with one which emulates it using recvmsg_into(),
1709 # thus allowing the same test to be used for both methods.
1710 result = sock.recvmsg(bufsize, *args)
1711 self.registerRecvmsgResult(result)
1712 return result
1713
1714 def registerRecvmsgResult(self, result):
1715 # Called by doRecvmsg() with the return value of recvmsg() or
1716 # recvmsg_into(). Can be overridden to arrange cleanup based
1717 # on the returned ancillary data, for instance.
1718 pass
1719
1720 def checkRecvmsgAddress(self, addr1, addr2):
1721 # Called to compare the received address with the address of
1722 # the peer.
1723 self.assertEqual(addr1, addr2)
1724
1725 # Flags that are normally unset in msg_flags
1726 msg_flags_common_unset = 0
1727 for name in ("MSG_CTRUNC", "MSG_OOB"):
1728 msg_flags_common_unset |= getattr(socket, name, 0)
1729
1730 # Flags that are normally set
1731 msg_flags_common_set = 0
1732
1733 # Flags set when a complete record has been received (e.g. MSG_EOR
1734 # for SCTP)
1735 msg_flags_eor_indicator = 0
1736
1737 # Flags set when a complete record has not been received
1738 # (e.g. MSG_TRUNC for datagram sockets)
1739 msg_flags_non_eor_indicator = 0
1740
1741 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1742 # Method to check the value of msg_flags returned by recvmsg[_into]().
1743 #
1744 # Checks that all bits in msg_flags_common_set attribute are
1745 # set in "flags" and all bits in msg_flags_common_unset are
1746 # unset.
1747 #
1748 # The "eor" argument specifies whether the flags should
1749 # indicate that a full record (or datagram) has been received.
1750 # If "eor" is None, no checks are done; otherwise, checks
1751 # that:
1752 #
1753 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1754 # set and all bits in msg_flags_non_eor_indicator are unset
1755 #
1756 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1757 # are set and all bits in msg_flags_eor_indicator are unset
1758 #
1759 # If "checkset" and/or "checkunset" are supplied, they require
1760 # the given bits to be set or unset respectively, overriding
1761 # what the attributes require for those bits.
1762 #
1763 # If any bits are set in "ignore", they will not be checked,
1764 # regardless of the other inputs.
1765 #
1766 # Will raise Exception if the inputs require a bit to be both
1767 # set and unset, and it is not ignored.
1768
1769 defaultset = self.msg_flags_common_set
1770 defaultunset = self.msg_flags_common_unset
1771
1772 if eor:
1773 defaultset |= self.msg_flags_eor_indicator
1774 defaultunset |= self.msg_flags_non_eor_indicator
1775 elif eor is not None:
1776 defaultset |= self.msg_flags_non_eor_indicator
1777 defaultunset |= self.msg_flags_eor_indicator
1778
1779 # Function arguments override defaults
1780 defaultset &= ~checkunset
1781 defaultunset &= ~checkset
1782
1783 # Merge arguments with remaining defaults, and check for conflicts
1784 checkset |= defaultset
1785 checkunset |= defaultunset
1786 inboth = checkset & checkunset & ~ignore
1787 if inboth:
1788 raise Exception("contradictory set, unset requirements for flags "
1789 "{0:#x}".format(inboth))
1790
1791 # Compare with given msg_flags value
1792 mask = (checkset | checkunset) & ~ignore
1793 self.assertEqual(flags & mask, checkset & mask)
1794
1795
1796class RecvmsgIntoMixin(SendrecvmsgBase):
1797 # Mixin to implement doRecvmsg() using recvmsg_into().
1798
1799 def doRecvmsg(self, sock, bufsize, *args):
1800 buf = bytearray(bufsize)
1801 result = sock.recvmsg_into([buf], *args)
1802 self.registerRecvmsgResult(result)
1803 self.assertGreaterEqual(result[0], 0)
1804 self.assertLessEqual(result[0], bufsize)
1805 return (bytes(buf[:result[0]]),) + result[1:]
1806
1807
1808class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1809 # Defines flags to be checked in msg_flags for datagram sockets.
1810
1811 @property
1812 def msg_flags_non_eor_indicator(self):
1813 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1814
1815
1816class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1817 # Defines flags to be checked in msg_flags for SCTP sockets.
1818
1819 @property
1820 def msg_flags_eor_indicator(self):
1821 return super().msg_flags_eor_indicator | socket.MSG_EOR
1822
1823
1824class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1825 # Base class for tests on connectionless-mode sockets. Users must
1826 # supply sockets on attributes cli and serv to be mapped to
1827 # cli_sock and serv_sock respectively.
1828
1829 @property
1830 def serv_sock(self):
1831 return self.serv
1832
1833 @property
1834 def cli_sock(self):
1835 return self.cli
1836
1837 @property
1838 def sendmsg_to_server_defaults(self):
1839 return ([], [], 0, self.serv_addr)
1840
1841 def sendToServer(self, msg):
1842 return self.cli_sock.sendto(msg, self.serv_addr)
1843
1844
1845class SendrecvmsgConnectedBase(SendrecvmsgBase):
1846 # Base class for tests on connected sockets. Users must supply
1847 # sockets on attributes serv_conn and cli_conn (representing the
1848 # connections *to* the server and the client), to be mapped to
1849 # cli_sock and serv_sock respectively.
1850
1851 @property
1852 def serv_sock(self):
1853 return self.cli_conn
1854
1855 @property
1856 def cli_sock(self):
1857 return self.serv_conn
1858
1859 def checkRecvmsgAddress(self, addr1, addr2):
1860 # Address is currently "unspecified" for a connected socket,
1861 # so we don't examine it
1862 pass
1863
1864
1865class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1866 # Base class to set a timeout on server's socket.
1867
1868 def setUp(self):
1869 super().setUp()
1870 self.serv_sock.settimeout(self.fail_timeout)
1871
1872
1873class SendmsgTests(SendrecvmsgServerTimeoutBase):
1874 # Tests for sendmsg() which can use any socket type and do not
1875 # involve recvmsg() or recvmsg_into().
1876
1877 def testSendmsg(self):
1878 # Send a simple message with sendmsg().
1879 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1880
1881 def _testSendmsg(self):
1882 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1883
1884 def testSendmsgDataGenerator(self):
1885 # Send from buffer obtained from a generator (not a sequence).
1886 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1887
1888 def _testSendmsgDataGenerator(self):
1889 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1890 len(MSG))
1891
1892 def testSendmsgAncillaryGenerator(self):
1893 # Gather (empty) ancillary data from a generator.
1894 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1895
1896 def _testSendmsgAncillaryGenerator(self):
1897 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1898 len(MSG))
1899
1900 def testSendmsgArray(self):
1901 # Send data from an array instead of the usual bytes object.
1902 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1903
1904 def _testSendmsgArray(self):
1905 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1906 len(MSG))
1907
1908 def testSendmsgGather(self):
1909 # Send message data from more than one buffer (gather write).
1910 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1911
1912 def _testSendmsgGather(self):
1913 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1914
1915 def testSendmsgBadArgs(self):
1916 # Check that sendmsg() rejects invalid arguments.
1917 self.assertEqual(self.serv_sock.recv(1000), b"done")
1918
1919 def _testSendmsgBadArgs(self):
1920 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1921 self.assertRaises(TypeError, self.sendmsgToServer,
1922 b"not in an iterable")
1923 self.assertRaises(TypeError, self.sendmsgToServer,
1924 object())
1925 self.assertRaises(TypeError, self.sendmsgToServer,
1926 [object()])
1927 self.assertRaises(TypeError, self.sendmsgToServer,
1928 [MSG, object()])
1929 self.assertRaises(TypeError, self.sendmsgToServer,
1930 [MSG], object())
1931 self.assertRaises(TypeError, self.sendmsgToServer,
1932 [MSG], [], object())
1933 self.assertRaises(TypeError, self.sendmsgToServer,
1934 [MSG], [], 0, object())
1935 self.sendToServer(b"done")
1936
1937 def testSendmsgBadCmsg(self):
1938 # Check that invalid ancillary data items are rejected.
1939 self.assertEqual(self.serv_sock.recv(1000), b"done")
1940
1941 def _testSendmsgBadCmsg(self):
1942 self.assertRaises(TypeError, self.sendmsgToServer,
1943 [MSG], [object()])
1944 self.assertRaises(TypeError, self.sendmsgToServer,
1945 [MSG], [(object(), 0, b"data")])
1946 self.assertRaises(TypeError, self.sendmsgToServer,
1947 [MSG], [(0, object(), b"data")])
1948 self.assertRaises(TypeError, self.sendmsgToServer,
1949 [MSG], [(0, 0, object())])
1950 self.assertRaises(TypeError, self.sendmsgToServer,
1951 [MSG], [(0, 0)])
1952 self.assertRaises(TypeError, self.sendmsgToServer,
1953 [MSG], [(0, 0, b"data", 42)])
1954 self.sendToServer(b"done")
1955
1956 @requireAttrs(socket, "CMSG_SPACE")
1957 def testSendmsgBadMultiCmsg(self):
1958 # Check that invalid ancillary data items are rejected when
1959 # more than one item is present.
1960 self.assertEqual(self.serv_sock.recv(1000), b"done")
1961
1962 @testSendmsgBadMultiCmsg.client_skip
1963 def _testSendmsgBadMultiCmsg(self):
1964 self.assertRaises(TypeError, self.sendmsgToServer,
1965 [MSG], [0, 0, b""])
1966 self.assertRaises(TypeError, self.sendmsgToServer,
1967 [MSG], [(0, 0, b""), object()])
1968 self.sendToServer(b"done")
1969
1970 def testSendmsgExcessCmsgReject(self):
1971 # Check that sendmsg() rejects excess ancillary data items
1972 # when the number that can be sent is limited.
1973 self.assertEqual(self.serv_sock.recv(1000), b"done")
1974
1975 def _testSendmsgExcessCmsgReject(self):
1976 if not hasattr(socket, "CMSG_SPACE"):
1977 # Can only send one item
1978 with self.assertRaises(socket.error) as cm:
1979 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1980 self.assertIsNone(cm.exception.errno)
1981 self.sendToServer(b"done")
1982
1983 def testSendmsgAfterClose(self):
1984 # Check that sendmsg() fails on a closed socket.
1985 pass
1986
1987 def _testSendmsgAfterClose(self):
1988 self.cli_sock.close()
1989 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1990
1991
1992class SendmsgStreamTests(SendmsgTests):
1993 # Tests for sendmsg() which require a stream socket and do not
1994 # involve recvmsg() or recvmsg_into().
1995
1996 def testSendmsgExplicitNoneAddr(self):
1997 # Check that peer address can be specified as None.
1998 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1999
2000 def _testSendmsgExplicitNoneAddr(self):
2001 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2002
2003 def testSendmsgTimeout(self):
2004 # Check that timeout works with sendmsg().
2005 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2006 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2007
2008 def _testSendmsgTimeout(self):
2009 try:
2010 self.cli_sock.settimeout(0.03)
2011 with self.assertRaises(socket.timeout):
2012 while True:
2013 self.sendmsgToServer([b"a"*512])
2014 finally:
2015 self.misc_event.set()
2016
2017 # XXX: would be nice to have more tests for sendmsg flags argument.
2018
2019 # Linux supports MSG_DONTWAIT when sending, but in general, it
2020 # only works when receiving. Could add other platforms if they
2021 # support it too.
2022 @skipWithClientIf(sys.platform not in {"linux2"},
2023 "MSG_DONTWAIT not known to work on this platform when "
2024 "sending")
2025 def testSendmsgDontWait(self):
2026 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2027 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2028 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2029
2030 @testSendmsgDontWait.client_skip
2031 def _testSendmsgDontWait(self):
2032 try:
2033 with self.assertRaises(socket.error) as cm:
2034 while True:
2035 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2036 self.assertIn(cm.exception.errno,
2037 (errno.EAGAIN, errno.EWOULDBLOCK))
2038 finally:
2039 self.misc_event.set()
2040
2041
2042class SendmsgConnectionlessTests(SendmsgTests):
2043 # Tests for sendmsg() which require a connectionless-mode
2044 # (e.g. datagram) socket, and do not involve recvmsg() or
2045 # recvmsg_into().
2046
2047 def testSendmsgNoDestAddr(self):
2048 # Check that sendmsg() fails when no destination address is
2049 # given for unconnected socket.
2050 pass
2051
2052 def _testSendmsgNoDestAddr(self):
2053 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2054 [MSG])
2055 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2056 [MSG], [], 0, None)
2057
2058
2059class RecvmsgGenericTests(SendrecvmsgBase):
2060 # Tests for recvmsg() which can also be emulated using
2061 # recvmsg_into(), and can use any socket type.
2062
2063 def testRecvmsg(self):
2064 # Receive a simple message with recvmsg[_into]().
2065 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2066 self.assertEqual(msg, MSG)
2067 self.checkRecvmsgAddress(addr, self.cli_addr)
2068 self.assertEqual(ancdata, [])
2069 self.checkFlags(flags, eor=True)
2070
2071 def _testRecvmsg(self):
2072 self.sendToServer(MSG)
2073
2074 def testRecvmsgExplicitDefaults(self):
2075 # Test recvmsg[_into]() with default arguments provided explicitly.
2076 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2077 len(MSG), 0, 0)
2078 self.assertEqual(msg, MSG)
2079 self.checkRecvmsgAddress(addr, self.cli_addr)
2080 self.assertEqual(ancdata, [])
2081 self.checkFlags(flags, eor=True)
2082
2083 def _testRecvmsgExplicitDefaults(self):
2084 self.sendToServer(MSG)
2085
2086 def testRecvmsgShorter(self):
2087 # Receive a message smaller than buffer.
2088 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2089 len(MSG) + 42)
2090 self.assertEqual(msg, MSG)
2091 self.checkRecvmsgAddress(addr, self.cli_addr)
2092 self.assertEqual(ancdata, [])
2093 self.checkFlags(flags, eor=True)
2094
2095 def _testRecvmsgShorter(self):
2096 self.sendToServer(MSG)
2097
Charles-François Natali8619cd72011-10-03 19:43:15 +02002098 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2099 # datagram is received (issue #13001).
2100 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002101 def testRecvmsgTrunc(self):
2102 # Receive part of message, check for truncation indicators.
2103 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2104 len(MSG) - 3)
2105 self.assertEqual(msg, MSG[:-3])
2106 self.checkRecvmsgAddress(addr, self.cli_addr)
2107 self.assertEqual(ancdata, [])
2108 self.checkFlags(flags, eor=False)
2109
Charles-François Natali8619cd72011-10-03 19:43:15 +02002110 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002111 def _testRecvmsgTrunc(self):
2112 self.sendToServer(MSG)
2113
2114 def testRecvmsgShortAncillaryBuf(self):
2115 # Test ancillary data buffer too small to hold any ancillary data.
2116 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2117 len(MSG), 1)
2118 self.assertEqual(msg, MSG)
2119 self.checkRecvmsgAddress(addr, self.cli_addr)
2120 self.assertEqual(ancdata, [])
2121 self.checkFlags(flags, eor=True)
2122
2123 def _testRecvmsgShortAncillaryBuf(self):
2124 self.sendToServer(MSG)
2125
2126 def testRecvmsgLongAncillaryBuf(self):
2127 # Test large ancillary data buffer.
2128 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2129 len(MSG), 10240)
2130 self.assertEqual(msg, MSG)
2131 self.checkRecvmsgAddress(addr, self.cli_addr)
2132 self.assertEqual(ancdata, [])
2133 self.checkFlags(flags, eor=True)
2134
2135 def _testRecvmsgLongAncillaryBuf(self):
2136 self.sendToServer(MSG)
2137
2138 def testRecvmsgAfterClose(self):
2139 # Check that recvmsg[_into]() fails on a closed socket.
2140 self.serv_sock.close()
2141 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2142
2143 def _testRecvmsgAfterClose(self):
2144 pass
2145
2146 def testRecvmsgTimeout(self):
2147 # Check that timeout works.
2148 try:
2149 self.serv_sock.settimeout(0.03)
2150 self.assertRaises(socket.timeout,
2151 self.doRecvmsg, self.serv_sock, len(MSG))
2152 finally:
2153 self.misc_event.set()
2154
2155 def _testRecvmsgTimeout(self):
2156 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2157
2158 @requireAttrs(socket, "MSG_PEEK")
2159 def testRecvmsgPeek(self):
2160 # Check that MSG_PEEK in flags enables examination of pending
2161 # data without consuming it.
2162
2163 # Receive part of data with MSG_PEEK.
2164 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2165 len(MSG) - 3, 0,
2166 socket.MSG_PEEK)
2167 self.assertEqual(msg, MSG[:-3])
2168 self.checkRecvmsgAddress(addr, self.cli_addr)
2169 self.assertEqual(ancdata, [])
2170 # Ignoring MSG_TRUNC here (so this test is the same for stream
2171 # and datagram sockets). Some wording in POSIX seems to
2172 # suggest that it needn't be set when peeking, but that may
2173 # just be a slip.
2174 self.checkFlags(flags, eor=False,
2175 ignore=getattr(socket, "MSG_TRUNC", 0))
2176
2177 # Receive all data with MSG_PEEK.
2178 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2179 len(MSG), 0,
2180 socket.MSG_PEEK)
2181 self.assertEqual(msg, MSG)
2182 self.checkRecvmsgAddress(addr, self.cli_addr)
2183 self.assertEqual(ancdata, [])
2184 self.checkFlags(flags, eor=True)
2185
2186 # Check that the same data can still be received normally.
2187 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2188 self.assertEqual(msg, MSG)
2189 self.checkRecvmsgAddress(addr, self.cli_addr)
2190 self.assertEqual(ancdata, [])
2191 self.checkFlags(flags, eor=True)
2192
2193 @testRecvmsgPeek.client_skip
2194 def _testRecvmsgPeek(self):
2195 self.sendToServer(MSG)
2196
2197 @requireAttrs(socket.socket, "sendmsg")
2198 def testRecvmsgFromSendmsg(self):
2199 # Test receiving with recvmsg[_into]() when message is sent
2200 # using sendmsg().
2201 self.serv_sock.settimeout(self.fail_timeout)
2202 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2203 self.assertEqual(msg, MSG)
2204 self.checkRecvmsgAddress(addr, self.cli_addr)
2205 self.assertEqual(ancdata, [])
2206 self.checkFlags(flags, eor=True)
2207
2208 @testRecvmsgFromSendmsg.client_skip
2209 def _testRecvmsgFromSendmsg(self):
2210 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2211
2212
2213class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2214 # Tests which require a stream socket and can use either recvmsg()
2215 # or recvmsg_into().
2216
2217 def testRecvmsgEOF(self):
2218 # Receive end-of-stream indicator (b"", peer socket closed).
2219 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2220 self.assertEqual(msg, b"")
2221 self.checkRecvmsgAddress(addr, self.cli_addr)
2222 self.assertEqual(ancdata, [])
2223 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2224
2225 def _testRecvmsgEOF(self):
2226 self.cli_sock.close()
2227
2228 def testRecvmsgOverflow(self):
2229 # Receive a message in more than one chunk.
2230 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2231 len(MSG) - 3)
2232 self.checkRecvmsgAddress(addr, self.cli_addr)
2233 self.assertEqual(ancdata, [])
2234 self.checkFlags(flags, eor=False)
2235
2236 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2237 self.checkRecvmsgAddress(addr, self.cli_addr)
2238 self.assertEqual(ancdata, [])
2239 self.checkFlags(flags, eor=True)
2240
2241 msg = seg1 + seg2
2242 self.assertEqual(msg, MSG)
2243
2244 def _testRecvmsgOverflow(self):
2245 self.sendToServer(MSG)
2246
2247
2248class RecvmsgTests(RecvmsgGenericTests):
2249 # Tests for recvmsg() which can use any socket type.
2250
2251 def testRecvmsgBadArgs(self):
2252 # Check that recvmsg() rejects invalid arguments.
2253 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2254 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2255 -1, 0, 0)
2256 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2257 len(MSG), -1, 0)
2258 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2259 [bytearray(10)], 0, 0)
2260 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2261 object(), 0, 0)
2262 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2263 len(MSG), object(), 0)
2264 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2265 len(MSG), 0, object())
2266
2267 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2268 self.assertEqual(msg, MSG)
2269 self.checkRecvmsgAddress(addr, self.cli_addr)
2270 self.assertEqual(ancdata, [])
2271 self.checkFlags(flags, eor=True)
2272
2273 def _testRecvmsgBadArgs(self):
2274 self.sendToServer(MSG)
2275
2276
2277class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2278 # Tests for recvmsg_into() which can use any socket type.
2279
2280 def testRecvmsgIntoBadArgs(self):
2281 # Check that recvmsg_into() rejects invalid arguments.
2282 buf = bytearray(len(MSG))
2283 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2284 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2285 len(MSG), 0, 0)
2286 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2287 buf, 0, 0)
2288 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2289 [object()], 0, 0)
2290 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2291 [b"I'm not writable"], 0, 0)
2292 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2293 [buf, object()], 0, 0)
2294 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2295 [buf], -1, 0)
2296 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2297 [buf], object(), 0)
2298 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2299 [buf], 0, object())
2300
2301 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2302 self.assertEqual(nbytes, len(MSG))
2303 self.assertEqual(buf, bytearray(MSG))
2304 self.checkRecvmsgAddress(addr, self.cli_addr)
2305 self.assertEqual(ancdata, [])
2306 self.checkFlags(flags, eor=True)
2307
2308 def _testRecvmsgIntoBadArgs(self):
2309 self.sendToServer(MSG)
2310
2311 def testRecvmsgIntoGenerator(self):
2312 # Receive into buffer obtained from a generator (not a sequence).
2313 buf = bytearray(len(MSG))
2314 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2315 (o for o in [buf]))
2316 self.assertEqual(nbytes, len(MSG))
2317 self.assertEqual(buf, bytearray(MSG))
2318 self.checkRecvmsgAddress(addr, self.cli_addr)
2319 self.assertEqual(ancdata, [])
2320 self.checkFlags(flags, eor=True)
2321
2322 def _testRecvmsgIntoGenerator(self):
2323 self.sendToServer(MSG)
2324
2325 def testRecvmsgIntoArray(self):
2326 # Receive into an array rather than the usual bytearray.
2327 buf = array.array("B", [0] * len(MSG))
2328 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2329 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002330 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002331 self.checkRecvmsgAddress(addr, self.cli_addr)
2332 self.assertEqual(ancdata, [])
2333 self.checkFlags(flags, eor=True)
2334
2335 def _testRecvmsgIntoArray(self):
2336 self.sendToServer(MSG)
2337
2338 def testRecvmsgIntoScatter(self):
2339 # Receive into multiple buffers (scatter write).
2340 b1 = bytearray(b"----")
2341 b2 = bytearray(b"0123456789")
2342 b3 = bytearray(b"--------------")
2343 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2344 [b1, memoryview(b2)[2:9], b3])
2345 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2346 self.assertEqual(b1, bytearray(b"Mary"))
2347 self.assertEqual(b2, bytearray(b"01 had a 9"))
2348 self.assertEqual(b3, bytearray(b"little lamb---"))
2349 self.checkRecvmsgAddress(addr, self.cli_addr)
2350 self.assertEqual(ancdata, [])
2351 self.checkFlags(flags, eor=True)
2352
2353 def _testRecvmsgIntoScatter(self):
2354 self.sendToServer(b"Mary had a little lamb")
2355
2356
2357class CmsgMacroTests(unittest.TestCase):
2358 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2359 # assumptions used by sendmsg() and recvmsg[_into](), which share
2360 # code with these functions.
2361
2362 # Match the definition in socketmodule.c
2363 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2364
2365 @requireAttrs(socket, "CMSG_LEN")
2366 def testCMSG_LEN(self):
2367 # Test CMSG_LEN() with various valid and invalid values,
2368 # checking the assumptions used by recvmsg() and sendmsg().
2369 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2370 values = list(range(257)) + list(range(toobig - 257, toobig))
2371
2372 # struct cmsghdr has at least three members, two of which are ints
2373 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2374 for n in values:
2375 ret = socket.CMSG_LEN(n)
2376 # This is how recvmsg() calculates the data size
2377 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2378 self.assertLessEqual(ret, self.socklen_t_limit)
2379
2380 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2381 # sendmsg() shares code with these functions, and requires
2382 # that it reject values over the limit.
2383 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2384 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2385
2386 @requireAttrs(socket, "CMSG_SPACE")
2387 def testCMSG_SPACE(self):
2388 # Test CMSG_SPACE() with various valid and invalid values,
2389 # checking the assumptions used by sendmsg().
2390 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2391 values = list(range(257)) + list(range(toobig - 257, toobig))
2392
2393 last = socket.CMSG_SPACE(0)
2394 # struct cmsghdr has at least three members, two of which are ints
2395 self.assertGreater(last, array.array("i").itemsize * 2)
2396 for n in values:
2397 ret = socket.CMSG_SPACE(n)
2398 self.assertGreaterEqual(ret, last)
2399 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2400 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2401 self.assertLessEqual(ret, self.socklen_t_limit)
2402 last = ret
2403
2404 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2405 # sendmsg() shares code with these functions, and requires
2406 # that it reject values over the limit.
2407 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2408 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2409
2410
2411class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2412 # Tests for file descriptor passing on Unix-domain sockets.
2413
2414 # Invalid file descriptor value that's unlikely to evaluate to a
2415 # real FD even if one of its bytes is replaced with a different
2416 # value (which shouldn't actually happen).
2417 badfd = -0x5555
2418
2419 def newFDs(self, n):
2420 # Return a list of n file descriptors for newly-created files
2421 # containing their list indices as ASCII numbers.
2422 fds = []
2423 for i in range(n):
2424 fd, path = tempfile.mkstemp()
2425 self.addCleanup(os.unlink, path)
2426 self.addCleanup(os.close, fd)
2427 os.write(fd, str(i).encode())
2428 fds.append(fd)
2429 return fds
2430
2431 def checkFDs(self, fds):
2432 # Check that the file descriptors in the given list contain
2433 # their correct list indices as ASCII numbers.
2434 for n, fd in enumerate(fds):
2435 os.lseek(fd, 0, os.SEEK_SET)
2436 self.assertEqual(os.read(fd, 1024), str(n).encode())
2437
2438 def registerRecvmsgResult(self, result):
2439 self.addCleanup(self.closeRecvmsgFDs, result)
2440
2441 def closeRecvmsgFDs(self, recvmsg_result):
2442 # Close all file descriptors specified in the ancillary data
2443 # of the given return value from recvmsg() or recvmsg_into().
2444 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2445 if (cmsg_level == socket.SOL_SOCKET and
2446 cmsg_type == socket.SCM_RIGHTS):
2447 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002448 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002449 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2450 for fd in fds:
2451 os.close(fd)
2452
2453 def createAndSendFDs(self, n):
2454 # Send n new file descriptors created by newFDs() to the
2455 # server, with the constant MSG as the non-ancillary data.
2456 self.assertEqual(
2457 self.sendmsgToServer([MSG],
2458 [(socket.SOL_SOCKET,
2459 socket.SCM_RIGHTS,
2460 array.array("i", self.newFDs(n)))]),
2461 len(MSG))
2462
2463 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2464 # Check that constant MSG was received with numfds file
2465 # descriptors in a maximum of maxcmsgs control messages (which
2466 # must contain only complete integers). By default, check
2467 # that MSG_CTRUNC is unset, but ignore any flags in
2468 # ignoreflags.
2469 msg, ancdata, flags, addr = result
2470 self.assertEqual(msg, MSG)
2471 self.checkRecvmsgAddress(addr, self.cli_addr)
2472 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2473 ignore=ignoreflags)
2474
2475 self.assertIsInstance(ancdata, list)
2476 self.assertLessEqual(len(ancdata), maxcmsgs)
2477 fds = array.array("i")
2478 for item in ancdata:
2479 self.assertIsInstance(item, tuple)
2480 cmsg_level, cmsg_type, cmsg_data = item
2481 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2482 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2483 self.assertIsInstance(cmsg_data, bytes)
2484 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002485 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002486
2487 self.assertEqual(len(fds), numfds)
2488 self.checkFDs(fds)
2489
2490 def testFDPassSimple(self):
2491 # Pass a single FD (array read from bytes object).
2492 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2493 len(MSG), 10240))
2494
2495 def _testFDPassSimple(self):
2496 self.assertEqual(
2497 self.sendmsgToServer(
2498 [MSG],
2499 [(socket.SOL_SOCKET,
2500 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002501 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002502 len(MSG))
2503
2504 def testMultipleFDPass(self):
2505 # Pass multiple FDs in a single array.
2506 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2507 len(MSG), 10240))
2508
2509 def _testMultipleFDPass(self):
2510 self.createAndSendFDs(4)
2511
2512 @requireAttrs(socket, "CMSG_SPACE")
2513 def testFDPassCMSG_SPACE(self):
2514 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2515 self.checkRecvmsgFDs(
2516 4, self.doRecvmsg(self.serv_sock, len(MSG),
2517 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2518
2519 @testFDPassCMSG_SPACE.client_skip
2520 def _testFDPassCMSG_SPACE(self):
2521 self.createAndSendFDs(4)
2522
2523 def testFDPassCMSG_LEN(self):
2524 # Test using CMSG_LEN() to calculate ancillary buffer size.
2525 self.checkRecvmsgFDs(1,
2526 self.doRecvmsg(self.serv_sock, len(MSG),
2527 socket.CMSG_LEN(4 * SIZEOF_INT)),
2528 # RFC 3542 says implementations may set
2529 # MSG_CTRUNC if there isn't enough space
2530 # for trailing padding.
2531 ignoreflags=socket.MSG_CTRUNC)
2532
2533 def _testFDPassCMSG_LEN(self):
2534 self.createAndSendFDs(1)
2535
Nick Coghlan2496f332011-09-19 20:26:31 +10002536 # Issue #12958: The following test has problems on Mac OS X
2537 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002538 @requireAttrs(socket, "CMSG_SPACE")
2539 def testFDPassSeparate(self):
2540 # Pass two FDs in two separate arrays. Arrays may be combined
2541 # into a single control message by the OS.
2542 self.checkRecvmsgFDs(2,
2543 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2544 maxcmsgs=2)
2545
2546 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002547 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002548 def _testFDPassSeparate(self):
2549 fd0, fd1 = self.newFDs(2)
2550 self.assertEqual(
2551 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2552 socket.SCM_RIGHTS,
2553 array.array("i", [fd0])),
2554 (socket.SOL_SOCKET,
2555 socket.SCM_RIGHTS,
2556 array.array("i", [fd1]))]),
2557 len(MSG))
2558
Nick Coghlan2496f332011-09-19 20:26:31 +10002559 # Issue #12958: The following test has problems on Mac OS X
2560 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002561 @requireAttrs(socket, "CMSG_SPACE")
2562 def testFDPassSeparateMinSpace(self):
2563 # Pass two FDs in two separate arrays, receiving them into the
2564 # minimum space for two arrays.
2565 self.checkRecvmsgFDs(2,
2566 self.doRecvmsg(self.serv_sock, len(MSG),
2567 socket.CMSG_SPACE(SIZEOF_INT) +
2568 socket.CMSG_LEN(SIZEOF_INT)),
2569 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2570
2571 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002572 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002573 def _testFDPassSeparateMinSpace(self):
2574 fd0, fd1 = self.newFDs(2)
2575 self.assertEqual(
2576 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2577 socket.SCM_RIGHTS,
2578 array.array("i", [fd0])),
2579 (socket.SOL_SOCKET,
2580 socket.SCM_RIGHTS,
2581 array.array("i", [fd1]))]),
2582 len(MSG))
2583
2584 def sendAncillaryIfPossible(self, msg, ancdata):
2585 # Try to send msg and ancdata to server, but if the system
2586 # call fails, just send msg with no ancillary data.
2587 try:
2588 nbytes = self.sendmsgToServer([msg], ancdata)
2589 except socket.error as e:
2590 # Check that it was the system call that failed
2591 self.assertIsInstance(e.errno, int)
2592 nbytes = self.sendmsgToServer([msg])
2593 self.assertEqual(nbytes, len(msg))
2594
2595 def testFDPassEmpty(self):
2596 # Try to pass an empty FD array. Can receive either no array
2597 # or an empty array.
2598 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2599 len(MSG), 10240),
2600 ignoreflags=socket.MSG_CTRUNC)
2601
2602 def _testFDPassEmpty(self):
2603 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2604 socket.SCM_RIGHTS,
2605 b"")])
2606
2607 def testFDPassPartialInt(self):
2608 # Try to pass a truncated FD array.
2609 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2610 len(MSG), 10240)
2611 self.assertEqual(msg, MSG)
2612 self.checkRecvmsgAddress(addr, self.cli_addr)
2613 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2614 self.assertLessEqual(len(ancdata), 1)
2615 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2616 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2617 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2618 self.assertLess(len(cmsg_data), SIZEOF_INT)
2619
2620 def _testFDPassPartialInt(self):
2621 self.sendAncillaryIfPossible(
2622 MSG,
2623 [(socket.SOL_SOCKET,
2624 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002625 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002626
2627 @requireAttrs(socket, "CMSG_SPACE")
2628 def testFDPassPartialIntInMiddle(self):
2629 # Try to pass two FD arrays, the first of which is truncated.
2630 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2631 len(MSG), 10240)
2632 self.assertEqual(msg, MSG)
2633 self.checkRecvmsgAddress(addr, self.cli_addr)
2634 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2635 self.assertLessEqual(len(ancdata), 2)
2636 fds = array.array("i")
2637 # Arrays may have been combined in a single control message
2638 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2639 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2640 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002641 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002642 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2643 self.assertLessEqual(len(fds), 2)
2644 self.checkFDs(fds)
2645
2646 @testFDPassPartialIntInMiddle.client_skip
2647 def _testFDPassPartialIntInMiddle(self):
2648 fd0, fd1 = self.newFDs(2)
2649 self.sendAncillaryIfPossible(
2650 MSG,
2651 [(socket.SOL_SOCKET,
2652 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002653 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002654 (socket.SOL_SOCKET,
2655 socket.SCM_RIGHTS,
2656 array.array("i", [fd1]))])
2657
2658 def checkTruncatedHeader(self, result, ignoreflags=0):
2659 # Check that no ancillary data items are returned when data is
2660 # truncated inside the cmsghdr structure.
2661 msg, ancdata, flags, addr = result
2662 self.assertEqual(msg, MSG)
2663 self.checkRecvmsgAddress(addr, self.cli_addr)
2664 self.assertEqual(ancdata, [])
2665 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2666 ignore=ignoreflags)
2667
2668 def testCmsgTruncNoBufSize(self):
2669 # Check that no ancillary data is received when no buffer size
2670 # is specified.
2671 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2672 # BSD seems to set MSG_CTRUNC only
2673 # if an item has been partially
2674 # received.
2675 ignoreflags=socket.MSG_CTRUNC)
2676
2677 def _testCmsgTruncNoBufSize(self):
2678 self.createAndSendFDs(1)
2679
2680 def testCmsgTrunc0(self):
2681 # Check that no ancillary data is received when buffer size is 0.
2682 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2683 ignoreflags=socket.MSG_CTRUNC)
2684
2685 def _testCmsgTrunc0(self):
2686 self.createAndSendFDs(1)
2687
2688 # Check that no ancillary data is returned for various non-zero
2689 # (but still too small) buffer sizes.
2690
2691 def testCmsgTrunc1(self):
2692 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2693
2694 def _testCmsgTrunc1(self):
2695 self.createAndSendFDs(1)
2696
2697 def testCmsgTrunc2Int(self):
2698 # The cmsghdr structure has at least three members, two of
2699 # which are ints, so we still shouldn't see any ancillary
2700 # data.
2701 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2702 SIZEOF_INT * 2))
2703
2704 def _testCmsgTrunc2Int(self):
2705 self.createAndSendFDs(1)
2706
2707 def testCmsgTruncLen0Minus1(self):
2708 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2709 socket.CMSG_LEN(0) - 1))
2710
2711 def _testCmsgTruncLen0Minus1(self):
2712 self.createAndSendFDs(1)
2713
2714 # The following tests try to truncate the control message in the
2715 # middle of the FD array.
2716
2717 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2718 # Check that file descriptor data is truncated to between
2719 # mindata and maxdata bytes when received with buffer size
2720 # ancbuf, and that any complete file descriptor numbers are
2721 # valid.
2722 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2723 len(MSG), ancbuf)
2724 self.assertEqual(msg, MSG)
2725 self.checkRecvmsgAddress(addr, self.cli_addr)
2726 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2727
2728 if mindata == 0 and ancdata == []:
2729 return
2730 self.assertEqual(len(ancdata), 1)
2731 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2732 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2733 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2734 self.assertGreaterEqual(len(cmsg_data), mindata)
2735 self.assertLessEqual(len(cmsg_data), maxdata)
2736 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002737 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002738 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2739 self.checkFDs(fds)
2740
2741 def testCmsgTruncLen0(self):
2742 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2743
2744 def _testCmsgTruncLen0(self):
2745 self.createAndSendFDs(1)
2746
2747 def testCmsgTruncLen0Plus1(self):
2748 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2749
2750 def _testCmsgTruncLen0Plus1(self):
2751 self.createAndSendFDs(2)
2752
2753 def testCmsgTruncLen1(self):
2754 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2755 maxdata=SIZEOF_INT)
2756
2757 def _testCmsgTruncLen1(self):
2758 self.createAndSendFDs(2)
2759
2760 def testCmsgTruncLen2Minus1(self):
2761 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2762 maxdata=(2 * SIZEOF_INT) - 1)
2763
2764 def _testCmsgTruncLen2Minus1(self):
2765 self.createAndSendFDs(2)
2766
2767
2768class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2769 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2770 # features of the RFC 3542 Advanced Sockets API for IPv6.
2771 # Currently we can only handle certain data items (e.g. traffic
2772 # class, hop limit, MTU discovery and fragmentation settings)
2773 # without resorting to unportable means such as the struct module,
2774 # but the tests here are aimed at testing the ancillary data
2775 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2776 # itself.
2777
2778 # Test value to use when setting hop limit of packet
2779 hop_limit = 2
2780
2781 # Test value to use when setting traffic class of packet.
2782 # -1 means "use kernel default".
2783 traffic_class = -1
2784
2785 def ancillaryMapping(self, ancdata):
2786 # Given ancillary data list ancdata, return a mapping from
2787 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2788 # Check that no (level, type) pair appears more than once.
2789 d = {}
2790 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2791 self.assertNotIn((cmsg_level, cmsg_type), d)
2792 d[(cmsg_level, cmsg_type)] = cmsg_data
2793 return d
2794
2795 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2796 # Receive hop limit into ancbufsize bytes of ancillary data
2797 # space. Check that data is MSG, ancillary data is not
2798 # truncated (but ignore any flags in ignoreflags), and hop
2799 # limit is between 0 and maxhop inclusive.
2800 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2801 socket.IPV6_RECVHOPLIMIT, 1)
2802 self.misc_event.set()
2803 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2804 len(MSG), ancbufsize)
2805
2806 self.assertEqual(msg, MSG)
2807 self.checkRecvmsgAddress(addr, self.cli_addr)
2808 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2809 ignore=ignoreflags)
2810
2811 self.assertEqual(len(ancdata), 1)
2812 self.assertIsInstance(ancdata[0], tuple)
2813 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2814 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2815 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2816 self.assertIsInstance(cmsg_data, bytes)
2817 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2818 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002819 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002820 self.assertGreaterEqual(a[0], 0)
2821 self.assertLessEqual(a[0], maxhop)
2822
2823 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2824 def testRecvHopLimit(self):
2825 # Test receiving the packet hop limit as ancillary data.
2826 self.checkHopLimit(ancbufsize=10240)
2827
2828 @testRecvHopLimit.client_skip
2829 def _testRecvHopLimit(self):
2830 # Need to wait until server has asked to receive ancillary
2831 # data, as implementations are not required to buffer it
2832 # otherwise.
2833 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2834 self.sendToServer(MSG)
2835
2836 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2837 def testRecvHopLimitCMSG_SPACE(self):
2838 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2839 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2840
2841 @testRecvHopLimitCMSG_SPACE.client_skip
2842 def _testRecvHopLimitCMSG_SPACE(self):
2843 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2844 self.sendToServer(MSG)
2845
2846 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2847 # 3542 says portable applications must provide space for trailing
2848 # padding. Implementations may set MSG_CTRUNC if there isn't
2849 # enough space for the padding.
2850
2851 @requireAttrs(socket.socket, "sendmsg")
2852 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2853 def testSetHopLimit(self):
2854 # Test setting hop limit on outgoing packet and receiving it
2855 # at the other end.
2856 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2857
2858 @testSetHopLimit.client_skip
2859 def _testSetHopLimit(self):
2860 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2861 self.assertEqual(
2862 self.sendmsgToServer([MSG],
2863 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2864 array.array("i", [self.hop_limit]))]),
2865 len(MSG))
2866
2867 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2868 ignoreflags=0):
2869 # Receive traffic class and hop limit into ancbufsize bytes of
2870 # ancillary data space. Check that data is MSG, ancillary
2871 # data is not truncated (but ignore any flags in ignoreflags),
2872 # and traffic class and hop limit are in range (hop limit no
2873 # more than maxhop).
2874 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2875 socket.IPV6_RECVHOPLIMIT, 1)
2876 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2877 socket.IPV6_RECVTCLASS, 1)
2878 self.misc_event.set()
2879 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2880 len(MSG), ancbufsize)
2881
2882 self.assertEqual(msg, MSG)
2883 self.checkRecvmsgAddress(addr, self.cli_addr)
2884 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2885 ignore=ignoreflags)
2886 self.assertEqual(len(ancdata), 2)
2887 ancmap = self.ancillaryMapping(ancdata)
2888
2889 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2890 self.assertEqual(len(tcdata), SIZEOF_INT)
2891 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002892 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002893 self.assertGreaterEqual(a[0], 0)
2894 self.assertLessEqual(a[0], 255)
2895
2896 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2897 self.assertEqual(len(hldata), SIZEOF_INT)
2898 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002899 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002900 self.assertGreaterEqual(a[0], 0)
2901 self.assertLessEqual(a[0], maxhop)
2902
2903 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2904 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2905 def testRecvTrafficClassAndHopLimit(self):
2906 # Test receiving traffic class and hop limit as ancillary data.
2907 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2908
2909 @testRecvTrafficClassAndHopLimit.client_skip
2910 def _testRecvTrafficClassAndHopLimit(self):
2911 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2912 self.sendToServer(MSG)
2913
2914 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2915 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2916 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2917 # Test receiving traffic class and hop limit, using
2918 # CMSG_SPACE() to calculate buffer size.
2919 self.checkTrafficClassAndHopLimit(
2920 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2921
2922 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2923 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2924 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2925 self.sendToServer(MSG)
2926
2927 @requireAttrs(socket.socket, "sendmsg")
2928 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2929 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2930 def testSetTrafficClassAndHopLimit(self):
2931 # Test setting traffic class and hop limit on outgoing packet,
2932 # and receiving them at the other end.
2933 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2934 maxhop=self.hop_limit)
2935
2936 @testSetTrafficClassAndHopLimit.client_skip
2937 def _testSetTrafficClassAndHopLimit(self):
2938 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2939 self.assertEqual(
2940 self.sendmsgToServer([MSG],
2941 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2942 array.array("i", [self.traffic_class])),
2943 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2944 array.array("i", [self.hop_limit]))]),
2945 len(MSG))
2946
2947 @requireAttrs(socket.socket, "sendmsg")
2948 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2949 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2950 def testOddCmsgSize(self):
2951 # Try to send ancillary data with first item one byte too
2952 # long. Fall back to sending with correct size if this fails,
2953 # and check that second item was handled correctly.
2954 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2955 maxhop=self.hop_limit)
2956
2957 @testOddCmsgSize.client_skip
2958 def _testOddCmsgSize(self):
2959 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2960 try:
2961 nbytes = self.sendmsgToServer(
2962 [MSG],
2963 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002964 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002965 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2966 array.array("i", [self.hop_limit]))])
2967 except socket.error as e:
2968 self.assertIsInstance(e.errno, int)
2969 nbytes = self.sendmsgToServer(
2970 [MSG],
2971 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2972 array.array("i", [self.traffic_class])),
2973 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2974 array.array("i", [self.hop_limit]))])
2975 self.assertEqual(nbytes, len(MSG))
2976
2977 # Tests for proper handling of truncated ancillary data
2978
2979 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2980 # Receive hop limit into ancbufsize bytes of ancillary data
2981 # space, which should be too small to contain the ancillary
2982 # data header (if ancbufsize is None, pass no second argument
2983 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2984 # (unless included in ignoreflags), and no ancillary data is
2985 # returned.
2986 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2987 socket.IPV6_RECVHOPLIMIT, 1)
2988 self.misc_event.set()
2989 args = () if ancbufsize is None else (ancbufsize,)
2990 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2991 len(MSG), *args)
2992
2993 self.assertEqual(msg, MSG)
2994 self.checkRecvmsgAddress(addr, self.cli_addr)
2995 self.assertEqual(ancdata, [])
2996 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2997 ignore=ignoreflags)
2998
2999 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3000 def testCmsgTruncNoBufSize(self):
3001 # Check that no ancillary data is received when no ancillary
3002 # buffer size is provided.
3003 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3004 # BSD seems to set
3005 # MSG_CTRUNC only if an item
3006 # has been partially
3007 # received.
3008 ignoreflags=socket.MSG_CTRUNC)
3009
3010 @testCmsgTruncNoBufSize.client_skip
3011 def _testCmsgTruncNoBufSize(self):
3012 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3013 self.sendToServer(MSG)
3014
3015 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3016 def testSingleCmsgTrunc0(self):
3017 # Check that no ancillary data is received when ancillary
3018 # buffer size is zero.
3019 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3020 ignoreflags=socket.MSG_CTRUNC)
3021
3022 @testSingleCmsgTrunc0.client_skip
3023 def _testSingleCmsgTrunc0(self):
3024 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3025 self.sendToServer(MSG)
3026
3027 # Check that no ancillary data is returned for various non-zero
3028 # (but still too small) buffer sizes.
3029
3030 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3031 def testSingleCmsgTrunc1(self):
3032 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3033
3034 @testSingleCmsgTrunc1.client_skip
3035 def _testSingleCmsgTrunc1(self):
3036 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3037 self.sendToServer(MSG)
3038
3039 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3040 def testSingleCmsgTrunc2Int(self):
3041 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3042
3043 @testSingleCmsgTrunc2Int.client_skip
3044 def _testSingleCmsgTrunc2Int(self):
3045 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3046 self.sendToServer(MSG)
3047
3048 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3049 def testSingleCmsgTruncLen0Minus1(self):
3050 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3051
3052 @testSingleCmsgTruncLen0Minus1.client_skip
3053 def _testSingleCmsgTruncLen0Minus1(self):
3054 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3055 self.sendToServer(MSG)
3056
3057 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3058 def testSingleCmsgTruncInData(self):
3059 # Test truncation of a control message inside its associated
3060 # data. The message may be returned with its data truncated,
3061 # or not returned at all.
3062 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3063 socket.IPV6_RECVHOPLIMIT, 1)
3064 self.misc_event.set()
3065 msg, ancdata, flags, addr = self.doRecvmsg(
3066 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3067
3068 self.assertEqual(msg, MSG)
3069 self.checkRecvmsgAddress(addr, self.cli_addr)
3070 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3071
3072 self.assertLessEqual(len(ancdata), 1)
3073 if ancdata:
3074 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3075 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3076 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3077 self.assertLess(len(cmsg_data), SIZEOF_INT)
3078
3079 @testSingleCmsgTruncInData.client_skip
3080 def _testSingleCmsgTruncInData(self):
3081 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3082 self.sendToServer(MSG)
3083
3084 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3085 # Receive traffic class and hop limit into ancbufsize bytes of
3086 # ancillary data space, which should be large enough to
3087 # contain the first item, but too small to contain the header
3088 # of the second. Check that data is MSG, MSG_CTRUNC is set
3089 # (unless included in ignoreflags), and only one ancillary
3090 # data item is returned.
3091 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3092 socket.IPV6_RECVHOPLIMIT, 1)
3093 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3094 socket.IPV6_RECVTCLASS, 1)
3095 self.misc_event.set()
3096 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3097 len(MSG), ancbufsize)
3098
3099 self.assertEqual(msg, MSG)
3100 self.checkRecvmsgAddress(addr, self.cli_addr)
3101 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3102 ignore=ignoreflags)
3103
3104 self.assertEqual(len(ancdata), 1)
3105 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3106 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3107 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3108 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3109 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003110 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003111 self.assertGreaterEqual(a[0], 0)
3112 self.assertLessEqual(a[0], 255)
3113
3114 # Try the above test with various buffer sizes.
3115
3116 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3117 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3118 def testSecondCmsgTrunc0(self):
3119 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3120 ignoreflags=socket.MSG_CTRUNC)
3121
3122 @testSecondCmsgTrunc0.client_skip
3123 def _testSecondCmsgTrunc0(self):
3124 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3125 self.sendToServer(MSG)
3126
3127 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3128 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3129 def testSecondCmsgTrunc1(self):
3130 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3131
3132 @testSecondCmsgTrunc1.client_skip
3133 def _testSecondCmsgTrunc1(self):
3134 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3135 self.sendToServer(MSG)
3136
3137 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3138 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3139 def testSecondCmsgTrunc2Int(self):
3140 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3141 2 * SIZEOF_INT)
3142
3143 @testSecondCmsgTrunc2Int.client_skip
3144 def _testSecondCmsgTrunc2Int(self):
3145 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3146 self.sendToServer(MSG)
3147
3148 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3149 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3150 def testSecondCmsgTruncLen0Minus1(self):
3151 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3152 socket.CMSG_LEN(0) - 1)
3153
3154 @testSecondCmsgTruncLen0Minus1.client_skip
3155 def _testSecondCmsgTruncLen0Minus1(self):
3156 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3157 self.sendToServer(MSG)
3158
3159 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3160 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3161 def testSecomdCmsgTruncInData(self):
3162 # Test truncation of the second of two control messages inside
3163 # its associated data.
3164 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3165 socket.IPV6_RECVHOPLIMIT, 1)
3166 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3167 socket.IPV6_RECVTCLASS, 1)
3168 self.misc_event.set()
3169 msg, ancdata, flags, addr = self.doRecvmsg(
3170 self.serv_sock, len(MSG),
3171 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3172
3173 self.assertEqual(msg, MSG)
3174 self.checkRecvmsgAddress(addr, self.cli_addr)
3175 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3176
3177 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3178
3179 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3180 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3181 cmsg_types.remove(cmsg_type)
3182 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3183 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003184 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003185 self.assertGreaterEqual(a[0], 0)
3186 self.assertLessEqual(a[0], 255)
3187
3188 if ancdata:
3189 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3190 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3191 cmsg_types.remove(cmsg_type)
3192 self.assertLess(len(cmsg_data), SIZEOF_INT)
3193
3194 self.assertEqual(ancdata, [])
3195
3196 @testSecomdCmsgTruncInData.client_skip
3197 def _testSecomdCmsgTruncInData(self):
3198 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3199 self.sendToServer(MSG)
3200
3201
3202# Derive concrete test classes for different socket types.
3203
3204class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3205 SendrecvmsgConnectionlessBase,
3206 ThreadedSocketTestMixin, UDPTestBase):
3207 pass
3208
3209@requireAttrs(socket.socket, "sendmsg")
3210@unittest.skipUnless(thread, 'Threading required for this test.')
3211class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3212 pass
3213
3214@requireAttrs(socket.socket, "recvmsg")
3215@unittest.skipUnless(thread, 'Threading required for this test.')
3216class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3217 pass
3218
3219@requireAttrs(socket.socket, "recvmsg_into")
3220@unittest.skipUnless(thread, 'Threading required for this test.')
3221class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3222 pass
3223
3224
3225class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3226 SendrecvmsgConnectionlessBase,
3227 ThreadedSocketTestMixin, UDP6TestBase):
3228 pass
3229
3230@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003231@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003232@requireSocket("AF_INET6", "SOCK_DGRAM")
3233@unittest.skipUnless(thread, 'Threading required for this test.')
3234class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3235 pass
3236
3237@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003238@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003239@requireSocket("AF_INET6", "SOCK_DGRAM")
3240@unittest.skipUnless(thread, 'Threading required for this test.')
3241class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3242 pass
3243
3244@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003245@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003246@requireSocket("AF_INET6", "SOCK_DGRAM")
3247@unittest.skipUnless(thread, 'Threading required for this test.')
3248class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3249 pass
3250
3251@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003252@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003253@requireAttrs(socket, "IPPROTO_IPV6")
3254@requireSocket("AF_INET6", "SOCK_DGRAM")
3255@unittest.skipUnless(thread, 'Threading required for this test.')
3256class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3257 SendrecvmsgUDP6TestBase):
3258 pass
3259
3260@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003261@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003262@requireAttrs(socket, "IPPROTO_IPV6")
3263@requireSocket("AF_INET6", "SOCK_DGRAM")
3264@unittest.skipUnless(thread, 'Threading required for this test.')
3265class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3266 RFC3542AncillaryTest,
3267 SendrecvmsgUDP6TestBase):
3268 pass
3269
3270
3271class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3272 ConnectedStreamTestMixin, TCPTestBase):
3273 pass
3274
3275@requireAttrs(socket.socket, "sendmsg")
3276@unittest.skipUnless(thread, 'Threading required for this test.')
3277class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3278 pass
3279
3280@requireAttrs(socket.socket, "recvmsg")
3281@unittest.skipUnless(thread, 'Threading required for this test.')
3282class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3283 SendrecvmsgTCPTestBase):
3284 pass
3285
3286@requireAttrs(socket.socket, "recvmsg_into")
3287@unittest.skipUnless(thread, 'Threading required for this test.')
3288class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3289 SendrecvmsgTCPTestBase):
3290 pass
3291
3292
3293class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3294 SendrecvmsgConnectedBase,
3295 ConnectedStreamTestMixin, SCTPStreamBase):
3296 pass
3297
3298@requireAttrs(socket.socket, "sendmsg")
3299@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3300@unittest.skipUnless(thread, 'Threading required for this test.')
3301class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3302 pass
3303
3304@requireAttrs(socket.socket, "recvmsg")
3305@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3306@unittest.skipUnless(thread, 'Threading required for this test.')
3307class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3308 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003309
3310 def testRecvmsgEOF(self):
3311 try:
3312 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3313 except OSError as e:
3314 if e.errno != errno.ENOTCONN:
3315 raise
3316 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003317
3318@requireAttrs(socket.socket, "recvmsg_into")
3319@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3320@unittest.skipUnless(thread, 'Threading required for this test.')
3321class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3322 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003323
3324 def testRecvmsgEOF(self):
3325 try:
3326 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3327 except OSError as e:
3328 if e.errno != errno.ENOTCONN:
3329 raise
3330 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003331
3332
3333class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3334 ConnectedStreamTestMixin, UnixStreamBase):
3335 pass
3336
3337@requireAttrs(socket.socket, "sendmsg")
3338@requireAttrs(socket, "AF_UNIX")
3339@unittest.skipUnless(thread, 'Threading required for this test.')
3340class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3341 pass
3342
3343@requireAttrs(socket.socket, "recvmsg")
3344@requireAttrs(socket, "AF_UNIX")
3345@unittest.skipUnless(thread, 'Threading required for this test.')
3346class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3347 SendrecvmsgUnixStreamTestBase):
3348 pass
3349
3350@requireAttrs(socket.socket, "recvmsg_into")
3351@requireAttrs(socket, "AF_UNIX")
3352@unittest.skipUnless(thread, 'Threading required for this test.')
3353class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3354 SendrecvmsgUnixStreamTestBase):
3355 pass
3356
3357@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3358@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3359@unittest.skipUnless(thread, 'Threading required for this test.')
3360class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3361 pass
3362
3363@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3364@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3365@unittest.skipUnless(thread, 'Threading required for this test.')
3366class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3367 SendrecvmsgUnixStreamTestBase):
3368 pass
3369
3370
3371# Test interrupting the interruptible send/receive methods with a
3372# signal when a timeout is set. These tests avoid having multiple
3373# threads alive during the test so that the OS cannot deliver the
3374# signal to the wrong one.
3375
3376class InterruptedTimeoutBase(unittest.TestCase):
3377 # Base class for interrupted send/receive tests. Installs an
3378 # empty handler for SIGALRM and removes it on teardown, along with
3379 # any scheduled alarms.
3380
3381 def setUp(self):
3382 super().setUp()
3383 orig_alrm_handler = signal.signal(signal.SIGALRM,
3384 lambda signum, frame: None)
3385 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3386 self.addCleanup(self.setAlarm, 0)
3387
3388 # Timeout for socket operations
3389 timeout = 4.0
3390
3391 # Provide setAlarm() method to schedule delivery of SIGALRM after
3392 # given number of seconds, or cancel it if zero, and an
3393 # appropriate time value to use. Use setitimer() if available.
3394 if hasattr(signal, "setitimer"):
3395 alarm_time = 0.05
3396
3397 def setAlarm(self, seconds):
3398 signal.setitimer(signal.ITIMER_REAL, seconds)
3399 else:
3400 # Old systems may deliver the alarm up to one second early
3401 alarm_time = 2
3402
3403 def setAlarm(self, seconds):
3404 signal.alarm(seconds)
3405
3406
3407# Require siginterrupt() in order to ensure that system calls are
3408# interrupted by default.
3409@requireAttrs(signal, "siginterrupt")
3410@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3411 "Don't have signal.alarm or signal.setitimer")
3412class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3413 # Test interrupting the recv*() methods with signals when a
3414 # timeout is set.
3415
3416 def setUp(self):
3417 super().setUp()
3418 self.serv.settimeout(self.timeout)
3419
3420 def checkInterruptedRecv(self, func, *args, **kwargs):
3421 # Check that func(*args, **kwargs) raises socket.error with an
3422 # errno of EINTR when interrupted by a signal.
3423 self.setAlarm(self.alarm_time)
3424 with self.assertRaises(socket.error) as cm:
3425 func(*args, **kwargs)
3426 self.assertNotIsInstance(cm.exception, socket.timeout)
3427 self.assertEqual(cm.exception.errno, errno.EINTR)
3428
3429 def testInterruptedRecvTimeout(self):
3430 self.checkInterruptedRecv(self.serv.recv, 1024)
3431
3432 def testInterruptedRecvIntoTimeout(self):
3433 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3434
3435 def testInterruptedRecvfromTimeout(self):
3436 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3437
3438 def testInterruptedRecvfromIntoTimeout(self):
3439 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3440
3441 @requireAttrs(socket.socket, "recvmsg")
3442 def testInterruptedRecvmsgTimeout(self):
3443 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3444
3445 @requireAttrs(socket.socket, "recvmsg_into")
3446 def testInterruptedRecvmsgIntoTimeout(self):
3447 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3448
3449
3450# Require siginterrupt() in order to ensure that system calls are
3451# interrupted by default.
3452@requireAttrs(signal, "siginterrupt")
3453@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3454 "Don't have signal.alarm or signal.setitimer")
3455@unittest.skipUnless(thread, 'Threading required for this test.')
3456class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3457 ThreadSafeCleanupTestCase,
3458 SocketListeningTestMixin, TCPTestBase):
3459 # Test interrupting the interruptible send*() methods with signals
3460 # when a timeout is set.
3461
3462 def setUp(self):
3463 super().setUp()
3464 self.serv_conn = self.newSocket()
3465 self.addCleanup(self.serv_conn.close)
3466 # Use a thread to complete the connection, but wait for it to
3467 # terminate before running the test, so that there is only one
3468 # thread to accept the signal.
3469 cli_thread = threading.Thread(target=self.doConnect)
3470 cli_thread.start()
3471 self.cli_conn, addr = self.serv.accept()
3472 self.addCleanup(self.cli_conn.close)
3473 cli_thread.join()
3474 self.serv_conn.settimeout(self.timeout)
3475
3476 def doConnect(self):
3477 self.serv_conn.connect(self.serv_addr)
3478
3479 def checkInterruptedSend(self, func, *args, **kwargs):
3480 # Check that func(*args, **kwargs), run in a loop, raises
3481 # socket.error with an errno of EINTR when interrupted by a
3482 # signal.
3483 with self.assertRaises(socket.error) as cm:
3484 while True:
3485 self.setAlarm(self.alarm_time)
3486 func(*args, **kwargs)
3487 self.assertNotIsInstance(cm.exception, socket.timeout)
3488 self.assertEqual(cm.exception.errno, errno.EINTR)
3489
Nick Coghlan2496f332011-09-19 20:26:31 +10003490 # Issue #12958: The following tests have problems on Mac OS X
3491 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003492 def testInterruptedSendTimeout(self):
3493 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3494
Nick Coghlan2496f332011-09-19 20:26:31 +10003495 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003496 def testInterruptedSendtoTimeout(self):
3497 # Passing an actual address here as Python's wrapper for
3498 # sendto() doesn't allow passing a zero-length one; POSIX
3499 # requires that the address is ignored since the socket is
3500 # connection-mode, however.
3501 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3502 self.serv_addr)
3503
Nick Coghlan2496f332011-09-19 20:26:31 +10003504 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003505 @requireAttrs(socket.socket, "sendmsg")
3506 def testInterruptedSendmsgTimeout(self):
3507 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3508
3509
Victor Stinner45df8202010-04-28 22:31:17 +00003510@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003511class TCPCloserTest(ThreadedTCPSocketTest):
3512
3513 def testClose(self):
3514 conn, addr = self.serv.accept()
3515 conn.close()
3516
3517 sd = self.cli
3518 read, write, err = select.select([sd], [], [], 1.0)
3519 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003520 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003521
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003522 # Calling close() many times should be safe.
3523 conn.close()
3524 conn.close()
3525
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003526 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003527 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003528 time.sleep(1.0)
3529
Victor Stinner45df8202010-04-28 22:31:17 +00003530@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003531class BasicSocketPairTest(SocketPairTest):
3532
3533 def __init__(self, methodName='runTest'):
3534 SocketPairTest.__init__(self, methodName=methodName)
3535
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003536 def _check_defaults(self, sock):
3537 self.assertIsInstance(sock, socket.socket)
3538 if hasattr(socket, 'AF_UNIX'):
3539 self.assertEqual(sock.family, socket.AF_UNIX)
3540 else:
3541 self.assertEqual(sock.family, socket.AF_INET)
3542 self.assertEqual(sock.type, socket.SOCK_STREAM)
3543 self.assertEqual(sock.proto, 0)
3544
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003545 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003546 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003547
3548 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003549 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003550
Dave Cole331708b2004-08-09 04:51:41 +00003551 def testRecv(self):
3552 msg = self.serv.recv(1024)
3553 self.assertEqual(msg, MSG)
3554
3555 def _testRecv(self):
3556 self.cli.send(MSG)
3557
3558 def testSend(self):
3559 self.serv.send(MSG)
3560
3561 def _testSend(self):
3562 msg = self.cli.recv(1024)
3563 self.assertEqual(msg, MSG)
3564
Victor Stinner45df8202010-04-28 22:31:17 +00003565@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003566class NonBlockingTCPTests(ThreadedTCPSocketTest):
3567
3568 def __init__(self, methodName='runTest'):
3569 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3570
3571 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003572 # Testing whether set blocking works
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02003573 self.serv.setblocking(True)
3574 self.assertIsNone(self.serv.gettimeout())
3575 self.serv.setblocking(False)
3576 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003577 start = time.time()
3578 try:
3579 self.serv.accept()
3580 except socket.error:
3581 pass
3582 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003583 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02003584 # Issue 15989
3585 if _testcapi.UINT_MAX < _testcapi.ULONG_MAX:
3586 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3587 self.assertIsNone(self.serv.gettimeout())
Guido van Rossum24e4af82002-06-12 19:18:08 +00003588
3589 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003590 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003591
Antoine Pitroub1c54962010-10-14 15:05:38 +00003592 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003593 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003594 def testInitNonBlocking(self):
3595 # reinit server socket
3596 self.serv.close()
3597 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003598 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003599 self.port = support.bind_port(self.serv)
3600 self.serv.listen(1)
3601 # actual testing
3602 start = time.time()
3603 try:
3604 self.serv.accept()
3605 except socket.error:
3606 pass
3607 end = time.time()
3608 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3609
3610 def _testInitNonBlocking(self):
3611 pass
3612
Antoine Pitrou600232b2011-01-05 21:03:42 +00003613 def testInheritFlags(self):
3614 # Issue #7995: when calling accept() on a listening socket with a
3615 # timeout, the resulting socket should not be non-blocking.
3616 self.serv.settimeout(10)
3617 try:
3618 conn, addr = self.serv.accept()
3619 message = conn.recv(len(MSG))
3620 finally:
3621 conn.close()
3622 self.serv.settimeout(None)
3623
3624 def _testInheritFlags(self):
3625 time.sleep(0.1)
3626 self.cli.connect((HOST, self.port))
3627 time.sleep(0.5)
3628 self.cli.send(MSG)
3629
Guido van Rossum24e4af82002-06-12 19:18:08 +00003630 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003631 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003632 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003633 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003634 conn, addr = self.serv.accept()
3635 except socket.error:
3636 pass
3637 else:
3638 self.fail("Error trying to do non-blocking accept.")
3639 read, write, err = select.select([self.serv], [], [])
3640 if self.serv in read:
3641 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003642 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003643 else:
3644 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003645
Guido van Rossum24e4af82002-06-12 19:18:08 +00003646 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003647 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003648 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003649
3650 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003651 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003652 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003653 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003654
3655 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003656 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003657 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003658
3659 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003660 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003661 conn, addr = self.serv.accept()
3662 conn.setblocking(0)
3663 try:
3664 msg = conn.recv(len(MSG))
3665 except socket.error:
3666 pass
3667 else:
3668 self.fail("Error trying to do non-blocking recv.")
3669 read, write, err = select.select([conn], [], [])
3670 if conn in read:
3671 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003672 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003673 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003674 else:
3675 self.fail("Error during select call to non-blocking socket.")
3676
3677 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003678 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003679 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003680 self.cli.send(MSG)
3681
Victor Stinner45df8202010-04-28 22:31:17 +00003682@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003683class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003684 """Unit tests for the object returned by socket.makefile()
3685
Antoine Pitrou834bd812010-10-13 16:17:14 +00003686 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003687 the client connection. You can read from this file to
3688 get output from the server.
3689
Antoine Pitrou834bd812010-10-13 16:17:14 +00003690 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003691 server connection. You can write to this file to send output
3692 to the client.
3693 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003694
Guido van Rossume9f66142002-08-07 15:46:19 +00003695 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003696 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003697 errors = 'strict'
3698 newline = None
3699
3700 read_mode = 'rb'
3701 read_msg = MSG
3702 write_mode = 'wb'
3703 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003704
Guido van Rossum24e4af82002-06-12 19:18:08 +00003705 def __init__(self, methodName='runTest'):
3706 SocketConnectedTest.__init__(self, methodName=methodName)
3707
3708 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003709 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3710 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003711 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003712 self.read_file = self.cli_conn.makefile(
3713 self.read_mode, self.bufsize,
3714 encoding = self.encoding,
3715 errors = self.errors,
3716 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003717
3718 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003719 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003720 self.read_file.close()
3721 self.assertTrue(self.read_file.closed)
3722 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003723 SocketConnectedTest.tearDown(self)
3724
3725 def clientSetUp(self):
3726 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003727 self.write_file = self.serv_conn.makefile(
3728 self.write_mode, self.bufsize,
3729 encoding = self.encoding,
3730 errors = self.errors,
3731 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003732
3733 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003734 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003735 self.write_file.close()
3736 self.assertTrue(self.write_file.closed)
3737 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003738 SocketConnectedTest.clientTearDown(self)
3739
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003740 def testReadAfterTimeout(self):
3741 # Issue #7322: A file object must disallow further reads
3742 # after a timeout has occurred.
3743 self.cli_conn.settimeout(1)
3744 self.read_file.read(3)
3745 # First read raises a timeout
3746 self.assertRaises(socket.timeout, self.read_file.read, 1)
3747 # Second read is disallowed
3748 with self.assertRaises(IOError) as ctx:
3749 self.read_file.read(1)
3750 self.assertIn("cannot read from timed out object", str(ctx.exception))
3751
3752 def _testReadAfterTimeout(self):
3753 self.write_file.write(self.write_msg[0:3])
3754 self.write_file.flush()
3755 self.serv_finished.wait()
3756
Guido van Rossum24e4af82002-06-12 19:18:08 +00003757 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003758 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003759 first_seg = self.read_file.read(len(self.read_msg)-3)
3760 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003761 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003762 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003763
3764 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003765 self.write_file.write(self.write_msg)
3766 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003767
Guido van Rossum8c943832002-08-08 01:00:28 +00003768 def testFullRead(self):
3769 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003770 msg = self.read_file.read()
3771 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003772
3773 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003774 self.write_file.write(self.write_msg)
3775 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003776
Guido van Rossum24e4af82002-06-12 19:18:08 +00003777 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003778 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003779 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003780 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003781 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003782 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003783 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003784 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003785 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003786
3787 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003788 self.write_file.write(self.write_msg)
3789 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003790
3791 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003792 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003793 line = self.read_file.readline()
3794 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003795
3796 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003797 self.write_file.write(self.write_msg)
3798 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003799
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003800 def testCloseAfterMakefile(self):
3801 # The file returned by makefile should keep the socket open.
3802 self.cli_conn.close()
3803 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003804 msg = self.read_file.read()
3805 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003806
3807 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003808 self.write_file.write(self.write_msg)
3809 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003810
3811 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003812 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003813 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003814 if isinstance(self.read_msg, str):
3815 msg = msg.decode()
3816 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003817
3818 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003819 self.write_file.write(self.write_msg)
3820 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003821
Tim Peters116d83c2004-03-28 02:20:45 +00003822 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003823 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003824
3825 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003826 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003827
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003828 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003829 self.assertEqual(self.read_file.mode, self.read_mode)
3830 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003831
3832 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003833 self.assertEqual(self.write_file.mode, self.write_mode)
3834 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003835
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003836 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003837 self.read_file.close()
3838 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003839 self.cli_conn.close()
3840 self.assertRaises(socket.error, self.cli_conn.getsockname)
3841
3842 def _testRealClose(self):
3843 pass
3844
3845
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003846class FileObjectInterruptedTestCase(unittest.TestCase):
3847 """Test that the file object correctly handles EINTR internally."""
3848
3849 class MockSocket(object):
3850 def __init__(self, recv_funcs=()):
3851 # A generator that returns callables that we'll call for each
3852 # call to recv().
3853 self._recv_step = iter(recv_funcs)
3854
3855 def recv_into(self, buffer):
3856 data = next(self._recv_step)()
3857 assert len(buffer) >= len(data)
3858 buffer[:len(data)] = data
3859 return len(data)
3860
3861 def _decref_socketios(self):
3862 pass
3863
3864 def _textiowrap_for_test(self, buffering=-1):
3865 raw = socket.SocketIO(self, "r")
3866 if buffering < 0:
3867 buffering = io.DEFAULT_BUFFER_SIZE
3868 if buffering == 0:
3869 return raw
3870 buffer = io.BufferedReader(raw, buffering)
3871 text = io.TextIOWrapper(buffer, None, None)
3872 text.mode = "rb"
3873 return text
3874
3875 @staticmethod
3876 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003877 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003878
3879 def _textiowrap_mock_socket(self, mock, buffering=-1):
3880 raw = socket.SocketIO(mock, "r")
3881 if buffering < 0:
3882 buffering = io.DEFAULT_BUFFER_SIZE
3883 if buffering == 0:
3884 return raw
3885 buffer = io.BufferedReader(raw, buffering)
3886 text = io.TextIOWrapper(buffer, None, None)
3887 text.mode = "rb"
3888 return text
3889
3890 def _test_readline(self, size=-1, buffering=-1):
3891 mock_sock = self.MockSocket(recv_funcs=[
3892 lambda : b"This is the first line\nAnd the sec",
3893 self._raise_eintr,
3894 lambda : b"ond line is here\n",
3895 lambda : b"",
3896 lambda : b"", # XXX(gps): io library does an extra EOF read
3897 ])
3898 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003899 self.assertEqual(fo.readline(size), "This is the first line\n")
3900 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003901
3902 def _test_read(self, size=-1, buffering=-1):
3903 mock_sock = self.MockSocket(recv_funcs=[
3904 lambda : b"This is the first line\nAnd the sec",
3905 self._raise_eintr,
3906 lambda : b"ond line is here\n",
3907 lambda : b"",
3908 lambda : b"", # XXX(gps): io library does an extra EOF read
3909 ])
3910 expecting = (b"This is the first line\n"
3911 b"And the second line is here\n")
3912 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3913 if buffering == 0:
3914 data = b''
3915 else:
3916 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003917 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003918 while len(data) != len(expecting):
3919 part = fo.read(size)
3920 if not part:
3921 break
3922 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003923 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003924
3925 def test_default(self):
3926 self._test_readline()
3927 self._test_readline(size=100)
3928 self._test_read()
3929 self._test_read(size=100)
3930
3931 def test_with_1k_buffer(self):
3932 self._test_readline(buffering=1024)
3933 self._test_readline(size=100, buffering=1024)
3934 self._test_read(buffering=1024)
3935 self._test_read(size=100, buffering=1024)
3936
3937 def _test_readline_no_buffer(self, size=-1):
3938 mock_sock = self.MockSocket(recv_funcs=[
3939 lambda : b"a",
3940 lambda : b"\n",
3941 lambda : b"B",
3942 self._raise_eintr,
3943 lambda : b"b",
3944 lambda : b"",
3945 ])
3946 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003947 self.assertEqual(fo.readline(size), b"a\n")
3948 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003949
3950 def test_no_buffer(self):
3951 self._test_readline_no_buffer()
3952 self._test_readline_no_buffer(size=4)
3953 self._test_read(buffering=0)
3954 self._test_read(size=100, buffering=0)
3955
3956
Guido van Rossume9f66142002-08-07 15:46:19 +00003957class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3958
3959 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003960
Guido van Rossume9f66142002-08-07 15:46:19 +00003961 In this case (and in this case only), it should be possible to
3962 create a file object, read a line from it, create another file
3963 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003964 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003965 when reading multiple requests from the same socket."""
3966
3967 bufsize = 0 # Use unbuffered mode
3968
3969 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003970 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003971 line = self.read_file.readline() # first line
3972 self.assertEqual(line, b"A. " + self.write_msg) # first line
3973 self.read_file = self.cli_conn.makefile('rb', 0)
3974 line = self.read_file.readline() # second line
3975 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003976
3977 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003978 self.write_file.write(b"A. " + self.write_msg)
3979 self.write_file.write(b"B. " + self.write_msg)
3980 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003981
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003982 def testMakefileClose(self):
3983 # The file returned by makefile should keep the socket open...
3984 self.cli_conn.close()
3985 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003986 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003987 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003988 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003989 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3990
3991 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003992 self.write_file.write(self.write_msg)
3993 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003994
3995 def testMakefileCloseSocketDestroy(self):
3996 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003997 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003998 refcount_after = sys.getrefcount(self.cli_conn)
3999 self.assertEqual(refcount_before - 1, refcount_after)
4000
4001 def _testMakefileCloseSocketDestroy(self):
4002 pass
4003
Antoine Pitrou98b46702010-09-18 22:59:00 +00004004 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004005 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004006 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4007
4008 def testSmallReadNonBlocking(self):
4009 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004010 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4011 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004012 self.evt1.set()
4013 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004014 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004015 if first_seg is None:
4016 # Data not arrived (can happen under Windows), wait a bit
4017 time.sleep(0.5)
4018 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004019 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004020 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004021 self.assertEqual(n, 3)
4022 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004023 self.assertEqual(msg, self.read_msg)
4024 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4025 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004026
4027 def _testSmallReadNonBlocking(self):
4028 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004029 self.write_file.write(self.write_msg)
4030 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004031 self.evt2.set()
4032 # Avoid cloding the socket before the server test has finished,
4033 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4034 self.serv_finished.wait(5.0)
4035
4036 def testWriteNonBlocking(self):
4037 self.cli_finished.wait(5.0)
4038 # The client thread can't skip directly - the SkipTest exception
4039 # would appear as a failure.
4040 if self.serv_skipped:
4041 self.skipTest(self.serv_skipped)
4042
4043 def _testWriteNonBlocking(self):
4044 self.serv_skipped = None
4045 self.serv_conn.setblocking(False)
4046 # Try to saturate the socket buffer pipe with repeated large writes.
4047 BIG = b"x" * (1024 ** 2)
4048 LIMIT = 10
4049 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004050 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004051 self.assertGreater(n, 0)
4052 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004053 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004054 if n is None:
4055 # Succeeded
4056 break
4057 self.assertGreater(n, 0)
4058 else:
4059 # Let us know that this test didn't manage to establish
4060 # the expected conditions. This is not a failure in itself but,
4061 # if it happens repeatedly, the test should be fixed.
4062 self.serv_skipped = "failed to saturate the socket buffer"
4063
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004064
Guido van Rossum8c943832002-08-08 01:00:28 +00004065class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4066
4067 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4068
4069
4070class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4071
4072 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004073
Thomas Woutersb2137042007-02-01 18:02:27 +00004074
Antoine Pitrou834bd812010-10-13 16:17:14 +00004075class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4076 """Tests for socket.makefile() in text mode (rather than binary)"""
4077
4078 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004079 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004080 write_mode = 'wb'
4081 write_msg = MSG
4082 newline = ''
4083
4084
4085class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4086 """Tests for socket.makefile() in text mode (rather than binary)"""
4087
4088 read_mode = 'rb'
4089 read_msg = MSG
4090 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004091 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004092 newline = ''
4093
4094
4095class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4096 """Tests for socket.makefile() in text mode (rather than binary)"""
4097
4098 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004099 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004100 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004101 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004102 newline = ''
4103
4104
Guido van Rossumd8faa362007-04-27 19:54:29 +00004105class NetworkConnectionTest(object):
4106 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004107
Guido van Rossumd8faa362007-04-27 19:54:29 +00004108 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004109 # We're inherited below by BasicTCPTest2, which also inherits
4110 # BasicTCPTest, which defines self.port referenced below.
4111 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004112 self.serv_conn = self.cli
4113
4114class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4115 """Tests that NetworkConnection does not break existing TCP functionality.
4116 """
4117
4118class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004119
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004120 class MockSocket(socket.socket):
4121 def connect(self, *args):
4122 raise socket.timeout('timed out')
4123
4124 @contextlib.contextmanager
4125 def mocked_socket_module(self):
4126 """Return a socket which times out on connect"""
4127 old_socket = socket.socket
4128 socket.socket = self.MockSocket
4129 try:
4130 yield
4131 finally:
4132 socket.socket = old_socket
4133
4134 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004135 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004136 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004137 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004138 with self.assertRaises(socket.error) as cm:
4139 cli.connect((HOST, port))
4140 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4141
4142 def test_create_connection(self):
4143 # Issue #9792: errors raised by create_connection() should have
4144 # a proper errno attribute.
4145 port = support.find_unused_port()
4146 with self.assertRaises(socket.error) as cm:
4147 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004148
4149 # Issue #16257: create_connection() calls getaddrinfo() against
4150 # 'localhost'. This may result in an IPV6 addr being returned
4151 # as well as an IPV4 one:
4152 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4153 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4154 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4155 #
4156 # create_connection() enumerates through all the addresses returned
4157 # and if it doesn't successfully bind to any of them, it propagates
4158 # the last exception it encountered.
4159 #
4160 # On Solaris, ENETUNREACH is returned in this circumstance instead
4161 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4162 # expected errnos.
4163 expected_errnos = [ errno.ECONNREFUSED, ]
4164 if hasattr(errno, 'ENETUNREACH'):
4165 expected_errnos.append(errno.ENETUNREACH)
4166
4167 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004168
4169 def test_create_connection_timeout(self):
4170 # Issue #9792: create_connection() should not recast timeout errors
4171 # as generic socket errors.
4172 with self.mocked_socket_module():
4173 with self.assertRaises(socket.timeout):
4174 socket.create_connection((HOST, 1234))
4175
Guido van Rossumd8faa362007-04-27 19:54:29 +00004176
Victor Stinner45df8202010-04-28 22:31:17 +00004177@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004178class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4179
4180 def __init__(self, methodName='runTest'):
4181 SocketTCPTest.__init__(self, methodName=methodName)
4182 ThreadableTest.__init__(self)
4183
4184 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004185 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004186
4187 def clientTearDown(self):
4188 self.cli.close()
4189 self.cli = None
4190 ThreadableTest.clientTearDown(self)
4191
4192 def _justAccept(self):
4193 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004194 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004195
4196 testFamily = _justAccept
4197 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004198 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004199 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004200 self.assertEqual(self.cli.family, 2)
4201
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004202 testSourceAddress = _justAccept
4203 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004204 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4205 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004206 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004207 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004208 # The port number being used is sufficient to show that the bind()
4209 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004210
Guido van Rossumd8faa362007-04-27 19:54:29 +00004211 testTimeoutDefault = _justAccept
4212 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004213 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004214 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004215 socket.setdefaulttimeout(42)
4216 try:
4217 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004218 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004219 finally:
4220 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004221 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004222
4223 testTimeoutNone = _justAccept
4224 def _testTimeoutNone(self):
4225 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004226 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004227 socket.setdefaulttimeout(30)
4228 try:
4229 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004230 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004231 finally:
4232 socket.setdefaulttimeout(None)
4233 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004234
4235 testTimeoutValueNamed = _justAccept
4236 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004237 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004238 self.assertEqual(self.cli.gettimeout(), 30)
4239
4240 testTimeoutValueNonamed = _justAccept
4241 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004242 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004243 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004244 self.assertEqual(self.cli.gettimeout(), 30)
4245
Victor Stinner45df8202010-04-28 22:31:17 +00004246@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004247class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4248
4249 def __init__(self, methodName='runTest'):
4250 SocketTCPTest.__init__(self, methodName=methodName)
4251 ThreadableTest.__init__(self)
4252
4253 def clientSetUp(self):
4254 pass
4255
4256 def clientTearDown(self):
4257 self.cli.close()
4258 self.cli = None
4259 ThreadableTest.clientTearDown(self)
4260
4261 def testInsideTimeout(self):
4262 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004263 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004264 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004265 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004266 testOutsideTimeout = testInsideTimeout
4267
4268 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004269 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004270 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004271 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004272
4273 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004274 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004275 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004276
4277
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004278class TCPTimeoutTest(SocketTCPTest):
4279
4280 def testTCPTimeout(self):
4281 def raise_timeout(*args, **kwargs):
4282 self.serv.settimeout(1.0)
4283 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004284 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004285 "Error generating a timeout exception (TCP)")
4286
4287 def testTimeoutZero(self):
4288 ok = False
4289 try:
4290 self.serv.settimeout(0.0)
4291 foo = self.serv.accept()
4292 except socket.timeout:
4293 self.fail("caught timeout instead of error (TCP)")
4294 except socket.error:
4295 ok = True
4296 except:
4297 self.fail("caught unexpected exception (TCP)")
4298 if not ok:
4299 self.fail("accept() returned success when we did not expect it")
4300
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004301 def testInterruptedTimeout(self):
4302 # XXX I don't know how to do this test on MSWindows or any other
4303 # plaform that doesn't support signal.alarm() or os.kill(), though
4304 # the bug should have existed on all platforms.
4305 if not hasattr(signal, "alarm"):
4306 return # can only test on *nix
4307 self.serv.settimeout(5.0) # must be longer than alarm
4308 class Alarm(Exception):
4309 pass
4310 def alarm_handler(signal, frame):
4311 raise Alarm
4312 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4313 try:
4314 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4315 try:
4316 foo = self.serv.accept()
4317 except socket.timeout:
4318 self.fail("caught timeout instead of Alarm")
4319 except Alarm:
4320 pass
4321 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004322 self.fail("caught other exception instead of Alarm:"
4323 " %s(%s):\n%s" %
4324 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004325 else:
4326 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004327 finally:
4328 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004329 except Alarm:
4330 self.fail("got Alarm in wrong place")
4331 finally:
4332 # no alarm can be pending. Safe to restore old handler.
4333 signal.signal(signal.SIGALRM, old_alarm)
4334
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004335class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004336
4337 def testUDPTimeout(self):
4338 def raise_timeout(*args, **kwargs):
4339 self.serv.settimeout(1.0)
4340 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004341 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004342 "Error generating a timeout exception (UDP)")
4343
4344 def testTimeoutZero(self):
4345 ok = False
4346 try:
4347 self.serv.settimeout(0.0)
4348 foo = self.serv.recv(1024)
4349 except socket.timeout:
4350 self.fail("caught timeout instead of error (UDP)")
4351 except socket.error:
4352 ok = True
4353 except:
4354 self.fail("caught unexpected exception (UDP)")
4355 if not ok:
4356 self.fail("recv() returned success when we did not expect it")
4357
4358class TestExceptions(unittest.TestCase):
4359
4360 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004361 self.assertTrue(issubclass(socket.error, Exception))
4362 self.assertTrue(issubclass(socket.herror, socket.error))
4363 self.assertTrue(issubclass(socket.gaierror, socket.error))
4364 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004365
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004366class TestLinuxAbstractNamespace(unittest.TestCase):
4367
4368 UNIX_PATH_MAX = 108
4369
4370 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004371 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004372 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4373 s1.bind(address)
4374 s1.listen(1)
4375 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4376 s2.connect(s1.getsockname())
4377 with s1.accept()[0] as s3:
4378 self.assertEqual(s1.getsockname(), address)
4379 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004380
4381 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004382 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004383 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4384 s.bind(address)
4385 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004386
4387 def testNameOverflow(self):
4388 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004389 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4390 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004391
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004392 def testStrName(self):
4393 # Check that an abstract name can be passed as a string.
4394 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4395 try:
4396 s.bind("\x00python\x00test\x00")
4397 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4398 finally:
4399 s.close()
4400
4401class TestUnixDomain(unittest.TestCase):
4402
4403 def setUp(self):
4404 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4405
4406 def tearDown(self):
4407 self.sock.close()
4408
4409 def encoded(self, path):
4410 # Return the given path encoded in the file system encoding,
4411 # or skip the test if this is not possible.
4412 try:
4413 return os.fsencode(path)
4414 except UnicodeEncodeError:
4415 self.skipTest(
4416 "Pathname {0!a} cannot be represented in file "
4417 "system encoding {1!r}".format(
4418 path, sys.getfilesystemencoding()))
4419
Antoine Pitrou16374872011-12-16 15:04:12 +01004420 def bind(self, sock, path):
4421 # Bind the socket
4422 try:
4423 sock.bind(path)
4424 except OSError as e:
4425 if str(e) == "AF_UNIX path too long":
4426 self.skipTest(
4427 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4428 .format(path))
4429 else:
4430 raise
4431
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004432 def testStrAddr(self):
4433 # Test binding to and retrieving a normal string pathname.
4434 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004435 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004436 self.addCleanup(support.unlink, path)
4437 self.assertEqual(self.sock.getsockname(), path)
4438
4439 def testBytesAddr(self):
4440 # Test binding to a bytes pathname.
4441 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004442 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004443 self.addCleanup(support.unlink, path)
4444 self.assertEqual(self.sock.getsockname(), path)
4445
4446 def testSurrogateescapeBind(self):
4447 # Test binding to a valid non-ASCII pathname, with the
4448 # non-ASCII bytes supplied using surrogateescape encoding.
4449 path = os.path.abspath(support.TESTFN_UNICODE)
4450 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004451 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004452 self.addCleanup(support.unlink, path)
4453 self.assertEqual(self.sock.getsockname(), path)
4454
4455 def testUnencodableAddr(self):
4456 # Test binding to a pathname that cannot be encoded in the
4457 # file system encoding.
4458 if support.TESTFN_UNENCODABLE is None:
4459 self.skipTest("No unencodable filename available")
4460 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004461 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004462 self.addCleanup(support.unlink, path)
4463 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004464
Victor Stinner45df8202010-04-28 22:31:17 +00004465@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004466class BufferIOTest(SocketConnectedTest):
4467 """
4468 Test the buffer versions of socket.recv() and socket.send().
4469 """
4470 def __init__(self, methodName='runTest'):
4471 SocketConnectedTest.__init__(self, methodName=methodName)
4472
Antoine Pitrou25480782010-03-17 22:50:28 +00004473 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004474 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004475 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004476 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004477 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004478 self.assertEqual(msg, MSG)
4479
Antoine Pitrou25480782010-03-17 22:50:28 +00004480 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004481 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004482 self.serv_conn.send(buf)
4483
Antoine Pitrou25480782010-03-17 22:50:28 +00004484 def testRecvIntoBytearray(self):
4485 buf = bytearray(1024)
4486 nbytes = self.cli_conn.recv_into(buf)
4487 self.assertEqual(nbytes, len(MSG))
4488 msg = buf[:len(MSG)]
4489 self.assertEqual(msg, MSG)
4490
4491 _testRecvIntoBytearray = _testRecvIntoArray
4492
4493 def testRecvIntoMemoryview(self):
4494 buf = bytearray(1024)
4495 nbytes = self.cli_conn.recv_into(memoryview(buf))
4496 self.assertEqual(nbytes, len(MSG))
4497 msg = buf[:len(MSG)]
4498 self.assertEqual(msg, MSG)
4499
4500 _testRecvIntoMemoryview = _testRecvIntoArray
4501
4502 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004503 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004504 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004505 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004506 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004507 self.assertEqual(msg, MSG)
4508
Antoine Pitrou25480782010-03-17 22:50:28 +00004509 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004510 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004511 self.serv_conn.send(buf)
4512
Antoine Pitrou25480782010-03-17 22:50:28 +00004513 def testRecvFromIntoBytearray(self):
4514 buf = bytearray(1024)
4515 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4516 self.assertEqual(nbytes, len(MSG))
4517 msg = buf[:len(MSG)]
4518 self.assertEqual(msg, MSG)
4519
4520 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4521
4522 def testRecvFromIntoMemoryview(self):
4523 buf = bytearray(1024)
4524 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4525 self.assertEqual(nbytes, len(MSG))
4526 msg = buf[:len(MSG)]
4527 self.assertEqual(msg, MSG)
4528
4529 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4530
Christian Heimes043d6f62008-01-07 17:19:16 +00004531
4532TIPC_STYPE = 2000
4533TIPC_LOWER = 200
4534TIPC_UPPER = 210
4535
4536def isTipcAvailable():
4537 """Check if the TIPC module is loaded
4538
4539 The TIPC module is not loaded automatically on Ubuntu and probably
4540 other Linux distros.
4541 """
4542 if not hasattr(socket, "AF_TIPC"):
4543 return False
4544 if not os.path.isfile("/proc/modules"):
4545 return False
4546 with open("/proc/modules") as f:
4547 for line in f:
4548 if line.startswith("tipc "):
4549 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004550 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004551 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4552 return False
4553
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004554class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004555 def testRDM(self):
4556 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4557 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004558 self.addCleanup(srv.close)
4559 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004560
4561 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4562 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4563 TIPC_LOWER, TIPC_UPPER)
4564 srv.bind(srvaddr)
4565
4566 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4567 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4568 cli.sendto(MSG, sendaddr)
4569
4570 msg, recvaddr = srv.recvfrom(1024)
4571
4572 self.assertEqual(cli.getsockname(), recvaddr)
4573 self.assertEqual(msg, MSG)
4574
4575
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004576class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004577 def __init__(self, methodName = 'runTest'):
4578 unittest.TestCase.__init__(self, methodName = methodName)
4579 ThreadableTest.__init__(self)
4580
4581 def setUp(self):
4582 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004583 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004584 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4585 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4586 TIPC_LOWER, TIPC_UPPER)
4587 self.srv.bind(srvaddr)
4588 self.srv.listen(5)
4589 self.serverExplicitReady()
4590 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004591 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004592
4593 def clientSetUp(self):
4594 # The is a hittable race between serverExplicitReady() and the
4595 # accept() call; sleep a little while to avoid it, otherwise
4596 # we could get an exception
4597 time.sleep(0.1)
4598 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004599 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004600 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4601 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4602 self.cli.connect(addr)
4603 self.cliaddr = self.cli.getsockname()
4604
4605 def testStream(self):
4606 msg = self.conn.recv(1024)
4607 self.assertEqual(msg, MSG)
4608 self.assertEqual(self.cliaddr, self.connaddr)
4609
4610 def _testStream(self):
4611 self.cli.send(MSG)
4612 self.cli.close()
4613
4614
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004615@unittest.skipUnless(thread, 'Threading required for this test.')
4616class ContextManagersTest(ThreadedTCPSocketTest):
4617
4618 def _testSocketClass(self):
4619 # base test
4620 with socket.socket() as sock:
4621 self.assertFalse(sock._closed)
4622 self.assertTrue(sock._closed)
4623 # close inside with block
4624 with socket.socket() as sock:
4625 sock.close()
4626 self.assertTrue(sock._closed)
4627 # exception inside with block
4628 with socket.socket() as sock:
4629 self.assertRaises(socket.error, sock.sendall, b'foo')
4630 self.assertTrue(sock._closed)
4631
4632 def testCreateConnectionBase(self):
4633 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004634 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004635 data = conn.recv(1024)
4636 conn.sendall(data)
4637
4638 def _testCreateConnectionBase(self):
4639 address = self.serv.getsockname()
4640 with socket.create_connection(address) as sock:
4641 self.assertFalse(sock._closed)
4642 sock.sendall(b'foo')
4643 self.assertEqual(sock.recv(1024), b'foo')
4644 self.assertTrue(sock._closed)
4645
4646 def testCreateConnectionClose(self):
4647 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004648 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004649 data = conn.recv(1024)
4650 conn.sendall(data)
4651
4652 def _testCreateConnectionClose(self):
4653 address = self.serv.getsockname()
4654 with socket.create_connection(address) as sock:
4655 sock.close()
4656 self.assertTrue(sock._closed)
4657 self.assertRaises(socket.error, sock.sendall, b'foo')
4658
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004659
Antoine Pitroub1c54962010-10-14 15:05:38 +00004660@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4661 "SOCK_CLOEXEC not defined")
4662@unittest.skipUnless(fcntl, "module fcntl not available")
4663class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004664 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004665 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004666 with socket.socket(socket.AF_INET,
4667 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4668 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4669 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004670
4671
4672@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4673 "SOCK_NONBLOCK not defined")
4674class NonblockConstantTest(unittest.TestCase):
4675 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4676 if nonblock:
4677 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4678 self.assertEqual(s.gettimeout(), timeout)
4679 else:
4680 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4681 self.assertEqual(s.gettimeout(), None)
4682
Charles-François Natali239bb962011-06-03 12:55:15 +02004683 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004684 def test_SOCK_NONBLOCK(self):
4685 # a lot of it seems silly and redundant, but I wanted to test that
4686 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004687 with socket.socket(socket.AF_INET,
4688 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4689 self.checkNonblock(s)
4690 s.setblocking(1)
4691 self.checkNonblock(s, False)
4692 s.setblocking(0)
4693 self.checkNonblock(s)
4694 s.settimeout(None)
4695 self.checkNonblock(s, False)
4696 s.settimeout(2.0)
4697 self.checkNonblock(s, timeout=2.0)
4698 s.setblocking(1)
4699 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004700 # defaulttimeout
4701 t = socket.getdefaulttimeout()
4702 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004703 with socket.socket() as s:
4704 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004705 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004706 with socket.socket() as s:
4707 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004708 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004709 with socket.socket() as s:
4710 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004711 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004712 with socket.socket() as s:
4713 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004714 socket.setdefaulttimeout(t)
4715
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004716
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004717@unittest.skipUnless(os.name == "nt", "Windows specific")
4718@unittest.skipUnless(multiprocessing, "need multiprocessing")
4719class TestSocketSharing(SocketTCPTest):
4720 # This must be classmethod and not staticmethod or multiprocessing
4721 # won't be able to bootstrap it.
4722 @classmethod
4723 def remoteProcessServer(cls, q):
4724 # Recreate socket from shared data
4725 sdata = q.get()
4726 message = q.get()
4727
4728 s = socket.fromshare(sdata)
4729 s2, c = s.accept()
4730
4731 # Send the message
4732 s2.sendall(message)
4733 s2.close()
4734 s.close()
4735
4736 def testShare(self):
4737 # Transfer the listening server socket to another process
4738 # and service it from there.
4739
4740 # Create process:
4741 q = multiprocessing.Queue()
4742 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4743 p.start()
4744
4745 # Get the shared socket data
4746 data = self.serv.share(p.pid)
4747
4748 # Pass the shared socket to the other process
4749 addr = self.serv.getsockname()
4750 self.serv.close()
4751 q.put(data)
4752
4753 # The data that the server will send us
4754 message = b"slapmahfro"
4755 q.put(message)
4756
4757 # Connect
4758 s = socket.create_connection(addr)
4759 # listen for the data
4760 m = []
4761 while True:
4762 data = s.recv(100)
4763 if not data:
4764 break
4765 m.append(data)
4766 s.close()
4767 received = b"".join(m)
4768 self.assertEqual(received, message)
4769 p.join()
4770
4771 def testShareLength(self):
4772 data = self.serv.share(os.getpid())
4773 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4774 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4775
4776 def compareSockets(self, org, other):
4777 # socket sharing is expected to work only for blocking socket
4778 # since the internal python timout value isn't transfered.
4779 self.assertEqual(org.gettimeout(), None)
4780 self.assertEqual(org.gettimeout(), other.gettimeout())
4781
4782 self.assertEqual(org.family, other.family)
4783 self.assertEqual(org.type, other.type)
4784 # If the user specified "0" for proto, then
4785 # internally windows will have picked the correct value.
4786 # Python introspection on the socket however will still return
4787 # 0. For the shared socket, the python value is recreated
4788 # from the actual value, so it may not compare correctly.
4789 if org.proto != 0:
4790 self.assertEqual(org.proto, other.proto)
4791
4792 def testShareLocal(self):
4793 data = self.serv.share(os.getpid())
4794 s = socket.fromshare(data)
4795 try:
4796 self.compareSockets(self.serv, s)
4797 finally:
4798 s.close()
4799
4800 def testTypes(self):
4801 families = [socket.AF_INET, socket.AF_INET6]
4802 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4803 for f in families:
4804 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00004805 try:
4806 source = socket.socket(f, t)
4807 except OSError:
4808 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004809 try:
4810 data = source.share(os.getpid())
4811 shared = socket.fromshare(data)
4812 try:
4813 self.compareSockets(source, shared)
4814 finally:
4815 shared.close()
4816 finally:
4817 source.close()
4818
4819
Guido van Rossumb995eb72002-07-31 16:08:40 +00004820def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004821 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004822 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004823
4824 tests.extend([
4825 NonBlockingTCPTests,
4826 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004827 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004828 UnbufferedFileObjectClassTestCase,
4829 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004830 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004831 UnicodeReadFileObjectClassTestCase,
4832 UnicodeWriteFileObjectClassTestCase,
4833 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004834 NetworkConnectionNoServer,
4835 NetworkConnectionAttributesTest,
4836 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004837 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004838 CloexecConstantTest,
4839 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004840 ])
Dave Cole331708b2004-08-09 04:51:41 +00004841 if hasattr(socket, "socketpair"):
4842 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004843 if hasattr(socket, "AF_UNIX"):
4844 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004845 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004846 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004847 if isTipcAvailable():
4848 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004849 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004850 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004851 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004852 tests.extend([
4853 CmsgMacroTests,
4854 SendmsgUDPTest,
4855 RecvmsgUDPTest,
4856 RecvmsgIntoUDPTest,
4857 SendmsgUDP6Test,
4858 RecvmsgUDP6Test,
4859 RecvmsgRFC3542AncillaryUDP6Test,
4860 RecvmsgIntoRFC3542AncillaryUDP6Test,
4861 RecvmsgIntoUDP6Test,
4862 SendmsgTCPTest,
4863 RecvmsgTCPTest,
4864 RecvmsgIntoTCPTest,
4865 SendmsgSCTPStreamTest,
4866 RecvmsgSCTPStreamTest,
4867 RecvmsgIntoSCTPStreamTest,
4868 SendmsgUnixStreamTest,
4869 RecvmsgUnixStreamTest,
4870 RecvmsgIntoUnixStreamTest,
4871 RecvmsgSCMRightsStreamTest,
4872 RecvmsgIntoSCMRightsStreamTest,
4873 # These are slow when setitimer() is not available
4874 InterruptedRecvTimeoutTest,
4875 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004876 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004877 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004878
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004879 thread_info = support.threading_setup()
4880 support.run_unittest(*tests)
4881 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004882
4883if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004884 test_main()