Skip to content

Commit 94c6aa0

Browse files
committed
feat: truncate large payloads in RoborockMessage __repr__
1 parent 9e95992 commit 94c6aa0

2 files changed

Lines changed: 66 additions & 1 deletion

File tree

roborock/roborock_message.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,9 @@ class RoborockB01Props(StrEnum):
274274
]
275275

276276

277+
MAX_PAYLOAD_REPR_LEN = 1024
278+
279+
277280
@dataclass
278281
class RoborockMessage:
279282
protocol: RoborockMessageProtocol
@@ -282,3 +285,18 @@ class RoborockMessage:
282285
version: bytes = b"1.0"
283286
random: int = field(default_factory=lambda: get_next_int(10000, 99999))
284287
timestamp: int = field(default_factory=lambda: get_timestamp())
288+
289+
def __repr__(self) -> str:
290+
payload_repr = "None"
291+
if self.payload is not None:
292+
if isinstance(self.payload, (bytes, bytearray, str)) and len(self.payload) > MAX_PAYLOAD_REPR_LEN:
293+
r = repr(self.payload[:MAX_PAYLOAD_REPR_LEN])
294+
quote = r[-1]
295+
payload_repr = f"{r[:-1]}...{quote} (length: {len(self.payload)})"
296+
else:
297+
payload_repr = repr(self.payload)
298+
return (
299+
f"RoborockMessage(protocol={self.protocol}, payload={payload_repr}, "
300+
f"seq={self.seq}, version={self.version!r}, random={self.random}, "
301+
f"timestamp={self.timestamp})"
302+
)

tests/test_roborock_message.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from freezegun import freeze_time
44

5-
from roborock.roborock_message import RoborockMessage, RoborockMessageProtocol
5+
from roborock.roborock_message import MAX_PAYLOAD_REPR_LEN, RoborockMessage, RoborockMessageProtocol
66

77

88
def test_roborock_message() -> None:
@@ -23,3 +23,50 @@ def test_roborock_message() -> None:
2323
assert message1.seq != message2.seq
2424
assert message1.random != message2.random
2525
assert message1.timestamp > message2.timestamp
26+
27+
28+
def test_roborock_message_repr() -> None:
29+
"""Test custom __repr__ of RoborockMessage truncates long payloads."""
30+
# 1. Payload is None
31+
msg_none = RoborockMessage(
32+
protocol=RoborockMessageProtocol.RPC_REQUEST,
33+
payload=None,
34+
seq=123456,
35+
version=b"1.0",
36+
random=12345,
37+
timestamp=1700000000,
38+
)
39+
assert repr(msg_none) == (
40+
"RoborockMessage(protocol=101, payload=None, seq=123456, version=b'1.0', random=12345, timestamp=1700000000)"
41+
)
42+
43+
# 2. Payload is short (<= MAX_PAYLOAD_REPR_LEN bytes)
44+
short_payload = b"a" * MAX_PAYLOAD_REPR_LEN
45+
msg_short = RoborockMessage(
46+
protocol=RoborockMessageProtocol.RPC_REQUEST,
47+
payload=short_payload,
48+
seq=123456,
49+
version=b"1.0",
50+
random=12345,
51+
timestamp=1700000000,
52+
)
53+
assert repr(msg_short) == (
54+
f"RoborockMessage(protocol=101, payload={repr(short_payload)}, seq=123456, "
55+
"version=b'1.0', random=12345, timestamp=1700000000)"
56+
)
57+
58+
# 3. Payload is long (> MAX_PAYLOAD_REPR_LEN bytes)
59+
long_payload = b"a" * (MAX_PAYLOAD_REPR_LEN + 10)
60+
msg_long = RoborockMessage(
61+
protocol=RoborockMessageProtocol.RPC_REQUEST,
62+
payload=long_payload,
63+
seq=123456,
64+
version=b"1.0",
65+
random=12345,
66+
timestamp=1700000000,
67+
)
68+
expected_payload_repr = f"b'{'a' * MAX_PAYLOAD_REPR_LEN}...' (length: {MAX_PAYLOAD_REPR_LEN + 10})"
69+
assert repr(msg_long) == (
70+
f"RoborockMessage(protocol=101, payload={expected_payload_repr}, seq=123456, "
71+
"version=b'1.0', random=12345, timestamp=1700000000)"
72+
)

0 commit comments

Comments
 (0)