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