Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions roborock/roborock_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,9 @@ class RoborockB01Props(StrEnum):
]


MAX_PAYLOAD_REPR_LEN = 1024


@dataclass
class RoborockMessage:
protocol: RoborockMessageProtocol
Expand All @@ -243,3 +246,18 @@ class RoborockMessage:
version: bytes = b"1.0"
random: int = field(default_factory=lambda: get_next_int(10000, 99999))
timestamp: int = field(default_factory=lambda: get_timestamp())

def __repr__(self) -> str:
payload_repr = "None"
if self.payload is not None:
if isinstance(self.payload, (bytes, bytearray, str)) and len(self.payload) > MAX_PAYLOAD_REPR_LEN:
r = repr(self.payload[:MAX_PAYLOAD_REPR_LEN])
quote = r[-1]
payload_repr = f"{r[:-1]}...{quote} (length: {len(self.payload)})"
else:
payload_repr = repr(self.payload)
return (
f"RoborockMessage(protocol={self.protocol}, payload={payload_repr}, "
f"seq={self.seq}, version={self.version!r}, random={self.random}, "
f"timestamp={self.timestamp})"
)
49 changes: 48 additions & 1 deletion tests/test_roborock_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from freezegun import freeze_time

from roborock.roborock_message import RoborockMessage, RoborockMessageProtocol
from roborock.roborock_message import MAX_PAYLOAD_REPR_LEN, RoborockMessage, RoborockMessageProtocol


def test_roborock_message() -> None:
Expand All @@ -23,3 +23,50 @@ def test_roborock_message() -> None:
assert message1.seq != message2.seq
assert message1.random != message2.random
assert message1.timestamp > message2.timestamp


def test_roborock_message_repr() -> None:
"""Test custom __repr__ of RoborockMessage truncates long payloads."""
# 1. Payload is None
msg_none = RoborockMessage(
protocol=RoborockMessageProtocol.RPC_REQUEST,
payload=None,
seq=123456,
version=b"1.0",
random=12345,
timestamp=1700000000,
)
assert repr(msg_none) == (
"RoborockMessage(protocol=101, payload=None, seq=123456, version=b'1.0', random=12345, timestamp=1700000000)"
)

# 2. Payload is short (<= MAX_PAYLOAD_REPR_LEN bytes)
short_payload = b"a" * MAX_PAYLOAD_REPR_LEN
msg_short = RoborockMessage(
protocol=RoborockMessageProtocol.RPC_REQUEST,
payload=short_payload,
seq=123456,
version=b"1.0",
random=12345,
timestamp=1700000000,
)
assert repr(msg_short) == (
f"RoborockMessage(protocol=101, payload={repr(short_payload)}, seq=123456, "
"version=b'1.0', random=12345, timestamp=1700000000)"
)

# 3. Payload is long (> MAX_PAYLOAD_REPR_LEN bytes)
long_payload = b"a" * (MAX_PAYLOAD_REPR_LEN + 10)
msg_long = RoborockMessage(
protocol=RoborockMessageProtocol.RPC_REQUEST,
payload=long_payload,
seq=123456,
version=b"1.0",
random=12345,
timestamp=1700000000,
)
expected_payload_repr = f"b'{'a' * MAX_PAYLOAD_REPR_LEN}...' (length: {MAX_PAYLOAD_REPR_LEN + 10})"
assert repr(msg_long) == (
f"RoborockMessage(protocol=101, payload={expected_payload_repr}, seq=123456, "
"version=b'1.0', random=12345, timestamp=1700000000)"
)
Loading