• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import unittest
2from test import support
3from test.support import (
4    is_apple, os_helper, refleak_helper, socket_helper, threading_helper
5)
6import _thread as thread
7import array
8import contextlib
9import errno
10import gc
11import io
12import itertools
13import math
14import os
15import pickle
16import platform
17import queue
18import random
19import re
20import select
21import signal
22import socket
23import string
24import struct
25import sys
26import tempfile
27import threading
28import time
29import traceback
30from weakref import proxy
31try:
32    import multiprocessing
33except ImportError:
34    multiprocessing = False
35try:
36    import fcntl
37except ImportError:
38    fcntl = None
39try:
40    import _testcapi
41except ImportError:
42    _testcapi = None
43
44support.requires_working_socket(module=True)
45
46HOST = socket_helper.HOST
47# test unicode string and carriage return
48MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8')
49
50VMADDR_CID_LOCAL = 1
51VSOCKPORT = 1234
52AIX = platform.system() == "AIX"
53WSL = "microsoft-standard-WSL" in platform.release()
54
55try:
56    import _socket
57except ImportError:
58    _socket = None
59
60def skipForRefleakHuntinIf(condition, issueref):
61    if not condition:
62        def decorator(f):
63            f.client_skip = lambda f: f
64            return f
65
66    else:
67        def decorator(f):
68            @contextlib.wraps(f)
69            def wrapper(*args, **kwds):
70                if refleak_helper.hunting_for_refleaks():
71                    raise unittest.SkipTest(f"ignore while hunting for refleaks, see {issueref}")
72
73                return f(*args, **kwds)
74
75            def client_skip(f):
76                @contextlib.wraps(f)
77                def wrapper(*args, **kwds):
78                    if refleak_helper.hunting_for_refleaks():
79                        return
80
81                    return f(*args, **kwds)
82
83                return wrapper
84            wrapper.client_skip = client_skip
85            return wrapper
86
87    return decorator
88
89def get_cid():
90    if fcntl is None:
91        return None
92    if not hasattr(socket, 'IOCTL_VM_SOCKETS_GET_LOCAL_CID'):
93        return None
94    try:
95        with open("/dev/vsock", "rb") as f:
96            r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, "    ")
97    except OSError:
98        return None
99    else:
100        return struct.unpack("I", r)[0]
101
102def _have_socket_can():
103    """Check whether CAN sockets are supported on this host."""
104    try:
105        s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
106    except (AttributeError, OSError):
107        return False
108    else:
109        s.close()
110    return True
111
112def _have_socket_can_isotp():
113    """Check whether CAN ISOTP sockets are supported on this host."""
114    try:
115        s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
116    except (AttributeError, OSError):
117        return False
118    else:
119        s.close()
120    return True
121
122def _have_socket_can_j1939():
123    """Check whether CAN J1939 sockets are supported on this host."""
124    try:
125        s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939)
126    except (AttributeError, OSError):
127        return False
128    else:
129        s.close()
130    return True
131
132def _have_socket_rds():
133    """Check whether RDS sockets are supported on this host."""
134    try:
135        s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
136    except (AttributeError, OSError):
137        return False
138    else:
139        s.close()
140    return True
141
142def _have_socket_alg():
143    """Check whether AF_ALG sockets are supported on this host."""
144    try:
145        s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
146    except (AttributeError, OSError):
147        return False
148    else:
149        s.close()
150    return True
151
152def _have_socket_qipcrtr():
153    """Check whether AF_QIPCRTR sockets are supported on this host."""
154    try:
155        s = socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM, 0)
156    except (AttributeError, OSError):
157        return False
158    else:
159        s.close()
160    return True
161
162def _have_socket_vsock():
163    """Check whether AF_VSOCK sockets are supported on this host."""
164    cid = get_cid()
165    return (cid is not None)
166
167
168def _have_socket_bluetooth():
169    """Check whether AF_BLUETOOTH sockets are supported on this host."""
170    try:
171        # RFCOMM is supported by all platforms with bluetooth support. Windows
172        # does not support omitting the protocol.
173        s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
174    except (AttributeError, OSError):
175        return False
176    else:
177        s.close()
178    return True
179
180
181def _have_socket_hyperv():
182    """Check whether AF_HYPERV sockets are supported on this host."""
183    try:
184        s = socket.socket(socket.AF_HYPERV, socket.SOCK_STREAM, socket.HV_PROTOCOL_RAW)
185    except (AttributeError, OSError):
186        return False
187    else:
188        s.close()
189    return True
190
191
192@contextlib.contextmanager
193def socket_setdefaulttimeout(timeout):
194    old_timeout = socket.getdefaulttimeout()
195    try:
196        socket.setdefaulttimeout(timeout)
197        yield
198    finally:
199        socket.setdefaulttimeout(old_timeout)
200
201
202HAVE_SOCKET_CAN = _have_socket_can()
203
204HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
205
206HAVE_SOCKET_CAN_J1939 = _have_socket_can_j1939()
207
208HAVE_SOCKET_RDS = _have_socket_rds()
209
210HAVE_SOCKET_ALG = _have_socket_alg()
211
212HAVE_SOCKET_QIPCRTR = _have_socket_qipcrtr()
213
214HAVE_SOCKET_VSOCK = _have_socket_vsock()
215
216# Older Android versions block UDPLITE with SELinux.
217HAVE_SOCKET_UDPLITE = (
218    hasattr(socket, "IPPROTO_UDPLITE")
219    and not (support.is_android and platform.android_ver().api_level < 29))
220
221HAVE_SOCKET_BLUETOOTH = _have_socket_bluetooth()
222
223HAVE_SOCKET_HYPERV = _have_socket_hyperv()
224
225# Size in bytes of the int type
226SIZEOF_INT = array.array("i").itemsize
227
228class SocketTCPTest(unittest.TestCase):
229
230    def setUp(self):
231        self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
232        self.port = socket_helper.bind_port(self.serv)
233        self.serv.listen()
234
235    def tearDown(self):
236        self.serv.close()
237        self.serv = None
238
239class SocketUDPTest(unittest.TestCase):
240
241    def setUp(self):
242        self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
243        self.port = socket_helper.bind_port(self.serv)
244
245    def tearDown(self):
246        self.serv.close()
247        self.serv = None
248
249class SocketUDPLITETest(SocketUDPTest):
250
251    def setUp(self):
252        self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
253        self.port = socket_helper.bind_port(self.serv)
254
255
256class SocketCANTest(unittest.TestCase):
257
258    """To be able to run this test, a `vcan0` CAN interface can be created with
259    the following commands:
260    # modprobe vcan
261    # ip link add dev vcan0 type vcan
262    # ip link set up vcan0
263    """
264    interface = 'vcan0'
265    bufsize = 128
266
267    """The CAN frame structure is defined in <linux/can.h>:
268
269    struct can_frame {
270        canid_t can_id;  /* 32 bit CAN_ID + EFF/RTR/ERR flags */
271        __u8    can_dlc; /* data length code: 0 .. 8 */
272        __u8    data[8] __attribute__((aligned(8)));
273    };
274    """
275    can_frame_fmt = "=IB3x8s"
276    can_frame_size = struct.calcsize(can_frame_fmt)
277
278    """The Broadcast Management Command frame structure is defined
279    in <linux/can/bcm.h>:
280
281    struct bcm_msg_head {
282        __u32 opcode;
283        __u32 flags;
284        __u32 count;
285        struct timeval ival1, ival2;
286        canid_t can_id;
287        __u32 nframes;
288        struct can_frame frames[0];
289    }
290
291    `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
292    `struct can_frame` definition). Must use native not standard types for packing.
293    """
294    bcm_cmd_msg_fmt = "@3I4l2I"
295    bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
296
297    def setUp(self):
298        self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
299        self.addCleanup(self.s.close)
300        try:
301            self.s.bind((self.interface,))
302        except OSError:
303            self.skipTest('network interface `%s` does not exist' %
304                           self.interface)
305
306
307class SocketRDSTest(unittest.TestCase):
308
309    """To be able to run this test, the `rds` kernel module must be loaded:
310    # modprobe rds
311    """
312    bufsize = 8192
313
314    def setUp(self):
315        self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
316        self.addCleanup(self.serv.close)
317        try:
318            self.port = socket_helper.bind_port(self.serv)
319        except OSError:
320            self.skipTest('unable to bind RDS socket')
321
322
323class ThreadableTest:
324    """Threadable Test class
325
326    The ThreadableTest class makes it easy to create a threaded
327    client/server pair from an existing unit test. To create a
328    new threaded class from an existing unit test, use multiple
329    inheritance:
330
331        class NewClass (OldClass, ThreadableTest):
332            pass
333
334    This class defines two new fixture functions with obvious
335    purposes for overriding:
336
337        clientSetUp ()
338        clientTearDown ()
339
340    Any new test functions within the class must then define
341    tests in pairs, where the test name is preceded with a
342    '_' to indicate the client portion of the test. Ex:
343
344        def testFoo(self):
345            # Server portion
346
347        def _testFoo(self):
348            # Client portion
349
350    Any exceptions raised by the clients during their tests
351    are caught and transferred to the main thread to alert
352    the testing framework.
353
354    Note, the server setup function cannot call any blocking
355    functions that rely on the client thread during setup,
356    unless serverExplicitReady() is called just before
357    the blocking call (such as in setting up a client/server
358    connection and performing the accept() in setUp().
359    """
360
361    def __init__(self):
362        # Swap the true setup function
363        self.__setUp = self.setUp
364        self.setUp = self._setUp
365
366    def serverExplicitReady(self):
367        """This method allows the server to explicitly indicate that
368        it wants the client thread to proceed. This is useful if the
369        server is about to execute a blocking routine that is
370        dependent upon the client thread during its setup routine."""
371        self.server_ready.set()
372
373    def _setUp(self):
374        self.enterContext(threading_helper.wait_threads_exit())
375
376        self.server_ready = threading.Event()
377        self.client_ready = threading.Event()
378        self.done = threading.Event()
379        self.queue = queue.Queue(1)
380        self.server_crashed = False
381
382        def raise_queued_exception():
383            if self.queue.qsize():
384                raise self.queue.get()
385        self.addCleanup(raise_queued_exception)
386
387        # Do some munging to start the client test.
388        methodname = self.id()
389        i = methodname.rfind('.')
390        methodname = methodname[i+1:]
391        test_method = getattr(self, '_' + methodname)
392        self.client_thread = thread.start_new_thread(
393            self.clientRun, (test_method,))
394
395        try:
396            self.__setUp()
397        except:
398            self.server_crashed = True
399            raise
400        finally:
401            self.server_ready.set()
402        self.client_ready.wait()
403        self.addCleanup(self.done.wait)
404
405    def clientRun(self, test_func):
406        self.server_ready.wait()
407        try:
408            self.clientSetUp()
409        except BaseException as e:
410            self.queue.put(e)
411            self.clientTearDown()
412            return
413        finally:
414            self.client_ready.set()
415        if self.server_crashed:
416            self.clientTearDown()
417            return
418        if not hasattr(test_func, '__call__'):
419            raise TypeError("test_func must be a callable function")
420        try:
421            test_func()
422        except BaseException as e:
423            self.queue.put(e)
424        finally:
425            self.clientTearDown()
426
427    def clientSetUp(self):
428        raise NotImplementedError("clientSetUp must be implemented.")
429
430    def clientTearDown(self):
431        self.done.set()
432        thread.exit()
433
434class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
435
436    def __init__(self, methodName='runTest'):
437        SocketTCPTest.__init__(self, methodName=methodName)
438        ThreadableTest.__init__(self)
439
440    def clientSetUp(self):
441        self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
442
443    def clientTearDown(self):
444        self.cli.close()
445        self.cli = None
446        ThreadableTest.clientTearDown(self)
447
448class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
449
450    def __init__(self, methodName='runTest'):
451        SocketUDPTest.__init__(self, methodName=methodName)
452        ThreadableTest.__init__(self)
453
454    def clientSetUp(self):
455        self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
456
457    def clientTearDown(self):
458        self.cli.close()
459        self.cli = None
460        ThreadableTest.clientTearDown(self)
461
462@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
463          'UDPLITE sockets required for this test.')
464class ThreadedUDPLITESocketTest(SocketUDPLITETest, ThreadableTest):
465
466    def __init__(self, methodName='runTest'):
467        SocketUDPLITETest.__init__(self, methodName=methodName)
468        ThreadableTest.__init__(self)
469
470    def clientSetUp(self):
471        self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
472
473    def clientTearDown(self):
474        self.cli.close()
475        self.cli = None
476        ThreadableTest.clientTearDown(self)
477
478class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
479
480    def __init__(self, methodName='runTest'):
481        SocketCANTest.__init__(self, methodName=methodName)
482        ThreadableTest.__init__(self)
483
484    def clientSetUp(self):
485        self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
486        try:
487            self.cli.bind((self.interface,))
488        except OSError:
489            # skipTest should not be called here, and will be called in the
490            # server instead
491            pass
492
493    def clientTearDown(self):
494        self.cli.close()
495        self.cli = None
496        ThreadableTest.clientTearDown(self)
497
498class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
499
500    def __init__(self, methodName='runTest'):
501        SocketRDSTest.__init__(self, methodName=methodName)
502        ThreadableTest.__init__(self)
503
504    def clientSetUp(self):
505        self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
506        try:
507            # RDS sockets must be bound explicitly to send or receive data
508            self.cli.bind((HOST, 0))
509            self.cli_addr = self.cli.getsockname()
510        except OSError:
511            # skipTest should not be called here, and will be called in the
512            # server instead
513            pass
514
515    def clientTearDown(self):
516        self.cli.close()
517        self.cli = None
518        ThreadableTest.clientTearDown(self)
519
520@unittest.skipIf(fcntl is None, "need fcntl")
521@unittest.skipIf(WSL, 'VSOCK does not work on Microsoft WSL')
522@unittest.skipUnless(HAVE_SOCKET_VSOCK,
523          'VSOCK sockets required for this test.')
524class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
525
526    def __init__(self, methodName='runTest'):
527        unittest.TestCase.__init__(self, methodName=methodName)
528        ThreadableTest.__init__(self)
529
530    def setUp(self):
531        self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
532        self.addCleanup(self.serv.close)
533        self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
534        self.serv.listen()
535        self.serverExplicitReady()
536        self.serv.settimeout(support.LOOPBACK_TIMEOUT)
537        self.conn, self.connaddr = self.serv.accept()
538        self.addCleanup(self.conn.close)
539
540    def clientSetUp(self):
541        time.sleep(0.1)
542        self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
543        self.addCleanup(self.cli.close)
544        cid = get_cid()
545        if cid in (socket.VMADDR_CID_HOST, socket.VMADDR_CID_ANY):
546            # gh-119461: Use the local communication address (loopback)
547            cid = VMADDR_CID_LOCAL
548        self.cli.connect((cid, VSOCKPORT))
549
550    def testStream(self):
551        msg = self.conn.recv(1024)
552        self.assertEqual(msg, MSG)
553
554    def _testStream(self):
555        self.cli.send(MSG)
556        self.cli.close()
557
558class SocketConnectedTest(ThreadedTCPSocketTest):
559    """Socket tests for client-server connection.
560
561    self.cli_conn is a client socket connected to the server.  The
562    setUp() method guarantees that it is connected to the server.
563    """
564
565    def __init__(self, methodName='runTest'):
566        ThreadedTCPSocketTest.__init__(self, methodName=methodName)
567
568    def setUp(self):
569        ThreadedTCPSocketTest.setUp(self)
570        # Indicate explicitly we're ready for the client thread to
571        # proceed and then perform the blocking call to accept
572        self.serverExplicitReady()
573        conn, addr = self.serv.accept()
574        self.cli_conn = conn
575
576    def tearDown(self):
577        self.cli_conn.close()
578        self.cli_conn = None
579        ThreadedTCPSocketTest.tearDown(self)
580
581    def clientSetUp(self):
582        ThreadedTCPSocketTest.clientSetUp(self)
583        self.cli.connect((HOST, self.port))
584        self.serv_conn = self.cli
585
586    def clientTearDown(self):
587        self.serv_conn.close()
588        self.serv_conn = None
589        ThreadedTCPSocketTest.clientTearDown(self)
590
591class SocketPairTest(unittest.TestCase, ThreadableTest):
592
593    def __init__(self, methodName='runTest'):
594        unittest.TestCase.__init__(self, methodName=methodName)
595        ThreadableTest.__init__(self)
596        self.cli = None
597        self.serv = None
598
599    def socketpair(self):
600        # To be overridden by some child classes.
601        return socket.socketpair()
602
603    def setUp(self):
604        self.serv, self.cli = self.socketpair()
605
606    def tearDown(self):
607        if self.serv:
608            self.serv.close()
609        self.serv = None
610
611    def clientSetUp(self):
612        pass
613
614    def clientTearDown(self):
615        if self.cli:
616            self.cli.close()
617        self.cli = None
618        ThreadableTest.clientTearDown(self)
619
620
621# The following classes are used by the sendmsg()/recvmsg() tests.
622# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
623# gives a drop-in replacement for SocketConnectedTest, but different
624# address families can be used, and the attributes serv_addr and
625# cli_addr will be set to the addresses of the endpoints.
626
627class SocketTestBase(unittest.TestCase):
628    """A base class for socket tests.
629
630    Subclasses must provide methods newSocket() to return a new socket
631    and bindSock(sock) to bind it to an unused address.
632
633    Creates a socket self.serv and sets self.serv_addr to its address.
634    """
635
636    def setUp(self):
637        self.serv = self.newSocket()
638        self.addCleanup(self.close_server)
639        self.bindServer()
640
641    def close_server(self):
642        self.serv.close()
643        self.serv = None
644
645    def bindServer(self):
646        """Bind server socket and set self.serv_addr to its address."""
647        self.bindSock(self.serv)
648        self.serv_addr = self.serv.getsockname()
649
650
651class SocketListeningTestMixin(SocketTestBase):
652    """Mixin to listen on the server socket."""
653
654    def setUp(self):
655        super().setUp()
656        self.serv.listen()
657
658
659class ThreadedSocketTestMixin(SocketTestBase, ThreadableTest):
660    """Mixin to add client socket and allow client/server tests.
661
662    Client socket is self.cli and its address is self.cli_addr.  See
663    ThreadableTest for usage information.
664    """
665
666    def __init__(self, *args, **kwargs):
667        super().__init__(*args, **kwargs)
668        ThreadableTest.__init__(self)
669
670    def clientSetUp(self):
671        self.cli = self.newClientSocket()
672        self.bindClient()
673
674    def newClientSocket(self):
675        """Return a new socket for use as client."""
676        return self.newSocket()
677
678    def bindClient(self):
679        """Bind client socket and set self.cli_addr to its address."""
680        self.bindSock(self.cli)
681        self.cli_addr = self.cli.getsockname()
682
683    def clientTearDown(self):
684        self.cli.close()
685        self.cli = None
686        ThreadableTest.clientTearDown(self)
687
688
689class ConnectedStreamTestMixin(SocketListeningTestMixin,
690                               ThreadedSocketTestMixin):
691    """Mixin to allow client/server stream tests with connected client.
692
693    Server's socket representing connection to client is self.cli_conn
694    and client's connection to server is self.serv_conn.  (Based on
695    SocketConnectedTest.)
696    """
697
698    def setUp(self):
699        super().setUp()
700        # Indicate explicitly we're ready for the client thread to
701        # proceed and then perform the blocking call to accept
702        self.serverExplicitReady()
703        conn, addr = self.serv.accept()
704        self.cli_conn = conn
705
706    def tearDown(self):
707        self.cli_conn.close()
708        self.cli_conn = None
709        super().tearDown()
710
711    def clientSetUp(self):
712        super().clientSetUp()
713        self.cli.connect(self.serv_addr)
714        self.serv_conn = self.cli
715
716    def clientTearDown(self):
717        try:
718            self.serv_conn.close()
719            self.serv_conn = None
720        except AttributeError:
721            pass
722        super().clientTearDown()
723
724
725class UnixSocketTestBase(SocketTestBase):
726    """Base class for Unix-domain socket tests."""
727
728    # This class is used for file descriptor passing tests, so we
729    # create the sockets in a private directory so that other users
730    # can't send anything that might be problematic for a privileged
731    # user running the tests.
732
733    def bindSock(self, sock):
734        path = socket_helper.create_unix_domain_name()
735        self.addCleanup(os_helper.unlink, path)
736        socket_helper.bind_unix_socket(sock, path)
737
738class UnixStreamBase(UnixSocketTestBase):
739    """Base class for Unix-domain SOCK_STREAM tests."""
740
741    def newSocket(self):
742        return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
743
744
745class InetTestBase(SocketTestBase):
746    """Base class for IPv4 socket tests."""
747
748    host = HOST
749
750    def setUp(self):
751        super().setUp()
752        self.port = self.serv_addr[1]
753
754    def bindSock(self, sock):
755        socket_helper.bind_port(sock, host=self.host)
756
757class TCPTestBase(InetTestBase):
758    """Base class for TCP-over-IPv4 tests."""
759
760    def newSocket(self):
761        return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
762
763class UDPTestBase(InetTestBase):
764    """Base class for UDP-over-IPv4 tests."""
765
766    def newSocket(self):
767        return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
768
769class UDPLITETestBase(InetTestBase):
770    """Base class for UDPLITE-over-IPv4 tests."""
771
772    def newSocket(self):
773        return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
774
775class SCTPStreamBase(InetTestBase):
776    """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
777
778    def newSocket(self):
779        return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
780                             socket.IPPROTO_SCTP)
781
782
783class Inet6TestBase(InetTestBase):
784    """Base class for IPv6 socket tests."""
785
786    host = socket_helper.HOSTv6
787
788class UDP6TestBase(Inet6TestBase):
789    """Base class for UDP-over-IPv6 tests."""
790
791    def newSocket(self):
792        return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
793
794class UDPLITE6TestBase(Inet6TestBase):
795    """Base class for UDPLITE-over-IPv6 tests."""
796
797    def newSocket(self):
798        return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
799
800
801# Test-skipping decorators for use with ThreadableTest.
802
803def skipWithClientIf(condition, reason):
804    """Skip decorated test if condition is true, add client_skip decorator.
805
806    If the decorated object is not a class, sets its attribute
807    "client_skip" to a decorator which will return an empty function
808    if the test is to be skipped, or the original function if it is
809    not.  This can be used to avoid running the client part of a
810    skipped test when using ThreadableTest.
811    """
812    def client_pass(*args, **kwargs):
813        pass
814    def skipdec(obj):
815        retval = unittest.skip(reason)(obj)
816        if not isinstance(obj, type):
817            retval.client_skip = lambda f: client_pass
818        return retval
819    def noskipdec(obj):
820        if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
821            obj.client_skip = lambda f: f
822        return obj
823    return skipdec if condition else noskipdec
824
825
826def requireAttrs(obj, *attributes):
827    """Skip decorated test if obj is missing any of the given attributes.
828
829    Sets client_skip attribute as skipWithClientIf() does.
830    """
831    missing = [name for name in attributes if not hasattr(obj, name)]
832    return skipWithClientIf(
833        missing, "don't have " + ", ".join(name for name in missing))
834
835
836def requireSocket(*args):
837    """Skip decorated test if a socket cannot be created with given arguments.
838
839    When an argument is given as a string, will use the value of that
840    attribute of the socket module, or skip the test if it doesn't
841    exist.  Sets client_skip attribute as skipWithClientIf() does.
842    """
843    err = None
844    missing = [obj for obj in args if
845               isinstance(obj, str) and not hasattr(socket, obj)]
846    if missing:
847        err = "don't have " + ", ".join(name for name in missing)
848    else:
849        callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
850                    for obj in args]
851        try:
852            s = socket.socket(*callargs)
853        except OSError as e:
854            # XXX: check errno?
855            err = str(e)
856        else:
857            s.close()
858    return skipWithClientIf(
859        err is not None,
860        "can't create socket({0}): {1}".format(
861            ", ".join(str(o) for o in args), err))
862
863
864#######################################################################
865## Begin Tests
866
867class GeneralModuleTests(unittest.TestCase):
868
869    @unittest.skipUnless(_socket is not None, 'need _socket module')
870    def test_socket_type(self):
871        self.assertTrue(gc.is_tracked(_socket.socket))
872        with self.assertRaisesRegex(TypeError, "immutable"):
873            _socket.socket.foo = 1
874
875    def test_SocketType_is_socketobject(self):
876        import _socket
877        self.assertTrue(socket.SocketType is _socket.socket)
878        s = socket.socket()
879        self.assertIsInstance(s, socket.SocketType)
880        s.close()
881
882    def test_repr(self):
883        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
884        with s:
885            self.assertIn('fd=%i' % s.fileno(), repr(s))
886            self.assertIn('family=%s' % socket.AF_INET, repr(s))
887            self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
888            self.assertIn('proto=0', repr(s))
889            self.assertNotIn('raddr', repr(s))
890            s.bind(('127.0.0.1', 0))
891            self.assertIn('laddr', repr(s))
892            self.assertIn(str(s.getsockname()), repr(s))
893        self.assertIn('[closed]', repr(s))
894        self.assertNotIn('laddr', repr(s))
895
896    @unittest.skipUnless(_socket is not None, 'need _socket module')
897    def test_csocket_repr(self):
898        s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
899        try:
900            expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
901                        % (s.fileno(), s.family, s.type, s.proto))
902            self.assertEqual(repr(s), expected)
903        finally:
904            s.close()
905        expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
906                    % (s.family, s.type, s.proto))
907        self.assertEqual(repr(s), expected)
908
909    def test_weakref(self):
910        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
911            p = proxy(s)
912            self.assertEqual(p.fileno(), s.fileno())
913        s = None
914        support.gc_collect()  # For PyPy or other GCs.
915        try:
916            p.fileno()
917        except ReferenceError:
918            pass
919        else:
920            self.fail('Socket proxy still exists')
921
922    def testSocketError(self):
923        # Testing socket module exceptions
924        msg = "Error raising socket exception (%s)."
925        with self.assertRaises(OSError, msg=msg % 'OSError'):
926            raise OSError
927        with self.assertRaises(OSError, msg=msg % 'socket.herror'):
928            raise socket.herror
929        with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
930            raise socket.gaierror
931
932    def testSendtoErrors(self):
933        # Testing that sendto doesn't mask failures. See #10169.
934        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
935        self.addCleanup(s.close)
936        s.bind(('', 0))
937        sockname = s.getsockname()
938        # 2 args
939        with self.assertRaises(TypeError) as cm:
940            s.sendto('\u2620', sockname)
941        self.assertEqual(str(cm.exception),
942                         "a bytes-like object is required, not 'str'")
943        with self.assertRaises(TypeError) as cm:
944            s.sendto(5j, sockname)
945        self.assertEqual(str(cm.exception),
946                         "a bytes-like object is required, not 'complex'")
947        with self.assertRaises(TypeError) as cm:
948            s.sendto(b'foo', None)
949        self.assertIn('not NoneType',str(cm.exception))
950        # 3 args
951        with self.assertRaises(TypeError) as cm:
952            s.sendto('\u2620', 0, sockname)
953        self.assertEqual(str(cm.exception),
954                         "a bytes-like object is required, not 'str'")
955        with self.assertRaises(TypeError) as cm:
956            s.sendto(5j, 0, sockname)
957        self.assertEqual(str(cm.exception),
958                         "a bytes-like object is required, not 'complex'")
959        with self.assertRaises(TypeError) as cm:
960            s.sendto(b'foo', 0, None)
961        self.assertIn('not NoneType', str(cm.exception))
962        with self.assertRaises(TypeError) as cm:
963            s.sendto(b'foo', 'bar', sockname)
964        with self.assertRaises(TypeError) as cm:
965            s.sendto(b'foo', None, None)
966        # wrong number of args
967        with self.assertRaises(TypeError) as cm:
968            s.sendto(b'foo')
969        self.assertIn('(1 given)', str(cm.exception))
970        with self.assertRaises(TypeError) as cm:
971            s.sendto(b'foo', 0, sockname, 4)
972        self.assertIn('(4 given)', str(cm.exception))
973
974    def testCrucialConstants(self):
975        # Testing for mission critical constants
976        socket.AF_INET
977        if socket.has_ipv6:
978            socket.AF_INET6
979        socket.SOCK_STREAM
980        socket.SOCK_DGRAM
981        socket.SOCK_RAW
982        socket.SOCK_RDM
983        socket.SOCK_SEQPACKET
984        socket.SOL_SOCKET
985        socket.SO_REUSEADDR
986
987    def testCrucialIpProtoConstants(self):
988        socket.IPPROTO_TCP
989        socket.IPPROTO_UDP
990        if socket.has_ipv6:
991            socket.IPPROTO_IPV6
992
993    @unittest.skipUnless(os.name == "nt", "Windows specific")
994    def testWindowsSpecificConstants(self):
995        socket.IPPROTO_ICLFXBM
996        socket.IPPROTO_ST
997        socket.IPPROTO_CBT
998        socket.IPPROTO_IGP
999        socket.IPPROTO_RDP
1000        socket.IPPROTO_PGM
1001        socket.IPPROTO_L2TP
1002        socket.IPPROTO_SCTP
1003
1004    @unittest.skipIf(support.is_wasi, "WASI is missing these methods")
1005    def test_socket_methods(self):
1006        # socket methods that depend on a configure HAVE_ check. They should
1007        # be present on all platforms except WASI.
1008        names = [
1009            "_accept", "bind", "connect", "connect_ex", "getpeername",
1010            "getsockname", "listen", "recvfrom", "recvfrom_into", "sendto",
1011            "setsockopt", "shutdown"
1012        ]
1013        for name in names:
1014            if not hasattr(socket.socket, name):
1015                self.fail(f"socket method {name} is missing")
1016
1017    @unittest.skipUnless(sys.platform == 'darwin', 'macOS specific test')
1018    @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
1019    def test3542SocketOptions(self):
1020        # Ref. issue #35569 and https://tools.ietf.org/html/rfc3542
1021        opts = {
1022            'IPV6_CHECKSUM',
1023            'IPV6_DONTFRAG',
1024            'IPV6_DSTOPTS',
1025            'IPV6_HOPLIMIT',
1026            'IPV6_HOPOPTS',
1027            'IPV6_NEXTHOP',
1028            'IPV6_PATHMTU',
1029            'IPV6_PKTINFO',
1030            'IPV6_RECVDSTOPTS',
1031            'IPV6_RECVHOPLIMIT',
1032            'IPV6_RECVHOPOPTS',
1033            'IPV6_RECVPATHMTU',
1034            'IPV6_RECVPKTINFO',
1035            'IPV6_RECVRTHDR',
1036            'IPV6_RECVTCLASS',
1037            'IPV6_RTHDR',
1038            'IPV6_RTHDRDSTOPTS',
1039            'IPV6_RTHDR_TYPE_0',
1040            'IPV6_TCLASS',
1041            'IPV6_USE_MIN_MTU',
1042        }
1043        for opt in opts:
1044            self.assertTrue(
1045                hasattr(socket, opt), f"Missing RFC3542 socket option '{opt}'"
1046            )
1047
1048    def testHostnameRes(self):
1049        # Testing hostname resolution mechanisms
1050        hostname = socket.gethostname()
1051        try:
1052            ip = socket.gethostbyname(hostname)
1053        except OSError:
1054            # Probably name lookup wasn't set up right; skip this test
1055            self.skipTest('name lookup failure')
1056        self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
1057        try:
1058            hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
1059        except OSError:
1060            # Probably a similar problem as above; skip this test
1061            self.skipTest('name lookup failure')
1062        all_host_names = [hostname, hname] + aliases
1063        fqhn = socket.getfqdn(ip)
1064        if not fqhn in all_host_names:
1065            self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
1066
1067    def test_host_resolution(self):
1068        for addr in [socket_helper.HOSTv4, '10.0.0.1', '255.255.255.255']:
1069            self.assertEqual(socket.gethostbyname(addr), addr)
1070
1071        # we don't test socket_helper.HOSTv6 because there's a chance it doesn't have
1072        # a matching name entry (e.g. 'ip6-localhost')
1073        for host in [socket_helper.HOSTv4]:
1074            self.assertIn(host, socket.gethostbyaddr(host)[2])
1075
1076    def test_host_resolution_bad_address(self):
1077        # These are all malformed IP addresses and expected not to resolve to
1078        # any result.  But some ISPs, e.g. AWS and AT&T, may successfully
1079        # resolve these IPs. In particular, AT&T's DNS Error Assist service
1080        # will break this test.  See https://bugs.python.org/issue42092 for a
1081        # workaround.
1082        explanation = (
1083            "resolving an invalid IP address did not raise OSError; "
1084            "can be caused by a broken DNS server"
1085        )
1086        for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
1087                     '1:1:1:1:1:1:1:1:1']:
1088            with self.assertRaises(OSError, msg=addr):
1089                socket.gethostbyname(addr)
1090            with self.assertRaises(OSError, msg=explanation):
1091                socket.gethostbyaddr(addr)
1092
1093    @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
1094    @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
1095    def test_sethostname(self):
1096        oldhn = socket.gethostname()
1097        try:
1098            socket.sethostname('new')
1099        except OSError as e:
1100            if e.errno == errno.EPERM:
1101                self.skipTest("test should be run as root")
1102            else:
1103                raise
1104        try:
1105            # running test as root!
1106            self.assertEqual(socket.gethostname(), 'new')
1107            # Should work with bytes objects too
1108            socket.sethostname(b'bar')
1109            self.assertEqual(socket.gethostname(), 'bar')
1110        finally:
1111            socket.sethostname(oldhn)
1112
1113    @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
1114                         'socket.if_nameindex() not available.')
1115    def testInterfaceNameIndex(self):
1116        interfaces = socket.if_nameindex()
1117        for index, name in interfaces:
1118            self.assertIsInstance(index, int)
1119            self.assertIsInstance(name, str)
1120            # interface indices are non-zero integers
1121            self.assertGreater(index, 0)
1122            _index = socket.if_nametoindex(name)
1123            self.assertIsInstance(_index, int)
1124            self.assertEqual(index, _index)
1125            _name = socket.if_indextoname(index)
1126            self.assertIsInstance(_name, str)
1127            self.assertEqual(name, _name)
1128
1129    @unittest.skipUnless(hasattr(socket, 'if_indextoname'),
1130                         'socket.if_indextoname() not available.')
1131    def testInvalidInterfaceIndexToName(self):
1132        self.assertRaises(OSError, socket.if_indextoname, 0)
1133        self.assertRaises(OverflowError, socket.if_indextoname, -1)
1134        self.assertRaises(OverflowError, socket.if_indextoname, 2**1000)
1135        self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
1136        if hasattr(socket, 'if_nameindex'):
1137            indices = dict(socket.if_nameindex())
1138            for index in indices:
1139                index2 = index + 2**32
1140                if index2 not in indices:
1141                    with self.assertRaises((OverflowError, OSError)):
1142                        socket.if_indextoname(index2)
1143            for index in 2**32-1, 2**64-1:
1144                if index not in indices:
1145                    with self.assertRaises((OverflowError, OSError)):
1146                        socket.if_indextoname(index)
1147
1148    @unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
1149                         'socket.if_nametoindex() not available.')
1150    def testInvalidInterfaceNameToIndex(self):
1151        self.assertRaises(TypeError, socket.if_nametoindex, 0)
1152        self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
1153
1154    @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1155                         'test needs sys.getrefcount()')
1156    def testRefCountGetNameInfo(self):
1157        # Testing reference count for getnameinfo
1158        try:
1159            # On some versions, this loses a reference
1160            orig = sys.getrefcount(__name__)
1161            socket.getnameinfo(__name__,0)
1162        except TypeError:
1163            if sys.getrefcount(__name__) != orig:
1164                self.fail("socket.getnameinfo loses a reference")
1165
1166    def testInterpreterCrash(self):
1167        # Making sure getnameinfo doesn't crash the interpreter
1168        try:
1169            # On some versions, this crashes the interpreter.
1170            socket.getnameinfo(('x', 0, 0, 0), 0)
1171        except OSError:
1172            pass
1173
1174    def testNtoH(self):
1175        # This just checks that htons etc. are their own inverse,
1176        # when looking at the lower 16 or 32 bits.
1177        sizes = {socket.htonl: 32, socket.ntohl: 32,
1178                 socket.htons: 16, socket.ntohs: 16}
1179        for func, size in sizes.items():
1180            mask = (1<<size) - 1
1181            for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
1182                self.assertEqual(i & mask, func(func(i&mask)) & mask)
1183
1184            swapped = func(mask)
1185            self.assertEqual(swapped & mask, mask)
1186            self.assertRaises(OverflowError, func, 1<<34)
1187
1188    @support.cpython_only
1189    @unittest.skipIf(_testcapi is None, "requires _testcapi")
1190    def testNtoHErrors(self):
1191        import _testcapi
1192        s_good_values = [0, 1, 2, 0xffff]
1193        l_good_values = s_good_values + [0xffffffff]
1194        l_bad_values = [-1, -2, 1<<32, 1<<1000]
1195        s_bad_values = (
1196            l_bad_values +
1197            [_testcapi.INT_MIN-1, _testcapi.INT_MAX+1] +
1198            [1 << 16, _testcapi.INT_MAX]
1199        )
1200        for k in s_good_values:
1201            socket.ntohs(k)
1202            socket.htons(k)
1203        for k in l_good_values:
1204            socket.ntohl(k)
1205            socket.htonl(k)
1206        for k in s_bad_values:
1207            self.assertRaises(OverflowError, socket.ntohs, k)
1208            self.assertRaises(OverflowError, socket.htons, k)
1209        for k in l_bad_values:
1210            self.assertRaises(OverflowError, socket.ntohl, k)
1211            self.assertRaises(OverflowError, socket.htonl, k)
1212
1213    def testGetServBy(self):
1214        eq = self.assertEqual
1215        # Find one service that exists, then check all the related interfaces.
1216        # I've ordered this by protocols that have both a tcp and udp
1217        # protocol, at least for modern Linuxes.
1218        if (
1219            sys.platform.startswith(
1220                ('linux', 'android', 'freebsd', 'netbsd', 'gnukfreebsd'))
1221            or is_apple
1222        ):
1223            # avoid the 'echo' service on this platform, as there is an
1224            # assumption breaking non-standard port/protocol entry
1225            services = ('daytime', 'qotd', 'domain')
1226        else:
1227            services = ('echo', 'daytime', 'domain')
1228        for service in services:
1229            try:
1230                port = socket.getservbyname(service, 'tcp')
1231                break
1232            except OSError:
1233                pass
1234        else:
1235            raise OSError
1236        # Try same call with optional protocol omitted
1237        # Issue gh-71123: this fails on Android before API level 23.
1238        if not (support.is_android and platform.android_ver().api_level < 23):
1239            port2 = socket.getservbyname(service)
1240            eq(port, port2)
1241        # Try udp, but don't barf if it doesn't exist
1242        try:
1243            udpport = socket.getservbyname(service, 'udp')
1244        except OSError:
1245            udpport = None
1246        else:
1247            eq(udpport, port)
1248        # Now make sure the lookup by port returns the same service name
1249        # Issue #26936: when the protocol is omitted, this fails on Android
1250        # before API level 28.
1251        if not (support.is_android and platform.android_ver().api_level < 28):
1252            eq(socket.getservbyport(port2), service)
1253        eq(socket.getservbyport(port, 'tcp'), service)
1254        if udpport is not None:
1255            eq(socket.getservbyport(udpport, 'udp'), service)
1256        # Make sure getservbyport does not accept out of range ports.
1257        self.assertRaises(OverflowError, socket.getservbyport, -1)
1258        self.assertRaises(OverflowError, socket.getservbyport, 65536)
1259
1260    def testDefaultTimeout(self):
1261        # Testing default timeout
1262        # The default timeout should initially be None
1263        self.assertEqual(socket.getdefaulttimeout(), None)
1264        with socket.socket() as s:
1265            self.assertEqual(s.gettimeout(), None)
1266
1267        # Set the default timeout to 10, and see if it propagates
1268        with socket_setdefaulttimeout(10):
1269            self.assertEqual(socket.getdefaulttimeout(), 10)
1270            with socket.socket() as sock:
1271                self.assertEqual(sock.gettimeout(), 10)
1272
1273            # Reset the default timeout to None, and see if it propagates
1274            socket.setdefaulttimeout(None)
1275            self.assertEqual(socket.getdefaulttimeout(), None)
1276            with socket.socket() as sock:
1277                self.assertEqual(sock.gettimeout(), None)
1278
1279        # Check that setting it to an invalid value raises ValueError
1280        self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1281
1282        # Check that setting it to an invalid type raises TypeError
1283        self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1284
1285    @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1286                         'test needs socket.inet_aton()')
1287    def testIPv4_inet_aton_fourbytes(self):
1288        # Test that issue1008086 and issue767150 are fixed.
1289        # It must return 4 bytes.
1290        self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1291        self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
1292
1293    @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1294                         'test needs socket.inet_pton()')
1295    def testIPv4toString(self):
1296        from socket import inet_aton as f, inet_pton, AF_INET
1297        g = lambda a: inet_pton(AF_INET, a)
1298
1299        assertInvalid = lambda func,a: self.assertRaises(
1300            (OSError, ValueError), func, a
1301        )
1302
1303        self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1304        self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1305        self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1306        self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1307        self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
1308        # bpo-29972: inet_pton() doesn't fail on AIX
1309        if not AIX:
1310            assertInvalid(f, '0.0.0.')
1311        assertInvalid(f, '300.0.0.0')
1312        assertInvalid(f, 'a.0.0.0')
1313        assertInvalid(f, '1.2.3.4.5')
1314        assertInvalid(f, '::1')
1315
1316        self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1317        self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1318        self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1319        self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
1320        assertInvalid(g, '0.0.0.')
1321        assertInvalid(g, '300.0.0.0')
1322        assertInvalid(g, 'a.0.0.0')
1323        assertInvalid(g, '1.2.3.4.5')
1324        assertInvalid(g, '::1')
1325
1326    @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1327                         'test needs socket.inet_pton()')
1328    def testIPv6toString(self):
1329        try:
1330            from socket import inet_pton, AF_INET6, has_ipv6
1331            if not has_ipv6:
1332                self.skipTest('IPv6 not available')
1333        except ImportError:
1334            self.skipTest('could not import needed symbols from socket')
1335
1336        if sys.platform == "win32":
1337            try:
1338                inet_pton(AF_INET6, '::')
1339            except OSError as e:
1340                if e.winerror == 10022:
1341                    self.skipTest('IPv6 might not be supported')
1342
1343        f = lambda a: inet_pton(AF_INET6, a)
1344        assertInvalid = lambda a: self.assertRaises(
1345            (OSError, ValueError), f, a
1346        )
1347
1348        self.assertEqual(b'\x00' * 16, f('::'))
1349        self.assertEqual(b'\x00' * 16, f('0::0'))
1350        self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1351        self.assertEqual(
1352            b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
1353            f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1354        )
1355        self.assertEqual(
1356            b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1357            f('ad42:abc::127:0:254:2')
1358        )
1359        self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1360        assertInvalid('0x20::')
1361        assertInvalid(':::')
1362        assertInvalid('::0::')
1363        assertInvalid('1::abc::')
1364        assertInvalid('1::abc::def')
1365        assertInvalid('1:2:3:4:5:6')
1366        assertInvalid('1:2:3:4:5:6:')
1367        assertInvalid('1:2:3:4:5:6:7:8:0')
1368        # bpo-29972: inet_pton() doesn't fail on AIX
1369        if not AIX:
1370            assertInvalid('1:2:3:4:5:6:7:8:')
1371
1372        self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1373            f('::254.42.23.64')
1374        )
1375        self.assertEqual(
1376            b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1377            f('42::a29b:254.42.23.64')
1378        )
1379        self.assertEqual(
1380            b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1381            f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1382        )
1383        assertInvalid('255.254.253.252')
1384        assertInvalid('1::260.2.3.0')
1385        assertInvalid('1::0.be.e.0')
1386        assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1387        assertInvalid('::1.2.3.4:0')
1388        assertInvalid('0.100.200.0:3:4:5:6:7:8')
1389
1390    @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1391                         'test needs socket.inet_ntop()')
1392    def testStringToIPv4(self):
1393        from socket import inet_ntoa as f, inet_ntop, AF_INET
1394        g = lambda a: inet_ntop(AF_INET, a)
1395        assertInvalid = lambda func,a: self.assertRaises(
1396            (OSError, ValueError), func, a
1397        )
1398
1399        self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1400        self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1401        self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1402        self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
1403        assertInvalid(f, b'\x00' * 3)
1404        assertInvalid(f, b'\x00' * 5)
1405        assertInvalid(f, b'\x00' * 16)
1406        self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
1407
1408        self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1409        self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1410        self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
1411        assertInvalid(g, b'\x00' * 3)
1412        assertInvalid(g, b'\x00' * 5)
1413        assertInvalid(g, b'\x00' * 16)
1414        self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
1415
1416    @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1417                         'test needs socket.inet_ntop()')
1418    def testStringToIPv6(self):
1419        try:
1420            from socket import inet_ntop, AF_INET6, has_ipv6
1421            if not has_ipv6:
1422                self.skipTest('IPv6 not available')
1423        except ImportError:
1424            self.skipTest('could not import needed symbols from socket')
1425
1426        if sys.platform == "win32":
1427            try:
1428                inet_ntop(AF_INET6, b'\x00' * 16)
1429            except OSError as e:
1430                if e.winerror == 10022:
1431                    self.skipTest('IPv6 might not be supported')
1432
1433        f = lambda a: inet_ntop(AF_INET6, a)
1434        assertInvalid = lambda a: self.assertRaises(
1435            (OSError, ValueError), f, a
1436        )
1437
1438        self.assertEqual('::', f(b'\x00' * 16))
1439        self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1440        self.assertEqual(
1441            'aef:b01:506:1001:ffff:9997:55:170',
1442            f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
1443        )
1444        self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
1445
1446        assertInvalid(b'\x12' * 15)
1447        assertInvalid(b'\x12' * 17)
1448        assertInvalid(b'\x12' * 4)
1449
1450    # XXX The following don't test module-level functionality...
1451
1452    def testSockName(self):
1453        # Testing getsockname()
1454        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1455        self.addCleanup(sock.close)
1456
1457        # Since find_unused_port() is inherently subject to race conditions, we
1458        # call it a couple times if necessary.
1459        for i in itertools.count():
1460            port = socket_helper.find_unused_port()
1461            try:
1462                sock.bind(("0.0.0.0", port))
1463            except OSError as e:
1464                if e.errno != errno.EADDRINUSE or i == 5:
1465                    raise
1466            else:
1467                break
1468
1469        name = sock.getsockname()
1470        # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1471        # it reasonable to get the host's addr in addition to 0.0.0.0.
1472        # At least for eCos.  This is required for the S/390 to pass.
1473        try:
1474            my_ip_addr = socket.gethostbyname(socket.gethostname())
1475        except OSError:
1476            # Probably name lookup wasn't set up right; skip this test
1477            self.skipTest('name lookup failure')
1478        self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
1479        self.assertEqual(name[1], port)
1480
1481    def testGetSockOpt(self):
1482        # Testing getsockopt()
1483        # We know a socket should start without reuse==0
1484        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1485        self.addCleanup(sock.close)
1486        reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
1487        self.assertFalse(reuse != 0, "initial mode is reuse")
1488
1489    def testSetSockOpt(self):
1490        # Testing setsockopt()
1491        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1492        self.addCleanup(sock.close)
1493        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1494        reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
1495        self.assertFalse(reuse == 0, "failed to set reuse mode")
1496
1497    def testSendAfterClose(self):
1498        # testing send() after close() with timeout
1499        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1500            sock.settimeout(1)
1501        self.assertRaises(OSError, sock.send, b"spam")
1502
1503    def testCloseException(self):
1504        sock = socket.socket()
1505        sock.bind((socket._LOCALHOST, 0))
1506        socket.socket(fileno=sock.fileno()).close()
1507        try:
1508            sock.close()
1509        except OSError as err:
1510            # Winsock apparently raises ENOTSOCK
1511            self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1512        else:
1513            self.fail("close() should raise EBADF/ENOTSOCK")
1514
1515    def testNewAttributes(self):
1516        # testing .family, .type and .protocol
1517
1518        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1519            self.assertEqual(sock.family, socket.AF_INET)
1520            if hasattr(socket, 'SOCK_CLOEXEC'):
1521                self.assertIn(sock.type,
1522                              (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1523                               socket.SOCK_STREAM))
1524            else:
1525                self.assertEqual(sock.type, socket.SOCK_STREAM)
1526            self.assertEqual(sock.proto, 0)
1527
1528    def test_getsockaddrarg(self):
1529        sock = socket.socket()
1530        self.addCleanup(sock.close)
1531        port = socket_helper.find_unused_port()
1532        big_port = port + 65536
1533        neg_port = port - 65536
1534        self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1535        self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1536        # Since find_unused_port() is inherently subject to race conditions, we
1537        # call it a couple times if necessary.
1538        for i in itertools.count():
1539            port = socket_helper.find_unused_port()
1540            try:
1541                sock.bind((HOST, port))
1542            except OSError as e:
1543                if e.errno != errno.EADDRINUSE or i == 5:
1544                    raise
1545            else:
1546                break
1547
1548    @unittest.skipUnless(os.name == "nt", "Windows specific")
1549    def test_sock_ioctl(self):
1550        self.assertTrue(hasattr(socket.socket, 'ioctl'))
1551        self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1552        self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1553        self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
1554        self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1555        s = socket.socket()
1556        self.addCleanup(s.close)
1557        self.assertRaises(ValueError, s.ioctl, -1, None)
1558        s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
1559
1560    @unittest.skipUnless(os.name == "nt", "Windows specific")
1561    @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1562                         'Loopback fast path support required for this test')
1563    def test_sio_loopback_fast_path(self):
1564        s = socket.socket()
1565        self.addCleanup(s.close)
1566        try:
1567            s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1568        except OSError as exc:
1569            WSAEOPNOTSUPP = 10045
1570            if exc.winerror == WSAEOPNOTSUPP:
1571                self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1572                              "doesn't implemented in this Windows version")
1573            raise
1574        self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1575
1576    def testGetaddrinfo(self):
1577        try:
1578            socket.getaddrinfo('localhost', 80)
1579        except socket.gaierror as err:
1580            if err.errno == socket.EAI_SERVICE:
1581                # see http://bugs.python.org/issue1282647
1582                self.skipTest("buggy libc version")
1583            raise
1584        # len of every sequence is supposed to be == 5
1585        for info in socket.getaddrinfo(HOST, None):
1586            self.assertEqual(len(info), 5)
1587        # host can be a domain name, a string representation of an
1588        # IPv4/v6 address or None
1589        socket.getaddrinfo('localhost', 80)
1590        socket.getaddrinfo('127.0.0.1', 80)
1591        socket.getaddrinfo(None, 80)
1592        if socket_helper.IPV6_ENABLED:
1593            socket.getaddrinfo('::1', 80)
1594        # port can be a string service name such as "http", a numeric
1595        # port number or None
1596        # Issue #26936: this fails on Android before API level 23.
1597        if not (support.is_android and platform.android_ver().api_level < 23):
1598            socket.getaddrinfo(HOST, "http")
1599        socket.getaddrinfo(HOST, 80)
1600        socket.getaddrinfo(HOST, None)
1601        # test family and socktype filters
1602        infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1603        for family, type, _, _, _ in infos:
1604            self.assertEqual(family, socket.AF_INET)
1605            self.assertEqual(repr(family), '<AddressFamily.AF_INET: %r>' % family.value)
1606            self.assertEqual(str(family), str(family.value))
1607            self.assertEqual(type, socket.SOCK_STREAM)
1608            self.assertEqual(repr(type), '<SocketKind.SOCK_STREAM: %r>' % type.value)
1609            self.assertEqual(str(type), str(type.value))
1610        infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1611        for _, socktype, _, _, _ in infos:
1612            self.assertEqual(socktype, socket.SOCK_STREAM)
1613        # test proto and flags arguments
1614        socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1615        socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1616        # a server willing to support both IPv4 and IPv6 will
1617        # usually do this
1618        socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1619                           socket.AI_PASSIVE)
1620        # test keyword arguments
1621        a = socket.getaddrinfo(HOST, None)
1622        b = socket.getaddrinfo(host=HOST, port=None)
1623        self.assertEqual(a, b)
1624        a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1625        b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1626        self.assertEqual(a, b)
1627        a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1628        b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1629        self.assertEqual(a, b)
1630        a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1631        b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1632        self.assertEqual(a, b)
1633        a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1634        b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1635        self.assertEqual(a, b)
1636        a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1637                               socket.AI_PASSIVE)
1638        b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1639                               type=socket.SOCK_STREAM, proto=0,
1640                               flags=socket.AI_PASSIVE)
1641        self.assertEqual(a, b)
1642        # Issue #6697.
1643        self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
1644
1645        # Issue 17269: test workaround for OS X platform bug segfault
1646        if hasattr(socket, 'AI_NUMERICSERV'):
1647            try:
1648                # The arguments here are undefined and the call may succeed
1649                # or fail.  All we care here is that it doesn't segfault.
1650                socket.getaddrinfo("localhost", None, 0, 0, 0,
1651                                   socket.AI_NUMERICSERV)
1652            except socket.gaierror:
1653                pass
1654
1655    @unittest.skipIf(_testcapi is None, "requires _testcapi")
1656    def test_getaddrinfo_int_port_overflow(self):
1657        # gh-74895: Test that getaddrinfo does not raise OverflowError on port.
1658        #
1659        # POSIX getaddrinfo() never specify the valid range for "service"
1660        # decimal port number values. For IPv4 and IPv6 they are technically
1661        # unsigned 16-bit values, but the API is protocol agnostic. Which values
1662        # trigger an error from the C library function varies by platform as
1663        # they do not all perform validation.
1664
1665        # The key here is that we don't want to produce OverflowError as Python
1666        # prior to 3.12 did for ints outside of a [LONG_MIN, LONG_MAX] range.
1667        # Leave the error up to the underlying string based platform C API.
1668
1669        from _testcapi import ULONG_MAX, LONG_MAX, LONG_MIN
1670        try:
1671            socket.getaddrinfo(None, ULONG_MAX + 1, type=socket.SOCK_STREAM)
1672        except OverflowError:
1673            # Platforms differ as to what values constitute a getaddrinfo() error
1674            # return. Some fail for LONG_MAX+1, others ULONG_MAX+1, and Windows
1675            # silently accepts such huge "port" aka "service" numeric values.
1676            self.fail("Either no error or socket.gaierror expected.")
1677        except socket.gaierror:
1678            pass
1679
1680        try:
1681            socket.getaddrinfo(None, LONG_MAX + 1, type=socket.SOCK_STREAM)
1682        except OverflowError:
1683            self.fail("Either no error or socket.gaierror expected.")
1684        except socket.gaierror:
1685            pass
1686
1687        try:
1688            socket.getaddrinfo(None, LONG_MAX - 0xffff + 1, type=socket.SOCK_STREAM)
1689        except OverflowError:
1690            self.fail("Either no error or socket.gaierror expected.")
1691        except socket.gaierror:
1692            pass
1693
1694        try:
1695            socket.getaddrinfo(None, LONG_MIN - 1, type=socket.SOCK_STREAM)
1696        except OverflowError:
1697            self.fail("Either no error or socket.gaierror expected.")
1698        except socket.gaierror:
1699            pass
1700
1701        socket.getaddrinfo(None, 0, type=socket.SOCK_STREAM)  # No error expected.
1702        socket.getaddrinfo(None, 0xffff, type=socket.SOCK_STREAM)  # No error expected.
1703
1704    def test_getnameinfo(self):
1705        # only IP addresses are allowed
1706        self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
1707
1708    @unittest.skipUnless(support.is_resource_enabled('network'),
1709                         'network is not enabled')
1710    def test_idna(self):
1711        # Check for internet access before running test
1712        # (issue #12804, issue #25138).
1713        with socket_helper.transient_internet('python.org'):
1714            socket.gethostbyname('python.org')
1715
1716        # these should all be successful
1717        domain = 'испытание.pythontest.net'
1718        socket.gethostbyname(domain)
1719        socket.gethostbyname_ex(domain)
1720        socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1721        # this may not work if the forward lookup chooses the IPv6 address, as that doesn't
1722        # have a reverse entry yet
1723        # socket.gethostbyaddr('испытание.python.org')
1724
1725    def check_sendall_interrupted(self, with_timeout):
1726        # socketpair() is not strictly required, but it makes things easier.
1727        if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1728            self.skipTest("signal.alarm and socket.socketpair required for this test")
1729        # Our signal handlers clobber the C errno by calling a math function
1730        # with an invalid domain value.
1731        def ok_handler(*args):
1732            self.assertRaises(ValueError, math.acosh, 0)
1733        def raising_handler(*args):
1734            self.assertRaises(ValueError, math.acosh, 0)
1735            1 // 0
1736        c, s = socket.socketpair()
1737        old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1738        try:
1739            if with_timeout:
1740                # Just above the one second minimum for signal.alarm
1741                c.settimeout(1.5)
1742            with self.assertRaises(ZeroDivisionError):
1743                signal.alarm(1)
1744                c.sendall(b"x" * support.SOCK_MAX_SIZE)
1745            if with_timeout:
1746                signal.signal(signal.SIGALRM, ok_handler)
1747                signal.alarm(1)
1748                self.assertRaises(TimeoutError, c.sendall,
1749                                  b"x" * support.SOCK_MAX_SIZE)
1750        finally:
1751            signal.alarm(0)
1752            signal.signal(signal.SIGALRM, old_alarm)
1753            c.close()
1754            s.close()
1755
1756    def test_sendall_interrupted(self):
1757        self.check_sendall_interrupted(False)
1758
1759    def test_sendall_interrupted_with_timeout(self):
1760        self.check_sendall_interrupted(True)
1761
1762    def test_dealloc_warn(self):
1763        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1764        r = repr(sock)
1765        with self.assertWarns(ResourceWarning) as cm:
1766            sock = None
1767            support.gc_collect()
1768        self.assertIn(r, str(cm.warning.args[0]))
1769        # An open socket file object gets dereferenced after the socket
1770        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1771        f = sock.makefile('rb')
1772        r = repr(sock)
1773        sock = None
1774        support.gc_collect()
1775        with self.assertWarns(ResourceWarning):
1776            f = None
1777            support.gc_collect()
1778
1779    def test_name_closed_socketio(self):
1780        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1781            fp = sock.makefile("rb")
1782            fp.close()
1783            self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1784
1785    def test_unusable_closed_socketio(self):
1786        with socket.socket() as sock:
1787            fp = sock.makefile("rb", buffering=0)
1788            self.assertTrue(fp.readable())
1789            self.assertFalse(fp.writable())
1790            self.assertFalse(fp.seekable())
1791            fp.close()
1792            self.assertRaises(ValueError, fp.readable)
1793            self.assertRaises(ValueError, fp.writable)
1794            self.assertRaises(ValueError, fp.seekable)
1795
1796    def test_socket_close(self):
1797        sock = socket.socket()
1798        try:
1799            sock.bind((HOST, 0))
1800            socket.close(sock.fileno())
1801            with self.assertRaises(OSError):
1802                sock.listen(1)
1803        finally:
1804            with self.assertRaises(OSError):
1805                # sock.close() fails with EBADF
1806                sock.close()
1807        with self.assertRaises(TypeError):
1808            socket.close(None)
1809        with self.assertRaises(OSError):
1810            socket.close(-1)
1811
1812    def test_makefile_mode(self):
1813        for mode in 'r', 'rb', 'rw', 'w', 'wb':
1814            with self.subTest(mode=mode):
1815                with socket.socket() as sock:
1816                    encoding = None if "b" in mode else "utf-8"
1817                    with sock.makefile(mode, encoding=encoding) as fp:
1818                        self.assertEqual(fp.mode, mode)
1819
1820    def test_makefile_invalid_mode(self):
1821        for mode in 'rt', 'x', '+', 'a':
1822            with self.subTest(mode=mode):
1823                with socket.socket() as sock:
1824                    with self.assertRaisesRegex(ValueError, 'invalid mode'):
1825                        sock.makefile(mode)
1826
1827    def test_pickle(self):
1828        sock = socket.socket()
1829        with sock:
1830            for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1831                self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1832        for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1833            family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1834            self.assertEqual(family, socket.AF_INET)
1835            type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1836            self.assertEqual(type, socket.SOCK_STREAM)
1837
1838    def test_listen_backlog(self):
1839        for backlog in 0, -1:
1840            with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1841                srv.bind((HOST, 0))
1842                srv.listen(backlog)
1843
1844        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1845            srv.bind((HOST, 0))
1846            srv.listen()
1847
1848    @support.cpython_only
1849    @unittest.skipIf(_testcapi is None, "requires _testcapi")
1850    def test_listen_backlog_overflow(self):
1851        # Issue 15989
1852        import _testcapi
1853        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1854            srv.bind((HOST, 0))
1855            self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
1856
1857    @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
1858    def test_flowinfo(self):
1859        self.assertRaises(OverflowError, socket.getnameinfo,
1860                          (socket_helper.HOSTv6, 0, 0xffffffff), 0)
1861        with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1862            self.assertRaises(OverflowError, s.bind, (socket_helper.HOSTv6, 0, -10))
1863
1864    @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
1865    def test_getaddrinfo_ipv6_basic(self):
1866        ((*_, sockaddr),) = socket.getaddrinfo(
1867            'ff02::1de:c0:face:8D',  # Note capital letter `D`.
1868            1234, socket.AF_INET6,
1869            socket.SOCK_DGRAM,
1870            socket.IPPROTO_UDP
1871        )
1872        self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1873
1874    def test_getfqdn_filter_localhost(self):
1875        self.assertEqual(socket.getfqdn(), socket.getfqdn("0.0.0.0"))
1876        self.assertEqual(socket.getfqdn(), socket.getfqdn("::"))
1877
1878    @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
1879    @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
1880    @unittest.skipIf(AIX, 'Symbolic scope id does not work')
1881    @unittest.skipUnless(hasattr(socket, 'if_nameindex'), "test needs socket.if_nameindex()")
1882    def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1883        # Just pick up any network interface (Linux, Mac OS X)
1884        (ifindex, test_interface) = socket.if_nameindex()[0]
1885        ((*_, sockaddr),) = socket.getaddrinfo(
1886            'ff02::1de:c0:face:8D%' + test_interface,
1887            1234, socket.AF_INET6,
1888            socket.SOCK_DGRAM,
1889            socket.IPPROTO_UDP
1890        )
1891        # Note missing interface name part in IPv6 address
1892        self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1893
1894    @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
1895    @unittest.skipUnless(
1896        sys.platform == 'win32',
1897        'Numeric scope id does not work or undocumented')
1898    def test_getaddrinfo_ipv6_scopeid_numeric(self):
1899        # Also works on Linux and Mac OS X, but is not documented (?)
1900        # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1901        ifindex = 42
1902        ((*_, sockaddr),) = socket.getaddrinfo(
1903            'ff02::1de:c0:face:8D%' + str(ifindex),
1904            1234, socket.AF_INET6,
1905            socket.SOCK_DGRAM,
1906            socket.IPPROTO_UDP
1907        )
1908        # Note missing interface name part in IPv6 address
1909        self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1910
1911    @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
1912    @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
1913    @unittest.skipIf(AIX, 'Symbolic scope id does not work')
1914    @unittest.skipUnless(hasattr(socket, 'if_nameindex'), "test needs socket.if_nameindex()")
1915    def test_getnameinfo_ipv6_scopeid_symbolic(self):
1916        # Just pick up any network interface.
1917        (ifindex, test_interface) = socket.if_nameindex()[0]
1918        sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex)  # Note capital letter `D`.
1919        nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1920        self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1921
1922    @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
1923    @unittest.skipUnless( sys.platform == 'win32',
1924        'Numeric scope id does not work or undocumented')
1925    def test_getnameinfo_ipv6_scopeid_numeric(self):
1926        # Also works on Linux (undocumented), but does not work on Mac OS X
1927        # Windows and Linux allow nonexistent interface numbers here.
1928        ifindex = 42
1929        sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex)  # Note capital letter `D`.
1930        nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1931        self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1932
1933    def test_str_for_enums(self):
1934        # Make sure that the AF_* and SOCK_* constants have enum-like string
1935        # reprs.
1936        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1937            self.assertEqual(repr(s.family), '<AddressFamily.AF_INET: %r>' % s.family.value)
1938            self.assertEqual(repr(s.type), '<SocketKind.SOCK_STREAM: %r>' % s.type.value)
1939            self.assertEqual(str(s.family), str(s.family.value))
1940            self.assertEqual(str(s.type), str(s.type.value))
1941
1942    def test_socket_consistent_sock_type(self):
1943        SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1944        SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1945        sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1946
1947        with socket.socket(socket.AF_INET, sock_type) as s:
1948            self.assertEqual(s.type, socket.SOCK_STREAM)
1949            s.settimeout(1)
1950            self.assertEqual(s.type, socket.SOCK_STREAM)
1951            s.settimeout(0)
1952            self.assertEqual(s.type, socket.SOCK_STREAM)
1953            s.setblocking(True)
1954            self.assertEqual(s.type, socket.SOCK_STREAM)
1955            s.setblocking(False)
1956            self.assertEqual(s.type, socket.SOCK_STREAM)
1957
1958    def test_unknown_socket_family_repr(self):
1959        # Test that when created with a family that's not one of the known
1960        # AF_*/SOCK_* constants, socket.family just returns the number.
1961        #
1962        # To do this we fool socket.socket into believing it already has an
1963        # open fd because on this path it doesn't actually verify the family and
1964        # type and populates the socket object.
1965        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1966        fd = sock.detach()
1967        unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1968
1969        unknown_type = max(
1970            kind
1971            for name, kind in socket.SocketKind.__members__.items()
1972            if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1973        ) + 1
1974
1975        with socket.socket(
1976                family=unknown_family, type=unknown_type, proto=23,
1977                fileno=fd) as s:
1978            self.assertEqual(s.family, unknown_family)
1979            self.assertEqual(s.type, unknown_type)
1980            # some OS like macOS ignore proto
1981            self.assertIn(s.proto, {0, 23})
1982
1983    @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1984    def test__sendfile_use_sendfile(self):
1985        class File:
1986            def __init__(self, fd):
1987                self.fd = fd
1988
1989            def fileno(self):
1990                return self.fd
1991        with socket.socket() as sock:
1992            fd = os.open(os.curdir, os.O_RDONLY)
1993            os.close(fd)
1994            with self.assertRaises(socket._GiveupOnSendfile):
1995                sock._sendfile_use_sendfile(File(fd))
1996            with self.assertRaises(OverflowError):
1997                sock._sendfile_use_sendfile(File(2**1000))
1998            with self.assertRaises(TypeError):
1999                sock._sendfile_use_sendfile(File(None))
2000
2001    def _test_socket_fileno(self, s, family, stype):
2002        self.assertEqual(s.family, family)
2003        self.assertEqual(s.type, stype)
2004
2005        fd = s.fileno()
2006        s2 = socket.socket(fileno=fd)
2007        self.addCleanup(s2.close)
2008        # detach old fd to avoid double close
2009        s.detach()
2010        self.assertEqual(s2.family, family)
2011        self.assertEqual(s2.type, stype)
2012        self.assertEqual(s2.fileno(), fd)
2013
2014    def test_socket_fileno(self):
2015        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2016        self.addCleanup(s.close)
2017        s.bind((socket_helper.HOST, 0))
2018        self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
2019
2020        if hasattr(socket, "SOCK_DGRAM"):
2021            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
2022            self.addCleanup(s.close)
2023            s.bind((socket_helper.HOST, 0))
2024            self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
2025
2026        if socket_helper.IPV6_ENABLED:
2027            s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
2028            self.addCleanup(s.close)
2029            s.bind((socket_helper.HOSTv6, 0, 0, 0))
2030            self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
2031
2032        if hasattr(socket, "AF_UNIX"):
2033            unix_name = socket_helper.create_unix_domain_name()
2034            self.addCleanup(os_helper.unlink, unix_name)
2035
2036            s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
2037            with s:
2038                try:
2039                    s.bind(unix_name)
2040                except PermissionError:
2041                    pass
2042                else:
2043                    self._test_socket_fileno(s, socket.AF_UNIX,
2044                                             socket.SOCK_STREAM)
2045
2046    def test_socket_fileno_rejects_float(self):
2047        with self.assertRaises(TypeError):
2048            socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
2049
2050    def test_socket_fileno_rejects_other_types(self):
2051        with self.assertRaises(TypeError):
2052            socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
2053
2054    def test_socket_fileno_rejects_invalid_socket(self):
2055        with self.assertRaisesRegex(ValueError, "negative file descriptor"):
2056            socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
2057
2058    @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
2059    def test_socket_fileno_rejects_negative(self):
2060        with self.assertRaisesRegex(ValueError, "negative file descriptor"):
2061            socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
2062
2063    def test_socket_fileno_requires_valid_fd(self):
2064        WSAENOTSOCK = 10038
2065        with self.assertRaises(OSError) as cm:
2066            socket.socket(fileno=os_helper.make_bad_fd())
2067        self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
2068
2069        with self.assertRaises(OSError) as cm:
2070            socket.socket(
2071                socket.AF_INET,
2072                socket.SOCK_STREAM,
2073                fileno=os_helper.make_bad_fd())
2074        self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
2075
2076    def test_socket_fileno_requires_socket_fd(self):
2077        with tempfile.NamedTemporaryFile() as afile:
2078            with self.assertRaises(OSError):
2079                socket.socket(fileno=afile.fileno())
2080
2081            with self.assertRaises(OSError) as cm:
2082                socket.socket(
2083                    socket.AF_INET,
2084                    socket.SOCK_STREAM,
2085                    fileno=afile.fileno())
2086            self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
2087
2088    def test_addressfamily_enum(self):
2089        import _socket, enum
2090        CheckedAddressFamily = enum._old_convert_(
2091                enum.IntEnum, 'AddressFamily', 'socket',
2092                lambda C: C.isupper() and C.startswith('AF_'),
2093                source=_socket,
2094                )
2095        enum._test_simple_enum(CheckedAddressFamily, socket.AddressFamily)
2096
2097    def test_socketkind_enum(self):
2098        import _socket, enum
2099        CheckedSocketKind = enum._old_convert_(
2100                enum.IntEnum, 'SocketKind', 'socket',
2101                lambda C: C.isupper() and C.startswith('SOCK_'),
2102                source=_socket,
2103                )
2104        enum._test_simple_enum(CheckedSocketKind, socket.SocketKind)
2105
2106    def test_msgflag_enum(self):
2107        import _socket, enum
2108        CheckedMsgFlag = enum._old_convert_(
2109                enum.IntFlag, 'MsgFlag', 'socket',
2110                lambda C: C.isupper() and C.startswith('MSG_'),
2111                source=_socket,
2112                )
2113        enum._test_simple_enum(CheckedMsgFlag, socket.MsgFlag)
2114
2115    def test_addressinfo_enum(self):
2116        import _socket, enum
2117        CheckedAddressInfo = enum._old_convert_(
2118                enum.IntFlag, 'AddressInfo', 'socket',
2119                lambda C: C.isupper() and C.startswith('AI_'),
2120                source=_socket)
2121        enum._test_simple_enum(CheckedAddressInfo, socket.AddressInfo)
2122
2123
2124@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
2125class BasicCANTest(unittest.TestCase):
2126
2127    def testCrucialConstants(self):
2128        socket.AF_CAN
2129        socket.PF_CAN
2130        socket.CAN_RAW
2131
2132    @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2133                         'socket.CAN_BCM required for this test.')
2134    def testBCMConstants(self):
2135        socket.CAN_BCM
2136
2137        # opcodes
2138        socket.CAN_BCM_TX_SETUP     # create (cyclic) transmission task
2139        socket.CAN_BCM_TX_DELETE    # remove (cyclic) transmission task
2140        socket.CAN_BCM_TX_READ      # read properties of (cyclic) transmission task
2141        socket.CAN_BCM_TX_SEND      # send one CAN frame
2142        socket.CAN_BCM_RX_SETUP     # create RX content filter subscription
2143        socket.CAN_BCM_RX_DELETE    # remove RX content filter subscription
2144        socket.CAN_BCM_RX_READ      # read properties of RX content filter subscription
2145        socket.CAN_BCM_TX_STATUS    # reply to TX_READ request
2146        socket.CAN_BCM_TX_EXPIRED   # notification on performed transmissions (count=0)
2147        socket.CAN_BCM_RX_STATUS    # reply to RX_READ request
2148        socket.CAN_BCM_RX_TIMEOUT   # cyclic message is absent
2149        socket.CAN_BCM_RX_CHANGED   # updated CAN frame (detected content change)
2150
2151        # flags
2152        socket.CAN_BCM_SETTIMER
2153        socket.CAN_BCM_STARTTIMER
2154        socket.CAN_BCM_TX_COUNTEVT
2155        socket.CAN_BCM_TX_ANNOUNCE
2156        socket.CAN_BCM_TX_CP_CAN_ID
2157        socket.CAN_BCM_RX_FILTER_ID
2158        socket.CAN_BCM_RX_CHECK_DLC
2159        socket.CAN_BCM_RX_NO_AUTOTIMER
2160        socket.CAN_BCM_RX_ANNOUNCE_RESUME
2161        socket.CAN_BCM_TX_RESET_MULTI_IDX
2162        socket.CAN_BCM_RX_RTR_FRAME
2163
2164    def testCreateSocket(self):
2165        with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2166            pass
2167
2168    @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2169                         'socket.CAN_BCM required for this test.')
2170    def testCreateBCMSocket(self):
2171        with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
2172            pass
2173
2174    def testBindAny(self):
2175        with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2176            address = ('', )
2177            s.bind(address)
2178            self.assertEqual(s.getsockname(), address)
2179
2180    def testTooLongInterfaceName(self):
2181        # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2182        with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2183            self.assertRaisesRegex(OSError, 'interface name too long',
2184                                   s.bind, ('x' * 1024,))
2185
2186    @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
2187                         'socket.CAN_RAW_LOOPBACK required for this test.')
2188    def testLoopback(self):
2189        with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2190            for loopback in (0, 1):
2191                s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
2192                             loopback)
2193                self.assertEqual(loopback,
2194                    s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
2195
2196    @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
2197                         'socket.CAN_RAW_FILTER required for this test.')
2198    def testFilter(self):
2199        can_id, can_mask = 0x200, 0x700
2200        can_filter = struct.pack("=II", can_id, can_mask)
2201        with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2202            s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
2203            self.assertEqual(can_filter,
2204                    s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
2205            s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
2206
2207
2208@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
2209class CANTest(ThreadedCANSocketTest):
2210
2211    def __init__(self, methodName='runTest'):
2212        ThreadedCANSocketTest.__init__(self, methodName=methodName)
2213
2214    @classmethod
2215    def build_can_frame(cls, can_id, data):
2216        """Build a CAN frame."""
2217        can_dlc = len(data)
2218        data = data.ljust(8, b'\x00')
2219        return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
2220
2221    @classmethod
2222    def dissect_can_frame(cls, frame):
2223        """Dissect a CAN frame."""
2224        can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
2225        return (can_id, can_dlc, data[:can_dlc])
2226
2227    def testSendFrame(self):
2228        cf, addr = self.s.recvfrom(self.bufsize)
2229        self.assertEqual(self.cf, cf)
2230        self.assertEqual(addr[0], self.interface)
2231
2232    def _testSendFrame(self):
2233        self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
2234        self.cli.send(self.cf)
2235
2236    def testSendMaxFrame(self):
2237        cf, addr = self.s.recvfrom(self.bufsize)
2238        self.assertEqual(self.cf, cf)
2239
2240    def _testSendMaxFrame(self):
2241        self.cf = self.build_can_frame(0x00, b'\x07' * 8)
2242        self.cli.send(self.cf)
2243
2244    def testSendMultiFrames(self):
2245        cf, addr = self.s.recvfrom(self.bufsize)
2246        self.assertEqual(self.cf1, cf)
2247
2248        cf, addr = self.s.recvfrom(self.bufsize)
2249        self.assertEqual(self.cf2, cf)
2250
2251    def _testSendMultiFrames(self):
2252        self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
2253        self.cli.send(self.cf1)
2254
2255        self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
2256        self.cli.send(self.cf2)
2257
2258    @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2259                         'socket.CAN_BCM required for this test.')
2260    def _testBCM(self):
2261        cf, addr = self.cli.recvfrom(self.bufsize)
2262        self.assertEqual(self.cf, cf)
2263        can_id, can_dlc, data = self.dissect_can_frame(cf)
2264        self.assertEqual(self.can_id, can_id)
2265        self.assertEqual(self.data, data)
2266
2267    @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2268                         'socket.CAN_BCM required for this test.')
2269    def testBCM(self):
2270        bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
2271        self.addCleanup(bcm.close)
2272        bcm.connect((self.interface,))
2273        self.can_id = 0x123
2274        self.data = bytes([0xc0, 0xff, 0xee])
2275        self.cf = self.build_can_frame(self.can_id, self.data)
2276        opcode = socket.CAN_BCM_TX_SEND
2277        flags = 0
2278        count = 0
2279        ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2280        bcm_can_id = 0x0222
2281        nframes = 1
2282        assert len(self.cf) == 16
2283        header = struct.pack(self.bcm_cmd_msg_fmt,
2284                    opcode,
2285                    flags,
2286                    count,
2287                    ival1_seconds,
2288                    ival1_usec,
2289                    ival2_seconds,
2290                    ival2_usec,
2291                    bcm_can_id,
2292                    nframes,
2293                    )
2294        header_plus_frame = header + self.cf
2295        bytes_sent = bcm.send(header_plus_frame)
2296        self.assertEqual(bytes_sent, len(header_plus_frame))
2297
2298
2299@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2300class ISOTPTest(unittest.TestCase):
2301
2302    def __init__(self, *args, **kwargs):
2303        super().__init__(*args, **kwargs)
2304        self.interface = "vcan0"
2305
2306    def testCrucialConstants(self):
2307        socket.AF_CAN
2308        socket.PF_CAN
2309        socket.CAN_ISOTP
2310        socket.SOCK_DGRAM
2311
2312    def testCreateSocket(self):
2313        with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2314            pass
2315
2316    @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2317                         'socket.CAN_ISOTP required for this test.')
2318    def testCreateISOTPSocket(self):
2319        with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2320            pass
2321
2322    def testTooLongInterfaceName(self):
2323        # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2324        with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2325            with self.assertRaisesRegex(OSError, 'interface name too long'):
2326                s.bind(('x' * 1024, 1, 2))
2327
2328    def testBind(self):
2329        try:
2330            with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2331                addr = self.interface, 0x123, 0x456
2332                s.bind(addr)
2333                self.assertEqual(s.getsockname(), addr)
2334        except OSError as e:
2335            if e.errno == errno.ENODEV:
2336                self.skipTest('network interface `%s` does not exist' %
2337                           self.interface)
2338            else:
2339                raise
2340
2341
2342@unittest.skipUnless(HAVE_SOCKET_CAN_J1939, 'CAN J1939 required for this test.')
2343class J1939Test(unittest.TestCase):
2344
2345    def __init__(self, *args, **kwargs):
2346        super().__init__(*args, **kwargs)
2347        self.interface = "vcan0"
2348
2349    @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2350                         'socket.CAN_J1939 required for this test.')
2351    def testJ1939Constants(self):
2352        socket.CAN_J1939
2353
2354        socket.J1939_MAX_UNICAST_ADDR
2355        socket.J1939_IDLE_ADDR
2356        socket.J1939_NO_ADDR
2357        socket.J1939_NO_NAME
2358        socket.J1939_PGN_REQUEST
2359        socket.J1939_PGN_ADDRESS_CLAIMED
2360        socket.J1939_PGN_ADDRESS_COMMANDED
2361        socket.J1939_PGN_PDU1_MAX
2362        socket.J1939_PGN_MAX
2363        socket.J1939_NO_PGN
2364
2365        # J1939 socket options
2366        socket.SO_J1939_FILTER
2367        socket.SO_J1939_PROMISC
2368        socket.SO_J1939_SEND_PRIO
2369        socket.SO_J1939_ERRQUEUE
2370
2371        socket.SCM_J1939_DEST_ADDR
2372        socket.SCM_J1939_DEST_NAME
2373        socket.SCM_J1939_PRIO
2374        socket.SCM_J1939_ERRQUEUE
2375
2376        socket.J1939_NLA_PAD
2377        socket.J1939_NLA_BYTES_ACKED
2378
2379        socket.J1939_EE_INFO_NONE
2380        socket.J1939_EE_INFO_TX_ABORT
2381
2382        socket.J1939_FILTER_MAX
2383
2384    @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2385                         'socket.CAN_J1939 required for this test.')
2386    def testCreateJ1939Socket(self):
2387        with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2388            pass
2389
2390    def testBind(self):
2391        try:
2392            with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2393                addr = self.interface, socket.J1939_NO_NAME, socket.J1939_NO_PGN, socket.J1939_NO_ADDR
2394                s.bind(addr)
2395                self.assertEqual(s.getsockname(), addr)
2396        except OSError as e:
2397            if e.errno == errno.ENODEV:
2398                self.skipTest('network interface `%s` does not exist' %
2399                           self.interface)
2400            else:
2401                raise
2402
2403
2404@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2405class BasicRDSTest(unittest.TestCase):
2406
2407    def testCrucialConstants(self):
2408        socket.AF_RDS
2409        socket.PF_RDS
2410
2411    def testCreateSocket(self):
2412        with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2413            pass
2414
2415    def testSocketBufferSize(self):
2416        bufsize = 16384
2417        with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2418            s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2419            s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2420
2421
2422@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2423class RDSTest(ThreadedRDSSocketTest):
2424
2425    def __init__(self, methodName='runTest'):
2426        ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2427
2428    def setUp(self):
2429        super().setUp()
2430        self.evt = threading.Event()
2431
2432    def testSendAndRecv(self):
2433        data, addr = self.serv.recvfrom(self.bufsize)
2434        self.assertEqual(self.data, data)
2435        self.assertEqual(self.cli_addr, addr)
2436
2437    def _testSendAndRecv(self):
2438        self.data = b'spam'
2439        self.cli.sendto(self.data, 0, (HOST, self.port))
2440
2441    def testPeek(self):
2442        data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2443        self.assertEqual(self.data, data)
2444        data, addr = self.serv.recvfrom(self.bufsize)
2445        self.assertEqual(self.data, data)
2446
2447    def _testPeek(self):
2448        self.data = b'spam'
2449        self.cli.sendto(self.data, 0, (HOST, self.port))
2450
2451    @requireAttrs(socket.socket, 'recvmsg')
2452    def testSendAndRecvMsg(self):
2453        data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2454        self.assertEqual(self.data, data)
2455
2456    @requireAttrs(socket.socket, 'sendmsg')
2457    def _testSendAndRecvMsg(self):
2458        self.data = b'hello ' * 10
2459        self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2460
2461    def testSendAndRecvMulti(self):
2462        data, addr = self.serv.recvfrom(self.bufsize)
2463        self.assertEqual(self.data1, data)
2464
2465        data, addr = self.serv.recvfrom(self.bufsize)
2466        self.assertEqual(self.data2, data)
2467
2468    def _testSendAndRecvMulti(self):
2469        self.data1 = b'bacon'
2470        self.cli.sendto(self.data1, 0, (HOST, self.port))
2471
2472        self.data2 = b'egg'
2473        self.cli.sendto(self.data2, 0, (HOST, self.port))
2474
2475    def testSelect(self):
2476        r, w, x = select.select([self.serv], [], [], 3.0)
2477        self.assertIn(self.serv, r)
2478        data, addr = self.serv.recvfrom(self.bufsize)
2479        self.assertEqual(self.data, data)
2480
2481    def _testSelect(self):
2482        self.data = b'select'
2483        self.cli.sendto(self.data, 0, (HOST, self.port))
2484
2485@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2486          'QIPCRTR sockets required for this test.')
2487class BasicQIPCRTRTest(unittest.TestCase):
2488
2489    def testCrucialConstants(self):
2490        socket.AF_QIPCRTR
2491
2492    def testCreateSocket(self):
2493        with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2494            pass
2495
2496    def testUnbound(self):
2497        with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2498            self.assertEqual(s.getsockname()[1], 0)
2499
2500    def testBindSock(self):
2501        with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2502            socket_helper.bind_port(s, host=s.getsockname()[0])
2503            self.assertNotEqual(s.getsockname()[1], 0)
2504
2505    def testInvalidBindSock(self):
2506        with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2507            self.assertRaises(OSError, socket_helper.bind_port, s, host=-2)
2508
2509    def testAutoBindSock(self):
2510        with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2511            s.connect((123, 123))
2512            self.assertNotEqual(s.getsockname()[1], 0)
2513
2514@unittest.skipIf(fcntl is None, "need fcntl")
2515@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2516          'VSOCK sockets required for this test.')
2517class BasicVSOCKTest(unittest.TestCase):
2518
2519    def testCrucialConstants(self):
2520        socket.AF_VSOCK
2521
2522    def testVSOCKConstants(self):
2523        socket.SO_VM_SOCKETS_BUFFER_SIZE
2524        socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2525        socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2526        socket.VMADDR_CID_ANY
2527        socket.VMADDR_PORT_ANY
2528        socket.VMADDR_CID_HOST
2529        socket.VM_SOCKETS_INVALID_VERSION
2530        socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2531
2532    def testCreateSocket(self):
2533        with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2534            pass
2535
2536    def testSocketBufferSize(self):
2537        with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2538            orig_max = s.getsockopt(socket.AF_VSOCK,
2539                                    socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2540            orig = s.getsockopt(socket.AF_VSOCK,
2541                                socket.SO_VM_SOCKETS_BUFFER_SIZE)
2542            orig_min = s.getsockopt(socket.AF_VSOCK,
2543                                    socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2544
2545            s.setsockopt(socket.AF_VSOCK,
2546                         socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2547            s.setsockopt(socket.AF_VSOCK,
2548                         socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2549            s.setsockopt(socket.AF_VSOCK,
2550                         socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2551
2552            self.assertEqual(orig_max * 2,
2553                             s.getsockopt(socket.AF_VSOCK,
2554                             socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2555            self.assertEqual(orig * 2,
2556                             s.getsockopt(socket.AF_VSOCK,
2557                             socket.SO_VM_SOCKETS_BUFFER_SIZE))
2558            self.assertEqual(orig_min * 2,
2559                             s.getsockopt(socket.AF_VSOCK,
2560                             socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2561
2562
2563@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
2564                     'Bluetooth sockets required for this test.')
2565class BasicBluetoothTest(unittest.TestCase):
2566
2567    def testBluetoothConstants(self):
2568        socket.BDADDR_ANY
2569        socket.BDADDR_LOCAL
2570        socket.AF_BLUETOOTH
2571        socket.BTPROTO_RFCOMM
2572
2573        if sys.platform != "win32":
2574            socket.BTPROTO_HCI
2575            socket.SOL_HCI
2576            socket.BTPROTO_L2CAP
2577
2578            if not sys.platform.startswith("freebsd"):
2579                socket.BTPROTO_SCO
2580
2581    def testCreateRfcommSocket(self):
2582        with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
2583            pass
2584
2585    @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets")
2586    def testCreateL2capSocket(self):
2587        with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s:
2588            pass
2589
2590    @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets")
2591    def testCreateHciSocket(self):
2592        with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s:
2593            pass
2594
2595    @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"),
2596                     "windows and freebsd do not support SCO sockets")
2597    def testCreateScoSocket(self):
2598        with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s:
2599            pass
2600
2601
2602@unittest.skipUnless(HAVE_SOCKET_HYPERV,
2603                     'Hyper-V sockets required for this test.')
2604class BasicHyperVTest(unittest.TestCase):
2605
2606    def testHyperVConstants(self):
2607        socket.HVSOCKET_CONNECT_TIMEOUT
2608        socket.HVSOCKET_CONNECT_TIMEOUT_MAX
2609        socket.HVSOCKET_CONNECTED_SUSPEND
2610        socket.HVSOCKET_ADDRESS_FLAG_PASSTHRU
2611        socket.HV_GUID_ZERO
2612        socket.HV_GUID_WILDCARD
2613        socket.HV_GUID_BROADCAST
2614        socket.HV_GUID_CHILDREN
2615        socket.HV_GUID_LOOPBACK
2616        socket.HV_GUID_PARENT
2617
2618    def testCreateHyperVSocketWithUnknownProtoFailure(self):
2619        expected = r"\[WinError 10041\]"
2620        with self.assertRaisesRegex(OSError, expected):
2621            socket.socket(socket.AF_HYPERV, socket.SOCK_STREAM)
2622
2623    def testCreateHyperVSocketAddrNotTupleFailure(self):
2624        expected = "connect(): AF_HYPERV address must be tuple, not str"
2625        with socket.socket(socket.AF_HYPERV, socket.SOCK_STREAM, socket.HV_PROTOCOL_RAW) as s:
2626            with self.assertRaisesRegex(TypeError, re.escape(expected)):
2627                s.connect(socket.HV_GUID_ZERO)
2628
2629    def testCreateHyperVSocketAddrNotTupleOf2StrsFailure(self):
2630        expected = "AF_HYPERV address must be a str tuple (vm_id, service_id)"
2631        with socket.socket(socket.AF_HYPERV, socket.SOCK_STREAM, socket.HV_PROTOCOL_RAW) as s:
2632            with self.assertRaisesRegex(TypeError, re.escape(expected)):
2633                s.connect((socket.HV_GUID_ZERO,))
2634
2635    def testCreateHyperVSocketAddrNotTupleOfStrsFailure(self):
2636        expected = "AF_HYPERV address must be a str tuple (vm_id, service_id)"
2637        with socket.socket(socket.AF_HYPERV, socket.SOCK_STREAM, socket.HV_PROTOCOL_RAW) as s:
2638            with self.assertRaisesRegex(TypeError, re.escape(expected)):
2639                s.connect((1, 2))
2640
2641    def testCreateHyperVSocketAddrVmIdNotValidUUIDFailure(self):
2642        expected = "connect(): AF_HYPERV address vm_id is not a valid UUID string"
2643        with socket.socket(socket.AF_HYPERV, socket.SOCK_STREAM, socket.HV_PROTOCOL_RAW) as s:
2644            with self.assertRaisesRegex(ValueError, re.escape(expected)):
2645                s.connect(("00", socket.HV_GUID_ZERO))
2646
2647    def testCreateHyperVSocketAddrServiceIdNotValidUUIDFailure(self):
2648        expected = "connect(): AF_HYPERV address service_id is not a valid UUID string"
2649        with socket.socket(socket.AF_HYPERV, socket.SOCK_STREAM, socket.HV_PROTOCOL_RAW) as s:
2650            with self.assertRaisesRegex(ValueError, re.escape(expected)):
2651                s.connect((socket.HV_GUID_ZERO, "00"))
2652
2653
2654class BasicTCPTest(SocketConnectedTest):
2655
2656    def __init__(self, methodName='runTest'):
2657        SocketConnectedTest.__init__(self, methodName=methodName)
2658
2659    def testRecv(self):
2660        # Testing large receive over TCP
2661        msg = self.cli_conn.recv(1024)
2662        self.assertEqual(msg, MSG)
2663
2664    def _testRecv(self):
2665        self.serv_conn.send(MSG)
2666
2667    def testOverFlowRecv(self):
2668        # Testing receive in chunks over TCP
2669        seg1 = self.cli_conn.recv(len(MSG) - 3)
2670        seg2 = self.cli_conn.recv(1024)
2671        msg = seg1 + seg2
2672        self.assertEqual(msg, MSG)
2673
2674    def _testOverFlowRecv(self):
2675        self.serv_conn.send(MSG)
2676
2677    def testRecvFrom(self):
2678        # Testing large recvfrom() over TCP
2679        msg, addr = self.cli_conn.recvfrom(1024)
2680        self.assertEqual(msg, MSG)
2681
2682    def _testRecvFrom(self):
2683        self.serv_conn.send(MSG)
2684
2685    def testOverFlowRecvFrom(self):
2686        # Testing recvfrom() in chunks over TCP
2687        seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2688        seg2, addr = self.cli_conn.recvfrom(1024)
2689        msg = seg1 + seg2
2690        self.assertEqual(msg, MSG)
2691
2692    def _testOverFlowRecvFrom(self):
2693        self.serv_conn.send(MSG)
2694
2695    def testSendAll(self):
2696        # Testing sendall() with a 2048 byte string over TCP
2697        msg = b''
2698        while 1:
2699            read = self.cli_conn.recv(1024)
2700            if not read:
2701                break
2702            msg += read
2703        self.assertEqual(msg, b'f' * 2048)
2704
2705    def _testSendAll(self):
2706        big_chunk = b'f' * 2048
2707        self.serv_conn.sendall(big_chunk)
2708
2709    def testFromFd(self):
2710        # Testing fromfd()
2711        fd = self.cli_conn.fileno()
2712        sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
2713        self.addCleanup(sock.close)
2714        self.assertIsInstance(sock, socket.socket)
2715        msg = sock.recv(1024)
2716        self.assertEqual(msg, MSG)
2717
2718    def _testFromFd(self):
2719        self.serv_conn.send(MSG)
2720
2721    def testDup(self):
2722        # Testing dup()
2723        sock = self.cli_conn.dup()
2724        self.addCleanup(sock.close)
2725        msg = sock.recv(1024)
2726        self.assertEqual(msg, MSG)
2727
2728    def _testDup(self):
2729        self.serv_conn.send(MSG)
2730
2731    def check_shutdown(self):
2732        # Test shutdown() helper
2733        msg = self.cli_conn.recv(1024)
2734        self.assertEqual(msg, MSG)
2735        # wait for _testShutdown[_overflow] to finish: on OS X, when the server
2736        # closes the connection the client also becomes disconnected,
2737        # and the client's shutdown call will fail. (Issue #4397.)
2738        self.done.wait()
2739
2740    def testShutdown(self):
2741        self.check_shutdown()
2742
2743    def _testShutdown(self):
2744        self.serv_conn.send(MSG)
2745        self.serv_conn.shutdown(2)
2746
2747    @support.cpython_only
2748    @unittest.skipIf(_testcapi is None, "requires _testcapi")
2749    def testShutdown_overflow(self):
2750        self.check_shutdown()
2751
2752    @support.cpython_only
2753    @unittest.skipIf(_testcapi is None, "requires _testcapi")
2754    def _testShutdown_overflow(self):
2755        import _testcapi
2756        self.serv_conn.send(MSG)
2757        # Issue 15989
2758        self.assertRaises(OverflowError, self.serv_conn.shutdown,
2759                          _testcapi.INT_MAX + 1)
2760        self.assertRaises(OverflowError, self.serv_conn.shutdown,
2761                          2 + (_testcapi.UINT_MAX + 1))
2762        self.serv_conn.shutdown(2)
2763
2764    def testDetach(self):
2765        # Testing detach()
2766        fileno = self.cli_conn.fileno()
2767        f = self.cli_conn.detach()
2768        self.assertEqual(f, fileno)
2769        # cli_conn cannot be used anymore...
2770        self.assertTrue(self.cli_conn._closed)
2771        self.assertRaises(OSError, self.cli_conn.recv, 1024)
2772        self.cli_conn.close()
2773        # ...but we can create another socket using the (still open)
2774        # file descriptor
2775        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
2776        self.addCleanup(sock.close)
2777        msg = sock.recv(1024)
2778        self.assertEqual(msg, MSG)
2779
2780    def _testDetach(self):
2781        self.serv_conn.send(MSG)
2782
2783
2784class BasicUDPTest(ThreadedUDPSocketTest):
2785
2786    def __init__(self, methodName='runTest'):
2787        ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2788
2789    def testSendtoAndRecv(self):
2790        # Testing sendto() and Recv() over UDP
2791        msg = self.serv.recv(len(MSG))
2792        self.assertEqual(msg, MSG)
2793
2794    def _testSendtoAndRecv(self):
2795        self.cli.sendto(MSG, 0, (HOST, self.port))
2796
2797    def testRecvFrom(self):
2798        # Testing recvfrom() over UDP
2799        msg, addr = self.serv.recvfrom(len(MSG))
2800        self.assertEqual(msg, MSG)
2801
2802    def _testRecvFrom(self):
2803        self.cli.sendto(MSG, 0, (HOST, self.port))
2804
2805    def testRecvFromNegative(self):
2806        # Negative lengths passed to recvfrom should give ValueError.
2807        self.assertRaises(ValueError, self.serv.recvfrom, -1)
2808
2809    def _testRecvFromNegative(self):
2810        self.cli.sendto(MSG, 0, (HOST, self.port))
2811
2812
2813@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
2814          'UDPLITE sockets required for this test.')
2815class BasicUDPLITETest(ThreadedUDPLITESocketTest):
2816
2817    def __init__(self, methodName='runTest'):
2818        ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
2819
2820    def testSendtoAndRecv(self):
2821        # Testing sendto() and Recv() over UDPLITE
2822        msg = self.serv.recv(len(MSG))
2823        self.assertEqual(msg, MSG)
2824
2825    def _testSendtoAndRecv(self):
2826        self.cli.sendto(MSG, 0, (HOST, self.port))
2827
2828    def testRecvFrom(self):
2829        # Testing recvfrom() over UDPLITE
2830        msg, addr = self.serv.recvfrom(len(MSG))
2831        self.assertEqual(msg, MSG)
2832
2833    def _testRecvFrom(self):
2834        self.cli.sendto(MSG, 0, (HOST, self.port))
2835
2836    def testRecvFromNegative(self):
2837        # Negative lengths passed to recvfrom should give ValueError.
2838        self.assertRaises(ValueError, self.serv.recvfrom, -1)
2839
2840    def _testRecvFromNegative(self):
2841        self.cli.sendto(MSG, 0, (HOST, self.port))
2842
2843# Tests for the sendmsg()/recvmsg() interface.  Where possible, the
2844# same test code is used with different families and types of socket
2845# (e.g. stream, datagram), and tests using recvmsg() are repeated
2846# using recvmsg_into().
2847#
2848# The generic test classes such as SendmsgTests and
2849# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2850# supplied with sockets cli_sock and serv_sock representing the
2851# client's and the server's end of the connection respectively, and
2852# attributes cli_addr and serv_addr holding their (numeric where
2853# appropriate) addresses.
2854#
2855# The final concrete test classes combine these with subclasses of
2856# SocketTestBase which set up client and server sockets of a specific
2857# type, and with subclasses of SendrecvmsgBase such as
2858# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2859# sockets to cli_sock and serv_sock and override the methods and
2860# attributes of SendrecvmsgBase to fill in destination addresses if
2861# needed when sending, check for specific flags in msg_flags, etc.
2862#
2863# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2864# recvmsg_into().
2865
2866# XXX: like the other datagram (UDP) tests in this module, the code
2867# here assumes that datagram delivery on the local machine will be
2868# reliable.
2869
2870class SendrecvmsgBase:
2871    # Base class for sendmsg()/recvmsg() tests.
2872
2873    # Time in seconds to wait before considering a test failed, or
2874    # None for no timeout.  Not all tests actually set a timeout.
2875    fail_timeout = support.LOOPBACK_TIMEOUT
2876
2877    def setUp(self):
2878        self.misc_event = threading.Event()
2879        super().setUp()
2880
2881    def sendToServer(self, msg):
2882        # Send msg to the server.
2883        return self.cli_sock.send(msg)
2884
2885    # Tuple of alternative default arguments for sendmsg() when called
2886    # via sendmsgToServer() (e.g. to include a destination address).
2887    sendmsg_to_server_defaults = ()
2888
2889    def sendmsgToServer(self, *args):
2890        # Call sendmsg() on self.cli_sock with the given arguments,
2891        # filling in any arguments which are not supplied with the
2892        # corresponding items of self.sendmsg_to_server_defaults, if
2893        # any.
2894        return self.cli_sock.sendmsg(
2895            *(args + self.sendmsg_to_server_defaults[len(args):]))
2896
2897    def doRecvmsg(self, sock, bufsize, *args):
2898        # Call recvmsg() on sock with given arguments and return its
2899        # result.  Should be used for tests which can use either
2900        # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2901        # this method with one which emulates it using recvmsg_into(),
2902        # thus allowing the same test to be used for both methods.
2903        result = sock.recvmsg(bufsize, *args)
2904        self.registerRecvmsgResult(result)
2905        return result
2906
2907    def registerRecvmsgResult(self, result):
2908        # Called by doRecvmsg() with the return value of recvmsg() or
2909        # recvmsg_into().  Can be overridden to arrange cleanup based
2910        # on the returned ancillary data, for instance.
2911        pass
2912
2913    def checkRecvmsgAddress(self, addr1, addr2):
2914        # Called to compare the received address with the address of
2915        # the peer.
2916        self.assertEqual(addr1, addr2)
2917
2918    # Flags that are normally unset in msg_flags
2919    msg_flags_common_unset = 0
2920    for name in ("MSG_CTRUNC", "MSG_OOB"):
2921        msg_flags_common_unset |= getattr(socket, name, 0)
2922
2923    # Flags that are normally set
2924    msg_flags_common_set = 0
2925
2926    # Flags set when a complete record has been received (e.g. MSG_EOR
2927    # for SCTP)
2928    msg_flags_eor_indicator = 0
2929
2930    # Flags set when a complete record has not been received
2931    # (e.g. MSG_TRUNC for datagram sockets)
2932    msg_flags_non_eor_indicator = 0
2933
2934    def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2935        # Method to check the value of msg_flags returned by recvmsg[_into]().
2936        #
2937        # Checks that all bits in msg_flags_common_set attribute are
2938        # set in "flags" and all bits in msg_flags_common_unset are
2939        # unset.
2940        #
2941        # The "eor" argument specifies whether the flags should
2942        # indicate that a full record (or datagram) has been received.
2943        # If "eor" is None, no checks are done; otherwise, checks
2944        # that:
2945        #
2946        #  * if "eor" is true, all bits in msg_flags_eor_indicator are
2947        #    set and all bits in msg_flags_non_eor_indicator are unset
2948        #
2949        #  * if "eor" is false, all bits in msg_flags_non_eor_indicator
2950        #    are set and all bits in msg_flags_eor_indicator are unset
2951        #
2952        # If "checkset" and/or "checkunset" are supplied, they require
2953        # the given bits to be set or unset respectively, overriding
2954        # what the attributes require for those bits.
2955        #
2956        # If any bits are set in "ignore", they will not be checked,
2957        # regardless of the other inputs.
2958        #
2959        # Will raise Exception if the inputs require a bit to be both
2960        # set and unset, and it is not ignored.
2961
2962        defaultset = self.msg_flags_common_set
2963        defaultunset = self.msg_flags_common_unset
2964
2965        if eor:
2966            defaultset |= self.msg_flags_eor_indicator
2967            defaultunset |= self.msg_flags_non_eor_indicator
2968        elif eor is not None:
2969            defaultset |= self.msg_flags_non_eor_indicator
2970            defaultunset |= self.msg_flags_eor_indicator
2971
2972        # Function arguments override defaults
2973        defaultset &= ~checkunset
2974        defaultunset &= ~checkset
2975
2976        # Merge arguments with remaining defaults, and check for conflicts
2977        checkset |= defaultset
2978        checkunset |= defaultunset
2979        inboth = checkset & checkunset & ~ignore
2980        if inboth:
2981            raise Exception("contradictory set, unset requirements for flags "
2982                            "{0:#x}".format(inboth))
2983
2984        # Compare with given msg_flags value
2985        mask = (checkset | checkunset) & ~ignore
2986        self.assertEqual(flags & mask, checkset & mask)
2987
2988
2989class RecvmsgIntoMixin(SendrecvmsgBase):
2990    # Mixin to implement doRecvmsg() using recvmsg_into().
2991
2992    def doRecvmsg(self, sock, bufsize, *args):
2993        buf = bytearray(bufsize)
2994        result = sock.recvmsg_into([buf], *args)
2995        self.registerRecvmsgResult(result)
2996        self.assertGreaterEqual(result[0], 0)
2997        self.assertLessEqual(result[0], bufsize)
2998        return (bytes(buf[:result[0]]),) + result[1:]
2999
3000
3001class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
3002    # Defines flags to be checked in msg_flags for datagram sockets.
3003
3004    @property
3005    def msg_flags_non_eor_indicator(self):
3006        return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
3007
3008
3009class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
3010    # Defines flags to be checked in msg_flags for SCTP sockets.
3011
3012    @property
3013    def msg_flags_eor_indicator(self):
3014        return super().msg_flags_eor_indicator | socket.MSG_EOR
3015
3016
3017class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
3018    # Base class for tests on connectionless-mode sockets.  Users must
3019    # supply sockets on attributes cli and serv to be mapped to
3020    # cli_sock and serv_sock respectively.
3021
3022    @property
3023    def serv_sock(self):
3024        return self.serv
3025
3026    @property
3027    def cli_sock(self):
3028        return self.cli
3029
3030    @property
3031    def sendmsg_to_server_defaults(self):
3032        return ([], [], 0, self.serv_addr)
3033
3034    def sendToServer(self, msg):
3035        return self.cli_sock.sendto(msg, self.serv_addr)
3036
3037
3038class SendrecvmsgConnectedBase(SendrecvmsgBase):
3039    # Base class for tests on connected sockets.  Users must supply
3040    # sockets on attributes serv_conn and cli_conn (representing the
3041    # connections *to* the server and the client), to be mapped to
3042    # cli_sock and serv_sock respectively.
3043
3044    @property
3045    def serv_sock(self):
3046        return self.cli_conn
3047
3048    @property
3049    def cli_sock(self):
3050        return self.serv_conn
3051
3052    def checkRecvmsgAddress(self, addr1, addr2):
3053        # Address is currently "unspecified" for a connected socket,
3054        # so we don't examine it
3055        pass
3056
3057
3058class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
3059    # Base class to set a timeout on server's socket.
3060
3061    def setUp(self):
3062        super().setUp()
3063        self.serv_sock.settimeout(self.fail_timeout)
3064
3065
3066class SendmsgTests(SendrecvmsgServerTimeoutBase):
3067    # Tests for sendmsg() which can use any socket type and do not
3068    # involve recvmsg() or recvmsg_into().
3069
3070    def testSendmsg(self):
3071        # Send a simple message with sendmsg().
3072        self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
3073
3074    def _testSendmsg(self):
3075        self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
3076
3077    def testSendmsgDataGenerator(self):
3078        # Send from buffer obtained from a generator (not a sequence).
3079        self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
3080
3081    def _testSendmsgDataGenerator(self):
3082        self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
3083                         len(MSG))
3084
3085    def testSendmsgAncillaryGenerator(self):
3086        # Gather (empty) ancillary data from a generator.
3087        self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
3088
3089    def _testSendmsgAncillaryGenerator(self):
3090        self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
3091                         len(MSG))
3092
3093    def testSendmsgArray(self):
3094        # Send data from an array instead of the usual bytes object.
3095        self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
3096
3097    def _testSendmsgArray(self):
3098        self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
3099                         len(MSG))
3100
3101    def testSendmsgGather(self):
3102        # Send message data from more than one buffer (gather write).
3103        self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
3104
3105    def _testSendmsgGather(self):
3106        self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
3107
3108    def testSendmsgBadArgs(self):
3109        # Check that sendmsg() rejects invalid arguments.
3110        self.assertEqual(self.serv_sock.recv(1000), b"done")
3111
3112    def _testSendmsgBadArgs(self):
3113        self.assertRaises(TypeError, self.cli_sock.sendmsg)
3114        self.assertRaises(TypeError, self.sendmsgToServer,
3115                          b"not in an iterable")
3116        self.assertRaises(TypeError, self.sendmsgToServer,
3117                          object())
3118        self.assertRaises(TypeError, self.sendmsgToServer,
3119                          [object()])
3120        self.assertRaises(TypeError, self.sendmsgToServer,
3121                          [MSG, object()])
3122        self.assertRaises(TypeError, self.sendmsgToServer,
3123                          [MSG], object())
3124        self.assertRaises(TypeError, self.sendmsgToServer,
3125                          [MSG], [], object())
3126        self.assertRaises(TypeError, self.sendmsgToServer,
3127                          [MSG], [], 0, object())
3128        self.sendToServer(b"done")
3129
3130    def testSendmsgBadCmsg(self):
3131        # Check that invalid ancillary data items are rejected.
3132        self.assertEqual(self.serv_sock.recv(1000), b"done")
3133
3134    def _testSendmsgBadCmsg(self):
3135        self.assertRaises(TypeError, self.sendmsgToServer,
3136                          [MSG], [object()])
3137        self.assertRaises(TypeError, self.sendmsgToServer,
3138                          [MSG], [(object(), 0, b"data")])
3139        self.assertRaises(TypeError, self.sendmsgToServer,
3140                          [MSG], [(0, object(), b"data")])
3141        self.assertRaises(TypeError, self.sendmsgToServer,
3142                          [MSG], [(0, 0, object())])
3143        self.assertRaises(TypeError, self.sendmsgToServer,
3144                          [MSG], [(0, 0)])
3145        self.assertRaises(TypeError, self.sendmsgToServer,
3146                          [MSG], [(0, 0, b"data", 42)])
3147        self.sendToServer(b"done")
3148
3149    @requireAttrs(socket, "CMSG_SPACE")
3150    def testSendmsgBadMultiCmsg(self):
3151        # Check that invalid ancillary data items are rejected when
3152        # more than one item is present.
3153        self.assertEqual(self.serv_sock.recv(1000), b"done")
3154
3155    @testSendmsgBadMultiCmsg.client_skip
3156    def _testSendmsgBadMultiCmsg(self):
3157        self.assertRaises(TypeError, self.sendmsgToServer,
3158                          [MSG], [0, 0, b""])
3159        self.assertRaises(TypeError, self.sendmsgToServer,
3160                          [MSG], [(0, 0, b""), object()])
3161        self.sendToServer(b"done")
3162
3163    def testSendmsgExcessCmsgReject(self):
3164        # Check that sendmsg() rejects excess ancillary data items
3165        # when the number that can be sent is limited.
3166        self.assertEqual(self.serv_sock.recv(1000), b"done")
3167
3168    def _testSendmsgExcessCmsgReject(self):
3169        if not hasattr(socket, "CMSG_SPACE"):
3170            # Can only send one item
3171            with self.assertRaises(OSError) as cm:
3172                self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
3173            self.assertIsNone(cm.exception.errno)
3174        self.sendToServer(b"done")
3175
3176    def testSendmsgAfterClose(self):
3177        # Check that sendmsg() fails on a closed socket.
3178        pass
3179
3180    def _testSendmsgAfterClose(self):
3181        self.cli_sock.close()
3182        self.assertRaises(OSError, self.sendmsgToServer, [MSG])
3183
3184
3185class SendmsgStreamTests(SendmsgTests):
3186    # Tests for sendmsg() which require a stream socket and do not
3187    # involve recvmsg() or recvmsg_into().
3188
3189    def testSendmsgExplicitNoneAddr(self):
3190        # Check that peer address can be specified as None.
3191        self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
3192
3193    def _testSendmsgExplicitNoneAddr(self):
3194        self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
3195
3196    def testSendmsgTimeout(self):
3197        # Check that timeout works with sendmsg().
3198        self.assertEqual(self.serv_sock.recv(512), b"a"*512)
3199        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3200
3201    def _testSendmsgTimeout(self):
3202        try:
3203            self.cli_sock.settimeout(0.03)
3204            try:
3205                while True:
3206                    self.sendmsgToServer([b"a"*512])
3207            except TimeoutError:
3208                pass
3209            except OSError as exc:
3210                if exc.errno != errno.ENOMEM:
3211                    raise
3212                # bpo-33937 the test randomly fails on Travis CI with
3213                # "OSError: [Errno 12] Cannot allocate memory"
3214            else:
3215                self.fail("TimeoutError not raised")
3216        finally:
3217            self.misc_event.set()
3218
3219    # XXX: would be nice to have more tests for sendmsg flags argument.
3220
3221    # Linux supports MSG_DONTWAIT when sending, but in general, it
3222    # only works when receiving.  Could add other platforms if they
3223    # support it too.
3224    @skipWithClientIf(sys.platform not in {"linux", "android"},
3225                      "MSG_DONTWAIT not known to work on this platform when "
3226                      "sending")
3227    def testSendmsgDontWait(self):
3228        # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
3229        self.assertEqual(self.serv_sock.recv(512), b"a"*512)
3230        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3231
3232    @testSendmsgDontWait.client_skip
3233    def _testSendmsgDontWait(self):
3234        try:
3235            with self.assertRaises(OSError) as cm:
3236                while True:
3237                    self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
3238            # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
3239            # with "OSError: [Errno 12] Cannot allocate memory"
3240            self.assertIn(cm.exception.errno,
3241                          (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
3242        finally:
3243            self.misc_event.set()
3244
3245
3246class SendmsgConnectionlessTests(SendmsgTests):
3247    # Tests for sendmsg() which require a connectionless-mode
3248    # (e.g. datagram) socket, and do not involve recvmsg() or
3249    # recvmsg_into().
3250
3251    def testSendmsgNoDestAddr(self):
3252        # Check that sendmsg() fails when no destination address is
3253        # given for unconnected socket.
3254        pass
3255
3256    def _testSendmsgNoDestAddr(self):
3257        self.assertRaises(OSError, self.cli_sock.sendmsg,
3258                          [MSG])
3259        self.assertRaises(OSError, self.cli_sock.sendmsg,
3260                          [MSG], [], 0, None)
3261
3262
3263class RecvmsgGenericTests(SendrecvmsgBase):
3264    # Tests for recvmsg() which can also be emulated using
3265    # recvmsg_into(), and can use any socket type.
3266
3267    def testRecvmsg(self):
3268        # Receive a simple message with recvmsg[_into]().
3269        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3270        self.assertEqual(msg, MSG)
3271        self.checkRecvmsgAddress(addr, self.cli_addr)
3272        self.assertEqual(ancdata, [])
3273        self.checkFlags(flags, eor=True)
3274
3275    def _testRecvmsg(self):
3276        self.sendToServer(MSG)
3277
3278    def testRecvmsgExplicitDefaults(self):
3279        # Test recvmsg[_into]() with default arguments provided explicitly.
3280        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3281                                                   len(MSG), 0, 0)
3282        self.assertEqual(msg, MSG)
3283        self.checkRecvmsgAddress(addr, self.cli_addr)
3284        self.assertEqual(ancdata, [])
3285        self.checkFlags(flags, eor=True)
3286
3287    def _testRecvmsgExplicitDefaults(self):
3288        self.sendToServer(MSG)
3289
3290    def testRecvmsgShorter(self):
3291        # Receive a message smaller than buffer.
3292        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3293                                                   len(MSG) + 42)
3294        self.assertEqual(msg, MSG)
3295        self.checkRecvmsgAddress(addr, self.cli_addr)
3296        self.assertEqual(ancdata, [])
3297        self.checkFlags(flags, eor=True)
3298
3299    def _testRecvmsgShorter(self):
3300        self.sendToServer(MSG)
3301
3302    def testRecvmsgTrunc(self):
3303        # Receive part of message, check for truncation indicators.
3304        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3305                                                   len(MSG) - 3)
3306        self.assertEqual(msg, MSG[:-3])
3307        self.checkRecvmsgAddress(addr, self.cli_addr)
3308        self.assertEqual(ancdata, [])
3309        self.checkFlags(flags, eor=False)
3310
3311    def _testRecvmsgTrunc(self):
3312        self.sendToServer(MSG)
3313
3314    def testRecvmsgShortAncillaryBuf(self):
3315        # Test ancillary data buffer too small to hold any ancillary data.
3316        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3317                                                   len(MSG), 1)
3318        self.assertEqual(msg, MSG)
3319        self.checkRecvmsgAddress(addr, self.cli_addr)
3320        self.assertEqual(ancdata, [])
3321        self.checkFlags(flags, eor=True)
3322
3323    def _testRecvmsgShortAncillaryBuf(self):
3324        self.sendToServer(MSG)
3325
3326    def testRecvmsgLongAncillaryBuf(self):
3327        # Test large ancillary data buffer.
3328        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3329                                                   len(MSG), 10240)
3330        self.assertEqual(msg, MSG)
3331        self.checkRecvmsgAddress(addr, self.cli_addr)
3332        self.assertEqual(ancdata, [])
3333        self.checkFlags(flags, eor=True)
3334
3335    def _testRecvmsgLongAncillaryBuf(self):
3336        self.sendToServer(MSG)
3337
3338    def testRecvmsgAfterClose(self):
3339        # Check that recvmsg[_into]() fails on a closed socket.
3340        self.serv_sock.close()
3341        self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
3342
3343    def _testRecvmsgAfterClose(self):
3344        pass
3345
3346    def testRecvmsgTimeout(self):
3347        # Check that timeout works.
3348        try:
3349            self.serv_sock.settimeout(0.03)
3350            self.assertRaises(TimeoutError,
3351                              self.doRecvmsg, self.serv_sock, len(MSG))
3352        finally:
3353            self.misc_event.set()
3354
3355    def _testRecvmsgTimeout(self):
3356        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3357
3358    @requireAttrs(socket, "MSG_PEEK")
3359    def testRecvmsgPeek(self):
3360        # Check that MSG_PEEK in flags enables examination of pending
3361        # data without consuming it.
3362
3363        # Receive part of data with MSG_PEEK.
3364        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3365                                                   len(MSG) - 3, 0,
3366                                                   socket.MSG_PEEK)
3367        self.assertEqual(msg, MSG[:-3])
3368        self.checkRecvmsgAddress(addr, self.cli_addr)
3369        self.assertEqual(ancdata, [])
3370        # Ignoring MSG_TRUNC here (so this test is the same for stream
3371        # and datagram sockets).  Some wording in POSIX seems to
3372        # suggest that it needn't be set when peeking, but that may
3373        # just be a slip.
3374        self.checkFlags(flags, eor=False,
3375                        ignore=getattr(socket, "MSG_TRUNC", 0))
3376
3377        # Receive all data with MSG_PEEK.
3378        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3379                                                   len(MSG), 0,
3380                                                   socket.MSG_PEEK)
3381        self.assertEqual(msg, MSG)
3382        self.checkRecvmsgAddress(addr, self.cli_addr)
3383        self.assertEqual(ancdata, [])
3384        self.checkFlags(flags, eor=True)
3385
3386        # Check that the same data can still be received normally.
3387        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3388        self.assertEqual(msg, MSG)
3389        self.checkRecvmsgAddress(addr, self.cli_addr)
3390        self.assertEqual(ancdata, [])
3391        self.checkFlags(flags, eor=True)
3392
3393    @testRecvmsgPeek.client_skip
3394    def _testRecvmsgPeek(self):
3395        self.sendToServer(MSG)
3396
3397    @requireAttrs(socket.socket, "sendmsg")
3398    def testRecvmsgFromSendmsg(self):
3399        # Test receiving with recvmsg[_into]() when message is sent
3400        # using sendmsg().
3401        self.serv_sock.settimeout(self.fail_timeout)
3402        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3403        self.assertEqual(msg, MSG)
3404        self.checkRecvmsgAddress(addr, self.cli_addr)
3405        self.assertEqual(ancdata, [])
3406        self.checkFlags(flags, eor=True)
3407
3408    @testRecvmsgFromSendmsg.client_skip
3409    def _testRecvmsgFromSendmsg(self):
3410        self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
3411
3412
3413class RecvmsgGenericStreamTests(RecvmsgGenericTests):
3414    # Tests which require a stream socket and can use either recvmsg()
3415    # or recvmsg_into().
3416
3417    def testRecvmsgEOF(self):
3418        # Receive end-of-stream indicator (b"", peer socket closed).
3419        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3420        self.assertEqual(msg, b"")
3421        self.checkRecvmsgAddress(addr, self.cli_addr)
3422        self.assertEqual(ancdata, [])
3423        self.checkFlags(flags, eor=None) # Might not have end-of-record marker
3424
3425    def _testRecvmsgEOF(self):
3426        self.cli_sock.close()
3427
3428    def testRecvmsgOverflow(self):
3429        # Receive a message in more than one chunk.
3430        seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3431                                                    len(MSG) - 3)
3432        self.checkRecvmsgAddress(addr, self.cli_addr)
3433        self.assertEqual(ancdata, [])
3434        self.checkFlags(flags, eor=False)
3435
3436        seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3437        self.checkRecvmsgAddress(addr, self.cli_addr)
3438        self.assertEqual(ancdata, [])
3439        self.checkFlags(flags, eor=True)
3440
3441        msg = seg1 + seg2
3442        self.assertEqual(msg, MSG)
3443
3444    def _testRecvmsgOverflow(self):
3445        self.sendToServer(MSG)
3446
3447
3448class RecvmsgTests(RecvmsgGenericTests):
3449    # Tests for recvmsg() which can use any socket type.
3450
3451    def testRecvmsgBadArgs(self):
3452        # Check that recvmsg() rejects invalid arguments.
3453        self.assertRaises(TypeError, self.serv_sock.recvmsg)
3454        self.assertRaises(ValueError, self.serv_sock.recvmsg,
3455                          -1, 0, 0)
3456        self.assertRaises(ValueError, self.serv_sock.recvmsg,
3457                          len(MSG), -1, 0)
3458        self.assertRaises(TypeError, self.serv_sock.recvmsg,
3459                          [bytearray(10)], 0, 0)
3460        self.assertRaises(TypeError, self.serv_sock.recvmsg,
3461                          object(), 0, 0)
3462        self.assertRaises(TypeError, self.serv_sock.recvmsg,
3463                          len(MSG), object(), 0)
3464        self.assertRaises(TypeError, self.serv_sock.recvmsg,
3465                          len(MSG), 0, object())
3466
3467        msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3468        self.assertEqual(msg, MSG)
3469        self.checkRecvmsgAddress(addr, self.cli_addr)
3470        self.assertEqual(ancdata, [])
3471        self.checkFlags(flags, eor=True)
3472
3473    def _testRecvmsgBadArgs(self):
3474        self.sendToServer(MSG)
3475
3476
3477class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3478    # Tests for recvmsg_into() which can use any socket type.
3479
3480    def testRecvmsgIntoBadArgs(self):
3481        # Check that recvmsg_into() rejects invalid arguments.
3482        buf = bytearray(len(MSG))
3483        self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3484        self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3485                          len(MSG), 0, 0)
3486        self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3487                          buf, 0, 0)
3488        self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3489                          [object()], 0, 0)
3490        self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3491                          [b"I'm not writable"], 0, 0)
3492        self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3493                          [buf, object()], 0, 0)
3494        self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3495                          [buf], -1, 0)
3496        self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3497                          [buf], object(), 0)
3498        self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3499                          [buf], 0, object())
3500
3501        nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3502        self.assertEqual(nbytes, len(MSG))
3503        self.assertEqual(buf, bytearray(MSG))
3504        self.checkRecvmsgAddress(addr, self.cli_addr)
3505        self.assertEqual(ancdata, [])
3506        self.checkFlags(flags, eor=True)
3507
3508    def _testRecvmsgIntoBadArgs(self):
3509        self.sendToServer(MSG)
3510
3511    def testRecvmsgIntoGenerator(self):
3512        # Receive into buffer obtained from a generator (not a sequence).
3513        buf = bytearray(len(MSG))
3514        nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3515            (o for o in [buf]))
3516        self.assertEqual(nbytes, len(MSG))
3517        self.assertEqual(buf, bytearray(MSG))
3518        self.checkRecvmsgAddress(addr, self.cli_addr)
3519        self.assertEqual(ancdata, [])
3520        self.checkFlags(flags, eor=True)
3521
3522    def _testRecvmsgIntoGenerator(self):
3523        self.sendToServer(MSG)
3524
3525    def testRecvmsgIntoArray(self):
3526        # Receive into an array rather than the usual bytearray.
3527        buf = array.array("B", [0] * len(MSG))
3528        nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3529        self.assertEqual(nbytes, len(MSG))
3530        self.assertEqual(buf.tobytes(), MSG)
3531        self.checkRecvmsgAddress(addr, self.cli_addr)
3532        self.assertEqual(ancdata, [])
3533        self.checkFlags(flags, eor=True)
3534
3535    def _testRecvmsgIntoArray(self):
3536        self.sendToServer(MSG)
3537
3538    def testRecvmsgIntoScatter(self):
3539        # Receive into multiple buffers (scatter write).
3540        b1 = bytearray(b"----")
3541        b2 = bytearray(b"0123456789")
3542        b3 = bytearray(b"--------------")
3543        nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3544            [b1, memoryview(b2)[2:9], b3])
3545        self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3546        self.assertEqual(b1, bytearray(b"Mary"))
3547        self.assertEqual(b2, bytearray(b"01 had a 9"))
3548        self.assertEqual(b3, bytearray(b"little lamb---"))
3549        self.checkRecvmsgAddress(addr, self.cli_addr)
3550        self.assertEqual(ancdata, [])
3551        self.checkFlags(flags, eor=True)
3552
3553    def _testRecvmsgIntoScatter(self):
3554        self.sendToServer(b"Mary had a little lamb")
3555
3556
3557class CmsgMacroTests(unittest.TestCase):
3558    # Test the functions CMSG_LEN() and CMSG_SPACE().  Tests
3559    # assumptions used by sendmsg() and recvmsg[_into](), which share
3560    # code with these functions.
3561
3562    # Match the definition in socketmodule.c
3563    try:
3564        import _testcapi
3565    except ImportError:
3566        socklen_t_limit = 0x7fffffff
3567    else:
3568        socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
3569
3570    @requireAttrs(socket, "CMSG_LEN")
3571    def testCMSG_LEN(self):
3572        # Test CMSG_LEN() with various valid and invalid values,
3573        # checking the assumptions used by recvmsg() and sendmsg().
3574        toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3575        values = list(range(257)) + list(range(toobig - 257, toobig))
3576
3577        # struct cmsghdr has at least three members, two of which are ints
3578        self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3579        for n in values:
3580            ret = socket.CMSG_LEN(n)
3581            # This is how recvmsg() calculates the data size
3582            self.assertEqual(ret - socket.CMSG_LEN(0), n)
3583            self.assertLessEqual(ret, self.socklen_t_limit)
3584
3585        self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3586        # sendmsg() shares code with these functions, and requires
3587        # that it reject values over the limit.
3588        self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3589        self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3590
3591    @requireAttrs(socket, "CMSG_SPACE")
3592    def testCMSG_SPACE(self):
3593        # Test CMSG_SPACE() with various valid and invalid values,
3594        # checking the assumptions used by sendmsg().
3595        toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3596        values = list(range(257)) + list(range(toobig - 257, toobig))
3597
3598        last = socket.CMSG_SPACE(0)
3599        # struct cmsghdr has at least three members, two of which are ints
3600        self.assertGreater(last, array.array("i").itemsize * 2)
3601        for n in values:
3602            ret = socket.CMSG_SPACE(n)
3603            self.assertGreaterEqual(ret, last)
3604            self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3605            self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3606            self.assertLessEqual(ret, self.socklen_t_limit)
3607            last = ret
3608
3609        self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3610        # sendmsg() shares code with these functions, and requires
3611        # that it reject values over the limit.
3612        self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3613        self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3614
3615
3616class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3617    # Tests for file descriptor passing on Unix-domain sockets.
3618
3619    # Invalid file descriptor value that's unlikely to evaluate to a
3620    # real FD even if one of its bytes is replaced with a different
3621    # value (which shouldn't actually happen).
3622    badfd = -0x5555
3623
3624    def newFDs(self, n):
3625        # Return a list of n file descriptors for newly-created files
3626        # containing their list indices as ASCII numbers.
3627        fds = []
3628        for i in range(n):
3629            fd, path = tempfile.mkstemp()
3630            self.addCleanup(os.unlink, path)
3631            self.addCleanup(os.close, fd)
3632            os.write(fd, str(i).encode())
3633            fds.append(fd)
3634        return fds
3635
3636    def checkFDs(self, fds):
3637        # Check that the file descriptors in the given list contain
3638        # their correct list indices as ASCII numbers.
3639        for n, fd in enumerate(fds):
3640            os.lseek(fd, 0, os.SEEK_SET)
3641            self.assertEqual(os.read(fd, 1024), str(n).encode())
3642
3643    def registerRecvmsgResult(self, result):
3644        self.addCleanup(self.closeRecvmsgFDs, result)
3645
3646    def closeRecvmsgFDs(self, recvmsg_result):
3647        # Close all file descriptors specified in the ancillary data
3648        # of the given return value from recvmsg() or recvmsg_into().
3649        for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3650            if (cmsg_level == socket.SOL_SOCKET and
3651                    cmsg_type == socket.SCM_RIGHTS):
3652                fds = array.array("i")
3653                fds.frombytes(cmsg_data[:
3654                        len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3655                for fd in fds:
3656                    os.close(fd)
3657
3658    def createAndSendFDs(self, n):
3659        # Send n new file descriptors created by newFDs() to the
3660        # server, with the constant MSG as the non-ancillary data.
3661        self.assertEqual(
3662            self.sendmsgToServer([MSG],
3663                                 [(socket.SOL_SOCKET,
3664                                   socket.SCM_RIGHTS,
3665                                   array.array("i", self.newFDs(n)))]),
3666            len(MSG))
3667
3668    def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3669        # Check that constant MSG was received with numfds file
3670        # descriptors in a maximum of maxcmsgs control messages (which
3671        # must contain only complete integers).  By default, check
3672        # that MSG_CTRUNC is unset, but ignore any flags in
3673        # ignoreflags.
3674        msg, ancdata, flags, addr = result
3675        self.assertEqual(msg, MSG)
3676        self.checkRecvmsgAddress(addr, self.cli_addr)
3677        self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3678                        ignore=ignoreflags)
3679
3680        self.assertIsInstance(ancdata, list)
3681        self.assertLessEqual(len(ancdata), maxcmsgs)
3682        fds = array.array("i")
3683        for item in ancdata:
3684            self.assertIsInstance(item, tuple)
3685            cmsg_level, cmsg_type, cmsg_data = item
3686            self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3687            self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3688            self.assertIsInstance(cmsg_data, bytes)
3689            self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
3690            fds.frombytes(cmsg_data)
3691
3692        self.assertEqual(len(fds), numfds)
3693        self.checkFDs(fds)
3694
3695    def testFDPassSimple(self):
3696        # Pass a single FD (array read from bytes object).
3697        self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3698                                               len(MSG), 10240))
3699
3700    def _testFDPassSimple(self):
3701        self.assertEqual(
3702            self.sendmsgToServer(
3703                [MSG],
3704                [(socket.SOL_SOCKET,
3705                  socket.SCM_RIGHTS,
3706                  array.array("i", self.newFDs(1)).tobytes())]),
3707            len(MSG))
3708
3709    def testMultipleFDPass(self):
3710        # Pass multiple FDs in a single array.
3711        self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3712                                               len(MSG), 10240))
3713
3714    def _testMultipleFDPass(self):
3715        self.createAndSendFDs(4)
3716
3717    @requireAttrs(socket, "CMSG_SPACE")
3718    def testFDPassCMSG_SPACE(self):
3719        # Test using CMSG_SPACE() to calculate ancillary buffer size.
3720        self.checkRecvmsgFDs(
3721            4, self.doRecvmsg(self.serv_sock, len(MSG),
3722                              socket.CMSG_SPACE(4 * SIZEOF_INT)))
3723
3724    @testFDPassCMSG_SPACE.client_skip
3725    def _testFDPassCMSG_SPACE(self):
3726        self.createAndSendFDs(4)
3727
3728    def testFDPassCMSG_LEN(self):
3729        # Test using CMSG_LEN() to calculate ancillary buffer size.
3730        self.checkRecvmsgFDs(1,
3731                             self.doRecvmsg(self.serv_sock, len(MSG),
3732                                            socket.CMSG_LEN(4 * SIZEOF_INT)),
3733                             # RFC 3542 says implementations may set
3734                             # MSG_CTRUNC if there isn't enough space
3735                             # for trailing padding.
3736                             ignoreflags=socket.MSG_CTRUNC)
3737
3738    def _testFDPassCMSG_LEN(self):
3739        self.createAndSendFDs(1)
3740
3741    @unittest.skipIf(is_apple, "skipping, see issue #12958")
3742    @unittest.skipIf(AIX, "skipping, see issue #22397")
3743    @requireAttrs(socket, "CMSG_SPACE")
3744    def testFDPassSeparate(self):
3745        # Pass two FDs in two separate arrays.  Arrays may be combined
3746        # into a single control message by the OS.
3747        self.checkRecvmsgFDs(2,
3748                             self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3749                             maxcmsgs=2)
3750
3751    @testFDPassSeparate.client_skip
3752    @unittest.skipIf(is_apple, "skipping, see issue #12958")
3753    @unittest.skipIf(AIX, "skipping, see issue #22397")
3754    def _testFDPassSeparate(self):
3755        fd0, fd1 = self.newFDs(2)
3756        self.assertEqual(
3757            self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3758                                          socket.SCM_RIGHTS,
3759                                          array.array("i", [fd0])),
3760                                         (socket.SOL_SOCKET,
3761                                          socket.SCM_RIGHTS,
3762                                          array.array("i", [fd1]))]),
3763            len(MSG))
3764
3765    @unittest.skipIf(is_apple, "skipping, see issue #12958")
3766    @unittest.skipIf(AIX, "skipping, see issue #22397")
3767    @requireAttrs(socket, "CMSG_SPACE")
3768    def testFDPassSeparateMinSpace(self):
3769        # Pass two FDs in two separate arrays, receiving them into the
3770        # minimum space for two arrays.
3771        num_fds = 2
3772        self.checkRecvmsgFDs(num_fds,
3773                             self.doRecvmsg(self.serv_sock, len(MSG),
3774                                            socket.CMSG_SPACE(SIZEOF_INT) +
3775                                            socket.CMSG_LEN(SIZEOF_INT * num_fds)),
3776                             maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3777
3778    @testFDPassSeparateMinSpace.client_skip
3779    @unittest.skipIf(is_apple, "skipping, see issue #12958")
3780    @unittest.skipIf(AIX, "skipping, see issue #22397")
3781    def _testFDPassSeparateMinSpace(self):
3782        fd0, fd1 = self.newFDs(2)
3783        self.assertEqual(
3784            self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3785                                          socket.SCM_RIGHTS,
3786                                          array.array("i", [fd0])),
3787                                         (socket.SOL_SOCKET,
3788                                          socket.SCM_RIGHTS,
3789                                          array.array("i", [fd1]))]),
3790            len(MSG))
3791
3792    def sendAncillaryIfPossible(self, msg, ancdata):
3793        # Try to send msg and ancdata to server, but if the system
3794        # call fails, just send msg with no ancillary data.
3795        try:
3796            nbytes = self.sendmsgToServer([msg], ancdata)
3797        except OSError as e:
3798            # Check that it was the system call that failed
3799            self.assertIsInstance(e.errno, int)
3800            nbytes = self.sendmsgToServer([msg])
3801        self.assertEqual(nbytes, len(msg))
3802
3803    @unittest.skipIf(is_apple, "skipping, see issue #12958")
3804    def testFDPassEmpty(self):
3805        # Try to pass an empty FD array.  Can receive either no array
3806        # or an empty array.
3807        self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3808                                               len(MSG), 10240),
3809                             ignoreflags=socket.MSG_CTRUNC)
3810
3811    def _testFDPassEmpty(self):
3812        self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3813                                            socket.SCM_RIGHTS,
3814                                            b"")])
3815
3816    def testFDPassPartialInt(self):
3817        # Try to pass a truncated FD array.
3818        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3819                                                   len(MSG), 10240)
3820        self.assertEqual(msg, MSG)
3821        self.checkRecvmsgAddress(addr, self.cli_addr)
3822        self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3823        self.assertLessEqual(len(ancdata), 1)
3824        for cmsg_level, cmsg_type, cmsg_data in ancdata:
3825            self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3826            self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3827            self.assertLess(len(cmsg_data), SIZEOF_INT)
3828
3829    def _testFDPassPartialInt(self):
3830        self.sendAncillaryIfPossible(
3831            MSG,
3832            [(socket.SOL_SOCKET,
3833              socket.SCM_RIGHTS,
3834              array.array("i", [self.badfd]).tobytes()[:-1])])
3835
3836    @requireAttrs(socket, "CMSG_SPACE")
3837    def testFDPassPartialIntInMiddle(self):
3838        # Try to pass two FD arrays, the first of which is truncated.
3839        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3840                                                   len(MSG), 10240)
3841        self.assertEqual(msg, MSG)
3842        self.checkRecvmsgAddress(addr, self.cli_addr)
3843        self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3844        self.assertLessEqual(len(ancdata), 2)
3845        fds = array.array("i")
3846        # Arrays may have been combined in a single control message
3847        for cmsg_level, cmsg_type, cmsg_data in ancdata:
3848            self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3849            self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3850            fds.frombytes(cmsg_data[:
3851                    len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3852        self.assertLessEqual(len(fds), 2)
3853        self.checkFDs(fds)
3854
3855    @testFDPassPartialIntInMiddle.client_skip
3856    def _testFDPassPartialIntInMiddle(self):
3857        fd0, fd1 = self.newFDs(2)
3858        self.sendAncillaryIfPossible(
3859            MSG,
3860            [(socket.SOL_SOCKET,
3861              socket.SCM_RIGHTS,
3862              array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
3863             (socket.SOL_SOCKET,
3864              socket.SCM_RIGHTS,
3865              array.array("i", [fd1]))])
3866
3867    def checkTruncatedHeader(self, result, ignoreflags=0):
3868        # Check that no ancillary data items are returned when data is
3869        # truncated inside the cmsghdr structure.
3870        msg, ancdata, flags, addr = result
3871        self.assertEqual(msg, MSG)
3872        self.checkRecvmsgAddress(addr, self.cli_addr)
3873        self.assertEqual(ancdata, [])
3874        self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3875                        ignore=ignoreflags)
3876
3877    @skipForRefleakHuntinIf(sys.platform == "darwin", "#80931")
3878    def testCmsgTruncNoBufSize(self):
3879        # Check that no ancillary data is received when no buffer size
3880        # is specified.
3881        self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3882                                  # BSD seems to set MSG_CTRUNC only
3883                                  # if an item has been partially
3884                                  # received.
3885                                  ignoreflags=socket.MSG_CTRUNC)
3886
3887    @testCmsgTruncNoBufSize.client_skip
3888    def _testCmsgTruncNoBufSize(self):
3889        self.createAndSendFDs(1)
3890
3891    @skipForRefleakHuntinIf(sys.platform == "darwin", "#80931")
3892    def testCmsgTrunc0(self):
3893        # Check that no ancillary data is received when buffer size is 0.
3894        self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3895                                  ignoreflags=socket.MSG_CTRUNC)
3896
3897    @testCmsgTrunc0.client_skip
3898    def _testCmsgTrunc0(self):
3899        self.createAndSendFDs(1)
3900
3901    # Check that no ancillary data is returned for various non-zero
3902    # (but still too small) buffer sizes.
3903
3904    @skipForRefleakHuntinIf(sys.platform == "darwin", "#80931")
3905    def testCmsgTrunc1(self):
3906        self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3907
3908    @testCmsgTrunc1.client_skip
3909    def _testCmsgTrunc1(self):
3910        self.createAndSendFDs(1)
3911
3912    @skipForRefleakHuntinIf(sys.platform == "darwin", "#80931")
3913    def testCmsgTrunc2Int(self):
3914        # The cmsghdr structure has at least three members, two of
3915        # which are ints, so we still shouldn't see any ancillary
3916        # data.
3917        self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3918                                                 SIZEOF_INT * 2))
3919
3920    @testCmsgTrunc2Int.client_skip
3921    def _testCmsgTrunc2Int(self):
3922        self.createAndSendFDs(1)
3923
3924    @skipForRefleakHuntinIf(sys.platform == "darwin", "#80931")
3925    def testCmsgTruncLen0Minus1(self):
3926        self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3927                                                 socket.CMSG_LEN(0) - 1))
3928
3929    @testCmsgTruncLen0Minus1.client_skip
3930    def _testCmsgTruncLen0Minus1(self):
3931        self.createAndSendFDs(1)
3932
3933    # The following tests try to truncate the control message in the
3934    # middle of the FD array.
3935
3936    def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3937        # Check that file descriptor data is truncated to between
3938        # mindata and maxdata bytes when received with buffer size
3939        # ancbuf, and that any complete file descriptor numbers are
3940        # valid.
3941        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3942                                                   len(MSG), ancbuf)
3943        self.assertEqual(msg, MSG)
3944        self.checkRecvmsgAddress(addr, self.cli_addr)
3945        self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3946
3947        if mindata == 0 and ancdata == []:
3948            return
3949        self.assertEqual(len(ancdata), 1)
3950        cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3951        self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3952        self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3953        self.assertGreaterEqual(len(cmsg_data), mindata)
3954        self.assertLessEqual(len(cmsg_data), maxdata)
3955        fds = array.array("i")
3956        fds.frombytes(cmsg_data[:
3957                len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3958        self.checkFDs(fds)
3959
3960    @skipForRefleakHuntinIf(sys.platform == "darwin", "#80931")
3961    def testCmsgTruncLen0(self):
3962        self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3963
3964    @testCmsgTruncLen0.client_skip
3965    def _testCmsgTruncLen0(self):
3966        self.createAndSendFDs(1)
3967
3968    @skipForRefleakHuntinIf(sys.platform == "darwin", "#80931")
3969    def testCmsgTruncLen0Plus1(self):
3970        self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3971
3972    @testCmsgTruncLen0Plus1.client_skip
3973    def _testCmsgTruncLen0Plus1(self):
3974        self.createAndSendFDs(2)
3975
3976    @skipForRefleakHuntinIf(sys.platform == "darwin", "#80931")
3977    def testCmsgTruncLen1(self):
3978        self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3979                                 maxdata=SIZEOF_INT)
3980
3981    @testCmsgTruncLen1.client_skip
3982    def _testCmsgTruncLen1(self):
3983        self.createAndSendFDs(2)
3984
3985
3986    @skipForRefleakHuntinIf(sys.platform == "darwin", "#80931")
3987    def testCmsgTruncLen2Minus1(self):
3988        self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3989                                 maxdata=(2 * SIZEOF_INT) - 1)
3990
3991    @testCmsgTruncLen2Minus1.client_skip
3992    def _testCmsgTruncLen2Minus1(self):
3993        self.createAndSendFDs(2)
3994
3995
3996class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3997    # Test sendmsg() and recvmsg[_into]() using the ancillary data
3998    # features of the RFC 3542 Advanced Sockets API for IPv6.
3999    # Currently we can only handle certain data items (e.g. traffic
4000    # class, hop limit, MTU discovery and fragmentation settings)
4001    # without resorting to unportable means such as the struct module,
4002    # but the tests here are aimed at testing the ancillary data
4003    # handling in sendmsg() and recvmsg() rather than the IPv6 API
4004    # itself.
4005
4006    # Test value to use when setting hop limit of packet
4007    hop_limit = 2
4008
4009    # Test value to use when setting traffic class of packet.
4010    # -1 means "use kernel default".
4011    traffic_class = -1
4012
4013    def ancillaryMapping(self, ancdata):
4014        # Given ancillary data list ancdata, return a mapping from
4015        # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
4016        # Check that no (level, type) pair appears more than once.
4017        d = {}
4018        for cmsg_level, cmsg_type, cmsg_data in ancdata:
4019            self.assertNotIn((cmsg_level, cmsg_type), d)
4020            d[(cmsg_level, cmsg_type)] = cmsg_data
4021        return d
4022
4023    def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
4024        # Receive hop limit into ancbufsize bytes of ancillary data
4025        # space.  Check that data is MSG, ancillary data is not
4026        # truncated (but ignore any flags in ignoreflags), and hop
4027        # limit is between 0 and maxhop inclusive.
4028        self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4029                                  socket.IPV6_RECVHOPLIMIT, 1)
4030        self.misc_event.set()
4031        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
4032                                                   len(MSG), ancbufsize)
4033
4034        self.assertEqual(msg, MSG)
4035        self.checkRecvmsgAddress(addr, self.cli_addr)
4036        self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
4037                        ignore=ignoreflags)
4038
4039        self.assertEqual(len(ancdata), 1)
4040        self.assertIsInstance(ancdata[0], tuple)
4041        cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4042        self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4043        self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
4044        self.assertIsInstance(cmsg_data, bytes)
4045        self.assertEqual(len(cmsg_data), SIZEOF_INT)
4046        a = array.array("i")
4047        a.frombytes(cmsg_data)
4048        self.assertGreaterEqual(a[0], 0)
4049        self.assertLessEqual(a[0], maxhop)
4050
4051    @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4052    def testRecvHopLimit(self):
4053        # Test receiving the packet hop limit as ancillary data.
4054        self.checkHopLimit(ancbufsize=10240)
4055
4056    @testRecvHopLimit.client_skip
4057    def _testRecvHopLimit(self):
4058        # Need to wait until server has asked to receive ancillary
4059        # data, as implementations are not required to buffer it
4060        # otherwise.
4061        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4062        self.sendToServer(MSG)
4063
4064    @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4065    def testRecvHopLimitCMSG_SPACE(self):
4066        # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
4067        self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
4068
4069    @testRecvHopLimitCMSG_SPACE.client_skip
4070    def _testRecvHopLimitCMSG_SPACE(self):
4071        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4072        self.sendToServer(MSG)
4073
4074    # Could test receiving into buffer sized using CMSG_LEN, but RFC
4075    # 3542 says portable applications must provide space for trailing
4076    # padding.  Implementations may set MSG_CTRUNC if there isn't
4077    # enough space for the padding.
4078
4079    @requireAttrs(socket.socket, "sendmsg")
4080    @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4081    def testSetHopLimit(self):
4082        # Test setting hop limit on outgoing packet and receiving it
4083        # at the other end.
4084        self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
4085
4086    @testSetHopLimit.client_skip
4087    def _testSetHopLimit(self):
4088        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4089        self.assertEqual(
4090            self.sendmsgToServer([MSG],
4091                                 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
4092                                   array.array("i", [self.hop_limit]))]),
4093            len(MSG))
4094
4095    def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
4096                                     ignoreflags=0):
4097        # Receive traffic class and hop limit into ancbufsize bytes of
4098        # ancillary data space.  Check that data is MSG, ancillary
4099        # data is not truncated (but ignore any flags in ignoreflags),
4100        # and traffic class and hop limit are in range (hop limit no
4101        # more than maxhop).
4102        self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4103                                  socket.IPV6_RECVHOPLIMIT, 1)
4104        self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4105                                  socket.IPV6_RECVTCLASS, 1)
4106        self.misc_event.set()
4107        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
4108                                                   len(MSG), ancbufsize)
4109
4110        self.assertEqual(msg, MSG)
4111        self.checkRecvmsgAddress(addr, self.cli_addr)
4112        self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
4113                        ignore=ignoreflags)
4114        self.assertEqual(len(ancdata), 2)
4115        ancmap = self.ancillaryMapping(ancdata)
4116
4117        tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
4118        self.assertEqual(len(tcdata), SIZEOF_INT)
4119        a = array.array("i")
4120        a.frombytes(tcdata)
4121        self.assertGreaterEqual(a[0], 0)
4122        self.assertLessEqual(a[0], 255)
4123
4124        hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
4125        self.assertEqual(len(hldata), SIZEOF_INT)
4126        a = array.array("i")
4127        a.frombytes(hldata)
4128        self.assertGreaterEqual(a[0], 0)
4129        self.assertLessEqual(a[0], maxhop)
4130
4131    @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4132                  "IPV6_RECVTCLASS", "IPV6_TCLASS")
4133    def testRecvTrafficClassAndHopLimit(self):
4134        # Test receiving traffic class and hop limit as ancillary data.
4135        self.checkTrafficClassAndHopLimit(ancbufsize=10240)
4136
4137    @testRecvTrafficClassAndHopLimit.client_skip
4138    def _testRecvTrafficClassAndHopLimit(self):
4139        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4140        self.sendToServer(MSG)
4141
4142    @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4143                  "IPV6_RECVTCLASS", "IPV6_TCLASS")
4144    def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
4145        # Test receiving traffic class and hop limit, using
4146        # CMSG_SPACE() to calculate buffer size.
4147        self.checkTrafficClassAndHopLimit(
4148            ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
4149
4150    @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
4151    def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
4152        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4153        self.sendToServer(MSG)
4154
4155    @requireAttrs(socket.socket, "sendmsg")
4156    @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4157                  "IPV6_RECVTCLASS", "IPV6_TCLASS")
4158    def testSetTrafficClassAndHopLimit(self):
4159        # Test setting traffic class and hop limit on outgoing packet,
4160        # and receiving them at the other end.
4161        self.checkTrafficClassAndHopLimit(ancbufsize=10240,
4162                                          maxhop=self.hop_limit)
4163
4164    @testSetTrafficClassAndHopLimit.client_skip
4165    def _testSetTrafficClassAndHopLimit(self):
4166        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4167        self.assertEqual(
4168            self.sendmsgToServer([MSG],
4169                                 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
4170                                   array.array("i", [self.traffic_class])),
4171                                  (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
4172                                   array.array("i", [self.hop_limit]))]),
4173            len(MSG))
4174
4175    @requireAttrs(socket.socket, "sendmsg")
4176    @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4177                  "IPV6_RECVTCLASS", "IPV6_TCLASS")
4178    def testOddCmsgSize(self):
4179        # Try to send ancillary data with first item one byte too
4180        # long.  Fall back to sending with correct size if this fails,
4181        # and check that second item was handled correctly.
4182        self.checkTrafficClassAndHopLimit(ancbufsize=10240,
4183                                          maxhop=self.hop_limit)
4184
4185    @testOddCmsgSize.client_skip
4186    def _testOddCmsgSize(self):
4187        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4188        try:
4189            nbytes = self.sendmsgToServer(
4190                [MSG],
4191                [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
4192                  array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
4193                 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
4194                  array.array("i", [self.hop_limit]))])
4195        except OSError as e:
4196            self.assertIsInstance(e.errno, int)
4197            nbytes = self.sendmsgToServer(
4198                [MSG],
4199                [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
4200                  array.array("i", [self.traffic_class])),
4201                 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
4202                  array.array("i", [self.hop_limit]))])
4203            self.assertEqual(nbytes, len(MSG))
4204
4205    # Tests for proper handling of truncated ancillary data
4206
4207    def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
4208        # Receive hop limit into ancbufsize bytes of ancillary data
4209        # space, which should be too small to contain the ancillary
4210        # data header (if ancbufsize is None, pass no second argument
4211        # to recvmsg()).  Check that data is MSG, MSG_CTRUNC is set
4212        # (unless included in ignoreflags), and no ancillary data is
4213        # returned.
4214        self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4215                                  socket.IPV6_RECVHOPLIMIT, 1)
4216        self.misc_event.set()
4217        args = () if ancbufsize is None else (ancbufsize,)
4218        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
4219                                                   len(MSG), *args)
4220
4221        self.assertEqual(msg, MSG)
4222        self.checkRecvmsgAddress(addr, self.cli_addr)
4223        self.assertEqual(ancdata, [])
4224        self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
4225                        ignore=ignoreflags)
4226
4227    @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4228    def testCmsgTruncNoBufSize(self):
4229        # Check that no ancillary data is received when no ancillary
4230        # buffer size is provided.
4231        self.checkHopLimitTruncatedHeader(ancbufsize=None,
4232                                          # BSD seems to set
4233                                          # MSG_CTRUNC only if an item
4234                                          # has been partially
4235                                          # received.
4236                                          ignoreflags=socket.MSG_CTRUNC)
4237
4238    @testCmsgTruncNoBufSize.client_skip
4239    def _testCmsgTruncNoBufSize(self):
4240        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4241        self.sendToServer(MSG)
4242
4243    @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4244    def testSingleCmsgTrunc0(self):
4245        # Check that no ancillary data is received when ancillary
4246        # buffer size is zero.
4247        self.checkHopLimitTruncatedHeader(ancbufsize=0,
4248                                          ignoreflags=socket.MSG_CTRUNC)
4249
4250    @testSingleCmsgTrunc0.client_skip
4251    def _testSingleCmsgTrunc0(self):
4252        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4253        self.sendToServer(MSG)
4254
4255    # Check that no ancillary data is returned for various non-zero
4256    # (but still too small) buffer sizes.
4257
4258    @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4259    def testSingleCmsgTrunc1(self):
4260        self.checkHopLimitTruncatedHeader(ancbufsize=1)
4261
4262    @testSingleCmsgTrunc1.client_skip
4263    def _testSingleCmsgTrunc1(self):
4264        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4265        self.sendToServer(MSG)
4266
4267    @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4268    def testSingleCmsgTrunc2Int(self):
4269        self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
4270
4271    @testSingleCmsgTrunc2Int.client_skip
4272    def _testSingleCmsgTrunc2Int(self):
4273        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4274        self.sendToServer(MSG)
4275
4276    @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4277    def testSingleCmsgTruncLen0Minus1(self):
4278        self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
4279
4280    @testSingleCmsgTruncLen0Minus1.client_skip
4281    def _testSingleCmsgTruncLen0Minus1(self):
4282        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4283        self.sendToServer(MSG)
4284
4285    @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4286    def testSingleCmsgTruncInData(self):
4287        # Test truncation of a control message inside its associated
4288        # data.  The message may be returned with its data truncated,
4289        # or not returned at all.
4290        self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4291                                  socket.IPV6_RECVHOPLIMIT, 1)
4292        self.misc_event.set()
4293        msg, ancdata, flags, addr = self.doRecvmsg(
4294            self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
4295
4296        self.assertEqual(msg, MSG)
4297        self.checkRecvmsgAddress(addr, self.cli_addr)
4298        self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4299
4300        self.assertLessEqual(len(ancdata), 1)
4301        if ancdata:
4302            cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4303            self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4304            self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
4305            self.assertLess(len(cmsg_data), SIZEOF_INT)
4306
4307    @testSingleCmsgTruncInData.client_skip
4308    def _testSingleCmsgTruncInData(self):
4309        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4310        self.sendToServer(MSG)
4311
4312    def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
4313        # Receive traffic class and hop limit into ancbufsize bytes of
4314        # ancillary data space, which should be large enough to
4315        # contain the first item, but too small to contain the header
4316        # of the second.  Check that data is MSG, MSG_CTRUNC is set
4317        # (unless included in ignoreflags), and only one ancillary
4318        # data item is returned.
4319        self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4320                                  socket.IPV6_RECVHOPLIMIT, 1)
4321        self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4322                                  socket.IPV6_RECVTCLASS, 1)
4323        self.misc_event.set()
4324        msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
4325                                                   len(MSG), ancbufsize)
4326
4327        self.assertEqual(msg, MSG)
4328        self.checkRecvmsgAddress(addr, self.cli_addr)
4329        self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
4330                        ignore=ignoreflags)
4331
4332        self.assertEqual(len(ancdata), 1)
4333        cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4334        self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4335        self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
4336        self.assertEqual(len(cmsg_data), SIZEOF_INT)
4337        a = array.array("i")
4338        a.frombytes(cmsg_data)
4339        self.assertGreaterEqual(a[0], 0)
4340        self.assertLessEqual(a[0], 255)
4341
4342    # Try the above test with various buffer sizes.
4343
4344    @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4345                  "IPV6_RECVTCLASS", "IPV6_TCLASS")
4346    def testSecondCmsgTrunc0(self):
4347        self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
4348                                        ignoreflags=socket.MSG_CTRUNC)
4349
4350    @testSecondCmsgTrunc0.client_skip
4351    def _testSecondCmsgTrunc0(self):
4352        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4353        self.sendToServer(MSG)
4354
4355    @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4356                  "IPV6_RECVTCLASS", "IPV6_TCLASS")
4357    def testSecondCmsgTrunc1(self):
4358        self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
4359
4360    @testSecondCmsgTrunc1.client_skip
4361    def _testSecondCmsgTrunc1(self):
4362        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4363        self.sendToServer(MSG)
4364
4365    @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4366                  "IPV6_RECVTCLASS", "IPV6_TCLASS")
4367    def testSecondCmsgTrunc2Int(self):
4368        self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4369                                        2 * SIZEOF_INT)
4370
4371    @testSecondCmsgTrunc2Int.client_skip
4372    def _testSecondCmsgTrunc2Int(self):
4373        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4374        self.sendToServer(MSG)
4375
4376    @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4377                  "IPV6_RECVTCLASS", "IPV6_TCLASS")
4378    def testSecondCmsgTruncLen0Minus1(self):
4379        self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4380                                        socket.CMSG_LEN(0) - 1)
4381
4382    @testSecondCmsgTruncLen0Minus1.client_skip
4383    def _testSecondCmsgTruncLen0Minus1(self):
4384        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4385        self.sendToServer(MSG)
4386
4387    @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4388                  "IPV6_RECVTCLASS", "IPV6_TCLASS")
4389    def testSecondCmsgTruncInData(self):
4390        # Test truncation of the second of two control messages inside
4391        # its associated data.
4392        self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4393                                  socket.IPV6_RECVHOPLIMIT, 1)
4394        self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4395                                  socket.IPV6_RECVTCLASS, 1)
4396        self.misc_event.set()
4397        msg, ancdata, flags, addr = self.doRecvmsg(
4398            self.serv_sock, len(MSG),
4399            socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
4400
4401        self.assertEqual(msg, MSG)
4402        self.checkRecvmsgAddress(addr, self.cli_addr)
4403        self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4404
4405        cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
4406
4407        cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4408        self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4409        cmsg_types.remove(cmsg_type)
4410        self.assertEqual(len(cmsg_data), SIZEOF_INT)
4411        a = array.array("i")
4412        a.frombytes(cmsg_data)
4413        self.assertGreaterEqual(a[0], 0)
4414        self.assertLessEqual(a[0], 255)
4415
4416        if ancdata:
4417            cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4418            self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4419            cmsg_types.remove(cmsg_type)
4420            self.assertLess(len(cmsg_data), SIZEOF_INT)
4421
4422        self.assertEqual(ancdata, [])
4423
4424    @testSecondCmsgTruncInData.client_skip
4425    def _testSecondCmsgTruncInData(self):
4426        self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4427        self.sendToServer(MSG)
4428
4429
4430# Derive concrete test classes for different socket types.
4431
4432class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
4433                             SendrecvmsgConnectionlessBase,
4434                             ThreadedSocketTestMixin, UDPTestBase):
4435    pass
4436
4437@requireAttrs(socket.socket, "sendmsg")
4438class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
4439    pass
4440
4441@requireAttrs(socket.socket, "recvmsg")
4442class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
4443    pass
4444
4445@requireAttrs(socket.socket, "recvmsg_into")
4446class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
4447    pass
4448
4449
4450class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
4451                              SendrecvmsgConnectionlessBase,
4452                              ThreadedSocketTestMixin, UDP6TestBase):
4453
4454    def checkRecvmsgAddress(self, addr1, addr2):
4455        # Called to compare the received address with the address of
4456        # the peer, ignoring scope ID
4457        self.assertEqual(addr1[:-1], addr2[:-1])
4458
4459@requireAttrs(socket.socket, "sendmsg")
4460@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
4461@requireSocket("AF_INET6", "SOCK_DGRAM")
4462class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
4463    pass
4464
4465@requireAttrs(socket.socket, "recvmsg")
4466@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
4467@requireSocket("AF_INET6", "SOCK_DGRAM")
4468class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
4469    pass
4470
4471@requireAttrs(socket.socket, "recvmsg_into")
4472@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
4473@requireSocket("AF_INET6", "SOCK_DGRAM")
4474class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
4475    pass
4476
4477@requireAttrs(socket.socket, "recvmsg")
4478@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
4479@requireAttrs(socket, "IPPROTO_IPV6")
4480@requireSocket("AF_INET6", "SOCK_DGRAM")
4481class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
4482                                      SendrecvmsgUDP6TestBase):
4483    pass
4484
4485@requireAttrs(socket.socket, "recvmsg_into")
4486@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
4487@requireAttrs(socket, "IPPROTO_IPV6")
4488@requireSocket("AF_INET6", "SOCK_DGRAM")
4489class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4490                                          RFC3542AncillaryTest,
4491                                          SendrecvmsgUDP6TestBase):
4492    pass
4493
4494
4495@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4496          'UDPLITE sockets required for this test.')
4497class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
4498                             SendrecvmsgConnectionlessBase,
4499                             ThreadedSocketTestMixin, UDPLITETestBase):
4500    pass
4501
4502@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4503          'UDPLITE sockets required for this test.')
4504@requireAttrs(socket.socket, "sendmsg")
4505class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
4506    pass
4507
4508@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4509          'UDPLITE sockets required for this test.')
4510@requireAttrs(socket.socket, "recvmsg")
4511class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
4512    pass
4513
4514@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4515          'UDPLITE sockets required for this test.')
4516@requireAttrs(socket.socket, "recvmsg_into")
4517class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
4518    pass
4519
4520
4521@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4522          'UDPLITE sockets required for this test.')
4523class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
4524                              SendrecvmsgConnectionlessBase,
4525                              ThreadedSocketTestMixin, UDPLITE6TestBase):
4526
4527    def checkRecvmsgAddress(self, addr1, addr2):
4528        # Called to compare the received address with the address of
4529        # the peer, ignoring scope ID
4530        self.assertEqual(addr1[:-1], addr2[:-1])
4531
4532@requireAttrs(socket.socket, "sendmsg")
4533@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
4534@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4535          'UDPLITE sockets required for this test.')
4536@requireSocket("AF_INET6", "SOCK_DGRAM")
4537class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
4538    pass
4539
4540@requireAttrs(socket.socket, "recvmsg")
4541@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
4542@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4543          'UDPLITE sockets required for this test.')
4544@requireSocket("AF_INET6", "SOCK_DGRAM")
4545class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
4546    pass
4547
4548@requireAttrs(socket.socket, "recvmsg_into")
4549@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
4550@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4551          'UDPLITE sockets required for this test.')
4552@requireSocket("AF_INET6", "SOCK_DGRAM")
4553class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
4554    pass
4555
4556@requireAttrs(socket.socket, "recvmsg")
4557@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
4558@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4559          'UDPLITE sockets required for this test.')
4560@requireAttrs(socket, "IPPROTO_IPV6")
4561@requireSocket("AF_INET6", "SOCK_DGRAM")
4562class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
4563                                      SendrecvmsgUDPLITE6TestBase):
4564    pass
4565
4566@requireAttrs(socket.socket, "recvmsg_into")
4567@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
4568@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4569          'UDPLITE sockets required for this test.')
4570@requireAttrs(socket, "IPPROTO_IPV6")
4571@requireSocket("AF_INET6", "SOCK_DGRAM")
4572class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
4573                                          RFC3542AncillaryTest,
4574                                          SendrecvmsgUDPLITE6TestBase):
4575    pass
4576
4577
4578class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4579                             ConnectedStreamTestMixin, TCPTestBase):
4580    pass
4581
4582@requireAttrs(socket.socket, "sendmsg")
4583class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4584    pass
4585
4586@requireAttrs(socket.socket, "recvmsg")
4587class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4588                     SendrecvmsgTCPTestBase):
4589    pass
4590
4591@requireAttrs(socket.socket, "recvmsg_into")
4592class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4593                         SendrecvmsgTCPTestBase):
4594    pass
4595
4596
4597class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4598                                    SendrecvmsgConnectedBase,
4599                                    ConnectedStreamTestMixin, SCTPStreamBase):
4600    pass
4601
4602@requireAttrs(socket.socket, "sendmsg")
4603@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
4604@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
4605class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4606    pass
4607
4608@requireAttrs(socket.socket, "recvmsg")
4609@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
4610@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
4611class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4612                            SendrecvmsgSCTPStreamTestBase):
4613
4614    def testRecvmsgEOF(self):
4615        try:
4616            super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4617        except OSError as e:
4618            if e.errno != errno.ENOTCONN:
4619                raise
4620            self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
4621
4622@requireAttrs(socket.socket, "recvmsg_into")
4623@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
4624@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
4625class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4626                                SendrecvmsgSCTPStreamTestBase):
4627
4628    def testRecvmsgEOF(self):
4629        try:
4630            super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4631        except OSError as e:
4632            if e.errno != errno.ENOTCONN:
4633                raise
4634            self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
4635
4636
4637class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4638                                    ConnectedStreamTestMixin, UnixStreamBase):
4639    pass
4640
4641@requireAttrs(socket.socket, "sendmsg")
4642@requireAttrs(socket, "AF_UNIX")
4643class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4644    pass
4645
4646@requireAttrs(socket.socket, "recvmsg")
4647@requireAttrs(socket, "AF_UNIX")
4648class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4649                            SendrecvmsgUnixStreamTestBase):
4650    pass
4651
4652@requireAttrs(socket.socket, "recvmsg_into")
4653@requireAttrs(socket, "AF_UNIX")
4654class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4655                                SendrecvmsgUnixStreamTestBase):
4656    pass
4657
4658@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4659@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
4660class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4661    pass
4662
4663@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4664@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
4665class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4666                                     SendrecvmsgUnixStreamTestBase):
4667    pass
4668
4669
4670# Test interrupting the interruptible send/receive methods with a
4671# signal when a timeout is set.  These tests avoid having multiple
4672# threads alive during the test so that the OS cannot deliver the
4673# signal to the wrong one.
4674
4675class InterruptedTimeoutBase:
4676    # Base class for interrupted send/receive tests.  Installs an
4677    # empty handler for SIGALRM and removes it on teardown, along with
4678    # any scheduled alarms.
4679
4680    def setUp(self):
4681        super().setUp()
4682        orig_alrm_handler = signal.signal(signal.SIGALRM,
4683                                          lambda signum, frame: 1 / 0)
4684        self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
4685
4686    # Timeout for socket operations
4687    timeout = support.LOOPBACK_TIMEOUT
4688
4689    # Provide setAlarm() method to schedule delivery of SIGALRM after
4690    # given number of seconds, or cancel it if zero, and an
4691    # appropriate time value to use.  Use setitimer() if available.
4692    if hasattr(signal, "setitimer"):
4693        alarm_time = 0.05
4694
4695        def setAlarm(self, seconds):
4696            signal.setitimer(signal.ITIMER_REAL, seconds)
4697    else:
4698        # Old systems may deliver the alarm up to one second early
4699        alarm_time = 2
4700
4701        def setAlarm(self, seconds):
4702            signal.alarm(seconds)
4703
4704
4705# Require siginterrupt() in order to ensure that system calls are
4706# interrupted by default.
4707@requireAttrs(signal, "siginterrupt")
4708@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4709                     "Don't have signal.alarm or signal.setitimer")
4710class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4711    # Test interrupting the recv*() methods with signals when a
4712    # timeout is set.
4713
4714    def setUp(self):
4715        super().setUp()
4716        self.serv.settimeout(self.timeout)
4717
4718    def checkInterruptedRecv(self, func, *args, **kwargs):
4719        # Check that func(*args, **kwargs) raises
4720        # errno of EINTR when interrupted by a signal.
4721        try:
4722            self.setAlarm(self.alarm_time)
4723            with self.assertRaises(ZeroDivisionError) as cm:
4724                func(*args, **kwargs)
4725        finally:
4726            self.setAlarm(0)
4727
4728    def testInterruptedRecvTimeout(self):
4729        self.checkInterruptedRecv(self.serv.recv, 1024)
4730
4731    def testInterruptedRecvIntoTimeout(self):
4732        self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4733
4734    def testInterruptedRecvfromTimeout(self):
4735        self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4736
4737    def testInterruptedRecvfromIntoTimeout(self):
4738        self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4739
4740    @requireAttrs(socket.socket, "recvmsg")
4741    def testInterruptedRecvmsgTimeout(self):
4742        self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4743
4744    @requireAttrs(socket.socket, "recvmsg_into")
4745    def testInterruptedRecvmsgIntoTimeout(self):
4746        self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4747
4748
4749# Require siginterrupt() in order to ensure that system calls are
4750# interrupted by default.
4751@requireAttrs(signal, "siginterrupt")
4752@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4753                     "Don't have signal.alarm or signal.setitimer")
4754class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4755                                 SocketListeningTestMixin, TCPTestBase):
4756    # Test interrupting the interruptible send*() methods with signals
4757    # when a timeout is set.
4758
4759    def setUp(self):
4760        super().setUp()
4761        self.serv_conn = self.newSocket()
4762        self.addCleanup(self.serv_conn.close)
4763        # Use a thread to complete the connection, but wait for it to
4764        # terminate before running the test, so that there is only one
4765        # thread to accept the signal.
4766        cli_thread = threading.Thread(target=self.doConnect)
4767        cli_thread.start()
4768        self.cli_conn, addr = self.serv.accept()
4769        self.addCleanup(self.cli_conn.close)
4770        cli_thread.join()
4771        self.serv_conn.settimeout(self.timeout)
4772
4773    def doConnect(self):
4774        self.serv_conn.connect(self.serv_addr)
4775
4776    def checkInterruptedSend(self, func, *args, **kwargs):
4777        # Check that func(*args, **kwargs), run in a loop, raises
4778        # OSError with an errno of EINTR when interrupted by a
4779        # signal.
4780        try:
4781            with self.assertRaises(ZeroDivisionError) as cm:
4782                while True:
4783                    self.setAlarm(self.alarm_time)
4784                    func(*args, **kwargs)
4785        finally:
4786            self.setAlarm(0)
4787
4788    # Issue #12958: The following tests have problems on OS X prior to 10.7
4789    @support.requires_mac_ver(10, 7)
4790    def testInterruptedSendTimeout(self):
4791        self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4792
4793    @support.requires_mac_ver(10, 7)
4794    def testInterruptedSendtoTimeout(self):
4795        # Passing an actual address here as Python's wrapper for
4796        # sendto() doesn't allow passing a zero-length one; POSIX
4797        # requires that the address is ignored since the socket is
4798        # connection-mode, however.
4799        self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4800                                  self.serv_addr)
4801
4802    @support.requires_mac_ver(10, 7)
4803    @requireAttrs(socket.socket, "sendmsg")
4804    def testInterruptedSendmsgTimeout(self):
4805        self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4806
4807
4808class TCPCloserTest(ThreadedTCPSocketTest):
4809
4810    def testClose(self):
4811        conn, addr = self.serv.accept()
4812        conn.close()
4813
4814        sd = self.cli
4815        read, write, err = select.select([sd], [], [], 1.0)
4816        self.assertEqual(read, [sd])
4817        self.assertEqual(sd.recv(1), b'')
4818
4819        # Calling close() many times should be safe.
4820        conn.close()
4821        conn.close()
4822
4823    def _testClose(self):
4824        self.cli.connect((HOST, self.port))
4825        time.sleep(1.0)
4826
4827
4828class BasicSocketPairTest(SocketPairTest):
4829
4830    def __init__(self, methodName='runTest'):
4831        SocketPairTest.__init__(self, methodName=methodName)
4832
4833    def _check_defaults(self, sock):
4834        self.assertIsInstance(sock, socket.socket)
4835        if hasattr(socket, 'AF_UNIX'):
4836            self.assertEqual(sock.family, socket.AF_UNIX)
4837        else:
4838            self.assertEqual(sock.family, socket.AF_INET)
4839        self.assertEqual(sock.type, socket.SOCK_STREAM)
4840        self.assertEqual(sock.proto, 0)
4841
4842    def _testDefaults(self):
4843        self._check_defaults(self.cli)
4844
4845    def testDefaults(self):
4846        self._check_defaults(self.serv)
4847
4848    def testRecv(self):
4849        msg = self.serv.recv(1024)
4850        self.assertEqual(msg, MSG)
4851
4852    def _testRecv(self):
4853        self.cli.send(MSG)
4854
4855    def testSend(self):
4856        self.serv.send(MSG)
4857
4858    def _testSend(self):
4859        msg = self.cli.recv(1024)
4860        self.assertEqual(msg, MSG)
4861
4862
4863class PurePythonSocketPairTest(SocketPairTest):
4864    # Explicitly use socketpair AF_INET or AF_INET6 to ensure that is the
4865    # code path we're using regardless platform is the pure python one where
4866    # `_socket.socketpair` does not exist.  (AF_INET does not work with
4867    # _socket.socketpair on many platforms).
4868    def socketpair(self):
4869        # called by super().setUp().
4870        try:
4871            return socket.socketpair(socket.AF_INET6)
4872        except OSError:
4873            return socket.socketpair(socket.AF_INET)
4874
4875    # Local imports in this class make for easy security fix backporting.
4876
4877    def setUp(self):
4878        if hasattr(_socket, "socketpair"):
4879            self._orig_sp = socket.socketpair
4880            # This forces the version using the non-OS provided socketpair
4881            # emulation via an AF_INET socket in Lib/socket.py.
4882            socket.socketpair = socket._fallback_socketpair
4883        else:
4884            # This platform already uses the non-OS provided version.
4885            self._orig_sp = None
4886        super().setUp()
4887
4888    def tearDown(self):
4889        super().tearDown()
4890        if self._orig_sp is not None:
4891            # Restore the default socket.socketpair definition.
4892            socket.socketpair = self._orig_sp
4893
4894    def test_recv(self):
4895        msg = self.serv.recv(1024)
4896        self.assertEqual(msg, MSG)
4897
4898    def _test_recv(self):
4899        self.cli.send(MSG)
4900
4901    def test_send(self):
4902        self.serv.send(MSG)
4903
4904    def _test_send(self):
4905        msg = self.cli.recv(1024)
4906        self.assertEqual(msg, MSG)
4907
4908    def test_ipv4(self):
4909        cli, srv = socket.socketpair(socket.AF_INET)
4910        cli.close()
4911        srv.close()
4912
4913    def _test_ipv4(self):
4914        pass
4915
4916    @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
4917                     not hasattr(_socket, 'IPV6_V6ONLY'),
4918                     "IPV6_V6ONLY option not supported")
4919    @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
4920    def test_ipv6(self):
4921        cli, srv = socket.socketpair(socket.AF_INET6)
4922        cli.close()
4923        srv.close()
4924
4925    def _test_ipv6(self):
4926        pass
4927
4928    def test_injected_authentication_failure(self):
4929        orig_getsockname = socket.socket.getsockname
4930        inject_sock = None
4931
4932        def inject_getsocketname(self):
4933            nonlocal inject_sock
4934            sockname = orig_getsockname(self)
4935            # Connect to the listening socket ahead of the
4936            # client socket.
4937            if inject_sock is None:
4938                inject_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
4939                inject_sock.setblocking(False)
4940                try:
4941                    inject_sock.connect(sockname[:2])
4942                except (BlockingIOError, InterruptedError):
4943                    pass
4944                inject_sock.setblocking(True)
4945            return sockname
4946
4947        sock1 = sock2 = None
4948        try:
4949            socket.socket.getsockname = inject_getsocketname
4950            with self.assertRaises(OSError):
4951                sock1, sock2 = socket.socketpair()
4952        finally:
4953            socket.socket.getsockname = orig_getsockname
4954            if inject_sock:
4955                inject_sock.close()
4956            if sock1:  # This cleanup isn't needed on a successful test.
4957                sock1.close()
4958            if sock2:
4959                sock2.close()
4960
4961    def _test_injected_authentication_failure(self):
4962        # No-op.  Exists for base class threading infrastructure to call.
4963        # We could refactor this test into its own lesser class along with the
4964        # setUp and tearDown code to construct an ideal; it is simpler to keep
4965        # it here and live with extra overhead one this _one_ failure test.
4966        pass
4967
4968
4969class NonBlockingTCPTests(ThreadedTCPSocketTest):
4970
4971    def __init__(self, methodName='runTest'):
4972        self.event = threading.Event()
4973        ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4974
4975    def assert_sock_timeout(self, sock, timeout):
4976        self.assertEqual(self.serv.gettimeout(), timeout)
4977
4978        blocking = (timeout != 0.0)
4979        self.assertEqual(sock.getblocking(), blocking)
4980
4981        if fcntl is not None:
4982            # When a Python socket has a non-zero timeout, it's switched
4983            # internally to a non-blocking mode. Later, sock.sendall(),
4984            # sock.recv(), and other socket operations use a select() call and
4985            # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4986            # timeouts are enforced.
4987            fd_blocking = (timeout is None)
4988
4989            flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4990            self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4991
4992    def testSetBlocking(self):
4993        # Test setblocking() and settimeout() methods
4994        self.serv.setblocking(True)
4995        self.assert_sock_timeout(self.serv, None)
4996
4997        self.serv.setblocking(False)
4998        self.assert_sock_timeout(self.serv, 0.0)
4999
5000        self.serv.settimeout(None)
5001        self.assert_sock_timeout(self.serv, None)
5002
5003        self.serv.settimeout(0)
5004        self.assert_sock_timeout(self.serv, 0)
5005
5006        self.serv.settimeout(10)
5007        self.assert_sock_timeout(self.serv, 10)
5008
5009        self.serv.settimeout(0)
5010        self.assert_sock_timeout(self.serv, 0)
5011
5012    def _testSetBlocking(self):
5013        pass
5014
5015    @support.cpython_only
5016    @unittest.skipIf(_testcapi is None, "requires _testcapi")
5017    def testSetBlocking_overflow(self):
5018        # Issue 15989
5019        import _testcapi
5020        if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
5021            self.skipTest('needs UINT_MAX < ULONG_MAX')
5022
5023        self.serv.setblocking(False)
5024        self.assertEqual(self.serv.gettimeout(), 0.0)
5025
5026        self.serv.setblocking(_testcapi.UINT_MAX + 1)
5027        self.assertIsNone(self.serv.gettimeout())
5028
5029    _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
5030
5031    @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
5032                         'test needs socket.SOCK_NONBLOCK')
5033    @support.requires_linux_version(2, 6, 28)
5034    def testInitNonBlocking(self):
5035        # create a socket with SOCK_NONBLOCK
5036        self.serv.close()
5037        self.serv = socket.socket(socket.AF_INET,
5038                                  socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
5039        self.assert_sock_timeout(self.serv, 0)
5040
5041    def _testInitNonBlocking(self):
5042        pass
5043
5044    def testInheritFlagsBlocking(self):
5045        # bpo-7995: accept() on a listening socket with a timeout and the
5046        # default timeout is None, the resulting socket must be blocking.
5047        with socket_setdefaulttimeout(None):
5048            self.serv.settimeout(10)
5049            conn, addr = self.serv.accept()
5050            self.addCleanup(conn.close)
5051            self.assertIsNone(conn.gettimeout())
5052
5053    def _testInheritFlagsBlocking(self):
5054        self.cli.connect((HOST, self.port))
5055
5056    def testInheritFlagsTimeout(self):
5057        # bpo-7995: accept() on a listening socket with a timeout and the
5058        # default timeout is None, the resulting socket must inherit
5059        # the default timeout.
5060        default_timeout = 20.0
5061        with socket_setdefaulttimeout(default_timeout):
5062            self.serv.settimeout(10)
5063            conn, addr = self.serv.accept()
5064            self.addCleanup(conn.close)
5065            self.assertEqual(conn.gettimeout(), default_timeout)
5066
5067    def _testInheritFlagsTimeout(self):
5068        self.cli.connect((HOST, self.port))
5069
5070    def testAccept(self):
5071        # Testing non-blocking accept
5072        self.serv.setblocking(False)
5073
5074        # connect() didn't start: non-blocking accept() fails
5075        start_time = time.monotonic()
5076        with self.assertRaises(BlockingIOError):
5077            conn, addr = self.serv.accept()
5078        dt = time.monotonic() - start_time
5079        self.assertLess(dt, 1.0)
5080
5081        self.event.set()
5082
5083        read, write, err = select.select([self.serv], [], [], support.LONG_TIMEOUT)
5084        if self.serv not in read:
5085            self.fail("Error trying to do accept after select.")
5086
5087        # connect() completed: non-blocking accept() doesn't block
5088        conn, addr = self.serv.accept()
5089        self.addCleanup(conn.close)
5090        self.assertIsNone(conn.gettimeout())
5091
5092    def _testAccept(self):
5093        # don't connect before event is set to check
5094        # that non-blocking accept() raises BlockingIOError
5095        self.event.wait()
5096
5097        self.cli.connect((HOST, self.port))
5098
5099    def testRecv(self):
5100        # Testing non-blocking recv
5101        conn, addr = self.serv.accept()
5102        self.addCleanup(conn.close)
5103        conn.setblocking(False)
5104
5105        # the server didn't send data yet: non-blocking recv() fails
5106        with self.assertRaises(BlockingIOError):
5107            msg = conn.recv(len(MSG))
5108
5109        self.event.set()
5110
5111        read, write, err = select.select([conn], [], [], support.LONG_TIMEOUT)
5112        if conn not in read:
5113            self.fail("Error during select call to non-blocking socket.")
5114
5115        # the server sent data yet: non-blocking recv() doesn't block
5116        msg = conn.recv(len(MSG))
5117        self.assertEqual(msg, MSG)
5118
5119    def _testRecv(self):
5120        self.cli.connect((HOST, self.port))
5121
5122        # don't send anything before event is set to check
5123        # that non-blocking recv() raises BlockingIOError
5124        self.event.wait()
5125
5126        # send data: recv() will no longer block
5127        self.cli.sendall(MSG)
5128
5129    def testLargeTimeout(self):
5130        # gh-126876: Check that a timeout larger than INT_MAX is replaced with
5131        # INT_MAX in the poll() code path. The following assertion must not
5132        # fail: assert(INT_MIN <= ms && ms <= INT_MAX).
5133        if _testcapi is not None:
5134            large_timeout = _testcapi.INT_MAX + 1
5135        else:
5136            large_timeout = 2147483648
5137
5138        # test recv() with large timeout
5139        conn, addr = self.serv.accept()
5140        self.addCleanup(conn.close)
5141        try:
5142            conn.settimeout(large_timeout)
5143        except OverflowError:
5144            # On Windows, settimeout() fails with OverflowError, whereas
5145            # we want to test recv(). Just give up silently.
5146            return
5147        msg = conn.recv(len(MSG))
5148
5149    def _testLargeTimeout(self):
5150        # test sendall() with large timeout
5151        if _testcapi is not None:
5152            large_timeout = _testcapi.INT_MAX + 1
5153        else:
5154            large_timeout = 2147483648
5155        self.cli.connect((HOST, self.port))
5156        try:
5157            self.cli.settimeout(large_timeout)
5158        except OverflowError:
5159            return
5160        self.cli.sendall(MSG)
5161
5162
5163class FileObjectClassTestCase(SocketConnectedTest):
5164    """Unit tests for the object returned by socket.makefile()
5165
5166    self.read_file is the io object returned by makefile() on
5167    the client connection.  You can read from this file to
5168    get output from the server.
5169
5170    self.write_file is the io object returned by makefile() on the
5171    server connection.  You can write to this file to send output
5172    to the client.
5173    """
5174
5175    bufsize = -1 # Use default buffer size
5176    encoding = 'utf-8'
5177    errors = 'strict'
5178    newline = None
5179
5180    read_mode = 'rb'
5181    read_msg = MSG
5182    write_mode = 'wb'
5183    write_msg = MSG
5184
5185    def __init__(self, methodName='runTest'):
5186        SocketConnectedTest.__init__(self, methodName=methodName)
5187
5188    def setUp(self):
5189        self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
5190            threading.Event() for i in range(4)]
5191        SocketConnectedTest.setUp(self)
5192        self.read_file = self.cli_conn.makefile(
5193            self.read_mode, self.bufsize,
5194            encoding = self.encoding,
5195            errors = self.errors,
5196            newline = self.newline)
5197
5198    def tearDown(self):
5199        self.serv_finished.set()
5200        self.read_file.close()
5201        self.assertTrue(self.read_file.closed)
5202        self.read_file = None
5203        SocketConnectedTest.tearDown(self)
5204
5205    def clientSetUp(self):
5206        SocketConnectedTest.clientSetUp(self)
5207        self.write_file = self.serv_conn.makefile(
5208            self.write_mode, self.bufsize,
5209            encoding = self.encoding,
5210            errors = self.errors,
5211            newline = self.newline)
5212
5213    def clientTearDown(self):
5214        self.cli_finished.set()
5215        self.write_file.close()
5216        self.assertTrue(self.write_file.closed)
5217        self.write_file = None
5218        SocketConnectedTest.clientTearDown(self)
5219
5220    def testReadAfterTimeout(self):
5221        # Issue #7322: A file object must disallow further reads
5222        # after a timeout has occurred.
5223        self.cli_conn.settimeout(1)
5224        self.read_file.read(3)
5225        # First read raises a timeout
5226        self.assertRaises(TimeoutError, self.read_file.read, 1)
5227        # Second read is disallowed
5228        with self.assertRaises(OSError) as ctx:
5229            self.read_file.read(1)
5230        self.assertIn("cannot read from timed out object", str(ctx.exception))
5231
5232    def _testReadAfterTimeout(self):
5233        self.write_file.write(self.write_msg[0:3])
5234        self.write_file.flush()
5235        self.serv_finished.wait()
5236
5237    def testSmallRead(self):
5238        # Performing small file read test
5239        first_seg = self.read_file.read(len(self.read_msg)-3)
5240        second_seg = self.read_file.read(3)
5241        msg = first_seg + second_seg
5242        self.assertEqual(msg, self.read_msg)
5243
5244    def _testSmallRead(self):
5245        self.write_file.write(self.write_msg)
5246        self.write_file.flush()
5247
5248    def testFullRead(self):
5249        # read until EOF
5250        msg = self.read_file.read()
5251        self.assertEqual(msg, self.read_msg)
5252
5253    def _testFullRead(self):
5254        self.write_file.write(self.write_msg)
5255        self.write_file.close()
5256
5257    def testUnbufferedRead(self):
5258        # Performing unbuffered file read test
5259        buf = type(self.read_msg)()
5260        while 1:
5261            char = self.read_file.read(1)
5262            if not char:
5263                break
5264            buf += char
5265        self.assertEqual(buf, self.read_msg)
5266
5267    def _testUnbufferedRead(self):
5268        self.write_file.write(self.write_msg)
5269        self.write_file.flush()
5270
5271    def testReadline(self):
5272        # Performing file readline test
5273        line = self.read_file.readline()
5274        self.assertEqual(line, self.read_msg)
5275
5276    def _testReadline(self):
5277        self.write_file.write(self.write_msg)
5278        self.write_file.flush()
5279
5280    def testCloseAfterMakefile(self):
5281        # The file returned by makefile should keep the socket open.
5282        self.cli_conn.close()
5283        # read until EOF
5284        msg = self.read_file.read()
5285        self.assertEqual(msg, self.read_msg)
5286
5287    def _testCloseAfterMakefile(self):
5288        self.write_file.write(self.write_msg)
5289        self.write_file.flush()
5290
5291    def testMakefileAfterMakefileClose(self):
5292        self.read_file.close()
5293        msg = self.cli_conn.recv(len(MSG))
5294        if isinstance(self.read_msg, str):
5295            msg = msg.decode()
5296        self.assertEqual(msg, self.read_msg)
5297
5298    def _testMakefileAfterMakefileClose(self):
5299        self.write_file.write(self.write_msg)
5300        self.write_file.flush()
5301
5302    def testClosedAttr(self):
5303        self.assertTrue(not self.read_file.closed)
5304
5305    def _testClosedAttr(self):
5306        self.assertTrue(not self.write_file.closed)
5307
5308    def testAttributes(self):
5309        self.assertEqual(self.read_file.mode, self.read_mode)
5310        self.assertEqual(self.read_file.name, self.cli_conn.fileno())
5311
5312    def _testAttributes(self):
5313        self.assertEqual(self.write_file.mode, self.write_mode)
5314        self.assertEqual(self.write_file.name, self.serv_conn.fileno())
5315
5316    def testRealClose(self):
5317        self.read_file.close()
5318        self.assertRaises(ValueError, self.read_file.fileno)
5319        self.cli_conn.close()
5320        self.assertRaises(OSError, self.cli_conn.getsockname)
5321
5322    def _testRealClose(self):
5323        pass
5324
5325
5326class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
5327
5328    """Repeat the tests from FileObjectClassTestCase with bufsize==0.
5329
5330    In this case (and in this case only), it should be possible to
5331    create a file object, read a line from it, create another file
5332    object, read another line from it, without loss of data in the
5333    first file object's buffer.  Note that http.client relies on this
5334    when reading multiple requests from the same socket."""
5335
5336    bufsize = 0 # Use unbuffered mode
5337
5338    def testUnbufferedReadline(self):
5339        # Read a line, create a new file object, read another line with it
5340        line = self.read_file.readline() # first line
5341        self.assertEqual(line, b"A. " + self.write_msg) # first line
5342        self.read_file = self.cli_conn.makefile('rb', 0)
5343        line = self.read_file.readline() # second line
5344        self.assertEqual(line, b"B. " + self.write_msg) # second line
5345
5346    def _testUnbufferedReadline(self):
5347        self.write_file.write(b"A. " + self.write_msg)
5348        self.write_file.write(b"B. " + self.write_msg)
5349        self.write_file.flush()
5350
5351    def testMakefileClose(self):
5352        # The file returned by makefile should keep the socket open...
5353        self.cli_conn.close()
5354        msg = self.cli_conn.recv(1024)
5355        self.assertEqual(msg, self.read_msg)
5356        # ...until the file is itself closed
5357        self.read_file.close()
5358        self.assertRaises(OSError, self.cli_conn.recv, 1024)
5359
5360    def _testMakefileClose(self):
5361        self.write_file.write(self.write_msg)
5362        self.write_file.flush()
5363
5364    @unittest.skipUnless(hasattr(sys, 'getrefcount'),
5365                         'test needs sys.getrefcount()')
5366    def testMakefileCloseSocketDestroy(self):
5367        refcount_before = sys.getrefcount(self.cli_conn)
5368        self.read_file.close()
5369        refcount_after = sys.getrefcount(self.cli_conn)
5370        self.assertEqual(refcount_before - 1, refcount_after)
5371
5372    def _testMakefileCloseSocketDestroy(self):
5373        pass
5374
5375    # Non-blocking ops
5376    # NOTE: to set `read_file` as non-blocking, we must call
5377    # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
5378
5379    def testSmallReadNonBlocking(self):
5380        self.cli_conn.setblocking(False)
5381        self.assertEqual(self.read_file.readinto(bytearray(10)), None)
5382        self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
5383        self.evt1.set()
5384        self.evt2.wait(1.0)
5385        first_seg = self.read_file.read(len(self.read_msg) - 3)
5386        if first_seg is None:
5387            # Data not arrived (can happen under Windows), wait a bit
5388            time.sleep(0.5)
5389            first_seg = self.read_file.read(len(self.read_msg) - 3)
5390        buf = bytearray(10)
5391        n = self.read_file.readinto(buf)
5392        self.assertEqual(n, 3)
5393        msg = first_seg + buf[:n]
5394        self.assertEqual(msg, self.read_msg)
5395        self.assertEqual(self.read_file.readinto(bytearray(16)), None)
5396        self.assertEqual(self.read_file.read(1), None)
5397
5398    def _testSmallReadNonBlocking(self):
5399        self.evt1.wait(1.0)
5400        self.write_file.write(self.write_msg)
5401        self.write_file.flush()
5402        self.evt2.set()
5403        # Avoid closing the socket before the server test has finished,
5404        # otherwise system recv() will return 0 instead of EWOULDBLOCK.
5405        self.serv_finished.wait(5.0)
5406
5407    def testWriteNonBlocking(self):
5408        self.cli_finished.wait(5.0)
5409        # The client thread can't skip directly - the SkipTest exception
5410        # would appear as a failure.
5411        if self.serv_skipped:
5412            self.skipTest(self.serv_skipped)
5413
5414    def _testWriteNonBlocking(self):
5415        self.serv_skipped = None
5416        self.serv_conn.setblocking(False)
5417        # Try to saturate the socket buffer pipe with repeated large writes.
5418        BIG = b"x" * support.SOCK_MAX_SIZE
5419        LIMIT = 10
5420        # The first write() succeeds since a chunk of data can be buffered
5421        n = self.write_file.write(BIG)
5422        self.assertGreater(n, 0)
5423        for i in range(LIMIT):
5424            n = self.write_file.write(BIG)
5425            if n is None:
5426                # Succeeded
5427                break
5428            self.assertGreater(n, 0)
5429        else:
5430            # Let us know that this test didn't manage to establish
5431            # the expected conditions. This is not a failure in itself but,
5432            # if it happens repeatedly, the test should be fixed.
5433            self.serv_skipped = "failed to saturate the socket buffer"
5434
5435
5436class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5437
5438    bufsize = 1 # Default-buffered for reading; line-buffered for writing
5439
5440
5441class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5442
5443    bufsize = 2 # Exercise the buffering code
5444
5445
5446class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
5447    """Tests for socket.makefile() in text mode (rather than binary)"""
5448
5449    read_mode = 'r'
5450    read_msg = MSG.decode('utf-8')
5451    write_mode = 'wb'
5452    write_msg = MSG
5453    newline = ''
5454
5455
5456class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
5457    """Tests for socket.makefile() in text mode (rather than binary)"""
5458
5459    read_mode = 'rb'
5460    read_msg = MSG
5461    write_mode = 'w'
5462    write_msg = MSG.decode('utf-8')
5463    newline = ''
5464
5465
5466class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
5467    """Tests for socket.makefile() in text mode (rather than binary)"""
5468
5469    read_mode = 'r'
5470    read_msg = MSG.decode('utf-8')
5471    write_mode = 'w'
5472    write_msg = MSG.decode('utf-8')
5473    newline = ''
5474
5475
5476class NetworkConnectionTest(object):
5477    """Prove network connection."""
5478
5479    def clientSetUp(self):
5480        # We're inherited below by BasicTCPTest2, which also inherits
5481        # BasicTCPTest, which defines self.port referenced below.
5482        self.cli = socket.create_connection((HOST, self.port))
5483        self.serv_conn = self.cli
5484
5485class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
5486    """Tests that NetworkConnection does not break existing TCP functionality.
5487    """
5488
5489class NetworkConnectionNoServer(unittest.TestCase):
5490
5491    class MockSocket(socket.socket):
5492        def connect(self, *args):
5493            raise TimeoutError('timed out')
5494
5495    @contextlib.contextmanager
5496    def mocked_socket_module(self):
5497        """Return a socket which times out on connect"""
5498        old_socket = socket.socket
5499        socket.socket = self.MockSocket
5500        try:
5501            yield
5502        finally:
5503            socket.socket = old_socket
5504
5505    @socket_helper.skip_if_tcp_blackhole
5506    def test_connect(self):
5507        port = socket_helper.find_unused_port()
5508        cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
5509        self.addCleanup(cli.close)
5510        with self.assertRaises(OSError) as cm:
5511            cli.connect((HOST, port))
5512        self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
5513
5514    @socket_helper.skip_if_tcp_blackhole
5515    def test_create_connection(self):
5516        # Issue #9792: errors raised by create_connection() should have
5517        # a proper errno attribute.
5518        port = socket_helper.find_unused_port()
5519        with self.assertRaises(OSError) as cm:
5520            socket.create_connection((HOST, port))
5521
5522        # Issue #16257: create_connection() calls getaddrinfo() against
5523        # 'localhost'.  This may result in an IPV6 addr being returned
5524        # as well as an IPV4 one:
5525        #   >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
5526        #   >>> [(2,  2, 0, '', ('127.0.0.1', 41230)),
5527        #        (26, 2, 0, '', ('::1', 41230, 0, 0))]
5528        #
5529        # create_connection() enumerates through all the addresses returned
5530        # and if it doesn't successfully bind to any of them, it propagates
5531        # the last exception it encountered.
5532        #
5533        # On Solaris, ENETUNREACH is returned in this circumstance instead
5534        # of ECONNREFUSED.  So, if that errno exists, add it to our list of
5535        # expected errnos.
5536        expected_errnos = socket_helper.get_socket_conn_refused_errs()
5537        self.assertIn(cm.exception.errno, expected_errnos)
5538
5539    def test_create_connection_all_errors(self):
5540        port = socket_helper.find_unused_port()
5541        try:
5542            socket.create_connection((HOST, port), all_errors=True)
5543        except ExceptionGroup as e:
5544            eg = e
5545        else:
5546            self.fail('expected connection to fail')
5547
5548        self.assertIsInstance(eg, ExceptionGroup)
5549        for e in eg.exceptions:
5550            self.assertIsInstance(e, OSError)
5551
5552        addresses = socket.getaddrinfo(
5553            'localhost', port, 0, socket.SOCK_STREAM)
5554        # assert that we got an exception for each address
5555        self.assertEqual(len(addresses), len(eg.exceptions))
5556
5557    def test_create_connection_timeout(self):
5558        # Issue #9792: create_connection() should not recast timeout errors
5559        # as generic socket errors.
5560        with self.mocked_socket_module():
5561            try:
5562                socket.create_connection((HOST, 1234))
5563            except TimeoutError:
5564                pass
5565            except OSError as exc:
5566                if socket_helper.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
5567                    raise
5568            else:
5569                self.fail('TimeoutError not raised')
5570
5571
5572class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
5573    cli = None
5574
5575    def __init__(self, methodName='runTest'):
5576        SocketTCPTest.__init__(self, methodName=methodName)
5577        ThreadableTest.__init__(self)
5578
5579    def clientSetUp(self):
5580        self.source_port = socket_helper.find_unused_port()
5581
5582    def clientTearDown(self):
5583        if self.cli is not None:
5584            self.cli.close()
5585        self.cli = None
5586        ThreadableTest.clientTearDown(self)
5587
5588    def _justAccept(self):
5589        conn, addr = self.serv.accept()
5590        conn.close()
5591
5592    testFamily = _justAccept
5593    def _testFamily(self):
5594        self.cli = socket.create_connection((HOST, self.port),
5595                            timeout=support.LOOPBACK_TIMEOUT)
5596        self.addCleanup(self.cli.close)
5597        self.assertEqual(self.cli.family, 2)
5598
5599    testSourceAddress = _justAccept
5600    def _testSourceAddress(self):
5601        self.cli = socket.create_connection((HOST, self.port),
5602                            timeout=support.LOOPBACK_TIMEOUT,
5603                            source_address=('', self.source_port))
5604        self.addCleanup(self.cli.close)
5605        self.assertEqual(self.cli.getsockname()[1], self.source_port)
5606        # The port number being used is sufficient to show that the bind()
5607        # call happened.
5608
5609    testTimeoutDefault = _justAccept
5610    def _testTimeoutDefault(self):
5611        # passing no explicit timeout uses socket's global default
5612        self.assertTrue(socket.getdefaulttimeout() is None)
5613        socket.setdefaulttimeout(42)
5614        try:
5615            self.cli = socket.create_connection((HOST, self.port))
5616            self.addCleanup(self.cli.close)
5617        finally:
5618            socket.setdefaulttimeout(None)
5619        self.assertEqual(self.cli.gettimeout(), 42)
5620
5621    testTimeoutNone = _justAccept
5622    def _testTimeoutNone(self):
5623        # None timeout means the same as sock.settimeout(None)
5624        self.assertTrue(socket.getdefaulttimeout() is None)
5625        socket.setdefaulttimeout(30)
5626        try:
5627            self.cli = socket.create_connection((HOST, self.port), timeout=None)
5628            self.addCleanup(self.cli.close)
5629        finally:
5630            socket.setdefaulttimeout(None)
5631        self.assertEqual(self.cli.gettimeout(), None)
5632
5633    testTimeoutValueNamed = _justAccept
5634    def _testTimeoutValueNamed(self):
5635        self.cli = socket.create_connection((HOST, self.port), timeout=30)
5636        self.assertEqual(self.cli.gettimeout(), 30)
5637
5638    testTimeoutValueNonamed = _justAccept
5639    def _testTimeoutValueNonamed(self):
5640        self.cli = socket.create_connection((HOST, self.port), 30)
5641        self.addCleanup(self.cli.close)
5642        self.assertEqual(self.cli.gettimeout(), 30)
5643
5644
5645class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
5646
5647    def __init__(self, methodName='runTest'):
5648        SocketTCPTest.__init__(self, methodName=methodName)
5649        ThreadableTest.__init__(self)
5650
5651    def clientSetUp(self):
5652        pass
5653
5654    def clientTearDown(self):
5655        self.cli.close()
5656        self.cli = None
5657        ThreadableTest.clientTearDown(self)
5658
5659    def testInsideTimeout(self):
5660        conn, addr = self.serv.accept()
5661        self.addCleanup(conn.close)
5662        time.sleep(3)
5663        conn.send(b"done!")
5664    testOutsideTimeout = testInsideTimeout
5665
5666    def _testInsideTimeout(self):
5667        self.cli = sock = socket.create_connection((HOST, self.port))
5668        data = sock.recv(5)
5669        self.assertEqual(data, b"done!")
5670
5671    def _testOutsideTimeout(self):
5672        self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
5673        self.assertRaises(TimeoutError, lambda: sock.recv(5))
5674
5675
5676class TCPTimeoutTest(SocketTCPTest):
5677
5678    def testTCPTimeout(self):
5679        def raise_timeout(*args, **kwargs):
5680            self.serv.settimeout(1.0)
5681            self.serv.accept()
5682        self.assertRaises(TimeoutError, raise_timeout,
5683                              "Error generating a timeout exception (TCP)")
5684
5685    def testTimeoutZero(self):
5686        ok = False
5687        try:
5688            self.serv.settimeout(0.0)
5689            foo = self.serv.accept()
5690        except TimeoutError:
5691            self.fail("caught timeout instead of error (TCP)")
5692        except OSError:
5693            ok = True
5694        except:
5695            self.fail("caught unexpected exception (TCP)")
5696        if not ok:
5697            self.fail("accept() returned success when we did not expect it")
5698
5699    @unittest.skipUnless(hasattr(signal, 'alarm'),
5700                         'test needs signal.alarm()')
5701    def testInterruptedTimeout(self):
5702        # XXX I don't know how to do this test on MSWindows or any other
5703        # platform that doesn't support signal.alarm() or os.kill(), though
5704        # the bug should have existed on all platforms.
5705        self.serv.settimeout(5.0)   # must be longer than alarm
5706        class Alarm(Exception):
5707            pass
5708        def alarm_handler(signal, frame):
5709            raise Alarm
5710        old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
5711        try:
5712            try:
5713                signal.alarm(2)    # POSIX allows alarm to be up to 1 second early
5714                foo = self.serv.accept()
5715            except TimeoutError:
5716                self.fail("caught timeout instead of Alarm")
5717            except Alarm:
5718                pass
5719            except BaseException as e:
5720                self.fail("caught other exception instead of Alarm:"
5721                          " %s(%s):\n%s" %
5722                          (type(e), e, traceback.format_exc()))
5723            else:
5724                self.fail("nothing caught")
5725            finally:
5726                signal.alarm(0)         # shut off alarm
5727        except Alarm:
5728            self.fail("got Alarm in wrong place")
5729        finally:
5730            # no alarm can be pending.  Safe to restore old handler.
5731            signal.signal(signal.SIGALRM, old_alarm)
5732
5733class UDPTimeoutTest(SocketUDPTest):
5734
5735    def testUDPTimeout(self):
5736        def raise_timeout(*args, **kwargs):
5737            self.serv.settimeout(1.0)
5738            self.serv.recv(1024)
5739        self.assertRaises(TimeoutError, raise_timeout,
5740                              "Error generating a timeout exception (UDP)")
5741
5742    def testTimeoutZero(self):
5743        ok = False
5744        try:
5745            self.serv.settimeout(0.0)
5746            foo = self.serv.recv(1024)
5747        except TimeoutError:
5748            self.fail("caught timeout instead of error (UDP)")
5749        except OSError:
5750            ok = True
5751        except:
5752            self.fail("caught unexpected exception (UDP)")
5753        if not ok:
5754            self.fail("recv() returned success when we did not expect it")
5755
5756@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
5757          'UDPLITE sockets required for this test.')
5758class UDPLITETimeoutTest(SocketUDPLITETest):
5759
5760    def testUDPLITETimeout(self):
5761        def raise_timeout(*args, **kwargs):
5762            self.serv.settimeout(1.0)
5763            self.serv.recv(1024)
5764        self.assertRaises(TimeoutError, raise_timeout,
5765                              "Error generating a timeout exception (UDPLITE)")
5766
5767    def testTimeoutZero(self):
5768        ok = False
5769        try:
5770            self.serv.settimeout(0.0)
5771            foo = self.serv.recv(1024)
5772        except TimeoutError:
5773            self.fail("caught timeout instead of error (UDPLITE)")
5774        except OSError:
5775            ok = True
5776        except:
5777            self.fail("caught unexpected exception (UDPLITE)")
5778        if not ok:
5779            self.fail("recv() returned success when we did not expect it")
5780
5781class TestExceptions(unittest.TestCase):
5782
5783    def testExceptionTree(self):
5784        self.assertTrue(issubclass(OSError, Exception))
5785        self.assertTrue(issubclass(socket.herror, OSError))
5786        self.assertTrue(issubclass(socket.gaierror, OSError))
5787        self.assertTrue(issubclass(socket.timeout, OSError))
5788        self.assertIs(socket.error, OSError)
5789        self.assertIs(socket.timeout, TimeoutError)
5790
5791    def test_setblocking_invalidfd(self):
5792        # Regression test for issue #28471
5793
5794        sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5795        sock = socket.socket(
5796            socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5797        sock0.close()
5798        self.addCleanup(sock.detach)
5799
5800        with self.assertRaises(OSError):
5801            sock.setblocking(False)
5802
5803
5804@unittest.skipUnless(sys.platform in ('linux', 'android'), 'Linux specific test')
5805class TestLinuxAbstractNamespace(unittest.TestCase):
5806
5807    UNIX_PATH_MAX = 108
5808
5809    def testLinuxAbstractNamespace(self):
5810        address = b"\x00python-test-hello\x00\xff"
5811        with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5812            s1.bind(address)
5813            s1.listen()
5814            with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5815                s2.connect(s1.getsockname())
5816                with s1.accept()[0] as s3:
5817                    self.assertEqual(s1.getsockname(), address)
5818                    self.assertEqual(s2.getpeername(), address)
5819
5820    def testMaxName(self):
5821        address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
5822        with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5823            s.bind(address)
5824            self.assertEqual(s.getsockname(), address)
5825
5826    def testNameOverflow(self):
5827        address = "\x00" + "h" * self.UNIX_PATH_MAX
5828        with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5829            self.assertRaises(OSError, s.bind, address)
5830
5831    def testStrName(self):
5832        # Check that an abstract name can be passed as a string.
5833        s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5834        try:
5835            s.bind("\x00python\x00test\x00")
5836            self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5837        finally:
5838            s.close()
5839
5840    def testBytearrayName(self):
5841        # Check that an abstract name can be passed as a bytearray.
5842        with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5843            s.bind(bytearray(b"\x00python\x00test\x00"))
5844            self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5845
5846    def testAutobind(self):
5847        # Check that binding to an empty string binds to an available address
5848        # in the abstract namespace as specified in unix(7) "Autobind feature".
5849        abstract_address = b"^\0[0-9a-f]{5}"
5850        with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5851            s1.bind("")
5852            self.assertRegex(s1.getsockname(), abstract_address)
5853            # Each socket is bound to a different abstract address.
5854            with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5855                s2.bind("")
5856                self.assertRegex(s2.getsockname(), abstract_address)
5857                self.assertNotEqual(s1.getsockname(), s2.getsockname())
5858
5859
5860@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
5861class TestUnixDomain(unittest.TestCase):
5862
5863    def setUp(self):
5864        self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5865
5866    def tearDown(self):
5867        self.sock.close()
5868
5869    def encoded(self, path):
5870        # Return the given path encoded in the file system encoding,
5871        # or skip the test if this is not possible.
5872        try:
5873            return os.fsencode(path)
5874        except UnicodeEncodeError:
5875            self.skipTest(
5876                "Pathname {0!a} cannot be represented in file "
5877                "system encoding {1!r}".format(
5878                    path, sys.getfilesystemencoding()))
5879
5880    def bind(self, sock, path):
5881        # Bind the socket
5882        try:
5883            socket_helper.bind_unix_socket(sock, path)
5884        except OSError as e:
5885            if str(e) == "AF_UNIX path too long":
5886                self.skipTest(
5887                    "Pathname {0!a} is too long to serve as an AF_UNIX path"
5888                    .format(path))
5889            else:
5890                raise
5891
5892    def testUnbound(self):
5893        # Issue #30205 (note getsockname() can return None on OS X)
5894        self.assertIn(self.sock.getsockname(), ('', None))
5895
5896    def testStrAddr(self):
5897        # Test binding to and retrieving a normal string pathname.
5898        path = os.path.abspath(os_helper.TESTFN)
5899        self.bind(self.sock, path)
5900        self.addCleanup(os_helper.unlink, path)
5901        self.assertEqual(self.sock.getsockname(), path)
5902
5903    def testBytesAddr(self):
5904        # Test binding to a bytes pathname.
5905        path = os.path.abspath(os_helper.TESTFN)
5906        self.bind(self.sock, self.encoded(path))
5907        self.addCleanup(os_helper.unlink, path)
5908        self.assertEqual(self.sock.getsockname(), path)
5909
5910    def testSurrogateescapeBind(self):
5911        # Test binding to a valid non-ASCII pathname, with the
5912        # non-ASCII bytes supplied using surrogateescape encoding.
5913        path = os.path.abspath(os_helper.TESTFN_UNICODE)
5914        b = self.encoded(path)
5915        self.bind(self.sock, b.decode("ascii", "surrogateescape"))
5916        self.addCleanup(os_helper.unlink, path)
5917        self.assertEqual(self.sock.getsockname(), path)
5918
5919    def testUnencodableAddr(self):
5920        # Test binding to a pathname that cannot be encoded in the
5921        # file system encoding.
5922        if os_helper.TESTFN_UNENCODABLE is None:
5923            self.skipTest("No unencodable filename available")
5924        path = os.path.abspath(os_helper.TESTFN_UNENCODABLE)
5925        self.bind(self.sock, path)
5926        self.addCleanup(os_helper.unlink, path)
5927        self.assertEqual(self.sock.getsockname(), path)
5928
5929    @unittest.skipIf(sys.platform in ('linux', 'android'),
5930                     'Linux behavior is tested by TestLinuxAbstractNamespace')
5931    def testEmptyAddress(self):
5932        # Test that binding empty address fails.
5933        self.assertRaises(OSError, self.sock.bind, "")
5934
5935
5936class BufferIOTest(SocketConnectedTest):
5937    """
5938    Test the buffer versions of socket.recv() and socket.send().
5939    """
5940    def __init__(self, methodName='runTest'):
5941        SocketConnectedTest.__init__(self, methodName=methodName)
5942
5943    def testRecvIntoArray(self):
5944        buf = array.array("B", [0] * len(MSG))
5945        nbytes = self.cli_conn.recv_into(buf)
5946        self.assertEqual(nbytes, len(MSG))
5947        buf = buf.tobytes()
5948        msg = buf[:len(MSG)]
5949        self.assertEqual(msg, MSG)
5950
5951    def _testRecvIntoArray(self):
5952        buf = bytes(MSG)
5953        self.serv_conn.send(buf)
5954
5955    def testRecvIntoBytearray(self):
5956        buf = bytearray(1024)
5957        nbytes = self.cli_conn.recv_into(buf)
5958        self.assertEqual(nbytes, len(MSG))
5959        msg = buf[:len(MSG)]
5960        self.assertEqual(msg, MSG)
5961
5962    _testRecvIntoBytearray = _testRecvIntoArray
5963
5964    def testRecvIntoMemoryview(self):
5965        buf = bytearray(1024)
5966        nbytes = self.cli_conn.recv_into(memoryview(buf))
5967        self.assertEqual(nbytes, len(MSG))
5968        msg = buf[:len(MSG)]
5969        self.assertEqual(msg, MSG)
5970
5971    _testRecvIntoMemoryview = _testRecvIntoArray
5972
5973    def testRecvFromIntoArray(self):
5974        buf = array.array("B", [0] * len(MSG))
5975        nbytes, addr = self.cli_conn.recvfrom_into(buf)
5976        self.assertEqual(nbytes, len(MSG))
5977        buf = buf.tobytes()
5978        msg = buf[:len(MSG)]
5979        self.assertEqual(msg, MSG)
5980
5981    def _testRecvFromIntoArray(self):
5982        buf = bytes(MSG)
5983        self.serv_conn.send(buf)
5984
5985    def testRecvFromIntoBytearray(self):
5986        buf = bytearray(1024)
5987        nbytes, addr = self.cli_conn.recvfrom_into(buf)
5988        self.assertEqual(nbytes, len(MSG))
5989        msg = buf[:len(MSG)]
5990        self.assertEqual(msg, MSG)
5991
5992    _testRecvFromIntoBytearray = _testRecvFromIntoArray
5993
5994    def testRecvFromIntoMemoryview(self):
5995        buf = bytearray(1024)
5996        nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5997        self.assertEqual(nbytes, len(MSG))
5998        msg = buf[:len(MSG)]
5999        self.assertEqual(msg, MSG)
6000
6001    _testRecvFromIntoMemoryview = _testRecvFromIntoArray
6002
6003    def testRecvFromIntoSmallBuffer(self):
6004        # See issue #20246.
6005        buf = bytearray(8)
6006        self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
6007
6008    def _testRecvFromIntoSmallBuffer(self):
6009        self.serv_conn.send(MSG)
6010
6011    def testRecvFromIntoEmptyBuffer(self):
6012        buf = bytearray()
6013        self.cli_conn.recvfrom_into(buf)
6014        self.cli_conn.recvfrom_into(buf, 0)
6015
6016    _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
6017
6018
6019TIPC_STYPE = 2000
6020TIPC_LOWER = 200
6021TIPC_UPPER = 210
6022
6023def isTipcAvailable():
6024    """Check if the TIPC module is loaded
6025
6026    The TIPC module is not loaded automatically on Ubuntu and probably
6027    other Linux distros.
6028    """
6029    if not hasattr(socket, "AF_TIPC"):
6030        return False
6031    try:
6032        f = open("/proc/modules", encoding="utf-8")
6033    except (FileNotFoundError, IsADirectoryError, PermissionError):
6034        # It's ok if the file does not exist, is a directory or if we
6035        # have not the permission to read it.
6036        return False
6037    with f:
6038        for line in f:
6039            if line.startswith("tipc "):
6040                return True
6041    return False
6042
6043@unittest.skipUnless(isTipcAvailable(),
6044                     "TIPC module is not loaded, please 'sudo modprobe tipc'")
6045class TIPCTest(unittest.TestCase):
6046    def testRDM(self):
6047        srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
6048        cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
6049        self.addCleanup(srv.close)
6050        self.addCleanup(cli.close)
6051
6052        srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
6053        srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
6054                TIPC_LOWER, TIPC_UPPER)
6055        srv.bind(srvaddr)
6056
6057        sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
6058                TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
6059        cli.sendto(MSG, sendaddr)
6060
6061        msg, recvaddr = srv.recvfrom(1024)
6062
6063        self.assertEqual(cli.getsockname(), recvaddr)
6064        self.assertEqual(msg, MSG)
6065
6066
6067@unittest.skipUnless(isTipcAvailable(),
6068                     "TIPC module is not loaded, please 'sudo modprobe tipc'")
6069class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
6070    def __init__(self, methodName = 'runTest'):
6071        unittest.TestCase.__init__(self, methodName = methodName)
6072        ThreadableTest.__init__(self)
6073
6074    def setUp(self):
6075        self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
6076        self.addCleanup(self.srv.close)
6077        self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
6078        srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
6079                TIPC_LOWER, TIPC_UPPER)
6080        self.srv.bind(srvaddr)
6081        self.srv.listen()
6082        self.serverExplicitReady()
6083        self.conn, self.connaddr = self.srv.accept()
6084        self.addCleanup(self.conn.close)
6085
6086    def clientSetUp(self):
6087        # There is a hittable race between serverExplicitReady() and the
6088        # accept() call; sleep a little while to avoid it, otherwise
6089        # we could get an exception
6090        time.sleep(0.1)
6091        self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
6092        self.addCleanup(self.cli.close)
6093        addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
6094                TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
6095        self.cli.connect(addr)
6096        self.cliaddr = self.cli.getsockname()
6097
6098    def testStream(self):
6099        msg = self.conn.recv(1024)
6100        self.assertEqual(msg, MSG)
6101        self.assertEqual(self.cliaddr, self.connaddr)
6102
6103    def _testStream(self):
6104        self.cli.send(MSG)
6105        self.cli.close()
6106
6107
6108class ContextManagersTest(ThreadedTCPSocketTest):
6109
6110    def _testSocketClass(self):
6111        # base test
6112        with socket.socket() as sock:
6113            self.assertFalse(sock._closed)
6114        self.assertTrue(sock._closed)
6115        # close inside with block
6116        with socket.socket() as sock:
6117            sock.close()
6118        self.assertTrue(sock._closed)
6119        # exception inside with block
6120        with socket.socket() as sock:
6121            self.assertRaises(OSError, sock.sendall, b'foo')
6122        self.assertTrue(sock._closed)
6123
6124    def testCreateConnectionBase(self):
6125        conn, addr = self.serv.accept()
6126        self.addCleanup(conn.close)
6127        data = conn.recv(1024)
6128        conn.sendall(data)
6129
6130    def _testCreateConnectionBase(self):
6131        address = self.serv.getsockname()
6132        with socket.create_connection(address) as sock:
6133            self.assertFalse(sock._closed)
6134            sock.sendall(b'foo')
6135            self.assertEqual(sock.recv(1024), b'foo')
6136        self.assertTrue(sock._closed)
6137
6138    def testCreateConnectionClose(self):
6139        conn, addr = self.serv.accept()
6140        self.addCleanup(conn.close)
6141        data = conn.recv(1024)
6142        conn.sendall(data)
6143
6144    def _testCreateConnectionClose(self):
6145        address = self.serv.getsockname()
6146        with socket.create_connection(address) as sock:
6147            sock.close()
6148        self.assertTrue(sock._closed)
6149        self.assertRaises(OSError, sock.sendall, b'foo')
6150
6151
6152class InheritanceTest(unittest.TestCase):
6153    @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
6154                         "SOCK_CLOEXEC not defined")
6155    @support.requires_linux_version(2, 6, 28)
6156    def test_SOCK_CLOEXEC(self):
6157        with socket.socket(socket.AF_INET,
6158                           socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
6159            self.assertEqual(s.type, socket.SOCK_STREAM)
6160            self.assertFalse(s.get_inheritable())
6161
6162    def test_default_inheritable(self):
6163        sock = socket.socket()
6164        with sock:
6165            self.assertEqual(sock.get_inheritable(), False)
6166
6167    def test_dup(self):
6168        sock = socket.socket()
6169        with sock:
6170            newsock = sock.dup()
6171            sock.close()
6172            with newsock:
6173                self.assertEqual(newsock.get_inheritable(), False)
6174
6175    def test_set_inheritable(self):
6176        sock = socket.socket()
6177        with sock:
6178            sock.set_inheritable(True)
6179            self.assertEqual(sock.get_inheritable(), True)
6180
6181            sock.set_inheritable(False)
6182            self.assertEqual(sock.get_inheritable(), False)
6183
6184    @unittest.skipIf(fcntl is None, "need fcntl")
6185    def test_get_inheritable_cloexec(self):
6186        sock = socket.socket()
6187        with sock:
6188            fd = sock.fileno()
6189            self.assertEqual(sock.get_inheritable(), False)
6190
6191            # clear FD_CLOEXEC flag
6192            flags = fcntl.fcntl(fd, fcntl.F_GETFD)
6193            flags &= ~fcntl.FD_CLOEXEC
6194            fcntl.fcntl(fd, fcntl.F_SETFD, flags)
6195
6196            self.assertEqual(sock.get_inheritable(), True)
6197
6198    @unittest.skipIf(fcntl is None, "need fcntl")
6199    def test_set_inheritable_cloexec(self):
6200        sock = socket.socket()
6201        with sock:
6202            fd = sock.fileno()
6203            self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
6204                             fcntl.FD_CLOEXEC)
6205
6206            sock.set_inheritable(True)
6207            self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
6208                             0)
6209
6210
6211    def test_socketpair(self):
6212        s1, s2 = socket.socketpair()
6213        self.addCleanup(s1.close)
6214        self.addCleanup(s2.close)
6215        self.assertEqual(s1.get_inheritable(), False)
6216        self.assertEqual(s2.get_inheritable(), False)
6217
6218
6219@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
6220                     "SOCK_NONBLOCK not defined")
6221class NonblockConstantTest(unittest.TestCase):
6222    def checkNonblock(self, s, nonblock=True, timeout=0.0):
6223        if nonblock:
6224            self.assertEqual(s.type, socket.SOCK_STREAM)
6225            self.assertEqual(s.gettimeout(), timeout)
6226            self.assertTrue(
6227                fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
6228            if timeout == 0:
6229                # timeout == 0: means that getblocking() must be False.
6230                self.assertFalse(s.getblocking())
6231            else:
6232                # If timeout > 0, the socket will be in a "blocking" mode
6233                # from the standpoint of the Python API.  For Python socket
6234                # object, "blocking" means that operations like 'sock.recv()'
6235                # will block.  Internally, file descriptors for
6236                # "blocking" Python sockets *with timeouts* are in a
6237                # *non-blocking* mode, and 'sock.recv()' uses 'select()'
6238                # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
6239                self.assertTrue(s.getblocking())
6240        else:
6241            self.assertEqual(s.type, socket.SOCK_STREAM)
6242            self.assertEqual(s.gettimeout(), None)
6243            self.assertFalse(
6244                fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
6245            self.assertTrue(s.getblocking())
6246
6247    @support.requires_linux_version(2, 6, 28)
6248    def test_SOCK_NONBLOCK(self):
6249        # a lot of it seems silly and redundant, but I wanted to test that
6250        # changing back and forth worked ok
6251        with socket.socket(socket.AF_INET,
6252                           socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
6253            self.checkNonblock(s)
6254            s.setblocking(True)
6255            self.checkNonblock(s, nonblock=False)
6256            s.setblocking(False)
6257            self.checkNonblock(s)
6258            s.settimeout(None)
6259            self.checkNonblock(s, nonblock=False)
6260            s.settimeout(2.0)
6261            self.checkNonblock(s, timeout=2.0)
6262            s.setblocking(True)
6263            self.checkNonblock(s, nonblock=False)
6264        # defaulttimeout
6265        t = socket.getdefaulttimeout()
6266        socket.setdefaulttimeout(0.0)
6267        with socket.socket() as s:
6268            self.checkNonblock(s)
6269        socket.setdefaulttimeout(None)
6270        with socket.socket() as s:
6271            self.checkNonblock(s, False)
6272        socket.setdefaulttimeout(2.0)
6273        with socket.socket() as s:
6274            self.checkNonblock(s, timeout=2.0)
6275        socket.setdefaulttimeout(None)
6276        with socket.socket() as s:
6277            self.checkNonblock(s, False)
6278        socket.setdefaulttimeout(t)
6279
6280
6281@unittest.skipUnless(os.name == "nt", "Windows specific")
6282@unittest.skipUnless(multiprocessing, "need multiprocessing")
6283class TestSocketSharing(SocketTCPTest):
6284    # This must be classmethod and not staticmethod or multiprocessing
6285    # won't be able to bootstrap it.
6286    @classmethod
6287    def remoteProcessServer(cls, q):
6288        # Recreate socket from shared data
6289        sdata = q.get()
6290        message = q.get()
6291
6292        s = socket.fromshare(sdata)
6293        s2, c = s.accept()
6294
6295        # Send the message
6296        s2.sendall(message)
6297        s2.close()
6298        s.close()
6299
6300    def testShare(self):
6301        # Transfer the listening server socket to another process
6302        # and service it from there.
6303
6304        # Create process:
6305        q = multiprocessing.Queue()
6306        p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
6307        p.start()
6308
6309        # Get the shared socket data
6310        data = self.serv.share(p.pid)
6311
6312        # Pass the shared socket to the other process
6313        addr = self.serv.getsockname()
6314        self.serv.close()
6315        q.put(data)
6316
6317        # The data that the server will send us
6318        message = b"slapmahfro"
6319        q.put(message)
6320
6321        # Connect
6322        s = socket.create_connection(addr)
6323        #  listen for the data
6324        m = []
6325        while True:
6326            data = s.recv(100)
6327            if not data:
6328                break
6329            m.append(data)
6330        s.close()
6331        received = b"".join(m)
6332        self.assertEqual(received, message)
6333        p.join()
6334
6335    def testShareLength(self):
6336        data = self.serv.share(os.getpid())
6337        self.assertRaises(ValueError, socket.fromshare, data[:-1])
6338        self.assertRaises(ValueError, socket.fromshare, data+b"foo")
6339
6340    def compareSockets(self, org, other):
6341        # socket sharing is expected to work only for blocking socket
6342        # since the internal python timeout value isn't transferred.
6343        self.assertEqual(org.gettimeout(), None)
6344        self.assertEqual(org.gettimeout(), other.gettimeout())
6345
6346        self.assertEqual(org.family, other.family)
6347        self.assertEqual(org.type, other.type)
6348        # If the user specified "0" for proto, then
6349        # internally windows will have picked the correct value.
6350        # Python introspection on the socket however will still return
6351        # 0.  For the shared socket, the python value is recreated
6352        # from the actual value, so it may not compare correctly.
6353        if org.proto != 0:
6354            self.assertEqual(org.proto, other.proto)
6355
6356    def testShareLocal(self):
6357        data = self.serv.share(os.getpid())
6358        s = socket.fromshare(data)
6359        try:
6360            self.compareSockets(self.serv, s)
6361        finally:
6362            s.close()
6363
6364    def testTypes(self):
6365        families = [socket.AF_INET, socket.AF_INET6]
6366        types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
6367        for f in families:
6368            for t in types:
6369                try:
6370                    source = socket.socket(f, t)
6371                except OSError:
6372                    continue # This combination is not supported
6373                try:
6374                    data = source.share(os.getpid())
6375                    shared = socket.fromshare(data)
6376                    try:
6377                        self.compareSockets(source, shared)
6378                    finally:
6379                        shared.close()
6380                finally:
6381                    source.close()
6382
6383
6384class SendfileUsingSendTest(ThreadedTCPSocketTest):
6385    """
6386    Test the send() implementation of socket.sendfile().
6387    """
6388
6389    FILESIZE = (10 * 1024 * 1024)  # 10 MiB
6390    BUFSIZE = 8192
6391    FILEDATA = b""
6392    TIMEOUT = support.LOOPBACK_TIMEOUT
6393
6394    @classmethod
6395    def setUpClass(cls):
6396        def chunks(total, step):
6397            assert total >= step
6398            while total > step:
6399                yield step
6400                total -= step
6401            if total:
6402                yield total
6403
6404        chunk = b"".join([random.choice(string.ascii_letters).encode()
6405                          for i in range(cls.BUFSIZE)])
6406        with open(os_helper.TESTFN, 'wb') as f:
6407            for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
6408                f.write(chunk)
6409        with open(os_helper.TESTFN, 'rb') as f:
6410            cls.FILEDATA = f.read()
6411            assert len(cls.FILEDATA) == cls.FILESIZE
6412
6413    @classmethod
6414    def tearDownClass(cls):
6415        os_helper.unlink(os_helper.TESTFN)
6416
6417    def accept_conn(self):
6418        self.serv.settimeout(support.LONG_TIMEOUT)
6419        conn, addr = self.serv.accept()
6420        conn.settimeout(self.TIMEOUT)
6421        self.addCleanup(conn.close)
6422        return conn
6423
6424    def recv_data(self, conn):
6425        received = []
6426        while True:
6427            chunk = conn.recv(self.BUFSIZE)
6428            if not chunk:
6429                break
6430            received.append(chunk)
6431        return b''.join(received)
6432
6433    def meth_from_sock(self, sock):
6434        # Depending on the mixin class being run return either send()
6435        # or sendfile() method implementation.
6436        return getattr(sock, "_sendfile_use_send")
6437
6438    # regular file
6439
6440    def _testRegularFile(self):
6441        address = self.serv.getsockname()
6442        file = open(os_helper.TESTFN, 'rb')
6443        with socket.create_connection(address) as sock, file as file:
6444            meth = self.meth_from_sock(sock)
6445            sent = meth(file)
6446            self.assertEqual(sent, self.FILESIZE)
6447            self.assertEqual(file.tell(), self.FILESIZE)
6448
6449    def testRegularFile(self):
6450        conn = self.accept_conn()
6451        data = self.recv_data(conn)
6452        self.assertEqual(len(data), self.FILESIZE)
6453        self.assertEqual(data, self.FILEDATA)
6454
6455    # non regular file
6456
6457    def _testNonRegularFile(self):
6458        address = self.serv.getsockname()
6459        file = io.BytesIO(self.FILEDATA)
6460        with socket.create_connection(address) as sock, file as file:
6461            sent = sock.sendfile(file)
6462            self.assertEqual(sent, self.FILESIZE)
6463            self.assertEqual(file.tell(), self.FILESIZE)
6464            self.assertRaises(socket._GiveupOnSendfile,
6465                              sock._sendfile_use_sendfile, file)
6466
6467    def testNonRegularFile(self):
6468        conn = self.accept_conn()
6469        data = self.recv_data(conn)
6470        self.assertEqual(len(data), self.FILESIZE)
6471        self.assertEqual(data, self.FILEDATA)
6472
6473    # empty file
6474
6475    def _testEmptyFileSend(self):
6476        address = self.serv.getsockname()
6477        filename = os_helper.TESTFN + "2"
6478        with open(filename, 'wb'):
6479            self.addCleanup(os_helper.unlink, filename)
6480        file = open(filename, 'rb')
6481        with socket.create_connection(address) as sock, file as file:
6482            meth = self.meth_from_sock(sock)
6483            sent = meth(file)
6484            self.assertEqual(sent, 0)
6485            self.assertEqual(file.tell(), 0)
6486
6487    def testEmptyFileSend(self):
6488        conn = self.accept_conn()
6489        data = self.recv_data(conn)
6490        self.assertEqual(data, b"")
6491
6492    # offset
6493
6494    def _testOffset(self):
6495        address = self.serv.getsockname()
6496        file = open(os_helper.TESTFN, 'rb')
6497        with socket.create_connection(address) as sock, file as file:
6498            meth = self.meth_from_sock(sock)
6499            sent = meth(file, offset=5000)
6500            self.assertEqual(sent, self.FILESIZE - 5000)
6501            self.assertEqual(file.tell(), self.FILESIZE)
6502
6503    def testOffset(self):
6504        conn = self.accept_conn()
6505        data = self.recv_data(conn)
6506        self.assertEqual(len(data), self.FILESIZE - 5000)
6507        self.assertEqual(data, self.FILEDATA[5000:])
6508
6509    # count
6510
6511    def _testCount(self):
6512        address = self.serv.getsockname()
6513        file = open(os_helper.TESTFN, 'rb')
6514        sock = socket.create_connection(address,
6515                                        timeout=support.LOOPBACK_TIMEOUT)
6516        with sock, file:
6517            count = 5000007
6518            meth = self.meth_from_sock(sock)
6519            sent = meth(file, count=count)
6520            self.assertEqual(sent, count)
6521            self.assertEqual(file.tell(), count)
6522
6523    def testCount(self):
6524        count = 5000007
6525        conn = self.accept_conn()
6526        data = self.recv_data(conn)
6527        self.assertEqual(len(data), count)
6528        self.assertEqual(data, self.FILEDATA[:count])
6529
6530    # count small
6531
6532    def _testCountSmall(self):
6533        address = self.serv.getsockname()
6534        file = open(os_helper.TESTFN, 'rb')
6535        sock = socket.create_connection(address,
6536                                        timeout=support.LOOPBACK_TIMEOUT)
6537        with sock, file:
6538            count = 1
6539            meth = self.meth_from_sock(sock)
6540            sent = meth(file, count=count)
6541            self.assertEqual(sent, count)
6542            self.assertEqual(file.tell(), count)
6543
6544    def testCountSmall(self):
6545        count = 1
6546        conn = self.accept_conn()
6547        data = self.recv_data(conn)
6548        self.assertEqual(len(data), count)
6549        self.assertEqual(data, self.FILEDATA[:count])
6550
6551    # count + offset
6552
6553    def _testCountWithOffset(self):
6554        address = self.serv.getsockname()
6555        file = open(os_helper.TESTFN, 'rb')
6556        with socket.create_connection(address, timeout=2) as sock, file as file:
6557            count = 100007
6558            meth = self.meth_from_sock(sock)
6559            sent = meth(file, offset=2007, count=count)
6560            self.assertEqual(sent, count)
6561            self.assertEqual(file.tell(), count + 2007)
6562
6563    def testCountWithOffset(self):
6564        count = 100007
6565        conn = self.accept_conn()
6566        data = self.recv_data(conn)
6567        self.assertEqual(len(data), count)
6568        self.assertEqual(data, self.FILEDATA[2007:count+2007])
6569
6570    # non blocking sockets are not supposed to work
6571
6572    def _testNonBlocking(self):
6573        address = self.serv.getsockname()
6574        file = open(os_helper.TESTFN, 'rb')
6575        with socket.create_connection(address) as sock, file as file:
6576            sock.setblocking(False)
6577            meth = self.meth_from_sock(sock)
6578            self.assertRaises(ValueError, meth, file)
6579            self.assertRaises(ValueError, sock.sendfile, file)
6580
6581    def testNonBlocking(self):
6582        conn = self.accept_conn()
6583        if conn.recv(8192):
6584            self.fail('was not supposed to receive any data')
6585
6586    # timeout (non-triggered)
6587
6588    def _testWithTimeout(self):
6589        address = self.serv.getsockname()
6590        file = open(os_helper.TESTFN, 'rb')
6591        sock = socket.create_connection(address,
6592                                        timeout=support.LOOPBACK_TIMEOUT)
6593        with sock, file:
6594            meth = self.meth_from_sock(sock)
6595            sent = meth(file)
6596            self.assertEqual(sent, self.FILESIZE)
6597
6598    def testWithTimeout(self):
6599        conn = self.accept_conn()
6600        data = self.recv_data(conn)
6601        self.assertEqual(len(data), self.FILESIZE)
6602        self.assertEqual(data, self.FILEDATA)
6603
6604    # timeout (triggered)
6605
6606    def _testWithTimeoutTriggeredSend(self):
6607        address = self.serv.getsockname()
6608        with open(os_helper.TESTFN, 'rb') as file:
6609            with socket.create_connection(address) as sock:
6610                sock.settimeout(0.01)
6611                meth = self.meth_from_sock(sock)
6612                self.assertRaises(TimeoutError, meth, file)
6613
6614    def testWithTimeoutTriggeredSend(self):
6615        conn = self.accept_conn()
6616        conn.recv(88192)
6617        # bpo-45212: the wait here needs to be longer than the client-side timeout (0.01s)
6618        time.sleep(1)
6619
6620    # errors
6621
6622    def _test_errors(self):
6623        pass
6624
6625    def test_errors(self):
6626        with open(os_helper.TESTFN, 'rb') as file:
6627            with socket.socket(type=socket.SOCK_DGRAM) as s:
6628                meth = self.meth_from_sock(s)
6629                self.assertRaisesRegex(
6630                    ValueError, "SOCK_STREAM", meth, file)
6631        with open(os_helper.TESTFN, encoding="utf-8") as file:
6632            with socket.socket() as s:
6633                meth = self.meth_from_sock(s)
6634                self.assertRaisesRegex(
6635                    ValueError, "binary mode", meth, file)
6636        with open(os_helper.TESTFN, 'rb') as file:
6637            with socket.socket() as s:
6638                meth = self.meth_from_sock(s)
6639                self.assertRaisesRegex(TypeError, "positive integer",
6640                                       meth, file, count='2')
6641                self.assertRaisesRegex(TypeError, "positive integer",
6642                                       meth, file, count=0.1)
6643                self.assertRaisesRegex(ValueError, "positive integer",
6644                                       meth, file, count=0)
6645                self.assertRaisesRegex(ValueError, "positive integer",
6646                                       meth, file, count=-1)
6647
6648
6649@unittest.skipUnless(hasattr(os, "sendfile"),
6650                     'os.sendfile() required for this test.')
6651class SendfileUsingSendfileTest(SendfileUsingSendTest):
6652    """
6653    Test the sendfile() implementation of socket.sendfile().
6654    """
6655    def meth_from_sock(self, sock):
6656        return getattr(sock, "_sendfile_use_sendfile")
6657
6658
6659@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
6660class LinuxKernelCryptoAPI(unittest.TestCase):
6661    # tests for AF_ALG
6662    def create_alg(self, typ, name):
6663        sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6664        try:
6665            sock.bind((typ, name))
6666        except FileNotFoundError as e:
6667            # type / algorithm is not available
6668            sock.close()
6669            raise unittest.SkipTest(str(e), typ, name)
6670        else:
6671            return sock
6672
6673    # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
6674    # at least on ppc64le architecture
6675    @support.requires_linux_version(4, 5)
6676    def test_sha256(self):
6677        expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
6678                                 "177a9cb410ff61f20015ad")
6679        with self.create_alg('hash', 'sha256') as algo:
6680            op, _ = algo.accept()
6681            with op:
6682                op.sendall(b"abc")
6683                self.assertEqual(op.recv(512), expected)
6684
6685            op, _ = algo.accept()
6686            with op:
6687                op.send(b'a', socket.MSG_MORE)
6688                op.send(b'b', socket.MSG_MORE)
6689                op.send(b'c', socket.MSG_MORE)
6690                op.send(b'')
6691                self.assertEqual(op.recv(512), expected)
6692
6693    def test_hmac_sha1(self):
6694        # gh-109396: In FIPS mode, Linux 6.5 requires a key
6695        # of at least 112 bits. Use a key of 152 bits.
6696        key = b"Python loves AF_ALG"
6697        data = b"what do ya want for nothing?"
6698        expected = bytes.fromhex("193dbb43c6297b47ea6277ec0ce67119a3f3aa66")
6699        with self.create_alg('hash', 'hmac(sha1)') as algo:
6700            algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6701            op, _ = algo.accept()
6702            with op:
6703                op.sendall(data)
6704                self.assertEqual(op.recv(512), expected)
6705
6706    # Although it should work with 3.19 and newer the test blocks on
6707    # Ubuntu 15.10 with Kernel 4.2.0-19.
6708    @support.requires_linux_version(4, 3)
6709    def test_aes_cbc(self):
6710        key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
6711        iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
6712        msg = b"Single block msg"
6713        ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
6714        msglen = len(msg)
6715        with self.create_alg('skcipher', 'cbc(aes)') as algo:
6716            algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6717            op, _ = algo.accept()
6718            with op:
6719                op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6720                                 flags=socket.MSG_MORE)
6721                op.sendall(msg)
6722                self.assertEqual(op.recv(msglen), ciphertext)
6723
6724            op, _ = algo.accept()
6725            with op:
6726                op.sendmsg_afalg([ciphertext],
6727                                 op=socket.ALG_OP_DECRYPT, iv=iv)
6728                self.assertEqual(op.recv(msglen), msg)
6729
6730            # long message
6731            multiplier = 1024
6732            longmsg = [msg] * multiplier
6733            op, _ = algo.accept()
6734            with op:
6735                op.sendmsg_afalg(longmsg,
6736                                 op=socket.ALG_OP_ENCRYPT, iv=iv)
6737                enc = op.recv(msglen * multiplier)
6738            self.assertEqual(len(enc), msglen * multiplier)
6739            self.assertEqual(enc[:msglen], ciphertext)
6740
6741            op, _ = algo.accept()
6742            with op:
6743                op.sendmsg_afalg([enc],
6744                                 op=socket.ALG_OP_DECRYPT, iv=iv)
6745                dec = op.recv(msglen * multiplier)
6746            self.assertEqual(len(dec), msglen * multiplier)
6747            self.assertEqual(dec, msg * multiplier)
6748
6749    @support.requires_linux_version(4, 9)  # see issue29324
6750    def test_aead_aes_gcm(self):
6751        key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
6752        iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
6753        plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
6754        assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
6755        expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
6756        expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
6757
6758        taglen = len(expected_tag)
6759        assoclen = len(assoc)
6760
6761        with self.create_alg('aead', 'gcm(aes)') as algo:
6762            algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6763            algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
6764                            None, taglen)
6765
6766            # send assoc, plain and tag buffer in separate steps
6767            op, _ = algo.accept()
6768            with op:
6769                op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6770                                 assoclen=assoclen, flags=socket.MSG_MORE)
6771                op.sendall(assoc, socket.MSG_MORE)
6772                op.sendall(plain)
6773                res = op.recv(assoclen + len(plain) + taglen)
6774                self.assertEqual(expected_ct, res[assoclen:-taglen])
6775                self.assertEqual(expected_tag, res[-taglen:])
6776
6777            # now with msg
6778            op, _ = algo.accept()
6779            with op:
6780                msg = assoc + plain
6781                op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
6782                                 assoclen=assoclen)
6783                res = op.recv(assoclen + len(plain) + taglen)
6784                self.assertEqual(expected_ct, res[assoclen:-taglen])
6785                self.assertEqual(expected_tag, res[-taglen:])
6786
6787            # create anc data manually
6788            pack_uint32 = struct.Struct('I').pack
6789            op, _ = algo.accept()
6790            with op:
6791                msg = assoc + plain
6792                op.sendmsg(
6793                    [msg],
6794                    ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6795                     [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6796                     [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6797                    )
6798                )
6799                res = op.recv(len(msg) + taglen)
6800                self.assertEqual(expected_ct, res[assoclen:-taglen])
6801                self.assertEqual(expected_tag, res[-taglen:])
6802
6803            # decrypt and verify
6804            op, _ = algo.accept()
6805            with op:
6806                msg = assoc + expected_ct + expected_tag
6807                op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6808                                 assoclen=assoclen)
6809                res = op.recv(len(msg) - taglen)
6810                self.assertEqual(plain, res[assoclen:])
6811
6812    @support.requires_linux_version(4, 3)  # see test_aes_cbc
6813    def test_drbg_pr_sha256(self):
6814        # deterministic random bit generator, prediction resistance, sha256
6815        with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6816            extra_seed = os.urandom(32)
6817            algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6818            op, _ = algo.accept()
6819            with op:
6820                rn = op.recv(32)
6821                self.assertEqual(len(rn), 32)
6822
6823    def test_sendmsg_afalg_args(self):
6824        sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6825        with sock:
6826            with self.assertRaises(TypeError):
6827                sock.sendmsg_afalg()
6828
6829            with self.assertRaises(TypeError):
6830                sock.sendmsg_afalg(op=None)
6831
6832            with self.assertRaises(TypeError):
6833                sock.sendmsg_afalg(1)
6834
6835            with self.assertRaises(TypeError):
6836                sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
6837
6838            with self.assertRaises(TypeError):
6839                sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6840
6841    def test_length_restriction(self):
6842        # bpo-35050, off-by-one error in length check
6843        sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6844        self.addCleanup(sock.close)
6845
6846        # salg_type[14]
6847        with self.assertRaises(FileNotFoundError):
6848            sock.bind(("t" * 13, "name"))
6849        with self.assertRaisesRegex(ValueError, "type too long"):
6850            sock.bind(("t" * 14, "name"))
6851
6852        # salg_name[64]
6853        with self.assertRaises(FileNotFoundError):
6854            sock.bind(("type", "n" * 63))
6855        with self.assertRaisesRegex(ValueError, "name too long"):
6856            sock.bind(("type", "n" * 64))
6857
6858
6859@unittest.skipUnless(sys.platform == 'darwin', 'macOS specific test')
6860class TestMacOSTCPFlags(unittest.TestCase):
6861    def test_tcp_keepalive(self):
6862        self.assertTrue(socket.TCP_KEEPALIVE)
6863
6864
6865@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6866class TestMSWindowsTCPFlags(unittest.TestCase):
6867    knownTCPFlags = {
6868                       # available since long time ago
6869                       'TCP_MAXSEG',
6870                       'TCP_NODELAY',
6871                       # available starting with Windows 10 1607
6872                       'TCP_FASTOPEN',
6873                       # available starting with Windows 10 1703
6874                       'TCP_KEEPCNT',
6875                       # available starting with Windows 10 1709
6876                       'TCP_KEEPIDLE',
6877                       'TCP_KEEPINTVL'
6878                       }
6879
6880    def test_new_tcp_flags(self):
6881        provided = [s for s in dir(socket) if s.startswith('TCP')]
6882        unknown = [s for s in provided if s not in self.knownTCPFlags]
6883
6884        self.assertEqual([], unknown,
6885            "New TCP flags were discovered. See bpo-32394 for more information")
6886
6887
6888class CreateServerTest(unittest.TestCase):
6889
6890    def test_address(self):
6891        port = socket_helper.find_unused_port()
6892        with socket.create_server(("127.0.0.1", port)) as sock:
6893            self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6894            self.assertEqual(sock.getsockname()[1], port)
6895        if socket_helper.IPV6_ENABLED:
6896            with socket.create_server(("::1", port),
6897                                      family=socket.AF_INET6) as sock:
6898                self.assertEqual(sock.getsockname()[0], "::1")
6899                self.assertEqual(sock.getsockname()[1], port)
6900
6901    def test_family_and_type(self):
6902        with socket.create_server(("127.0.0.1", 0)) as sock:
6903            self.assertEqual(sock.family, socket.AF_INET)
6904            self.assertEqual(sock.type, socket.SOCK_STREAM)
6905        if socket_helper.IPV6_ENABLED:
6906            with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6907                self.assertEqual(s.family, socket.AF_INET6)
6908                self.assertEqual(sock.type, socket.SOCK_STREAM)
6909
6910    def test_reuse_port(self):
6911        if not hasattr(socket, "SO_REUSEPORT"):
6912            with self.assertRaises(ValueError):
6913                socket.create_server(("localhost", 0), reuse_port=True)
6914        else:
6915            with socket.create_server(("localhost", 0)) as sock:
6916                opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6917                self.assertEqual(opt, 0)
6918            with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6919                opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6920                self.assertNotEqual(opt, 0)
6921
6922    @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6923                     not hasattr(_socket, 'IPV6_V6ONLY'),
6924                     "IPV6_V6ONLY option not supported")
6925    @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
6926    def test_ipv6_only_default(self):
6927        with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6928            assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6929
6930    @unittest.skipIf(not socket.has_dualstack_ipv6(),
6931                     "dualstack_ipv6 not supported")
6932    @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
6933    def test_dualstack_ipv6_family(self):
6934        with socket.create_server(("::1", 0), family=socket.AF_INET6,
6935                                  dualstack_ipv6=True) as sock:
6936            self.assertEqual(sock.family, socket.AF_INET6)
6937
6938
6939class CreateServerFunctionalTest(unittest.TestCase):
6940    timeout = support.LOOPBACK_TIMEOUT
6941
6942    def echo_server(self, sock):
6943        def run(sock):
6944            with sock:
6945                conn, _ = sock.accept()
6946                with conn:
6947                    event.wait(self.timeout)
6948                    msg = conn.recv(1024)
6949                    if not msg:
6950                        return
6951                    conn.sendall(msg)
6952
6953        event = threading.Event()
6954        sock.settimeout(self.timeout)
6955        thread = threading.Thread(target=run, args=(sock, ))
6956        thread.start()
6957        self.addCleanup(thread.join, self.timeout)
6958        event.set()
6959
6960    def echo_client(self, addr, family):
6961        with socket.socket(family=family) as sock:
6962            sock.settimeout(self.timeout)
6963            sock.connect(addr)
6964            sock.sendall(b'foo')
6965            self.assertEqual(sock.recv(1024), b'foo')
6966
6967    def test_tcp4(self):
6968        port = socket_helper.find_unused_port()
6969        with socket.create_server(("", port)) as sock:
6970            self.echo_server(sock)
6971            self.echo_client(("127.0.0.1", port), socket.AF_INET)
6972
6973    @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
6974    def test_tcp6(self):
6975        port = socket_helper.find_unused_port()
6976        with socket.create_server(("", port),
6977                                  family=socket.AF_INET6) as sock:
6978            self.echo_server(sock)
6979            self.echo_client(("::1", port), socket.AF_INET6)
6980
6981    # --- dual stack tests
6982
6983    @unittest.skipIf(not socket.has_dualstack_ipv6(),
6984                     "dualstack_ipv6 not supported")
6985    @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
6986    def test_dual_stack_client_v4(self):
6987        port = socket_helper.find_unused_port()
6988        with socket.create_server(("", port), family=socket.AF_INET6,
6989                                  dualstack_ipv6=True) as sock:
6990            self.echo_server(sock)
6991            self.echo_client(("127.0.0.1", port), socket.AF_INET)
6992
6993    @unittest.skipIf(not socket.has_dualstack_ipv6(),
6994                     "dualstack_ipv6 not supported")
6995    @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
6996    def test_dual_stack_client_v6(self):
6997        port = socket_helper.find_unused_port()
6998        with socket.create_server(("", port), family=socket.AF_INET6,
6999                                  dualstack_ipv6=True) as sock:
7000            self.echo_server(sock)
7001            self.echo_client(("::1", port), socket.AF_INET6)
7002
7003@requireAttrs(socket, "send_fds")
7004@requireAttrs(socket, "recv_fds")
7005@requireAttrs(socket, "AF_UNIX")
7006class SendRecvFdsTests(unittest.TestCase):
7007    def testSendAndRecvFds(self):
7008        def close_pipes(pipes):
7009            for fd1, fd2 in pipes:
7010                os.close(fd1)
7011                os.close(fd2)
7012
7013        def close_fds(fds):
7014            for fd in fds:
7015                os.close(fd)
7016
7017        # send 10 file descriptors
7018        pipes = [os.pipe() for _ in range(10)]
7019        self.addCleanup(close_pipes, pipes)
7020        fds = [rfd for rfd, wfd in pipes]
7021
7022        # use a UNIX socket pair to exchange file descriptors locally
7023        sock1, sock2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
7024        with sock1, sock2:
7025            socket.send_fds(sock1, [MSG], fds)
7026            # request more data and file descriptors than expected
7027            msg, fds2, flags, addr = socket.recv_fds(sock2, len(MSG) * 2, len(fds) * 2)
7028            self.addCleanup(close_fds, fds2)
7029
7030        self.assertEqual(msg, MSG)
7031        self.assertEqual(len(fds2), len(fds))
7032        self.assertEqual(flags, 0)
7033        # don't test addr
7034
7035        # test that file descriptors are connected
7036        for index, fds in enumerate(pipes):
7037            rfd, wfd = fds
7038            os.write(wfd, str(index).encode())
7039
7040        for index, rfd in enumerate(fds2):
7041            data = os.read(rfd, 100)
7042            self.assertEqual(data,  str(index).encode())
7043
7044
7045def setUpModule():
7046    thread_info = threading_helper.threading_setup()
7047    unittest.addModuleCleanup(threading_helper.threading_cleanup, *thread_info)
7048
7049
7050if __name__ == "__main__":
7051    unittest.main()
7052