diff --git a/tests/test_impl.py b/tests/test_impl.py index 935b1cd..be68222 100644 --- a/tests/test_impl.py +++ b/tests/test_impl.py @@ -824,7 +824,87 @@ async def _sock_connect( @pytest.mark.asyncio @patch_socket -async def test__ipv64_laddr_eyeballs_ipv4_only_tried( +async def test_ipv64_laddr_socket_fails( + m_socket: ModuleType, +) -> None: + mock_socket = mock.MagicMock( + family=socket.AF_INET, + type=socket.SOCK_STREAM, + proto=socket.IPPROTO_TCP, + fileno=mock.MagicMock(return_value=1), + ) + create_calls = [] + + def _socket(*args, **kw): + raise Exception("Something really went wrong") + + async def _sock_connect( + sock: socket.socket, address: Tuple[str, int, int, int] + ) -> None: + create_calls.append(address) + if address[0] == "dead:beef::": + raise OSError("ipv6 fail") + + return None + + m_socket.socket = _socket # type: ignore + ipv6_addr_info = ( + socket.AF_INET6, + socket.SOCK_STREAM, + socket.IPPROTO_TCP, + "", + ("dead:beef::", 80, 0, 0), + ) + ipv6_addr_info_2 = ( + socket.AF_INET6, + socket.SOCK_STREAM, + socket.IPPROTO_TCP, + "", + ("dead:aaaa::", 80, 0, 0), + ) + ipv4_addr_info = ( + socket.AF_INET, + socket.SOCK_STREAM, + socket.IPPROTO_TCP, + "", + ("107.6.106.83", 80), + ) + addr_info = [ipv6_addr_info, ipv6_addr_info_2, ipv4_addr_info] + local_addr_infos = [ + ( + socket.AF_INET6, + socket.SOCK_STREAM, + socket.IPPROTO_TCP, + "", + ("::1", 0, 0, 0), + ), + ( + socket.AF_INET, + socket.SOCK_STREAM, + socket.IPPROTO_TCP, + "", + ("127.0.0.1", 0), + ), + ] + loop = asyncio.get_running_loop() + with mock.patch.object(loop, "sock_connect", _sock_connect), pytest.raises( + Exception, match="Something really went wrong" + ): + assert ( + await start_connection( + addr_info, + local_addr_infos=local_addr_infos, + ) + == mock_socket + ) + + # All binds failed + assert create_calls == [] + + +@pytest.mark.asyncio +@patch_socket +async def test_ipv64_laddr_eyeballs_ipv4_only_tried( m_socket: ModuleType, ) -> None: mock_socket = mock.MagicMock(