blob: 9567090e996acb54a3bd70a9416d2b7306fb8e3e [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:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001219 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001220 signal.signal(signal.SIGALRM, old_alarm)
1221 c.close()
1222 s.close()
1223
1224 def test_sendall_interrupted(self):
1225 self.check_sendall_interrupted(False)
1226
1227 def test_sendall_interrupted_with_timeout(self):
1228 self.check_sendall_interrupted(True)
1229
Antoine Pitroue033e062010-10-29 10:38:18 +00001230 def test_dealloc_warn(self):
1231 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1232 r = repr(sock)
1233 with self.assertWarns(ResourceWarning) as cm:
1234 sock = None
1235 support.gc_collect()
1236 self.assertIn(r, str(cm.warning.args[0]))
1237 # An open socket file object gets dereferenced after the socket
1238 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1239 f = sock.makefile('rb')
1240 r = repr(sock)
1241 sock = None
1242 support.gc_collect()
1243 with self.assertWarns(ResourceWarning):
1244 f = None
1245 support.gc_collect()
1246
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001247 def test_name_closed_socketio(self):
1248 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1249 fp = sock.makefile("rb")
1250 fp.close()
1251 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1252
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001253 def test_unusable_closed_socketio(self):
1254 with socket.socket() as sock:
1255 fp = sock.makefile("rb", buffering=0)
1256 self.assertTrue(fp.readable())
1257 self.assertFalse(fp.writable())
1258 self.assertFalse(fp.seekable())
1259 fp.close()
1260 self.assertRaises(ValueError, fp.readable)
1261 self.assertRaises(ValueError, fp.writable)
1262 self.assertRaises(ValueError, fp.seekable)
1263
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001264 def test_pickle(self):
1265 sock = socket.socket()
1266 with sock:
1267 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1268 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1269
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001270 def test_listen_backlog(self):
1271 for backlog in 0, -1:
1272 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1273 srv.bind((HOST, 0))
1274 srv.listen(backlog)
1275 srv.close()
1276
1277 # Issue 15989
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001278 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1279 srv.bind((HOST, 0))
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001280 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001281 srv.close()
1282
Charles-François Natali42663332012-01-02 15:57:30 +01001283 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001284 def test_flowinfo(self):
1285 self.assertRaises(OverflowError, socket.getnameinfo,
1286 ('::1',0, 0xffffffff), 0)
1287 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1288 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
1289
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001290
Charles-François Natali47413c12011-10-06 19:47:44 +02001291@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1292class BasicCANTest(unittest.TestCase):
1293
1294 def testCrucialConstants(self):
1295 socket.AF_CAN
1296 socket.PF_CAN
1297 socket.CAN_RAW
1298
1299 def testCreateSocket(self):
1300 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1301 pass
1302
1303 def testBindAny(self):
1304 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1305 s.bind(('', ))
1306
1307 def testTooLongInterfaceName(self):
1308 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1309 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001310 self.assertRaisesRegex(socket.error, 'interface name too long',
1311 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001312
1313 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1314 'socket.CAN_RAW_LOOPBACK required for this test.')
1315 def testLoopback(self):
1316 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1317 for loopback in (0, 1):
1318 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1319 loopback)
1320 self.assertEqual(loopback,
1321 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1322
1323 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1324 'socket.CAN_RAW_FILTER required for this test.')
1325 def testFilter(self):
1326 can_id, can_mask = 0x200, 0x700
1327 can_filter = struct.pack("=II", can_id, can_mask)
1328 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1329 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1330 self.assertEqual(can_filter,
1331 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1332
1333
1334@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1335@unittest.skipUnless(thread, 'Threading required for this test.')
1336class CANTest(ThreadedCANSocketTest):
1337
1338 """The CAN frame structure is defined in <linux/can.h>:
1339
1340 struct can_frame {
1341 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1342 __u8 can_dlc; /* data length code: 0 .. 8 */
1343 __u8 data[8] __attribute__((aligned(8)));
1344 };
1345 """
1346 can_frame_fmt = "=IB3x8s"
1347
1348 def __init__(self, methodName='runTest'):
1349 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1350
1351 @classmethod
1352 def build_can_frame(cls, can_id, data):
1353 """Build a CAN frame."""
1354 can_dlc = len(data)
1355 data = data.ljust(8, b'\x00')
1356 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1357
1358 @classmethod
1359 def dissect_can_frame(cls, frame):
1360 """Dissect a CAN frame."""
1361 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1362 return (can_id, can_dlc, data[:can_dlc])
1363
1364 def testSendFrame(self):
1365 cf, addr = self.s.recvfrom(self.bufsize)
1366 self.assertEqual(self.cf, cf)
1367 self.assertEqual(addr[0], self.interface)
1368 self.assertEqual(addr[1], socket.AF_CAN)
1369
1370 def _testSendFrame(self):
1371 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1372 self.cli.send(self.cf)
1373
1374 def testSendMaxFrame(self):
1375 cf, addr = self.s.recvfrom(self.bufsize)
1376 self.assertEqual(self.cf, cf)
1377
1378 def _testSendMaxFrame(self):
1379 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1380 self.cli.send(self.cf)
1381
1382 def testSendMultiFrames(self):
1383 cf, addr = self.s.recvfrom(self.bufsize)
1384 self.assertEqual(self.cf1, cf)
1385
1386 cf, addr = self.s.recvfrom(self.bufsize)
1387 self.assertEqual(self.cf2, cf)
1388
1389 def _testSendMultiFrames(self):
1390 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1391 self.cli.send(self.cf1)
1392
1393 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1394 self.cli.send(self.cf2)
1395
1396
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001397@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1398class BasicRDSTest(unittest.TestCase):
1399
1400 def testCrucialConstants(self):
1401 socket.AF_RDS
1402 socket.PF_RDS
1403
1404 def testCreateSocket(self):
1405 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1406 pass
1407
1408 def testSocketBufferSize(self):
1409 bufsize = 16384
1410 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1411 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1412 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1413
1414
1415@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1416@unittest.skipUnless(thread, 'Threading required for this test.')
1417class RDSTest(ThreadedRDSSocketTest):
1418
1419 def __init__(self, methodName='runTest'):
1420 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1421
Charles-François Natali240c55f2011-11-10 20:33:36 +01001422 def setUp(self):
1423 super().setUp()
1424 self.evt = threading.Event()
1425
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001426 def testSendAndRecv(self):
1427 data, addr = self.serv.recvfrom(self.bufsize)
1428 self.assertEqual(self.data, data)
1429 self.assertEqual(self.cli_addr, addr)
1430
1431 def _testSendAndRecv(self):
1432 self.data = b'spam'
1433 self.cli.sendto(self.data, 0, (HOST, self.port))
1434
1435 def testPeek(self):
1436 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1437 self.assertEqual(self.data, data)
1438 data, addr = self.serv.recvfrom(self.bufsize)
1439 self.assertEqual(self.data, data)
1440
1441 def _testPeek(self):
1442 self.data = b'spam'
1443 self.cli.sendto(self.data, 0, (HOST, self.port))
1444
1445 @requireAttrs(socket.socket, 'recvmsg')
1446 def testSendAndRecvMsg(self):
1447 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1448 self.assertEqual(self.data, data)
1449
1450 @requireAttrs(socket.socket, 'sendmsg')
1451 def _testSendAndRecvMsg(self):
1452 self.data = b'hello ' * 10
1453 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1454
1455 def testSendAndRecvMulti(self):
1456 data, addr = self.serv.recvfrom(self.bufsize)
1457 self.assertEqual(self.data1, data)
1458
1459 data, addr = self.serv.recvfrom(self.bufsize)
1460 self.assertEqual(self.data2, data)
1461
1462 def _testSendAndRecvMulti(self):
1463 self.data1 = b'bacon'
1464 self.cli.sendto(self.data1, 0, (HOST, self.port))
1465
1466 self.data2 = b'egg'
1467 self.cli.sendto(self.data2, 0, (HOST, self.port))
1468
1469 def testSelect(self):
1470 r, w, x = select.select([self.serv], [], [], 3.0)
1471 self.assertIn(self.serv, r)
1472 data, addr = self.serv.recvfrom(self.bufsize)
1473 self.assertEqual(self.data, data)
1474
1475 def _testSelect(self):
1476 self.data = b'select'
1477 self.cli.sendto(self.data, 0, (HOST, self.port))
1478
1479 def testCongestion(self):
1480 # wait until the sender is done
1481 self.evt.wait()
1482
1483 def _testCongestion(self):
1484 # test the behavior in case of congestion
1485 self.data = b'fill'
1486 self.cli.setblocking(False)
1487 try:
1488 # try to lower the receiver's socket buffer size
1489 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1490 except OSError:
1491 pass
1492 with self.assertRaises(OSError) as cm:
1493 try:
1494 # fill the receiver's socket buffer
1495 while True:
1496 self.cli.sendto(self.data, 0, (HOST, self.port))
1497 finally:
1498 # signal the receiver we're done
1499 self.evt.set()
1500 # sendto() should have failed with ENOBUFS
1501 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1502 # and we should have received a congestion notification through poll
1503 r, w, x = select.select([self.serv], [], [], 3.0)
1504 self.assertIn(self.serv, r)
1505
1506
Victor Stinner45df8202010-04-28 22:31:17 +00001507@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001508class BasicTCPTest(SocketConnectedTest):
1509
1510 def __init__(self, methodName='runTest'):
1511 SocketConnectedTest.__init__(self, methodName=methodName)
1512
1513 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001514 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001515 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001516 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001517
1518 def _testRecv(self):
1519 self.serv_conn.send(MSG)
1520
1521 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001522 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001523 seg1 = self.cli_conn.recv(len(MSG) - 3)
1524 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001525 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001526 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001527
1528 def _testOverFlowRecv(self):
1529 self.serv_conn.send(MSG)
1530
1531 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001532 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001533 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001534 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001535
1536 def _testRecvFrom(self):
1537 self.serv_conn.send(MSG)
1538
1539 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001540 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001541 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1542 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001543 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001544 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001545
1546 def _testOverFlowRecvFrom(self):
1547 self.serv_conn.send(MSG)
1548
1549 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001550 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001551 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001552 while 1:
1553 read = self.cli_conn.recv(1024)
1554 if not read:
1555 break
Guido van Rossume531e292002-08-08 20:28:34 +00001556 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001557 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001558
1559 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001560 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001561 self.serv_conn.sendall(big_chunk)
1562
1563 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001564 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001565 fd = self.cli_conn.fileno()
1566 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001567 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001568 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001569 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001570 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001571
1572 def _testFromFd(self):
1573 self.serv_conn.send(MSG)
1574
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001575 def testDup(self):
1576 # Testing dup()
1577 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001578 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001579 msg = sock.recv(1024)
1580 self.assertEqual(msg, MSG)
1581
1582 def _testDup(self):
1583 self.serv_conn.send(MSG)
1584
Guido van Rossum24e4af82002-06-12 19:18:08 +00001585 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001586 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001587 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001588 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001589 # wait for _testShutdown to finish: on OS X, when the server
1590 # closes the connection the client also becomes disconnected,
1591 # and the client's shutdown call will fail. (Issue #4397.)
1592 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001593
1594 def _testShutdown(self):
1595 self.serv_conn.send(MSG)
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001596 # Issue 15989
1597 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1598 _testcapi.INT_MAX + 1)
1599 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1600 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001601 self.serv_conn.shutdown(2)
1602
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001603 def testDetach(self):
1604 # Testing detach()
1605 fileno = self.cli_conn.fileno()
1606 f = self.cli_conn.detach()
1607 self.assertEqual(f, fileno)
1608 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001609 self.assertTrue(self.cli_conn._closed)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001610 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1611 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001612 # ...but we can create another socket using the (still open)
1613 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001614 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001615 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001616 msg = sock.recv(1024)
1617 self.assertEqual(msg, MSG)
1618
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001619 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001620 self.serv_conn.send(MSG)
1621
Victor Stinner45df8202010-04-28 22:31:17 +00001622@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001623class BasicUDPTest(ThreadedUDPSocketTest):
1624
1625 def __init__(self, methodName='runTest'):
1626 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1627
1628 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001629 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001630 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001631 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001632
1633 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001634 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001635
Guido van Rossum1c938012002-06-12 21:17:20 +00001636 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001637 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001638 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001639 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001640
Guido van Rossum1c938012002-06-12 21:17:20 +00001641 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001642 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001643
Guido van Rossumd8faa362007-04-27 19:54:29 +00001644 def testRecvFromNegative(self):
1645 # Negative lengths passed to recvfrom should give ValueError.
1646 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1647
1648 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001649 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001650
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001651# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1652# same test code is used with different families and types of socket
1653# (e.g. stream, datagram), and tests using recvmsg() are repeated
1654# using recvmsg_into().
1655#
1656# The generic test classes such as SendmsgTests and
1657# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1658# supplied with sockets cli_sock and serv_sock representing the
1659# client's and the server's end of the connection respectively, and
1660# attributes cli_addr and serv_addr holding their (numeric where
1661# appropriate) addresses.
1662#
1663# The final concrete test classes combine these with subclasses of
1664# SocketTestBase which set up client and server sockets of a specific
1665# type, and with subclasses of SendrecvmsgBase such as
1666# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1667# sockets to cli_sock and serv_sock and override the methods and
1668# attributes of SendrecvmsgBase to fill in destination addresses if
1669# needed when sending, check for specific flags in msg_flags, etc.
1670#
1671# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1672# recvmsg_into().
1673
1674# XXX: like the other datagram (UDP) tests in this module, the code
1675# here assumes that datagram delivery on the local machine will be
1676# reliable.
1677
1678class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1679 # Base class for sendmsg()/recvmsg() tests.
1680
1681 # Time in seconds to wait before considering a test failed, or
1682 # None for no timeout. Not all tests actually set a timeout.
1683 fail_timeout = 3.0
1684
1685 def setUp(self):
1686 self.misc_event = threading.Event()
1687 super().setUp()
1688
1689 def sendToServer(self, msg):
1690 # Send msg to the server.
1691 return self.cli_sock.send(msg)
1692
1693 # Tuple of alternative default arguments for sendmsg() when called
1694 # via sendmsgToServer() (e.g. to include a destination address).
1695 sendmsg_to_server_defaults = ()
1696
1697 def sendmsgToServer(self, *args):
1698 # Call sendmsg() on self.cli_sock with the given arguments,
1699 # filling in any arguments which are not supplied with the
1700 # corresponding items of self.sendmsg_to_server_defaults, if
1701 # any.
1702 return self.cli_sock.sendmsg(
1703 *(args + self.sendmsg_to_server_defaults[len(args):]))
1704
1705 def doRecvmsg(self, sock, bufsize, *args):
1706 # Call recvmsg() on sock with given arguments and return its
1707 # result. Should be used for tests which can use either
1708 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1709 # this method with one which emulates it using recvmsg_into(),
1710 # thus allowing the same test to be used for both methods.
1711 result = sock.recvmsg(bufsize, *args)
1712 self.registerRecvmsgResult(result)
1713 return result
1714
1715 def registerRecvmsgResult(self, result):
1716 # Called by doRecvmsg() with the return value of recvmsg() or
1717 # recvmsg_into(). Can be overridden to arrange cleanup based
1718 # on the returned ancillary data, for instance.
1719 pass
1720
1721 def checkRecvmsgAddress(self, addr1, addr2):
1722 # Called to compare the received address with the address of
1723 # the peer.
1724 self.assertEqual(addr1, addr2)
1725
1726 # Flags that are normally unset in msg_flags
1727 msg_flags_common_unset = 0
1728 for name in ("MSG_CTRUNC", "MSG_OOB"):
1729 msg_flags_common_unset |= getattr(socket, name, 0)
1730
1731 # Flags that are normally set
1732 msg_flags_common_set = 0
1733
1734 # Flags set when a complete record has been received (e.g. MSG_EOR
1735 # for SCTP)
1736 msg_flags_eor_indicator = 0
1737
1738 # Flags set when a complete record has not been received
1739 # (e.g. MSG_TRUNC for datagram sockets)
1740 msg_flags_non_eor_indicator = 0
1741
1742 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1743 # Method to check the value of msg_flags returned by recvmsg[_into]().
1744 #
1745 # Checks that all bits in msg_flags_common_set attribute are
1746 # set in "flags" and all bits in msg_flags_common_unset are
1747 # unset.
1748 #
1749 # The "eor" argument specifies whether the flags should
1750 # indicate that a full record (or datagram) has been received.
1751 # If "eor" is None, no checks are done; otherwise, checks
1752 # that:
1753 #
1754 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1755 # set and all bits in msg_flags_non_eor_indicator are unset
1756 #
1757 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1758 # are set and all bits in msg_flags_eor_indicator are unset
1759 #
1760 # If "checkset" and/or "checkunset" are supplied, they require
1761 # the given bits to be set or unset respectively, overriding
1762 # what the attributes require for those bits.
1763 #
1764 # If any bits are set in "ignore", they will not be checked,
1765 # regardless of the other inputs.
1766 #
1767 # Will raise Exception if the inputs require a bit to be both
1768 # set and unset, and it is not ignored.
1769
1770 defaultset = self.msg_flags_common_set
1771 defaultunset = self.msg_flags_common_unset
1772
1773 if eor:
1774 defaultset |= self.msg_flags_eor_indicator
1775 defaultunset |= self.msg_flags_non_eor_indicator
1776 elif eor is not None:
1777 defaultset |= self.msg_flags_non_eor_indicator
1778 defaultunset |= self.msg_flags_eor_indicator
1779
1780 # Function arguments override defaults
1781 defaultset &= ~checkunset
1782 defaultunset &= ~checkset
1783
1784 # Merge arguments with remaining defaults, and check for conflicts
1785 checkset |= defaultset
1786 checkunset |= defaultunset
1787 inboth = checkset & checkunset & ~ignore
1788 if inboth:
1789 raise Exception("contradictory set, unset requirements for flags "
1790 "{0:#x}".format(inboth))
1791
1792 # Compare with given msg_flags value
1793 mask = (checkset | checkunset) & ~ignore
1794 self.assertEqual(flags & mask, checkset & mask)
1795
1796
1797class RecvmsgIntoMixin(SendrecvmsgBase):
1798 # Mixin to implement doRecvmsg() using recvmsg_into().
1799
1800 def doRecvmsg(self, sock, bufsize, *args):
1801 buf = bytearray(bufsize)
1802 result = sock.recvmsg_into([buf], *args)
1803 self.registerRecvmsgResult(result)
1804 self.assertGreaterEqual(result[0], 0)
1805 self.assertLessEqual(result[0], bufsize)
1806 return (bytes(buf[:result[0]]),) + result[1:]
1807
1808
1809class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1810 # Defines flags to be checked in msg_flags for datagram sockets.
1811
1812 @property
1813 def msg_flags_non_eor_indicator(self):
1814 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1815
1816
1817class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1818 # Defines flags to be checked in msg_flags for SCTP sockets.
1819
1820 @property
1821 def msg_flags_eor_indicator(self):
1822 return super().msg_flags_eor_indicator | socket.MSG_EOR
1823
1824
1825class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1826 # Base class for tests on connectionless-mode sockets. Users must
1827 # supply sockets on attributes cli and serv to be mapped to
1828 # cli_sock and serv_sock respectively.
1829
1830 @property
1831 def serv_sock(self):
1832 return self.serv
1833
1834 @property
1835 def cli_sock(self):
1836 return self.cli
1837
1838 @property
1839 def sendmsg_to_server_defaults(self):
1840 return ([], [], 0, self.serv_addr)
1841
1842 def sendToServer(self, msg):
1843 return self.cli_sock.sendto(msg, self.serv_addr)
1844
1845
1846class SendrecvmsgConnectedBase(SendrecvmsgBase):
1847 # Base class for tests on connected sockets. Users must supply
1848 # sockets on attributes serv_conn and cli_conn (representing the
1849 # connections *to* the server and the client), to be mapped to
1850 # cli_sock and serv_sock respectively.
1851
1852 @property
1853 def serv_sock(self):
1854 return self.cli_conn
1855
1856 @property
1857 def cli_sock(self):
1858 return self.serv_conn
1859
1860 def checkRecvmsgAddress(self, addr1, addr2):
1861 # Address is currently "unspecified" for a connected socket,
1862 # so we don't examine it
1863 pass
1864
1865
1866class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1867 # Base class to set a timeout on server's socket.
1868
1869 def setUp(self):
1870 super().setUp()
1871 self.serv_sock.settimeout(self.fail_timeout)
1872
1873
1874class SendmsgTests(SendrecvmsgServerTimeoutBase):
1875 # Tests for sendmsg() which can use any socket type and do not
1876 # involve recvmsg() or recvmsg_into().
1877
1878 def testSendmsg(self):
1879 # Send a simple message with sendmsg().
1880 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1881
1882 def _testSendmsg(self):
1883 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1884
1885 def testSendmsgDataGenerator(self):
1886 # Send from buffer obtained from a generator (not a sequence).
1887 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1888
1889 def _testSendmsgDataGenerator(self):
1890 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1891 len(MSG))
1892
1893 def testSendmsgAncillaryGenerator(self):
1894 # Gather (empty) ancillary data from a generator.
1895 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1896
1897 def _testSendmsgAncillaryGenerator(self):
1898 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1899 len(MSG))
1900
1901 def testSendmsgArray(self):
1902 # Send data from an array instead of the usual bytes object.
1903 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1904
1905 def _testSendmsgArray(self):
1906 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1907 len(MSG))
1908
1909 def testSendmsgGather(self):
1910 # Send message data from more than one buffer (gather write).
1911 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1912
1913 def _testSendmsgGather(self):
1914 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1915
1916 def testSendmsgBadArgs(self):
1917 # Check that sendmsg() rejects invalid arguments.
1918 self.assertEqual(self.serv_sock.recv(1000), b"done")
1919
1920 def _testSendmsgBadArgs(self):
1921 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1922 self.assertRaises(TypeError, self.sendmsgToServer,
1923 b"not in an iterable")
1924 self.assertRaises(TypeError, self.sendmsgToServer,
1925 object())
1926 self.assertRaises(TypeError, self.sendmsgToServer,
1927 [object()])
1928 self.assertRaises(TypeError, self.sendmsgToServer,
1929 [MSG, object()])
1930 self.assertRaises(TypeError, self.sendmsgToServer,
1931 [MSG], object())
1932 self.assertRaises(TypeError, self.sendmsgToServer,
1933 [MSG], [], object())
1934 self.assertRaises(TypeError, self.sendmsgToServer,
1935 [MSG], [], 0, object())
1936 self.sendToServer(b"done")
1937
1938 def testSendmsgBadCmsg(self):
1939 # Check that invalid ancillary data items are rejected.
1940 self.assertEqual(self.serv_sock.recv(1000), b"done")
1941
1942 def _testSendmsgBadCmsg(self):
1943 self.assertRaises(TypeError, self.sendmsgToServer,
1944 [MSG], [object()])
1945 self.assertRaises(TypeError, self.sendmsgToServer,
1946 [MSG], [(object(), 0, b"data")])
1947 self.assertRaises(TypeError, self.sendmsgToServer,
1948 [MSG], [(0, object(), b"data")])
1949 self.assertRaises(TypeError, self.sendmsgToServer,
1950 [MSG], [(0, 0, object())])
1951 self.assertRaises(TypeError, self.sendmsgToServer,
1952 [MSG], [(0, 0)])
1953 self.assertRaises(TypeError, self.sendmsgToServer,
1954 [MSG], [(0, 0, b"data", 42)])
1955 self.sendToServer(b"done")
1956
1957 @requireAttrs(socket, "CMSG_SPACE")
1958 def testSendmsgBadMultiCmsg(self):
1959 # Check that invalid ancillary data items are rejected when
1960 # more than one item is present.
1961 self.assertEqual(self.serv_sock.recv(1000), b"done")
1962
1963 @testSendmsgBadMultiCmsg.client_skip
1964 def _testSendmsgBadMultiCmsg(self):
1965 self.assertRaises(TypeError, self.sendmsgToServer,
1966 [MSG], [0, 0, b""])
1967 self.assertRaises(TypeError, self.sendmsgToServer,
1968 [MSG], [(0, 0, b""), object()])
1969 self.sendToServer(b"done")
1970
1971 def testSendmsgExcessCmsgReject(self):
1972 # Check that sendmsg() rejects excess ancillary data items
1973 # when the number that can be sent is limited.
1974 self.assertEqual(self.serv_sock.recv(1000), b"done")
1975
1976 def _testSendmsgExcessCmsgReject(self):
1977 if not hasattr(socket, "CMSG_SPACE"):
1978 # Can only send one item
1979 with self.assertRaises(socket.error) as cm:
1980 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1981 self.assertIsNone(cm.exception.errno)
1982 self.sendToServer(b"done")
1983
1984 def testSendmsgAfterClose(self):
1985 # Check that sendmsg() fails on a closed socket.
1986 pass
1987
1988 def _testSendmsgAfterClose(self):
1989 self.cli_sock.close()
1990 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1991
1992
1993class SendmsgStreamTests(SendmsgTests):
1994 # Tests for sendmsg() which require a stream socket and do not
1995 # involve recvmsg() or recvmsg_into().
1996
1997 def testSendmsgExplicitNoneAddr(self):
1998 # Check that peer address can be specified as None.
1999 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2000
2001 def _testSendmsgExplicitNoneAddr(self):
2002 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2003
2004 def testSendmsgTimeout(self):
2005 # Check that timeout works with sendmsg().
2006 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2007 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2008
2009 def _testSendmsgTimeout(self):
2010 try:
2011 self.cli_sock.settimeout(0.03)
2012 with self.assertRaises(socket.timeout):
2013 while True:
2014 self.sendmsgToServer([b"a"*512])
2015 finally:
2016 self.misc_event.set()
2017
2018 # XXX: would be nice to have more tests for sendmsg flags argument.
2019
2020 # Linux supports MSG_DONTWAIT when sending, but in general, it
2021 # only works when receiving. Could add other platforms if they
2022 # support it too.
2023 @skipWithClientIf(sys.platform not in {"linux2"},
2024 "MSG_DONTWAIT not known to work on this platform when "
2025 "sending")
2026 def testSendmsgDontWait(self):
2027 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2028 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2029 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2030
2031 @testSendmsgDontWait.client_skip
2032 def _testSendmsgDontWait(self):
2033 try:
2034 with self.assertRaises(socket.error) as cm:
2035 while True:
2036 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2037 self.assertIn(cm.exception.errno,
2038 (errno.EAGAIN, errno.EWOULDBLOCK))
2039 finally:
2040 self.misc_event.set()
2041
2042
2043class SendmsgConnectionlessTests(SendmsgTests):
2044 # Tests for sendmsg() which require a connectionless-mode
2045 # (e.g. datagram) socket, and do not involve recvmsg() or
2046 # recvmsg_into().
2047
2048 def testSendmsgNoDestAddr(self):
2049 # Check that sendmsg() fails when no destination address is
2050 # given for unconnected socket.
2051 pass
2052
2053 def _testSendmsgNoDestAddr(self):
2054 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2055 [MSG])
2056 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2057 [MSG], [], 0, None)
2058
2059
2060class RecvmsgGenericTests(SendrecvmsgBase):
2061 # Tests for recvmsg() which can also be emulated using
2062 # recvmsg_into(), and can use any socket type.
2063
2064 def testRecvmsg(self):
2065 # Receive a simple message with recvmsg[_into]().
2066 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2067 self.assertEqual(msg, MSG)
2068 self.checkRecvmsgAddress(addr, self.cli_addr)
2069 self.assertEqual(ancdata, [])
2070 self.checkFlags(flags, eor=True)
2071
2072 def _testRecvmsg(self):
2073 self.sendToServer(MSG)
2074
2075 def testRecvmsgExplicitDefaults(self):
2076 # Test recvmsg[_into]() with default arguments provided explicitly.
2077 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2078 len(MSG), 0, 0)
2079 self.assertEqual(msg, MSG)
2080 self.checkRecvmsgAddress(addr, self.cli_addr)
2081 self.assertEqual(ancdata, [])
2082 self.checkFlags(flags, eor=True)
2083
2084 def _testRecvmsgExplicitDefaults(self):
2085 self.sendToServer(MSG)
2086
2087 def testRecvmsgShorter(self):
2088 # Receive a message smaller than buffer.
2089 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2090 len(MSG) + 42)
2091 self.assertEqual(msg, MSG)
2092 self.checkRecvmsgAddress(addr, self.cli_addr)
2093 self.assertEqual(ancdata, [])
2094 self.checkFlags(flags, eor=True)
2095
2096 def _testRecvmsgShorter(self):
2097 self.sendToServer(MSG)
2098
Charles-François Natali8619cd72011-10-03 19:43:15 +02002099 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2100 # datagram is received (issue #13001).
2101 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002102 def testRecvmsgTrunc(self):
2103 # Receive part of message, check for truncation indicators.
2104 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2105 len(MSG) - 3)
2106 self.assertEqual(msg, MSG[:-3])
2107 self.checkRecvmsgAddress(addr, self.cli_addr)
2108 self.assertEqual(ancdata, [])
2109 self.checkFlags(flags, eor=False)
2110
Charles-François Natali8619cd72011-10-03 19:43:15 +02002111 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002112 def _testRecvmsgTrunc(self):
2113 self.sendToServer(MSG)
2114
2115 def testRecvmsgShortAncillaryBuf(self):
2116 # Test ancillary data buffer too small to hold any ancillary data.
2117 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2118 len(MSG), 1)
2119 self.assertEqual(msg, MSG)
2120 self.checkRecvmsgAddress(addr, self.cli_addr)
2121 self.assertEqual(ancdata, [])
2122 self.checkFlags(flags, eor=True)
2123
2124 def _testRecvmsgShortAncillaryBuf(self):
2125 self.sendToServer(MSG)
2126
2127 def testRecvmsgLongAncillaryBuf(self):
2128 # Test large ancillary data buffer.
2129 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2130 len(MSG), 10240)
2131 self.assertEqual(msg, MSG)
2132 self.checkRecvmsgAddress(addr, self.cli_addr)
2133 self.assertEqual(ancdata, [])
2134 self.checkFlags(flags, eor=True)
2135
2136 def _testRecvmsgLongAncillaryBuf(self):
2137 self.sendToServer(MSG)
2138
2139 def testRecvmsgAfterClose(self):
2140 # Check that recvmsg[_into]() fails on a closed socket.
2141 self.serv_sock.close()
2142 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2143
2144 def _testRecvmsgAfterClose(self):
2145 pass
2146
2147 def testRecvmsgTimeout(self):
2148 # Check that timeout works.
2149 try:
2150 self.serv_sock.settimeout(0.03)
2151 self.assertRaises(socket.timeout,
2152 self.doRecvmsg, self.serv_sock, len(MSG))
2153 finally:
2154 self.misc_event.set()
2155
2156 def _testRecvmsgTimeout(self):
2157 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2158
2159 @requireAttrs(socket, "MSG_PEEK")
2160 def testRecvmsgPeek(self):
2161 # Check that MSG_PEEK in flags enables examination of pending
2162 # data without consuming it.
2163
2164 # Receive part of data with MSG_PEEK.
2165 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2166 len(MSG) - 3, 0,
2167 socket.MSG_PEEK)
2168 self.assertEqual(msg, MSG[:-3])
2169 self.checkRecvmsgAddress(addr, self.cli_addr)
2170 self.assertEqual(ancdata, [])
2171 # Ignoring MSG_TRUNC here (so this test is the same for stream
2172 # and datagram sockets). Some wording in POSIX seems to
2173 # suggest that it needn't be set when peeking, but that may
2174 # just be a slip.
2175 self.checkFlags(flags, eor=False,
2176 ignore=getattr(socket, "MSG_TRUNC", 0))
2177
2178 # Receive all data with MSG_PEEK.
2179 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2180 len(MSG), 0,
2181 socket.MSG_PEEK)
2182 self.assertEqual(msg, MSG)
2183 self.checkRecvmsgAddress(addr, self.cli_addr)
2184 self.assertEqual(ancdata, [])
2185 self.checkFlags(flags, eor=True)
2186
2187 # Check that the same data can still be received normally.
2188 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2189 self.assertEqual(msg, MSG)
2190 self.checkRecvmsgAddress(addr, self.cli_addr)
2191 self.assertEqual(ancdata, [])
2192 self.checkFlags(flags, eor=True)
2193
2194 @testRecvmsgPeek.client_skip
2195 def _testRecvmsgPeek(self):
2196 self.sendToServer(MSG)
2197
2198 @requireAttrs(socket.socket, "sendmsg")
2199 def testRecvmsgFromSendmsg(self):
2200 # Test receiving with recvmsg[_into]() when message is sent
2201 # using sendmsg().
2202 self.serv_sock.settimeout(self.fail_timeout)
2203 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2204 self.assertEqual(msg, MSG)
2205 self.checkRecvmsgAddress(addr, self.cli_addr)
2206 self.assertEqual(ancdata, [])
2207 self.checkFlags(flags, eor=True)
2208
2209 @testRecvmsgFromSendmsg.client_skip
2210 def _testRecvmsgFromSendmsg(self):
2211 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2212
2213
2214class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2215 # Tests which require a stream socket and can use either recvmsg()
2216 # or recvmsg_into().
2217
2218 def testRecvmsgEOF(self):
2219 # Receive end-of-stream indicator (b"", peer socket closed).
2220 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2221 self.assertEqual(msg, b"")
2222 self.checkRecvmsgAddress(addr, self.cli_addr)
2223 self.assertEqual(ancdata, [])
2224 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2225
2226 def _testRecvmsgEOF(self):
2227 self.cli_sock.close()
2228
2229 def testRecvmsgOverflow(self):
2230 # Receive a message in more than one chunk.
2231 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2232 len(MSG) - 3)
2233 self.checkRecvmsgAddress(addr, self.cli_addr)
2234 self.assertEqual(ancdata, [])
2235 self.checkFlags(flags, eor=False)
2236
2237 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2238 self.checkRecvmsgAddress(addr, self.cli_addr)
2239 self.assertEqual(ancdata, [])
2240 self.checkFlags(flags, eor=True)
2241
2242 msg = seg1 + seg2
2243 self.assertEqual(msg, MSG)
2244
2245 def _testRecvmsgOverflow(self):
2246 self.sendToServer(MSG)
2247
2248
2249class RecvmsgTests(RecvmsgGenericTests):
2250 # Tests for recvmsg() which can use any socket type.
2251
2252 def testRecvmsgBadArgs(self):
2253 # Check that recvmsg() rejects invalid arguments.
2254 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2255 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2256 -1, 0, 0)
2257 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2258 len(MSG), -1, 0)
2259 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2260 [bytearray(10)], 0, 0)
2261 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2262 object(), 0, 0)
2263 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2264 len(MSG), object(), 0)
2265 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2266 len(MSG), 0, object())
2267
2268 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2269 self.assertEqual(msg, MSG)
2270 self.checkRecvmsgAddress(addr, self.cli_addr)
2271 self.assertEqual(ancdata, [])
2272 self.checkFlags(flags, eor=True)
2273
2274 def _testRecvmsgBadArgs(self):
2275 self.sendToServer(MSG)
2276
2277
2278class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2279 # Tests for recvmsg_into() which can use any socket type.
2280
2281 def testRecvmsgIntoBadArgs(self):
2282 # Check that recvmsg_into() rejects invalid arguments.
2283 buf = bytearray(len(MSG))
2284 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2285 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2286 len(MSG), 0, 0)
2287 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2288 buf, 0, 0)
2289 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2290 [object()], 0, 0)
2291 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2292 [b"I'm not writable"], 0, 0)
2293 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2294 [buf, object()], 0, 0)
2295 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2296 [buf], -1, 0)
2297 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2298 [buf], object(), 0)
2299 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2300 [buf], 0, object())
2301
2302 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2303 self.assertEqual(nbytes, len(MSG))
2304 self.assertEqual(buf, bytearray(MSG))
2305 self.checkRecvmsgAddress(addr, self.cli_addr)
2306 self.assertEqual(ancdata, [])
2307 self.checkFlags(flags, eor=True)
2308
2309 def _testRecvmsgIntoBadArgs(self):
2310 self.sendToServer(MSG)
2311
2312 def testRecvmsgIntoGenerator(self):
2313 # Receive into buffer obtained from a generator (not a sequence).
2314 buf = bytearray(len(MSG))
2315 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2316 (o for o in [buf]))
2317 self.assertEqual(nbytes, len(MSG))
2318 self.assertEqual(buf, bytearray(MSG))
2319 self.checkRecvmsgAddress(addr, self.cli_addr)
2320 self.assertEqual(ancdata, [])
2321 self.checkFlags(flags, eor=True)
2322
2323 def _testRecvmsgIntoGenerator(self):
2324 self.sendToServer(MSG)
2325
2326 def testRecvmsgIntoArray(self):
2327 # Receive into an array rather than the usual bytearray.
2328 buf = array.array("B", [0] * len(MSG))
2329 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2330 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002331 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002332 self.checkRecvmsgAddress(addr, self.cli_addr)
2333 self.assertEqual(ancdata, [])
2334 self.checkFlags(flags, eor=True)
2335
2336 def _testRecvmsgIntoArray(self):
2337 self.sendToServer(MSG)
2338
2339 def testRecvmsgIntoScatter(self):
2340 # Receive into multiple buffers (scatter write).
2341 b1 = bytearray(b"----")
2342 b2 = bytearray(b"0123456789")
2343 b3 = bytearray(b"--------------")
2344 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2345 [b1, memoryview(b2)[2:9], b3])
2346 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2347 self.assertEqual(b1, bytearray(b"Mary"))
2348 self.assertEqual(b2, bytearray(b"01 had a 9"))
2349 self.assertEqual(b3, bytearray(b"little lamb---"))
2350 self.checkRecvmsgAddress(addr, self.cli_addr)
2351 self.assertEqual(ancdata, [])
2352 self.checkFlags(flags, eor=True)
2353
2354 def _testRecvmsgIntoScatter(self):
2355 self.sendToServer(b"Mary had a little lamb")
2356
2357
2358class CmsgMacroTests(unittest.TestCase):
2359 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2360 # assumptions used by sendmsg() and recvmsg[_into](), which share
2361 # code with these functions.
2362
2363 # Match the definition in socketmodule.c
2364 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2365
2366 @requireAttrs(socket, "CMSG_LEN")
2367 def testCMSG_LEN(self):
2368 # Test CMSG_LEN() with various valid and invalid values,
2369 # checking the assumptions used by recvmsg() and sendmsg().
2370 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2371 values = list(range(257)) + list(range(toobig - 257, toobig))
2372
2373 # struct cmsghdr has at least three members, two of which are ints
2374 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2375 for n in values:
2376 ret = socket.CMSG_LEN(n)
2377 # This is how recvmsg() calculates the data size
2378 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2379 self.assertLessEqual(ret, self.socklen_t_limit)
2380
2381 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2382 # sendmsg() shares code with these functions, and requires
2383 # that it reject values over the limit.
2384 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2385 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2386
2387 @requireAttrs(socket, "CMSG_SPACE")
2388 def testCMSG_SPACE(self):
2389 # Test CMSG_SPACE() with various valid and invalid values,
2390 # checking the assumptions used by sendmsg().
2391 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2392 values = list(range(257)) + list(range(toobig - 257, toobig))
2393
2394 last = socket.CMSG_SPACE(0)
2395 # struct cmsghdr has at least three members, two of which are ints
2396 self.assertGreater(last, array.array("i").itemsize * 2)
2397 for n in values:
2398 ret = socket.CMSG_SPACE(n)
2399 self.assertGreaterEqual(ret, last)
2400 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2401 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2402 self.assertLessEqual(ret, self.socklen_t_limit)
2403 last = ret
2404
2405 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2406 # sendmsg() shares code with these functions, and requires
2407 # that it reject values over the limit.
2408 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2409 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2410
2411
2412class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2413 # Tests for file descriptor passing on Unix-domain sockets.
2414
2415 # Invalid file descriptor value that's unlikely to evaluate to a
2416 # real FD even if one of its bytes is replaced with a different
2417 # value (which shouldn't actually happen).
2418 badfd = -0x5555
2419
2420 def newFDs(self, n):
2421 # Return a list of n file descriptors for newly-created files
2422 # containing their list indices as ASCII numbers.
2423 fds = []
2424 for i in range(n):
2425 fd, path = tempfile.mkstemp()
2426 self.addCleanup(os.unlink, path)
2427 self.addCleanup(os.close, fd)
2428 os.write(fd, str(i).encode())
2429 fds.append(fd)
2430 return fds
2431
2432 def checkFDs(self, fds):
2433 # Check that the file descriptors in the given list contain
2434 # their correct list indices as ASCII numbers.
2435 for n, fd in enumerate(fds):
2436 os.lseek(fd, 0, os.SEEK_SET)
2437 self.assertEqual(os.read(fd, 1024), str(n).encode())
2438
2439 def registerRecvmsgResult(self, result):
2440 self.addCleanup(self.closeRecvmsgFDs, result)
2441
2442 def closeRecvmsgFDs(self, recvmsg_result):
2443 # Close all file descriptors specified in the ancillary data
2444 # of the given return value from recvmsg() or recvmsg_into().
2445 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2446 if (cmsg_level == socket.SOL_SOCKET and
2447 cmsg_type == socket.SCM_RIGHTS):
2448 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002449 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002450 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2451 for fd in fds:
2452 os.close(fd)
2453
2454 def createAndSendFDs(self, n):
2455 # Send n new file descriptors created by newFDs() to the
2456 # server, with the constant MSG as the non-ancillary data.
2457 self.assertEqual(
2458 self.sendmsgToServer([MSG],
2459 [(socket.SOL_SOCKET,
2460 socket.SCM_RIGHTS,
2461 array.array("i", self.newFDs(n)))]),
2462 len(MSG))
2463
2464 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2465 # Check that constant MSG was received with numfds file
2466 # descriptors in a maximum of maxcmsgs control messages (which
2467 # must contain only complete integers). By default, check
2468 # that MSG_CTRUNC is unset, but ignore any flags in
2469 # ignoreflags.
2470 msg, ancdata, flags, addr = result
2471 self.assertEqual(msg, MSG)
2472 self.checkRecvmsgAddress(addr, self.cli_addr)
2473 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2474 ignore=ignoreflags)
2475
2476 self.assertIsInstance(ancdata, list)
2477 self.assertLessEqual(len(ancdata), maxcmsgs)
2478 fds = array.array("i")
2479 for item in ancdata:
2480 self.assertIsInstance(item, tuple)
2481 cmsg_level, cmsg_type, cmsg_data = item
2482 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2483 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2484 self.assertIsInstance(cmsg_data, bytes)
2485 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002486 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002487
2488 self.assertEqual(len(fds), numfds)
2489 self.checkFDs(fds)
2490
2491 def testFDPassSimple(self):
2492 # Pass a single FD (array read from bytes object).
2493 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2494 len(MSG), 10240))
2495
2496 def _testFDPassSimple(self):
2497 self.assertEqual(
2498 self.sendmsgToServer(
2499 [MSG],
2500 [(socket.SOL_SOCKET,
2501 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002502 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002503 len(MSG))
2504
2505 def testMultipleFDPass(self):
2506 # Pass multiple FDs in a single array.
2507 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2508 len(MSG), 10240))
2509
2510 def _testMultipleFDPass(self):
2511 self.createAndSendFDs(4)
2512
2513 @requireAttrs(socket, "CMSG_SPACE")
2514 def testFDPassCMSG_SPACE(self):
2515 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2516 self.checkRecvmsgFDs(
2517 4, self.doRecvmsg(self.serv_sock, len(MSG),
2518 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2519
2520 @testFDPassCMSG_SPACE.client_skip
2521 def _testFDPassCMSG_SPACE(self):
2522 self.createAndSendFDs(4)
2523
2524 def testFDPassCMSG_LEN(self):
2525 # Test using CMSG_LEN() to calculate ancillary buffer size.
2526 self.checkRecvmsgFDs(1,
2527 self.doRecvmsg(self.serv_sock, len(MSG),
2528 socket.CMSG_LEN(4 * SIZEOF_INT)),
2529 # RFC 3542 says implementations may set
2530 # MSG_CTRUNC if there isn't enough space
2531 # for trailing padding.
2532 ignoreflags=socket.MSG_CTRUNC)
2533
2534 def _testFDPassCMSG_LEN(self):
2535 self.createAndSendFDs(1)
2536
Charles-Francois Natalidd225e42013-05-20 19:08:19 +02002537 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
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
Charles-Francois Natalidd225e42013-05-20 19:08:19 +02002547 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
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
Charles-Francois Natalidd225e42013-05-20 19:08:19 +02002559 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002560 @requireAttrs(socket, "CMSG_SPACE")
2561 def testFDPassSeparateMinSpace(self):
2562 # Pass two FDs in two separate arrays, receiving them into the
2563 # minimum space for two arrays.
2564 self.checkRecvmsgFDs(2,
2565 self.doRecvmsg(self.serv_sock, len(MSG),
2566 socket.CMSG_SPACE(SIZEOF_INT) +
2567 socket.CMSG_LEN(SIZEOF_INT)),
2568 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2569
2570 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalidd225e42013-05-20 19:08:19 +02002571 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002572 def _testFDPassSeparateMinSpace(self):
2573 fd0, fd1 = self.newFDs(2)
2574 self.assertEqual(
2575 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2576 socket.SCM_RIGHTS,
2577 array.array("i", [fd0])),
2578 (socket.SOL_SOCKET,
2579 socket.SCM_RIGHTS,
2580 array.array("i", [fd1]))]),
2581 len(MSG))
2582
2583 def sendAncillaryIfPossible(self, msg, ancdata):
2584 # Try to send msg and ancdata to server, but if the system
2585 # call fails, just send msg with no ancillary data.
2586 try:
2587 nbytes = self.sendmsgToServer([msg], ancdata)
2588 except socket.error as e:
2589 # Check that it was the system call that failed
2590 self.assertIsInstance(e.errno, int)
2591 nbytes = self.sendmsgToServer([msg])
2592 self.assertEqual(nbytes, len(msg))
2593
2594 def testFDPassEmpty(self):
2595 # Try to pass an empty FD array. Can receive either no array
2596 # or an empty array.
2597 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2598 len(MSG), 10240),
2599 ignoreflags=socket.MSG_CTRUNC)
2600
2601 def _testFDPassEmpty(self):
2602 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2603 socket.SCM_RIGHTS,
2604 b"")])
2605
2606 def testFDPassPartialInt(self):
2607 # Try to pass a truncated FD array.
2608 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2609 len(MSG), 10240)
2610 self.assertEqual(msg, MSG)
2611 self.checkRecvmsgAddress(addr, self.cli_addr)
2612 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2613 self.assertLessEqual(len(ancdata), 1)
2614 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2615 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2616 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2617 self.assertLess(len(cmsg_data), SIZEOF_INT)
2618
2619 def _testFDPassPartialInt(self):
2620 self.sendAncillaryIfPossible(
2621 MSG,
2622 [(socket.SOL_SOCKET,
2623 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002624 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002625
2626 @requireAttrs(socket, "CMSG_SPACE")
2627 def testFDPassPartialIntInMiddle(self):
2628 # Try to pass two FD arrays, the first of which is truncated.
2629 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2630 len(MSG), 10240)
2631 self.assertEqual(msg, MSG)
2632 self.checkRecvmsgAddress(addr, self.cli_addr)
2633 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2634 self.assertLessEqual(len(ancdata), 2)
2635 fds = array.array("i")
2636 # Arrays may have been combined in a single control message
2637 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2638 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2639 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002640 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002641 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2642 self.assertLessEqual(len(fds), 2)
2643 self.checkFDs(fds)
2644
2645 @testFDPassPartialIntInMiddle.client_skip
2646 def _testFDPassPartialIntInMiddle(self):
2647 fd0, fd1 = self.newFDs(2)
2648 self.sendAncillaryIfPossible(
2649 MSG,
2650 [(socket.SOL_SOCKET,
2651 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002652 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002653 (socket.SOL_SOCKET,
2654 socket.SCM_RIGHTS,
2655 array.array("i", [fd1]))])
2656
2657 def checkTruncatedHeader(self, result, ignoreflags=0):
2658 # Check that no ancillary data items are returned when data is
2659 # truncated inside the cmsghdr structure.
2660 msg, ancdata, flags, addr = result
2661 self.assertEqual(msg, MSG)
2662 self.checkRecvmsgAddress(addr, self.cli_addr)
2663 self.assertEqual(ancdata, [])
2664 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2665 ignore=ignoreflags)
2666
2667 def testCmsgTruncNoBufSize(self):
2668 # Check that no ancillary data is received when no buffer size
2669 # is specified.
2670 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2671 # BSD seems to set MSG_CTRUNC only
2672 # if an item has been partially
2673 # received.
2674 ignoreflags=socket.MSG_CTRUNC)
2675
2676 def _testCmsgTruncNoBufSize(self):
2677 self.createAndSendFDs(1)
2678
2679 def testCmsgTrunc0(self):
2680 # Check that no ancillary data is received when buffer size is 0.
2681 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2682 ignoreflags=socket.MSG_CTRUNC)
2683
2684 def _testCmsgTrunc0(self):
2685 self.createAndSendFDs(1)
2686
2687 # Check that no ancillary data is returned for various non-zero
2688 # (but still too small) buffer sizes.
2689
2690 def testCmsgTrunc1(self):
2691 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2692
2693 def _testCmsgTrunc1(self):
2694 self.createAndSendFDs(1)
2695
2696 def testCmsgTrunc2Int(self):
2697 # The cmsghdr structure has at least three members, two of
2698 # which are ints, so we still shouldn't see any ancillary
2699 # data.
2700 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2701 SIZEOF_INT * 2))
2702
2703 def _testCmsgTrunc2Int(self):
2704 self.createAndSendFDs(1)
2705
2706 def testCmsgTruncLen0Minus1(self):
2707 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2708 socket.CMSG_LEN(0) - 1))
2709
2710 def _testCmsgTruncLen0Minus1(self):
2711 self.createAndSendFDs(1)
2712
2713 # The following tests try to truncate the control message in the
2714 # middle of the FD array.
2715
2716 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2717 # Check that file descriptor data is truncated to between
2718 # mindata and maxdata bytes when received with buffer size
2719 # ancbuf, and that any complete file descriptor numbers are
2720 # valid.
2721 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2722 len(MSG), ancbuf)
2723 self.assertEqual(msg, MSG)
2724 self.checkRecvmsgAddress(addr, self.cli_addr)
2725 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2726
2727 if mindata == 0 and ancdata == []:
2728 return
2729 self.assertEqual(len(ancdata), 1)
2730 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2731 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2732 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2733 self.assertGreaterEqual(len(cmsg_data), mindata)
2734 self.assertLessEqual(len(cmsg_data), maxdata)
2735 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002736 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002737 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2738 self.checkFDs(fds)
2739
2740 def testCmsgTruncLen0(self):
2741 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2742
2743 def _testCmsgTruncLen0(self):
2744 self.createAndSendFDs(1)
2745
2746 def testCmsgTruncLen0Plus1(self):
2747 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2748
2749 def _testCmsgTruncLen0Plus1(self):
2750 self.createAndSendFDs(2)
2751
2752 def testCmsgTruncLen1(self):
2753 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2754 maxdata=SIZEOF_INT)
2755
2756 def _testCmsgTruncLen1(self):
2757 self.createAndSendFDs(2)
2758
2759 def testCmsgTruncLen2Minus1(self):
2760 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2761 maxdata=(2 * SIZEOF_INT) - 1)
2762
2763 def _testCmsgTruncLen2Minus1(self):
2764 self.createAndSendFDs(2)
2765
2766
2767class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2768 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2769 # features of the RFC 3542 Advanced Sockets API for IPv6.
2770 # Currently we can only handle certain data items (e.g. traffic
2771 # class, hop limit, MTU discovery and fragmentation settings)
2772 # without resorting to unportable means such as the struct module,
2773 # but the tests here are aimed at testing the ancillary data
2774 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2775 # itself.
2776
2777 # Test value to use when setting hop limit of packet
2778 hop_limit = 2
2779
2780 # Test value to use when setting traffic class of packet.
2781 # -1 means "use kernel default".
2782 traffic_class = -1
2783
2784 def ancillaryMapping(self, ancdata):
2785 # Given ancillary data list ancdata, return a mapping from
2786 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2787 # Check that no (level, type) pair appears more than once.
2788 d = {}
2789 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2790 self.assertNotIn((cmsg_level, cmsg_type), d)
2791 d[(cmsg_level, cmsg_type)] = cmsg_data
2792 return d
2793
2794 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2795 # Receive hop limit into ancbufsize bytes of ancillary data
2796 # space. Check that data is MSG, ancillary data is not
2797 # truncated (but ignore any flags in ignoreflags), and hop
2798 # limit is between 0 and maxhop inclusive.
2799 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2800 socket.IPV6_RECVHOPLIMIT, 1)
2801 self.misc_event.set()
2802 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2803 len(MSG), ancbufsize)
2804
2805 self.assertEqual(msg, MSG)
2806 self.checkRecvmsgAddress(addr, self.cli_addr)
2807 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2808 ignore=ignoreflags)
2809
2810 self.assertEqual(len(ancdata), 1)
2811 self.assertIsInstance(ancdata[0], tuple)
2812 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2813 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2814 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2815 self.assertIsInstance(cmsg_data, bytes)
2816 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2817 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002818 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002819 self.assertGreaterEqual(a[0], 0)
2820 self.assertLessEqual(a[0], maxhop)
2821
2822 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2823 def testRecvHopLimit(self):
2824 # Test receiving the packet hop limit as ancillary data.
2825 self.checkHopLimit(ancbufsize=10240)
2826
2827 @testRecvHopLimit.client_skip
2828 def _testRecvHopLimit(self):
2829 # Need to wait until server has asked to receive ancillary
2830 # data, as implementations are not required to buffer it
2831 # otherwise.
2832 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2833 self.sendToServer(MSG)
2834
2835 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2836 def testRecvHopLimitCMSG_SPACE(self):
2837 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2838 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2839
2840 @testRecvHopLimitCMSG_SPACE.client_skip
2841 def _testRecvHopLimitCMSG_SPACE(self):
2842 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2843 self.sendToServer(MSG)
2844
2845 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2846 # 3542 says portable applications must provide space for trailing
2847 # padding. Implementations may set MSG_CTRUNC if there isn't
2848 # enough space for the padding.
2849
2850 @requireAttrs(socket.socket, "sendmsg")
2851 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2852 def testSetHopLimit(self):
2853 # Test setting hop limit on outgoing packet and receiving it
2854 # at the other end.
2855 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2856
2857 @testSetHopLimit.client_skip
2858 def _testSetHopLimit(self):
2859 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2860 self.assertEqual(
2861 self.sendmsgToServer([MSG],
2862 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2863 array.array("i", [self.hop_limit]))]),
2864 len(MSG))
2865
2866 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2867 ignoreflags=0):
2868 # Receive traffic class and hop limit into ancbufsize bytes of
2869 # ancillary data space. Check that data is MSG, ancillary
2870 # data is not truncated (but ignore any flags in ignoreflags),
2871 # and traffic class and hop limit are in range (hop limit no
2872 # more than maxhop).
2873 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2874 socket.IPV6_RECVHOPLIMIT, 1)
2875 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2876 socket.IPV6_RECVTCLASS, 1)
2877 self.misc_event.set()
2878 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2879 len(MSG), ancbufsize)
2880
2881 self.assertEqual(msg, MSG)
2882 self.checkRecvmsgAddress(addr, self.cli_addr)
2883 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2884 ignore=ignoreflags)
2885 self.assertEqual(len(ancdata), 2)
2886 ancmap = self.ancillaryMapping(ancdata)
2887
2888 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2889 self.assertEqual(len(tcdata), SIZEOF_INT)
2890 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002891 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002892 self.assertGreaterEqual(a[0], 0)
2893 self.assertLessEqual(a[0], 255)
2894
2895 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2896 self.assertEqual(len(hldata), SIZEOF_INT)
2897 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002898 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002899 self.assertGreaterEqual(a[0], 0)
2900 self.assertLessEqual(a[0], maxhop)
2901
2902 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2903 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2904 def testRecvTrafficClassAndHopLimit(self):
2905 # Test receiving traffic class and hop limit as ancillary data.
2906 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2907
2908 @testRecvTrafficClassAndHopLimit.client_skip
2909 def _testRecvTrafficClassAndHopLimit(self):
2910 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2911 self.sendToServer(MSG)
2912
2913 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2914 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2915 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2916 # Test receiving traffic class and hop limit, using
2917 # CMSG_SPACE() to calculate buffer size.
2918 self.checkTrafficClassAndHopLimit(
2919 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2920
2921 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2922 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2923 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2924 self.sendToServer(MSG)
2925
2926 @requireAttrs(socket.socket, "sendmsg")
2927 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2928 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2929 def testSetTrafficClassAndHopLimit(self):
2930 # Test setting traffic class and hop limit on outgoing packet,
2931 # and receiving them at the other end.
2932 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2933 maxhop=self.hop_limit)
2934
2935 @testSetTrafficClassAndHopLimit.client_skip
2936 def _testSetTrafficClassAndHopLimit(self):
2937 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2938 self.assertEqual(
2939 self.sendmsgToServer([MSG],
2940 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2941 array.array("i", [self.traffic_class])),
2942 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2943 array.array("i", [self.hop_limit]))]),
2944 len(MSG))
2945
2946 @requireAttrs(socket.socket, "sendmsg")
2947 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2948 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2949 def testOddCmsgSize(self):
2950 # Try to send ancillary data with first item one byte too
2951 # long. Fall back to sending with correct size if this fails,
2952 # and check that second item was handled correctly.
2953 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2954 maxhop=self.hop_limit)
2955
2956 @testOddCmsgSize.client_skip
2957 def _testOddCmsgSize(self):
2958 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2959 try:
2960 nbytes = self.sendmsgToServer(
2961 [MSG],
2962 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002963 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002964 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2965 array.array("i", [self.hop_limit]))])
2966 except socket.error as e:
2967 self.assertIsInstance(e.errno, int)
2968 nbytes = self.sendmsgToServer(
2969 [MSG],
2970 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2971 array.array("i", [self.traffic_class])),
2972 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2973 array.array("i", [self.hop_limit]))])
2974 self.assertEqual(nbytes, len(MSG))
2975
2976 # Tests for proper handling of truncated ancillary data
2977
2978 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2979 # Receive hop limit into ancbufsize bytes of ancillary data
2980 # space, which should be too small to contain the ancillary
2981 # data header (if ancbufsize is None, pass no second argument
2982 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2983 # (unless included in ignoreflags), and no ancillary data is
2984 # returned.
2985 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2986 socket.IPV6_RECVHOPLIMIT, 1)
2987 self.misc_event.set()
2988 args = () if ancbufsize is None else (ancbufsize,)
2989 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2990 len(MSG), *args)
2991
2992 self.assertEqual(msg, MSG)
2993 self.checkRecvmsgAddress(addr, self.cli_addr)
2994 self.assertEqual(ancdata, [])
2995 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2996 ignore=ignoreflags)
2997
2998 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2999 def testCmsgTruncNoBufSize(self):
3000 # Check that no ancillary data is received when no ancillary
3001 # buffer size is provided.
3002 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3003 # BSD seems to set
3004 # MSG_CTRUNC only if an item
3005 # has been partially
3006 # received.
3007 ignoreflags=socket.MSG_CTRUNC)
3008
3009 @testCmsgTruncNoBufSize.client_skip
3010 def _testCmsgTruncNoBufSize(self):
3011 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3012 self.sendToServer(MSG)
3013
3014 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3015 def testSingleCmsgTrunc0(self):
3016 # Check that no ancillary data is received when ancillary
3017 # buffer size is zero.
3018 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3019 ignoreflags=socket.MSG_CTRUNC)
3020
3021 @testSingleCmsgTrunc0.client_skip
3022 def _testSingleCmsgTrunc0(self):
3023 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3024 self.sendToServer(MSG)
3025
3026 # Check that no ancillary data is returned for various non-zero
3027 # (but still too small) buffer sizes.
3028
3029 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3030 def testSingleCmsgTrunc1(self):
3031 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3032
3033 @testSingleCmsgTrunc1.client_skip
3034 def _testSingleCmsgTrunc1(self):
3035 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3036 self.sendToServer(MSG)
3037
3038 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3039 def testSingleCmsgTrunc2Int(self):
3040 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3041
3042 @testSingleCmsgTrunc2Int.client_skip
3043 def _testSingleCmsgTrunc2Int(self):
3044 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3045 self.sendToServer(MSG)
3046
3047 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3048 def testSingleCmsgTruncLen0Minus1(self):
3049 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3050
3051 @testSingleCmsgTruncLen0Minus1.client_skip
3052 def _testSingleCmsgTruncLen0Minus1(self):
3053 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3054 self.sendToServer(MSG)
3055
3056 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3057 def testSingleCmsgTruncInData(self):
3058 # Test truncation of a control message inside its associated
3059 # data. The message may be returned with its data truncated,
3060 # or not returned at all.
3061 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3062 socket.IPV6_RECVHOPLIMIT, 1)
3063 self.misc_event.set()
3064 msg, ancdata, flags, addr = self.doRecvmsg(
3065 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3066
3067 self.assertEqual(msg, MSG)
3068 self.checkRecvmsgAddress(addr, self.cli_addr)
3069 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3070
3071 self.assertLessEqual(len(ancdata), 1)
3072 if ancdata:
3073 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3074 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3075 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3076 self.assertLess(len(cmsg_data), SIZEOF_INT)
3077
3078 @testSingleCmsgTruncInData.client_skip
3079 def _testSingleCmsgTruncInData(self):
3080 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3081 self.sendToServer(MSG)
3082
3083 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3084 # Receive traffic class and hop limit into ancbufsize bytes of
3085 # ancillary data space, which should be large enough to
3086 # contain the first item, but too small to contain the header
3087 # of the second. Check that data is MSG, MSG_CTRUNC is set
3088 # (unless included in ignoreflags), and only one ancillary
3089 # data item is returned.
3090 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3091 socket.IPV6_RECVHOPLIMIT, 1)
3092 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3093 socket.IPV6_RECVTCLASS, 1)
3094 self.misc_event.set()
3095 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3096 len(MSG), ancbufsize)
3097
3098 self.assertEqual(msg, MSG)
3099 self.checkRecvmsgAddress(addr, self.cli_addr)
3100 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3101 ignore=ignoreflags)
3102
3103 self.assertEqual(len(ancdata), 1)
3104 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3105 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3106 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3107 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3108 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003109 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003110 self.assertGreaterEqual(a[0], 0)
3111 self.assertLessEqual(a[0], 255)
3112
3113 # Try the above test with various buffer sizes.
3114
3115 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3116 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3117 def testSecondCmsgTrunc0(self):
3118 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3119 ignoreflags=socket.MSG_CTRUNC)
3120
3121 @testSecondCmsgTrunc0.client_skip
3122 def _testSecondCmsgTrunc0(self):
3123 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3124 self.sendToServer(MSG)
3125
3126 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3127 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3128 def testSecondCmsgTrunc1(self):
3129 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3130
3131 @testSecondCmsgTrunc1.client_skip
3132 def _testSecondCmsgTrunc1(self):
3133 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3134 self.sendToServer(MSG)
3135
3136 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3137 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3138 def testSecondCmsgTrunc2Int(self):
3139 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3140 2 * SIZEOF_INT)
3141
3142 @testSecondCmsgTrunc2Int.client_skip
3143 def _testSecondCmsgTrunc2Int(self):
3144 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3145 self.sendToServer(MSG)
3146
3147 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3148 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3149 def testSecondCmsgTruncLen0Minus1(self):
3150 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3151 socket.CMSG_LEN(0) - 1)
3152
3153 @testSecondCmsgTruncLen0Minus1.client_skip
3154 def _testSecondCmsgTruncLen0Minus1(self):
3155 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3156 self.sendToServer(MSG)
3157
3158 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3159 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3160 def testSecomdCmsgTruncInData(self):
3161 # Test truncation of the second of two control messages inside
3162 # its associated data.
3163 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3164 socket.IPV6_RECVHOPLIMIT, 1)
3165 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3166 socket.IPV6_RECVTCLASS, 1)
3167 self.misc_event.set()
3168 msg, ancdata, flags, addr = self.doRecvmsg(
3169 self.serv_sock, len(MSG),
3170 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3171
3172 self.assertEqual(msg, MSG)
3173 self.checkRecvmsgAddress(addr, self.cli_addr)
3174 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3175
3176 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3177
3178 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3179 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3180 cmsg_types.remove(cmsg_type)
3181 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3182 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003183 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003184 self.assertGreaterEqual(a[0], 0)
3185 self.assertLessEqual(a[0], 255)
3186
3187 if ancdata:
3188 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3189 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3190 cmsg_types.remove(cmsg_type)
3191 self.assertLess(len(cmsg_data), SIZEOF_INT)
3192
3193 self.assertEqual(ancdata, [])
3194
3195 @testSecomdCmsgTruncInData.client_skip
3196 def _testSecomdCmsgTruncInData(self):
3197 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3198 self.sendToServer(MSG)
3199
3200
3201# Derive concrete test classes for different socket types.
3202
3203class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3204 SendrecvmsgConnectionlessBase,
3205 ThreadedSocketTestMixin, UDPTestBase):
3206 pass
3207
3208@requireAttrs(socket.socket, "sendmsg")
3209@unittest.skipUnless(thread, 'Threading required for this test.')
3210class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3211 pass
3212
3213@requireAttrs(socket.socket, "recvmsg")
3214@unittest.skipUnless(thread, 'Threading required for this test.')
3215class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3216 pass
3217
3218@requireAttrs(socket.socket, "recvmsg_into")
3219@unittest.skipUnless(thread, 'Threading required for this test.')
3220class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3221 pass
3222
3223
3224class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3225 SendrecvmsgConnectionlessBase,
3226 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003227
3228 def checkRecvmsgAddress(self, addr1, addr2):
3229 # Called to compare the received address with the address of
3230 # the peer, ignoring scope ID
3231 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003232
3233@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003234@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003235@requireSocket("AF_INET6", "SOCK_DGRAM")
3236@unittest.skipUnless(thread, 'Threading required for this test.')
3237class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3238 pass
3239
3240@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003241@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003242@requireSocket("AF_INET6", "SOCK_DGRAM")
3243@unittest.skipUnless(thread, 'Threading required for this test.')
3244class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3245 pass
3246
3247@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003248@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003249@requireSocket("AF_INET6", "SOCK_DGRAM")
3250@unittest.skipUnless(thread, 'Threading required for this test.')
3251class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3252 pass
3253
3254@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003255@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003256@requireAttrs(socket, "IPPROTO_IPV6")
3257@requireSocket("AF_INET6", "SOCK_DGRAM")
3258@unittest.skipUnless(thread, 'Threading required for this test.')
3259class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3260 SendrecvmsgUDP6TestBase):
3261 pass
3262
3263@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003264@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003265@requireAttrs(socket, "IPPROTO_IPV6")
3266@requireSocket("AF_INET6", "SOCK_DGRAM")
3267@unittest.skipUnless(thread, 'Threading required for this test.')
3268class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3269 RFC3542AncillaryTest,
3270 SendrecvmsgUDP6TestBase):
3271 pass
3272
3273
3274class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3275 ConnectedStreamTestMixin, TCPTestBase):
3276 pass
3277
3278@requireAttrs(socket.socket, "sendmsg")
3279@unittest.skipUnless(thread, 'Threading required for this test.')
3280class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3281 pass
3282
3283@requireAttrs(socket.socket, "recvmsg")
3284@unittest.skipUnless(thread, 'Threading required for this test.')
3285class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3286 SendrecvmsgTCPTestBase):
3287 pass
3288
3289@requireAttrs(socket.socket, "recvmsg_into")
3290@unittest.skipUnless(thread, 'Threading required for this test.')
3291class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3292 SendrecvmsgTCPTestBase):
3293 pass
3294
3295
3296class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3297 SendrecvmsgConnectedBase,
3298 ConnectedStreamTestMixin, SCTPStreamBase):
3299 pass
3300
3301@requireAttrs(socket.socket, "sendmsg")
3302@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3303@unittest.skipUnless(thread, 'Threading required for this test.')
3304class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3305 pass
3306
3307@requireAttrs(socket.socket, "recvmsg")
3308@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3309@unittest.skipUnless(thread, 'Threading required for this test.')
3310class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3311 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003312
3313 def testRecvmsgEOF(self):
3314 try:
3315 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3316 except OSError as e:
3317 if e.errno != errno.ENOTCONN:
3318 raise
3319 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003320
3321@requireAttrs(socket.socket, "recvmsg_into")
3322@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3323@unittest.skipUnless(thread, 'Threading required for this test.')
3324class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3325 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003326
3327 def testRecvmsgEOF(self):
3328 try:
3329 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3330 except OSError as e:
3331 if e.errno != errno.ENOTCONN:
3332 raise
3333 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003334
3335
3336class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3337 ConnectedStreamTestMixin, UnixStreamBase):
3338 pass
3339
3340@requireAttrs(socket.socket, "sendmsg")
3341@requireAttrs(socket, "AF_UNIX")
3342@unittest.skipUnless(thread, 'Threading required for this test.')
3343class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3344 pass
3345
3346@requireAttrs(socket.socket, "recvmsg")
3347@requireAttrs(socket, "AF_UNIX")
3348@unittest.skipUnless(thread, 'Threading required for this test.')
3349class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3350 SendrecvmsgUnixStreamTestBase):
3351 pass
3352
3353@requireAttrs(socket.socket, "recvmsg_into")
3354@requireAttrs(socket, "AF_UNIX")
3355@unittest.skipUnless(thread, 'Threading required for this test.')
3356class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3357 SendrecvmsgUnixStreamTestBase):
3358 pass
3359
3360@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3361@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3362@unittest.skipUnless(thread, 'Threading required for this test.')
3363class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3364 pass
3365
3366@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3367@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3368@unittest.skipUnless(thread, 'Threading required for this test.')
3369class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3370 SendrecvmsgUnixStreamTestBase):
3371 pass
3372
3373
3374# Test interrupting the interruptible send/receive methods with a
3375# signal when a timeout is set. These tests avoid having multiple
3376# threads alive during the test so that the OS cannot deliver the
3377# signal to the wrong one.
3378
3379class InterruptedTimeoutBase(unittest.TestCase):
3380 # Base class for interrupted send/receive tests. Installs an
3381 # empty handler for SIGALRM and removes it on teardown, along with
3382 # any scheduled alarms.
3383
3384 def setUp(self):
3385 super().setUp()
3386 orig_alrm_handler = signal.signal(signal.SIGALRM,
3387 lambda signum, frame: None)
3388 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3389 self.addCleanup(self.setAlarm, 0)
3390
3391 # Timeout for socket operations
3392 timeout = 4.0
3393
3394 # Provide setAlarm() method to schedule delivery of SIGALRM after
3395 # given number of seconds, or cancel it if zero, and an
3396 # appropriate time value to use. Use setitimer() if available.
3397 if hasattr(signal, "setitimer"):
3398 alarm_time = 0.05
3399
3400 def setAlarm(self, seconds):
3401 signal.setitimer(signal.ITIMER_REAL, seconds)
3402 else:
3403 # Old systems may deliver the alarm up to one second early
3404 alarm_time = 2
3405
3406 def setAlarm(self, seconds):
3407 signal.alarm(seconds)
3408
3409
3410# Require siginterrupt() in order to ensure that system calls are
3411# interrupted by default.
3412@requireAttrs(signal, "siginterrupt")
3413@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3414 "Don't have signal.alarm or signal.setitimer")
3415class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3416 # Test interrupting the recv*() methods with signals when a
3417 # timeout is set.
3418
3419 def setUp(self):
3420 super().setUp()
3421 self.serv.settimeout(self.timeout)
3422
3423 def checkInterruptedRecv(self, func, *args, **kwargs):
3424 # Check that func(*args, **kwargs) raises socket.error with an
3425 # errno of EINTR when interrupted by a signal.
3426 self.setAlarm(self.alarm_time)
3427 with self.assertRaises(socket.error) as cm:
3428 func(*args, **kwargs)
3429 self.assertNotIsInstance(cm.exception, socket.timeout)
3430 self.assertEqual(cm.exception.errno, errno.EINTR)
3431
3432 def testInterruptedRecvTimeout(self):
3433 self.checkInterruptedRecv(self.serv.recv, 1024)
3434
3435 def testInterruptedRecvIntoTimeout(self):
3436 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3437
3438 def testInterruptedRecvfromTimeout(self):
3439 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3440
3441 def testInterruptedRecvfromIntoTimeout(self):
3442 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3443
3444 @requireAttrs(socket.socket, "recvmsg")
3445 def testInterruptedRecvmsgTimeout(self):
3446 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3447
3448 @requireAttrs(socket.socket, "recvmsg_into")
3449 def testInterruptedRecvmsgIntoTimeout(self):
3450 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3451
3452
3453# Require siginterrupt() in order to ensure that system calls are
3454# interrupted by default.
3455@requireAttrs(signal, "siginterrupt")
3456@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3457 "Don't have signal.alarm or signal.setitimer")
3458@unittest.skipUnless(thread, 'Threading required for this test.')
3459class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3460 ThreadSafeCleanupTestCase,
3461 SocketListeningTestMixin, TCPTestBase):
3462 # Test interrupting the interruptible send*() methods with signals
3463 # when a timeout is set.
3464
3465 def setUp(self):
3466 super().setUp()
3467 self.serv_conn = self.newSocket()
3468 self.addCleanup(self.serv_conn.close)
3469 # Use a thread to complete the connection, but wait for it to
3470 # terminate before running the test, so that there is only one
3471 # thread to accept the signal.
3472 cli_thread = threading.Thread(target=self.doConnect)
3473 cli_thread.start()
3474 self.cli_conn, addr = self.serv.accept()
3475 self.addCleanup(self.cli_conn.close)
3476 cli_thread.join()
3477 self.serv_conn.settimeout(self.timeout)
3478
3479 def doConnect(self):
3480 self.serv_conn.connect(self.serv_addr)
3481
3482 def checkInterruptedSend(self, func, *args, **kwargs):
3483 # Check that func(*args, **kwargs), run in a loop, raises
3484 # socket.error with an errno of EINTR when interrupted by a
3485 # signal.
3486 with self.assertRaises(socket.error) as cm:
3487 while True:
3488 self.setAlarm(self.alarm_time)
3489 func(*args, **kwargs)
3490 self.assertNotIsInstance(cm.exception, socket.timeout)
3491 self.assertEqual(cm.exception.errno, errno.EINTR)
3492
Nick Coghlan2496f332011-09-19 20:26:31 +10003493 # Issue #12958: The following tests have problems on Mac OS X
3494 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003495 def testInterruptedSendTimeout(self):
3496 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3497
Nick Coghlan2496f332011-09-19 20:26:31 +10003498 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003499 def testInterruptedSendtoTimeout(self):
3500 # Passing an actual address here as Python's wrapper for
3501 # sendto() doesn't allow passing a zero-length one; POSIX
3502 # requires that the address is ignored since the socket is
3503 # connection-mode, however.
3504 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3505 self.serv_addr)
3506
Nick Coghlan2496f332011-09-19 20:26:31 +10003507 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003508 @requireAttrs(socket.socket, "sendmsg")
3509 def testInterruptedSendmsgTimeout(self):
3510 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3511
3512
Victor Stinner45df8202010-04-28 22:31:17 +00003513@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003514class TCPCloserTest(ThreadedTCPSocketTest):
3515
3516 def testClose(self):
3517 conn, addr = self.serv.accept()
3518 conn.close()
3519
3520 sd = self.cli
3521 read, write, err = select.select([sd], [], [], 1.0)
3522 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003523 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003524
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003525 # Calling close() many times should be safe.
3526 conn.close()
3527 conn.close()
3528
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003529 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003530 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003531 time.sleep(1.0)
3532
Victor Stinner45df8202010-04-28 22:31:17 +00003533@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003534class BasicSocketPairTest(SocketPairTest):
3535
3536 def __init__(self, methodName='runTest'):
3537 SocketPairTest.__init__(self, methodName=methodName)
3538
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003539 def _check_defaults(self, sock):
3540 self.assertIsInstance(sock, socket.socket)
3541 if hasattr(socket, 'AF_UNIX'):
3542 self.assertEqual(sock.family, socket.AF_UNIX)
3543 else:
3544 self.assertEqual(sock.family, socket.AF_INET)
3545 self.assertEqual(sock.type, socket.SOCK_STREAM)
3546 self.assertEqual(sock.proto, 0)
3547
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003548 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003549 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003550
3551 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003552 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003553
Dave Cole331708b2004-08-09 04:51:41 +00003554 def testRecv(self):
3555 msg = self.serv.recv(1024)
3556 self.assertEqual(msg, MSG)
3557
3558 def _testRecv(self):
3559 self.cli.send(MSG)
3560
3561 def testSend(self):
3562 self.serv.send(MSG)
3563
3564 def _testSend(self):
3565 msg = self.cli.recv(1024)
3566 self.assertEqual(msg, MSG)
3567
Victor Stinner45df8202010-04-28 22:31:17 +00003568@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003569class NonBlockingTCPTests(ThreadedTCPSocketTest):
3570
3571 def __init__(self, methodName='runTest'):
3572 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3573
3574 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003575 # Testing whether set blocking works
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02003576 self.serv.setblocking(True)
3577 self.assertIsNone(self.serv.gettimeout())
3578 self.serv.setblocking(False)
3579 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003580 start = time.time()
3581 try:
3582 self.serv.accept()
3583 except socket.error:
3584 pass
3585 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003586 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02003587 # Issue 15989
3588 if _testcapi.UINT_MAX < _testcapi.ULONG_MAX:
3589 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3590 self.assertIsNone(self.serv.gettimeout())
Guido van Rossum24e4af82002-06-12 19:18:08 +00003591
3592 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003593 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003594
Antoine Pitroub1c54962010-10-14 15:05:38 +00003595 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003596 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003597 def testInitNonBlocking(self):
3598 # reinit server socket
3599 self.serv.close()
3600 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003601 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003602 self.port = support.bind_port(self.serv)
3603 self.serv.listen(1)
3604 # actual testing
3605 start = time.time()
3606 try:
3607 self.serv.accept()
3608 except socket.error:
3609 pass
3610 end = time.time()
3611 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3612
3613 def _testInitNonBlocking(self):
3614 pass
3615
Antoine Pitrou600232b2011-01-05 21:03:42 +00003616 def testInheritFlags(self):
3617 # Issue #7995: when calling accept() on a listening socket with a
3618 # timeout, the resulting socket should not be non-blocking.
3619 self.serv.settimeout(10)
3620 try:
3621 conn, addr = self.serv.accept()
3622 message = conn.recv(len(MSG))
3623 finally:
3624 conn.close()
3625 self.serv.settimeout(None)
3626
3627 def _testInheritFlags(self):
3628 time.sleep(0.1)
3629 self.cli.connect((HOST, self.port))
3630 time.sleep(0.5)
3631 self.cli.send(MSG)
3632
Guido van Rossum24e4af82002-06-12 19:18:08 +00003633 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003634 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003635 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003636 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003637 conn, addr = self.serv.accept()
3638 except socket.error:
3639 pass
3640 else:
3641 self.fail("Error trying to do non-blocking accept.")
3642 read, write, err = select.select([self.serv], [], [])
3643 if self.serv in read:
3644 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003645 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003646 else:
3647 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003648
Guido van Rossum24e4af82002-06-12 19:18:08 +00003649 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003650 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003651 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003652
3653 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003654 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003655 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003656 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003657
3658 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003659 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003660 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003661
3662 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003663 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003664 conn, addr = self.serv.accept()
3665 conn.setblocking(0)
3666 try:
3667 msg = conn.recv(len(MSG))
3668 except socket.error:
3669 pass
3670 else:
3671 self.fail("Error trying to do non-blocking recv.")
3672 read, write, err = select.select([conn], [], [])
3673 if conn in read:
3674 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003675 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003676 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003677 else:
3678 self.fail("Error during select call to non-blocking socket.")
3679
3680 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003681 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003682 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003683 self.cli.send(MSG)
3684
Victor Stinner45df8202010-04-28 22:31:17 +00003685@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003686class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003687 """Unit tests for the object returned by socket.makefile()
3688
Antoine Pitrou834bd812010-10-13 16:17:14 +00003689 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003690 the client connection. You can read from this file to
3691 get output from the server.
3692
Antoine Pitrou834bd812010-10-13 16:17:14 +00003693 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003694 server connection. You can write to this file to send output
3695 to the client.
3696 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003697
Guido van Rossume9f66142002-08-07 15:46:19 +00003698 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003699 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003700 errors = 'strict'
3701 newline = None
3702
3703 read_mode = 'rb'
3704 read_msg = MSG
3705 write_mode = 'wb'
3706 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003707
Guido van Rossum24e4af82002-06-12 19:18:08 +00003708 def __init__(self, methodName='runTest'):
3709 SocketConnectedTest.__init__(self, methodName=methodName)
3710
3711 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003712 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3713 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003714 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003715 self.read_file = self.cli_conn.makefile(
3716 self.read_mode, self.bufsize,
3717 encoding = self.encoding,
3718 errors = self.errors,
3719 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003720
3721 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003722 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003723 self.read_file.close()
3724 self.assertTrue(self.read_file.closed)
3725 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003726 SocketConnectedTest.tearDown(self)
3727
3728 def clientSetUp(self):
3729 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003730 self.write_file = self.serv_conn.makefile(
3731 self.write_mode, self.bufsize,
3732 encoding = self.encoding,
3733 errors = self.errors,
3734 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003735
3736 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003737 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003738 self.write_file.close()
3739 self.assertTrue(self.write_file.closed)
3740 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003741 SocketConnectedTest.clientTearDown(self)
3742
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003743 def testReadAfterTimeout(self):
3744 # Issue #7322: A file object must disallow further reads
3745 # after a timeout has occurred.
3746 self.cli_conn.settimeout(1)
3747 self.read_file.read(3)
3748 # First read raises a timeout
3749 self.assertRaises(socket.timeout, self.read_file.read, 1)
3750 # Second read is disallowed
3751 with self.assertRaises(IOError) as ctx:
3752 self.read_file.read(1)
3753 self.assertIn("cannot read from timed out object", str(ctx.exception))
3754
3755 def _testReadAfterTimeout(self):
3756 self.write_file.write(self.write_msg[0:3])
3757 self.write_file.flush()
3758 self.serv_finished.wait()
3759
Guido van Rossum24e4af82002-06-12 19:18:08 +00003760 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003761 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003762 first_seg = self.read_file.read(len(self.read_msg)-3)
3763 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003764 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003765 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003766
3767 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003768 self.write_file.write(self.write_msg)
3769 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003770
Guido van Rossum8c943832002-08-08 01:00:28 +00003771 def testFullRead(self):
3772 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003773 msg = self.read_file.read()
3774 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003775
3776 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003777 self.write_file.write(self.write_msg)
3778 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003779
Guido van Rossum24e4af82002-06-12 19:18:08 +00003780 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003781 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003782 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003783 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003784 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003785 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003786 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003787 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003788 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003789
3790 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003791 self.write_file.write(self.write_msg)
3792 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003793
3794 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003795 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003796 line = self.read_file.readline()
3797 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003798
3799 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003800 self.write_file.write(self.write_msg)
3801 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003802
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003803 def testCloseAfterMakefile(self):
3804 # The file returned by makefile should keep the socket open.
3805 self.cli_conn.close()
3806 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003807 msg = self.read_file.read()
3808 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003809
3810 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003811 self.write_file.write(self.write_msg)
3812 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003813
3814 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003815 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003816 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003817 if isinstance(self.read_msg, str):
3818 msg = msg.decode()
3819 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003820
3821 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003822 self.write_file.write(self.write_msg)
3823 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003824
Tim Peters116d83c2004-03-28 02:20:45 +00003825 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003826 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003827
3828 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003829 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003830
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003831 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003832 self.assertEqual(self.read_file.mode, self.read_mode)
3833 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003834
3835 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003836 self.assertEqual(self.write_file.mode, self.write_mode)
3837 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003838
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003839 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003840 self.read_file.close()
3841 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003842 self.cli_conn.close()
3843 self.assertRaises(socket.error, self.cli_conn.getsockname)
3844
3845 def _testRealClose(self):
3846 pass
3847
3848
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003849class FileObjectInterruptedTestCase(unittest.TestCase):
3850 """Test that the file object correctly handles EINTR internally."""
3851
3852 class MockSocket(object):
3853 def __init__(self, recv_funcs=()):
3854 # A generator that returns callables that we'll call for each
3855 # call to recv().
3856 self._recv_step = iter(recv_funcs)
3857
3858 def recv_into(self, buffer):
3859 data = next(self._recv_step)()
3860 assert len(buffer) >= len(data)
3861 buffer[:len(data)] = data
3862 return len(data)
3863
3864 def _decref_socketios(self):
3865 pass
3866
3867 def _textiowrap_for_test(self, buffering=-1):
3868 raw = socket.SocketIO(self, "r")
3869 if buffering < 0:
3870 buffering = io.DEFAULT_BUFFER_SIZE
3871 if buffering == 0:
3872 return raw
3873 buffer = io.BufferedReader(raw, buffering)
3874 text = io.TextIOWrapper(buffer, None, None)
3875 text.mode = "rb"
3876 return text
3877
3878 @staticmethod
3879 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003880 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003881
3882 def _textiowrap_mock_socket(self, mock, buffering=-1):
3883 raw = socket.SocketIO(mock, "r")
3884 if buffering < 0:
3885 buffering = io.DEFAULT_BUFFER_SIZE
3886 if buffering == 0:
3887 return raw
3888 buffer = io.BufferedReader(raw, buffering)
3889 text = io.TextIOWrapper(buffer, None, None)
3890 text.mode = "rb"
3891 return text
3892
3893 def _test_readline(self, size=-1, buffering=-1):
3894 mock_sock = self.MockSocket(recv_funcs=[
3895 lambda : b"This is the first line\nAnd the sec",
3896 self._raise_eintr,
3897 lambda : b"ond line is here\n",
3898 lambda : b"",
3899 lambda : b"", # XXX(gps): io library does an extra EOF read
3900 ])
3901 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003902 self.assertEqual(fo.readline(size), "This is the first line\n")
3903 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003904
3905 def _test_read(self, size=-1, buffering=-1):
3906 mock_sock = self.MockSocket(recv_funcs=[
3907 lambda : b"This is the first line\nAnd the sec",
3908 self._raise_eintr,
3909 lambda : b"ond line is here\n",
3910 lambda : b"",
3911 lambda : b"", # XXX(gps): io library does an extra EOF read
3912 ])
3913 expecting = (b"This is the first line\n"
3914 b"And the second line is here\n")
3915 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3916 if buffering == 0:
3917 data = b''
3918 else:
3919 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003920 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003921 while len(data) != len(expecting):
3922 part = fo.read(size)
3923 if not part:
3924 break
3925 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003926 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003927
3928 def test_default(self):
3929 self._test_readline()
3930 self._test_readline(size=100)
3931 self._test_read()
3932 self._test_read(size=100)
3933
3934 def test_with_1k_buffer(self):
3935 self._test_readline(buffering=1024)
3936 self._test_readline(size=100, buffering=1024)
3937 self._test_read(buffering=1024)
3938 self._test_read(size=100, buffering=1024)
3939
3940 def _test_readline_no_buffer(self, size=-1):
3941 mock_sock = self.MockSocket(recv_funcs=[
3942 lambda : b"a",
3943 lambda : b"\n",
3944 lambda : b"B",
3945 self._raise_eintr,
3946 lambda : b"b",
3947 lambda : b"",
3948 ])
3949 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003950 self.assertEqual(fo.readline(size), b"a\n")
3951 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003952
3953 def test_no_buffer(self):
3954 self._test_readline_no_buffer()
3955 self._test_readline_no_buffer(size=4)
3956 self._test_read(buffering=0)
3957 self._test_read(size=100, buffering=0)
3958
3959
Guido van Rossume9f66142002-08-07 15:46:19 +00003960class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3961
3962 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003963
Guido van Rossume9f66142002-08-07 15:46:19 +00003964 In this case (and in this case only), it should be possible to
3965 create a file object, read a line from it, create another file
3966 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003967 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003968 when reading multiple requests from the same socket."""
3969
3970 bufsize = 0 # Use unbuffered mode
3971
3972 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003973 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003974 line = self.read_file.readline() # first line
3975 self.assertEqual(line, b"A. " + self.write_msg) # first line
3976 self.read_file = self.cli_conn.makefile('rb', 0)
3977 line = self.read_file.readline() # second line
3978 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003979
3980 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003981 self.write_file.write(b"A. " + self.write_msg)
3982 self.write_file.write(b"B. " + self.write_msg)
3983 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003984
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003985 def testMakefileClose(self):
3986 # The file returned by makefile should keep the socket open...
3987 self.cli_conn.close()
3988 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003989 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003990 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003991 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003992 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3993
3994 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003995 self.write_file.write(self.write_msg)
3996 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003997
3998 def testMakefileCloseSocketDestroy(self):
3999 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004000 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004001 refcount_after = sys.getrefcount(self.cli_conn)
4002 self.assertEqual(refcount_before - 1, refcount_after)
4003
4004 def _testMakefileCloseSocketDestroy(self):
4005 pass
4006
Antoine Pitrou98b46702010-09-18 22:59:00 +00004007 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004008 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004009 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4010
4011 def testSmallReadNonBlocking(self):
4012 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004013 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4014 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004015 self.evt1.set()
4016 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004017 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004018 if first_seg is None:
4019 # Data not arrived (can happen under Windows), wait a bit
4020 time.sleep(0.5)
4021 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004022 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004023 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004024 self.assertEqual(n, 3)
4025 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004026 self.assertEqual(msg, self.read_msg)
4027 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4028 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004029
4030 def _testSmallReadNonBlocking(self):
4031 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004032 self.write_file.write(self.write_msg)
4033 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004034 self.evt2.set()
4035 # Avoid cloding the socket before the server test has finished,
4036 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4037 self.serv_finished.wait(5.0)
4038
4039 def testWriteNonBlocking(self):
4040 self.cli_finished.wait(5.0)
4041 # The client thread can't skip directly - the SkipTest exception
4042 # would appear as a failure.
4043 if self.serv_skipped:
4044 self.skipTest(self.serv_skipped)
4045
4046 def _testWriteNonBlocking(self):
4047 self.serv_skipped = None
4048 self.serv_conn.setblocking(False)
4049 # Try to saturate the socket buffer pipe with repeated large writes.
4050 BIG = b"x" * (1024 ** 2)
4051 LIMIT = 10
4052 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004053 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004054 self.assertGreater(n, 0)
4055 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004056 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004057 if n is None:
4058 # Succeeded
4059 break
4060 self.assertGreater(n, 0)
4061 else:
4062 # Let us know that this test didn't manage to establish
4063 # the expected conditions. This is not a failure in itself but,
4064 # if it happens repeatedly, the test should be fixed.
4065 self.serv_skipped = "failed to saturate the socket buffer"
4066
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004067
Guido van Rossum8c943832002-08-08 01:00:28 +00004068class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4069
4070 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4071
4072
4073class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4074
4075 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004076
Thomas Woutersb2137042007-02-01 18:02:27 +00004077
Antoine Pitrou834bd812010-10-13 16:17:14 +00004078class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4079 """Tests for socket.makefile() in text mode (rather than binary)"""
4080
4081 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004082 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004083 write_mode = 'wb'
4084 write_msg = MSG
4085 newline = ''
4086
4087
4088class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4089 """Tests for socket.makefile() in text mode (rather than binary)"""
4090
4091 read_mode = 'rb'
4092 read_msg = MSG
4093 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004094 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004095 newline = ''
4096
4097
4098class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4099 """Tests for socket.makefile() in text mode (rather than binary)"""
4100
4101 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004102 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004103 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004104 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004105 newline = ''
4106
4107
Guido van Rossumd8faa362007-04-27 19:54:29 +00004108class NetworkConnectionTest(object):
4109 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004110
Guido van Rossumd8faa362007-04-27 19:54:29 +00004111 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004112 # We're inherited below by BasicTCPTest2, which also inherits
4113 # BasicTCPTest, which defines self.port referenced below.
4114 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004115 self.serv_conn = self.cli
4116
4117class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4118 """Tests that NetworkConnection does not break existing TCP functionality.
4119 """
4120
4121class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004122
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004123 class MockSocket(socket.socket):
4124 def connect(self, *args):
4125 raise socket.timeout('timed out')
4126
4127 @contextlib.contextmanager
4128 def mocked_socket_module(self):
4129 """Return a socket which times out on connect"""
4130 old_socket = socket.socket
4131 socket.socket = self.MockSocket
4132 try:
4133 yield
4134 finally:
4135 socket.socket = old_socket
4136
4137 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004138 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004139 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004140 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004141 with self.assertRaises(socket.error) as cm:
4142 cli.connect((HOST, port))
4143 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4144
4145 def test_create_connection(self):
4146 # Issue #9792: errors raised by create_connection() should have
4147 # a proper errno attribute.
4148 port = support.find_unused_port()
4149 with self.assertRaises(socket.error) as cm:
4150 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004151
4152 # Issue #16257: create_connection() calls getaddrinfo() against
4153 # 'localhost'. This may result in an IPV6 addr being returned
4154 # as well as an IPV4 one:
4155 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4156 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4157 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4158 #
4159 # create_connection() enumerates through all the addresses returned
4160 # and if it doesn't successfully bind to any of them, it propagates
4161 # the last exception it encountered.
4162 #
4163 # On Solaris, ENETUNREACH is returned in this circumstance instead
4164 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4165 # expected errnos.
4166 expected_errnos = [ errno.ECONNREFUSED, ]
4167 if hasattr(errno, 'ENETUNREACH'):
4168 expected_errnos.append(errno.ENETUNREACH)
4169
4170 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004171
4172 def test_create_connection_timeout(self):
4173 # Issue #9792: create_connection() should not recast timeout errors
4174 # as generic socket errors.
4175 with self.mocked_socket_module():
4176 with self.assertRaises(socket.timeout):
4177 socket.create_connection((HOST, 1234))
4178
Guido van Rossumd8faa362007-04-27 19:54:29 +00004179
Victor Stinner45df8202010-04-28 22:31:17 +00004180@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004181class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4182
4183 def __init__(self, methodName='runTest'):
4184 SocketTCPTest.__init__(self, methodName=methodName)
4185 ThreadableTest.__init__(self)
4186
4187 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004188 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004189
4190 def clientTearDown(self):
4191 self.cli.close()
4192 self.cli = None
4193 ThreadableTest.clientTearDown(self)
4194
4195 def _justAccept(self):
4196 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004197 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004198
4199 testFamily = _justAccept
4200 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004201 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004202 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004203 self.assertEqual(self.cli.family, 2)
4204
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004205 testSourceAddress = _justAccept
4206 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004207 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4208 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004209 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004210 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004211 # The port number being used is sufficient to show that the bind()
4212 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004213
Guido van Rossumd8faa362007-04-27 19:54:29 +00004214 testTimeoutDefault = _justAccept
4215 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004216 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004217 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004218 socket.setdefaulttimeout(42)
4219 try:
4220 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004221 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004222 finally:
4223 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004224 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004225
4226 testTimeoutNone = _justAccept
4227 def _testTimeoutNone(self):
4228 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004229 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004230 socket.setdefaulttimeout(30)
4231 try:
4232 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004233 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004234 finally:
4235 socket.setdefaulttimeout(None)
4236 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004237
4238 testTimeoutValueNamed = _justAccept
4239 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004240 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004241 self.assertEqual(self.cli.gettimeout(), 30)
4242
4243 testTimeoutValueNonamed = _justAccept
4244 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004245 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004246 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004247 self.assertEqual(self.cli.gettimeout(), 30)
4248
Victor Stinner45df8202010-04-28 22:31:17 +00004249@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004250class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4251
4252 def __init__(self, methodName='runTest'):
4253 SocketTCPTest.__init__(self, methodName=methodName)
4254 ThreadableTest.__init__(self)
4255
4256 def clientSetUp(self):
4257 pass
4258
4259 def clientTearDown(self):
4260 self.cli.close()
4261 self.cli = None
4262 ThreadableTest.clientTearDown(self)
4263
4264 def testInsideTimeout(self):
4265 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004266 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004267 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004268 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004269 testOutsideTimeout = testInsideTimeout
4270
4271 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004272 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004273 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004274 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004275
4276 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004277 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004278 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004279
4280
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004281class TCPTimeoutTest(SocketTCPTest):
4282
4283 def testTCPTimeout(self):
4284 def raise_timeout(*args, **kwargs):
4285 self.serv.settimeout(1.0)
4286 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004287 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004288 "Error generating a timeout exception (TCP)")
4289
4290 def testTimeoutZero(self):
4291 ok = False
4292 try:
4293 self.serv.settimeout(0.0)
4294 foo = self.serv.accept()
4295 except socket.timeout:
4296 self.fail("caught timeout instead of error (TCP)")
4297 except socket.error:
4298 ok = True
4299 except:
4300 self.fail("caught unexpected exception (TCP)")
4301 if not ok:
4302 self.fail("accept() returned success when we did not expect it")
4303
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004304 def testInterruptedTimeout(self):
4305 # XXX I don't know how to do this test on MSWindows or any other
4306 # plaform that doesn't support signal.alarm() or os.kill(), though
4307 # the bug should have existed on all platforms.
4308 if not hasattr(signal, "alarm"):
4309 return # can only test on *nix
4310 self.serv.settimeout(5.0) # must be longer than alarm
4311 class Alarm(Exception):
4312 pass
4313 def alarm_handler(signal, frame):
4314 raise Alarm
4315 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4316 try:
4317 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4318 try:
4319 foo = self.serv.accept()
4320 except socket.timeout:
4321 self.fail("caught timeout instead of Alarm")
4322 except Alarm:
4323 pass
4324 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004325 self.fail("caught other exception instead of Alarm:"
4326 " %s(%s):\n%s" %
4327 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004328 else:
4329 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004330 finally:
4331 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004332 except Alarm:
4333 self.fail("got Alarm in wrong place")
4334 finally:
4335 # no alarm can be pending. Safe to restore old handler.
4336 signal.signal(signal.SIGALRM, old_alarm)
4337
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004338class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004339
4340 def testUDPTimeout(self):
4341 def raise_timeout(*args, **kwargs):
4342 self.serv.settimeout(1.0)
4343 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004344 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004345 "Error generating a timeout exception (UDP)")
4346
4347 def testTimeoutZero(self):
4348 ok = False
4349 try:
4350 self.serv.settimeout(0.0)
4351 foo = self.serv.recv(1024)
4352 except socket.timeout:
4353 self.fail("caught timeout instead of error (UDP)")
4354 except socket.error:
4355 ok = True
4356 except:
4357 self.fail("caught unexpected exception (UDP)")
4358 if not ok:
4359 self.fail("recv() returned success when we did not expect it")
4360
4361class TestExceptions(unittest.TestCase):
4362
4363 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004364 self.assertTrue(issubclass(socket.error, Exception))
4365 self.assertTrue(issubclass(socket.herror, socket.error))
4366 self.assertTrue(issubclass(socket.gaierror, socket.error))
4367 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004368
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004369class TestLinuxAbstractNamespace(unittest.TestCase):
4370
4371 UNIX_PATH_MAX = 108
4372
4373 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004374 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004375 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4376 s1.bind(address)
4377 s1.listen(1)
4378 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4379 s2.connect(s1.getsockname())
4380 with s1.accept()[0] as s3:
4381 self.assertEqual(s1.getsockname(), address)
4382 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004383
4384 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004385 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004386 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4387 s.bind(address)
4388 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004389
4390 def testNameOverflow(self):
4391 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004392 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4393 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004394
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004395 def testStrName(self):
4396 # Check that an abstract name can be passed as a string.
4397 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4398 try:
4399 s.bind("\x00python\x00test\x00")
4400 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4401 finally:
4402 s.close()
4403
4404class TestUnixDomain(unittest.TestCase):
4405
4406 def setUp(self):
4407 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4408
4409 def tearDown(self):
4410 self.sock.close()
4411
4412 def encoded(self, path):
4413 # Return the given path encoded in the file system encoding,
4414 # or skip the test if this is not possible.
4415 try:
4416 return os.fsencode(path)
4417 except UnicodeEncodeError:
4418 self.skipTest(
4419 "Pathname {0!a} cannot be represented in file "
4420 "system encoding {1!r}".format(
4421 path, sys.getfilesystemencoding()))
4422
Antoine Pitrou16374872011-12-16 15:04:12 +01004423 def bind(self, sock, path):
4424 # Bind the socket
4425 try:
4426 sock.bind(path)
4427 except OSError as e:
4428 if str(e) == "AF_UNIX path too long":
4429 self.skipTest(
4430 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4431 .format(path))
4432 else:
4433 raise
4434
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004435 def testStrAddr(self):
4436 # Test binding to and retrieving a normal string pathname.
4437 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004438 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004439 self.addCleanup(support.unlink, path)
4440 self.assertEqual(self.sock.getsockname(), path)
4441
4442 def testBytesAddr(self):
4443 # Test binding to a bytes pathname.
4444 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004445 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004446 self.addCleanup(support.unlink, path)
4447 self.assertEqual(self.sock.getsockname(), path)
4448
4449 def testSurrogateescapeBind(self):
4450 # Test binding to a valid non-ASCII pathname, with the
4451 # non-ASCII bytes supplied using surrogateescape encoding.
4452 path = os.path.abspath(support.TESTFN_UNICODE)
4453 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004454 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004455 self.addCleanup(support.unlink, path)
4456 self.assertEqual(self.sock.getsockname(), path)
4457
4458 def testUnencodableAddr(self):
4459 # Test binding to a pathname that cannot be encoded in the
4460 # file system encoding.
4461 if support.TESTFN_UNENCODABLE is None:
4462 self.skipTest("No unencodable filename available")
4463 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004464 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004465 self.addCleanup(support.unlink, path)
4466 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004467
Victor Stinner45df8202010-04-28 22:31:17 +00004468@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004469class BufferIOTest(SocketConnectedTest):
4470 """
4471 Test the buffer versions of socket.recv() and socket.send().
4472 """
4473 def __init__(self, methodName='runTest'):
4474 SocketConnectedTest.__init__(self, methodName=methodName)
4475
Antoine Pitrou25480782010-03-17 22:50:28 +00004476 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004477 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004478 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004479 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004480 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004481 self.assertEqual(msg, MSG)
4482
Antoine Pitrou25480782010-03-17 22:50:28 +00004483 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004484 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004485 self.serv_conn.send(buf)
4486
Antoine Pitrou25480782010-03-17 22:50:28 +00004487 def testRecvIntoBytearray(self):
4488 buf = bytearray(1024)
4489 nbytes = self.cli_conn.recv_into(buf)
4490 self.assertEqual(nbytes, len(MSG))
4491 msg = buf[:len(MSG)]
4492 self.assertEqual(msg, MSG)
4493
4494 _testRecvIntoBytearray = _testRecvIntoArray
4495
4496 def testRecvIntoMemoryview(self):
4497 buf = bytearray(1024)
4498 nbytes = self.cli_conn.recv_into(memoryview(buf))
4499 self.assertEqual(nbytes, len(MSG))
4500 msg = buf[:len(MSG)]
4501 self.assertEqual(msg, MSG)
4502
4503 _testRecvIntoMemoryview = _testRecvIntoArray
4504
4505 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004506 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004507 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004508 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004509 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004510 self.assertEqual(msg, MSG)
4511
Antoine Pitrou25480782010-03-17 22:50:28 +00004512 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004513 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004514 self.serv_conn.send(buf)
4515
Antoine Pitrou25480782010-03-17 22:50:28 +00004516 def testRecvFromIntoBytearray(self):
4517 buf = bytearray(1024)
4518 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4519 self.assertEqual(nbytes, len(MSG))
4520 msg = buf[:len(MSG)]
4521 self.assertEqual(msg, MSG)
4522
4523 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4524
4525 def testRecvFromIntoMemoryview(self):
4526 buf = bytearray(1024)
4527 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4528 self.assertEqual(nbytes, len(MSG))
4529 msg = buf[:len(MSG)]
4530 self.assertEqual(msg, MSG)
4531
4532 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4533
Christian Heimes043d6f62008-01-07 17:19:16 +00004534
4535TIPC_STYPE = 2000
4536TIPC_LOWER = 200
4537TIPC_UPPER = 210
4538
4539def isTipcAvailable():
4540 """Check if the TIPC module is loaded
4541
4542 The TIPC module is not loaded automatically on Ubuntu and probably
4543 other Linux distros.
4544 """
4545 if not hasattr(socket, "AF_TIPC"):
4546 return False
4547 if not os.path.isfile("/proc/modules"):
4548 return False
4549 with open("/proc/modules") as f:
4550 for line in f:
4551 if line.startswith("tipc "):
4552 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004553 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004554 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4555 return False
4556
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004557class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004558 def testRDM(self):
4559 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4560 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004561 self.addCleanup(srv.close)
4562 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004563
4564 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4565 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4566 TIPC_LOWER, TIPC_UPPER)
4567 srv.bind(srvaddr)
4568
4569 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4570 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4571 cli.sendto(MSG, sendaddr)
4572
4573 msg, recvaddr = srv.recvfrom(1024)
4574
4575 self.assertEqual(cli.getsockname(), recvaddr)
4576 self.assertEqual(msg, MSG)
4577
4578
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004579class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004580 def __init__(self, methodName = 'runTest'):
4581 unittest.TestCase.__init__(self, methodName = methodName)
4582 ThreadableTest.__init__(self)
4583
4584 def setUp(self):
4585 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004586 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004587 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4588 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4589 TIPC_LOWER, TIPC_UPPER)
4590 self.srv.bind(srvaddr)
4591 self.srv.listen(5)
4592 self.serverExplicitReady()
4593 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004594 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004595
4596 def clientSetUp(self):
4597 # The is a hittable race between serverExplicitReady() and the
4598 # accept() call; sleep a little while to avoid it, otherwise
4599 # we could get an exception
4600 time.sleep(0.1)
4601 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004602 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004603 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4604 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4605 self.cli.connect(addr)
4606 self.cliaddr = self.cli.getsockname()
4607
4608 def testStream(self):
4609 msg = self.conn.recv(1024)
4610 self.assertEqual(msg, MSG)
4611 self.assertEqual(self.cliaddr, self.connaddr)
4612
4613 def _testStream(self):
4614 self.cli.send(MSG)
4615 self.cli.close()
4616
4617
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004618@unittest.skipUnless(thread, 'Threading required for this test.')
4619class ContextManagersTest(ThreadedTCPSocketTest):
4620
4621 def _testSocketClass(self):
4622 # base test
4623 with socket.socket() as sock:
4624 self.assertFalse(sock._closed)
4625 self.assertTrue(sock._closed)
4626 # close inside with block
4627 with socket.socket() as sock:
4628 sock.close()
4629 self.assertTrue(sock._closed)
4630 # exception inside with block
4631 with socket.socket() as sock:
4632 self.assertRaises(socket.error, sock.sendall, b'foo')
4633 self.assertTrue(sock._closed)
4634
4635 def testCreateConnectionBase(self):
4636 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004637 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004638 data = conn.recv(1024)
4639 conn.sendall(data)
4640
4641 def _testCreateConnectionBase(self):
4642 address = self.serv.getsockname()
4643 with socket.create_connection(address) as sock:
4644 self.assertFalse(sock._closed)
4645 sock.sendall(b'foo')
4646 self.assertEqual(sock.recv(1024), b'foo')
4647 self.assertTrue(sock._closed)
4648
4649 def testCreateConnectionClose(self):
4650 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004651 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004652 data = conn.recv(1024)
4653 conn.sendall(data)
4654
4655 def _testCreateConnectionClose(self):
4656 address = self.serv.getsockname()
4657 with socket.create_connection(address) as sock:
4658 sock.close()
4659 self.assertTrue(sock._closed)
4660 self.assertRaises(socket.error, sock.sendall, b'foo')
4661
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004662
Antoine Pitroub1c54962010-10-14 15:05:38 +00004663@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4664 "SOCK_CLOEXEC not defined")
4665@unittest.skipUnless(fcntl, "module fcntl not available")
4666class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004667 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004668 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004669 with socket.socket(socket.AF_INET,
4670 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4671 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4672 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004673
4674
4675@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4676 "SOCK_NONBLOCK not defined")
4677class NonblockConstantTest(unittest.TestCase):
4678 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4679 if nonblock:
4680 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4681 self.assertEqual(s.gettimeout(), timeout)
4682 else:
4683 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4684 self.assertEqual(s.gettimeout(), None)
4685
Charles-François Natali239bb962011-06-03 12:55:15 +02004686 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004687 def test_SOCK_NONBLOCK(self):
4688 # a lot of it seems silly and redundant, but I wanted to test that
4689 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004690 with socket.socket(socket.AF_INET,
4691 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4692 self.checkNonblock(s)
4693 s.setblocking(1)
4694 self.checkNonblock(s, False)
4695 s.setblocking(0)
4696 self.checkNonblock(s)
4697 s.settimeout(None)
4698 self.checkNonblock(s, False)
4699 s.settimeout(2.0)
4700 self.checkNonblock(s, timeout=2.0)
4701 s.setblocking(1)
4702 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004703 # defaulttimeout
4704 t = socket.getdefaulttimeout()
4705 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004706 with socket.socket() as s:
4707 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004708 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004709 with socket.socket() as s:
4710 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004711 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004712 with socket.socket() as s:
4713 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004714 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004715 with socket.socket() as s:
4716 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004717 socket.setdefaulttimeout(t)
4718
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004719
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004720@unittest.skipUnless(os.name == "nt", "Windows specific")
4721@unittest.skipUnless(multiprocessing, "need multiprocessing")
4722class TestSocketSharing(SocketTCPTest):
4723 # This must be classmethod and not staticmethod or multiprocessing
4724 # won't be able to bootstrap it.
4725 @classmethod
4726 def remoteProcessServer(cls, q):
4727 # Recreate socket from shared data
4728 sdata = q.get()
4729 message = q.get()
4730
4731 s = socket.fromshare(sdata)
4732 s2, c = s.accept()
4733
4734 # Send the message
4735 s2.sendall(message)
4736 s2.close()
4737 s.close()
4738
4739 def testShare(self):
4740 # Transfer the listening server socket to another process
4741 # and service it from there.
4742
4743 # Create process:
4744 q = multiprocessing.Queue()
4745 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4746 p.start()
4747
4748 # Get the shared socket data
4749 data = self.serv.share(p.pid)
4750
4751 # Pass the shared socket to the other process
4752 addr = self.serv.getsockname()
4753 self.serv.close()
4754 q.put(data)
4755
4756 # The data that the server will send us
4757 message = b"slapmahfro"
4758 q.put(message)
4759
4760 # Connect
4761 s = socket.create_connection(addr)
4762 # listen for the data
4763 m = []
4764 while True:
4765 data = s.recv(100)
4766 if not data:
4767 break
4768 m.append(data)
4769 s.close()
4770 received = b"".join(m)
4771 self.assertEqual(received, message)
4772 p.join()
4773
4774 def testShareLength(self):
4775 data = self.serv.share(os.getpid())
4776 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4777 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4778
4779 def compareSockets(self, org, other):
4780 # socket sharing is expected to work only for blocking socket
4781 # since the internal python timout value isn't transfered.
4782 self.assertEqual(org.gettimeout(), None)
4783 self.assertEqual(org.gettimeout(), other.gettimeout())
4784
4785 self.assertEqual(org.family, other.family)
4786 self.assertEqual(org.type, other.type)
4787 # If the user specified "0" for proto, then
4788 # internally windows will have picked the correct value.
4789 # Python introspection on the socket however will still return
4790 # 0. For the shared socket, the python value is recreated
4791 # from the actual value, so it may not compare correctly.
4792 if org.proto != 0:
4793 self.assertEqual(org.proto, other.proto)
4794
4795 def testShareLocal(self):
4796 data = self.serv.share(os.getpid())
4797 s = socket.fromshare(data)
4798 try:
4799 self.compareSockets(self.serv, s)
4800 finally:
4801 s.close()
4802
4803 def testTypes(self):
4804 families = [socket.AF_INET, socket.AF_INET6]
4805 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4806 for f in families:
4807 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00004808 try:
4809 source = socket.socket(f, t)
4810 except OSError:
4811 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004812 try:
4813 data = source.share(os.getpid())
4814 shared = socket.fromshare(data)
4815 try:
4816 self.compareSockets(source, shared)
4817 finally:
4818 shared.close()
4819 finally:
4820 source.close()
4821
4822
Guido van Rossumb995eb72002-07-31 16:08:40 +00004823def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004824 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004825 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004826
4827 tests.extend([
4828 NonBlockingTCPTests,
4829 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004830 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004831 UnbufferedFileObjectClassTestCase,
4832 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004833 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004834 UnicodeReadFileObjectClassTestCase,
4835 UnicodeWriteFileObjectClassTestCase,
4836 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004837 NetworkConnectionNoServer,
4838 NetworkConnectionAttributesTest,
4839 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004840 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004841 CloexecConstantTest,
4842 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004843 ])
Dave Cole331708b2004-08-09 04:51:41 +00004844 if hasattr(socket, "socketpair"):
4845 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004846 if hasattr(socket, "AF_UNIX"):
4847 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004848 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004849 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004850 if isTipcAvailable():
4851 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004852 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004853 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004854 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004855 tests.extend([
4856 CmsgMacroTests,
4857 SendmsgUDPTest,
4858 RecvmsgUDPTest,
4859 RecvmsgIntoUDPTest,
4860 SendmsgUDP6Test,
4861 RecvmsgUDP6Test,
4862 RecvmsgRFC3542AncillaryUDP6Test,
4863 RecvmsgIntoRFC3542AncillaryUDP6Test,
4864 RecvmsgIntoUDP6Test,
4865 SendmsgTCPTest,
4866 RecvmsgTCPTest,
4867 RecvmsgIntoTCPTest,
4868 SendmsgSCTPStreamTest,
4869 RecvmsgSCTPStreamTest,
4870 RecvmsgIntoSCTPStreamTest,
4871 SendmsgUnixStreamTest,
4872 RecvmsgUnixStreamTest,
4873 RecvmsgIntoUnixStreamTest,
4874 RecvmsgSCMRightsStreamTest,
4875 RecvmsgIntoSCMRightsStreamTest,
4876 # These are slow when setitimer() is not available
4877 InterruptedRecvTimeoutTest,
4878 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004879 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004880 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004881
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004882 thread_info = support.threading_setup()
4883 support.run_unittest(*tests)
4884 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004885
4886if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004887 test_main()