blob: b5e0dc219dafb7ba66657cff9cd535115b53f6b5 [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
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +100010import tempfile
11import _testcapi
Christian Heimesbbe741d2008-03-28 10:53:29 +000012import time
13import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000014import queue
Jack Jansen522e7692002-09-06 21:57:50 +000015import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000016import os
17import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000018import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000019import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000020from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000021import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000022import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010023import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020024import struct
Antoine Pitroub1c54962010-10-14 15:05:38 +000025try:
26 import fcntl
27except ImportError:
28 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000029
Benjamin Petersonee8712c2008-05-20 21:35:26 +000030HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000031MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000032
Victor Stinner45df8202010-04-28 22:31:17 +000033try:
34 import _thread as thread
35 import threading
36except ImportError:
37 thread = None
38 threading = None
39
Charles-François Natali47413c12011-10-06 19:47:44 +020040def _have_socket_can():
41 """Check whether CAN sockets are supported on this host."""
42 try:
43 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
44 except (AttributeError, socket.error, OSError):
45 return False
46 else:
47 s.close()
48 return True
49
Charles-François Natali10b8cf42011-11-10 19:21:37 +010050def _have_socket_rds():
51 """Check whether RDS sockets are supported on this host."""
52 try:
53 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
54 except (AttributeError, OSError):
55 return False
56 else:
57 s.close()
58 return True
59
Charles-François Natali47413c12011-10-06 19:47:44 +020060HAVE_SOCKET_CAN = _have_socket_can()
61
Charles-François Natali10b8cf42011-11-10 19:21:37 +010062HAVE_SOCKET_RDS = _have_socket_rds()
63
Nick Coghlan96fe56a2011-08-22 11:55:57 +100064# Size in bytes of the int type
65SIZEOF_INT = array.array("i").itemsize
66
Guido van Rossum24e4af82002-06-12 19:18:08 +000067class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000068
Guido van Rossum24e4af82002-06-12 19:18:08 +000069 def setUp(self):
70 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000071 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000072 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000073
Guido van Rossum24e4af82002-06-12 19:18:08 +000074 def tearDown(self):
75 self.serv.close()
76 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000077
Guido van Rossum24e4af82002-06-12 19:18:08 +000078class SocketUDPTest(unittest.TestCase):
79
80 def setUp(self):
81 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000082 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000083
84 def tearDown(self):
85 self.serv.close()
86 self.serv = None
87
Nick Coghlan96fe56a2011-08-22 11:55:57 +100088class ThreadSafeCleanupTestCase(unittest.TestCase):
89 """Subclass of unittest.TestCase with thread-safe cleanup methods.
90
91 This subclass protects the addCleanup() and doCleanups() methods
92 with a recursive lock.
93 """
94
95 if threading:
96 def __init__(self, *args, **kwargs):
97 super().__init__(*args, **kwargs)
98 self._cleanup_lock = threading.RLock()
99
100 def addCleanup(self, *args, **kwargs):
101 with self._cleanup_lock:
102 return super().addCleanup(*args, **kwargs)
103
104 def doCleanups(self, *args, **kwargs):
105 with self._cleanup_lock:
106 return super().doCleanups(*args, **kwargs)
107
Charles-François Natali47413c12011-10-06 19:47:44 +0200108class SocketCANTest(unittest.TestCase):
109
110 """To be able to run this test, a `vcan0` CAN interface can be created with
111 the following commands:
112 # modprobe vcan
113 # ip link add dev vcan0 type vcan
114 # ifconfig vcan0 up
115 """
116 interface = 'vcan0'
117 bufsize = 128
118
119 def setUp(self):
120 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200121 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200122 try:
123 self.s.bind((self.interface,))
124 except socket.error:
125 self.skipTest('network interface `%s` does not exist' %
126 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200127
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100128
129class SocketRDSTest(unittest.TestCase):
130
131 """To be able to run this test, the `rds` kernel module must be loaded:
132 # modprobe rds
133 """
134 bufsize = 8192
135
136 def setUp(self):
137 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
138 self.addCleanup(self.serv.close)
139 try:
140 self.port = support.bind_port(self.serv)
141 except OSError:
142 self.skipTest('unable to bind RDS socket')
143
144
Guido van Rossum24e4af82002-06-12 19:18:08 +0000145class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000146 """Threadable Test class
147
148 The ThreadableTest class makes it easy to create a threaded
149 client/server pair from an existing unit test. To create a
150 new threaded class from an existing unit test, use multiple
151 inheritance:
152
153 class NewClass (OldClass, ThreadableTest):
154 pass
155
156 This class defines two new fixture functions with obvious
157 purposes for overriding:
158
159 clientSetUp ()
160 clientTearDown ()
161
162 Any new test functions within the class must then define
163 tests in pairs, where the test name is preceeded with a
164 '_' to indicate the client portion of the test. Ex:
165
166 def testFoo(self):
167 # Server portion
168
169 def _testFoo(self):
170 # Client portion
171
172 Any exceptions raised by the clients during their tests
173 are caught and transferred to the main thread to alert
174 the testing framework.
175
176 Note, the server setup function cannot call any blocking
177 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000178 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000179 the blocking call (such as in setting up a client/server
180 connection and performing the accept() in setUp().
181 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000182
183 def __init__(self):
184 # Swap the true setup function
185 self.__setUp = self.setUp
186 self.__tearDown = self.tearDown
187 self.setUp = self._setUp
188 self.tearDown = self._tearDown
189
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000190 def serverExplicitReady(self):
191 """This method allows the server to explicitly indicate that
192 it wants the client thread to proceed. This is useful if the
193 server is about to execute a blocking routine that is
194 dependent upon the client thread during its setup routine."""
195 self.server_ready.set()
196
Guido van Rossum24e4af82002-06-12 19:18:08 +0000197 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000198 self.server_ready = threading.Event()
199 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000200 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000201 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200202 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000203
204 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000205 methodname = self.id()
206 i = methodname.rfind('.')
207 methodname = methodname[i+1:]
208 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000209 self.client_thread = thread.start_new_thread(
210 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000211
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200212 try:
213 self.__setUp()
214 except:
215 self.server_crashed = True
216 raise
217 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000218 self.server_ready.set()
219 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000220
221 def _tearDown(self):
222 self.__tearDown()
223 self.done.wait()
224
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000225 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000226 exc = self.queue.get()
227 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000228
229 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000230 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000231 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200232 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200233 if self.server_crashed:
234 self.clientTearDown()
235 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000236 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000237 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000238 try:
239 test_func()
Nick Coghlan2496f332011-09-19 20:26:31 +1000240 except unittest._ExpectedFailure:
241 # We deliberately ignore expected failures
242 pass
Antoine Pitrou98b46702010-09-18 22:59:00 +0000243 except BaseException as e:
244 self.queue.put(e)
245 finally:
246 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000247
248 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000249 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250
251 def clientTearDown(self):
252 self.done.set()
253 thread.exit()
254
255class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
256
257 def __init__(self, methodName='runTest'):
258 SocketTCPTest.__init__(self, methodName=methodName)
259 ThreadableTest.__init__(self)
260
261 def clientSetUp(self):
262 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
263
264 def clientTearDown(self):
265 self.cli.close()
266 self.cli = None
267 ThreadableTest.clientTearDown(self)
268
269class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
270
271 def __init__(self, methodName='runTest'):
272 SocketUDPTest.__init__(self, methodName=methodName)
273 ThreadableTest.__init__(self)
274
275 def clientSetUp(self):
276 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
277
Brian Curtin3beb38f2010-11-04 03:41:43 +0000278 def clientTearDown(self):
279 self.cli.close()
280 self.cli = None
281 ThreadableTest.clientTearDown(self)
282
Charles-François Natali47413c12011-10-06 19:47:44 +0200283class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
284
285 def __init__(self, methodName='runTest'):
286 SocketCANTest.__init__(self, methodName=methodName)
287 ThreadableTest.__init__(self)
288
289 def clientSetUp(self):
290 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
291 try:
292 self.cli.bind((self.interface,))
293 except socket.error:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200294 # skipTest should not be called here, and will be called in the
295 # server instead
296 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200297
298 def clientTearDown(self):
299 self.cli.close()
300 self.cli = None
301 ThreadableTest.clientTearDown(self)
302
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100303class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
304
305 def __init__(self, methodName='runTest'):
306 SocketRDSTest.__init__(self, methodName=methodName)
307 ThreadableTest.__init__(self)
308 self.evt = threading.Event()
309
310 def clientSetUp(self):
311 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
312 try:
313 # RDS sockets must be bound explicitly to send or receive data
314 self.cli.bind((HOST, 0))
315 self.cli_addr = self.cli.getsockname()
316 except OSError:
317 # skipTest should not be called here, and will be called in the
318 # server instead
319 pass
320
321 def clientTearDown(self):
322 self.cli.close()
323 self.cli = None
324 ThreadableTest.clientTearDown(self)
325
Guido van Rossum24e4af82002-06-12 19:18:08 +0000326class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000327 """Socket tests for client-server connection.
328
329 self.cli_conn is a client socket connected to the server. The
330 setUp() method guarantees that it is connected to the server.
331 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000332
333 def __init__(self, methodName='runTest'):
334 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
335
336 def setUp(self):
337 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000338 # Indicate explicitly we're ready for the client thread to
339 # proceed and then perform the blocking call to accept
340 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000341 conn, addr = self.serv.accept()
342 self.cli_conn = conn
343
344 def tearDown(self):
345 self.cli_conn.close()
346 self.cli_conn = None
347 ThreadedTCPSocketTest.tearDown(self)
348
349 def clientSetUp(self):
350 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000351 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000352 self.serv_conn = self.cli
353
354 def clientTearDown(self):
355 self.serv_conn.close()
356 self.serv_conn = None
357 ThreadedTCPSocketTest.clientTearDown(self)
358
Dave Cole331708b2004-08-09 04:51:41 +0000359class SocketPairTest(unittest.TestCase, ThreadableTest):
360
361 def __init__(self, methodName='runTest'):
362 unittest.TestCase.__init__(self, methodName=methodName)
363 ThreadableTest.__init__(self)
364
365 def setUp(self):
366 self.serv, self.cli = socket.socketpair()
367
368 def tearDown(self):
369 self.serv.close()
370 self.serv = None
371
372 def clientSetUp(self):
373 pass
374
375 def clientTearDown(self):
376 self.cli.close()
377 self.cli = None
378 ThreadableTest.clientTearDown(self)
379
Tim Peters494aaee2004-08-09 18:54:11 +0000380
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000381# The following classes are used by the sendmsg()/recvmsg() tests.
382# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
383# gives a drop-in replacement for SocketConnectedTest, but different
384# address families can be used, and the attributes serv_addr and
385# cli_addr will be set to the addresses of the endpoints.
386
387class SocketTestBase(unittest.TestCase):
388 """A base class for socket tests.
389
390 Subclasses must provide methods newSocket() to return a new socket
391 and bindSock(sock) to bind it to an unused address.
392
393 Creates a socket self.serv and sets self.serv_addr to its address.
394 """
395
396 def setUp(self):
397 self.serv = self.newSocket()
398 self.bindServer()
399
400 def bindServer(self):
401 """Bind server socket and set self.serv_addr to its address."""
402 self.bindSock(self.serv)
403 self.serv_addr = self.serv.getsockname()
404
405 def tearDown(self):
406 self.serv.close()
407 self.serv = None
408
409
410class SocketListeningTestMixin(SocketTestBase):
411 """Mixin to listen on the server socket."""
412
413 def setUp(self):
414 super().setUp()
415 self.serv.listen(1)
416
417
418class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
419 ThreadableTest):
420 """Mixin to add client socket and allow client/server tests.
421
422 Client socket is self.cli and its address is self.cli_addr. See
423 ThreadableTest for usage information.
424 """
425
426 def __init__(self, *args, **kwargs):
427 super().__init__(*args, **kwargs)
428 ThreadableTest.__init__(self)
429
430 def clientSetUp(self):
431 self.cli = self.newClientSocket()
432 self.bindClient()
433
434 def newClientSocket(self):
435 """Return a new socket for use as client."""
436 return self.newSocket()
437
438 def bindClient(self):
439 """Bind client socket and set self.cli_addr to its address."""
440 self.bindSock(self.cli)
441 self.cli_addr = self.cli.getsockname()
442
443 def clientTearDown(self):
444 self.cli.close()
445 self.cli = None
446 ThreadableTest.clientTearDown(self)
447
448
449class ConnectedStreamTestMixin(SocketListeningTestMixin,
450 ThreadedSocketTestMixin):
451 """Mixin to allow client/server stream tests with connected client.
452
453 Server's socket representing connection to client is self.cli_conn
454 and client's connection to server is self.serv_conn. (Based on
455 SocketConnectedTest.)
456 """
457
458 def setUp(self):
459 super().setUp()
460 # Indicate explicitly we're ready for the client thread to
461 # proceed and then perform the blocking call to accept
462 self.serverExplicitReady()
463 conn, addr = self.serv.accept()
464 self.cli_conn = conn
465
466 def tearDown(self):
467 self.cli_conn.close()
468 self.cli_conn = None
469 super().tearDown()
470
471 def clientSetUp(self):
472 super().clientSetUp()
473 self.cli.connect(self.serv_addr)
474 self.serv_conn = self.cli
475
476 def clientTearDown(self):
477 self.serv_conn.close()
478 self.serv_conn = None
479 super().clientTearDown()
480
481
482class UnixSocketTestBase(SocketTestBase):
483 """Base class for Unix-domain socket tests."""
484
485 # This class is used for file descriptor passing tests, so we
486 # create the sockets in a private directory so that other users
487 # can't send anything that might be problematic for a privileged
488 # user running the tests.
489
490 def setUp(self):
491 self.dir_path = tempfile.mkdtemp()
492 self.addCleanup(os.rmdir, self.dir_path)
493 super().setUp()
494
495 def bindSock(self, sock):
496 path = tempfile.mktemp(dir=self.dir_path)
497 sock.bind(path)
498 self.addCleanup(support.unlink, path)
499
500class UnixStreamBase(UnixSocketTestBase):
501 """Base class for Unix-domain SOCK_STREAM tests."""
502
503 def newSocket(self):
504 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
505
506
507class InetTestBase(SocketTestBase):
508 """Base class for IPv4 socket tests."""
509
510 host = HOST
511
512 def setUp(self):
513 super().setUp()
514 self.port = self.serv_addr[1]
515
516 def bindSock(self, sock):
517 support.bind_port(sock, host=self.host)
518
519class TCPTestBase(InetTestBase):
520 """Base class for TCP-over-IPv4 tests."""
521
522 def newSocket(self):
523 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
524
525class UDPTestBase(InetTestBase):
526 """Base class for UDP-over-IPv4 tests."""
527
528 def newSocket(self):
529 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
530
531class SCTPStreamBase(InetTestBase):
532 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
533
534 def newSocket(self):
535 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
536 socket.IPPROTO_SCTP)
537
538
539class Inet6TestBase(InetTestBase):
540 """Base class for IPv6 socket tests."""
541
542 # Don't use "localhost" here - it may not have an IPv6 address
543 # assigned to it by default (e.g. in /etc/hosts), and if someone
544 # has assigned it an IPv4-mapped address, then it's unlikely to
545 # work with the full IPv6 API.
546 host = "::1"
547
548class UDP6TestBase(Inet6TestBase):
549 """Base class for UDP-over-IPv6 tests."""
550
551 def newSocket(self):
552 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
553
554
555# Test-skipping decorators for use with ThreadableTest.
556
557def skipWithClientIf(condition, reason):
558 """Skip decorated test if condition is true, add client_skip decorator.
559
560 If the decorated object is not a class, sets its attribute
561 "client_skip" to a decorator which will return an empty function
562 if the test is to be skipped, or the original function if it is
563 not. This can be used to avoid running the client part of a
564 skipped test when using ThreadableTest.
565 """
566 def client_pass(*args, **kwargs):
567 pass
568 def skipdec(obj):
569 retval = unittest.skip(reason)(obj)
570 if not isinstance(obj, type):
571 retval.client_skip = lambda f: client_pass
572 return retval
573 def noskipdec(obj):
574 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
575 obj.client_skip = lambda f: f
576 return obj
577 return skipdec if condition else noskipdec
578
579
580def requireAttrs(obj, *attributes):
581 """Skip decorated test if obj is missing any of the given attributes.
582
583 Sets client_skip attribute as skipWithClientIf() does.
584 """
585 missing = [name for name in attributes if not hasattr(obj, name)]
586 return skipWithClientIf(
587 missing, "don't have " + ", ".join(name for name in missing))
588
589
590def requireSocket(*args):
591 """Skip decorated test if a socket cannot be created with given arguments.
592
593 When an argument is given as a string, will use the value of that
594 attribute of the socket module, or skip the test if it doesn't
595 exist. Sets client_skip attribute as skipWithClientIf() does.
596 """
597 err = None
598 missing = [obj for obj in args if
599 isinstance(obj, str) and not hasattr(socket, obj)]
600 if missing:
601 err = "don't have " + ", ".join(name for name in missing)
602 else:
603 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
604 for obj in args]
605 try:
606 s = socket.socket(*callargs)
607 except socket.error as e:
608 # XXX: check errno?
609 err = str(e)
610 else:
611 s.close()
612 return skipWithClientIf(
613 err is not None,
614 "can't create socket({0}): {1}".format(
615 ", ".join(str(o) for o in args), err))
616
617
Guido van Rossum24e4af82002-06-12 19:18:08 +0000618#######################################################################
619## Begin Tests
620
621class GeneralModuleTests(unittest.TestCase):
622
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000623 def test_repr(self):
624 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000625 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000626 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000627
Raymond Hettinger027bb632004-05-31 03:09:25 +0000628 def test_weakref(self):
629 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
630 p = proxy(s)
631 self.assertEqual(p.fileno(), s.fileno())
632 s.close()
633 s = None
634 try:
635 p.fileno()
636 except ReferenceError:
637 pass
638 else:
639 self.fail('Socket proxy still exists')
640
Guido van Rossum24e4af82002-06-12 19:18:08 +0000641 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000642 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300643 msg = "Error raising socket exception (%s)."
644 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000645 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300646 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000647 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300648 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000649 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000650
Ezio Melotti63e42302011-05-07 19:47:48 +0300651 def testSendtoErrors(self):
652 # Testing that sendto doens't masks failures. See #10169.
653 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
654 self.addCleanup(s.close)
655 s.bind(('', 0))
656 sockname = s.getsockname()
657 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300658 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300659 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300660 self.assertEqual(str(cm.exception),
661 "'str' does not support the buffer interface")
662 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300663 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300664 self.assertEqual(str(cm.exception),
665 "'complex' does not support the buffer interface")
666 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300667 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300668 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300669 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300670 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300671 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300672 self.assertEqual(str(cm.exception),
673 "'str' does not support the buffer interface")
674 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300675 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300676 self.assertEqual(str(cm.exception),
677 "'complex' does not support the buffer interface")
678 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300679 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300680 self.assertIn('not NoneType', str(cm.exception))
681 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300682 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300683 self.assertIn('an integer is required', str(cm.exception))
684 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300685 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300686 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300687 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300688 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300689 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300690 self.assertIn('(1 given)', str(cm.exception))
691 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300692 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300693 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300694
Guido van Rossum24e4af82002-06-12 19:18:08 +0000695 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000696 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000697 socket.AF_INET
698 socket.SOCK_STREAM
699 socket.SOCK_DGRAM
700 socket.SOCK_RAW
701 socket.SOCK_RDM
702 socket.SOCK_SEQPACKET
703 socket.SOL_SOCKET
704 socket.SO_REUSEADDR
705
Guido van Rossum654c11e2002-06-13 20:24:17 +0000706 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000707 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000708 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000709 try:
710 ip = socket.gethostbyname(hostname)
711 except socket.error:
712 # Probably name lookup wasn't set up right; skip this test
713 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000714 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000715 try:
716 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
717 except socket.error:
718 # Probably a similar problem as above; skip this test
719 return
Brett Cannon01668a12005-03-11 00:04:17 +0000720 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000721 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000722 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000723 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000724
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000725 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
726 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
727 def test_sethostname(self):
728 oldhn = socket.gethostname()
729 try:
730 socket.sethostname('new')
731 except socket.error as e:
732 if e.errno == errno.EPERM:
733 self.skipTest("test should be run as root")
734 else:
735 raise
736 try:
737 # running test as root!
738 self.assertEqual(socket.gethostname(), 'new')
739 # Should work with bytes objects too
740 socket.sethostname(b'bar')
741 self.assertEqual(socket.gethostname(), 'bar')
742 finally:
743 socket.sethostname(oldhn)
744
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700745 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
746 'socket.if_nameindex() not available.')
747 def testInterfaceNameIndex(self):
748 interfaces = socket.if_nameindex()
749 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200750 self.assertIsInstance(index, int)
751 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700752 # interface indices are non-zero integers
753 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200754 _index = socket.if_nametoindex(name)
755 self.assertIsInstance(_index, int)
756 self.assertEqual(index, _index)
757 _name = socket.if_indextoname(index)
758 self.assertIsInstance(_name, str)
759 self.assertEqual(name, _name)
760
761 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
762 'socket.if_nameindex() not available.')
763 def testInvalidInterfaceNameIndex(self):
764 # test nonexistent interface index/name
765 self.assertRaises(socket.error, socket.if_indextoname, 0)
766 self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
767 # test with invalid values
768 self.assertRaises(TypeError, socket.if_nametoindex, 0)
769 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700770
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000771 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000772 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000773 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000774 try:
775 # On some versions, this loses a reference
776 orig = sys.getrefcount(__name__)
777 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000778 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000779 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000780 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000781
Guido van Rossum24e4af82002-06-12 19:18:08 +0000782 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000783 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784 try:
785 # On some versions, this crashes the interpreter.
786 socket.getnameinfo(('x', 0, 0, 0), 0)
787 except socket.error:
788 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000789
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000790 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000791 # This just checks that htons etc. are their own inverse,
792 # when looking at the lower 16 or 32 bits.
793 sizes = {socket.htonl: 32, socket.ntohl: 32,
794 socket.htons: 16, socket.ntohs: 16}
795 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000796 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000797 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
798 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000799
Guido van Rossuma2627af2002-09-14 00:58:46 +0000800 swapped = func(mask)
801 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000802 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000803
Guido van Rossum018919a2007-01-15 00:07:32 +0000804 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000805 good_values = [ 1, 2, 3, 1, 2, 3 ]
806 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000807 for k in good_values:
808 socket.ntohl(k)
809 socket.ntohs(k)
810 socket.htonl(k)
811 socket.htons(k)
812 for k in bad_values:
813 self.assertRaises(OverflowError, socket.ntohl, k)
814 self.assertRaises(OverflowError, socket.ntohs, k)
815 self.assertRaises(OverflowError, socket.htonl, k)
816 self.assertRaises(OverflowError, socket.htons, k)
817
Barry Warsaw11b91a02004-06-28 00:50:43 +0000818 def testGetServBy(self):
819 eq = self.assertEqual
820 # Find one service that exists, then check all the related interfaces.
821 # I've ordered this by protocols that have both a tcp and udp
822 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200823 if (sys.platform.startswith(('freebsd', 'netbsd'))
824 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000825 # avoid the 'echo' service on this platform, as there is an
826 # assumption breaking non-standard port/protocol entry
827 services = ('daytime', 'qotd', 'domain')
828 else:
829 services = ('echo', 'daytime', 'domain')
830 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000831 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000832 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000833 break
834 except socket.error:
835 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000836 else:
837 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000838 # Try same call with optional protocol omitted
839 port2 = socket.getservbyname(service)
840 eq(port, port2)
841 # Try udp, but don't barf it it doesn't exist
842 try:
843 udpport = socket.getservbyname(service, 'udp')
844 except socket.error:
845 udpport = None
846 else:
847 eq(udpport, port)
848 # Now make sure the lookup by port returns the same service name
849 eq(socket.getservbyport(port2), service)
850 eq(socket.getservbyport(port, 'tcp'), service)
851 if udpport is not None:
852 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000853 # Make sure getservbyport does not accept out of range ports.
854 self.assertRaises(OverflowError, socket.getservbyport, -1)
855 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000856
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000857 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000858 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000859 # The default timeout should initially be None
860 self.assertEqual(socket.getdefaulttimeout(), None)
861 s = socket.socket()
862 self.assertEqual(s.gettimeout(), None)
863 s.close()
864
865 # Set the default timeout to 10, and see if it propagates
866 socket.setdefaulttimeout(10)
867 self.assertEqual(socket.getdefaulttimeout(), 10)
868 s = socket.socket()
869 self.assertEqual(s.gettimeout(), 10)
870 s.close()
871
872 # Reset the default timeout to None, and see if it propagates
873 socket.setdefaulttimeout(None)
874 self.assertEqual(socket.getdefaulttimeout(), None)
875 s = socket.socket()
876 self.assertEqual(s.gettimeout(), None)
877 s.close()
878
879 # Check that setting it to an invalid value raises ValueError
880 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
881
882 # Check that setting it to an invalid type raises TypeError
883 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
884
Benjamin Petersonf91df042009-02-13 02:50:59 +0000885 def testIPv4_inet_aton_fourbytes(self):
886 if not hasattr(socket, 'inet_aton'):
887 return # No inet_aton, nothing to check
888 # Test that issue1008086 and issue767150 are fixed.
889 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000890 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
891 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000892
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000893 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000894 if not hasattr(socket, 'inet_pton'):
895 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000896 from socket import inet_aton as f, inet_pton, AF_INET
897 g = lambda a: inet_pton(AF_INET, a)
898
Ezio Melottib3aedd42010-11-20 19:04:17 +0000899 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
900 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
901 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
902 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
903 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000904
Ezio Melottib3aedd42010-11-20 19:04:17 +0000905 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
906 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
907 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
908 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000909
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000910 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000911 if not hasattr(socket, 'inet_pton'):
912 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000913 try:
914 from socket import inet_pton, AF_INET6, has_ipv6
915 if not has_ipv6:
916 return
917 except ImportError:
918 return
919 f = lambda a: inet_pton(AF_INET6, a)
920
Ezio Melottib3aedd42010-11-20 19:04:17 +0000921 self.assertEqual(b'\x00' * 16, f('::'))
922 self.assertEqual(b'\x00' * 16, f('0::0'))
923 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
924 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000925 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 +0000926 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
927 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000928
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000929 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000930 if not hasattr(socket, 'inet_ntop'):
931 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000932 from socket import inet_ntoa as f, inet_ntop, AF_INET
933 g = lambda a: inet_ntop(AF_INET, a)
934
Ezio Melottib3aedd42010-11-20 19:04:17 +0000935 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
936 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
937 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
938 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000939
Ezio Melottib3aedd42010-11-20 19:04:17 +0000940 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
941 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
942 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000943
944 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000945 if not hasattr(socket, 'inet_ntop'):
946 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000947 try:
948 from socket import inet_ntop, AF_INET6, has_ipv6
949 if not has_ipv6:
950 return
951 except ImportError:
952 return
953 f = lambda a: inet_ntop(AF_INET6, a)
954
Ezio Melottib3aedd42010-11-20 19:04:17 +0000955 self.assertEqual('::', f(b'\x00' * 16))
956 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
957 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000958 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000959 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 +0000960 )
961
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000962 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000963
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000964 def testSockName(self):
965 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200966 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000967 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000968 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000969 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000970 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000971 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
972 # it reasonable to get the host's addr in addition to 0.0.0.0.
973 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000974 try:
975 my_ip_addr = socket.gethostbyname(socket.gethostname())
976 except socket.error:
977 # Probably name lookup wasn't set up right; skip this test
978 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000979 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000980 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000981
982 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000983 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000984 # We know a socket should start without reuse==0
985 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000986 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000987 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000988 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000989
990 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000991 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000992 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000993 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000994 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
995 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000996 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000997
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000998 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000999 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001000 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1001 sock.settimeout(1)
1002 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +00001003 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001004
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001005 def testNewAttributes(self):
1006 # testing .family, .type and .protocol
1007 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1008 self.assertEqual(sock.family, socket.AF_INET)
1009 self.assertEqual(sock.type, socket.SOCK_STREAM)
1010 self.assertEqual(sock.proto, 0)
1011 sock.close()
1012
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001013 def test_getsockaddrarg(self):
1014 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001015 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001016 big_port = port + 65536
1017 neg_port = port - 65536
1018 sock = socket.socket()
1019 try:
1020 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1021 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1022 sock.bind((host, port))
1023 finally:
1024 sock.close()
1025
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001026 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001027 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001028 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1029 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1030 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1031 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001032 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1033 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001034 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001035 self.assertRaises(ValueError, s.ioctl, -1, None)
1036 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001037
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001038 def testGetaddrinfo(self):
1039 try:
1040 socket.getaddrinfo('localhost', 80)
1041 except socket.gaierror as err:
1042 if err.errno == socket.EAI_SERVICE:
1043 # see http://bugs.python.org/issue1282647
1044 self.skipTest("buggy libc version")
1045 raise
1046 # len of every sequence is supposed to be == 5
1047 for info in socket.getaddrinfo(HOST, None):
1048 self.assertEqual(len(info), 5)
1049 # host can be a domain name, a string representation of an
1050 # IPv4/v6 address or None
1051 socket.getaddrinfo('localhost', 80)
1052 socket.getaddrinfo('127.0.0.1', 80)
1053 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001054 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001055 socket.getaddrinfo('::1', 80)
1056 # port can be a string service name such as "http", a numeric
1057 # port number or None
1058 socket.getaddrinfo(HOST, "http")
1059 socket.getaddrinfo(HOST, 80)
1060 socket.getaddrinfo(HOST, None)
1061 # test family and socktype filters
1062 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
1063 for family, _, _, _, _ in infos:
1064 self.assertEqual(family, socket.AF_INET)
1065 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1066 for _, socktype, _, _, _ in infos:
1067 self.assertEqual(socktype, socket.SOCK_STREAM)
1068 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001069 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001070 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1071 # a server willing to support both IPv4 and IPv6 will
1072 # usually do this
1073 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1074 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001075 # test keyword arguments
1076 a = socket.getaddrinfo(HOST, None)
1077 b = socket.getaddrinfo(host=HOST, port=None)
1078 self.assertEqual(a, b)
1079 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1080 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1081 self.assertEqual(a, b)
1082 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1083 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1084 self.assertEqual(a, b)
1085 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1086 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1087 self.assertEqual(a, b)
1088 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1089 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1090 self.assertEqual(a, b)
1091 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1092 socket.AI_PASSIVE)
1093 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1094 type=socket.SOCK_STREAM, proto=0,
1095 flags=socket.AI_PASSIVE)
1096 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001097 # Issue #6697.
1098 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001099
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001100 def test_getnameinfo(self):
1101 # only IP addresses are allowed
1102 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
1103
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001104 @unittest.skipUnless(support.is_resource_enabled('network'),
1105 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001106 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +00001107 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001108 # these should all be successful
1109 socket.gethostbyname('испытание.python.org')
1110 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001111 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1112 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1113 # have a reverse entry yet
1114 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001115
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001116 def check_sendall_interrupted(self, with_timeout):
1117 # socketpair() is not stricly required, but it makes things easier.
1118 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1119 self.skipTest("signal.alarm and socket.socketpair required for this test")
1120 # Our signal handlers clobber the C errno by calling a math function
1121 # with an invalid domain value.
1122 def ok_handler(*args):
1123 self.assertRaises(ValueError, math.acosh, 0)
1124 def raising_handler(*args):
1125 self.assertRaises(ValueError, math.acosh, 0)
1126 1 // 0
1127 c, s = socket.socketpair()
1128 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1129 try:
1130 if with_timeout:
1131 # Just above the one second minimum for signal.alarm
1132 c.settimeout(1.5)
1133 with self.assertRaises(ZeroDivisionError):
1134 signal.alarm(1)
1135 c.sendall(b"x" * (1024**2))
1136 if with_timeout:
1137 signal.signal(signal.SIGALRM, ok_handler)
1138 signal.alarm(1)
1139 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1140 finally:
1141 signal.signal(signal.SIGALRM, old_alarm)
1142 c.close()
1143 s.close()
1144
1145 def test_sendall_interrupted(self):
1146 self.check_sendall_interrupted(False)
1147
1148 def test_sendall_interrupted_with_timeout(self):
1149 self.check_sendall_interrupted(True)
1150
Antoine Pitroue033e062010-10-29 10:38:18 +00001151 def test_dealloc_warn(self):
1152 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1153 r = repr(sock)
1154 with self.assertWarns(ResourceWarning) as cm:
1155 sock = None
1156 support.gc_collect()
1157 self.assertIn(r, str(cm.warning.args[0]))
1158 # An open socket file object gets dereferenced after the socket
1159 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1160 f = sock.makefile('rb')
1161 r = repr(sock)
1162 sock = None
1163 support.gc_collect()
1164 with self.assertWarns(ResourceWarning):
1165 f = None
1166 support.gc_collect()
1167
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001168 def test_name_closed_socketio(self):
1169 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1170 fp = sock.makefile("rb")
1171 fp.close()
1172 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1173
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001174 def test_pickle(self):
1175 sock = socket.socket()
1176 with sock:
1177 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1178 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1179
Antoine Pitrou3cade992011-05-10 19:19:13 +02001180 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001181 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1182 srv.bind((HOST, 0))
1183 # backlog = 0
1184 srv.listen(0)
1185 srv.close()
1186
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001187
Charles-François Natali47413c12011-10-06 19:47:44 +02001188@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1189class BasicCANTest(unittest.TestCase):
1190
1191 def testCrucialConstants(self):
1192 socket.AF_CAN
1193 socket.PF_CAN
1194 socket.CAN_RAW
1195
1196 def testCreateSocket(self):
1197 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1198 pass
1199
1200 def testBindAny(self):
1201 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1202 s.bind(('', ))
1203
1204 def testTooLongInterfaceName(self):
1205 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1206 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001207 self.assertRaisesRegex(socket.error, 'interface name too long',
1208 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001209
1210 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1211 'socket.CAN_RAW_LOOPBACK required for this test.')
1212 def testLoopback(self):
1213 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1214 for loopback in (0, 1):
1215 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1216 loopback)
1217 self.assertEqual(loopback,
1218 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1219
1220 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1221 'socket.CAN_RAW_FILTER required for this test.')
1222 def testFilter(self):
1223 can_id, can_mask = 0x200, 0x700
1224 can_filter = struct.pack("=II", can_id, can_mask)
1225 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1226 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1227 self.assertEqual(can_filter,
1228 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1229
1230
1231@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1232@unittest.skipUnless(thread, 'Threading required for this test.')
1233class CANTest(ThreadedCANSocketTest):
1234
1235 """The CAN frame structure is defined in <linux/can.h>:
1236
1237 struct can_frame {
1238 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1239 __u8 can_dlc; /* data length code: 0 .. 8 */
1240 __u8 data[8] __attribute__((aligned(8)));
1241 };
1242 """
1243 can_frame_fmt = "=IB3x8s"
1244
1245 def __init__(self, methodName='runTest'):
1246 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1247
1248 @classmethod
1249 def build_can_frame(cls, can_id, data):
1250 """Build a CAN frame."""
1251 can_dlc = len(data)
1252 data = data.ljust(8, b'\x00')
1253 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1254
1255 @classmethod
1256 def dissect_can_frame(cls, frame):
1257 """Dissect a CAN frame."""
1258 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1259 return (can_id, can_dlc, data[:can_dlc])
1260
1261 def testSendFrame(self):
1262 cf, addr = self.s.recvfrom(self.bufsize)
1263 self.assertEqual(self.cf, cf)
1264 self.assertEqual(addr[0], self.interface)
1265 self.assertEqual(addr[1], socket.AF_CAN)
1266
1267 def _testSendFrame(self):
1268 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1269 self.cli.send(self.cf)
1270
1271 def testSendMaxFrame(self):
1272 cf, addr = self.s.recvfrom(self.bufsize)
1273 self.assertEqual(self.cf, cf)
1274
1275 def _testSendMaxFrame(self):
1276 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1277 self.cli.send(self.cf)
1278
1279 def testSendMultiFrames(self):
1280 cf, addr = self.s.recvfrom(self.bufsize)
1281 self.assertEqual(self.cf1, cf)
1282
1283 cf, addr = self.s.recvfrom(self.bufsize)
1284 self.assertEqual(self.cf2, cf)
1285
1286 def _testSendMultiFrames(self):
1287 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1288 self.cli.send(self.cf1)
1289
1290 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1291 self.cli.send(self.cf2)
1292
1293
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001294@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1295class BasicRDSTest(unittest.TestCase):
1296
1297 def testCrucialConstants(self):
1298 socket.AF_RDS
1299 socket.PF_RDS
1300
1301 def testCreateSocket(self):
1302 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1303 pass
1304
1305 def testSocketBufferSize(self):
1306 bufsize = 16384
1307 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1308 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1309 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1310
1311
1312@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1313@unittest.skipUnless(thread, 'Threading required for this test.')
1314class RDSTest(ThreadedRDSSocketTest):
1315
1316 def __init__(self, methodName='runTest'):
1317 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1318
1319 def testSendAndRecv(self):
1320 data, addr = self.serv.recvfrom(self.bufsize)
1321 self.assertEqual(self.data, data)
1322 self.assertEqual(self.cli_addr, addr)
1323
1324 def _testSendAndRecv(self):
1325 self.data = b'spam'
1326 self.cli.sendto(self.data, 0, (HOST, self.port))
1327
1328 def testPeek(self):
1329 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1330 self.assertEqual(self.data, data)
1331 data, addr = self.serv.recvfrom(self.bufsize)
1332 self.assertEqual(self.data, data)
1333
1334 def _testPeek(self):
1335 self.data = b'spam'
1336 self.cli.sendto(self.data, 0, (HOST, self.port))
1337
1338 @requireAttrs(socket.socket, 'recvmsg')
1339 def testSendAndRecvMsg(self):
1340 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1341 self.assertEqual(self.data, data)
1342
1343 @requireAttrs(socket.socket, 'sendmsg')
1344 def _testSendAndRecvMsg(self):
1345 self.data = b'hello ' * 10
1346 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1347
1348 def testSendAndRecvMulti(self):
1349 data, addr = self.serv.recvfrom(self.bufsize)
1350 self.assertEqual(self.data1, data)
1351
1352 data, addr = self.serv.recvfrom(self.bufsize)
1353 self.assertEqual(self.data2, data)
1354
1355 def _testSendAndRecvMulti(self):
1356 self.data1 = b'bacon'
1357 self.cli.sendto(self.data1, 0, (HOST, self.port))
1358
1359 self.data2 = b'egg'
1360 self.cli.sendto(self.data2, 0, (HOST, self.port))
1361
1362 def testSelect(self):
1363 r, w, x = select.select([self.serv], [], [], 3.0)
1364 self.assertIn(self.serv, r)
1365 data, addr = self.serv.recvfrom(self.bufsize)
1366 self.assertEqual(self.data, data)
1367
1368 def _testSelect(self):
1369 self.data = b'select'
1370 self.cli.sendto(self.data, 0, (HOST, self.port))
1371
1372 def testCongestion(self):
1373 # wait until the sender is done
1374 self.evt.wait()
1375
1376 def _testCongestion(self):
1377 # test the behavior in case of congestion
1378 self.data = b'fill'
1379 self.cli.setblocking(False)
1380 try:
1381 # try to lower the receiver's socket buffer size
1382 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1383 except OSError:
1384 pass
1385 with self.assertRaises(OSError) as cm:
1386 try:
1387 # fill the receiver's socket buffer
1388 while True:
1389 self.cli.sendto(self.data, 0, (HOST, self.port))
1390 finally:
1391 # signal the receiver we're done
1392 self.evt.set()
1393 # sendto() should have failed with ENOBUFS
1394 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1395 # and we should have received a congestion notification through poll
1396 r, w, x = select.select([self.serv], [], [], 3.0)
1397 self.assertIn(self.serv, r)
1398
1399
Victor Stinner45df8202010-04-28 22:31:17 +00001400@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001401class BasicTCPTest(SocketConnectedTest):
1402
1403 def __init__(self, methodName='runTest'):
1404 SocketConnectedTest.__init__(self, methodName=methodName)
1405
1406 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001407 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001408 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001409 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001410
1411 def _testRecv(self):
1412 self.serv_conn.send(MSG)
1413
1414 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001415 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001416 seg1 = self.cli_conn.recv(len(MSG) - 3)
1417 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001418 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001419 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001420
1421 def _testOverFlowRecv(self):
1422 self.serv_conn.send(MSG)
1423
1424 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001425 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001426 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001427 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001428
1429 def _testRecvFrom(self):
1430 self.serv_conn.send(MSG)
1431
1432 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001433 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001434 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1435 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001436 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001437 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001438
1439 def _testOverFlowRecvFrom(self):
1440 self.serv_conn.send(MSG)
1441
1442 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001443 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001444 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001445 while 1:
1446 read = self.cli_conn.recv(1024)
1447 if not read:
1448 break
Guido van Rossume531e292002-08-08 20:28:34 +00001449 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001450 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001451
1452 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001453 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001454 self.serv_conn.sendall(big_chunk)
1455
1456 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001457 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001458 fd = self.cli_conn.fileno()
1459 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001460 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001461 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001462 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001463 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001464
1465 def _testFromFd(self):
1466 self.serv_conn.send(MSG)
1467
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001468 def testDup(self):
1469 # Testing dup()
1470 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001471 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001472 msg = sock.recv(1024)
1473 self.assertEqual(msg, MSG)
1474
1475 def _testDup(self):
1476 self.serv_conn.send(MSG)
1477
Guido van Rossum24e4af82002-06-12 19:18:08 +00001478 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001479 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001480 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001481 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001482 # wait for _testShutdown to finish: on OS X, when the server
1483 # closes the connection the client also becomes disconnected,
1484 # and the client's shutdown call will fail. (Issue #4397.)
1485 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001486
1487 def _testShutdown(self):
1488 self.serv_conn.send(MSG)
1489 self.serv_conn.shutdown(2)
1490
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001491 def testDetach(self):
1492 # Testing detach()
1493 fileno = self.cli_conn.fileno()
1494 f = self.cli_conn.detach()
1495 self.assertEqual(f, fileno)
1496 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001497 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1498 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001499 # ...but we can create another socket using the (still open)
1500 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001501 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001502 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001503 msg = sock.recv(1024)
1504 self.assertEqual(msg, MSG)
1505
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001506 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001507 self.serv_conn.send(MSG)
1508
Victor Stinner45df8202010-04-28 22:31:17 +00001509@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001510class BasicUDPTest(ThreadedUDPSocketTest):
1511
1512 def __init__(self, methodName='runTest'):
1513 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1514
1515 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001516 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001517 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001518 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001519
1520 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001521 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001522
Guido van Rossum1c938012002-06-12 21:17:20 +00001523 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001524 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001525 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001526 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001527
Guido van Rossum1c938012002-06-12 21:17:20 +00001528 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001529 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001530
Guido van Rossumd8faa362007-04-27 19:54:29 +00001531 def testRecvFromNegative(self):
1532 # Negative lengths passed to recvfrom should give ValueError.
1533 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1534
1535 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001536 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001537
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001538
1539# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1540# same test code is used with different families and types of socket
1541# (e.g. stream, datagram), and tests using recvmsg() are repeated
1542# using recvmsg_into().
1543#
1544# The generic test classes such as SendmsgTests and
1545# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1546# supplied with sockets cli_sock and serv_sock representing the
1547# client's and the server's end of the connection respectively, and
1548# attributes cli_addr and serv_addr holding their (numeric where
1549# appropriate) addresses.
1550#
1551# The final concrete test classes combine these with subclasses of
1552# SocketTestBase which set up client and server sockets of a specific
1553# type, and with subclasses of SendrecvmsgBase such as
1554# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1555# sockets to cli_sock and serv_sock and override the methods and
1556# attributes of SendrecvmsgBase to fill in destination addresses if
1557# needed when sending, check for specific flags in msg_flags, etc.
1558#
1559# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1560# recvmsg_into().
1561
1562# XXX: like the other datagram (UDP) tests in this module, the code
1563# here assumes that datagram delivery on the local machine will be
1564# reliable.
1565
1566class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1567 # Base class for sendmsg()/recvmsg() tests.
1568
1569 # Time in seconds to wait before considering a test failed, or
1570 # None for no timeout. Not all tests actually set a timeout.
1571 fail_timeout = 3.0
1572
1573 def setUp(self):
1574 self.misc_event = threading.Event()
1575 super().setUp()
1576
1577 def sendToServer(self, msg):
1578 # Send msg to the server.
1579 return self.cli_sock.send(msg)
1580
1581 # Tuple of alternative default arguments for sendmsg() when called
1582 # via sendmsgToServer() (e.g. to include a destination address).
1583 sendmsg_to_server_defaults = ()
1584
1585 def sendmsgToServer(self, *args):
1586 # Call sendmsg() on self.cli_sock with the given arguments,
1587 # filling in any arguments which are not supplied with the
1588 # corresponding items of self.sendmsg_to_server_defaults, if
1589 # any.
1590 return self.cli_sock.sendmsg(
1591 *(args + self.sendmsg_to_server_defaults[len(args):]))
1592
1593 def doRecvmsg(self, sock, bufsize, *args):
1594 # Call recvmsg() on sock with given arguments and return its
1595 # result. Should be used for tests which can use either
1596 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1597 # this method with one which emulates it using recvmsg_into(),
1598 # thus allowing the same test to be used for both methods.
1599 result = sock.recvmsg(bufsize, *args)
1600 self.registerRecvmsgResult(result)
1601 return result
1602
1603 def registerRecvmsgResult(self, result):
1604 # Called by doRecvmsg() with the return value of recvmsg() or
1605 # recvmsg_into(). Can be overridden to arrange cleanup based
1606 # on the returned ancillary data, for instance.
1607 pass
1608
1609 def checkRecvmsgAddress(self, addr1, addr2):
1610 # Called to compare the received address with the address of
1611 # the peer.
1612 self.assertEqual(addr1, addr2)
1613
1614 # Flags that are normally unset in msg_flags
1615 msg_flags_common_unset = 0
1616 for name in ("MSG_CTRUNC", "MSG_OOB"):
1617 msg_flags_common_unset |= getattr(socket, name, 0)
1618
1619 # Flags that are normally set
1620 msg_flags_common_set = 0
1621
1622 # Flags set when a complete record has been received (e.g. MSG_EOR
1623 # for SCTP)
1624 msg_flags_eor_indicator = 0
1625
1626 # Flags set when a complete record has not been received
1627 # (e.g. MSG_TRUNC for datagram sockets)
1628 msg_flags_non_eor_indicator = 0
1629
1630 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1631 # Method to check the value of msg_flags returned by recvmsg[_into]().
1632 #
1633 # Checks that all bits in msg_flags_common_set attribute are
1634 # set in "flags" and all bits in msg_flags_common_unset are
1635 # unset.
1636 #
1637 # The "eor" argument specifies whether the flags should
1638 # indicate that a full record (or datagram) has been received.
1639 # If "eor" is None, no checks are done; otherwise, checks
1640 # that:
1641 #
1642 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1643 # set and all bits in msg_flags_non_eor_indicator are unset
1644 #
1645 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1646 # are set and all bits in msg_flags_eor_indicator are unset
1647 #
1648 # If "checkset" and/or "checkunset" are supplied, they require
1649 # the given bits to be set or unset respectively, overriding
1650 # what the attributes require for those bits.
1651 #
1652 # If any bits are set in "ignore", they will not be checked,
1653 # regardless of the other inputs.
1654 #
1655 # Will raise Exception if the inputs require a bit to be both
1656 # set and unset, and it is not ignored.
1657
1658 defaultset = self.msg_flags_common_set
1659 defaultunset = self.msg_flags_common_unset
1660
1661 if eor:
1662 defaultset |= self.msg_flags_eor_indicator
1663 defaultunset |= self.msg_flags_non_eor_indicator
1664 elif eor is not None:
1665 defaultset |= self.msg_flags_non_eor_indicator
1666 defaultunset |= self.msg_flags_eor_indicator
1667
1668 # Function arguments override defaults
1669 defaultset &= ~checkunset
1670 defaultunset &= ~checkset
1671
1672 # Merge arguments with remaining defaults, and check for conflicts
1673 checkset |= defaultset
1674 checkunset |= defaultunset
1675 inboth = checkset & checkunset & ~ignore
1676 if inboth:
1677 raise Exception("contradictory set, unset requirements for flags "
1678 "{0:#x}".format(inboth))
1679
1680 # Compare with given msg_flags value
1681 mask = (checkset | checkunset) & ~ignore
1682 self.assertEqual(flags & mask, checkset & mask)
1683
1684
1685class RecvmsgIntoMixin(SendrecvmsgBase):
1686 # Mixin to implement doRecvmsg() using recvmsg_into().
1687
1688 def doRecvmsg(self, sock, bufsize, *args):
1689 buf = bytearray(bufsize)
1690 result = sock.recvmsg_into([buf], *args)
1691 self.registerRecvmsgResult(result)
1692 self.assertGreaterEqual(result[0], 0)
1693 self.assertLessEqual(result[0], bufsize)
1694 return (bytes(buf[:result[0]]),) + result[1:]
1695
1696
1697class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1698 # Defines flags to be checked in msg_flags for datagram sockets.
1699
1700 @property
1701 def msg_flags_non_eor_indicator(self):
1702 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1703
1704
1705class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1706 # Defines flags to be checked in msg_flags for SCTP sockets.
1707
1708 @property
1709 def msg_flags_eor_indicator(self):
1710 return super().msg_flags_eor_indicator | socket.MSG_EOR
1711
1712
1713class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1714 # Base class for tests on connectionless-mode sockets. Users must
1715 # supply sockets on attributes cli and serv to be mapped to
1716 # cli_sock and serv_sock respectively.
1717
1718 @property
1719 def serv_sock(self):
1720 return self.serv
1721
1722 @property
1723 def cli_sock(self):
1724 return self.cli
1725
1726 @property
1727 def sendmsg_to_server_defaults(self):
1728 return ([], [], 0, self.serv_addr)
1729
1730 def sendToServer(self, msg):
1731 return self.cli_sock.sendto(msg, self.serv_addr)
1732
1733
1734class SendrecvmsgConnectedBase(SendrecvmsgBase):
1735 # Base class for tests on connected sockets. Users must supply
1736 # sockets on attributes serv_conn and cli_conn (representing the
1737 # connections *to* the server and the client), to be mapped to
1738 # cli_sock and serv_sock respectively.
1739
1740 @property
1741 def serv_sock(self):
1742 return self.cli_conn
1743
1744 @property
1745 def cli_sock(self):
1746 return self.serv_conn
1747
1748 def checkRecvmsgAddress(self, addr1, addr2):
1749 # Address is currently "unspecified" for a connected socket,
1750 # so we don't examine it
1751 pass
1752
1753
1754class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1755 # Base class to set a timeout on server's socket.
1756
1757 def setUp(self):
1758 super().setUp()
1759 self.serv_sock.settimeout(self.fail_timeout)
1760
1761
1762class SendmsgTests(SendrecvmsgServerTimeoutBase):
1763 # Tests for sendmsg() which can use any socket type and do not
1764 # involve recvmsg() or recvmsg_into().
1765
1766 def testSendmsg(self):
1767 # Send a simple message with sendmsg().
1768 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1769
1770 def _testSendmsg(self):
1771 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1772
1773 def testSendmsgDataGenerator(self):
1774 # Send from buffer obtained from a generator (not a sequence).
1775 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1776
1777 def _testSendmsgDataGenerator(self):
1778 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1779 len(MSG))
1780
1781 def testSendmsgAncillaryGenerator(self):
1782 # Gather (empty) ancillary data from a generator.
1783 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1784
1785 def _testSendmsgAncillaryGenerator(self):
1786 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1787 len(MSG))
1788
1789 def testSendmsgArray(self):
1790 # Send data from an array instead of the usual bytes object.
1791 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1792
1793 def _testSendmsgArray(self):
1794 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1795 len(MSG))
1796
1797 def testSendmsgGather(self):
1798 # Send message data from more than one buffer (gather write).
1799 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1800
1801 def _testSendmsgGather(self):
1802 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1803
1804 def testSendmsgBadArgs(self):
1805 # Check that sendmsg() rejects invalid arguments.
1806 self.assertEqual(self.serv_sock.recv(1000), b"done")
1807
1808 def _testSendmsgBadArgs(self):
1809 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1810 self.assertRaises(TypeError, self.sendmsgToServer,
1811 b"not in an iterable")
1812 self.assertRaises(TypeError, self.sendmsgToServer,
1813 object())
1814 self.assertRaises(TypeError, self.sendmsgToServer,
1815 [object()])
1816 self.assertRaises(TypeError, self.sendmsgToServer,
1817 [MSG, object()])
1818 self.assertRaises(TypeError, self.sendmsgToServer,
1819 [MSG], object())
1820 self.assertRaises(TypeError, self.sendmsgToServer,
1821 [MSG], [], object())
1822 self.assertRaises(TypeError, self.sendmsgToServer,
1823 [MSG], [], 0, object())
1824 self.sendToServer(b"done")
1825
1826 def testSendmsgBadCmsg(self):
1827 # Check that invalid ancillary data items are rejected.
1828 self.assertEqual(self.serv_sock.recv(1000), b"done")
1829
1830 def _testSendmsgBadCmsg(self):
1831 self.assertRaises(TypeError, self.sendmsgToServer,
1832 [MSG], [object()])
1833 self.assertRaises(TypeError, self.sendmsgToServer,
1834 [MSG], [(object(), 0, b"data")])
1835 self.assertRaises(TypeError, self.sendmsgToServer,
1836 [MSG], [(0, object(), b"data")])
1837 self.assertRaises(TypeError, self.sendmsgToServer,
1838 [MSG], [(0, 0, object())])
1839 self.assertRaises(TypeError, self.sendmsgToServer,
1840 [MSG], [(0, 0)])
1841 self.assertRaises(TypeError, self.sendmsgToServer,
1842 [MSG], [(0, 0, b"data", 42)])
1843 self.sendToServer(b"done")
1844
1845 @requireAttrs(socket, "CMSG_SPACE")
1846 def testSendmsgBadMultiCmsg(self):
1847 # Check that invalid ancillary data items are rejected when
1848 # more than one item is present.
1849 self.assertEqual(self.serv_sock.recv(1000), b"done")
1850
1851 @testSendmsgBadMultiCmsg.client_skip
1852 def _testSendmsgBadMultiCmsg(self):
1853 self.assertRaises(TypeError, self.sendmsgToServer,
1854 [MSG], [0, 0, b""])
1855 self.assertRaises(TypeError, self.sendmsgToServer,
1856 [MSG], [(0, 0, b""), object()])
1857 self.sendToServer(b"done")
1858
1859 def testSendmsgExcessCmsgReject(self):
1860 # Check that sendmsg() rejects excess ancillary data items
1861 # when the number that can be sent is limited.
1862 self.assertEqual(self.serv_sock.recv(1000), b"done")
1863
1864 def _testSendmsgExcessCmsgReject(self):
1865 if not hasattr(socket, "CMSG_SPACE"):
1866 # Can only send one item
1867 with self.assertRaises(socket.error) as cm:
1868 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1869 self.assertIsNone(cm.exception.errno)
1870 self.sendToServer(b"done")
1871
1872 def testSendmsgAfterClose(self):
1873 # Check that sendmsg() fails on a closed socket.
1874 pass
1875
1876 def _testSendmsgAfterClose(self):
1877 self.cli_sock.close()
1878 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1879
1880
1881class SendmsgStreamTests(SendmsgTests):
1882 # Tests for sendmsg() which require a stream socket and do not
1883 # involve recvmsg() or recvmsg_into().
1884
1885 def testSendmsgExplicitNoneAddr(self):
1886 # Check that peer address can be specified as None.
1887 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1888
1889 def _testSendmsgExplicitNoneAddr(self):
1890 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1891
1892 def testSendmsgTimeout(self):
1893 # Check that timeout works with sendmsg().
1894 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1895 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1896
1897 def _testSendmsgTimeout(self):
1898 try:
1899 self.cli_sock.settimeout(0.03)
1900 with self.assertRaises(socket.timeout):
1901 while True:
1902 self.sendmsgToServer([b"a"*512])
1903 finally:
1904 self.misc_event.set()
1905
1906 # XXX: would be nice to have more tests for sendmsg flags argument.
1907
1908 # Linux supports MSG_DONTWAIT when sending, but in general, it
1909 # only works when receiving. Could add other platforms if they
1910 # support it too.
1911 @skipWithClientIf(sys.platform not in {"linux2"},
1912 "MSG_DONTWAIT not known to work on this platform when "
1913 "sending")
1914 def testSendmsgDontWait(self):
1915 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
1916 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1917 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1918
1919 @testSendmsgDontWait.client_skip
1920 def _testSendmsgDontWait(self):
1921 try:
1922 with self.assertRaises(socket.error) as cm:
1923 while True:
1924 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
1925 self.assertIn(cm.exception.errno,
1926 (errno.EAGAIN, errno.EWOULDBLOCK))
1927 finally:
1928 self.misc_event.set()
1929
1930
1931class SendmsgConnectionlessTests(SendmsgTests):
1932 # Tests for sendmsg() which require a connectionless-mode
1933 # (e.g. datagram) socket, and do not involve recvmsg() or
1934 # recvmsg_into().
1935
1936 def testSendmsgNoDestAddr(self):
1937 # Check that sendmsg() fails when no destination address is
1938 # given for unconnected socket.
1939 pass
1940
1941 def _testSendmsgNoDestAddr(self):
1942 self.assertRaises(socket.error, self.cli_sock.sendmsg,
1943 [MSG])
1944 self.assertRaises(socket.error, self.cli_sock.sendmsg,
1945 [MSG], [], 0, None)
1946
1947
1948class RecvmsgGenericTests(SendrecvmsgBase):
1949 # Tests for recvmsg() which can also be emulated using
1950 # recvmsg_into(), and can use any socket type.
1951
1952 def testRecvmsg(self):
1953 # Receive a simple message with recvmsg[_into]().
1954 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1955 self.assertEqual(msg, MSG)
1956 self.checkRecvmsgAddress(addr, self.cli_addr)
1957 self.assertEqual(ancdata, [])
1958 self.checkFlags(flags, eor=True)
1959
1960 def _testRecvmsg(self):
1961 self.sendToServer(MSG)
1962
1963 def testRecvmsgExplicitDefaults(self):
1964 # Test recvmsg[_into]() with default arguments provided explicitly.
1965 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1966 len(MSG), 0, 0)
1967 self.assertEqual(msg, MSG)
1968 self.checkRecvmsgAddress(addr, self.cli_addr)
1969 self.assertEqual(ancdata, [])
1970 self.checkFlags(flags, eor=True)
1971
1972 def _testRecvmsgExplicitDefaults(self):
1973 self.sendToServer(MSG)
1974
1975 def testRecvmsgShorter(self):
1976 # Receive a message smaller than buffer.
1977 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1978 len(MSG) + 42)
1979 self.assertEqual(msg, MSG)
1980 self.checkRecvmsgAddress(addr, self.cli_addr)
1981 self.assertEqual(ancdata, [])
1982 self.checkFlags(flags, eor=True)
1983
1984 def _testRecvmsgShorter(self):
1985 self.sendToServer(MSG)
1986
Charles-François Natali8619cd72011-10-03 19:43:15 +02001987 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
1988 # datagram is received (issue #13001).
1989 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001990 def testRecvmsgTrunc(self):
1991 # Receive part of message, check for truncation indicators.
1992 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1993 len(MSG) - 3)
1994 self.assertEqual(msg, MSG[:-3])
1995 self.checkRecvmsgAddress(addr, self.cli_addr)
1996 self.assertEqual(ancdata, [])
1997 self.checkFlags(flags, eor=False)
1998
Charles-François Natali8619cd72011-10-03 19:43:15 +02001999 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002000 def _testRecvmsgTrunc(self):
2001 self.sendToServer(MSG)
2002
2003 def testRecvmsgShortAncillaryBuf(self):
2004 # Test ancillary data buffer too small to hold any ancillary data.
2005 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2006 len(MSG), 1)
2007 self.assertEqual(msg, MSG)
2008 self.checkRecvmsgAddress(addr, self.cli_addr)
2009 self.assertEqual(ancdata, [])
2010 self.checkFlags(flags, eor=True)
2011
2012 def _testRecvmsgShortAncillaryBuf(self):
2013 self.sendToServer(MSG)
2014
2015 def testRecvmsgLongAncillaryBuf(self):
2016 # Test large ancillary data buffer.
2017 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2018 len(MSG), 10240)
2019 self.assertEqual(msg, MSG)
2020 self.checkRecvmsgAddress(addr, self.cli_addr)
2021 self.assertEqual(ancdata, [])
2022 self.checkFlags(flags, eor=True)
2023
2024 def _testRecvmsgLongAncillaryBuf(self):
2025 self.sendToServer(MSG)
2026
2027 def testRecvmsgAfterClose(self):
2028 # Check that recvmsg[_into]() fails on a closed socket.
2029 self.serv_sock.close()
2030 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2031
2032 def _testRecvmsgAfterClose(self):
2033 pass
2034
2035 def testRecvmsgTimeout(self):
2036 # Check that timeout works.
2037 try:
2038 self.serv_sock.settimeout(0.03)
2039 self.assertRaises(socket.timeout,
2040 self.doRecvmsg, self.serv_sock, len(MSG))
2041 finally:
2042 self.misc_event.set()
2043
2044 def _testRecvmsgTimeout(self):
2045 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2046
2047 @requireAttrs(socket, "MSG_PEEK")
2048 def testRecvmsgPeek(self):
2049 # Check that MSG_PEEK in flags enables examination of pending
2050 # data without consuming it.
2051
2052 # Receive part of data with MSG_PEEK.
2053 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2054 len(MSG) - 3, 0,
2055 socket.MSG_PEEK)
2056 self.assertEqual(msg, MSG[:-3])
2057 self.checkRecvmsgAddress(addr, self.cli_addr)
2058 self.assertEqual(ancdata, [])
2059 # Ignoring MSG_TRUNC here (so this test is the same for stream
2060 # and datagram sockets). Some wording in POSIX seems to
2061 # suggest that it needn't be set when peeking, but that may
2062 # just be a slip.
2063 self.checkFlags(flags, eor=False,
2064 ignore=getattr(socket, "MSG_TRUNC", 0))
2065
2066 # Receive all data with MSG_PEEK.
2067 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2068 len(MSG), 0,
2069 socket.MSG_PEEK)
2070 self.assertEqual(msg, MSG)
2071 self.checkRecvmsgAddress(addr, self.cli_addr)
2072 self.assertEqual(ancdata, [])
2073 self.checkFlags(flags, eor=True)
2074
2075 # Check that the same data can still be received normally.
2076 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2077 self.assertEqual(msg, MSG)
2078 self.checkRecvmsgAddress(addr, self.cli_addr)
2079 self.assertEqual(ancdata, [])
2080 self.checkFlags(flags, eor=True)
2081
2082 @testRecvmsgPeek.client_skip
2083 def _testRecvmsgPeek(self):
2084 self.sendToServer(MSG)
2085
2086 @requireAttrs(socket.socket, "sendmsg")
2087 def testRecvmsgFromSendmsg(self):
2088 # Test receiving with recvmsg[_into]() when message is sent
2089 # using sendmsg().
2090 self.serv_sock.settimeout(self.fail_timeout)
2091 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2092 self.assertEqual(msg, MSG)
2093 self.checkRecvmsgAddress(addr, self.cli_addr)
2094 self.assertEqual(ancdata, [])
2095 self.checkFlags(flags, eor=True)
2096
2097 @testRecvmsgFromSendmsg.client_skip
2098 def _testRecvmsgFromSendmsg(self):
2099 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2100
2101
2102class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2103 # Tests which require a stream socket and can use either recvmsg()
2104 # or recvmsg_into().
2105
2106 def testRecvmsgEOF(self):
2107 # Receive end-of-stream indicator (b"", peer socket closed).
2108 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2109 self.assertEqual(msg, b"")
2110 self.checkRecvmsgAddress(addr, self.cli_addr)
2111 self.assertEqual(ancdata, [])
2112 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2113
2114 def _testRecvmsgEOF(self):
2115 self.cli_sock.close()
2116
2117 def testRecvmsgOverflow(self):
2118 # Receive a message in more than one chunk.
2119 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2120 len(MSG) - 3)
2121 self.checkRecvmsgAddress(addr, self.cli_addr)
2122 self.assertEqual(ancdata, [])
2123 self.checkFlags(flags, eor=False)
2124
2125 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2126 self.checkRecvmsgAddress(addr, self.cli_addr)
2127 self.assertEqual(ancdata, [])
2128 self.checkFlags(flags, eor=True)
2129
2130 msg = seg1 + seg2
2131 self.assertEqual(msg, MSG)
2132
2133 def _testRecvmsgOverflow(self):
2134 self.sendToServer(MSG)
2135
2136
2137class RecvmsgTests(RecvmsgGenericTests):
2138 # Tests for recvmsg() which can use any socket type.
2139
2140 def testRecvmsgBadArgs(self):
2141 # Check that recvmsg() rejects invalid arguments.
2142 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2143 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2144 -1, 0, 0)
2145 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2146 len(MSG), -1, 0)
2147 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2148 [bytearray(10)], 0, 0)
2149 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2150 object(), 0, 0)
2151 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2152 len(MSG), object(), 0)
2153 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2154 len(MSG), 0, object())
2155
2156 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2157 self.assertEqual(msg, MSG)
2158 self.checkRecvmsgAddress(addr, self.cli_addr)
2159 self.assertEqual(ancdata, [])
2160 self.checkFlags(flags, eor=True)
2161
2162 def _testRecvmsgBadArgs(self):
2163 self.sendToServer(MSG)
2164
2165
2166class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2167 # Tests for recvmsg_into() which can use any socket type.
2168
2169 def testRecvmsgIntoBadArgs(self):
2170 # Check that recvmsg_into() rejects invalid arguments.
2171 buf = bytearray(len(MSG))
2172 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2173 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2174 len(MSG), 0, 0)
2175 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2176 buf, 0, 0)
2177 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2178 [object()], 0, 0)
2179 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2180 [b"I'm not writable"], 0, 0)
2181 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2182 [buf, object()], 0, 0)
2183 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2184 [buf], -1, 0)
2185 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2186 [buf], object(), 0)
2187 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2188 [buf], 0, object())
2189
2190 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2191 self.assertEqual(nbytes, len(MSG))
2192 self.assertEqual(buf, bytearray(MSG))
2193 self.checkRecvmsgAddress(addr, self.cli_addr)
2194 self.assertEqual(ancdata, [])
2195 self.checkFlags(flags, eor=True)
2196
2197 def _testRecvmsgIntoBadArgs(self):
2198 self.sendToServer(MSG)
2199
2200 def testRecvmsgIntoGenerator(self):
2201 # Receive into buffer obtained from a generator (not a sequence).
2202 buf = bytearray(len(MSG))
2203 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2204 (o for o in [buf]))
2205 self.assertEqual(nbytes, len(MSG))
2206 self.assertEqual(buf, bytearray(MSG))
2207 self.checkRecvmsgAddress(addr, self.cli_addr)
2208 self.assertEqual(ancdata, [])
2209 self.checkFlags(flags, eor=True)
2210
2211 def _testRecvmsgIntoGenerator(self):
2212 self.sendToServer(MSG)
2213
2214 def testRecvmsgIntoArray(self):
2215 # Receive into an array rather than the usual bytearray.
2216 buf = array.array("B", [0] * len(MSG))
2217 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2218 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002219 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002220 self.checkRecvmsgAddress(addr, self.cli_addr)
2221 self.assertEqual(ancdata, [])
2222 self.checkFlags(flags, eor=True)
2223
2224 def _testRecvmsgIntoArray(self):
2225 self.sendToServer(MSG)
2226
2227 def testRecvmsgIntoScatter(self):
2228 # Receive into multiple buffers (scatter write).
2229 b1 = bytearray(b"----")
2230 b2 = bytearray(b"0123456789")
2231 b3 = bytearray(b"--------------")
2232 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2233 [b1, memoryview(b2)[2:9], b3])
2234 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2235 self.assertEqual(b1, bytearray(b"Mary"))
2236 self.assertEqual(b2, bytearray(b"01 had a 9"))
2237 self.assertEqual(b3, bytearray(b"little lamb---"))
2238 self.checkRecvmsgAddress(addr, self.cli_addr)
2239 self.assertEqual(ancdata, [])
2240 self.checkFlags(flags, eor=True)
2241
2242 def _testRecvmsgIntoScatter(self):
2243 self.sendToServer(b"Mary had a little lamb")
2244
2245
2246class CmsgMacroTests(unittest.TestCase):
2247 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2248 # assumptions used by sendmsg() and recvmsg[_into](), which share
2249 # code with these functions.
2250
2251 # Match the definition in socketmodule.c
2252 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2253
2254 @requireAttrs(socket, "CMSG_LEN")
2255 def testCMSG_LEN(self):
2256 # Test CMSG_LEN() with various valid and invalid values,
2257 # checking the assumptions used by recvmsg() and sendmsg().
2258 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2259 values = list(range(257)) + list(range(toobig - 257, toobig))
2260
2261 # struct cmsghdr has at least three members, two of which are ints
2262 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2263 for n in values:
2264 ret = socket.CMSG_LEN(n)
2265 # This is how recvmsg() calculates the data size
2266 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2267 self.assertLessEqual(ret, self.socklen_t_limit)
2268
2269 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2270 # sendmsg() shares code with these functions, and requires
2271 # that it reject values over the limit.
2272 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2273 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2274
2275 @requireAttrs(socket, "CMSG_SPACE")
2276 def testCMSG_SPACE(self):
2277 # Test CMSG_SPACE() with various valid and invalid values,
2278 # checking the assumptions used by sendmsg().
2279 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2280 values = list(range(257)) + list(range(toobig - 257, toobig))
2281
2282 last = socket.CMSG_SPACE(0)
2283 # struct cmsghdr has at least three members, two of which are ints
2284 self.assertGreater(last, array.array("i").itemsize * 2)
2285 for n in values:
2286 ret = socket.CMSG_SPACE(n)
2287 self.assertGreaterEqual(ret, last)
2288 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2289 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2290 self.assertLessEqual(ret, self.socklen_t_limit)
2291 last = ret
2292
2293 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2294 # sendmsg() shares code with these functions, and requires
2295 # that it reject values over the limit.
2296 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2297 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2298
2299
2300class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2301 # Tests for file descriptor passing on Unix-domain sockets.
2302
2303 # Invalid file descriptor value that's unlikely to evaluate to a
2304 # real FD even if one of its bytes is replaced with a different
2305 # value (which shouldn't actually happen).
2306 badfd = -0x5555
2307
2308 def newFDs(self, n):
2309 # Return a list of n file descriptors for newly-created files
2310 # containing their list indices as ASCII numbers.
2311 fds = []
2312 for i in range(n):
2313 fd, path = tempfile.mkstemp()
2314 self.addCleanup(os.unlink, path)
2315 self.addCleanup(os.close, fd)
2316 os.write(fd, str(i).encode())
2317 fds.append(fd)
2318 return fds
2319
2320 def checkFDs(self, fds):
2321 # Check that the file descriptors in the given list contain
2322 # their correct list indices as ASCII numbers.
2323 for n, fd in enumerate(fds):
2324 os.lseek(fd, 0, os.SEEK_SET)
2325 self.assertEqual(os.read(fd, 1024), str(n).encode())
2326
2327 def registerRecvmsgResult(self, result):
2328 self.addCleanup(self.closeRecvmsgFDs, result)
2329
2330 def closeRecvmsgFDs(self, recvmsg_result):
2331 # Close all file descriptors specified in the ancillary data
2332 # of the given return value from recvmsg() or recvmsg_into().
2333 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2334 if (cmsg_level == socket.SOL_SOCKET and
2335 cmsg_type == socket.SCM_RIGHTS):
2336 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002337 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002338 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2339 for fd in fds:
2340 os.close(fd)
2341
2342 def createAndSendFDs(self, n):
2343 # Send n new file descriptors created by newFDs() to the
2344 # server, with the constant MSG as the non-ancillary data.
2345 self.assertEqual(
2346 self.sendmsgToServer([MSG],
2347 [(socket.SOL_SOCKET,
2348 socket.SCM_RIGHTS,
2349 array.array("i", self.newFDs(n)))]),
2350 len(MSG))
2351
2352 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2353 # Check that constant MSG was received with numfds file
2354 # descriptors in a maximum of maxcmsgs control messages (which
2355 # must contain only complete integers). By default, check
2356 # that MSG_CTRUNC is unset, but ignore any flags in
2357 # ignoreflags.
2358 msg, ancdata, flags, addr = result
2359 self.assertEqual(msg, MSG)
2360 self.checkRecvmsgAddress(addr, self.cli_addr)
2361 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2362 ignore=ignoreflags)
2363
2364 self.assertIsInstance(ancdata, list)
2365 self.assertLessEqual(len(ancdata), maxcmsgs)
2366 fds = array.array("i")
2367 for item in ancdata:
2368 self.assertIsInstance(item, tuple)
2369 cmsg_level, cmsg_type, cmsg_data = item
2370 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2371 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2372 self.assertIsInstance(cmsg_data, bytes)
2373 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002374 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002375
2376 self.assertEqual(len(fds), numfds)
2377 self.checkFDs(fds)
2378
2379 def testFDPassSimple(self):
2380 # Pass a single FD (array read from bytes object).
2381 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2382 len(MSG), 10240))
2383
2384 def _testFDPassSimple(self):
2385 self.assertEqual(
2386 self.sendmsgToServer(
2387 [MSG],
2388 [(socket.SOL_SOCKET,
2389 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002390 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002391 len(MSG))
2392
2393 def testMultipleFDPass(self):
2394 # Pass multiple FDs in a single array.
2395 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2396 len(MSG), 10240))
2397
2398 def _testMultipleFDPass(self):
2399 self.createAndSendFDs(4)
2400
2401 @requireAttrs(socket, "CMSG_SPACE")
2402 def testFDPassCMSG_SPACE(self):
2403 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2404 self.checkRecvmsgFDs(
2405 4, self.doRecvmsg(self.serv_sock, len(MSG),
2406 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2407
2408 @testFDPassCMSG_SPACE.client_skip
2409 def _testFDPassCMSG_SPACE(self):
2410 self.createAndSendFDs(4)
2411
2412 def testFDPassCMSG_LEN(self):
2413 # Test using CMSG_LEN() to calculate ancillary buffer size.
2414 self.checkRecvmsgFDs(1,
2415 self.doRecvmsg(self.serv_sock, len(MSG),
2416 socket.CMSG_LEN(4 * SIZEOF_INT)),
2417 # RFC 3542 says implementations may set
2418 # MSG_CTRUNC if there isn't enough space
2419 # for trailing padding.
2420 ignoreflags=socket.MSG_CTRUNC)
2421
2422 def _testFDPassCMSG_LEN(self):
2423 self.createAndSendFDs(1)
2424
Nick Coghlan2496f332011-09-19 20:26:31 +10002425 # Issue #12958: The following test has problems on Mac OS X
2426 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002427 @requireAttrs(socket, "CMSG_SPACE")
2428 def testFDPassSeparate(self):
2429 # Pass two FDs in two separate arrays. Arrays may be combined
2430 # into a single control message by the OS.
2431 self.checkRecvmsgFDs(2,
2432 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2433 maxcmsgs=2)
2434
2435 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002436 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002437 def _testFDPassSeparate(self):
2438 fd0, fd1 = self.newFDs(2)
2439 self.assertEqual(
2440 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2441 socket.SCM_RIGHTS,
2442 array.array("i", [fd0])),
2443 (socket.SOL_SOCKET,
2444 socket.SCM_RIGHTS,
2445 array.array("i", [fd1]))]),
2446 len(MSG))
2447
Nick Coghlan2496f332011-09-19 20:26:31 +10002448 # Issue #12958: The following test has problems on Mac OS X
2449 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002450 @requireAttrs(socket, "CMSG_SPACE")
2451 def testFDPassSeparateMinSpace(self):
2452 # Pass two FDs in two separate arrays, receiving them into the
2453 # minimum space for two arrays.
2454 self.checkRecvmsgFDs(2,
2455 self.doRecvmsg(self.serv_sock, len(MSG),
2456 socket.CMSG_SPACE(SIZEOF_INT) +
2457 socket.CMSG_LEN(SIZEOF_INT)),
2458 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2459
2460 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002461 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002462 def _testFDPassSeparateMinSpace(self):
2463 fd0, fd1 = self.newFDs(2)
2464 self.assertEqual(
2465 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2466 socket.SCM_RIGHTS,
2467 array.array("i", [fd0])),
2468 (socket.SOL_SOCKET,
2469 socket.SCM_RIGHTS,
2470 array.array("i", [fd1]))]),
2471 len(MSG))
2472
2473 def sendAncillaryIfPossible(self, msg, ancdata):
2474 # Try to send msg and ancdata to server, but if the system
2475 # call fails, just send msg with no ancillary data.
2476 try:
2477 nbytes = self.sendmsgToServer([msg], ancdata)
2478 except socket.error as e:
2479 # Check that it was the system call that failed
2480 self.assertIsInstance(e.errno, int)
2481 nbytes = self.sendmsgToServer([msg])
2482 self.assertEqual(nbytes, len(msg))
2483
2484 def testFDPassEmpty(self):
2485 # Try to pass an empty FD array. Can receive either no array
2486 # or an empty array.
2487 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2488 len(MSG), 10240),
2489 ignoreflags=socket.MSG_CTRUNC)
2490
2491 def _testFDPassEmpty(self):
2492 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2493 socket.SCM_RIGHTS,
2494 b"")])
2495
2496 def testFDPassPartialInt(self):
2497 # Try to pass a truncated FD array.
2498 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2499 len(MSG), 10240)
2500 self.assertEqual(msg, MSG)
2501 self.checkRecvmsgAddress(addr, self.cli_addr)
2502 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2503 self.assertLessEqual(len(ancdata), 1)
2504 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2505 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2506 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2507 self.assertLess(len(cmsg_data), SIZEOF_INT)
2508
2509 def _testFDPassPartialInt(self):
2510 self.sendAncillaryIfPossible(
2511 MSG,
2512 [(socket.SOL_SOCKET,
2513 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002514 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002515
2516 @requireAttrs(socket, "CMSG_SPACE")
2517 def testFDPassPartialIntInMiddle(self):
2518 # Try to pass two FD arrays, the first of which is truncated.
2519 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2520 len(MSG), 10240)
2521 self.assertEqual(msg, MSG)
2522 self.checkRecvmsgAddress(addr, self.cli_addr)
2523 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2524 self.assertLessEqual(len(ancdata), 2)
2525 fds = array.array("i")
2526 # Arrays may have been combined in a single control message
2527 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2528 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2529 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002530 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002531 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2532 self.assertLessEqual(len(fds), 2)
2533 self.checkFDs(fds)
2534
2535 @testFDPassPartialIntInMiddle.client_skip
2536 def _testFDPassPartialIntInMiddle(self):
2537 fd0, fd1 = self.newFDs(2)
2538 self.sendAncillaryIfPossible(
2539 MSG,
2540 [(socket.SOL_SOCKET,
2541 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002542 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002543 (socket.SOL_SOCKET,
2544 socket.SCM_RIGHTS,
2545 array.array("i", [fd1]))])
2546
2547 def checkTruncatedHeader(self, result, ignoreflags=0):
2548 # Check that no ancillary data items are returned when data is
2549 # truncated inside the cmsghdr structure.
2550 msg, ancdata, flags, addr = result
2551 self.assertEqual(msg, MSG)
2552 self.checkRecvmsgAddress(addr, self.cli_addr)
2553 self.assertEqual(ancdata, [])
2554 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2555 ignore=ignoreflags)
2556
2557 def testCmsgTruncNoBufSize(self):
2558 # Check that no ancillary data is received when no buffer size
2559 # is specified.
2560 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2561 # BSD seems to set MSG_CTRUNC only
2562 # if an item has been partially
2563 # received.
2564 ignoreflags=socket.MSG_CTRUNC)
2565
2566 def _testCmsgTruncNoBufSize(self):
2567 self.createAndSendFDs(1)
2568
2569 def testCmsgTrunc0(self):
2570 # Check that no ancillary data is received when buffer size is 0.
2571 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2572 ignoreflags=socket.MSG_CTRUNC)
2573
2574 def _testCmsgTrunc0(self):
2575 self.createAndSendFDs(1)
2576
2577 # Check that no ancillary data is returned for various non-zero
2578 # (but still too small) buffer sizes.
2579
2580 def testCmsgTrunc1(self):
2581 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2582
2583 def _testCmsgTrunc1(self):
2584 self.createAndSendFDs(1)
2585
2586 def testCmsgTrunc2Int(self):
2587 # The cmsghdr structure has at least three members, two of
2588 # which are ints, so we still shouldn't see any ancillary
2589 # data.
2590 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2591 SIZEOF_INT * 2))
2592
2593 def _testCmsgTrunc2Int(self):
2594 self.createAndSendFDs(1)
2595
2596 def testCmsgTruncLen0Minus1(self):
2597 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2598 socket.CMSG_LEN(0) - 1))
2599
2600 def _testCmsgTruncLen0Minus1(self):
2601 self.createAndSendFDs(1)
2602
2603 # The following tests try to truncate the control message in the
2604 # middle of the FD array.
2605
2606 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2607 # Check that file descriptor data is truncated to between
2608 # mindata and maxdata bytes when received with buffer size
2609 # ancbuf, and that any complete file descriptor numbers are
2610 # valid.
2611 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2612 len(MSG), ancbuf)
2613 self.assertEqual(msg, MSG)
2614 self.checkRecvmsgAddress(addr, self.cli_addr)
2615 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2616
2617 if mindata == 0 and ancdata == []:
2618 return
2619 self.assertEqual(len(ancdata), 1)
2620 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2621 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2622 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2623 self.assertGreaterEqual(len(cmsg_data), mindata)
2624 self.assertLessEqual(len(cmsg_data), maxdata)
2625 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002626 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002627 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2628 self.checkFDs(fds)
2629
2630 def testCmsgTruncLen0(self):
2631 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2632
2633 def _testCmsgTruncLen0(self):
2634 self.createAndSendFDs(1)
2635
2636 def testCmsgTruncLen0Plus1(self):
2637 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2638
2639 def _testCmsgTruncLen0Plus1(self):
2640 self.createAndSendFDs(2)
2641
2642 def testCmsgTruncLen1(self):
2643 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2644 maxdata=SIZEOF_INT)
2645
2646 def _testCmsgTruncLen1(self):
2647 self.createAndSendFDs(2)
2648
2649 def testCmsgTruncLen2Minus1(self):
2650 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2651 maxdata=(2 * SIZEOF_INT) - 1)
2652
2653 def _testCmsgTruncLen2Minus1(self):
2654 self.createAndSendFDs(2)
2655
2656
2657class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2658 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2659 # features of the RFC 3542 Advanced Sockets API for IPv6.
2660 # Currently we can only handle certain data items (e.g. traffic
2661 # class, hop limit, MTU discovery and fragmentation settings)
2662 # without resorting to unportable means such as the struct module,
2663 # but the tests here are aimed at testing the ancillary data
2664 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2665 # itself.
2666
2667 # Test value to use when setting hop limit of packet
2668 hop_limit = 2
2669
2670 # Test value to use when setting traffic class of packet.
2671 # -1 means "use kernel default".
2672 traffic_class = -1
2673
2674 def ancillaryMapping(self, ancdata):
2675 # Given ancillary data list ancdata, return a mapping from
2676 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2677 # Check that no (level, type) pair appears more than once.
2678 d = {}
2679 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2680 self.assertNotIn((cmsg_level, cmsg_type), d)
2681 d[(cmsg_level, cmsg_type)] = cmsg_data
2682 return d
2683
2684 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2685 # Receive hop limit into ancbufsize bytes of ancillary data
2686 # space. Check that data is MSG, ancillary data is not
2687 # truncated (but ignore any flags in ignoreflags), and hop
2688 # limit is between 0 and maxhop inclusive.
2689 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2690 socket.IPV6_RECVHOPLIMIT, 1)
2691 self.misc_event.set()
2692 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2693 len(MSG), ancbufsize)
2694
2695 self.assertEqual(msg, MSG)
2696 self.checkRecvmsgAddress(addr, self.cli_addr)
2697 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2698 ignore=ignoreflags)
2699
2700 self.assertEqual(len(ancdata), 1)
2701 self.assertIsInstance(ancdata[0], tuple)
2702 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2703 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2704 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2705 self.assertIsInstance(cmsg_data, bytes)
2706 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2707 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002708 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002709 self.assertGreaterEqual(a[0], 0)
2710 self.assertLessEqual(a[0], maxhop)
2711
2712 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2713 def testRecvHopLimit(self):
2714 # Test receiving the packet hop limit as ancillary data.
2715 self.checkHopLimit(ancbufsize=10240)
2716
2717 @testRecvHopLimit.client_skip
2718 def _testRecvHopLimit(self):
2719 # Need to wait until server has asked to receive ancillary
2720 # data, as implementations are not required to buffer it
2721 # otherwise.
2722 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2723 self.sendToServer(MSG)
2724
2725 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2726 def testRecvHopLimitCMSG_SPACE(self):
2727 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2728 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2729
2730 @testRecvHopLimitCMSG_SPACE.client_skip
2731 def _testRecvHopLimitCMSG_SPACE(self):
2732 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2733 self.sendToServer(MSG)
2734
2735 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2736 # 3542 says portable applications must provide space for trailing
2737 # padding. Implementations may set MSG_CTRUNC if there isn't
2738 # enough space for the padding.
2739
2740 @requireAttrs(socket.socket, "sendmsg")
2741 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2742 def testSetHopLimit(self):
2743 # Test setting hop limit on outgoing packet and receiving it
2744 # at the other end.
2745 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2746
2747 @testSetHopLimit.client_skip
2748 def _testSetHopLimit(self):
2749 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2750 self.assertEqual(
2751 self.sendmsgToServer([MSG],
2752 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2753 array.array("i", [self.hop_limit]))]),
2754 len(MSG))
2755
2756 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2757 ignoreflags=0):
2758 # Receive traffic class and hop limit into ancbufsize bytes of
2759 # ancillary data space. Check that data is MSG, ancillary
2760 # data is not truncated (but ignore any flags in ignoreflags),
2761 # and traffic class and hop limit are in range (hop limit no
2762 # more than maxhop).
2763 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2764 socket.IPV6_RECVHOPLIMIT, 1)
2765 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2766 socket.IPV6_RECVTCLASS, 1)
2767 self.misc_event.set()
2768 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2769 len(MSG), ancbufsize)
2770
2771 self.assertEqual(msg, MSG)
2772 self.checkRecvmsgAddress(addr, self.cli_addr)
2773 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2774 ignore=ignoreflags)
2775 self.assertEqual(len(ancdata), 2)
2776 ancmap = self.ancillaryMapping(ancdata)
2777
2778 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2779 self.assertEqual(len(tcdata), SIZEOF_INT)
2780 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002781 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002782 self.assertGreaterEqual(a[0], 0)
2783 self.assertLessEqual(a[0], 255)
2784
2785 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2786 self.assertEqual(len(hldata), SIZEOF_INT)
2787 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002788 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002789 self.assertGreaterEqual(a[0], 0)
2790 self.assertLessEqual(a[0], maxhop)
2791
2792 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2793 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2794 def testRecvTrafficClassAndHopLimit(self):
2795 # Test receiving traffic class and hop limit as ancillary data.
2796 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2797
2798 @testRecvTrafficClassAndHopLimit.client_skip
2799 def _testRecvTrafficClassAndHopLimit(self):
2800 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2801 self.sendToServer(MSG)
2802
2803 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2804 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2805 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2806 # Test receiving traffic class and hop limit, using
2807 # CMSG_SPACE() to calculate buffer size.
2808 self.checkTrafficClassAndHopLimit(
2809 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2810
2811 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2812 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2813 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2814 self.sendToServer(MSG)
2815
2816 @requireAttrs(socket.socket, "sendmsg")
2817 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2818 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2819 def testSetTrafficClassAndHopLimit(self):
2820 # Test setting traffic class and hop limit on outgoing packet,
2821 # and receiving them at the other end.
2822 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2823 maxhop=self.hop_limit)
2824
2825 @testSetTrafficClassAndHopLimit.client_skip
2826 def _testSetTrafficClassAndHopLimit(self):
2827 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2828 self.assertEqual(
2829 self.sendmsgToServer([MSG],
2830 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2831 array.array("i", [self.traffic_class])),
2832 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2833 array.array("i", [self.hop_limit]))]),
2834 len(MSG))
2835
2836 @requireAttrs(socket.socket, "sendmsg")
2837 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2838 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2839 def testOddCmsgSize(self):
2840 # Try to send ancillary data with first item one byte too
2841 # long. Fall back to sending with correct size if this fails,
2842 # and check that second item was handled correctly.
2843 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2844 maxhop=self.hop_limit)
2845
2846 @testOddCmsgSize.client_skip
2847 def _testOddCmsgSize(self):
2848 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2849 try:
2850 nbytes = self.sendmsgToServer(
2851 [MSG],
2852 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002853 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002854 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2855 array.array("i", [self.hop_limit]))])
2856 except socket.error as e:
2857 self.assertIsInstance(e.errno, int)
2858 nbytes = self.sendmsgToServer(
2859 [MSG],
2860 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2861 array.array("i", [self.traffic_class])),
2862 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2863 array.array("i", [self.hop_limit]))])
2864 self.assertEqual(nbytes, len(MSG))
2865
2866 # Tests for proper handling of truncated ancillary data
2867
2868 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2869 # Receive hop limit into ancbufsize bytes of ancillary data
2870 # space, which should be too small to contain the ancillary
2871 # data header (if ancbufsize is None, pass no second argument
2872 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2873 # (unless included in ignoreflags), and no ancillary data is
2874 # returned.
2875 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2876 socket.IPV6_RECVHOPLIMIT, 1)
2877 self.misc_event.set()
2878 args = () if ancbufsize is None else (ancbufsize,)
2879 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2880 len(MSG), *args)
2881
2882 self.assertEqual(msg, MSG)
2883 self.checkRecvmsgAddress(addr, self.cli_addr)
2884 self.assertEqual(ancdata, [])
2885 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2886 ignore=ignoreflags)
2887
2888 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2889 def testCmsgTruncNoBufSize(self):
2890 # Check that no ancillary data is received when no ancillary
2891 # buffer size is provided.
2892 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2893 # BSD seems to set
2894 # MSG_CTRUNC only if an item
2895 # has been partially
2896 # received.
2897 ignoreflags=socket.MSG_CTRUNC)
2898
2899 @testCmsgTruncNoBufSize.client_skip
2900 def _testCmsgTruncNoBufSize(self):
2901 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2902 self.sendToServer(MSG)
2903
2904 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2905 def testSingleCmsgTrunc0(self):
2906 # Check that no ancillary data is received when ancillary
2907 # buffer size is zero.
2908 self.checkHopLimitTruncatedHeader(ancbufsize=0,
2909 ignoreflags=socket.MSG_CTRUNC)
2910
2911 @testSingleCmsgTrunc0.client_skip
2912 def _testSingleCmsgTrunc0(self):
2913 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2914 self.sendToServer(MSG)
2915
2916 # Check that no ancillary data is returned for various non-zero
2917 # (but still too small) buffer sizes.
2918
2919 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2920 def testSingleCmsgTrunc1(self):
2921 self.checkHopLimitTruncatedHeader(ancbufsize=1)
2922
2923 @testSingleCmsgTrunc1.client_skip
2924 def _testSingleCmsgTrunc1(self):
2925 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2926 self.sendToServer(MSG)
2927
2928 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2929 def testSingleCmsgTrunc2Int(self):
2930 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
2931
2932 @testSingleCmsgTrunc2Int.client_skip
2933 def _testSingleCmsgTrunc2Int(self):
2934 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2935 self.sendToServer(MSG)
2936
2937 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2938 def testSingleCmsgTruncLen0Minus1(self):
2939 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
2940
2941 @testSingleCmsgTruncLen0Minus1.client_skip
2942 def _testSingleCmsgTruncLen0Minus1(self):
2943 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2944 self.sendToServer(MSG)
2945
2946 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2947 def testSingleCmsgTruncInData(self):
2948 # Test truncation of a control message inside its associated
2949 # data. The message may be returned with its data truncated,
2950 # or not returned at all.
2951 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2952 socket.IPV6_RECVHOPLIMIT, 1)
2953 self.misc_event.set()
2954 msg, ancdata, flags, addr = self.doRecvmsg(
2955 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
2956
2957 self.assertEqual(msg, MSG)
2958 self.checkRecvmsgAddress(addr, self.cli_addr)
2959 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2960
2961 self.assertLessEqual(len(ancdata), 1)
2962 if ancdata:
2963 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2964 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2965 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2966 self.assertLess(len(cmsg_data), SIZEOF_INT)
2967
2968 @testSingleCmsgTruncInData.client_skip
2969 def _testSingleCmsgTruncInData(self):
2970 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2971 self.sendToServer(MSG)
2972
2973 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
2974 # Receive traffic class and hop limit into ancbufsize bytes of
2975 # ancillary data space, which should be large enough to
2976 # contain the first item, but too small to contain the header
2977 # of the second. Check that data is MSG, MSG_CTRUNC is set
2978 # (unless included in ignoreflags), and only one ancillary
2979 # data item is returned.
2980 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2981 socket.IPV6_RECVHOPLIMIT, 1)
2982 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2983 socket.IPV6_RECVTCLASS, 1)
2984 self.misc_event.set()
2985 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2986 len(MSG), ancbufsize)
2987
2988 self.assertEqual(msg, MSG)
2989 self.checkRecvmsgAddress(addr, self.cli_addr)
2990 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2991 ignore=ignoreflags)
2992
2993 self.assertEqual(len(ancdata), 1)
2994 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2995 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2996 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
2997 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2998 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002999 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003000 self.assertGreaterEqual(a[0], 0)
3001 self.assertLessEqual(a[0], 255)
3002
3003 # Try the above test with various buffer sizes.
3004
3005 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3006 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3007 def testSecondCmsgTrunc0(self):
3008 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3009 ignoreflags=socket.MSG_CTRUNC)
3010
3011 @testSecondCmsgTrunc0.client_skip
3012 def _testSecondCmsgTrunc0(self):
3013 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3014 self.sendToServer(MSG)
3015
3016 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3017 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3018 def testSecondCmsgTrunc1(self):
3019 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3020
3021 @testSecondCmsgTrunc1.client_skip
3022 def _testSecondCmsgTrunc1(self):
3023 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3024 self.sendToServer(MSG)
3025
3026 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3027 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3028 def testSecondCmsgTrunc2Int(self):
3029 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3030 2 * SIZEOF_INT)
3031
3032 @testSecondCmsgTrunc2Int.client_skip
3033 def _testSecondCmsgTrunc2Int(self):
3034 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3035 self.sendToServer(MSG)
3036
3037 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3038 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3039 def testSecondCmsgTruncLen0Minus1(self):
3040 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3041 socket.CMSG_LEN(0) - 1)
3042
3043 @testSecondCmsgTruncLen0Minus1.client_skip
3044 def _testSecondCmsgTruncLen0Minus1(self):
3045 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3046 self.sendToServer(MSG)
3047
3048 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3049 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3050 def testSecomdCmsgTruncInData(self):
3051 # Test truncation of the second of two control messages inside
3052 # its associated data.
3053 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3054 socket.IPV6_RECVHOPLIMIT, 1)
3055 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3056 socket.IPV6_RECVTCLASS, 1)
3057 self.misc_event.set()
3058 msg, ancdata, flags, addr = self.doRecvmsg(
3059 self.serv_sock, len(MSG),
3060 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3061
3062 self.assertEqual(msg, MSG)
3063 self.checkRecvmsgAddress(addr, self.cli_addr)
3064 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3065
3066 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3067
3068 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3069 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3070 cmsg_types.remove(cmsg_type)
3071 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3072 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003073 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003074 self.assertGreaterEqual(a[0], 0)
3075 self.assertLessEqual(a[0], 255)
3076
3077 if ancdata:
3078 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3079 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3080 cmsg_types.remove(cmsg_type)
3081 self.assertLess(len(cmsg_data), SIZEOF_INT)
3082
3083 self.assertEqual(ancdata, [])
3084
3085 @testSecomdCmsgTruncInData.client_skip
3086 def _testSecomdCmsgTruncInData(self):
3087 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3088 self.sendToServer(MSG)
3089
3090
3091# Derive concrete test classes for different socket types.
3092
3093class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3094 SendrecvmsgConnectionlessBase,
3095 ThreadedSocketTestMixin, UDPTestBase):
3096 pass
3097
3098@requireAttrs(socket.socket, "sendmsg")
3099@unittest.skipUnless(thread, 'Threading required for this test.')
3100class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3101 pass
3102
3103@requireAttrs(socket.socket, "recvmsg")
3104@unittest.skipUnless(thread, 'Threading required for this test.')
3105class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3106 pass
3107
3108@requireAttrs(socket.socket, "recvmsg_into")
3109@unittest.skipUnless(thread, 'Threading required for this test.')
3110class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3111 pass
3112
3113
3114class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3115 SendrecvmsgConnectionlessBase,
3116 ThreadedSocketTestMixin, UDP6TestBase):
3117 pass
3118
3119@requireAttrs(socket.socket, "sendmsg")
3120@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3121@requireSocket("AF_INET6", "SOCK_DGRAM")
3122@unittest.skipUnless(thread, 'Threading required for this test.')
3123class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3124 pass
3125
3126@requireAttrs(socket.socket, "recvmsg")
3127@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3128@requireSocket("AF_INET6", "SOCK_DGRAM")
3129@unittest.skipUnless(thread, 'Threading required for this test.')
3130class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3131 pass
3132
3133@requireAttrs(socket.socket, "recvmsg_into")
3134@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3135@requireSocket("AF_INET6", "SOCK_DGRAM")
3136@unittest.skipUnless(thread, 'Threading required for this test.')
3137class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3138 pass
3139
3140@requireAttrs(socket.socket, "recvmsg")
3141@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3142@requireAttrs(socket, "IPPROTO_IPV6")
3143@requireSocket("AF_INET6", "SOCK_DGRAM")
3144@unittest.skipUnless(thread, 'Threading required for this test.')
3145class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3146 SendrecvmsgUDP6TestBase):
3147 pass
3148
3149@requireAttrs(socket.socket, "recvmsg_into")
3150@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3151@requireAttrs(socket, "IPPROTO_IPV6")
3152@requireSocket("AF_INET6", "SOCK_DGRAM")
3153@unittest.skipUnless(thread, 'Threading required for this test.')
3154class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3155 RFC3542AncillaryTest,
3156 SendrecvmsgUDP6TestBase):
3157 pass
3158
3159
3160class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3161 ConnectedStreamTestMixin, TCPTestBase):
3162 pass
3163
3164@requireAttrs(socket.socket, "sendmsg")
3165@unittest.skipUnless(thread, 'Threading required for this test.')
3166class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3167 pass
3168
3169@requireAttrs(socket.socket, "recvmsg")
3170@unittest.skipUnless(thread, 'Threading required for this test.')
3171class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3172 SendrecvmsgTCPTestBase):
3173 pass
3174
3175@requireAttrs(socket.socket, "recvmsg_into")
3176@unittest.skipUnless(thread, 'Threading required for this test.')
3177class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3178 SendrecvmsgTCPTestBase):
3179 pass
3180
3181
3182class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3183 SendrecvmsgConnectedBase,
3184 ConnectedStreamTestMixin, SCTPStreamBase):
3185 pass
3186
3187@requireAttrs(socket.socket, "sendmsg")
3188@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3189@unittest.skipUnless(thread, 'Threading required for this test.')
3190class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3191 pass
3192
3193@requireAttrs(socket.socket, "recvmsg")
3194@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3195@unittest.skipUnless(thread, 'Threading required for this test.')
3196class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3197 SendrecvmsgSCTPStreamTestBase):
3198 pass
3199
3200@requireAttrs(socket.socket, "recvmsg_into")
3201@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3202@unittest.skipUnless(thread, 'Threading required for this test.')
3203class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3204 SendrecvmsgSCTPStreamTestBase):
3205 pass
3206
3207
3208class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3209 ConnectedStreamTestMixin, UnixStreamBase):
3210 pass
3211
3212@requireAttrs(socket.socket, "sendmsg")
3213@requireAttrs(socket, "AF_UNIX")
3214@unittest.skipUnless(thread, 'Threading required for this test.')
3215class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3216 pass
3217
3218@requireAttrs(socket.socket, "recvmsg")
3219@requireAttrs(socket, "AF_UNIX")
3220@unittest.skipUnless(thread, 'Threading required for this test.')
3221class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3222 SendrecvmsgUnixStreamTestBase):
3223 pass
3224
3225@requireAttrs(socket.socket, "recvmsg_into")
3226@requireAttrs(socket, "AF_UNIX")
3227@unittest.skipUnless(thread, 'Threading required for this test.')
3228class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3229 SendrecvmsgUnixStreamTestBase):
3230 pass
3231
3232@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3233@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3234@unittest.skipUnless(thread, 'Threading required for this test.')
3235class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3236 pass
3237
3238@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3239@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3240@unittest.skipUnless(thread, 'Threading required for this test.')
3241class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3242 SendrecvmsgUnixStreamTestBase):
3243 pass
3244
3245
3246# Test interrupting the interruptible send/receive methods with a
3247# signal when a timeout is set. These tests avoid having multiple
3248# threads alive during the test so that the OS cannot deliver the
3249# signal to the wrong one.
3250
3251class InterruptedTimeoutBase(unittest.TestCase):
3252 # Base class for interrupted send/receive tests. Installs an
3253 # empty handler for SIGALRM and removes it on teardown, along with
3254 # any scheduled alarms.
3255
3256 def setUp(self):
3257 super().setUp()
3258 orig_alrm_handler = signal.signal(signal.SIGALRM,
3259 lambda signum, frame: None)
3260 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3261 self.addCleanup(self.setAlarm, 0)
3262
3263 # Timeout for socket operations
3264 timeout = 4.0
3265
3266 # Provide setAlarm() method to schedule delivery of SIGALRM after
3267 # given number of seconds, or cancel it if zero, and an
3268 # appropriate time value to use. Use setitimer() if available.
3269 if hasattr(signal, "setitimer"):
3270 alarm_time = 0.05
3271
3272 def setAlarm(self, seconds):
3273 signal.setitimer(signal.ITIMER_REAL, seconds)
3274 else:
3275 # Old systems may deliver the alarm up to one second early
3276 alarm_time = 2
3277
3278 def setAlarm(self, seconds):
3279 signal.alarm(seconds)
3280
3281
3282# Require siginterrupt() in order to ensure that system calls are
3283# interrupted by default.
3284@requireAttrs(signal, "siginterrupt")
3285@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3286 "Don't have signal.alarm or signal.setitimer")
3287class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3288 # Test interrupting the recv*() methods with signals when a
3289 # timeout is set.
3290
3291 def setUp(self):
3292 super().setUp()
3293 self.serv.settimeout(self.timeout)
3294
3295 def checkInterruptedRecv(self, func, *args, **kwargs):
3296 # Check that func(*args, **kwargs) raises socket.error with an
3297 # errno of EINTR when interrupted by a signal.
3298 self.setAlarm(self.alarm_time)
3299 with self.assertRaises(socket.error) as cm:
3300 func(*args, **kwargs)
3301 self.assertNotIsInstance(cm.exception, socket.timeout)
3302 self.assertEqual(cm.exception.errno, errno.EINTR)
3303
3304 def testInterruptedRecvTimeout(self):
3305 self.checkInterruptedRecv(self.serv.recv, 1024)
3306
3307 def testInterruptedRecvIntoTimeout(self):
3308 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3309
3310 def testInterruptedRecvfromTimeout(self):
3311 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3312
3313 def testInterruptedRecvfromIntoTimeout(self):
3314 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3315
3316 @requireAttrs(socket.socket, "recvmsg")
3317 def testInterruptedRecvmsgTimeout(self):
3318 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3319
3320 @requireAttrs(socket.socket, "recvmsg_into")
3321 def testInterruptedRecvmsgIntoTimeout(self):
3322 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3323
3324
3325# Require siginterrupt() in order to ensure that system calls are
3326# interrupted by default.
3327@requireAttrs(signal, "siginterrupt")
3328@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3329 "Don't have signal.alarm or signal.setitimer")
3330@unittest.skipUnless(thread, 'Threading required for this test.')
3331class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3332 ThreadSafeCleanupTestCase,
3333 SocketListeningTestMixin, TCPTestBase):
3334 # Test interrupting the interruptible send*() methods with signals
3335 # when a timeout is set.
3336
3337 def setUp(self):
3338 super().setUp()
3339 self.serv_conn = self.newSocket()
3340 self.addCleanup(self.serv_conn.close)
3341 # Use a thread to complete the connection, but wait for it to
3342 # terminate before running the test, so that there is only one
3343 # thread to accept the signal.
3344 cli_thread = threading.Thread(target=self.doConnect)
3345 cli_thread.start()
3346 self.cli_conn, addr = self.serv.accept()
3347 self.addCleanup(self.cli_conn.close)
3348 cli_thread.join()
3349 self.serv_conn.settimeout(self.timeout)
3350
3351 def doConnect(self):
3352 self.serv_conn.connect(self.serv_addr)
3353
3354 def checkInterruptedSend(self, func, *args, **kwargs):
3355 # Check that func(*args, **kwargs), run in a loop, raises
3356 # socket.error with an errno of EINTR when interrupted by a
3357 # signal.
3358 with self.assertRaises(socket.error) as cm:
3359 while True:
3360 self.setAlarm(self.alarm_time)
3361 func(*args, **kwargs)
3362 self.assertNotIsInstance(cm.exception, socket.timeout)
3363 self.assertEqual(cm.exception.errno, errno.EINTR)
3364
Nick Coghlan2496f332011-09-19 20:26:31 +10003365 # Issue #12958: The following tests have problems on Mac OS X
3366 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003367 def testInterruptedSendTimeout(self):
3368 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3369
Nick Coghlan2496f332011-09-19 20:26:31 +10003370 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003371 def testInterruptedSendtoTimeout(self):
3372 # Passing an actual address here as Python's wrapper for
3373 # sendto() doesn't allow passing a zero-length one; POSIX
3374 # requires that the address is ignored since the socket is
3375 # connection-mode, however.
3376 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3377 self.serv_addr)
3378
Nick Coghlan2496f332011-09-19 20:26:31 +10003379 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003380 @requireAttrs(socket.socket, "sendmsg")
3381 def testInterruptedSendmsgTimeout(self):
3382 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3383
3384
Victor Stinner45df8202010-04-28 22:31:17 +00003385@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003386class TCPCloserTest(ThreadedTCPSocketTest):
3387
3388 def testClose(self):
3389 conn, addr = self.serv.accept()
3390 conn.close()
3391
3392 sd = self.cli
3393 read, write, err = select.select([sd], [], [], 1.0)
3394 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003395 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003396
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003397 # Calling close() many times should be safe.
3398 conn.close()
3399 conn.close()
3400
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003401 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003402 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003403 time.sleep(1.0)
3404
Victor Stinner45df8202010-04-28 22:31:17 +00003405@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003406class BasicSocketPairTest(SocketPairTest):
3407
3408 def __init__(self, methodName='runTest'):
3409 SocketPairTest.__init__(self, methodName=methodName)
3410
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003411 def _check_defaults(self, sock):
3412 self.assertIsInstance(sock, socket.socket)
3413 if hasattr(socket, 'AF_UNIX'):
3414 self.assertEqual(sock.family, socket.AF_UNIX)
3415 else:
3416 self.assertEqual(sock.family, socket.AF_INET)
3417 self.assertEqual(sock.type, socket.SOCK_STREAM)
3418 self.assertEqual(sock.proto, 0)
3419
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003420 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003421 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003422
3423 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003424 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003425
Dave Cole331708b2004-08-09 04:51:41 +00003426 def testRecv(self):
3427 msg = self.serv.recv(1024)
3428 self.assertEqual(msg, MSG)
3429
3430 def _testRecv(self):
3431 self.cli.send(MSG)
3432
3433 def testSend(self):
3434 self.serv.send(MSG)
3435
3436 def _testSend(self):
3437 msg = self.cli.recv(1024)
3438 self.assertEqual(msg, MSG)
3439
Victor Stinner45df8202010-04-28 22:31:17 +00003440@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003441class NonBlockingTCPTests(ThreadedTCPSocketTest):
3442
3443 def __init__(self, methodName='runTest'):
3444 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3445
3446 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003447 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003448 self.serv.setblocking(0)
3449 start = time.time()
3450 try:
3451 self.serv.accept()
3452 except socket.error:
3453 pass
3454 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003455 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003456
3457 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003458 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003459
Antoine Pitroub1c54962010-10-14 15:05:38 +00003460 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003461 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003462 def testInitNonBlocking(self):
3463 # reinit server socket
3464 self.serv.close()
3465 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003466 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003467 self.port = support.bind_port(self.serv)
3468 self.serv.listen(1)
3469 # actual testing
3470 start = time.time()
3471 try:
3472 self.serv.accept()
3473 except socket.error:
3474 pass
3475 end = time.time()
3476 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3477
3478 def _testInitNonBlocking(self):
3479 pass
3480
Antoine Pitrou600232b2011-01-05 21:03:42 +00003481 def testInheritFlags(self):
3482 # Issue #7995: when calling accept() on a listening socket with a
3483 # timeout, the resulting socket should not be non-blocking.
3484 self.serv.settimeout(10)
3485 try:
3486 conn, addr = self.serv.accept()
3487 message = conn.recv(len(MSG))
3488 finally:
3489 conn.close()
3490 self.serv.settimeout(None)
3491
3492 def _testInheritFlags(self):
3493 time.sleep(0.1)
3494 self.cli.connect((HOST, self.port))
3495 time.sleep(0.5)
3496 self.cli.send(MSG)
3497
Guido van Rossum24e4af82002-06-12 19:18:08 +00003498 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003499 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003500 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003501 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003502 conn, addr = self.serv.accept()
3503 except socket.error:
3504 pass
3505 else:
3506 self.fail("Error trying to do non-blocking accept.")
3507 read, write, err = select.select([self.serv], [], [])
3508 if self.serv in read:
3509 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003510 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003511 else:
3512 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003513
Guido van Rossum24e4af82002-06-12 19:18:08 +00003514 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003515 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003516 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003517
3518 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003519 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003520 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003521 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003522
3523 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003524 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003525 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003526
3527 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003528 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003529 conn, addr = self.serv.accept()
3530 conn.setblocking(0)
3531 try:
3532 msg = conn.recv(len(MSG))
3533 except socket.error:
3534 pass
3535 else:
3536 self.fail("Error trying to do non-blocking recv.")
3537 read, write, err = select.select([conn], [], [])
3538 if conn in read:
3539 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003540 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003541 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003542 else:
3543 self.fail("Error during select call to non-blocking socket.")
3544
3545 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003546 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003547 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003548 self.cli.send(MSG)
3549
Victor Stinner45df8202010-04-28 22:31:17 +00003550@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003551class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003552 """Unit tests for the object returned by socket.makefile()
3553
Antoine Pitrou834bd812010-10-13 16:17:14 +00003554 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003555 the client connection. You can read from this file to
3556 get output from the server.
3557
Antoine Pitrou834bd812010-10-13 16:17:14 +00003558 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003559 server connection. You can write to this file to send output
3560 to the client.
3561 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003562
Guido van Rossume9f66142002-08-07 15:46:19 +00003563 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003564 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003565 errors = 'strict'
3566 newline = None
3567
3568 read_mode = 'rb'
3569 read_msg = MSG
3570 write_mode = 'wb'
3571 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003572
Guido van Rossum24e4af82002-06-12 19:18:08 +00003573 def __init__(self, methodName='runTest'):
3574 SocketConnectedTest.__init__(self, methodName=methodName)
3575
3576 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003577 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3578 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003579 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003580 self.read_file = self.cli_conn.makefile(
3581 self.read_mode, self.bufsize,
3582 encoding = self.encoding,
3583 errors = self.errors,
3584 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003585
3586 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003587 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003588 self.read_file.close()
3589 self.assertTrue(self.read_file.closed)
3590 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003591 SocketConnectedTest.tearDown(self)
3592
3593 def clientSetUp(self):
3594 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003595 self.write_file = self.serv_conn.makefile(
3596 self.write_mode, self.bufsize,
3597 encoding = self.encoding,
3598 errors = self.errors,
3599 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003600
3601 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003602 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003603 self.write_file.close()
3604 self.assertTrue(self.write_file.closed)
3605 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003606 SocketConnectedTest.clientTearDown(self)
3607
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003608 def testReadAfterTimeout(self):
3609 # Issue #7322: A file object must disallow further reads
3610 # after a timeout has occurred.
3611 self.cli_conn.settimeout(1)
3612 self.read_file.read(3)
3613 # First read raises a timeout
3614 self.assertRaises(socket.timeout, self.read_file.read, 1)
3615 # Second read is disallowed
3616 with self.assertRaises(IOError) as ctx:
3617 self.read_file.read(1)
3618 self.assertIn("cannot read from timed out object", str(ctx.exception))
3619
3620 def _testReadAfterTimeout(self):
3621 self.write_file.write(self.write_msg[0:3])
3622 self.write_file.flush()
3623 self.serv_finished.wait()
3624
Guido van Rossum24e4af82002-06-12 19:18:08 +00003625 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003626 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003627 first_seg = self.read_file.read(len(self.read_msg)-3)
3628 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003629 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003630 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003631
3632 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003633 self.write_file.write(self.write_msg)
3634 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003635
Guido van Rossum8c943832002-08-08 01:00:28 +00003636 def testFullRead(self):
3637 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003638 msg = self.read_file.read()
3639 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003640
3641 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003642 self.write_file.write(self.write_msg)
3643 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003644
Guido van Rossum24e4af82002-06-12 19:18:08 +00003645 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003646 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003647 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003648 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003649 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003650 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003651 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003652 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003653 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003654
3655 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003656 self.write_file.write(self.write_msg)
3657 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003658
3659 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003660 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003661 line = self.read_file.readline()
3662 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003663
3664 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003665 self.write_file.write(self.write_msg)
3666 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003667
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003668 def testCloseAfterMakefile(self):
3669 # The file returned by makefile should keep the socket open.
3670 self.cli_conn.close()
3671 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003672 msg = self.read_file.read()
3673 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003674
3675 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003676 self.write_file.write(self.write_msg)
3677 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003678
3679 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003680 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003681 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003682 if isinstance(self.read_msg, str):
3683 msg = msg.decode()
3684 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003685
3686 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003687 self.write_file.write(self.write_msg)
3688 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003689
Tim Peters116d83c2004-03-28 02:20:45 +00003690 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003691 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003692
3693 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003694 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003695
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003696 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003697 self.assertEqual(self.read_file.mode, self.read_mode)
3698 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003699
3700 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003701 self.assertEqual(self.write_file.mode, self.write_mode)
3702 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003703
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003704 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003705 self.read_file.close()
3706 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003707 self.cli_conn.close()
3708 self.assertRaises(socket.error, self.cli_conn.getsockname)
3709
3710 def _testRealClose(self):
3711 pass
3712
3713
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003714class FileObjectInterruptedTestCase(unittest.TestCase):
3715 """Test that the file object correctly handles EINTR internally."""
3716
3717 class MockSocket(object):
3718 def __init__(self, recv_funcs=()):
3719 # A generator that returns callables that we'll call for each
3720 # call to recv().
3721 self._recv_step = iter(recv_funcs)
3722
3723 def recv_into(self, buffer):
3724 data = next(self._recv_step)()
3725 assert len(buffer) >= len(data)
3726 buffer[:len(data)] = data
3727 return len(data)
3728
3729 def _decref_socketios(self):
3730 pass
3731
3732 def _textiowrap_for_test(self, buffering=-1):
3733 raw = socket.SocketIO(self, "r")
3734 if buffering < 0:
3735 buffering = io.DEFAULT_BUFFER_SIZE
3736 if buffering == 0:
3737 return raw
3738 buffer = io.BufferedReader(raw, buffering)
3739 text = io.TextIOWrapper(buffer, None, None)
3740 text.mode = "rb"
3741 return text
3742
3743 @staticmethod
3744 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003745 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003746
3747 def _textiowrap_mock_socket(self, mock, buffering=-1):
3748 raw = socket.SocketIO(mock, "r")
3749 if buffering < 0:
3750 buffering = io.DEFAULT_BUFFER_SIZE
3751 if buffering == 0:
3752 return raw
3753 buffer = io.BufferedReader(raw, buffering)
3754 text = io.TextIOWrapper(buffer, None, None)
3755 text.mode = "rb"
3756 return text
3757
3758 def _test_readline(self, size=-1, buffering=-1):
3759 mock_sock = self.MockSocket(recv_funcs=[
3760 lambda : b"This is the first line\nAnd the sec",
3761 self._raise_eintr,
3762 lambda : b"ond line is here\n",
3763 lambda : b"",
3764 lambda : b"", # XXX(gps): io library does an extra EOF read
3765 ])
3766 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003767 self.assertEqual(fo.readline(size), "This is the first line\n")
3768 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003769
3770 def _test_read(self, size=-1, buffering=-1):
3771 mock_sock = self.MockSocket(recv_funcs=[
3772 lambda : b"This is the first line\nAnd the sec",
3773 self._raise_eintr,
3774 lambda : b"ond line is here\n",
3775 lambda : b"",
3776 lambda : b"", # XXX(gps): io library does an extra EOF read
3777 ])
3778 expecting = (b"This is the first line\n"
3779 b"And the second line is here\n")
3780 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3781 if buffering == 0:
3782 data = b''
3783 else:
3784 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003785 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003786 while len(data) != len(expecting):
3787 part = fo.read(size)
3788 if not part:
3789 break
3790 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003791 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003792
3793 def test_default(self):
3794 self._test_readline()
3795 self._test_readline(size=100)
3796 self._test_read()
3797 self._test_read(size=100)
3798
3799 def test_with_1k_buffer(self):
3800 self._test_readline(buffering=1024)
3801 self._test_readline(size=100, buffering=1024)
3802 self._test_read(buffering=1024)
3803 self._test_read(size=100, buffering=1024)
3804
3805 def _test_readline_no_buffer(self, size=-1):
3806 mock_sock = self.MockSocket(recv_funcs=[
3807 lambda : b"a",
3808 lambda : b"\n",
3809 lambda : b"B",
3810 self._raise_eintr,
3811 lambda : b"b",
3812 lambda : b"",
3813 ])
3814 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003815 self.assertEqual(fo.readline(size), b"a\n")
3816 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003817
3818 def test_no_buffer(self):
3819 self._test_readline_no_buffer()
3820 self._test_readline_no_buffer(size=4)
3821 self._test_read(buffering=0)
3822 self._test_read(size=100, buffering=0)
3823
3824
Guido van Rossume9f66142002-08-07 15:46:19 +00003825class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3826
3827 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003828
Guido van Rossume9f66142002-08-07 15:46:19 +00003829 In this case (and in this case only), it should be possible to
3830 create a file object, read a line from it, create another file
3831 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003832 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003833 when reading multiple requests from the same socket."""
3834
3835 bufsize = 0 # Use unbuffered mode
3836
3837 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003838 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003839 line = self.read_file.readline() # first line
3840 self.assertEqual(line, b"A. " + self.write_msg) # first line
3841 self.read_file = self.cli_conn.makefile('rb', 0)
3842 line = self.read_file.readline() # second line
3843 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003844
3845 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003846 self.write_file.write(b"A. " + self.write_msg)
3847 self.write_file.write(b"B. " + self.write_msg)
3848 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003849
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003850 def testMakefileClose(self):
3851 # The file returned by makefile should keep the socket open...
3852 self.cli_conn.close()
3853 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003854 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003855 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003856 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003857 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3858
3859 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003860 self.write_file.write(self.write_msg)
3861 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003862
3863 def testMakefileCloseSocketDestroy(self):
3864 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003865 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003866 refcount_after = sys.getrefcount(self.cli_conn)
3867 self.assertEqual(refcount_before - 1, refcount_after)
3868
3869 def _testMakefileCloseSocketDestroy(self):
3870 pass
3871
Antoine Pitrou98b46702010-09-18 22:59:00 +00003872 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003873 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003874 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3875
3876 def testSmallReadNonBlocking(self):
3877 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003878 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3879 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003880 self.evt1.set()
3881 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003882 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003883 if first_seg is None:
3884 # Data not arrived (can happen under Windows), wait a bit
3885 time.sleep(0.5)
3886 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003887 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003888 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003889 self.assertEqual(n, 3)
3890 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003891 self.assertEqual(msg, self.read_msg)
3892 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3893 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003894
3895 def _testSmallReadNonBlocking(self):
3896 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003897 self.write_file.write(self.write_msg)
3898 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003899 self.evt2.set()
3900 # Avoid cloding the socket before the server test has finished,
3901 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3902 self.serv_finished.wait(5.0)
3903
3904 def testWriteNonBlocking(self):
3905 self.cli_finished.wait(5.0)
3906 # The client thread can't skip directly - the SkipTest exception
3907 # would appear as a failure.
3908 if self.serv_skipped:
3909 self.skipTest(self.serv_skipped)
3910
3911 def _testWriteNonBlocking(self):
3912 self.serv_skipped = None
3913 self.serv_conn.setblocking(False)
3914 # Try to saturate the socket buffer pipe with repeated large writes.
3915 BIG = b"x" * (1024 ** 2)
3916 LIMIT = 10
3917 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00003918 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003919 self.assertGreater(n, 0)
3920 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003921 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003922 if n is None:
3923 # Succeeded
3924 break
3925 self.assertGreater(n, 0)
3926 else:
3927 # Let us know that this test didn't manage to establish
3928 # the expected conditions. This is not a failure in itself but,
3929 # if it happens repeatedly, the test should be fixed.
3930 self.serv_skipped = "failed to saturate the socket buffer"
3931
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003932
Guido van Rossum8c943832002-08-08 01:00:28 +00003933class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3934
3935 bufsize = 1 # Default-buffered for reading; line-buffered for writing
3936
3937
3938class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3939
3940 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00003941
Thomas Woutersb2137042007-02-01 18:02:27 +00003942
Antoine Pitrou834bd812010-10-13 16:17:14 +00003943class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
3944 """Tests for socket.makefile() in text mode (rather than binary)"""
3945
3946 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003947 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003948 write_mode = 'wb'
3949 write_msg = MSG
3950 newline = ''
3951
3952
3953class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
3954 """Tests for socket.makefile() in text mode (rather than binary)"""
3955
3956 read_mode = 'rb'
3957 read_msg = MSG
3958 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003959 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003960 newline = ''
3961
3962
3963class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
3964 """Tests for socket.makefile() in text mode (rather than binary)"""
3965
3966 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003967 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003968 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003969 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003970 newline = ''
3971
3972
Guido van Rossumd8faa362007-04-27 19:54:29 +00003973class NetworkConnectionTest(object):
3974 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003975
Guido van Rossumd8faa362007-04-27 19:54:29 +00003976 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003977 # We're inherited below by BasicTCPTest2, which also inherits
3978 # BasicTCPTest, which defines self.port referenced below.
3979 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003980 self.serv_conn = self.cli
3981
3982class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
3983 """Tests that NetworkConnection does not break existing TCP functionality.
3984 """
3985
3986class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003987
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003988 class MockSocket(socket.socket):
3989 def connect(self, *args):
3990 raise socket.timeout('timed out')
3991
3992 @contextlib.contextmanager
3993 def mocked_socket_module(self):
3994 """Return a socket which times out on connect"""
3995 old_socket = socket.socket
3996 socket.socket = self.MockSocket
3997 try:
3998 yield
3999 finally:
4000 socket.socket = old_socket
4001
4002 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004003 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004004 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004005 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004006 with self.assertRaises(socket.error) as cm:
4007 cli.connect((HOST, port))
4008 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4009
4010 def test_create_connection(self):
4011 # Issue #9792: errors raised by create_connection() should have
4012 # a proper errno attribute.
4013 port = support.find_unused_port()
4014 with self.assertRaises(socket.error) as cm:
4015 socket.create_connection((HOST, port))
4016 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4017
4018 def test_create_connection_timeout(self):
4019 # Issue #9792: create_connection() should not recast timeout errors
4020 # as generic socket errors.
4021 with self.mocked_socket_module():
4022 with self.assertRaises(socket.timeout):
4023 socket.create_connection((HOST, 1234))
4024
Guido van Rossumd8faa362007-04-27 19:54:29 +00004025
Victor Stinner45df8202010-04-28 22:31:17 +00004026@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004027class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4028
4029 def __init__(self, methodName='runTest'):
4030 SocketTCPTest.__init__(self, methodName=methodName)
4031 ThreadableTest.__init__(self)
4032
4033 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004034 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004035
4036 def clientTearDown(self):
4037 self.cli.close()
4038 self.cli = None
4039 ThreadableTest.clientTearDown(self)
4040
4041 def _justAccept(self):
4042 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004043 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004044
4045 testFamily = _justAccept
4046 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004047 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004048 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004049 self.assertEqual(self.cli.family, 2)
4050
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004051 testSourceAddress = _justAccept
4052 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004053 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4054 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004055 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004056 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004057 # The port number being used is sufficient to show that the bind()
4058 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004059
Guido van Rossumd8faa362007-04-27 19:54:29 +00004060 testTimeoutDefault = _justAccept
4061 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004062 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004063 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004064 socket.setdefaulttimeout(42)
4065 try:
4066 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004067 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004068 finally:
4069 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004070 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004071
4072 testTimeoutNone = _justAccept
4073 def _testTimeoutNone(self):
4074 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004075 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004076 socket.setdefaulttimeout(30)
4077 try:
4078 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004079 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004080 finally:
4081 socket.setdefaulttimeout(None)
4082 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004083
4084 testTimeoutValueNamed = _justAccept
4085 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004086 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004087 self.assertEqual(self.cli.gettimeout(), 30)
4088
4089 testTimeoutValueNonamed = _justAccept
4090 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004091 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004092 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004093 self.assertEqual(self.cli.gettimeout(), 30)
4094
Victor Stinner45df8202010-04-28 22:31:17 +00004095@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004096class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4097
4098 def __init__(self, methodName='runTest'):
4099 SocketTCPTest.__init__(self, methodName=methodName)
4100 ThreadableTest.__init__(self)
4101
4102 def clientSetUp(self):
4103 pass
4104
4105 def clientTearDown(self):
4106 self.cli.close()
4107 self.cli = None
4108 ThreadableTest.clientTearDown(self)
4109
4110 def testInsideTimeout(self):
4111 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004112 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004113 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004114 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004115 testOutsideTimeout = testInsideTimeout
4116
4117 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004118 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004119 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004120 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004121
4122 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004123 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004124 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004125
4126
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004127class TCPTimeoutTest(SocketTCPTest):
4128
4129 def testTCPTimeout(self):
4130 def raise_timeout(*args, **kwargs):
4131 self.serv.settimeout(1.0)
4132 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004133 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004134 "Error generating a timeout exception (TCP)")
4135
4136 def testTimeoutZero(self):
4137 ok = False
4138 try:
4139 self.serv.settimeout(0.0)
4140 foo = self.serv.accept()
4141 except socket.timeout:
4142 self.fail("caught timeout instead of error (TCP)")
4143 except socket.error:
4144 ok = True
4145 except:
4146 self.fail("caught unexpected exception (TCP)")
4147 if not ok:
4148 self.fail("accept() returned success when we did not expect it")
4149
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004150 def testInterruptedTimeout(self):
4151 # XXX I don't know how to do this test on MSWindows or any other
4152 # plaform that doesn't support signal.alarm() or os.kill(), though
4153 # the bug should have existed on all platforms.
4154 if not hasattr(signal, "alarm"):
4155 return # can only test on *nix
4156 self.serv.settimeout(5.0) # must be longer than alarm
4157 class Alarm(Exception):
4158 pass
4159 def alarm_handler(signal, frame):
4160 raise Alarm
4161 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4162 try:
4163 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4164 try:
4165 foo = self.serv.accept()
4166 except socket.timeout:
4167 self.fail("caught timeout instead of Alarm")
4168 except Alarm:
4169 pass
4170 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004171 self.fail("caught other exception instead of Alarm:"
4172 " %s(%s):\n%s" %
4173 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004174 else:
4175 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004176 finally:
4177 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004178 except Alarm:
4179 self.fail("got Alarm in wrong place")
4180 finally:
4181 # no alarm can be pending. Safe to restore old handler.
4182 signal.signal(signal.SIGALRM, old_alarm)
4183
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004184class UDPTimeoutTest(SocketTCPTest):
4185
4186 def testUDPTimeout(self):
4187 def raise_timeout(*args, **kwargs):
4188 self.serv.settimeout(1.0)
4189 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004190 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004191 "Error generating a timeout exception (UDP)")
4192
4193 def testTimeoutZero(self):
4194 ok = False
4195 try:
4196 self.serv.settimeout(0.0)
4197 foo = self.serv.recv(1024)
4198 except socket.timeout:
4199 self.fail("caught timeout instead of error (UDP)")
4200 except socket.error:
4201 ok = True
4202 except:
4203 self.fail("caught unexpected exception (UDP)")
4204 if not ok:
4205 self.fail("recv() returned success when we did not expect it")
4206
4207class TestExceptions(unittest.TestCase):
4208
4209 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004210 self.assertTrue(issubclass(socket.error, Exception))
4211 self.assertTrue(issubclass(socket.herror, socket.error))
4212 self.assertTrue(issubclass(socket.gaierror, socket.error))
4213 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004214
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004215class TestLinuxAbstractNamespace(unittest.TestCase):
4216
4217 UNIX_PATH_MAX = 108
4218
4219 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004220 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004221 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4222 s1.bind(address)
4223 s1.listen(1)
4224 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4225 s2.connect(s1.getsockname())
4226 with s1.accept()[0] as s3:
4227 self.assertEqual(s1.getsockname(), address)
4228 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004229
4230 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004231 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004232 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4233 s.bind(address)
4234 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004235
4236 def testNameOverflow(self):
4237 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004238 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4239 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004240
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004241
Victor Stinner45df8202010-04-28 22:31:17 +00004242@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004243class BufferIOTest(SocketConnectedTest):
4244 """
4245 Test the buffer versions of socket.recv() and socket.send().
4246 """
4247 def __init__(self, methodName='runTest'):
4248 SocketConnectedTest.__init__(self, methodName=methodName)
4249
Antoine Pitrou25480782010-03-17 22:50:28 +00004250 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004251 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004252 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004253 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004254 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004255 self.assertEqual(msg, MSG)
4256
Antoine Pitrou25480782010-03-17 22:50:28 +00004257 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004258 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004259 self.serv_conn.send(buf)
4260
Antoine Pitrou25480782010-03-17 22:50:28 +00004261 def testRecvIntoBytearray(self):
4262 buf = bytearray(1024)
4263 nbytes = self.cli_conn.recv_into(buf)
4264 self.assertEqual(nbytes, len(MSG))
4265 msg = buf[:len(MSG)]
4266 self.assertEqual(msg, MSG)
4267
4268 _testRecvIntoBytearray = _testRecvIntoArray
4269
4270 def testRecvIntoMemoryview(self):
4271 buf = bytearray(1024)
4272 nbytes = self.cli_conn.recv_into(memoryview(buf))
4273 self.assertEqual(nbytes, len(MSG))
4274 msg = buf[:len(MSG)]
4275 self.assertEqual(msg, MSG)
4276
4277 _testRecvIntoMemoryview = _testRecvIntoArray
4278
4279 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004280 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004281 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004282 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004283 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004284 self.assertEqual(msg, MSG)
4285
Antoine Pitrou25480782010-03-17 22:50:28 +00004286 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004287 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004288 self.serv_conn.send(buf)
4289
Antoine Pitrou25480782010-03-17 22:50:28 +00004290 def testRecvFromIntoBytearray(self):
4291 buf = bytearray(1024)
4292 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4293 self.assertEqual(nbytes, len(MSG))
4294 msg = buf[:len(MSG)]
4295 self.assertEqual(msg, MSG)
4296
4297 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4298
4299 def testRecvFromIntoMemoryview(self):
4300 buf = bytearray(1024)
4301 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4302 self.assertEqual(nbytes, len(MSG))
4303 msg = buf[:len(MSG)]
4304 self.assertEqual(msg, MSG)
4305
4306 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4307
Christian Heimes043d6f62008-01-07 17:19:16 +00004308
4309TIPC_STYPE = 2000
4310TIPC_LOWER = 200
4311TIPC_UPPER = 210
4312
4313def isTipcAvailable():
4314 """Check if the TIPC module is loaded
4315
4316 The TIPC module is not loaded automatically on Ubuntu and probably
4317 other Linux distros.
4318 """
4319 if not hasattr(socket, "AF_TIPC"):
4320 return False
4321 if not os.path.isfile("/proc/modules"):
4322 return False
4323 with open("/proc/modules") as f:
4324 for line in f:
4325 if line.startswith("tipc "):
4326 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004327 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004328 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4329 return False
4330
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004331class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004332 def testRDM(self):
4333 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4334 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004335 self.addCleanup(srv.close)
4336 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004337
4338 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4339 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4340 TIPC_LOWER, TIPC_UPPER)
4341 srv.bind(srvaddr)
4342
4343 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4344 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4345 cli.sendto(MSG, sendaddr)
4346
4347 msg, recvaddr = srv.recvfrom(1024)
4348
4349 self.assertEqual(cli.getsockname(), recvaddr)
4350 self.assertEqual(msg, MSG)
4351
4352
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004353class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004354 def __init__(self, methodName = 'runTest'):
4355 unittest.TestCase.__init__(self, methodName = methodName)
4356 ThreadableTest.__init__(self)
4357
4358 def setUp(self):
4359 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004360 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004361 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4362 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4363 TIPC_LOWER, TIPC_UPPER)
4364 self.srv.bind(srvaddr)
4365 self.srv.listen(5)
4366 self.serverExplicitReady()
4367 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004368 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004369
4370 def clientSetUp(self):
4371 # The is a hittable race between serverExplicitReady() and the
4372 # accept() call; sleep a little while to avoid it, otherwise
4373 # we could get an exception
4374 time.sleep(0.1)
4375 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004376 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004377 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4378 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4379 self.cli.connect(addr)
4380 self.cliaddr = self.cli.getsockname()
4381
4382 def testStream(self):
4383 msg = self.conn.recv(1024)
4384 self.assertEqual(msg, MSG)
4385 self.assertEqual(self.cliaddr, self.connaddr)
4386
4387 def _testStream(self):
4388 self.cli.send(MSG)
4389 self.cli.close()
4390
4391
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004392@unittest.skipUnless(thread, 'Threading required for this test.')
4393class ContextManagersTest(ThreadedTCPSocketTest):
4394
4395 def _testSocketClass(self):
4396 # base test
4397 with socket.socket() as sock:
4398 self.assertFalse(sock._closed)
4399 self.assertTrue(sock._closed)
4400 # close inside with block
4401 with socket.socket() as sock:
4402 sock.close()
4403 self.assertTrue(sock._closed)
4404 # exception inside with block
4405 with socket.socket() as sock:
4406 self.assertRaises(socket.error, sock.sendall, b'foo')
4407 self.assertTrue(sock._closed)
4408
4409 def testCreateConnectionBase(self):
4410 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004411 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004412 data = conn.recv(1024)
4413 conn.sendall(data)
4414
4415 def _testCreateConnectionBase(self):
4416 address = self.serv.getsockname()
4417 with socket.create_connection(address) as sock:
4418 self.assertFalse(sock._closed)
4419 sock.sendall(b'foo')
4420 self.assertEqual(sock.recv(1024), b'foo')
4421 self.assertTrue(sock._closed)
4422
4423 def testCreateConnectionClose(self):
4424 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004425 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004426 data = conn.recv(1024)
4427 conn.sendall(data)
4428
4429 def _testCreateConnectionClose(self):
4430 address = self.serv.getsockname()
4431 with socket.create_connection(address) as sock:
4432 sock.close()
4433 self.assertTrue(sock._closed)
4434 self.assertRaises(socket.error, sock.sendall, b'foo')
4435
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004436
Antoine Pitroub1c54962010-10-14 15:05:38 +00004437@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4438 "SOCK_CLOEXEC not defined")
4439@unittest.skipUnless(fcntl, "module fcntl not available")
4440class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004441 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004442 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004443 with socket.socket(socket.AF_INET,
4444 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4445 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4446 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004447
4448
4449@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4450 "SOCK_NONBLOCK not defined")
4451class NonblockConstantTest(unittest.TestCase):
4452 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4453 if nonblock:
4454 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4455 self.assertEqual(s.gettimeout(), timeout)
4456 else:
4457 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4458 self.assertEqual(s.gettimeout(), None)
4459
Charles-François Natali239bb962011-06-03 12:55:15 +02004460 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004461 def test_SOCK_NONBLOCK(self):
4462 # a lot of it seems silly and redundant, but I wanted to test that
4463 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004464 with socket.socket(socket.AF_INET,
4465 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4466 self.checkNonblock(s)
4467 s.setblocking(1)
4468 self.checkNonblock(s, False)
4469 s.setblocking(0)
4470 self.checkNonblock(s)
4471 s.settimeout(None)
4472 self.checkNonblock(s, False)
4473 s.settimeout(2.0)
4474 self.checkNonblock(s, timeout=2.0)
4475 s.setblocking(1)
4476 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004477 # defaulttimeout
4478 t = socket.getdefaulttimeout()
4479 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004480 with socket.socket() as s:
4481 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004482 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004483 with socket.socket() as s:
4484 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004485 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004486 with socket.socket() as s:
4487 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004488 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004489 with socket.socket() as s:
4490 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004491 socket.setdefaulttimeout(t)
4492
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004493
Guido van Rossumb995eb72002-07-31 16:08:40 +00004494def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004495 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004496 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004497
4498 tests.extend([
4499 NonBlockingTCPTests,
4500 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004501 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004502 UnbufferedFileObjectClassTestCase,
4503 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004504 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004505 UnicodeReadFileObjectClassTestCase,
4506 UnicodeWriteFileObjectClassTestCase,
4507 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004508 NetworkConnectionNoServer,
4509 NetworkConnectionAttributesTest,
4510 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004511 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004512 CloexecConstantTest,
4513 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004514 ])
Dave Cole331708b2004-08-09 04:51:41 +00004515 if hasattr(socket, "socketpair"):
4516 tests.append(BasicSocketPairTest)
Victor Stinnere6747472011-08-21 00:39:18 +02004517 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004518 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004519 if isTipcAvailable():
4520 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004521 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004522 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004523 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004524 tests.extend([
4525 CmsgMacroTests,
4526 SendmsgUDPTest,
4527 RecvmsgUDPTest,
4528 RecvmsgIntoUDPTest,
4529 SendmsgUDP6Test,
4530 RecvmsgUDP6Test,
4531 RecvmsgRFC3542AncillaryUDP6Test,
4532 RecvmsgIntoRFC3542AncillaryUDP6Test,
4533 RecvmsgIntoUDP6Test,
4534 SendmsgTCPTest,
4535 RecvmsgTCPTest,
4536 RecvmsgIntoTCPTest,
4537 SendmsgSCTPStreamTest,
4538 RecvmsgSCTPStreamTest,
4539 RecvmsgIntoSCTPStreamTest,
4540 SendmsgUnixStreamTest,
4541 RecvmsgUnixStreamTest,
4542 RecvmsgIntoUnixStreamTest,
4543 RecvmsgSCMRightsStreamTest,
4544 RecvmsgIntoSCMRightsStreamTest,
4545 # These are slow when setitimer() is not available
4546 InterruptedRecvTimeoutTest,
4547 InterruptedSendTimeoutTest,
4548 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004549
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004550 thread_info = support.threading_setup()
4551 support.run_unittest(*tests)
4552 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004553
4554if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004555 test_main()