blob: 0048e3d074a73234c7f89f3ec0fc00ceab095822 [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):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003228
3229 def checkRecvmsgAddress(self, addr1, addr2):
3230 # Called to compare the received address with the address of
3231 # the peer, ignoring scope ID
3232 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003233
3234@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003235@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003236@requireSocket("AF_INET6", "SOCK_DGRAM")
3237@unittest.skipUnless(thread, 'Threading required for this test.')
3238class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3239 pass
3240
3241@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003242@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003243@requireSocket("AF_INET6", "SOCK_DGRAM")
3244@unittest.skipUnless(thread, 'Threading required for this test.')
3245class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3246 pass
3247
3248@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003249@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003250@requireSocket("AF_INET6", "SOCK_DGRAM")
3251@unittest.skipUnless(thread, 'Threading required for this test.')
3252class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3253 pass
3254
3255@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003256@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003257@requireAttrs(socket, "IPPROTO_IPV6")
3258@requireSocket("AF_INET6", "SOCK_DGRAM")
3259@unittest.skipUnless(thread, 'Threading required for this test.')
3260class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3261 SendrecvmsgUDP6TestBase):
3262 pass
3263
3264@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003265@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003266@requireAttrs(socket, "IPPROTO_IPV6")
3267@requireSocket("AF_INET6", "SOCK_DGRAM")
3268@unittest.skipUnless(thread, 'Threading required for this test.')
3269class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3270 RFC3542AncillaryTest,
3271 SendrecvmsgUDP6TestBase):
3272 pass
3273
3274
3275class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3276 ConnectedStreamTestMixin, TCPTestBase):
3277 pass
3278
3279@requireAttrs(socket.socket, "sendmsg")
3280@unittest.skipUnless(thread, 'Threading required for this test.')
3281class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3282 pass
3283
3284@requireAttrs(socket.socket, "recvmsg")
3285@unittest.skipUnless(thread, 'Threading required for this test.')
3286class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3287 SendrecvmsgTCPTestBase):
3288 pass
3289
3290@requireAttrs(socket.socket, "recvmsg_into")
3291@unittest.skipUnless(thread, 'Threading required for this test.')
3292class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3293 SendrecvmsgTCPTestBase):
3294 pass
3295
3296
3297class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3298 SendrecvmsgConnectedBase,
3299 ConnectedStreamTestMixin, SCTPStreamBase):
3300 pass
3301
3302@requireAttrs(socket.socket, "sendmsg")
3303@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3304@unittest.skipUnless(thread, 'Threading required for this test.')
3305class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3306 pass
3307
3308@requireAttrs(socket.socket, "recvmsg")
3309@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3310@unittest.skipUnless(thread, 'Threading required for this test.')
3311class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3312 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003313
3314 def testRecvmsgEOF(self):
3315 try:
3316 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3317 except OSError as e:
3318 if e.errno != errno.ENOTCONN:
3319 raise
3320 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003321
3322@requireAttrs(socket.socket, "recvmsg_into")
3323@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3324@unittest.skipUnless(thread, 'Threading required for this test.')
3325class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3326 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003327
3328 def testRecvmsgEOF(self):
3329 try:
3330 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3331 except OSError as e:
3332 if e.errno != errno.ENOTCONN:
3333 raise
3334 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003335
3336
3337class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3338 ConnectedStreamTestMixin, UnixStreamBase):
3339 pass
3340
3341@requireAttrs(socket.socket, "sendmsg")
3342@requireAttrs(socket, "AF_UNIX")
3343@unittest.skipUnless(thread, 'Threading required for this test.')
3344class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3345 pass
3346
3347@requireAttrs(socket.socket, "recvmsg")
3348@requireAttrs(socket, "AF_UNIX")
3349@unittest.skipUnless(thread, 'Threading required for this test.')
3350class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3351 SendrecvmsgUnixStreamTestBase):
3352 pass
3353
3354@requireAttrs(socket.socket, "recvmsg_into")
3355@requireAttrs(socket, "AF_UNIX")
3356@unittest.skipUnless(thread, 'Threading required for this test.')
3357class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3358 SendrecvmsgUnixStreamTestBase):
3359 pass
3360
3361@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3362@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3363@unittest.skipUnless(thread, 'Threading required for this test.')
3364class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3365 pass
3366
3367@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3368@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3369@unittest.skipUnless(thread, 'Threading required for this test.')
3370class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3371 SendrecvmsgUnixStreamTestBase):
3372 pass
3373
3374
3375# Test interrupting the interruptible send/receive methods with a
3376# signal when a timeout is set. These tests avoid having multiple
3377# threads alive during the test so that the OS cannot deliver the
3378# signal to the wrong one.
3379
3380class InterruptedTimeoutBase(unittest.TestCase):
3381 # Base class for interrupted send/receive tests. Installs an
3382 # empty handler for SIGALRM and removes it on teardown, along with
3383 # any scheduled alarms.
3384
3385 def setUp(self):
3386 super().setUp()
3387 orig_alrm_handler = signal.signal(signal.SIGALRM,
3388 lambda signum, frame: None)
3389 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3390 self.addCleanup(self.setAlarm, 0)
3391
3392 # Timeout for socket operations
3393 timeout = 4.0
3394
3395 # Provide setAlarm() method to schedule delivery of SIGALRM after
3396 # given number of seconds, or cancel it if zero, and an
3397 # appropriate time value to use. Use setitimer() if available.
3398 if hasattr(signal, "setitimer"):
3399 alarm_time = 0.05
3400
3401 def setAlarm(self, seconds):
3402 signal.setitimer(signal.ITIMER_REAL, seconds)
3403 else:
3404 # Old systems may deliver the alarm up to one second early
3405 alarm_time = 2
3406
3407 def setAlarm(self, seconds):
3408 signal.alarm(seconds)
3409
3410
3411# Require siginterrupt() in order to ensure that system calls are
3412# interrupted by default.
3413@requireAttrs(signal, "siginterrupt")
3414@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3415 "Don't have signal.alarm or signal.setitimer")
3416class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3417 # Test interrupting the recv*() methods with signals when a
3418 # timeout is set.
3419
3420 def setUp(self):
3421 super().setUp()
3422 self.serv.settimeout(self.timeout)
3423
3424 def checkInterruptedRecv(self, func, *args, **kwargs):
3425 # Check that func(*args, **kwargs) raises socket.error with an
3426 # errno of EINTR when interrupted by a signal.
3427 self.setAlarm(self.alarm_time)
3428 with self.assertRaises(socket.error) as cm:
3429 func(*args, **kwargs)
3430 self.assertNotIsInstance(cm.exception, socket.timeout)
3431 self.assertEqual(cm.exception.errno, errno.EINTR)
3432
3433 def testInterruptedRecvTimeout(self):
3434 self.checkInterruptedRecv(self.serv.recv, 1024)
3435
3436 def testInterruptedRecvIntoTimeout(self):
3437 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3438
3439 def testInterruptedRecvfromTimeout(self):
3440 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3441
3442 def testInterruptedRecvfromIntoTimeout(self):
3443 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3444
3445 @requireAttrs(socket.socket, "recvmsg")
3446 def testInterruptedRecvmsgTimeout(self):
3447 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3448
3449 @requireAttrs(socket.socket, "recvmsg_into")
3450 def testInterruptedRecvmsgIntoTimeout(self):
3451 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3452
3453
3454# Require siginterrupt() in order to ensure that system calls are
3455# interrupted by default.
3456@requireAttrs(signal, "siginterrupt")
3457@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3458 "Don't have signal.alarm or signal.setitimer")
3459@unittest.skipUnless(thread, 'Threading required for this test.')
3460class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3461 ThreadSafeCleanupTestCase,
3462 SocketListeningTestMixin, TCPTestBase):
3463 # Test interrupting the interruptible send*() methods with signals
3464 # when a timeout is set.
3465
3466 def setUp(self):
3467 super().setUp()
3468 self.serv_conn = self.newSocket()
3469 self.addCleanup(self.serv_conn.close)
3470 # Use a thread to complete the connection, but wait for it to
3471 # terminate before running the test, so that there is only one
3472 # thread to accept the signal.
3473 cli_thread = threading.Thread(target=self.doConnect)
3474 cli_thread.start()
3475 self.cli_conn, addr = self.serv.accept()
3476 self.addCleanup(self.cli_conn.close)
3477 cli_thread.join()
3478 self.serv_conn.settimeout(self.timeout)
3479
3480 def doConnect(self):
3481 self.serv_conn.connect(self.serv_addr)
3482
3483 def checkInterruptedSend(self, func, *args, **kwargs):
3484 # Check that func(*args, **kwargs), run in a loop, raises
3485 # socket.error with an errno of EINTR when interrupted by a
3486 # signal.
3487 with self.assertRaises(socket.error) as cm:
3488 while True:
3489 self.setAlarm(self.alarm_time)
3490 func(*args, **kwargs)
3491 self.assertNotIsInstance(cm.exception, socket.timeout)
3492 self.assertEqual(cm.exception.errno, errno.EINTR)
3493
Nick Coghlan2496f332011-09-19 20:26:31 +10003494 # Issue #12958: The following tests have problems on Mac OS X
3495 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003496 def testInterruptedSendTimeout(self):
3497 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3498
Nick Coghlan2496f332011-09-19 20:26:31 +10003499 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003500 def testInterruptedSendtoTimeout(self):
3501 # Passing an actual address here as Python's wrapper for
3502 # sendto() doesn't allow passing a zero-length one; POSIX
3503 # requires that the address is ignored since the socket is
3504 # connection-mode, however.
3505 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3506 self.serv_addr)
3507
Nick Coghlan2496f332011-09-19 20:26:31 +10003508 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003509 @requireAttrs(socket.socket, "sendmsg")
3510 def testInterruptedSendmsgTimeout(self):
3511 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3512
3513
Victor Stinner45df8202010-04-28 22:31:17 +00003514@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003515class TCPCloserTest(ThreadedTCPSocketTest):
3516
3517 def testClose(self):
3518 conn, addr = self.serv.accept()
3519 conn.close()
3520
3521 sd = self.cli
3522 read, write, err = select.select([sd], [], [], 1.0)
3523 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003524 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003525
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003526 # Calling close() many times should be safe.
3527 conn.close()
3528 conn.close()
3529
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003530 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003531 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003532 time.sleep(1.0)
3533
Victor Stinner45df8202010-04-28 22:31:17 +00003534@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003535class BasicSocketPairTest(SocketPairTest):
3536
3537 def __init__(self, methodName='runTest'):
3538 SocketPairTest.__init__(self, methodName=methodName)
3539
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003540 def _check_defaults(self, sock):
3541 self.assertIsInstance(sock, socket.socket)
3542 if hasattr(socket, 'AF_UNIX'):
3543 self.assertEqual(sock.family, socket.AF_UNIX)
3544 else:
3545 self.assertEqual(sock.family, socket.AF_INET)
3546 self.assertEqual(sock.type, socket.SOCK_STREAM)
3547 self.assertEqual(sock.proto, 0)
3548
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003549 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003550 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003551
3552 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003553 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003554
Dave Cole331708b2004-08-09 04:51:41 +00003555 def testRecv(self):
3556 msg = self.serv.recv(1024)
3557 self.assertEqual(msg, MSG)
3558
3559 def _testRecv(self):
3560 self.cli.send(MSG)
3561
3562 def testSend(self):
3563 self.serv.send(MSG)
3564
3565 def _testSend(self):
3566 msg = self.cli.recv(1024)
3567 self.assertEqual(msg, MSG)
3568
Victor Stinner45df8202010-04-28 22:31:17 +00003569@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003570class NonBlockingTCPTests(ThreadedTCPSocketTest):
3571
3572 def __init__(self, methodName='runTest'):
3573 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3574
3575 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003576 # Testing whether set blocking works
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02003577 self.serv.setblocking(True)
3578 self.assertIsNone(self.serv.gettimeout())
3579 self.serv.setblocking(False)
3580 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003581 start = time.time()
3582 try:
3583 self.serv.accept()
3584 except socket.error:
3585 pass
3586 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003587 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02003588 # Issue 15989
3589 if _testcapi.UINT_MAX < _testcapi.ULONG_MAX:
3590 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3591 self.assertIsNone(self.serv.gettimeout())
Guido van Rossum24e4af82002-06-12 19:18:08 +00003592
3593 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003594 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003595
Antoine Pitroub1c54962010-10-14 15:05:38 +00003596 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003597 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003598 def testInitNonBlocking(self):
3599 # reinit server socket
3600 self.serv.close()
3601 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003602 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003603 self.port = support.bind_port(self.serv)
3604 self.serv.listen(1)
3605 # actual testing
3606 start = time.time()
3607 try:
3608 self.serv.accept()
3609 except socket.error:
3610 pass
3611 end = time.time()
3612 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3613
3614 def _testInitNonBlocking(self):
3615 pass
3616
Antoine Pitrou600232b2011-01-05 21:03:42 +00003617 def testInheritFlags(self):
3618 # Issue #7995: when calling accept() on a listening socket with a
3619 # timeout, the resulting socket should not be non-blocking.
3620 self.serv.settimeout(10)
3621 try:
3622 conn, addr = self.serv.accept()
3623 message = conn.recv(len(MSG))
3624 finally:
3625 conn.close()
3626 self.serv.settimeout(None)
3627
3628 def _testInheritFlags(self):
3629 time.sleep(0.1)
3630 self.cli.connect((HOST, self.port))
3631 time.sleep(0.5)
3632 self.cli.send(MSG)
3633
Guido van Rossum24e4af82002-06-12 19:18:08 +00003634 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003635 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003636 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003637 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003638 conn, addr = self.serv.accept()
3639 except socket.error:
3640 pass
3641 else:
3642 self.fail("Error trying to do non-blocking accept.")
3643 read, write, err = select.select([self.serv], [], [])
3644 if self.serv in read:
3645 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003646 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003647 else:
3648 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003649
Guido van Rossum24e4af82002-06-12 19:18:08 +00003650 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003651 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003652 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003653
3654 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003655 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003656 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003657 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003658
3659 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003660 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003661 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003662
3663 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003664 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003665 conn, addr = self.serv.accept()
3666 conn.setblocking(0)
3667 try:
3668 msg = conn.recv(len(MSG))
3669 except socket.error:
3670 pass
3671 else:
3672 self.fail("Error trying to do non-blocking recv.")
3673 read, write, err = select.select([conn], [], [])
3674 if conn in read:
3675 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003676 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003677 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003678 else:
3679 self.fail("Error during select call to non-blocking socket.")
3680
3681 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003682 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003683 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003684 self.cli.send(MSG)
3685
Victor Stinner45df8202010-04-28 22:31:17 +00003686@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003687class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003688 """Unit tests for the object returned by socket.makefile()
3689
Antoine Pitrou834bd812010-10-13 16:17:14 +00003690 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003691 the client connection. You can read from this file to
3692 get output from the server.
3693
Antoine Pitrou834bd812010-10-13 16:17:14 +00003694 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003695 server connection. You can write to this file to send output
3696 to the client.
3697 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003698
Guido van Rossume9f66142002-08-07 15:46:19 +00003699 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003700 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003701 errors = 'strict'
3702 newline = None
3703
3704 read_mode = 'rb'
3705 read_msg = MSG
3706 write_mode = 'wb'
3707 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003708
Guido van Rossum24e4af82002-06-12 19:18:08 +00003709 def __init__(self, methodName='runTest'):
3710 SocketConnectedTest.__init__(self, methodName=methodName)
3711
3712 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003713 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3714 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003715 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003716 self.read_file = self.cli_conn.makefile(
3717 self.read_mode, self.bufsize,
3718 encoding = self.encoding,
3719 errors = self.errors,
3720 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003721
3722 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003723 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003724 self.read_file.close()
3725 self.assertTrue(self.read_file.closed)
3726 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003727 SocketConnectedTest.tearDown(self)
3728
3729 def clientSetUp(self):
3730 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003731 self.write_file = self.serv_conn.makefile(
3732 self.write_mode, self.bufsize,
3733 encoding = self.encoding,
3734 errors = self.errors,
3735 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003736
3737 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003738 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003739 self.write_file.close()
3740 self.assertTrue(self.write_file.closed)
3741 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003742 SocketConnectedTest.clientTearDown(self)
3743
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003744 def testReadAfterTimeout(self):
3745 # Issue #7322: A file object must disallow further reads
3746 # after a timeout has occurred.
3747 self.cli_conn.settimeout(1)
3748 self.read_file.read(3)
3749 # First read raises a timeout
3750 self.assertRaises(socket.timeout, self.read_file.read, 1)
3751 # Second read is disallowed
3752 with self.assertRaises(IOError) as ctx:
3753 self.read_file.read(1)
3754 self.assertIn("cannot read from timed out object", str(ctx.exception))
3755
3756 def _testReadAfterTimeout(self):
3757 self.write_file.write(self.write_msg[0:3])
3758 self.write_file.flush()
3759 self.serv_finished.wait()
3760
Guido van Rossum24e4af82002-06-12 19:18:08 +00003761 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003762 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003763 first_seg = self.read_file.read(len(self.read_msg)-3)
3764 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003765 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003766 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003767
3768 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003769 self.write_file.write(self.write_msg)
3770 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003771
Guido van Rossum8c943832002-08-08 01:00:28 +00003772 def testFullRead(self):
3773 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003774 msg = self.read_file.read()
3775 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003776
3777 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003778 self.write_file.write(self.write_msg)
3779 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003780
Guido van Rossum24e4af82002-06-12 19:18:08 +00003781 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003782 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003783 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003784 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003785 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003786 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003787 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003788 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003789 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003790
3791 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003792 self.write_file.write(self.write_msg)
3793 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003794
3795 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003796 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003797 line = self.read_file.readline()
3798 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003799
3800 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003801 self.write_file.write(self.write_msg)
3802 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003803
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003804 def testCloseAfterMakefile(self):
3805 # The file returned by makefile should keep the socket open.
3806 self.cli_conn.close()
3807 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003808 msg = self.read_file.read()
3809 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003810
3811 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003812 self.write_file.write(self.write_msg)
3813 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003814
3815 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003816 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003817 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003818 if isinstance(self.read_msg, str):
3819 msg = msg.decode()
3820 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003821
3822 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003823 self.write_file.write(self.write_msg)
3824 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003825
Tim Peters116d83c2004-03-28 02:20:45 +00003826 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003827 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003828
3829 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003830 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003831
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003832 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003833 self.assertEqual(self.read_file.mode, self.read_mode)
3834 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003835
3836 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003837 self.assertEqual(self.write_file.mode, self.write_mode)
3838 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003839
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003840 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003841 self.read_file.close()
3842 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003843 self.cli_conn.close()
3844 self.assertRaises(socket.error, self.cli_conn.getsockname)
3845
3846 def _testRealClose(self):
3847 pass
3848
3849
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003850class FileObjectInterruptedTestCase(unittest.TestCase):
3851 """Test that the file object correctly handles EINTR internally."""
3852
3853 class MockSocket(object):
3854 def __init__(self, recv_funcs=()):
3855 # A generator that returns callables that we'll call for each
3856 # call to recv().
3857 self._recv_step = iter(recv_funcs)
3858
3859 def recv_into(self, buffer):
3860 data = next(self._recv_step)()
3861 assert len(buffer) >= len(data)
3862 buffer[:len(data)] = data
3863 return len(data)
3864
3865 def _decref_socketios(self):
3866 pass
3867
3868 def _textiowrap_for_test(self, buffering=-1):
3869 raw = socket.SocketIO(self, "r")
3870 if buffering < 0:
3871 buffering = io.DEFAULT_BUFFER_SIZE
3872 if buffering == 0:
3873 return raw
3874 buffer = io.BufferedReader(raw, buffering)
3875 text = io.TextIOWrapper(buffer, None, None)
3876 text.mode = "rb"
3877 return text
3878
3879 @staticmethod
3880 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003881 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003882
3883 def _textiowrap_mock_socket(self, mock, buffering=-1):
3884 raw = socket.SocketIO(mock, "r")
3885 if buffering < 0:
3886 buffering = io.DEFAULT_BUFFER_SIZE
3887 if buffering == 0:
3888 return raw
3889 buffer = io.BufferedReader(raw, buffering)
3890 text = io.TextIOWrapper(buffer, None, None)
3891 text.mode = "rb"
3892 return text
3893
3894 def _test_readline(self, size=-1, buffering=-1):
3895 mock_sock = self.MockSocket(recv_funcs=[
3896 lambda : b"This is the first line\nAnd the sec",
3897 self._raise_eintr,
3898 lambda : b"ond line is here\n",
3899 lambda : b"",
3900 lambda : b"", # XXX(gps): io library does an extra EOF read
3901 ])
3902 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003903 self.assertEqual(fo.readline(size), "This is the first line\n")
3904 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003905
3906 def _test_read(self, size=-1, buffering=-1):
3907 mock_sock = self.MockSocket(recv_funcs=[
3908 lambda : b"This is the first line\nAnd the sec",
3909 self._raise_eintr,
3910 lambda : b"ond line is here\n",
3911 lambda : b"",
3912 lambda : b"", # XXX(gps): io library does an extra EOF read
3913 ])
3914 expecting = (b"This is the first line\n"
3915 b"And the second line is here\n")
3916 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3917 if buffering == 0:
3918 data = b''
3919 else:
3920 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003921 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003922 while len(data) != len(expecting):
3923 part = fo.read(size)
3924 if not part:
3925 break
3926 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003927 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003928
3929 def test_default(self):
3930 self._test_readline()
3931 self._test_readline(size=100)
3932 self._test_read()
3933 self._test_read(size=100)
3934
3935 def test_with_1k_buffer(self):
3936 self._test_readline(buffering=1024)
3937 self._test_readline(size=100, buffering=1024)
3938 self._test_read(buffering=1024)
3939 self._test_read(size=100, buffering=1024)
3940
3941 def _test_readline_no_buffer(self, size=-1):
3942 mock_sock = self.MockSocket(recv_funcs=[
3943 lambda : b"a",
3944 lambda : b"\n",
3945 lambda : b"B",
3946 self._raise_eintr,
3947 lambda : b"b",
3948 lambda : b"",
3949 ])
3950 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003951 self.assertEqual(fo.readline(size), b"a\n")
3952 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003953
3954 def test_no_buffer(self):
3955 self._test_readline_no_buffer()
3956 self._test_readline_no_buffer(size=4)
3957 self._test_read(buffering=0)
3958 self._test_read(size=100, buffering=0)
3959
3960
Guido van Rossume9f66142002-08-07 15:46:19 +00003961class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3962
3963 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003964
Guido van Rossume9f66142002-08-07 15:46:19 +00003965 In this case (and in this case only), it should be possible to
3966 create a file object, read a line from it, create another file
3967 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003968 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003969 when reading multiple requests from the same socket."""
3970
3971 bufsize = 0 # Use unbuffered mode
3972
3973 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003974 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003975 line = self.read_file.readline() # first line
3976 self.assertEqual(line, b"A. " + self.write_msg) # first line
3977 self.read_file = self.cli_conn.makefile('rb', 0)
3978 line = self.read_file.readline() # second line
3979 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003980
3981 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003982 self.write_file.write(b"A. " + self.write_msg)
3983 self.write_file.write(b"B. " + self.write_msg)
3984 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003985
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003986 def testMakefileClose(self):
3987 # The file returned by makefile should keep the socket open...
3988 self.cli_conn.close()
3989 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003990 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003991 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003992 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003993 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3994
3995 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003996 self.write_file.write(self.write_msg)
3997 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003998
3999 def testMakefileCloseSocketDestroy(self):
4000 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004001 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004002 refcount_after = sys.getrefcount(self.cli_conn)
4003 self.assertEqual(refcount_before - 1, refcount_after)
4004
4005 def _testMakefileCloseSocketDestroy(self):
4006 pass
4007
Antoine Pitrou98b46702010-09-18 22:59:00 +00004008 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004009 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004010 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4011
4012 def testSmallReadNonBlocking(self):
4013 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004014 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4015 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004016 self.evt1.set()
4017 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004018 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004019 if first_seg is None:
4020 # Data not arrived (can happen under Windows), wait a bit
4021 time.sleep(0.5)
4022 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004023 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004024 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004025 self.assertEqual(n, 3)
4026 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004027 self.assertEqual(msg, self.read_msg)
4028 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4029 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004030
4031 def _testSmallReadNonBlocking(self):
4032 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004033 self.write_file.write(self.write_msg)
4034 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004035 self.evt2.set()
4036 # Avoid cloding the socket before the server test has finished,
4037 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4038 self.serv_finished.wait(5.0)
4039
4040 def testWriteNonBlocking(self):
4041 self.cli_finished.wait(5.0)
4042 # The client thread can't skip directly - the SkipTest exception
4043 # would appear as a failure.
4044 if self.serv_skipped:
4045 self.skipTest(self.serv_skipped)
4046
4047 def _testWriteNonBlocking(self):
4048 self.serv_skipped = None
4049 self.serv_conn.setblocking(False)
4050 # Try to saturate the socket buffer pipe with repeated large writes.
4051 BIG = b"x" * (1024 ** 2)
4052 LIMIT = 10
4053 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004054 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004055 self.assertGreater(n, 0)
4056 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004057 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004058 if n is None:
4059 # Succeeded
4060 break
4061 self.assertGreater(n, 0)
4062 else:
4063 # Let us know that this test didn't manage to establish
4064 # the expected conditions. This is not a failure in itself but,
4065 # if it happens repeatedly, the test should be fixed.
4066 self.serv_skipped = "failed to saturate the socket buffer"
4067
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004068
Guido van Rossum8c943832002-08-08 01:00:28 +00004069class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4070
4071 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4072
4073
4074class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4075
4076 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004077
Thomas Woutersb2137042007-02-01 18:02:27 +00004078
Antoine Pitrou834bd812010-10-13 16:17:14 +00004079class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4080 """Tests for socket.makefile() in text mode (rather than binary)"""
4081
4082 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004083 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004084 write_mode = 'wb'
4085 write_msg = MSG
4086 newline = ''
4087
4088
4089class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4090 """Tests for socket.makefile() in text mode (rather than binary)"""
4091
4092 read_mode = 'rb'
4093 read_msg = MSG
4094 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004095 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004096 newline = ''
4097
4098
4099class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4100 """Tests for socket.makefile() in text mode (rather than binary)"""
4101
4102 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004103 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004104 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004105 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004106 newline = ''
4107
4108
Guido van Rossumd8faa362007-04-27 19:54:29 +00004109class NetworkConnectionTest(object):
4110 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004111
Guido van Rossumd8faa362007-04-27 19:54:29 +00004112 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004113 # We're inherited below by BasicTCPTest2, which also inherits
4114 # BasicTCPTest, which defines self.port referenced below.
4115 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004116 self.serv_conn = self.cli
4117
4118class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4119 """Tests that NetworkConnection does not break existing TCP functionality.
4120 """
4121
4122class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004123
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004124 class MockSocket(socket.socket):
4125 def connect(self, *args):
4126 raise socket.timeout('timed out')
4127
4128 @contextlib.contextmanager
4129 def mocked_socket_module(self):
4130 """Return a socket which times out on connect"""
4131 old_socket = socket.socket
4132 socket.socket = self.MockSocket
4133 try:
4134 yield
4135 finally:
4136 socket.socket = old_socket
4137
4138 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004139 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004140 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004141 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004142 with self.assertRaises(socket.error) as cm:
4143 cli.connect((HOST, port))
4144 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4145
4146 def test_create_connection(self):
4147 # Issue #9792: errors raised by create_connection() should have
4148 # a proper errno attribute.
4149 port = support.find_unused_port()
4150 with self.assertRaises(socket.error) as cm:
4151 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004152
4153 # Issue #16257: create_connection() calls getaddrinfo() against
4154 # 'localhost'. This may result in an IPV6 addr being returned
4155 # as well as an IPV4 one:
4156 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4157 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4158 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4159 #
4160 # create_connection() enumerates through all the addresses returned
4161 # and if it doesn't successfully bind to any of them, it propagates
4162 # the last exception it encountered.
4163 #
4164 # On Solaris, ENETUNREACH is returned in this circumstance instead
4165 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4166 # expected errnos.
4167 expected_errnos = [ errno.ECONNREFUSED, ]
4168 if hasattr(errno, 'ENETUNREACH'):
4169 expected_errnos.append(errno.ENETUNREACH)
4170
4171 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004172
4173 def test_create_connection_timeout(self):
4174 # Issue #9792: create_connection() should not recast timeout errors
4175 # as generic socket errors.
4176 with self.mocked_socket_module():
4177 with self.assertRaises(socket.timeout):
4178 socket.create_connection((HOST, 1234))
4179
Guido van Rossumd8faa362007-04-27 19:54:29 +00004180
Victor Stinner45df8202010-04-28 22:31:17 +00004181@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004182class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4183
4184 def __init__(self, methodName='runTest'):
4185 SocketTCPTest.__init__(self, methodName=methodName)
4186 ThreadableTest.__init__(self)
4187
4188 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004189 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004190
4191 def clientTearDown(self):
4192 self.cli.close()
4193 self.cli = None
4194 ThreadableTest.clientTearDown(self)
4195
4196 def _justAccept(self):
4197 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004198 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004199
4200 testFamily = _justAccept
4201 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004202 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004203 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004204 self.assertEqual(self.cli.family, 2)
4205
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004206 testSourceAddress = _justAccept
4207 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004208 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4209 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004210 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004211 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004212 # The port number being used is sufficient to show that the bind()
4213 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004214
Guido van Rossumd8faa362007-04-27 19:54:29 +00004215 testTimeoutDefault = _justAccept
4216 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004217 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004218 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004219 socket.setdefaulttimeout(42)
4220 try:
4221 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004222 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004223 finally:
4224 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004225 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004226
4227 testTimeoutNone = _justAccept
4228 def _testTimeoutNone(self):
4229 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004230 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004231 socket.setdefaulttimeout(30)
4232 try:
4233 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004234 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004235 finally:
4236 socket.setdefaulttimeout(None)
4237 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004238
4239 testTimeoutValueNamed = _justAccept
4240 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004241 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004242 self.assertEqual(self.cli.gettimeout(), 30)
4243
4244 testTimeoutValueNonamed = _justAccept
4245 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004246 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004247 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004248 self.assertEqual(self.cli.gettimeout(), 30)
4249
Victor Stinner45df8202010-04-28 22:31:17 +00004250@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004251class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4252
4253 def __init__(self, methodName='runTest'):
4254 SocketTCPTest.__init__(self, methodName=methodName)
4255 ThreadableTest.__init__(self)
4256
4257 def clientSetUp(self):
4258 pass
4259
4260 def clientTearDown(self):
4261 self.cli.close()
4262 self.cli = None
4263 ThreadableTest.clientTearDown(self)
4264
4265 def testInsideTimeout(self):
4266 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004267 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004268 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004269 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004270 testOutsideTimeout = testInsideTimeout
4271
4272 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004273 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004274 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004275 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004276
4277 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004278 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004279 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004280
4281
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004282class TCPTimeoutTest(SocketTCPTest):
4283
4284 def testTCPTimeout(self):
4285 def raise_timeout(*args, **kwargs):
4286 self.serv.settimeout(1.0)
4287 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004288 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004289 "Error generating a timeout exception (TCP)")
4290
4291 def testTimeoutZero(self):
4292 ok = False
4293 try:
4294 self.serv.settimeout(0.0)
4295 foo = self.serv.accept()
4296 except socket.timeout:
4297 self.fail("caught timeout instead of error (TCP)")
4298 except socket.error:
4299 ok = True
4300 except:
4301 self.fail("caught unexpected exception (TCP)")
4302 if not ok:
4303 self.fail("accept() returned success when we did not expect it")
4304
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004305 def testInterruptedTimeout(self):
4306 # XXX I don't know how to do this test on MSWindows or any other
4307 # plaform that doesn't support signal.alarm() or os.kill(), though
4308 # the bug should have existed on all platforms.
4309 if not hasattr(signal, "alarm"):
4310 return # can only test on *nix
4311 self.serv.settimeout(5.0) # must be longer than alarm
4312 class Alarm(Exception):
4313 pass
4314 def alarm_handler(signal, frame):
4315 raise Alarm
4316 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4317 try:
4318 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4319 try:
4320 foo = self.serv.accept()
4321 except socket.timeout:
4322 self.fail("caught timeout instead of Alarm")
4323 except Alarm:
4324 pass
4325 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004326 self.fail("caught other exception instead of Alarm:"
4327 " %s(%s):\n%s" %
4328 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004329 else:
4330 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004331 finally:
4332 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004333 except Alarm:
4334 self.fail("got Alarm in wrong place")
4335 finally:
4336 # no alarm can be pending. Safe to restore old handler.
4337 signal.signal(signal.SIGALRM, old_alarm)
4338
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004339class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004340
4341 def testUDPTimeout(self):
4342 def raise_timeout(*args, **kwargs):
4343 self.serv.settimeout(1.0)
4344 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004345 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004346 "Error generating a timeout exception (UDP)")
4347
4348 def testTimeoutZero(self):
4349 ok = False
4350 try:
4351 self.serv.settimeout(0.0)
4352 foo = self.serv.recv(1024)
4353 except socket.timeout:
4354 self.fail("caught timeout instead of error (UDP)")
4355 except socket.error:
4356 ok = True
4357 except:
4358 self.fail("caught unexpected exception (UDP)")
4359 if not ok:
4360 self.fail("recv() returned success when we did not expect it")
4361
4362class TestExceptions(unittest.TestCase):
4363
4364 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004365 self.assertTrue(issubclass(socket.error, Exception))
4366 self.assertTrue(issubclass(socket.herror, socket.error))
4367 self.assertTrue(issubclass(socket.gaierror, socket.error))
4368 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004369
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004370class TestLinuxAbstractNamespace(unittest.TestCase):
4371
4372 UNIX_PATH_MAX = 108
4373
4374 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004375 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004376 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4377 s1.bind(address)
4378 s1.listen(1)
4379 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4380 s2.connect(s1.getsockname())
4381 with s1.accept()[0] as s3:
4382 self.assertEqual(s1.getsockname(), address)
4383 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004384
4385 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004386 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004387 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4388 s.bind(address)
4389 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004390
4391 def testNameOverflow(self):
4392 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004393 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4394 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004395
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004396 def testStrName(self):
4397 # Check that an abstract name can be passed as a string.
4398 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4399 try:
4400 s.bind("\x00python\x00test\x00")
4401 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4402 finally:
4403 s.close()
4404
4405class TestUnixDomain(unittest.TestCase):
4406
4407 def setUp(self):
4408 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4409
4410 def tearDown(self):
4411 self.sock.close()
4412
4413 def encoded(self, path):
4414 # Return the given path encoded in the file system encoding,
4415 # or skip the test if this is not possible.
4416 try:
4417 return os.fsencode(path)
4418 except UnicodeEncodeError:
4419 self.skipTest(
4420 "Pathname {0!a} cannot be represented in file "
4421 "system encoding {1!r}".format(
4422 path, sys.getfilesystemencoding()))
4423
Antoine Pitrou16374872011-12-16 15:04:12 +01004424 def bind(self, sock, path):
4425 # Bind the socket
4426 try:
4427 sock.bind(path)
4428 except OSError as e:
4429 if str(e) == "AF_UNIX path too long":
4430 self.skipTest(
4431 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4432 .format(path))
4433 else:
4434 raise
4435
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004436 def testStrAddr(self):
4437 # Test binding to and retrieving a normal string pathname.
4438 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004439 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004440 self.addCleanup(support.unlink, path)
4441 self.assertEqual(self.sock.getsockname(), path)
4442
4443 def testBytesAddr(self):
4444 # Test binding to a bytes pathname.
4445 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004446 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004447 self.addCleanup(support.unlink, path)
4448 self.assertEqual(self.sock.getsockname(), path)
4449
4450 def testSurrogateescapeBind(self):
4451 # Test binding to a valid non-ASCII pathname, with the
4452 # non-ASCII bytes supplied using surrogateescape encoding.
4453 path = os.path.abspath(support.TESTFN_UNICODE)
4454 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004455 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004456 self.addCleanup(support.unlink, path)
4457 self.assertEqual(self.sock.getsockname(), path)
4458
4459 def testUnencodableAddr(self):
4460 # Test binding to a pathname that cannot be encoded in the
4461 # file system encoding.
4462 if support.TESTFN_UNENCODABLE is None:
4463 self.skipTest("No unencodable filename available")
4464 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004465 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004466 self.addCleanup(support.unlink, path)
4467 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004468
Victor Stinner45df8202010-04-28 22:31:17 +00004469@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004470class BufferIOTest(SocketConnectedTest):
4471 """
4472 Test the buffer versions of socket.recv() and socket.send().
4473 """
4474 def __init__(self, methodName='runTest'):
4475 SocketConnectedTest.__init__(self, methodName=methodName)
4476
Antoine Pitrou25480782010-03-17 22:50:28 +00004477 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004478 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004479 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004480 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004481 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004482 self.assertEqual(msg, MSG)
4483
Antoine Pitrou25480782010-03-17 22:50:28 +00004484 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004485 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004486 self.serv_conn.send(buf)
4487
Antoine Pitrou25480782010-03-17 22:50:28 +00004488 def testRecvIntoBytearray(self):
4489 buf = bytearray(1024)
4490 nbytes = self.cli_conn.recv_into(buf)
4491 self.assertEqual(nbytes, len(MSG))
4492 msg = buf[:len(MSG)]
4493 self.assertEqual(msg, MSG)
4494
4495 _testRecvIntoBytearray = _testRecvIntoArray
4496
4497 def testRecvIntoMemoryview(self):
4498 buf = bytearray(1024)
4499 nbytes = self.cli_conn.recv_into(memoryview(buf))
4500 self.assertEqual(nbytes, len(MSG))
4501 msg = buf[:len(MSG)]
4502 self.assertEqual(msg, MSG)
4503
4504 _testRecvIntoMemoryview = _testRecvIntoArray
4505
4506 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004507 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004508 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004509 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004510 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004511 self.assertEqual(msg, MSG)
4512
Antoine Pitrou25480782010-03-17 22:50:28 +00004513 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004514 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004515 self.serv_conn.send(buf)
4516
Antoine Pitrou25480782010-03-17 22:50:28 +00004517 def testRecvFromIntoBytearray(self):
4518 buf = bytearray(1024)
4519 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4520 self.assertEqual(nbytes, len(MSG))
4521 msg = buf[:len(MSG)]
4522 self.assertEqual(msg, MSG)
4523
4524 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4525
4526 def testRecvFromIntoMemoryview(self):
4527 buf = bytearray(1024)
4528 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4529 self.assertEqual(nbytes, len(MSG))
4530 msg = buf[:len(MSG)]
4531 self.assertEqual(msg, MSG)
4532
4533 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4534
Christian Heimes043d6f62008-01-07 17:19:16 +00004535
4536TIPC_STYPE = 2000
4537TIPC_LOWER = 200
4538TIPC_UPPER = 210
4539
4540def isTipcAvailable():
4541 """Check if the TIPC module is loaded
4542
4543 The TIPC module is not loaded automatically on Ubuntu and probably
4544 other Linux distros.
4545 """
4546 if not hasattr(socket, "AF_TIPC"):
4547 return False
4548 if not os.path.isfile("/proc/modules"):
4549 return False
4550 with open("/proc/modules") as f:
4551 for line in f:
4552 if line.startswith("tipc "):
4553 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004554 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004555 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4556 return False
4557
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004558class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004559 def testRDM(self):
4560 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4561 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004562 self.addCleanup(srv.close)
4563 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004564
4565 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4566 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4567 TIPC_LOWER, TIPC_UPPER)
4568 srv.bind(srvaddr)
4569
4570 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4571 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4572 cli.sendto(MSG, sendaddr)
4573
4574 msg, recvaddr = srv.recvfrom(1024)
4575
4576 self.assertEqual(cli.getsockname(), recvaddr)
4577 self.assertEqual(msg, MSG)
4578
4579
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004580class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004581 def __init__(self, methodName = 'runTest'):
4582 unittest.TestCase.__init__(self, methodName = methodName)
4583 ThreadableTest.__init__(self)
4584
4585 def setUp(self):
4586 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004587 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004588 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4589 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4590 TIPC_LOWER, TIPC_UPPER)
4591 self.srv.bind(srvaddr)
4592 self.srv.listen(5)
4593 self.serverExplicitReady()
4594 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004595 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004596
4597 def clientSetUp(self):
4598 # The is a hittable race between serverExplicitReady() and the
4599 # accept() call; sleep a little while to avoid it, otherwise
4600 # we could get an exception
4601 time.sleep(0.1)
4602 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004603 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004604 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4605 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4606 self.cli.connect(addr)
4607 self.cliaddr = self.cli.getsockname()
4608
4609 def testStream(self):
4610 msg = self.conn.recv(1024)
4611 self.assertEqual(msg, MSG)
4612 self.assertEqual(self.cliaddr, self.connaddr)
4613
4614 def _testStream(self):
4615 self.cli.send(MSG)
4616 self.cli.close()
4617
4618
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004619@unittest.skipUnless(thread, 'Threading required for this test.')
4620class ContextManagersTest(ThreadedTCPSocketTest):
4621
4622 def _testSocketClass(self):
4623 # base test
4624 with socket.socket() as sock:
4625 self.assertFalse(sock._closed)
4626 self.assertTrue(sock._closed)
4627 # close inside with block
4628 with socket.socket() as sock:
4629 sock.close()
4630 self.assertTrue(sock._closed)
4631 # exception inside with block
4632 with socket.socket() as sock:
4633 self.assertRaises(socket.error, sock.sendall, b'foo')
4634 self.assertTrue(sock._closed)
4635
4636 def testCreateConnectionBase(self):
4637 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004638 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004639 data = conn.recv(1024)
4640 conn.sendall(data)
4641
4642 def _testCreateConnectionBase(self):
4643 address = self.serv.getsockname()
4644 with socket.create_connection(address) as sock:
4645 self.assertFalse(sock._closed)
4646 sock.sendall(b'foo')
4647 self.assertEqual(sock.recv(1024), b'foo')
4648 self.assertTrue(sock._closed)
4649
4650 def testCreateConnectionClose(self):
4651 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004652 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004653 data = conn.recv(1024)
4654 conn.sendall(data)
4655
4656 def _testCreateConnectionClose(self):
4657 address = self.serv.getsockname()
4658 with socket.create_connection(address) as sock:
4659 sock.close()
4660 self.assertTrue(sock._closed)
4661 self.assertRaises(socket.error, sock.sendall, b'foo')
4662
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004663
Antoine Pitroub1c54962010-10-14 15:05:38 +00004664@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4665 "SOCK_CLOEXEC not defined")
4666@unittest.skipUnless(fcntl, "module fcntl not available")
4667class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004668 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004669 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004670 with socket.socket(socket.AF_INET,
4671 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4672 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4673 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004674
4675
4676@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4677 "SOCK_NONBLOCK not defined")
4678class NonblockConstantTest(unittest.TestCase):
4679 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4680 if nonblock:
4681 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4682 self.assertEqual(s.gettimeout(), timeout)
4683 else:
4684 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4685 self.assertEqual(s.gettimeout(), None)
4686
Charles-François Natali239bb962011-06-03 12:55:15 +02004687 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004688 def test_SOCK_NONBLOCK(self):
4689 # a lot of it seems silly and redundant, but I wanted to test that
4690 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004691 with socket.socket(socket.AF_INET,
4692 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4693 self.checkNonblock(s)
4694 s.setblocking(1)
4695 self.checkNonblock(s, False)
4696 s.setblocking(0)
4697 self.checkNonblock(s)
4698 s.settimeout(None)
4699 self.checkNonblock(s, False)
4700 s.settimeout(2.0)
4701 self.checkNonblock(s, timeout=2.0)
4702 s.setblocking(1)
4703 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004704 # defaulttimeout
4705 t = socket.getdefaulttimeout()
4706 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004707 with socket.socket() as s:
4708 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004709 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004710 with socket.socket() as s:
4711 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004712 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004713 with socket.socket() as s:
4714 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004715 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004716 with socket.socket() as s:
4717 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004718 socket.setdefaulttimeout(t)
4719
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004720
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004721@unittest.skipUnless(os.name == "nt", "Windows specific")
4722@unittest.skipUnless(multiprocessing, "need multiprocessing")
4723class TestSocketSharing(SocketTCPTest):
4724 # This must be classmethod and not staticmethod or multiprocessing
4725 # won't be able to bootstrap it.
4726 @classmethod
4727 def remoteProcessServer(cls, q):
4728 # Recreate socket from shared data
4729 sdata = q.get()
4730 message = q.get()
4731
4732 s = socket.fromshare(sdata)
4733 s2, c = s.accept()
4734
4735 # Send the message
4736 s2.sendall(message)
4737 s2.close()
4738 s.close()
4739
4740 def testShare(self):
4741 # Transfer the listening server socket to another process
4742 # and service it from there.
4743
4744 # Create process:
4745 q = multiprocessing.Queue()
4746 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4747 p.start()
4748
4749 # Get the shared socket data
4750 data = self.serv.share(p.pid)
4751
4752 # Pass the shared socket to the other process
4753 addr = self.serv.getsockname()
4754 self.serv.close()
4755 q.put(data)
4756
4757 # The data that the server will send us
4758 message = b"slapmahfro"
4759 q.put(message)
4760
4761 # Connect
4762 s = socket.create_connection(addr)
4763 # listen for the data
4764 m = []
4765 while True:
4766 data = s.recv(100)
4767 if not data:
4768 break
4769 m.append(data)
4770 s.close()
4771 received = b"".join(m)
4772 self.assertEqual(received, message)
4773 p.join()
4774
4775 def testShareLength(self):
4776 data = self.serv.share(os.getpid())
4777 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4778 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4779
4780 def compareSockets(self, org, other):
4781 # socket sharing is expected to work only for blocking socket
4782 # since the internal python timout value isn't transfered.
4783 self.assertEqual(org.gettimeout(), None)
4784 self.assertEqual(org.gettimeout(), other.gettimeout())
4785
4786 self.assertEqual(org.family, other.family)
4787 self.assertEqual(org.type, other.type)
4788 # If the user specified "0" for proto, then
4789 # internally windows will have picked the correct value.
4790 # Python introspection on the socket however will still return
4791 # 0. For the shared socket, the python value is recreated
4792 # from the actual value, so it may not compare correctly.
4793 if org.proto != 0:
4794 self.assertEqual(org.proto, other.proto)
4795
4796 def testShareLocal(self):
4797 data = self.serv.share(os.getpid())
4798 s = socket.fromshare(data)
4799 try:
4800 self.compareSockets(self.serv, s)
4801 finally:
4802 s.close()
4803
4804 def testTypes(self):
4805 families = [socket.AF_INET, socket.AF_INET6]
4806 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4807 for f in families:
4808 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00004809 try:
4810 source = socket.socket(f, t)
4811 except OSError:
4812 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004813 try:
4814 data = source.share(os.getpid())
4815 shared = socket.fromshare(data)
4816 try:
4817 self.compareSockets(source, shared)
4818 finally:
4819 shared.close()
4820 finally:
4821 source.close()
4822
4823
Guido van Rossumb995eb72002-07-31 16:08:40 +00004824def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004825 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004826 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004827
4828 tests.extend([
4829 NonBlockingTCPTests,
4830 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004831 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004832 UnbufferedFileObjectClassTestCase,
4833 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004834 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004835 UnicodeReadFileObjectClassTestCase,
4836 UnicodeWriteFileObjectClassTestCase,
4837 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004838 NetworkConnectionNoServer,
4839 NetworkConnectionAttributesTest,
4840 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004841 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004842 CloexecConstantTest,
4843 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004844 ])
Dave Cole331708b2004-08-09 04:51:41 +00004845 if hasattr(socket, "socketpair"):
4846 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004847 if hasattr(socket, "AF_UNIX"):
4848 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004849 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004850 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004851 if isTipcAvailable():
4852 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004853 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004854 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004855 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004856 tests.extend([
4857 CmsgMacroTests,
4858 SendmsgUDPTest,
4859 RecvmsgUDPTest,
4860 RecvmsgIntoUDPTest,
4861 SendmsgUDP6Test,
4862 RecvmsgUDP6Test,
4863 RecvmsgRFC3542AncillaryUDP6Test,
4864 RecvmsgIntoRFC3542AncillaryUDP6Test,
4865 RecvmsgIntoUDP6Test,
4866 SendmsgTCPTest,
4867 RecvmsgTCPTest,
4868 RecvmsgIntoTCPTest,
4869 SendmsgSCTPStreamTest,
4870 RecvmsgSCTPStreamTest,
4871 RecvmsgIntoSCTPStreamTest,
4872 SendmsgUnixStreamTest,
4873 RecvmsgUnixStreamTest,
4874 RecvmsgIntoUnixStreamTest,
4875 RecvmsgSCMRightsStreamTest,
4876 RecvmsgIntoSCMRightsStreamTest,
4877 # These are slow when setitimer() is not available
4878 InterruptedRecvTimeoutTest,
4879 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004880 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004881 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004882
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004883 thread_info = support.threading_setup()
4884 support.run_unittest(*tests)
4885 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004886
4887if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004888 test_main()