blob: 9deee01a224c27773c8c32fd3fb241d78e3381a4 [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)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100308
309 def clientSetUp(self):
310 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
311 try:
312 # RDS sockets must be bound explicitly to send or receive data
313 self.cli.bind((HOST, 0))
314 self.cli_addr = self.cli.getsockname()
315 except OSError:
316 # skipTest should not be called here, and will be called in the
317 # server instead
318 pass
319
320 def clientTearDown(self):
321 self.cli.close()
322 self.cli = None
323 ThreadableTest.clientTearDown(self)
324
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000326 """Socket tests for client-server connection.
327
328 self.cli_conn is a client socket connected to the server. The
329 setUp() method guarantees that it is connected to the server.
330 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000331
332 def __init__(self, methodName='runTest'):
333 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
334
335 def setUp(self):
336 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000337 # Indicate explicitly we're ready for the client thread to
338 # proceed and then perform the blocking call to accept
339 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000340 conn, addr = self.serv.accept()
341 self.cli_conn = conn
342
343 def tearDown(self):
344 self.cli_conn.close()
345 self.cli_conn = None
346 ThreadedTCPSocketTest.tearDown(self)
347
348 def clientSetUp(self):
349 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000350 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000351 self.serv_conn = self.cli
352
353 def clientTearDown(self):
354 self.serv_conn.close()
355 self.serv_conn = None
356 ThreadedTCPSocketTest.clientTearDown(self)
357
Dave Cole331708b2004-08-09 04:51:41 +0000358class SocketPairTest(unittest.TestCase, ThreadableTest):
359
360 def __init__(self, methodName='runTest'):
361 unittest.TestCase.__init__(self, methodName=methodName)
362 ThreadableTest.__init__(self)
363
364 def setUp(self):
365 self.serv, self.cli = socket.socketpair()
366
367 def tearDown(self):
368 self.serv.close()
369 self.serv = None
370
371 def clientSetUp(self):
372 pass
373
374 def clientTearDown(self):
375 self.cli.close()
376 self.cli = None
377 ThreadableTest.clientTearDown(self)
378
Tim Peters494aaee2004-08-09 18:54:11 +0000379
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000380# The following classes are used by the sendmsg()/recvmsg() tests.
381# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
382# gives a drop-in replacement for SocketConnectedTest, but different
383# address families can be used, and the attributes serv_addr and
384# cli_addr will be set to the addresses of the endpoints.
385
386class SocketTestBase(unittest.TestCase):
387 """A base class for socket tests.
388
389 Subclasses must provide methods newSocket() to return a new socket
390 and bindSock(sock) to bind it to an unused address.
391
392 Creates a socket self.serv and sets self.serv_addr to its address.
393 """
394
395 def setUp(self):
396 self.serv = self.newSocket()
397 self.bindServer()
398
399 def bindServer(self):
400 """Bind server socket and set self.serv_addr to its address."""
401 self.bindSock(self.serv)
402 self.serv_addr = self.serv.getsockname()
403
404 def tearDown(self):
405 self.serv.close()
406 self.serv = None
407
408
409class SocketListeningTestMixin(SocketTestBase):
410 """Mixin to listen on the server socket."""
411
412 def setUp(self):
413 super().setUp()
414 self.serv.listen(1)
415
416
417class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
418 ThreadableTest):
419 """Mixin to add client socket and allow client/server tests.
420
421 Client socket is self.cli and its address is self.cli_addr. See
422 ThreadableTest for usage information.
423 """
424
425 def __init__(self, *args, **kwargs):
426 super().__init__(*args, **kwargs)
427 ThreadableTest.__init__(self)
428
429 def clientSetUp(self):
430 self.cli = self.newClientSocket()
431 self.bindClient()
432
433 def newClientSocket(self):
434 """Return a new socket for use as client."""
435 return self.newSocket()
436
437 def bindClient(self):
438 """Bind client socket and set self.cli_addr to its address."""
439 self.bindSock(self.cli)
440 self.cli_addr = self.cli.getsockname()
441
442 def clientTearDown(self):
443 self.cli.close()
444 self.cli = None
445 ThreadableTest.clientTearDown(self)
446
447
448class ConnectedStreamTestMixin(SocketListeningTestMixin,
449 ThreadedSocketTestMixin):
450 """Mixin to allow client/server stream tests with connected client.
451
452 Server's socket representing connection to client is self.cli_conn
453 and client's connection to server is self.serv_conn. (Based on
454 SocketConnectedTest.)
455 """
456
457 def setUp(self):
458 super().setUp()
459 # Indicate explicitly we're ready for the client thread to
460 # proceed and then perform the blocking call to accept
461 self.serverExplicitReady()
462 conn, addr = self.serv.accept()
463 self.cli_conn = conn
464
465 def tearDown(self):
466 self.cli_conn.close()
467 self.cli_conn = None
468 super().tearDown()
469
470 def clientSetUp(self):
471 super().clientSetUp()
472 self.cli.connect(self.serv_addr)
473 self.serv_conn = self.cli
474
475 def clientTearDown(self):
476 self.serv_conn.close()
477 self.serv_conn = None
478 super().clientTearDown()
479
480
481class UnixSocketTestBase(SocketTestBase):
482 """Base class for Unix-domain socket tests."""
483
484 # This class is used for file descriptor passing tests, so we
485 # create the sockets in a private directory so that other users
486 # can't send anything that might be problematic for a privileged
487 # user running the tests.
488
489 def setUp(self):
490 self.dir_path = tempfile.mkdtemp()
491 self.addCleanup(os.rmdir, self.dir_path)
492 super().setUp()
493
494 def bindSock(self, sock):
495 path = tempfile.mktemp(dir=self.dir_path)
496 sock.bind(path)
497 self.addCleanup(support.unlink, path)
498
499class UnixStreamBase(UnixSocketTestBase):
500 """Base class for Unix-domain SOCK_STREAM tests."""
501
502 def newSocket(self):
503 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
504
505
506class InetTestBase(SocketTestBase):
507 """Base class for IPv4 socket tests."""
508
509 host = HOST
510
511 def setUp(self):
512 super().setUp()
513 self.port = self.serv_addr[1]
514
515 def bindSock(self, sock):
516 support.bind_port(sock, host=self.host)
517
518class TCPTestBase(InetTestBase):
519 """Base class for TCP-over-IPv4 tests."""
520
521 def newSocket(self):
522 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
523
524class UDPTestBase(InetTestBase):
525 """Base class for UDP-over-IPv4 tests."""
526
527 def newSocket(self):
528 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
529
530class SCTPStreamBase(InetTestBase):
531 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
532
533 def newSocket(self):
534 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
535 socket.IPPROTO_SCTP)
536
537
538class Inet6TestBase(InetTestBase):
539 """Base class for IPv6 socket tests."""
540
541 # Don't use "localhost" here - it may not have an IPv6 address
542 # assigned to it by default (e.g. in /etc/hosts), and if someone
543 # has assigned it an IPv4-mapped address, then it's unlikely to
544 # work with the full IPv6 API.
545 host = "::1"
546
547class UDP6TestBase(Inet6TestBase):
548 """Base class for UDP-over-IPv6 tests."""
549
550 def newSocket(self):
551 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
552
553
554# Test-skipping decorators for use with ThreadableTest.
555
556def skipWithClientIf(condition, reason):
557 """Skip decorated test if condition is true, add client_skip decorator.
558
559 If the decorated object is not a class, sets its attribute
560 "client_skip" to a decorator which will return an empty function
561 if the test is to be skipped, or the original function if it is
562 not. This can be used to avoid running the client part of a
563 skipped test when using ThreadableTest.
564 """
565 def client_pass(*args, **kwargs):
566 pass
567 def skipdec(obj):
568 retval = unittest.skip(reason)(obj)
569 if not isinstance(obj, type):
570 retval.client_skip = lambda f: client_pass
571 return retval
572 def noskipdec(obj):
573 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
574 obj.client_skip = lambda f: f
575 return obj
576 return skipdec if condition else noskipdec
577
578
579def requireAttrs(obj, *attributes):
580 """Skip decorated test if obj is missing any of the given attributes.
581
582 Sets client_skip attribute as skipWithClientIf() does.
583 """
584 missing = [name for name in attributes if not hasattr(obj, name)]
585 return skipWithClientIf(
586 missing, "don't have " + ", ".join(name for name in missing))
587
588
589def requireSocket(*args):
590 """Skip decorated test if a socket cannot be created with given arguments.
591
592 When an argument is given as a string, will use the value of that
593 attribute of the socket module, or skip the test if it doesn't
594 exist. Sets client_skip attribute as skipWithClientIf() does.
595 """
596 err = None
597 missing = [obj for obj in args if
598 isinstance(obj, str) and not hasattr(socket, obj)]
599 if missing:
600 err = "don't have " + ", ".join(name for name in missing)
601 else:
602 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
603 for obj in args]
604 try:
605 s = socket.socket(*callargs)
606 except socket.error as e:
607 # XXX: check errno?
608 err = str(e)
609 else:
610 s.close()
611 return skipWithClientIf(
612 err is not None,
613 "can't create socket({0}): {1}".format(
614 ", ".join(str(o) for o in args), err))
615
616
Guido van Rossum24e4af82002-06-12 19:18:08 +0000617#######################################################################
618## Begin Tests
619
620class GeneralModuleTests(unittest.TestCase):
621
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000622 def test_repr(self):
623 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000624 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000625 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000626
Raymond Hettinger027bb632004-05-31 03:09:25 +0000627 def test_weakref(self):
628 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
629 p = proxy(s)
630 self.assertEqual(p.fileno(), s.fileno())
631 s.close()
632 s = None
633 try:
634 p.fileno()
635 except ReferenceError:
636 pass
637 else:
638 self.fail('Socket proxy still exists')
639
Guido van Rossum24e4af82002-06-12 19:18:08 +0000640 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000641 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300642 msg = "Error raising socket exception (%s)."
643 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000644 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300645 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000646 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300647 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000648 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000649
Ezio Melotti63e42302011-05-07 19:47:48 +0300650 def testSendtoErrors(self):
651 # Testing that sendto doens't masks failures. See #10169.
652 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
653 self.addCleanup(s.close)
654 s.bind(('', 0))
655 sockname = s.getsockname()
656 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300657 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300658 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300659 self.assertEqual(str(cm.exception),
660 "'str' does not support the buffer interface")
661 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300662 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300663 self.assertEqual(str(cm.exception),
664 "'complex' does not support the buffer interface")
665 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300666 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300667 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300668 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300669 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300670 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300671 self.assertEqual(str(cm.exception),
672 "'str' does not support the buffer interface")
673 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300674 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300675 self.assertEqual(str(cm.exception),
676 "'complex' does not support the buffer interface")
677 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300678 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300679 self.assertIn('not NoneType', str(cm.exception))
680 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300681 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300682 self.assertIn('an integer is required', str(cm.exception))
683 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300684 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300685 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300686 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300687 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300688 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300689 self.assertIn('(1 given)', str(cm.exception))
690 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300691 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300692 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300693
Guido van Rossum24e4af82002-06-12 19:18:08 +0000694 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000695 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000696 socket.AF_INET
697 socket.SOCK_STREAM
698 socket.SOCK_DGRAM
699 socket.SOCK_RAW
700 socket.SOCK_RDM
701 socket.SOCK_SEQPACKET
702 socket.SOL_SOCKET
703 socket.SO_REUSEADDR
704
Guido van Rossum654c11e2002-06-13 20:24:17 +0000705 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000706 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000707 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000708 try:
709 ip = socket.gethostbyname(hostname)
710 except socket.error:
711 # Probably name lookup wasn't set up right; skip this test
712 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000713 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000714 try:
715 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
716 except socket.error:
717 # Probably a similar problem as above; skip this test
718 return
Brett Cannon01668a12005-03-11 00:04:17 +0000719 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000720 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000721 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000722 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000723
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000724 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
725 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
726 def test_sethostname(self):
727 oldhn = socket.gethostname()
728 try:
729 socket.sethostname('new')
730 except socket.error as e:
731 if e.errno == errno.EPERM:
732 self.skipTest("test should be run as root")
733 else:
734 raise
735 try:
736 # running test as root!
737 self.assertEqual(socket.gethostname(), 'new')
738 # Should work with bytes objects too
739 socket.sethostname(b'bar')
740 self.assertEqual(socket.gethostname(), 'bar')
741 finally:
742 socket.sethostname(oldhn)
743
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700744 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
745 'socket.if_nameindex() not available.')
746 def testInterfaceNameIndex(self):
747 interfaces = socket.if_nameindex()
748 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200749 self.assertIsInstance(index, int)
750 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700751 # interface indices are non-zero integers
752 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200753 _index = socket.if_nametoindex(name)
754 self.assertIsInstance(_index, int)
755 self.assertEqual(index, _index)
756 _name = socket.if_indextoname(index)
757 self.assertIsInstance(_name, str)
758 self.assertEqual(name, _name)
759
760 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
761 'socket.if_nameindex() not available.')
762 def testInvalidInterfaceNameIndex(self):
763 # test nonexistent interface index/name
764 self.assertRaises(socket.error, socket.if_indextoname, 0)
765 self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
766 # test with invalid values
767 self.assertRaises(TypeError, socket.if_nametoindex, 0)
768 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700769
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000770 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000771 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000772 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000773 try:
774 # On some versions, this loses a reference
775 orig = sys.getrefcount(__name__)
776 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000777 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000778 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000779 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000780
Guido van Rossum24e4af82002-06-12 19:18:08 +0000781 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000782 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000783 try:
784 # On some versions, this crashes the interpreter.
785 socket.getnameinfo(('x', 0, 0, 0), 0)
786 except socket.error:
787 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000788
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000789 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000790 # This just checks that htons etc. are their own inverse,
791 # when looking at the lower 16 or 32 bits.
792 sizes = {socket.htonl: 32, socket.ntohl: 32,
793 socket.htons: 16, socket.ntohs: 16}
794 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000795 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000796 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
797 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000798
Guido van Rossuma2627af2002-09-14 00:58:46 +0000799 swapped = func(mask)
800 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000801 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000802
Guido van Rossum018919a2007-01-15 00:07:32 +0000803 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000804 good_values = [ 1, 2, 3, 1, 2, 3 ]
805 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000806 for k in good_values:
807 socket.ntohl(k)
808 socket.ntohs(k)
809 socket.htonl(k)
810 socket.htons(k)
811 for k in bad_values:
812 self.assertRaises(OverflowError, socket.ntohl, k)
813 self.assertRaises(OverflowError, socket.ntohs, k)
814 self.assertRaises(OverflowError, socket.htonl, k)
815 self.assertRaises(OverflowError, socket.htons, k)
816
Barry Warsaw11b91a02004-06-28 00:50:43 +0000817 def testGetServBy(self):
818 eq = self.assertEqual
819 # Find one service that exists, then check all the related interfaces.
820 # I've ordered this by protocols that have both a tcp and udp
821 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200822 if (sys.platform.startswith(('freebsd', 'netbsd'))
823 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000824 # avoid the 'echo' service on this platform, as there is an
825 # assumption breaking non-standard port/protocol entry
826 services = ('daytime', 'qotd', 'domain')
827 else:
828 services = ('echo', 'daytime', 'domain')
829 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000830 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000831 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000832 break
833 except socket.error:
834 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000835 else:
836 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000837 # Try same call with optional protocol omitted
838 port2 = socket.getservbyname(service)
839 eq(port, port2)
840 # Try udp, but don't barf it it doesn't exist
841 try:
842 udpport = socket.getservbyname(service, 'udp')
843 except socket.error:
844 udpport = None
845 else:
846 eq(udpport, port)
847 # Now make sure the lookup by port returns the same service name
848 eq(socket.getservbyport(port2), service)
849 eq(socket.getservbyport(port, 'tcp'), service)
850 if udpport is not None:
851 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000852 # Make sure getservbyport does not accept out of range ports.
853 self.assertRaises(OverflowError, socket.getservbyport, -1)
854 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000855
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000856 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000857 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000858 # The default timeout should initially be None
859 self.assertEqual(socket.getdefaulttimeout(), None)
860 s = socket.socket()
861 self.assertEqual(s.gettimeout(), None)
862 s.close()
863
864 # Set the default timeout to 10, and see if it propagates
865 socket.setdefaulttimeout(10)
866 self.assertEqual(socket.getdefaulttimeout(), 10)
867 s = socket.socket()
868 self.assertEqual(s.gettimeout(), 10)
869 s.close()
870
871 # Reset the default timeout to None, and see if it propagates
872 socket.setdefaulttimeout(None)
873 self.assertEqual(socket.getdefaulttimeout(), None)
874 s = socket.socket()
875 self.assertEqual(s.gettimeout(), None)
876 s.close()
877
878 # Check that setting it to an invalid value raises ValueError
879 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
880
881 # Check that setting it to an invalid type raises TypeError
882 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
883
Benjamin Petersonf91df042009-02-13 02:50:59 +0000884 def testIPv4_inet_aton_fourbytes(self):
885 if not hasattr(socket, 'inet_aton'):
886 return # No inet_aton, nothing to check
887 # Test that issue1008086 and issue767150 are fixed.
888 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000889 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
890 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000891
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000892 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000893 if not hasattr(socket, 'inet_pton'):
894 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000895 from socket import inet_aton as f, inet_pton, AF_INET
896 g = lambda a: inet_pton(AF_INET, a)
897
Ezio Melottib3aedd42010-11-20 19:04:17 +0000898 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
899 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
900 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
901 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
902 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000903
Ezio Melottib3aedd42010-11-20 19:04:17 +0000904 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
905 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
906 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
907 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000908
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000909 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000910 if not hasattr(socket, 'inet_pton'):
911 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000912 try:
913 from socket import inet_pton, AF_INET6, has_ipv6
914 if not has_ipv6:
915 return
916 except ImportError:
917 return
918 f = lambda a: inet_pton(AF_INET6, a)
919
Ezio Melottib3aedd42010-11-20 19:04:17 +0000920 self.assertEqual(b'\x00' * 16, f('::'))
921 self.assertEqual(b'\x00' * 16, f('0::0'))
922 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
923 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000924 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 +0000925 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
926 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000927
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000928 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000929 if not hasattr(socket, 'inet_ntop'):
930 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000931 from socket import inet_ntoa as f, inet_ntop, AF_INET
932 g = lambda a: inet_ntop(AF_INET, a)
933
Ezio Melottib3aedd42010-11-20 19:04:17 +0000934 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
935 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
936 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
937 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000938
Ezio Melottib3aedd42010-11-20 19:04:17 +0000939 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
940 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
941 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000942
943 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000944 if not hasattr(socket, 'inet_ntop'):
945 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000946 try:
947 from socket import inet_ntop, AF_INET6, has_ipv6
948 if not has_ipv6:
949 return
950 except ImportError:
951 return
952 f = lambda a: inet_ntop(AF_INET6, a)
953
Ezio Melottib3aedd42010-11-20 19:04:17 +0000954 self.assertEqual('::', f(b'\x00' * 16))
955 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
956 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000957 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000958 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 +0000959 )
960
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000961 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000962
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000963 def testSockName(self):
964 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200965 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000966 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000967 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000968 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000969 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000970 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
971 # it reasonable to get the host's addr in addition to 0.0.0.0.
972 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000973 try:
974 my_ip_addr = socket.gethostbyname(socket.gethostname())
975 except socket.error:
976 # Probably name lookup wasn't set up right; skip this test
977 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000978 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000979 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000980
981 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000982 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000983 # We know a socket should start without reuse==0
984 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000985 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000986 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000987 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000988
989 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000990 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000991 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000992 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000993 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
994 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000995 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000996
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000997 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000998 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000999 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1000 sock.settimeout(1)
1001 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +00001002 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001003
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001004 def testNewAttributes(self):
1005 # testing .family, .type and .protocol
1006 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1007 self.assertEqual(sock.family, socket.AF_INET)
1008 self.assertEqual(sock.type, socket.SOCK_STREAM)
1009 self.assertEqual(sock.proto, 0)
1010 sock.close()
1011
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001012 def test_getsockaddrarg(self):
1013 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001014 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001015 big_port = port + 65536
1016 neg_port = port - 65536
1017 sock = socket.socket()
1018 try:
1019 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1020 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1021 sock.bind((host, port))
1022 finally:
1023 sock.close()
1024
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001025 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001026 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001027 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1028 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1029 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1030 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001031 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1032 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001033 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001034 self.assertRaises(ValueError, s.ioctl, -1, None)
1035 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001036
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001037 def testGetaddrinfo(self):
1038 try:
1039 socket.getaddrinfo('localhost', 80)
1040 except socket.gaierror as err:
1041 if err.errno == socket.EAI_SERVICE:
1042 # see http://bugs.python.org/issue1282647
1043 self.skipTest("buggy libc version")
1044 raise
1045 # len of every sequence is supposed to be == 5
1046 for info in socket.getaddrinfo(HOST, None):
1047 self.assertEqual(len(info), 5)
1048 # host can be a domain name, a string representation of an
1049 # IPv4/v6 address or None
1050 socket.getaddrinfo('localhost', 80)
1051 socket.getaddrinfo('127.0.0.1', 80)
1052 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001053 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001054 socket.getaddrinfo('::1', 80)
1055 # port can be a string service name such as "http", a numeric
1056 # port number or None
1057 socket.getaddrinfo(HOST, "http")
1058 socket.getaddrinfo(HOST, 80)
1059 socket.getaddrinfo(HOST, None)
1060 # test family and socktype filters
1061 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
1062 for family, _, _, _, _ in infos:
1063 self.assertEqual(family, socket.AF_INET)
1064 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1065 for _, socktype, _, _, _ in infos:
1066 self.assertEqual(socktype, socket.SOCK_STREAM)
1067 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001068 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001069 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1070 # a server willing to support both IPv4 and IPv6 will
1071 # usually do this
1072 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1073 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001074 # test keyword arguments
1075 a = socket.getaddrinfo(HOST, None)
1076 b = socket.getaddrinfo(host=HOST, port=None)
1077 self.assertEqual(a, b)
1078 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1079 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1080 self.assertEqual(a, b)
1081 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1082 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1083 self.assertEqual(a, b)
1084 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1085 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1086 self.assertEqual(a, b)
1087 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1088 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1089 self.assertEqual(a, b)
1090 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1091 socket.AI_PASSIVE)
1092 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1093 type=socket.SOCK_STREAM, proto=0,
1094 flags=socket.AI_PASSIVE)
1095 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001096 # Issue #6697.
1097 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001098
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001099 def test_getnameinfo(self):
1100 # only IP addresses are allowed
1101 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
1102
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001103 @unittest.skipUnless(support.is_resource_enabled('network'),
1104 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001105 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +00001106 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001107 # these should all be successful
1108 socket.gethostbyname('испытание.python.org')
1109 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001110 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1111 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1112 # have a reverse entry yet
1113 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001114
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001115 def check_sendall_interrupted(self, with_timeout):
1116 # socketpair() is not stricly required, but it makes things easier.
1117 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1118 self.skipTest("signal.alarm and socket.socketpair required for this test")
1119 # Our signal handlers clobber the C errno by calling a math function
1120 # with an invalid domain value.
1121 def ok_handler(*args):
1122 self.assertRaises(ValueError, math.acosh, 0)
1123 def raising_handler(*args):
1124 self.assertRaises(ValueError, math.acosh, 0)
1125 1 // 0
1126 c, s = socket.socketpair()
1127 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1128 try:
1129 if with_timeout:
1130 # Just above the one second minimum for signal.alarm
1131 c.settimeout(1.5)
1132 with self.assertRaises(ZeroDivisionError):
1133 signal.alarm(1)
1134 c.sendall(b"x" * (1024**2))
1135 if with_timeout:
1136 signal.signal(signal.SIGALRM, ok_handler)
1137 signal.alarm(1)
1138 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1139 finally:
1140 signal.signal(signal.SIGALRM, old_alarm)
1141 c.close()
1142 s.close()
1143
1144 def test_sendall_interrupted(self):
1145 self.check_sendall_interrupted(False)
1146
1147 def test_sendall_interrupted_with_timeout(self):
1148 self.check_sendall_interrupted(True)
1149
Antoine Pitroue033e062010-10-29 10:38:18 +00001150 def test_dealloc_warn(self):
1151 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1152 r = repr(sock)
1153 with self.assertWarns(ResourceWarning) as cm:
1154 sock = None
1155 support.gc_collect()
1156 self.assertIn(r, str(cm.warning.args[0]))
1157 # An open socket file object gets dereferenced after the socket
1158 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1159 f = sock.makefile('rb')
1160 r = repr(sock)
1161 sock = None
1162 support.gc_collect()
1163 with self.assertWarns(ResourceWarning):
1164 f = None
1165 support.gc_collect()
1166
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001167 def test_name_closed_socketio(self):
1168 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1169 fp = sock.makefile("rb")
1170 fp.close()
1171 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1172
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001173 def test_pickle(self):
1174 sock = socket.socket()
1175 with sock:
1176 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1177 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1178
Antoine Pitrou3cade992011-05-10 19:19:13 +02001179 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001180 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1181 srv.bind((HOST, 0))
1182 # backlog = 0
1183 srv.listen(0)
1184 srv.close()
1185
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001186
Charles-François Natali47413c12011-10-06 19:47:44 +02001187@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1188class BasicCANTest(unittest.TestCase):
1189
1190 def testCrucialConstants(self):
1191 socket.AF_CAN
1192 socket.PF_CAN
1193 socket.CAN_RAW
1194
1195 def testCreateSocket(self):
1196 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1197 pass
1198
1199 def testBindAny(self):
1200 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1201 s.bind(('', ))
1202
1203 def testTooLongInterfaceName(self):
1204 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1205 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001206 self.assertRaisesRegex(socket.error, 'interface name too long',
1207 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001208
1209 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1210 'socket.CAN_RAW_LOOPBACK required for this test.')
1211 def testLoopback(self):
1212 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1213 for loopback in (0, 1):
1214 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1215 loopback)
1216 self.assertEqual(loopback,
1217 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1218
1219 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1220 'socket.CAN_RAW_FILTER required for this test.')
1221 def testFilter(self):
1222 can_id, can_mask = 0x200, 0x700
1223 can_filter = struct.pack("=II", can_id, can_mask)
1224 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1225 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1226 self.assertEqual(can_filter,
1227 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1228
1229
1230@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1231@unittest.skipUnless(thread, 'Threading required for this test.')
1232class CANTest(ThreadedCANSocketTest):
1233
1234 """The CAN frame structure is defined in <linux/can.h>:
1235
1236 struct can_frame {
1237 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1238 __u8 can_dlc; /* data length code: 0 .. 8 */
1239 __u8 data[8] __attribute__((aligned(8)));
1240 };
1241 """
1242 can_frame_fmt = "=IB3x8s"
1243
1244 def __init__(self, methodName='runTest'):
1245 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1246
1247 @classmethod
1248 def build_can_frame(cls, can_id, data):
1249 """Build a CAN frame."""
1250 can_dlc = len(data)
1251 data = data.ljust(8, b'\x00')
1252 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1253
1254 @classmethod
1255 def dissect_can_frame(cls, frame):
1256 """Dissect a CAN frame."""
1257 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1258 return (can_id, can_dlc, data[:can_dlc])
1259
1260 def testSendFrame(self):
1261 cf, addr = self.s.recvfrom(self.bufsize)
1262 self.assertEqual(self.cf, cf)
1263 self.assertEqual(addr[0], self.interface)
1264 self.assertEqual(addr[1], socket.AF_CAN)
1265
1266 def _testSendFrame(self):
1267 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1268 self.cli.send(self.cf)
1269
1270 def testSendMaxFrame(self):
1271 cf, addr = self.s.recvfrom(self.bufsize)
1272 self.assertEqual(self.cf, cf)
1273
1274 def _testSendMaxFrame(self):
1275 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1276 self.cli.send(self.cf)
1277
1278 def testSendMultiFrames(self):
1279 cf, addr = self.s.recvfrom(self.bufsize)
1280 self.assertEqual(self.cf1, cf)
1281
1282 cf, addr = self.s.recvfrom(self.bufsize)
1283 self.assertEqual(self.cf2, cf)
1284
1285 def _testSendMultiFrames(self):
1286 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1287 self.cli.send(self.cf1)
1288
1289 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1290 self.cli.send(self.cf2)
1291
1292
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001293@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1294class BasicRDSTest(unittest.TestCase):
1295
1296 def testCrucialConstants(self):
1297 socket.AF_RDS
1298 socket.PF_RDS
1299
1300 def testCreateSocket(self):
1301 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1302 pass
1303
1304 def testSocketBufferSize(self):
1305 bufsize = 16384
1306 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1307 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1308 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1309
1310
1311@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1312@unittest.skipUnless(thread, 'Threading required for this test.')
1313class RDSTest(ThreadedRDSSocketTest):
1314
1315 def __init__(self, methodName='runTest'):
1316 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1317
Charles-François Natali240c55f2011-11-10 20:33:36 +01001318 def setUp(self):
1319 super().setUp()
1320 self.evt = threading.Event()
1321
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001322 def testSendAndRecv(self):
1323 data, addr = self.serv.recvfrom(self.bufsize)
1324 self.assertEqual(self.data, data)
1325 self.assertEqual(self.cli_addr, addr)
1326
1327 def _testSendAndRecv(self):
1328 self.data = b'spam'
1329 self.cli.sendto(self.data, 0, (HOST, self.port))
1330
1331 def testPeek(self):
1332 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1333 self.assertEqual(self.data, data)
1334 data, addr = self.serv.recvfrom(self.bufsize)
1335 self.assertEqual(self.data, data)
1336
1337 def _testPeek(self):
1338 self.data = b'spam'
1339 self.cli.sendto(self.data, 0, (HOST, self.port))
1340
1341 @requireAttrs(socket.socket, 'recvmsg')
1342 def testSendAndRecvMsg(self):
1343 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1344 self.assertEqual(self.data, data)
1345
1346 @requireAttrs(socket.socket, 'sendmsg')
1347 def _testSendAndRecvMsg(self):
1348 self.data = b'hello ' * 10
1349 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1350
1351 def testSendAndRecvMulti(self):
1352 data, addr = self.serv.recvfrom(self.bufsize)
1353 self.assertEqual(self.data1, data)
1354
1355 data, addr = self.serv.recvfrom(self.bufsize)
1356 self.assertEqual(self.data2, data)
1357
1358 def _testSendAndRecvMulti(self):
1359 self.data1 = b'bacon'
1360 self.cli.sendto(self.data1, 0, (HOST, self.port))
1361
1362 self.data2 = b'egg'
1363 self.cli.sendto(self.data2, 0, (HOST, self.port))
1364
1365 def testSelect(self):
1366 r, w, x = select.select([self.serv], [], [], 3.0)
1367 self.assertIn(self.serv, r)
1368 data, addr = self.serv.recvfrom(self.bufsize)
1369 self.assertEqual(self.data, data)
1370
1371 def _testSelect(self):
1372 self.data = b'select'
1373 self.cli.sendto(self.data, 0, (HOST, self.port))
1374
1375 def testCongestion(self):
1376 # wait until the sender is done
1377 self.evt.wait()
1378
1379 def _testCongestion(self):
1380 # test the behavior in case of congestion
1381 self.data = b'fill'
1382 self.cli.setblocking(False)
1383 try:
1384 # try to lower the receiver's socket buffer size
1385 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1386 except OSError:
1387 pass
1388 with self.assertRaises(OSError) as cm:
1389 try:
1390 # fill the receiver's socket buffer
1391 while True:
1392 self.cli.sendto(self.data, 0, (HOST, self.port))
1393 finally:
1394 # signal the receiver we're done
1395 self.evt.set()
1396 # sendto() should have failed with ENOBUFS
1397 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1398 # and we should have received a congestion notification through poll
1399 r, w, x = select.select([self.serv], [], [], 3.0)
1400 self.assertIn(self.serv, r)
1401
1402
Victor Stinner45df8202010-04-28 22:31:17 +00001403@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001404class BasicTCPTest(SocketConnectedTest):
1405
1406 def __init__(self, methodName='runTest'):
1407 SocketConnectedTest.__init__(self, methodName=methodName)
1408
1409 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001410 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001411 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001412 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001413
1414 def _testRecv(self):
1415 self.serv_conn.send(MSG)
1416
1417 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001418 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001419 seg1 = self.cli_conn.recv(len(MSG) - 3)
1420 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001421 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001422 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001423
1424 def _testOverFlowRecv(self):
1425 self.serv_conn.send(MSG)
1426
1427 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001428 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001429 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001430 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001431
1432 def _testRecvFrom(self):
1433 self.serv_conn.send(MSG)
1434
1435 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001436 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001437 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1438 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001439 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001440 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001441
1442 def _testOverFlowRecvFrom(self):
1443 self.serv_conn.send(MSG)
1444
1445 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001446 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001447 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001448 while 1:
1449 read = self.cli_conn.recv(1024)
1450 if not read:
1451 break
Guido van Rossume531e292002-08-08 20:28:34 +00001452 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001453 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001454
1455 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001456 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001457 self.serv_conn.sendall(big_chunk)
1458
1459 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001460 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001461 fd = self.cli_conn.fileno()
1462 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001463 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001464 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001465 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001466 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001467
1468 def _testFromFd(self):
1469 self.serv_conn.send(MSG)
1470
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001471 def testDup(self):
1472 # Testing dup()
1473 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001474 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001475 msg = sock.recv(1024)
1476 self.assertEqual(msg, MSG)
1477
1478 def _testDup(self):
1479 self.serv_conn.send(MSG)
1480
Guido van Rossum24e4af82002-06-12 19:18:08 +00001481 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001482 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001483 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001484 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001485 # wait for _testShutdown to finish: on OS X, when the server
1486 # closes the connection the client also becomes disconnected,
1487 # and the client's shutdown call will fail. (Issue #4397.)
1488 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001489
1490 def _testShutdown(self):
1491 self.serv_conn.send(MSG)
1492 self.serv_conn.shutdown(2)
1493
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001494 def testDetach(self):
1495 # Testing detach()
1496 fileno = self.cli_conn.fileno()
1497 f = self.cli_conn.detach()
1498 self.assertEqual(f, fileno)
1499 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001500 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1501 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001502 # ...but we can create another socket using the (still open)
1503 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001504 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001505 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001506 msg = sock.recv(1024)
1507 self.assertEqual(msg, MSG)
1508
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001509 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001510 self.serv_conn.send(MSG)
1511
Victor Stinner45df8202010-04-28 22:31:17 +00001512@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001513class BasicUDPTest(ThreadedUDPSocketTest):
1514
1515 def __init__(self, methodName='runTest'):
1516 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1517
1518 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001519 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001520 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001521 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001522
1523 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001524 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001525
Guido van Rossum1c938012002-06-12 21:17:20 +00001526 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001527 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001528 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001529 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001530
Guido van Rossum1c938012002-06-12 21:17:20 +00001531 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001532 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001533
Guido van Rossumd8faa362007-04-27 19:54:29 +00001534 def testRecvFromNegative(self):
1535 # Negative lengths passed to recvfrom should give ValueError.
1536 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1537
1538 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001539 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001540
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001541# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1542# same test code is used with different families and types of socket
1543# (e.g. stream, datagram), and tests using recvmsg() are repeated
1544# using recvmsg_into().
1545#
1546# The generic test classes such as SendmsgTests and
1547# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1548# supplied with sockets cli_sock and serv_sock representing the
1549# client's and the server's end of the connection respectively, and
1550# attributes cli_addr and serv_addr holding their (numeric where
1551# appropriate) addresses.
1552#
1553# The final concrete test classes combine these with subclasses of
1554# SocketTestBase which set up client and server sockets of a specific
1555# type, and with subclasses of SendrecvmsgBase such as
1556# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1557# sockets to cli_sock and serv_sock and override the methods and
1558# attributes of SendrecvmsgBase to fill in destination addresses if
1559# needed when sending, check for specific flags in msg_flags, etc.
1560#
1561# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1562# recvmsg_into().
1563
1564# XXX: like the other datagram (UDP) tests in this module, the code
1565# here assumes that datagram delivery on the local machine will be
1566# reliable.
1567
1568class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1569 # Base class for sendmsg()/recvmsg() tests.
1570
1571 # Time in seconds to wait before considering a test failed, or
1572 # None for no timeout. Not all tests actually set a timeout.
1573 fail_timeout = 3.0
1574
1575 def setUp(self):
1576 self.misc_event = threading.Event()
1577 super().setUp()
1578
1579 def sendToServer(self, msg):
1580 # Send msg to the server.
1581 return self.cli_sock.send(msg)
1582
1583 # Tuple of alternative default arguments for sendmsg() when called
1584 # via sendmsgToServer() (e.g. to include a destination address).
1585 sendmsg_to_server_defaults = ()
1586
1587 def sendmsgToServer(self, *args):
1588 # Call sendmsg() on self.cli_sock with the given arguments,
1589 # filling in any arguments which are not supplied with the
1590 # corresponding items of self.sendmsg_to_server_defaults, if
1591 # any.
1592 return self.cli_sock.sendmsg(
1593 *(args + self.sendmsg_to_server_defaults[len(args):]))
1594
1595 def doRecvmsg(self, sock, bufsize, *args):
1596 # Call recvmsg() on sock with given arguments and return its
1597 # result. Should be used for tests which can use either
1598 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1599 # this method with one which emulates it using recvmsg_into(),
1600 # thus allowing the same test to be used for both methods.
1601 result = sock.recvmsg(bufsize, *args)
1602 self.registerRecvmsgResult(result)
1603 return result
1604
1605 def registerRecvmsgResult(self, result):
1606 # Called by doRecvmsg() with the return value of recvmsg() or
1607 # recvmsg_into(). Can be overridden to arrange cleanup based
1608 # on the returned ancillary data, for instance.
1609 pass
1610
1611 def checkRecvmsgAddress(self, addr1, addr2):
1612 # Called to compare the received address with the address of
1613 # the peer.
1614 self.assertEqual(addr1, addr2)
1615
1616 # Flags that are normally unset in msg_flags
1617 msg_flags_common_unset = 0
1618 for name in ("MSG_CTRUNC", "MSG_OOB"):
1619 msg_flags_common_unset |= getattr(socket, name, 0)
1620
1621 # Flags that are normally set
1622 msg_flags_common_set = 0
1623
1624 # Flags set when a complete record has been received (e.g. MSG_EOR
1625 # for SCTP)
1626 msg_flags_eor_indicator = 0
1627
1628 # Flags set when a complete record has not been received
1629 # (e.g. MSG_TRUNC for datagram sockets)
1630 msg_flags_non_eor_indicator = 0
1631
1632 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1633 # Method to check the value of msg_flags returned by recvmsg[_into]().
1634 #
1635 # Checks that all bits in msg_flags_common_set attribute are
1636 # set in "flags" and all bits in msg_flags_common_unset are
1637 # unset.
1638 #
1639 # The "eor" argument specifies whether the flags should
1640 # indicate that a full record (or datagram) has been received.
1641 # If "eor" is None, no checks are done; otherwise, checks
1642 # that:
1643 #
1644 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1645 # set and all bits in msg_flags_non_eor_indicator are unset
1646 #
1647 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1648 # are set and all bits in msg_flags_eor_indicator are unset
1649 #
1650 # If "checkset" and/or "checkunset" are supplied, they require
1651 # the given bits to be set or unset respectively, overriding
1652 # what the attributes require for those bits.
1653 #
1654 # If any bits are set in "ignore", they will not be checked,
1655 # regardless of the other inputs.
1656 #
1657 # Will raise Exception if the inputs require a bit to be both
1658 # set and unset, and it is not ignored.
1659
1660 defaultset = self.msg_flags_common_set
1661 defaultunset = self.msg_flags_common_unset
1662
1663 if eor:
1664 defaultset |= self.msg_flags_eor_indicator
1665 defaultunset |= self.msg_flags_non_eor_indicator
1666 elif eor is not None:
1667 defaultset |= self.msg_flags_non_eor_indicator
1668 defaultunset |= self.msg_flags_eor_indicator
1669
1670 # Function arguments override defaults
1671 defaultset &= ~checkunset
1672 defaultunset &= ~checkset
1673
1674 # Merge arguments with remaining defaults, and check for conflicts
1675 checkset |= defaultset
1676 checkunset |= defaultunset
1677 inboth = checkset & checkunset & ~ignore
1678 if inboth:
1679 raise Exception("contradictory set, unset requirements for flags "
1680 "{0:#x}".format(inboth))
1681
1682 # Compare with given msg_flags value
1683 mask = (checkset | checkunset) & ~ignore
1684 self.assertEqual(flags & mask, checkset & mask)
1685
1686
1687class RecvmsgIntoMixin(SendrecvmsgBase):
1688 # Mixin to implement doRecvmsg() using recvmsg_into().
1689
1690 def doRecvmsg(self, sock, bufsize, *args):
1691 buf = bytearray(bufsize)
1692 result = sock.recvmsg_into([buf], *args)
1693 self.registerRecvmsgResult(result)
1694 self.assertGreaterEqual(result[0], 0)
1695 self.assertLessEqual(result[0], bufsize)
1696 return (bytes(buf[:result[0]]),) + result[1:]
1697
1698
1699class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1700 # Defines flags to be checked in msg_flags for datagram sockets.
1701
1702 @property
1703 def msg_flags_non_eor_indicator(self):
1704 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1705
1706
1707class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1708 # Defines flags to be checked in msg_flags for SCTP sockets.
1709
1710 @property
1711 def msg_flags_eor_indicator(self):
1712 return super().msg_flags_eor_indicator | socket.MSG_EOR
1713
1714
1715class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1716 # Base class for tests on connectionless-mode sockets. Users must
1717 # supply sockets on attributes cli and serv to be mapped to
1718 # cli_sock and serv_sock respectively.
1719
1720 @property
1721 def serv_sock(self):
1722 return self.serv
1723
1724 @property
1725 def cli_sock(self):
1726 return self.cli
1727
1728 @property
1729 def sendmsg_to_server_defaults(self):
1730 return ([], [], 0, self.serv_addr)
1731
1732 def sendToServer(self, msg):
1733 return self.cli_sock.sendto(msg, self.serv_addr)
1734
1735
1736class SendrecvmsgConnectedBase(SendrecvmsgBase):
1737 # Base class for tests on connected sockets. Users must supply
1738 # sockets on attributes serv_conn and cli_conn (representing the
1739 # connections *to* the server and the client), to be mapped to
1740 # cli_sock and serv_sock respectively.
1741
1742 @property
1743 def serv_sock(self):
1744 return self.cli_conn
1745
1746 @property
1747 def cli_sock(self):
1748 return self.serv_conn
1749
1750 def checkRecvmsgAddress(self, addr1, addr2):
1751 # Address is currently "unspecified" for a connected socket,
1752 # so we don't examine it
1753 pass
1754
1755
1756class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1757 # Base class to set a timeout on server's socket.
1758
1759 def setUp(self):
1760 super().setUp()
1761 self.serv_sock.settimeout(self.fail_timeout)
1762
1763
1764class SendmsgTests(SendrecvmsgServerTimeoutBase):
1765 # Tests for sendmsg() which can use any socket type and do not
1766 # involve recvmsg() or recvmsg_into().
1767
1768 def testSendmsg(self):
1769 # Send a simple message with sendmsg().
1770 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1771
1772 def _testSendmsg(self):
1773 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1774
1775 def testSendmsgDataGenerator(self):
1776 # Send from buffer obtained from a generator (not a sequence).
1777 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1778
1779 def _testSendmsgDataGenerator(self):
1780 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1781 len(MSG))
1782
1783 def testSendmsgAncillaryGenerator(self):
1784 # Gather (empty) ancillary data from a generator.
1785 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1786
1787 def _testSendmsgAncillaryGenerator(self):
1788 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1789 len(MSG))
1790
1791 def testSendmsgArray(self):
1792 # Send data from an array instead of the usual bytes object.
1793 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1794
1795 def _testSendmsgArray(self):
1796 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1797 len(MSG))
1798
1799 def testSendmsgGather(self):
1800 # Send message data from more than one buffer (gather write).
1801 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1802
1803 def _testSendmsgGather(self):
1804 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1805
1806 def testSendmsgBadArgs(self):
1807 # Check that sendmsg() rejects invalid arguments.
1808 self.assertEqual(self.serv_sock.recv(1000), b"done")
1809
1810 def _testSendmsgBadArgs(self):
1811 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1812 self.assertRaises(TypeError, self.sendmsgToServer,
1813 b"not in an iterable")
1814 self.assertRaises(TypeError, self.sendmsgToServer,
1815 object())
1816 self.assertRaises(TypeError, self.sendmsgToServer,
1817 [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], [], object())
1824 self.assertRaises(TypeError, self.sendmsgToServer,
1825 [MSG], [], 0, object())
1826 self.sendToServer(b"done")
1827
1828 def testSendmsgBadCmsg(self):
1829 # Check that invalid ancillary data items are rejected.
1830 self.assertEqual(self.serv_sock.recv(1000), b"done")
1831
1832 def _testSendmsgBadCmsg(self):
1833 self.assertRaises(TypeError, self.sendmsgToServer,
1834 [MSG], [object()])
1835 self.assertRaises(TypeError, self.sendmsgToServer,
1836 [MSG], [(object(), 0, b"data")])
1837 self.assertRaises(TypeError, self.sendmsgToServer,
1838 [MSG], [(0, object(), b"data")])
1839 self.assertRaises(TypeError, self.sendmsgToServer,
1840 [MSG], [(0, 0, object())])
1841 self.assertRaises(TypeError, self.sendmsgToServer,
1842 [MSG], [(0, 0)])
1843 self.assertRaises(TypeError, self.sendmsgToServer,
1844 [MSG], [(0, 0, b"data", 42)])
1845 self.sendToServer(b"done")
1846
1847 @requireAttrs(socket, "CMSG_SPACE")
1848 def testSendmsgBadMultiCmsg(self):
1849 # Check that invalid ancillary data items are rejected when
1850 # more than one item is present.
1851 self.assertEqual(self.serv_sock.recv(1000), b"done")
1852
1853 @testSendmsgBadMultiCmsg.client_skip
1854 def _testSendmsgBadMultiCmsg(self):
1855 self.assertRaises(TypeError, self.sendmsgToServer,
1856 [MSG], [0, 0, b""])
1857 self.assertRaises(TypeError, self.sendmsgToServer,
1858 [MSG], [(0, 0, b""), object()])
1859 self.sendToServer(b"done")
1860
1861 def testSendmsgExcessCmsgReject(self):
1862 # Check that sendmsg() rejects excess ancillary data items
1863 # when the number that can be sent is limited.
1864 self.assertEqual(self.serv_sock.recv(1000), b"done")
1865
1866 def _testSendmsgExcessCmsgReject(self):
1867 if not hasattr(socket, "CMSG_SPACE"):
1868 # Can only send one item
1869 with self.assertRaises(socket.error) as cm:
1870 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1871 self.assertIsNone(cm.exception.errno)
1872 self.sendToServer(b"done")
1873
1874 def testSendmsgAfterClose(self):
1875 # Check that sendmsg() fails on a closed socket.
1876 pass
1877
1878 def _testSendmsgAfterClose(self):
1879 self.cli_sock.close()
1880 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1881
1882
1883class SendmsgStreamTests(SendmsgTests):
1884 # Tests for sendmsg() which require a stream socket and do not
1885 # involve recvmsg() or recvmsg_into().
1886
1887 def testSendmsgExplicitNoneAddr(self):
1888 # Check that peer address can be specified as None.
1889 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1890
1891 def _testSendmsgExplicitNoneAddr(self):
1892 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1893
1894 def testSendmsgTimeout(self):
1895 # Check that timeout works with sendmsg().
1896 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1897 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1898
1899 def _testSendmsgTimeout(self):
1900 try:
1901 self.cli_sock.settimeout(0.03)
1902 with self.assertRaises(socket.timeout):
1903 while True:
1904 self.sendmsgToServer([b"a"*512])
1905 finally:
1906 self.misc_event.set()
1907
1908 # XXX: would be nice to have more tests for sendmsg flags argument.
1909
1910 # Linux supports MSG_DONTWAIT when sending, but in general, it
1911 # only works when receiving. Could add other platforms if they
1912 # support it too.
1913 @skipWithClientIf(sys.platform not in {"linux2"},
1914 "MSG_DONTWAIT not known to work on this platform when "
1915 "sending")
1916 def testSendmsgDontWait(self):
1917 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
1918 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1919 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1920
1921 @testSendmsgDontWait.client_skip
1922 def _testSendmsgDontWait(self):
1923 try:
1924 with self.assertRaises(socket.error) as cm:
1925 while True:
1926 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
1927 self.assertIn(cm.exception.errno,
1928 (errno.EAGAIN, errno.EWOULDBLOCK))
1929 finally:
1930 self.misc_event.set()
1931
1932
1933class SendmsgConnectionlessTests(SendmsgTests):
1934 # Tests for sendmsg() which require a connectionless-mode
1935 # (e.g. datagram) socket, and do not involve recvmsg() or
1936 # recvmsg_into().
1937
1938 def testSendmsgNoDestAddr(self):
1939 # Check that sendmsg() fails when no destination address is
1940 # given for unconnected socket.
1941 pass
1942
1943 def _testSendmsgNoDestAddr(self):
1944 self.assertRaises(socket.error, self.cli_sock.sendmsg,
1945 [MSG])
1946 self.assertRaises(socket.error, self.cli_sock.sendmsg,
1947 [MSG], [], 0, None)
1948
1949
1950class RecvmsgGenericTests(SendrecvmsgBase):
1951 # Tests for recvmsg() which can also be emulated using
1952 # recvmsg_into(), and can use any socket type.
1953
1954 def testRecvmsg(self):
1955 # Receive a simple message with recvmsg[_into]().
1956 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1957 self.assertEqual(msg, MSG)
1958 self.checkRecvmsgAddress(addr, self.cli_addr)
1959 self.assertEqual(ancdata, [])
1960 self.checkFlags(flags, eor=True)
1961
1962 def _testRecvmsg(self):
1963 self.sendToServer(MSG)
1964
1965 def testRecvmsgExplicitDefaults(self):
1966 # Test recvmsg[_into]() with default arguments provided explicitly.
1967 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1968 len(MSG), 0, 0)
1969 self.assertEqual(msg, MSG)
1970 self.checkRecvmsgAddress(addr, self.cli_addr)
1971 self.assertEqual(ancdata, [])
1972 self.checkFlags(flags, eor=True)
1973
1974 def _testRecvmsgExplicitDefaults(self):
1975 self.sendToServer(MSG)
1976
1977 def testRecvmsgShorter(self):
1978 # Receive a message smaller than buffer.
1979 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1980 len(MSG) + 42)
1981 self.assertEqual(msg, MSG)
1982 self.checkRecvmsgAddress(addr, self.cli_addr)
1983 self.assertEqual(ancdata, [])
1984 self.checkFlags(flags, eor=True)
1985
1986 def _testRecvmsgShorter(self):
1987 self.sendToServer(MSG)
1988
Charles-François Natali8619cd72011-10-03 19:43:15 +02001989 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
1990 # datagram is received (issue #13001).
1991 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001992 def testRecvmsgTrunc(self):
1993 # Receive part of message, check for truncation indicators.
1994 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1995 len(MSG) - 3)
1996 self.assertEqual(msg, MSG[:-3])
1997 self.checkRecvmsgAddress(addr, self.cli_addr)
1998 self.assertEqual(ancdata, [])
1999 self.checkFlags(flags, eor=False)
2000
Charles-François Natali8619cd72011-10-03 19:43:15 +02002001 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002002 def _testRecvmsgTrunc(self):
2003 self.sendToServer(MSG)
2004
2005 def testRecvmsgShortAncillaryBuf(self):
2006 # Test ancillary data buffer too small to hold any ancillary data.
2007 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2008 len(MSG), 1)
2009 self.assertEqual(msg, MSG)
2010 self.checkRecvmsgAddress(addr, self.cli_addr)
2011 self.assertEqual(ancdata, [])
2012 self.checkFlags(flags, eor=True)
2013
2014 def _testRecvmsgShortAncillaryBuf(self):
2015 self.sendToServer(MSG)
2016
2017 def testRecvmsgLongAncillaryBuf(self):
2018 # Test large ancillary data buffer.
2019 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2020 len(MSG), 10240)
2021 self.assertEqual(msg, MSG)
2022 self.checkRecvmsgAddress(addr, self.cli_addr)
2023 self.assertEqual(ancdata, [])
2024 self.checkFlags(flags, eor=True)
2025
2026 def _testRecvmsgLongAncillaryBuf(self):
2027 self.sendToServer(MSG)
2028
2029 def testRecvmsgAfterClose(self):
2030 # Check that recvmsg[_into]() fails on a closed socket.
2031 self.serv_sock.close()
2032 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2033
2034 def _testRecvmsgAfterClose(self):
2035 pass
2036
2037 def testRecvmsgTimeout(self):
2038 # Check that timeout works.
2039 try:
2040 self.serv_sock.settimeout(0.03)
2041 self.assertRaises(socket.timeout,
2042 self.doRecvmsg, self.serv_sock, len(MSG))
2043 finally:
2044 self.misc_event.set()
2045
2046 def _testRecvmsgTimeout(self):
2047 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2048
2049 @requireAttrs(socket, "MSG_PEEK")
2050 def testRecvmsgPeek(self):
2051 # Check that MSG_PEEK in flags enables examination of pending
2052 # data without consuming it.
2053
2054 # Receive part of data with MSG_PEEK.
2055 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2056 len(MSG) - 3, 0,
2057 socket.MSG_PEEK)
2058 self.assertEqual(msg, MSG[:-3])
2059 self.checkRecvmsgAddress(addr, self.cli_addr)
2060 self.assertEqual(ancdata, [])
2061 # Ignoring MSG_TRUNC here (so this test is the same for stream
2062 # and datagram sockets). Some wording in POSIX seems to
2063 # suggest that it needn't be set when peeking, but that may
2064 # just be a slip.
2065 self.checkFlags(flags, eor=False,
2066 ignore=getattr(socket, "MSG_TRUNC", 0))
2067
2068 # Receive all data with MSG_PEEK.
2069 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2070 len(MSG), 0,
2071 socket.MSG_PEEK)
2072 self.assertEqual(msg, MSG)
2073 self.checkRecvmsgAddress(addr, self.cli_addr)
2074 self.assertEqual(ancdata, [])
2075 self.checkFlags(flags, eor=True)
2076
2077 # Check that the same data can still be received normally.
2078 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2079 self.assertEqual(msg, MSG)
2080 self.checkRecvmsgAddress(addr, self.cli_addr)
2081 self.assertEqual(ancdata, [])
2082 self.checkFlags(flags, eor=True)
2083
2084 @testRecvmsgPeek.client_skip
2085 def _testRecvmsgPeek(self):
2086 self.sendToServer(MSG)
2087
2088 @requireAttrs(socket.socket, "sendmsg")
2089 def testRecvmsgFromSendmsg(self):
2090 # Test receiving with recvmsg[_into]() when message is sent
2091 # using sendmsg().
2092 self.serv_sock.settimeout(self.fail_timeout)
2093 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2094 self.assertEqual(msg, MSG)
2095 self.checkRecvmsgAddress(addr, self.cli_addr)
2096 self.assertEqual(ancdata, [])
2097 self.checkFlags(flags, eor=True)
2098
2099 @testRecvmsgFromSendmsg.client_skip
2100 def _testRecvmsgFromSendmsg(self):
2101 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2102
2103
2104class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2105 # Tests which require a stream socket and can use either recvmsg()
2106 # or recvmsg_into().
2107
2108 def testRecvmsgEOF(self):
2109 # Receive end-of-stream indicator (b"", peer socket closed).
2110 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2111 self.assertEqual(msg, b"")
2112 self.checkRecvmsgAddress(addr, self.cli_addr)
2113 self.assertEqual(ancdata, [])
2114 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2115
2116 def _testRecvmsgEOF(self):
2117 self.cli_sock.close()
2118
2119 def testRecvmsgOverflow(self):
2120 # Receive a message in more than one chunk.
2121 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2122 len(MSG) - 3)
2123 self.checkRecvmsgAddress(addr, self.cli_addr)
2124 self.assertEqual(ancdata, [])
2125 self.checkFlags(flags, eor=False)
2126
2127 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2128 self.checkRecvmsgAddress(addr, self.cli_addr)
2129 self.assertEqual(ancdata, [])
2130 self.checkFlags(flags, eor=True)
2131
2132 msg = seg1 + seg2
2133 self.assertEqual(msg, MSG)
2134
2135 def _testRecvmsgOverflow(self):
2136 self.sendToServer(MSG)
2137
2138
2139class RecvmsgTests(RecvmsgGenericTests):
2140 # Tests for recvmsg() which can use any socket type.
2141
2142 def testRecvmsgBadArgs(self):
2143 # Check that recvmsg() rejects invalid arguments.
2144 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2145 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2146 -1, 0, 0)
2147 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2148 len(MSG), -1, 0)
2149 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2150 [bytearray(10)], 0, 0)
2151 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2152 object(), 0, 0)
2153 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2154 len(MSG), object(), 0)
2155 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2156 len(MSG), 0, object())
2157
2158 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2159 self.assertEqual(msg, MSG)
2160 self.checkRecvmsgAddress(addr, self.cli_addr)
2161 self.assertEqual(ancdata, [])
2162 self.checkFlags(flags, eor=True)
2163
2164 def _testRecvmsgBadArgs(self):
2165 self.sendToServer(MSG)
2166
2167
2168class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2169 # Tests for recvmsg_into() which can use any socket type.
2170
2171 def testRecvmsgIntoBadArgs(self):
2172 # Check that recvmsg_into() rejects invalid arguments.
2173 buf = bytearray(len(MSG))
2174 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2175 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2176 len(MSG), 0, 0)
2177 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2178 buf, 0, 0)
2179 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2180 [object()], 0, 0)
2181 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2182 [b"I'm not writable"], 0, 0)
2183 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2184 [buf, object()], 0, 0)
2185 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2186 [buf], -1, 0)
2187 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2188 [buf], object(), 0)
2189 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2190 [buf], 0, object())
2191
2192 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2193 self.assertEqual(nbytes, len(MSG))
2194 self.assertEqual(buf, bytearray(MSG))
2195 self.checkRecvmsgAddress(addr, self.cli_addr)
2196 self.assertEqual(ancdata, [])
2197 self.checkFlags(flags, eor=True)
2198
2199 def _testRecvmsgIntoBadArgs(self):
2200 self.sendToServer(MSG)
2201
2202 def testRecvmsgIntoGenerator(self):
2203 # Receive into buffer obtained from a generator (not a sequence).
2204 buf = bytearray(len(MSG))
2205 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2206 (o for o in [buf]))
2207 self.assertEqual(nbytes, len(MSG))
2208 self.assertEqual(buf, bytearray(MSG))
2209 self.checkRecvmsgAddress(addr, self.cli_addr)
2210 self.assertEqual(ancdata, [])
2211 self.checkFlags(flags, eor=True)
2212
2213 def _testRecvmsgIntoGenerator(self):
2214 self.sendToServer(MSG)
2215
2216 def testRecvmsgIntoArray(self):
2217 # Receive into an array rather than the usual bytearray.
2218 buf = array.array("B", [0] * len(MSG))
2219 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2220 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002221 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002222 self.checkRecvmsgAddress(addr, self.cli_addr)
2223 self.assertEqual(ancdata, [])
2224 self.checkFlags(flags, eor=True)
2225
2226 def _testRecvmsgIntoArray(self):
2227 self.sendToServer(MSG)
2228
2229 def testRecvmsgIntoScatter(self):
2230 # Receive into multiple buffers (scatter write).
2231 b1 = bytearray(b"----")
2232 b2 = bytearray(b"0123456789")
2233 b3 = bytearray(b"--------------")
2234 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2235 [b1, memoryview(b2)[2:9], b3])
2236 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2237 self.assertEqual(b1, bytearray(b"Mary"))
2238 self.assertEqual(b2, bytearray(b"01 had a 9"))
2239 self.assertEqual(b3, bytearray(b"little lamb---"))
2240 self.checkRecvmsgAddress(addr, self.cli_addr)
2241 self.assertEqual(ancdata, [])
2242 self.checkFlags(flags, eor=True)
2243
2244 def _testRecvmsgIntoScatter(self):
2245 self.sendToServer(b"Mary had a little lamb")
2246
2247
2248class CmsgMacroTests(unittest.TestCase):
2249 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2250 # assumptions used by sendmsg() and recvmsg[_into](), which share
2251 # code with these functions.
2252
2253 # Match the definition in socketmodule.c
2254 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2255
2256 @requireAttrs(socket, "CMSG_LEN")
2257 def testCMSG_LEN(self):
2258 # Test CMSG_LEN() with various valid and invalid values,
2259 # checking the assumptions used by recvmsg() and sendmsg().
2260 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2261 values = list(range(257)) + list(range(toobig - 257, toobig))
2262
2263 # struct cmsghdr has at least three members, two of which are ints
2264 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2265 for n in values:
2266 ret = socket.CMSG_LEN(n)
2267 # This is how recvmsg() calculates the data size
2268 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2269 self.assertLessEqual(ret, self.socklen_t_limit)
2270
2271 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2272 # sendmsg() shares code with these functions, and requires
2273 # that it reject values over the limit.
2274 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2275 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2276
2277 @requireAttrs(socket, "CMSG_SPACE")
2278 def testCMSG_SPACE(self):
2279 # Test CMSG_SPACE() with various valid and invalid values,
2280 # checking the assumptions used by sendmsg().
2281 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2282 values = list(range(257)) + list(range(toobig - 257, toobig))
2283
2284 last = socket.CMSG_SPACE(0)
2285 # struct cmsghdr has at least three members, two of which are ints
2286 self.assertGreater(last, array.array("i").itemsize * 2)
2287 for n in values:
2288 ret = socket.CMSG_SPACE(n)
2289 self.assertGreaterEqual(ret, last)
2290 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2291 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2292 self.assertLessEqual(ret, self.socklen_t_limit)
2293 last = ret
2294
2295 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2296 # sendmsg() shares code with these functions, and requires
2297 # that it reject values over the limit.
2298 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2299 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2300
2301
2302class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2303 # Tests for file descriptor passing on Unix-domain sockets.
2304
2305 # Invalid file descriptor value that's unlikely to evaluate to a
2306 # real FD even if one of its bytes is replaced with a different
2307 # value (which shouldn't actually happen).
2308 badfd = -0x5555
2309
2310 def newFDs(self, n):
2311 # Return a list of n file descriptors for newly-created files
2312 # containing their list indices as ASCII numbers.
2313 fds = []
2314 for i in range(n):
2315 fd, path = tempfile.mkstemp()
2316 self.addCleanup(os.unlink, path)
2317 self.addCleanup(os.close, fd)
2318 os.write(fd, str(i).encode())
2319 fds.append(fd)
2320 return fds
2321
2322 def checkFDs(self, fds):
2323 # Check that the file descriptors in the given list contain
2324 # their correct list indices as ASCII numbers.
2325 for n, fd in enumerate(fds):
2326 os.lseek(fd, 0, os.SEEK_SET)
2327 self.assertEqual(os.read(fd, 1024), str(n).encode())
2328
2329 def registerRecvmsgResult(self, result):
2330 self.addCleanup(self.closeRecvmsgFDs, result)
2331
2332 def closeRecvmsgFDs(self, recvmsg_result):
2333 # Close all file descriptors specified in the ancillary data
2334 # of the given return value from recvmsg() or recvmsg_into().
2335 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2336 if (cmsg_level == socket.SOL_SOCKET and
2337 cmsg_type == socket.SCM_RIGHTS):
2338 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002339 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002340 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2341 for fd in fds:
2342 os.close(fd)
2343
2344 def createAndSendFDs(self, n):
2345 # Send n new file descriptors created by newFDs() to the
2346 # server, with the constant MSG as the non-ancillary data.
2347 self.assertEqual(
2348 self.sendmsgToServer([MSG],
2349 [(socket.SOL_SOCKET,
2350 socket.SCM_RIGHTS,
2351 array.array("i", self.newFDs(n)))]),
2352 len(MSG))
2353
2354 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2355 # Check that constant MSG was received with numfds file
2356 # descriptors in a maximum of maxcmsgs control messages (which
2357 # must contain only complete integers). By default, check
2358 # that MSG_CTRUNC is unset, but ignore any flags in
2359 # ignoreflags.
2360 msg, ancdata, flags, addr = result
2361 self.assertEqual(msg, MSG)
2362 self.checkRecvmsgAddress(addr, self.cli_addr)
2363 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2364 ignore=ignoreflags)
2365
2366 self.assertIsInstance(ancdata, list)
2367 self.assertLessEqual(len(ancdata), maxcmsgs)
2368 fds = array.array("i")
2369 for item in ancdata:
2370 self.assertIsInstance(item, tuple)
2371 cmsg_level, cmsg_type, cmsg_data = item
2372 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2373 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2374 self.assertIsInstance(cmsg_data, bytes)
2375 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002376 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002377
2378 self.assertEqual(len(fds), numfds)
2379 self.checkFDs(fds)
2380
2381 def testFDPassSimple(self):
2382 # Pass a single FD (array read from bytes object).
2383 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2384 len(MSG), 10240))
2385
2386 def _testFDPassSimple(self):
2387 self.assertEqual(
2388 self.sendmsgToServer(
2389 [MSG],
2390 [(socket.SOL_SOCKET,
2391 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002392 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002393 len(MSG))
2394
2395 def testMultipleFDPass(self):
2396 # Pass multiple FDs in a single array.
2397 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2398 len(MSG), 10240))
2399
2400 def _testMultipleFDPass(self):
2401 self.createAndSendFDs(4)
2402
2403 @requireAttrs(socket, "CMSG_SPACE")
2404 def testFDPassCMSG_SPACE(self):
2405 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2406 self.checkRecvmsgFDs(
2407 4, self.doRecvmsg(self.serv_sock, len(MSG),
2408 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2409
2410 @testFDPassCMSG_SPACE.client_skip
2411 def _testFDPassCMSG_SPACE(self):
2412 self.createAndSendFDs(4)
2413
2414 def testFDPassCMSG_LEN(self):
2415 # Test using CMSG_LEN() to calculate ancillary buffer size.
2416 self.checkRecvmsgFDs(1,
2417 self.doRecvmsg(self.serv_sock, len(MSG),
2418 socket.CMSG_LEN(4 * SIZEOF_INT)),
2419 # RFC 3542 says implementations may set
2420 # MSG_CTRUNC if there isn't enough space
2421 # for trailing padding.
2422 ignoreflags=socket.MSG_CTRUNC)
2423
2424 def _testFDPassCMSG_LEN(self):
2425 self.createAndSendFDs(1)
2426
Nick Coghlan2496f332011-09-19 20:26:31 +10002427 # Issue #12958: The following test has problems on Mac OS X
2428 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002429 @requireAttrs(socket, "CMSG_SPACE")
2430 def testFDPassSeparate(self):
2431 # Pass two FDs in two separate arrays. Arrays may be combined
2432 # into a single control message by the OS.
2433 self.checkRecvmsgFDs(2,
2434 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2435 maxcmsgs=2)
2436
2437 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002438 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002439 def _testFDPassSeparate(self):
2440 fd0, fd1 = self.newFDs(2)
2441 self.assertEqual(
2442 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2443 socket.SCM_RIGHTS,
2444 array.array("i", [fd0])),
2445 (socket.SOL_SOCKET,
2446 socket.SCM_RIGHTS,
2447 array.array("i", [fd1]))]),
2448 len(MSG))
2449
Nick Coghlan2496f332011-09-19 20:26:31 +10002450 # Issue #12958: The following test has problems on Mac OS X
2451 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002452 @requireAttrs(socket, "CMSG_SPACE")
2453 def testFDPassSeparateMinSpace(self):
2454 # Pass two FDs in two separate arrays, receiving them into the
2455 # minimum space for two arrays.
2456 self.checkRecvmsgFDs(2,
2457 self.doRecvmsg(self.serv_sock, len(MSG),
2458 socket.CMSG_SPACE(SIZEOF_INT) +
2459 socket.CMSG_LEN(SIZEOF_INT)),
2460 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2461
2462 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002463 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002464 def _testFDPassSeparateMinSpace(self):
2465 fd0, fd1 = self.newFDs(2)
2466 self.assertEqual(
2467 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2468 socket.SCM_RIGHTS,
2469 array.array("i", [fd0])),
2470 (socket.SOL_SOCKET,
2471 socket.SCM_RIGHTS,
2472 array.array("i", [fd1]))]),
2473 len(MSG))
2474
2475 def sendAncillaryIfPossible(self, msg, ancdata):
2476 # Try to send msg and ancdata to server, but if the system
2477 # call fails, just send msg with no ancillary data.
2478 try:
2479 nbytes = self.sendmsgToServer([msg], ancdata)
2480 except socket.error as e:
2481 # Check that it was the system call that failed
2482 self.assertIsInstance(e.errno, int)
2483 nbytes = self.sendmsgToServer([msg])
2484 self.assertEqual(nbytes, len(msg))
2485
2486 def testFDPassEmpty(self):
2487 # Try to pass an empty FD array. Can receive either no array
2488 # or an empty array.
2489 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2490 len(MSG), 10240),
2491 ignoreflags=socket.MSG_CTRUNC)
2492
2493 def _testFDPassEmpty(self):
2494 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2495 socket.SCM_RIGHTS,
2496 b"")])
2497
2498 def testFDPassPartialInt(self):
2499 # Try to pass a truncated FD array.
2500 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2501 len(MSG), 10240)
2502 self.assertEqual(msg, MSG)
2503 self.checkRecvmsgAddress(addr, self.cli_addr)
2504 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2505 self.assertLessEqual(len(ancdata), 1)
2506 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2507 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2508 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2509 self.assertLess(len(cmsg_data), SIZEOF_INT)
2510
2511 def _testFDPassPartialInt(self):
2512 self.sendAncillaryIfPossible(
2513 MSG,
2514 [(socket.SOL_SOCKET,
2515 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002516 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002517
2518 @requireAttrs(socket, "CMSG_SPACE")
2519 def testFDPassPartialIntInMiddle(self):
2520 # Try to pass two FD arrays, the first of which is truncated.
2521 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2522 len(MSG), 10240)
2523 self.assertEqual(msg, MSG)
2524 self.checkRecvmsgAddress(addr, self.cli_addr)
2525 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2526 self.assertLessEqual(len(ancdata), 2)
2527 fds = array.array("i")
2528 # Arrays may have been combined in a single control message
2529 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2530 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2531 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002532 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002533 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2534 self.assertLessEqual(len(fds), 2)
2535 self.checkFDs(fds)
2536
2537 @testFDPassPartialIntInMiddle.client_skip
2538 def _testFDPassPartialIntInMiddle(self):
2539 fd0, fd1 = self.newFDs(2)
2540 self.sendAncillaryIfPossible(
2541 MSG,
2542 [(socket.SOL_SOCKET,
2543 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002544 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002545 (socket.SOL_SOCKET,
2546 socket.SCM_RIGHTS,
2547 array.array("i", [fd1]))])
2548
2549 def checkTruncatedHeader(self, result, ignoreflags=0):
2550 # Check that no ancillary data items are returned when data is
2551 # truncated inside the cmsghdr structure.
2552 msg, ancdata, flags, addr = result
2553 self.assertEqual(msg, MSG)
2554 self.checkRecvmsgAddress(addr, self.cli_addr)
2555 self.assertEqual(ancdata, [])
2556 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2557 ignore=ignoreflags)
2558
2559 def testCmsgTruncNoBufSize(self):
2560 # Check that no ancillary data is received when no buffer size
2561 # is specified.
2562 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2563 # BSD seems to set MSG_CTRUNC only
2564 # if an item has been partially
2565 # received.
2566 ignoreflags=socket.MSG_CTRUNC)
2567
2568 def _testCmsgTruncNoBufSize(self):
2569 self.createAndSendFDs(1)
2570
2571 def testCmsgTrunc0(self):
2572 # Check that no ancillary data is received when buffer size is 0.
2573 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2574 ignoreflags=socket.MSG_CTRUNC)
2575
2576 def _testCmsgTrunc0(self):
2577 self.createAndSendFDs(1)
2578
2579 # Check that no ancillary data is returned for various non-zero
2580 # (but still too small) buffer sizes.
2581
2582 def testCmsgTrunc1(self):
2583 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2584
2585 def _testCmsgTrunc1(self):
2586 self.createAndSendFDs(1)
2587
2588 def testCmsgTrunc2Int(self):
2589 # The cmsghdr structure has at least three members, two of
2590 # which are ints, so we still shouldn't see any ancillary
2591 # data.
2592 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2593 SIZEOF_INT * 2))
2594
2595 def _testCmsgTrunc2Int(self):
2596 self.createAndSendFDs(1)
2597
2598 def testCmsgTruncLen0Minus1(self):
2599 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2600 socket.CMSG_LEN(0) - 1))
2601
2602 def _testCmsgTruncLen0Minus1(self):
2603 self.createAndSendFDs(1)
2604
2605 # The following tests try to truncate the control message in the
2606 # middle of the FD array.
2607
2608 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2609 # Check that file descriptor data is truncated to between
2610 # mindata and maxdata bytes when received with buffer size
2611 # ancbuf, and that any complete file descriptor numbers are
2612 # valid.
2613 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2614 len(MSG), ancbuf)
2615 self.assertEqual(msg, MSG)
2616 self.checkRecvmsgAddress(addr, self.cli_addr)
2617 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2618
2619 if mindata == 0 and ancdata == []:
2620 return
2621 self.assertEqual(len(ancdata), 1)
2622 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2623 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2624 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2625 self.assertGreaterEqual(len(cmsg_data), mindata)
2626 self.assertLessEqual(len(cmsg_data), maxdata)
2627 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002628 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002629 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2630 self.checkFDs(fds)
2631
2632 def testCmsgTruncLen0(self):
2633 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2634
2635 def _testCmsgTruncLen0(self):
2636 self.createAndSendFDs(1)
2637
2638 def testCmsgTruncLen0Plus1(self):
2639 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2640
2641 def _testCmsgTruncLen0Plus1(self):
2642 self.createAndSendFDs(2)
2643
2644 def testCmsgTruncLen1(self):
2645 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2646 maxdata=SIZEOF_INT)
2647
2648 def _testCmsgTruncLen1(self):
2649 self.createAndSendFDs(2)
2650
2651 def testCmsgTruncLen2Minus1(self):
2652 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2653 maxdata=(2 * SIZEOF_INT) - 1)
2654
2655 def _testCmsgTruncLen2Minus1(self):
2656 self.createAndSendFDs(2)
2657
2658
2659class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2660 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2661 # features of the RFC 3542 Advanced Sockets API for IPv6.
2662 # Currently we can only handle certain data items (e.g. traffic
2663 # class, hop limit, MTU discovery and fragmentation settings)
2664 # without resorting to unportable means such as the struct module,
2665 # but the tests here are aimed at testing the ancillary data
2666 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2667 # itself.
2668
2669 # Test value to use when setting hop limit of packet
2670 hop_limit = 2
2671
2672 # Test value to use when setting traffic class of packet.
2673 # -1 means "use kernel default".
2674 traffic_class = -1
2675
2676 def ancillaryMapping(self, ancdata):
2677 # Given ancillary data list ancdata, return a mapping from
2678 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2679 # Check that no (level, type) pair appears more than once.
2680 d = {}
2681 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2682 self.assertNotIn((cmsg_level, cmsg_type), d)
2683 d[(cmsg_level, cmsg_type)] = cmsg_data
2684 return d
2685
2686 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2687 # Receive hop limit into ancbufsize bytes of ancillary data
2688 # space. Check that data is MSG, ancillary data is not
2689 # truncated (but ignore any flags in ignoreflags), and hop
2690 # limit is between 0 and maxhop inclusive.
2691 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2692 socket.IPV6_RECVHOPLIMIT, 1)
2693 self.misc_event.set()
2694 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2695 len(MSG), ancbufsize)
2696
2697 self.assertEqual(msg, MSG)
2698 self.checkRecvmsgAddress(addr, self.cli_addr)
2699 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2700 ignore=ignoreflags)
2701
2702 self.assertEqual(len(ancdata), 1)
2703 self.assertIsInstance(ancdata[0], tuple)
2704 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2705 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2706 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2707 self.assertIsInstance(cmsg_data, bytes)
2708 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2709 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002710 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002711 self.assertGreaterEqual(a[0], 0)
2712 self.assertLessEqual(a[0], maxhop)
2713
2714 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2715 def testRecvHopLimit(self):
2716 # Test receiving the packet hop limit as ancillary data.
2717 self.checkHopLimit(ancbufsize=10240)
2718
2719 @testRecvHopLimit.client_skip
2720 def _testRecvHopLimit(self):
2721 # Need to wait until server has asked to receive ancillary
2722 # data, as implementations are not required to buffer it
2723 # otherwise.
2724 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2725 self.sendToServer(MSG)
2726
2727 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2728 def testRecvHopLimitCMSG_SPACE(self):
2729 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2730 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2731
2732 @testRecvHopLimitCMSG_SPACE.client_skip
2733 def _testRecvHopLimitCMSG_SPACE(self):
2734 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2735 self.sendToServer(MSG)
2736
2737 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2738 # 3542 says portable applications must provide space for trailing
2739 # padding. Implementations may set MSG_CTRUNC if there isn't
2740 # enough space for the padding.
2741
2742 @requireAttrs(socket.socket, "sendmsg")
2743 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2744 def testSetHopLimit(self):
2745 # Test setting hop limit on outgoing packet and receiving it
2746 # at the other end.
2747 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2748
2749 @testSetHopLimit.client_skip
2750 def _testSetHopLimit(self):
2751 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2752 self.assertEqual(
2753 self.sendmsgToServer([MSG],
2754 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2755 array.array("i", [self.hop_limit]))]),
2756 len(MSG))
2757
2758 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2759 ignoreflags=0):
2760 # Receive traffic class and hop limit into ancbufsize bytes of
2761 # ancillary data space. Check that data is MSG, ancillary
2762 # data is not truncated (but ignore any flags in ignoreflags),
2763 # and traffic class and hop limit are in range (hop limit no
2764 # more than maxhop).
2765 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2766 socket.IPV6_RECVHOPLIMIT, 1)
2767 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2768 socket.IPV6_RECVTCLASS, 1)
2769 self.misc_event.set()
2770 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2771 len(MSG), ancbufsize)
2772
2773 self.assertEqual(msg, MSG)
2774 self.checkRecvmsgAddress(addr, self.cli_addr)
2775 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2776 ignore=ignoreflags)
2777 self.assertEqual(len(ancdata), 2)
2778 ancmap = self.ancillaryMapping(ancdata)
2779
2780 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2781 self.assertEqual(len(tcdata), SIZEOF_INT)
2782 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002783 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002784 self.assertGreaterEqual(a[0], 0)
2785 self.assertLessEqual(a[0], 255)
2786
2787 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2788 self.assertEqual(len(hldata), SIZEOF_INT)
2789 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002790 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002791 self.assertGreaterEqual(a[0], 0)
2792 self.assertLessEqual(a[0], maxhop)
2793
2794 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2795 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2796 def testRecvTrafficClassAndHopLimit(self):
2797 # Test receiving traffic class and hop limit as ancillary data.
2798 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2799
2800 @testRecvTrafficClassAndHopLimit.client_skip
2801 def _testRecvTrafficClassAndHopLimit(self):
2802 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2803 self.sendToServer(MSG)
2804
2805 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2806 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2807 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2808 # Test receiving traffic class and hop limit, using
2809 # CMSG_SPACE() to calculate buffer size.
2810 self.checkTrafficClassAndHopLimit(
2811 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2812
2813 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2814 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2815 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2816 self.sendToServer(MSG)
2817
2818 @requireAttrs(socket.socket, "sendmsg")
2819 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2820 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2821 def testSetTrafficClassAndHopLimit(self):
2822 # Test setting traffic class and hop limit on outgoing packet,
2823 # and receiving them at the other end.
2824 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2825 maxhop=self.hop_limit)
2826
2827 @testSetTrafficClassAndHopLimit.client_skip
2828 def _testSetTrafficClassAndHopLimit(self):
2829 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2830 self.assertEqual(
2831 self.sendmsgToServer([MSG],
2832 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2833 array.array("i", [self.traffic_class])),
2834 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2835 array.array("i", [self.hop_limit]))]),
2836 len(MSG))
2837
2838 @requireAttrs(socket.socket, "sendmsg")
2839 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2840 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2841 def testOddCmsgSize(self):
2842 # Try to send ancillary data with first item one byte too
2843 # long. Fall back to sending with correct size if this fails,
2844 # and check that second item was handled correctly.
2845 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2846 maxhop=self.hop_limit)
2847
2848 @testOddCmsgSize.client_skip
2849 def _testOddCmsgSize(self):
2850 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2851 try:
2852 nbytes = self.sendmsgToServer(
2853 [MSG],
2854 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002855 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002856 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2857 array.array("i", [self.hop_limit]))])
2858 except socket.error as e:
2859 self.assertIsInstance(e.errno, int)
2860 nbytes = self.sendmsgToServer(
2861 [MSG],
2862 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2863 array.array("i", [self.traffic_class])),
2864 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2865 array.array("i", [self.hop_limit]))])
2866 self.assertEqual(nbytes, len(MSG))
2867
2868 # Tests for proper handling of truncated ancillary data
2869
2870 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2871 # Receive hop limit into ancbufsize bytes of ancillary data
2872 # space, which should be too small to contain the ancillary
2873 # data header (if ancbufsize is None, pass no second argument
2874 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2875 # (unless included in ignoreflags), and no ancillary data is
2876 # returned.
2877 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2878 socket.IPV6_RECVHOPLIMIT, 1)
2879 self.misc_event.set()
2880 args = () if ancbufsize is None else (ancbufsize,)
2881 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2882 len(MSG), *args)
2883
2884 self.assertEqual(msg, MSG)
2885 self.checkRecvmsgAddress(addr, self.cli_addr)
2886 self.assertEqual(ancdata, [])
2887 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2888 ignore=ignoreflags)
2889
2890 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2891 def testCmsgTruncNoBufSize(self):
2892 # Check that no ancillary data is received when no ancillary
2893 # buffer size is provided.
2894 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2895 # BSD seems to set
2896 # MSG_CTRUNC only if an item
2897 # has been partially
2898 # received.
2899 ignoreflags=socket.MSG_CTRUNC)
2900
2901 @testCmsgTruncNoBufSize.client_skip
2902 def _testCmsgTruncNoBufSize(self):
2903 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2904 self.sendToServer(MSG)
2905
2906 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2907 def testSingleCmsgTrunc0(self):
2908 # Check that no ancillary data is received when ancillary
2909 # buffer size is zero.
2910 self.checkHopLimitTruncatedHeader(ancbufsize=0,
2911 ignoreflags=socket.MSG_CTRUNC)
2912
2913 @testSingleCmsgTrunc0.client_skip
2914 def _testSingleCmsgTrunc0(self):
2915 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2916 self.sendToServer(MSG)
2917
2918 # Check that no ancillary data is returned for various non-zero
2919 # (but still too small) buffer sizes.
2920
2921 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2922 def testSingleCmsgTrunc1(self):
2923 self.checkHopLimitTruncatedHeader(ancbufsize=1)
2924
2925 @testSingleCmsgTrunc1.client_skip
2926 def _testSingleCmsgTrunc1(self):
2927 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2928 self.sendToServer(MSG)
2929
2930 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2931 def testSingleCmsgTrunc2Int(self):
2932 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
2933
2934 @testSingleCmsgTrunc2Int.client_skip
2935 def _testSingleCmsgTrunc2Int(self):
2936 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2937 self.sendToServer(MSG)
2938
2939 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2940 def testSingleCmsgTruncLen0Minus1(self):
2941 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
2942
2943 @testSingleCmsgTruncLen0Minus1.client_skip
2944 def _testSingleCmsgTruncLen0Minus1(self):
2945 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2946 self.sendToServer(MSG)
2947
2948 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2949 def testSingleCmsgTruncInData(self):
2950 # Test truncation of a control message inside its associated
2951 # data. The message may be returned with its data truncated,
2952 # or not returned at all.
2953 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2954 socket.IPV6_RECVHOPLIMIT, 1)
2955 self.misc_event.set()
2956 msg, ancdata, flags, addr = self.doRecvmsg(
2957 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
2958
2959 self.assertEqual(msg, MSG)
2960 self.checkRecvmsgAddress(addr, self.cli_addr)
2961 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2962
2963 self.assertLessEqual(len(ancdata), 1)
2964 if ancdata:
2965 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2966 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2967 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2968 self.assertLess(len(cmsg_data), SIZEOF_INT)
2969
2970 @testSingleCmsgTruncInData.client_skip
2971 def _testSingleCmsgTruncInData(self):
2972 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2973 self.sendToServer(MSG)
2974
2975 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
2976 # Receive traffic class and hop limit into ancbufsize bytes of
2977 # ancillary data space, which should be large enough to
2978 # contain the first item, but too small to contain the header
2979 # of the second. Check that data is MSG, MSG_CTRUNC is set
2980 # (unless included in ignoreflags), and only one ancillary
2981 # data item is returned.
2982 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2983 socket.IPV6_RECVHOPLIMIT, 1)
2984 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2985 socket.IPV6_RECVTCLASS, 1)
2986 self.misc_event.set()
2987 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2988 len(MSG), ancbufsize)
2989
2990 self.assertEqual(msg, MSG)
2991 self.checkRecvmsgAddress(addr, self.cli_addr)
2992 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2993 ignore=ignoreflags)
2994
2995 self.assertEqual(len(ancdata), 1)
2996 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2997 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2998 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
2999 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3000 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003001 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003002 self.assertGreaterEqual(a[0], 0)
3003 self.assertLessEqual(a[0], 255)
3004
3005 # Try the above test with various buffer sizes.
3006
3007 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3008 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3009 def testSecondCmsgTrunc0(self):
3010 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3011 ignoreflags=socket.MSG_CTRUNC)
3012
3013 @testSecondCmsgTrunc0.client_skip
3014 def _testSecondCmsgTrunc0(self):
3015 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3016 self.sendToServer(MSG)
3017
3018 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3019 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3020 def testSecondCmsgTrunc1(self):
3021 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3022
3023 @testSecondCmsgTrunc1.client_skip
3024 def _testSecondCmsgTrunc1(self):
3025 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3026 self.sendToServer(MSG)
3027
3028 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3029 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3030 def testSecondCmsgTrunc2Int(self):
3031 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3032 2 * SIZEOF_INT)
3033
3034 @testSecondCmsgTrunc2Int.client_skip
3035 def _testSecondCmsgTrunc2Int(self):
3036 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3037 self.sendToServer(MSG)
3038
3039 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3040 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3041 def testSecondCmsgTruncLen0Minus1(self):
3042 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3043 socket.CMSG_LEN(0) - 1)
3044
3045 @testSecondCmsgTruncLen0Minus1.client_skip
3046 def _testSecondCmsgTruncLen0Minus1(self):
3047 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3048 self.sendToServer(MSG)
3049
3050 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3051 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3052 def testSecomdCmsgTruncInData(self):
3053 # Test truncation of the second of two control messages inside
3054 # its associated data.
3055 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3056 socket.IPV6_RECVHOPLIMIT, 1)
3057 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3058 socket.IPV6_RECVTCLASS, 1)
3059 self.misc_event.set()
3060 msg, ancdata, flags, addr = self.doRecvmsg(
3061 self.serv_sock, len(MSG),
3062 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3063
3064 self.assertEqual(msg, MSG)
3065 self.checkRecvmsgAddress(addr, self.cli_addr)
3066 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3067
3068 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3069
3070 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3071 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3072 cmsg_types.remove(cmsg_type)
3073 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3074 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003075 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003076 self.assertGreaterEqual(a[0], 0)
3077 self.assertLessEqual(a[0], 255)
3078
3079 if ancdata:
3080 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3081 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3082 cmsg_types.remove(cmsg_type)
3083 self.assertLess(len(cmsg_data), SIZEOF_INT)
3084
3085 self.assertEqual(ancdata, [])
3086
3087 @testSecomdCmsgTruncInData.client_skip
3088 def _testSecomdCmsgTruncInData(self):
3089 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3090 self.sendToServer(MSG)
3091
3092
3093# Derive concrete test classes for different socket types.
3094
3095class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3096 SendrecvmsgConnectionlessBase,
3097 ThreadedSocketTestMixin, UDPTestBase):
3098 pass
3099
3100@requireAttrs(socket.socket, "sendmsg")
3101@unittest.skipUnless(thread, 'Threading required for this test.')
3102class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3103 pass
3104
3105@requireAttrs(socket.socket, "recvmsg")
3106@unittest.skipUnless(thread, 'Threading required for this test.')
3107class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3108 pass
3109
3110@requireAttrs(socket.socket, "recvmsg_into")
3111@unittest.skipUnless(thread, 'Threading required for this test.')
3112class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3113 pass
3114
3115
3116class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3117 SendrecvmsgConnectionlessBase,
3118 ThreadedSocketTestMixin, UDP6TestBase):
3119 pass
3120
3121@requireAttrs(socket.socket, "sendmsg")
3122@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3123@requireSocket("AF_INET6", "SOCK_DGRAM")
3124@unittest.skipUnless(thread, 'Threading required for this test.')
3125class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3126 pass
3127
3128@requireAttrs(socket.socket, "recvmsg")
3129@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3130@requireSocket("AF_INET6", "SOCK_DGRAM")
3131@unittest.skipUnless(thread, 'Threading required for this test.')
3132class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3133 pass
3134
3135@requireAttrs(socket.socket, "recvmsg_into")
3136@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3137@requireSocket("AF_INET6", "SOCK_DGRAM")
3138@unittest.skipUnless(thread, 'Threading required for this test.')
3139class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3140 pass
3141
3142@requireAttrs(socket.socket, "recvmsg")
3143@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3144@requireAttrs(socket, "IPPROTO_IPV6")
3145@requireSocket("AF_INET6", "SOCK_DGRAM")
3146@unittest.skipUnless(thread, 'Threading required for this test.')
3147class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3148 SendrecvmsgUDP6TestBase):
3149 pass
3150
3151@requireAttrs(socket.socket, "recvmsg_into")
3152@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3153@requireAttrs(socket, "IPPROTO_IPV6")
3154@requireSocket("AF_INET6", "SOCK_DGRAM")
3155@unittest.skipUnless(thread, 'Threading required for this test.')
3156class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3157 RFC3542AncillaryTest,
3158 SendrecvmsgUDP6TestBase):
3159 pass
3160
3161
3162class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3163 ConnectedStreamTestMixin, TCPTestBase):
3164 pass
3165
3166@requireAttrs(socket.socket, "sendmsg")
3167@unittest.skipUnless(thread, 'Threading required for this test.')
3168class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3169 pass
3170
3171@requireAttrs(socket.socket, "recvmsg")
3172@unittest.skipUnless(thread, 'Threading required for this test.')
3173class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3174 SendrecvmsgTCPTestBase):
3175 pass
3176
3177@requireAttrs(socket.socket, "recvmsg_into")
3178@unittest.skipUnless(thread, 'Threading required for this test.')
3179class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3180 SendrecvmsgTCPTestBase):
3181 pass
3182
3183
3184class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3185 SendrecvmsgConnectedBase,
3186 ConnectedStreamTestMixin, SCTPStreamBase):
3187 pass
3188
3189@requireAttrs(socket.socket, "sendmsg")
3190@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3191@unittest.skipUnless(thread, 'Threading required for this test.')
3192class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3193 pass
3194
3195@requireAttrs(socket.socket, "recvmsg")
3196@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3197@unittest.skipUnless(thread, 'Threading required for this test.')
3198class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3199 SendrecvmsgSCTPStreamTestBase):
3200 pass
3201
3202@requireAttrs(socket.socket, "recvmsg_into")
3203@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3204@unittest.skipUnless(thread, 'Threading required for this test.')
3205class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3206 SendrecvmsgSCTPStreamTestBase):
3207 pass
3208
3209
3210class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3211 ConnectedStreamTestMixin, UnixStreamBase):
3212 pass
3213
3214@requireAttrs(socket.socket, "sendmsg")
3215@requireAttrs(socket, "AF_UNIX")
3216@unittest.skipUnless(thread, 'Threading required for this test.')
3217class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3218 pass
3219
3220@requireAttrs(socket.socket, "recvmsg")
3221@requireAttrs(socket, "AF_UNIX")
3222@unittest.skipUnless(thread, 'Threading required for this test.')
3223class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3224 SendrecvmsgUnixStreamTestBase):
3225 pass
3226
3227@requireAttrs(socket.socket, "recvmsg_into")
3228@requireAttrs(socket, "AF_UNIX")
3229@unittest.skipUnless(thread, 'Threading required for this test.')
3230class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3231 SendrecvmsgUnixStreamTestBase):
3232 pass
3233
3234@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3235@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3236@unittest.skipUnless(thread, 'Threading required for this test.')
3237class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3238 pass
3239
3240@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3241@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3242@unittest.skipUnless(thread, 'Threading required for this test.')
3243class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3244 SendrecvmsgUnixStreamTestBase):
3245 pass
3246
3247
3248# Test interrupting the interruptible send/receive methods with a
3249# signal when a timeout is set. These tests avoid having multiple
3250# threads alive during the test so that the OS cannot deliver the
3251# signal to the wrong one.
3252
3253class InterruptedTimeoutBase(unittest.TestCase):
3254 # Base class for interrupted send/receive tests. Installs an
3255 # empty handler for SIGALRM and removes it on teardown, along with
3256 # any scheduled alarms.
3257
3258 def setUp(self):
3259 super().setUp()
3260 orig_alrm_handler = signal.signal(signal.SIGALRM,
3261 lambda signum, frame: None)
3262 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3263 self.addCleanup(self.setAlarm, 0)
3264
3265 # Timeout for socket operations
3266 timeout = 4.0
3267
3268 # Provide setAlarm() method to schedule delivery of SIGALRM after
3269 # given number of seconds, or cancel it if zero, and an
3270 # appropriate time value to use. Use setitimer() if available.
3271 if hasattr(signal, "setitimer"):
3272 alarm_time = 0.05
3273
3274 def setAlarm(self, seconds):
3275 signal.setitimer(signal.ITIMER_REAL, seconds)
3276 else:
3277 # Old systems may deliver the alarm up to one second early
3278 alarm_time = 2
3279
3280 def setAlarm(self, seconds):
3281 signal.alarm(seconds)
3282
3283
3284# Require siginterrupt() in order to ensure that system calls are
3285# interrupted by default.
3286@requireAttrs(signal, "siginterrupt")
3287@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3288 "Don't have signal.alarm or signal.setitimer")
3289class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3290 # Test interrupting the recv*() methods with signals when a
3291 # timeout is set.
3292
3293 def setUp(self):
3294 super().setUp()
3295 self.serv.settimeout(self.timeout)
3296
3297 def checkInterruptedRecv(self, func, *args, **kwargs):
3298 # Check that func(*args, **kwargs) raises socket.error with an
3299 # errno of EINTR when interrupted by a signal.
3300 self.setAlarm(self.alarm_time)
3301 with self.assertRaises(socket.error) as cm:
3302 func(*args, **kwargs)
3303 self.assertNotIsInstance(cm.exception, socket.timeout)
3304 self.assertEqual(cm.exception.errno, errno.EINTR)
3305
3306 def testInterruptedRecvTimeout(self):
3307 self.checkInterruptedRecv(self.serv.recv, 1024)
3308
3309 def testInterruptedRecvIntoTimeout(self):
3310 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3311
3312 def testInterruptedRecvfromTimeout(self):
3313 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3314
3315 def testInterruptedRecvfromIntoTimeout(self):
3316 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3317
3318 @requireAttrs(socket.socket, "recvmsg")
3319 def testInterruptedRecvmsgTimeout(self):
3320 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3321
3322 @requireAttrs(socket.socket, "recvmsg_into")
3323 def testInterruptedRecvmsgIntoTimeout(self):
3324 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3325
3326
3327# Require siginterrupt() in order to ensure that system calls are
3328# interrupted by default.
3329@requireAttrs(signal, "siginterrupt")
3330@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3331 "Don't have signal.alarm or signal.setitimer")
3332@unittest.skipUnless(thread, 'Threading required for this test.')
3333class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3334 ThreadSafeCleanupTestCase,
3335 SocketListeningTestMixin, TCPTestBase):
3336 # Test interrupting the interruptible send*() methods with signals
3337 # when a timeout is set.
3338
3339 def setUp(self):
3340 super().setUp()
3341 self.serv_conn = self.newSocket()
3342 self.addCleanup(self.serv_conn.close)
3343 # Use a thread to complete the connection, but wait for it to
3344 # terminate before running the test, so that there is only one
3345 # thread to accept the signal.
3346 cli_thread = threading.Thread(target=self.doConnect)
3347 cli_thread.start()
3348 self.cli_conn, addr = self.serv.accept()
3349 self.addCleanup(self.cli_conn.close)
3350 cli_thread.join()
3351 self.serv_conn.settimeout(self.timeout)
3352
3353 def doConnect(self):
3354 self.serv_conn.connect(self.serv_addr)
3355
3356 def checkInterruptedSend(self, func, *args, **kwargs):
3357 # Check that func(*args, **kwargs), run in a loop, raises
3358 # socket.error with an errno of EINTR when interrupted by a
3359 # signal.
3360 with self.assertRaises(socket.error) as cm:
3361 while True:
3362 self.setAlarm(self.alarm_time)
3363 func(*args, **kwargs)
3364 self.assertNotIsInstance(cm.exception, socket.timeout)
3365 self.assertEqual(cm.exception.errno, errno.EINTR)
3366
Nick Coghlan2496f332011-09-19 20:26:31 +10003367 # Issue #12958: The following tests have problems on Mac OS X
3368 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003369 def testInterruptedSendTimeout(self):
3370 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3371
Nick Coghlan2496f332011-09-19 20:26:31 +10003372 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003373 def testInterruptedSendtoTimeout(self):
3374 # Passing an actual address here as Python's wrapper for
3375 # sendto() doesn't allow passing a zero-length one; POSIX
3376 # requires that the address is ignored since the socket is
3377 # connection-mode, however.
3378 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3379 self.serv_addr)
3380
Nick Coghlan2496f332011-09-19 20:26:31 +10003381 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003382 @requireAttrs(socket.socket, "sendmsg")
3383 def testInterruptedSendmsgTimeout(self):
3384 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3385
3386
Victor Stinner45df8202010-04-28 22:31:17 +00003387@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003388class TCPCloserTest(ThreadedTCPSocketTest):
3389
3390 def testClose(self):
3391 conn, addr = self.serv.accept()
3392 conn.close()
3393
3394 sd = self.cli
3395 read, write, err = select.select([sd], [], [], 1.0)
3396 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003397 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003398
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003399 # Calling close() many times should be safe.
3400 conn.close()
3401 conn.close()
3402
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003403 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003404 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003405 time.sleep(1.0)
3406
Victor Stinner45df8202010-04-28 22:31:17 +00003407@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003408class BasicSocketPairTest(SocketPairTest):
3409
3410 def __init__(self, methodName='runTest'):
3411 SocketPairTest.__init__(self, methodName=methodName)
3412
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003413 def _check_defaults(self, sock):
3414 self.assertIsInstance(sock, socket.socket)
3415 if hasattr(socket, 'AF_UNIX'):
3416 self.assertEqual(sock.family, socket.AF_UNIX)
3417 else:
3418 self.assertEqual(sock.family, socket.AF_INET)
3419 self.assertEqual(sock.type, socket.SOCK_STREAM)
3420 self.assertEqual(sock.proto, 0)
3421
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003422 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003423 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003424
3425 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003426 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003427
Dave Cole331708b2004-08-09 04:51:41 +00003428 def testRecv(self):
3429 msg = self.serv.recv(1024)
3430 self.assertEqual(msg, MSG)
3431
3432 def _testRecv(self):
3433 self.cli.send(MSG)
3434
3435 def testSend(self):
3436 self.serv.send(MSG)
3437
3438 def _testSend(self):
3439 msg = self.cli.recv(1024)
3440 self.assertEqual(msg, MSG)
3441
Victor Stinner45df8202010-04-28 22:31:17 +00003442@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003443class NonBlockingTCPTests(ThreadedTCPSocketTest):
3444
3445 def __init__(self, methodName='runTest'):
3446 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3447
3448 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003449 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003450 self.serv.setblocking(0)
3451 start = time.time()
3452 try:
3453 self.serv.accept()
3454 except socket.error:
3455 pass
3456 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003457 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003458
3459 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003460 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003461
Antoine Pitroub1c54962010-10-14 15:05:38 +00003462 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003463 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003464 def testInitNonBlocking(self):
3465 # reinit server socket
3466 self.serv.close()
3467 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003468 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003469 self.port = support.bind_port(self.serv)
3470 self.serv.listen(1)
3471 # actual testing
3472 start = time.time()
3473 try:
3474 self.serv.accept()
3475 except socket.error:
3476 pass
3477 end = time.time()
3478 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3479
3480 def _testInitNonBlocking(self):
3481 pass
3482
Antoine Pitrou600232b2011-01-05 21:03:42 +00003483 def testInheritFlags(self):
3484 # Issue #7995: when calling accept() on a listening socket with a
3485 # timeout, the resulting socket should not be non-blocking.
3486 self.serv.settimeout(10)
3487 try:
3488 conn, addr = self.serv.accept()
3489 message = conn.recv(len(MSG))
3490 finally:
3491 conn.close()
3492 self.serv.settimeout(None)
3493
3494 def _testInheritFlags(self):
3495 time.sleep(0.1)
3496 self.cli.connect((HOST, self.port))
3497 time.sleep(0.5)
3498 self.cli.send(MSG)
3499
Guido van Rossum24e4af82002-06-12 19:18:08 +00003500 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003501 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003502 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003503 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003504 conn, addr = self.serv.accept()
3505 except socket.error:
3506 pass
3507 else:
3508 self.fail("Error trying to do non-blocking accept.")
3509 read, write, err = select.select([self.serv], [], [])
3510 if self.serv in read:
3511 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003512 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003513 else:
3514 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003515
Guido van Rossum24e4af82002-06-12 19:18:08 +00003516 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003517 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003518 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003519
3520 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003521 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003522 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003523 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003524
3525 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003526 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003527 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003528
3529 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003530 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003531 conn, addr = self.serv.accept()
3532 conn.setblocking(0)
3533 try:
3534 msg = conn.recv(len(MSG))
3535 except socket.error:
3536 pass
3537 else:
3538 self.fail("Error trying to do non-blocking recv.")
3539 read, write, err = select.select([conn], [], [])
3540 if conn in read:
3541 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003542 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003543 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003544 else:
3545 self.fail("Error during select call to non-blocking socket.")
3546
3547 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003548 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003549 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003550 self.cli.send(MSG)
3551
Victor Stinner45df8202010-04-28 22:31:17 +00003552@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003553class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003554 """Unit tests for the object returned by socket.makefile()
3555
Antoine Pitrou834bd812010-10-13 16:17:14 +00003556 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003557 the client connection. You can read from this file to
3558 get output from the server.
3559
Antoine Pitrou834bd812010-10-13 16:17:14 +00003560 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003561 server connection. You can write to this file to send output
3562 to the client.
3563 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003564
Guido van Rossume9f66142002-08-07 15:46:19 +00003565 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003566 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003567 errors = 'strict'
3568 newline = None
3569
3570 read_mode = 'rb'
3571 read_msg = MSG
3572 write_mode = 'wb'
3573 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003574
Guido van Rossum24e4af82002-06-12 19:18:08 +00003575 def __init__(self, methodName='runTest'):
3576 SocketConnectedTest.__init__(self, methodName=methodName)
3577
3578 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003579 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3580 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003581 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003582 self.read_file = self.cli_conn.makefile(
3583 self.read_mode, self.bufsize,
3584 encoding = self.encoding,
3585 errors = self.errors,
3586 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003587
3588 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003589 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003590 self.read_file.close()
3591 self.assertTrue(self.read_file.closed)
3592 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003593 SocketConnectedTest.tearDown(self)
3594
3595 def clientSetUp(self):
3596 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003597 self.write_file = self.serv_conn.makefile(
3598 self.write_mode, self.bufsize,
3599 encoding = self.encoding,
3600 errors = self.errors,
3601 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003602
3603 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003604 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003605 self.write_file.close()
3606 self.assertTrue(self.write_file.closed)
3607 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003608 SocketConnectedTest.clientTearDown(self)
3609
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003610 def testReadAfterTimeout(self):
3611 # Issue #7322: A file object must disallow further reads
3612 # after a timeout has occurred.
3613 self.cli_conn.settimeout(1)
3614 self.read_file.read(3)
3615 # First read raises a timeout
3616 self.assertRaises(socket.timeout, self.read_file.read, 1)
3617 # Second read is disallowed
3618 with self.assertRaises(IOError) as ctx:
3619 self.read_file.read(1)
3620 self.assertIn("cannot read from timed out object", str(ctx.exception))
3621
3622 def _testReadAfterTimeout(self):
3623 self.write_file.write(self.write_msg[0:3])
3624 self.write_file.flush()
3625 self.serv_finished.wait()
3626
Guido van Rossum24e4af82002-06-12 19:18:08 +00003627 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003628 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003629 first_seg = self.read_file.read(len(self.read_msg)-3)
3630 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003631 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003632 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003633
3634 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003635 self.write_file.write(self.write_msg)
3636 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003637
Guido van Rossum8c943832002-08-08 01:00:28 +00003638 def testFullRead(self):
3639 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003640 msg = self.read_file.read()
3641 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003642
3643 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003644 self.write_file.write(self.write_msg)
3645 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003646
Guido van Rossum24e4af82002-06-12 19:18:08 +00003647 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003648 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003649 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003650 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003651 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003652 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003653 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003654 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003655 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003656
3657 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003658 self.write_file.write(self.write_msg)
3659 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003660
3661 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003662 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003663 line = self.read_file.readline()
3664 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003665
3666 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003667 self.write_file.write(self.write_msg)
3668 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003669
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003670 def testCloseAfterMakefile(self):
3671 # The file returned by makefile should keep the socket open.
3672 self.cli_conn.close()
3673 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003674 msg = self.read_file.read()
3675 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003676
3677 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003678 self.write_file.write(self.write_msg)
3679 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003680
3681 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003682 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003683 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003684 if isinstance(self.read_msg, str):
3685 msg = msg.decode()
3686 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003687
3688 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003689 self.write_file.write(self.write_msg)
3690 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003691
Tim Peters116d83c2004-03-28 02:20:45 +00003692 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003693 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003694
3695 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003696 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003697
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003698 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003699 self.assertEqual(self.read_file.mode, self.read_mode)
3700 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003701
3702 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003703 self.assertEqual(self.write_file.mode, self.write_mode)
3704 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003705
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003706 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003707 self.read_file.close()
3708 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003709 self.cli_conn.close()
3710 self.assertRaises(socket.error, self.cli_conn.getsockname)
3711
3712 def _testRealClose(self):
3713 pass
3714
3715
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003716class FileObjectInterruptedTestCase(unittest.TestCase):
3717 """Test that the file object correctly handles EINTR internally."""
3718
3719 class MockSocket(object):
3720 def __init__(self, recv_funcs=()):
3721 # A generator that returns callables that we'll call for each
3722 # call to recv().
3723 self._recv_step = iter(recv_funcs)
3724
3725 def recv_into(self, buffer):
3726 data = next(self._recv_step)()
3727 assert len(buffer) >= len(data)
3728 buffer[:len(data)] = data
3729 return len(data)
3730
3731 def _decref_socketios(self):
3732 pass
3733
3734 def _textiowrap_for_test(self, buffering=-1):
3735 raw = socket.SocketIO(self, "r")
3736 if buffering < 0:
3737 buffering = io.DEFAULT_BUFFER_SIZE
3738 if buffering == 0:
3739 return raw
3740 buffer = io.BufferedReader(raw, buffering)
3741 text = io.TextIOWrapper(buffer, None, None)
3742 text.mode = "rb"
3743 return text
3744
3745 @staticmethod
3746 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003747 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003748
3749 def _textiowrap_mock_socket(self, mock, buffering=-1):
3750 raw = socket.SocketIO(mock, "r")
3751 if buffering < 0:
3752 buffering = io.DEFAULT_BUFFER_SIZE
3753 if buffering == 0:
3754 return raw
3755 buffer = io.BufferedReader(raw, buffering)
3756 text = io.TextIOWrapper(buffer, None, None)
3757 text.mode = "rb"
3758 return text
3759
3760 def _test_readline(self, size=-1, buffering=-1):
3761 mock_sock = self.MockSocket(recv_funcs=[
3762 lambda : b"This is the first line\nAnd the sec",
3763 self._raise_eintr,
3764 lambda : b"ond line is here\n",
3765 lambda : b"",
3766 lambda : b"", # XXX(gps): io library does an extra EOF read
3767 ])
3768 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003769 self.assertEqual(fo.readline(size), "This is the first line\n")
3770 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003771
3772 def _test_read(self, size=-1, buffering=-1):
3773 mock_sock = self.MockSocket(recv_funcs=[
3774 lambda : b"This is the first line\nAnd the sec",
3775 self._raise_eintr,
3776 lambda : b"ond line is here\n",
3777 lambda : b"",
3778 lambda : b"", # XXX(gps): io library does an extra EOF read
3779 ])
3780 expecting = (b"This is the first line\n"
3781 b"And the second line is here\n")
3782 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3783 if buffering == 0:
3784 data = b''
3785 else:
3786 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003787 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003788 while len(data) != len(expecting):
3789 part = fo.read(size)
3790 if not part:
3791 break
3792 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003793 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003794
3795 def test_default(self):
3796 self._test_readline()
3797 self._test_readline(size=100)
3798 self._test_read()
3799 self._test_read(size=100)
3800
3801 def test_with_1k_buffer(self):
3802 self._test_readline(buffering=1024)
3803 self._test_readline(size=100, buffering=1024)
3804 self._test_read(buffering=1024)
3805 self._test_read(size=100, buffering=1024)
3806
3807 def _test_readline_no_buffer(self, size=-1):
3808 mock_sock = self.MockSocket(recv_funcs=[
3809 lambda : b"a",
3810 lambda : b"\n",
3811 lambda : b"B",
3812 self._raise_eintr,
3813 lambda : b"b",
3814 lambda : b"",
3815 ])
3816 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003817 self.assertEqual(fo.readline(size), b"a\n")
3818 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003819
3820 def test_no_buffer(self):
3821 self._test_readline_no_buffer()
3822 self._test_readline_no_buffer(size=4)
3823 self._test_read(buffering=0)
3824 self._test_read(size=100, buffering=0)
3825
3826
Guido van Rossume9f66142002-08-07 15:46:19 +00003827class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3828
3829 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003830
Guido van Rossume9f66142002-08-07 15:46:19 +00003831 In this case (and in this case only), it should be possible to
3832 create a file object, read a line from it, create another file
3833 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003834 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003835 when reading multiple requests from the same socket."""
3836
3837 bufsize = 0 # Use unbuffered mode
3838
3839 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003840 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003841 line = self.read_file.readline() # first line
3842 self.assertEqual(line, b"A. " + self.write_msg) # first line
3843 self.read_file = self.cli_conn.makefile('rb', 0)
3844 line = self.read_file.readline() # second line
3845 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003846
3847 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003848 self.write_file.write(b"A. " + self.write_msg)
3849 self.write_file.write(b"B. " + self.write_msg)
3850 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003851
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003852 def testMakefileClose(self):
3853 # The file returned by makefile should keep the socket open...
3854 self.cli_conn.close()
3855 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003856 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003857 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003858 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003859 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3860
3861 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003862 self.write_file.write(self.write_msg)
3863 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003864
3865 def testMakefileCloseSocketDestroy(self):
3866 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003867 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003868 refcount_after = sys.getrefcount(self.cli_conn)
3869 self.assertEqual(refcount_before - 1, refcount_after)
3870
3871 def _testMakefileCloseSocketDestroy(self):
3872 pass
3873
Antoine Pitrou98b46702010-09-18 22:59:00 +00003874 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003875 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003876 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3877
3878 def testSmallReadNonBlocking(self):
3879 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003880 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3881 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003882 self.evt1.set()
3883 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003884 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003885 if first_seg is None:
3886 # Data not arrived (can happen under Windows), wait a bit
3887 time.sleep(0.5)
3888 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003889 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003890 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003891 self.assertEqual(n, 3)
3892 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003893 self.assertEqual(msg, self.read_msg)
3894 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3895 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003896
3897 def _testSmallReadNonBlocking(self):
3898 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003899 self.write_file.write(self.write_msg)
3900 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003901 self.evt2.set()
3902 # Avoid cloding the socket before the server test has finished,
3903 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3904 self.serv_finished.wait(5.0)
3905
3906 def testWriteNonBlocking(self):
3907 self.cli_finished.wait(5.0)
3908 # The client thread can't skip directly - the SkipTest exception
3909 # would appear as a failure.
3910 if self.serv_skipped:
3911 self.skipTest(self.serv_skipped)
3912
3913 def _testWriteNonBlocking(self):
3914 self.serv_skipped = None
3915 self.serv_conn.setblocking(False)
3916 # Try to saturate the socket buffer pipe with repeated large writes.
3917 BIG = b"x" * (1024 ** 2)
3918 LIMIT = 10
3919 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00003920 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003921 self.assertGreater(n, 0)
3922 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003923 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003924 if n is None:
3925 # Succeeded
3926 break
3927 self.assertGreater(n, 0)
3928 else:
3929 # Let us know that this test didn't manage to establish
3930 # the expected conditions. This is not a failure in itself but,
3931 # if it happens repeatedly, the test should be fixed.
3932 self.serv_skipped = "failed to saturate the socket buffer"
3933
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003934
Guido van Rossum8c943832002-08-08 01:00:28 +00003935class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3936
3937 bufsize = 1 # Default-buffered for reading; line-buffered for writing
3938
3939
3940class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3941
3942 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00003943
Thomas Woutersb2137042007-02-01 18:02:27 +00003944
Antoine Pitrou834bd812010-10-13 16:17:14 +00003945class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
3946 """Tests for socket.makefile() in text mode (rather than binary)"""
3947
3948 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003949 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003950 write_mode = 'wb'
3951 write_msg = MSG
3952 newline = ''
3953
3954
3955class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
3956 """Tests for socket.makefile() in text mode (rather than binary)"""
3957
3958 read_mode = 'rb'
3959 read_msg = MSG
3960 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003961 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003962 newline = ''
3963
3964
3965class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
3966 """Tests for socket.makefile() in text mode (rather than binary)"""
3967
3968 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003969 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003970 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003971 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003972 newline = ''
3973
3974
Guido van Rossumd8faa362007-04-27 19:54:29 +00003975class NetworkConnectionTest(object):
3976 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003977
Guido van Rossumd8faa362007-04-27 19:54:29 +00003978 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003979 # We're inherited below by BasicTCPTest2, which also inherits
3980 # BasicTCPTest, which defines self.port referenced below.
3981 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003982 self.serv_conn = self.cli
3983
3984class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
3985 """Tests that NetworkConnection does not break existing TCP functionality.
3986 """
3987
3988class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003989
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003990 class MockSocket(socket.socket):
3991 def connect(self, *args):
3992 raise socket.timeout('timed out')
3993
3994 @contextlib.contextmanager
3995 def mocked_socket_module(self):
3996 """Return a socket which times out on connect"""
3997 old_socket = socket.socket
3998 socket.socket = self.MockSocket
3999 try:
4000 yield
4001 finally:
4002 socket.socket = old_socket
4003
4004 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004005 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004006 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004007 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004008 with self.assertRaises(socket.error) as cm:
4009 cli.connect((HOST, port))
4010 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4011
4012 def test_create_connection(self):
4013 # Issue #9792: errors raised by create_connection() should have
4014 # a proper errno attribute.
4015 port = support.find_unused_port()
4016 with self.assertRaises(socket.error) as cm:
4017 socket.create_connection((HOST, port))
4018 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4019
4020 def test_create_connection_timeout(self):
4021 # Issue #9792: create_connection() should not recast timeout errors
4022 # as generic socket errors.
4023 with self.mocked_socket_module():
4024 with self.assertRaises(socket.timeout):
4025 socket.create_connection((HOST, 1234))
4026
Guido van Rossumd8faa362007-04-27 19:54:29 +00004027
Victor Stinner45df8202010-04-28 22:31:17 +00004028@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004029class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4030
4031 def __init__(self, methodName='runTest'):
4032 SocketTCPTest.__init__(self, methodName=methodName)
4033 ThreadableTest.__init__(self)
4034
4035 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004036 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004037
4038 def clientTearDown(self):
4039 self.cli.close()
4040 self.cli = None
4041 ThreadableTest.clientTearDown(self)
4042
4043 def _justAccept(self):
4044 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004045 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004046
4047 testFamily = _justAccept
4048 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004049 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004050 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004051 self.assertEqual(self.cli.family, 2)
4052
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004053 testSourceAddress = _justAccept
4054 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004055 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4056 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004057 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004058 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004059 # The port number being used is sufficient to show that the bind()
4060 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004061
Guido van Rossumd8faa362007-04-27 19:54:29 +00004062 testTimeoutDefault = _justAccept
4063 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004064 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004065 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004066 socket.setdefaulttimeout(42)
4067 try:
4068 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004069 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004070 finally:
4071 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004072 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004073
4074 testTimeoutNone = _justAccept
4075 def _testTimeoutNone(self):
4076 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004077 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004078 socket.setdefaulttimeout(30)
4079 try:
4080 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004081 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004082 finally:
4083 socket.setdefaulttimeout(None)
4084 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004085
4086 testTimeoutValueNamed = _justAccept
4087 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004088 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004089 self.assertEqual(self.cli.gettimeout(), 30)
4090
4091 testTimeoutValueNonamed = _justAccept
4092 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004093 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004094 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004095 self.assertEqual(self.cli.gettimeout(), 30)
4096
Victor Stinner45df8202010-04-28 22:31:17 +00004097@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004098class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4099
4100 def __init__(self, methodName='runTest'):
4101 SocketTCPTest.__init__(self, methodName=methodName)
4102 ThreadableTest.__init__(self)
4103
4104 def clientSetUp(self):
4105 pass
4106
4107 def clientTearDown(self):
4108 self.cli.close()
4109 self.cli = None
4110 ThreadableTest.clientTearDown(self)
4111
4112 def testInsideTimeout(self):
4113 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004114 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004115 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004116 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004117 testOutsideTimeout = testInsideTimeout
4118
4119 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004120 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004121 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004122 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004123
4124 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004125 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004126 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004127
4128
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004129class TCPTimeoutTest(SocketTCPTest):
4130
4131 def testTCPTimeout(self):
4132 def raise_timeout(*args, **kwargs):
4133 self.serv.settimeout(1.0)
4134 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004135 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004136 "Error generating a timeout exception (TCP)")
4137
4138 def testTimeoutZero(self):
4139 ok = False
4140 try:
4141 self.serv.settimeout(0.0)
4142 foo = self.serv.accept()
4143 except socket.timeout:
4144 self.fail("caught timeout instead of error (TCP)")
4145 except socket.error:
4146 ok = True
4147 except:
4148 self.fail("caught unexpected exception (TCP)")
4149 if not ok:
4150 self.fail("accept() returned success when we did not expect it")
4151
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004152 def testInterruptedTimeout(self):
4153 # XXX I don't know how to do this test on MSWindows or any other
4154 # plaform that doesn't support signal.alarm() or os.kill(), though
4155 # the bug should have existed on all platforms.
4156 if not hasattr(signal, "alarm"):
4157 return # can only test on *nix
4158 self.serv.settimeout(5.0) # must be longer than alarm
4159 class Alarm(Exception):
4160 pass
4161 def alarm_handler(signal, frame):
4162 raise Alarm
4163 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4164 try:
4165 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4166 try:
4167 foo = self.serv.accept()
4168 except socket.timeout:
4169 self.fail("caught timeout instead of Alarm")
4170 except Alarm:
4171 pass
4172 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004173 self.fail("caught other exception instead of Alarm:"
4174 " %s(%s):\n%s" %
4175 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004176 else:
4177 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004178 finally:
4179 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004180 except Alarm:
4181 self.fail("got Alarm in wrong place")
4182 finally:
4183 # no alarm can be pending. Safe to restore old handler.
4184 signal.signal(signal.SIGALRM, old_alarm)
4185
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004186class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004187
4188 def testUDPTimeout(self):
4189 def raise_timeout(*args, **kwargs):
4190 self.serv.settimeout(1.0)
4191 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004192 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004193 "Error generating a timeout exception (UDP)")
4194
4195 def testTimeoutZero(self):
4196 ok = False
4197 try:
4198 self.serv.settimeout(0.0)
4199 foo = self.serv.recv(1024)
4200 except socket.timeout:
4201 self.fail("caught timeout instead of error (UDP)")
4202 except socket.error:
4203 ok = True
4204 except:
4205 self.fail("caught unexpected exception (UDP)")
4206 if not ok:
4207 self.fail("recv() returned success when we did not expect it")
4208
4209class TestExceptions(unittest.TestCase):
4210
4211 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004212 self.assertTrue(issubclass(socket.error, Exception))
4213 self.assertTrue(issubclass(socket.herror, socket.error))
4214 self.assertTrue(issubclass(socket.gaierror, socket.error))
4215 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004216
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004217class TestLinuxAbstractNamespace(unittest.TestCase):
4218
4219 UNIX_PATH_MAX = 108
4220
4221 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004222 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004223 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4224 s1.bind(address)
4225 s1.listen(1)
4226 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4227 s2.connect(s1.getsockname())
4228 with s1.accept()[0] as s3:
4229 self.assertEqual(s1.getsockname(), address)
4230 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004231
4232 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004233 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004234 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4235 s.bind(address)
4236 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004237
4238 def testNameOverflow(self):
4239 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004240 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4241 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004242
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004243 def testStrName(self):
4244 # Check that an abstract name can be passed as a string.
4245 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4246 try:
4247 s.bind("\x00python\x00test\x00")
4248 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4249 finally:
4250 s.close()
4251
4252class TestUnixDomain(unittest.TestCase):
4253
4254 def setUp(self):
4255 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4256
4257 def tearDown(self):
4258 self.sock.close()
4259
4260 def encoded(self, path):
4261 # Return the given path encoded in the file system encoding,
4262 # or skip the test if this is not possible.
4263 try:
4264 return os.fsencode(path)
4265 except UnicodeEncodeError:
4266 self.skipTest(
4267 "Pathname {0!a} cannot be represented in file "
4268 "system encoding {1!r}".format(
4269 path, sys.getfilesystemencoding()))
4270
Antoine Pitrou16374872011-12-16 15:04:12 +01004271 def bind(self, sock, path):
4272 # Bind the socket
4273 try:
4274 sock.bind(path)
4275 except OSError as e:
4276 if str(e) == "AF_UNIX path too long":
4277 self.skipTest(
4278 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4279 .format(path))
4280 else:
4281 raise
4282
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004283 def testStrAddr(self):
4284 # Test binding to and retrieving a normal string pathname.
4285 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004286 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004287 self.addCleanup(support.unlink, path)
4288 self.assertEqual(self.sock.getsockname(), path)
4289
4290 def testBytesAddr(self):
4291 # Test binding to a bytes pathname.
4292 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004293 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004294 self.addCleanup(support.unlink, path)
4295 self.assertEqual(self.sock.getsockname(), path)
4296
4297 def testSurrogateescapeBind(self):
4298 # Test binding to a valid non-ASCII pathname, with the
4299 # non-ASCII bytes supplied using surrogateescape encoding.
4300 path = os.path.abspath(support.TESTFN_UNICODE)
4301 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004302 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004303 self.addCleanup(support.unlink, path)
4304 self.assertEqual(self.sock.getsockname(), path)
4305
4306 def testUnencodableAddr(self):
4307 # Test binding to a pathname that cannot be encoded in the
4308 # file system encoding.
4309 if support.TESTFN_UNENCODABLE is None:
4310 self.skipTest("No unencodable filename available")
4311 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004312 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004313 self.addCleanup(support.unlink, path)
4314 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004315
Victor Stinner45df8202010-04-28 22:31:17 +00004316@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004317class BufferIOTest(SocketConnectedTest):
4318 """
4319 Test the buffer versions of socket.recv() and socket.send().
4320 """
4321 def __init__(self, methodName='runTest'):
4322 SocketConnectedTest.__init__(self, methodName=methodName)
4323
Antoine Pitrou25480782010-03-17 22:50:28 +00004324 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004325 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004326 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004327 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004328 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004329 self.assertEqual(msg, MSG)
4330
Antoine Pitrou25480782010-03-17 22:50:28 +00004331 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004332 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004333 self.serv_conn.send(buf)
4334
Antoine Pitrou25480782010-03-17 22:50:28 +00004335 def testRecvIntoBytearray(self):
4336 buf = bytearray(1024)
4337 nbytes = self.cli_conn.recv_into(buf)
4338 self.assertEqual(nbytes, len(MSG))
4339 msg = buf[:len(MSG)]
4340 self.assertEqual(msg, MSG)
4341
4342 _testRecvIntoBytearray = _testRecvIntoArray
4343
4344 def testRecvIntoMemoryview(self):
4345 buf = bytearray(1024)
4346 nbytes = self.cli_conn.recv_into(memoryview(buf))
4347 self.assertEqual(nbytes, len(MSG))
4348 msg = buf[:len(MSG)]
4349 self.assertEqual(msg, MSG)
4350
4351 _testRecvIntoMemoryview = _testRecvIntoArray
4352
4353 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004354 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004355 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004356 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004357 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004358 self.assertEqual(msg, MSG)
4359
Antoine Pitrou25480782010-03-17 22:50:28 +00004360 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004361 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004362 self.serv_conn.send(buf)
4363
Antoine Pitrou25480782010-03-17 22:50:28 +00004364 def testRecvFromIntoBytearray(self):
4365 buf = bytearray(1024)
4366 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4367 self.assertEqual(nbytes, len(MSG))
4368 msg = buf[:len(MSG)]
4369 self.assertEqual(msg, MSG)
4370
4371 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4372
4373 def testRecvFromIntoMemoryview(self):
4374 buf = bytearray(1024)
4375 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4376 self.assertEqual(nbytes, len(MSG))
4377 msg = buf[:len(MSG)]
4378 self.assertEqual(msg, MSG)
4379
4380 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4381
Christian Heimes043d6f62008-01-07 17:19:16 +00004382
4383TIPC_STYPE = 2000
4384TIPC_LOWER = 200
4385TIPC_UPPER = 210
4386
4387def isTipcAvailable():
4388 """Check if the TIPC module is loaded
4389
4390 The TIPC module is not loaded automatically on Ubuntu and probably
4391 other Linux distros.
4392 """
4393 if not hasattr(socket, "AF_TIPC"):
4394 return False
4395 if not os.path.isfile("/proc/modules"):
4396 return False
4397 with open("/proc/modules") as f:
4398 for line in f:
4399 if line.startswith("tipc "):
4400 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004401 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004402 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4403 return False
4404
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004405class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004406 def testRDM(self):
4407 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4408 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004409 self.addCleanup(srv.close)
4410 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004411
4412 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4413 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4414 TIPC_LOWER, TIPC_UPPER)
4415 srv.bind(srvaddr)
4416
4417 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4418 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4419 cli.sendto(MSG, sendaddr)
4420
4421 msg, recvaddr = srv.recvfrom(1024)
4422
4423 self.assertEqual(cli.getsockname(), recvaddr)
4424 self.assertEqual(msg, MSG)
4425
4426
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004427class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004428 def __init__(self, methodName = 'runTest'):
4429 unittest.TestCase.__init__(self, methodName = methodName)
4430 ThreadableTest.__init__(self)
4431
4432 def setUp(self):
4433 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004434 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004435 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4436 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4437 TIPC_LOWER, TIPC_UPPER)
4438 self.srv.bind(srvaddr)
4439 self.srv.listen(5)
4440 self.serverExplicitReady()
4441 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004442 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004443
4444 def clientSetUp(self):
4445 # The is a hittable race between serverExplicitReady() and the
4446 # accept() call; sleep a little while to avoid it, otherwise
4447 # we could get an exception
4448 time.sleep(0.1)
4449 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004450 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004451 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4452 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4453 self.cli.connect(addr)
4454 self.cliaddr = self.cli.getsockname()
4455
4456 def testStream(self):
4457 msg = self.conn.recv(1024)
4458 self.assertEqual(msg, MSG)
4459 self.assertEqual(self.cliaddr, self.connaddr)
4460
4461 def _testStream(self):
4462 self.cli.send(MSG)
4463 self.cli.close()
4464
4465
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004466@unittest.skipUnless(thread, 'Threading required for this test.')
4467class ContextManagersTest(ThreadedTCPSocketTest):
4468
4469 def _testSocketClass(self):
4470 # base test
4471 with socket.socket() as sock:
4472 self.assertFalse(sock._closed)
4473 self.assertTrue(sock._closed)
4474 # close inside with block
4475 with socket.socket() as sock:
4476 sock.close()
4477 self.assertTrue(sock._closed)
4478 # exception inside with block
4479 with socket.socket() as sock:
4480 self.assertRaises(socket.error, sock.sendall, b'foo')
4481 self.assertTrue(sock._closed)
4482
4483 def testCreateConnectionBase(self):
4484 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004485 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004486 data = conn.recv(1024)
4487 conn.sendall(data)
4488
4489 def _testCreateConnectionBase(self):
4490 address = self.serv.getsockname()
4491 with socket.create_connection(address) as sock:
4492 self.assertFalse(sock._closed)
4493 sock.sendall(b'foo')
4494 self.assertEqual(sock.recv(1024), b'foo')
4495 self.assertTrue(sock._closed)
4496
4497 def testCreateConnectionClose(self):
4498 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004499 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004500 data = conn.recv(1024)
4501 conn.sendall(data)
4502
4503 def _testCreateConnectionClose(self):
4504 address = self.serv.getsockname()
4505 with socket.create_connection(address) as sock:
4506 sock.close()
4507 self.assertTrue(sock._closed)
4508 self.assertRaises(socket.error, sock.sendall, b'foo')
4509
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004510
Antoine Pitroub1c54962010-10-14 15:05:38 +00004511@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4512 "SOCK_CLOEXEC not defined")
4513@unittest.skipUnless(fcntl, "module fcntl not available")
4514class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004515 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004516 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004517 with socket.socket(socket.AF_INET,
4518 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4519 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4520 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004521
4522
4523@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4524 "SOCK_NONBLOCK not defined")
4525class NonblockConstantTest(unittest.TestCase):
4526 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4527 if nonblock:
4528 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4529 self.assertEqual(s.gettimeout(), timeout)
4530 else:
4531 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4532 self.assertEqual(s.gettimeout(), None)
4533
Charles-François Natali239bb962011-06-03 12:55:15 +02004534 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004535 def test_SOCK_NONBLOCK(self):
4536 # a lot of it seems silly and redundant, but I wanted to test that
4537 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004538 with socket.socket(socket.AF_INET,
4539 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4540 self.checkNonblock(s)
4541 s.setblocking(1)
4542 self.checkNonblock(s, False)
4543 s.setblocking(0)
4544 self.checkNonblock(s)
4545 s.settimeout(None)
4546 self.checkNonblock(s, False)
4547 s.settimeout(2.0)
4548 self.checkNonblock(s, timeout=2.0)
4549 s.setblocking(1)
4550 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004551 # defaulttimeout
4552 t = socket.getdefaulttimeout()
4553 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004554 with socket.socket() as s:
4555 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004556 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004557 with socket.socket() as s:
4558 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004559 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004560 with socket.socket() as s:
4561 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004562 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004563 with socket.socket() as s:
4564 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004565 socket.setdefaulttimeout(t)
4566
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004567
Guido van Rossumb995eb72002-07-31 16:08:40 +00004568def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004569 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004570 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004571
4572 tests.extend([
4573 NonBlockingTCPTests,
4574 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004575 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004576 UnbufferedFileObjectClassTestCase,
4577 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004578 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004579 UnicodeReadFileObjectClassTestCase,
4580 UnicodeWriteFileObjectClassTestCase,
4581 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004582 NetworkConnectionNoServer,
4583 NetworkConnectionAttributesTest,
4584 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004585 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004586 CloexecConstantTest,
4587 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004588 ])
Dave Cole331708b2004-08-09 04:51:41 +00004589 if hasattr(socket, "socketpair"):
4590 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004591 if hasattr(socket, "AF_UNIX"):
4592 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004593 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004594 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004595 if isTipcAvailable():
4596 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004597 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004598 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004599 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004600 tests.extend([
4601 CmsgMacroTests,
4602 SendmsgUDPTest,
4603 RecvmsgUDPTest,
4604 RecvmsgIntoUDPTest,
4605 SendmsgUDP6Test,
4606 RecvmsgUDP6Test,
4607 RecvmsgRFC3542AncillaryUDP6Test,
4608 RecvmsgIntoRFC3542AncillaryUDP6Test,
4609 RecvmsgIntoUDP6Test,
4610 SendmsgTCPTest,
4611 RecvmsgTCPTest,
4612 RecvmsgIntoTCPTest,
4613 SendmsgSCTPStreamTest,
4614 RecvmsgSCTPStreamTest,
4615 RecvmsgIntoSCTPStreamTest,
4616 SendmsgUnixStreamTest,
4617 RecvmsgUnixStreamTest,
4618 RecvmsgIntoUnixStreamTest,
4619 RecvmsgSCMRightsStreamTest,
4620 RecvmsgIntoSCMRightsStreamTest,
4621 # These are slow when setitimer() is not available
4622 InterruptedRecvTimeoutTest,
4623 InterruptedSendTimeoutTest,
4624 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004625
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004626 thread_info = support.threading_setup()
4627 support.run_unittest(*tests)
4628 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004629
4630if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004631 test_main()