mirror of
https://github.com/esphome/aioesphomeapi.git
synced 2024-09-27 04:22:46 +02:00
Add test coverage for invalid protobuf messages (#701)
This commit is contained in:
parent
cd8977e480
commit
9edba66d30
@ -815,14 +815,14 @@ class APIConnection:
|
|||||||
_LOGGER.error(
|
_LOGGER.error(
|
||||||
"%s: Invalid protobuf message: type=%s data=%s: %s",
|
"%s: Invalid protobuf message: type=%s data=%s: %s",
|
||||||
self.log_name,
|
self.log_name,
|
||||||
msg_type_proto,
|
klass.__name__,
|
||||||
data,
|
data,
|
||||||
e,
|
e,
|
||||||
exc_info=True,
|
exc_info=True,
|
||||||
)
|
)
|
||||||
self.report_fatal_error(
|
self.report_fatal_error(
|
||||||
ProtocolAPIError(
|
ProtocolAPIError(
|
||||||
f"Invalid protobuf message: type={msg_type_proto} data={data!r}: {e}"
|
f"Invalid protobuf message: type={klass.__name__} data={data!r}: {e}"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
raise
|
raise
|
||||||
|
@ -19,6 +19,7 @@ from aioesphomeapi.api_pb2 import (
|
|||||||
HelloResponse,
|
HelloResponse,
|
||||||
PingRequest,
|
PingRequest,
|
||||||
PingResponse,
|
PingResponse,
|
||||||
|
TextSensorStateResponse,
|
||||||
)
|
)
|
||||||
from aioesphomeapi.connection import APIConnection, ConnectionParams, ConnectionState
|
from aioesphomeapi.connection import APIConnection, ConnectionParams, ConnectionState
|
||||||
from aioesphomeapi.core import (
|
from aioesphomeapi.core import (
|
||||||
@ -738,3 +739,33 @@ async def test_unknown_protobuf_message_type_logged(
|
|||||||
assert connection.is_connected
|
assert connection.is_connected
|
||||||
await connection.force_disconnect()
|
await connection.force_disconnect()
|
||||||
await asyncio.sleep(0)
|
await asyncio.sleep(0)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_bad_protobuf_message_drops_connection(
|
||||||
|
api_client: tuple[
|
||||||
|
APIClient, APIConnection, asyncio.Transport, APIPlaintextFrameHelper
|
||||||
|
],
|
||||||
|
caplog: pytest.LogCaptureFixture,
|
||||||
|
) -> None:
|
||||||
|
"""Test ad bad protobuf messages is logged and causes the connection to collapse."""
|
||||||
|
client, connection, transport, protocol = api_client
|
||||||
|
msg: message.Message = TextSensorStateResponse(
|
||||||
|
key=1, state="invalid", missing_state=False
|
||||||
|
)
|
||||||
|
caplog.clear()
|
||||||
|
caplog.set_level(logging.DEBUG)
|
||||||
|
client.set_debug(True)
|
||||||
|
bytes_ = msg.SerializeToString()
|
||||||
|
# Replace the bytes with invalid UTF-8
|
||||||
|
bytes_ = bytes.replace(bytes_, b"invalid", b"inval\xe9 ")
|
||||||
|
|
||||||
|
message_with_bad_protobuf_data = (
|
||||||
|
b"\0"
|
||||||
|
+ _cached_varuint_to_bytes(len(bytes_))
|
||||||
|
+ _cached_varuint_to_bytes(27)
|
||||||
|
+ bytes_
|
||||||
|
)
|
||||||
|
mock_data_received(protocol, message_with_bad_protobuf_data)
|
||||||
|
assert "Invalid protobuf message: type=TextSensorStateResponse" in caplog.text
|
||||||
|
assert connection.is_connected is False
|
||||||
|
Loading…
Reference in New Issue
Block a user