diff --git a/src/easynetwork/lowlevel/_utils.py b/src/easynetwork/lowlevel/_utils.py index 1be19f7b..e5afc1cd 100644 --- a/src/easynetwork/lowlevel/_utils.py +++ b/src/easynetwork/lowlevel/_utils.py @@ -166,7 +166,7 @@ def check_socket_family(family: int) -> None: raise ValueError("Only these families are supported: AF_INET, AF_INET6") -def check_real_socket_state(socket: ISocket, error_msg: str = "{strerror}") -> None: +def check_real_socket_state(socket: ISocket, error_msg: str | None = None) -> None: """Verify socket saved error and raise OSError if there is one There are some functions such as socket.send() which do not immediately fail and save the errno @@ -180,7 +180,10 @@ def check_real_socket_state(socket: ISocket, error_msg: str = "{strerror}") -> N errno = socket.getsockopt(_socket.SOL_SOCKET, _socket.SO_ERROR) if errno != 0: # The SO_ERROR is automatically reset to zero after getting the value - raise error_from_errno(errno, error_msg) + if error_msg: + raise error_from_errno(errno, error_msg) + else: + raise error_from_errno(errno) class _SupportsSocketSendMSG(Protocol): diff --git a/tests/unit_test/test_tools/test_utils.py b/tests/unit_test/test_tools/test_utils.py index 75042105..e965eada 100644 --- a/tests/unit_test/test_tools/test_utils.py +++ b/tests/unit_test/test_tools/test_utils.py @@ -338,6 +338,26 @@ def test____check_real_socket_state____socket_with_error(mock_tcp_socket: MagicM mock_error_from_errno.assert_called_once_with(errno) +def test____check_real_socket_state____socket_with_error____custom_message( + mock_tcp_socket: MagicMock, + mocker: MockerFixture, +) -> None: + # Arrange + errno = 123456 + exception = OSError(errno, "errno message") + mock_tcp_socket.getsockopt.return_value = errno + mock_error_from_errno = mocker.patch(f"{error_from_errno.__module__}.{error_from_errno.__qualname__}", return_value=exception) + + # Act + with pytest.raises(OSError) as exc_info: + check_real_socket_state(mock_tcp_socket, error_msg="unrelated error: {strerror}") + + # Assert + assert exc_info.value is exception + mock_tcp_socket.getsockopt.assert_called_once_with(SOL_SOCKET, SO_ERROR) + mock_error_from_errno.assert_called_once_with(errno, "unrelated error: {strerror}") + + def test____check_real_socket_state____closed_socket(mock_tcp_socket: MagicMock, mocker: MockerFixture) -> None: # Arrange mock_tcp_socket.fileno.return_value = -1