Skip to content

Commit 14f03c7

Browse files
authored
fix: set unique sequence numbers on outgoing messages (#300)
1 parent 777b736 commit 14f03c7

File tree

4 files changed

+80
-11
lines changed

4 files changed

+80
-11
lines changed

poetry.lock

Lines changed: 46 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ ruff = "*"
4545
codespell = "*"
4646
pyshark = "^0.6"
4747
aioresponses = "^0.7.7"
48+
freezegun = "^1.5.1"
4849

4950
[tool.semantic_release]
5051
branch = "main"

roborock/roborock_message.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import json
44
import math
55
import time
6-
from dataclasses import dataclass
6+
from dataclasses import dataclass, field
77

88
from roborock import RoborockEnum
99
from roborock.util import get_next_int
@@ -155,10 +155,10 @@ class MessageRetry:
155155
class RoborockMessage:
156156
protocol: RoborockMessageProtocol
157157
payload: bytes | None = None
158-
seq: int = get_next_int(100000, 999999)
158+
seq: int = field(default_factory=lambda: get_next_int(100000, 999999))
159159
version: bytes = b"1.0"
160-
random: int = get_next_int(10000, 99999)
161-
timestamp: int = math.floor(time.time())
160+
random: int = field(default_factory=lambda: get_next_int(10000, 99999))
161+
timestamp: int = field(default_factory=lambda: math.floor(time.time()))
162162
message_retry: MessageRetry | None = None
163163

164164
def get_request_id(self) -> int | None:

tests/test_roborock_message.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import json
2+
3+
from freezegun import freeze_time
4+
5+
from roborock.roborock_message import RoborockMessage, RoborockMessageProtocol
6+
7+
8+
def test_roborock_message() -> None:
9+
"""Test the RoborockMessage class is initialized."""
10+
with freeze_time("2025-01-20T12:00:00"):
11+
message1 = RoborockMessage(
12+
protocol=RoborockMessageProtocol.RPC_REQUEST,
13+
payload=json.dumps({"dps": {"101": json.dumps({"id": 4321})}}).encode(),
14+
message_retry=None,
15+
)
16+
assert message1.get_request_id() == 4321
17+
18+
with freeze_time("2025-01-20T11:00:00"): # Back in time 1hr to test timestamp
19+
message2 = RoborockMessage(
20+
protocol=RoborockMessageProtocol.RPC_RESPONSE,
21+
payload=json.dumps({"dps": {"94": json.dumps({"id": 444}), "102": json.dumps({"id": 333})}}).encode(),
22+
message_retry=None,
23+
)
24+
assert message2.get_request_id() == 333
25+
26+
# Ensure the sequence, random numbers, etc are initialized properly
27+
assert message1.seq != message2.seq
28+
assert message1.random != message2.random
29+
assert message1.timestamp > message2.timestamp

0 commit comments

Comments
 (0)