From b2773b990ddbf84e2c360c0070666e60b39f29fc Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Mon, 20 Jan 2025 21:58:25 -0800 Subject: [PATCH 1/4] test: set queue timeout of 10 --- tests/conftest.py | 5 +++-- tests/test_a01_api.py | 3 ++- tests/test_api.py | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 4fb63e34..134a8868 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -22,6 +22,7 @@ # Used by fixtures to handle incoming requests and prepare responses RequestHandler = Callable[[bytes], bytes | None] +QUEUE_TIMEOUT = 10 class FakeSocketHandler: @@ -145,7 +146,7 @@ async def mqtt_client(mock_create_connection: None, mock_select: None) -> AsyncG device=home_data.devices[0], model=home_data.products[0].model, ) - client = RoborockMqttClientV1(user_data, device_info) + client = RoborockMqttClientV1(user_data, device_info, queue_timeout=QUEUE_TIMEOUT) try: yield client finally: @@ -239,7 +240,7 @@ async def local_client_fixture(mock_create_local_connection: None) -> AsyncGener model=home_data.products[0].model, host=TEST_LOCAL_API_HOST, ) - client = RoborockLocalClientV1(device_info) + yield RoborockLocalClientV1(device_info, queue_timeout=QUEUE_TIMEOUT) try: yield client finally: diff --git a/tests/test_a01_api.py b/tests/test_a01_api.py index 0e77a0dc..c317e93c 100644 --- a/tests/test_a01_api.py +++ b/tests/test_a01_api.py @@ -33,6 +33,7 @@ ) from . import mqtt_packet +from .conftest import QUEUE_TIMEOUT @pytest.fixture(name="a01_mqtt_client") @@ -51,7 +52,7 @@ async def a01_mqtt_client_fixture( device=home_data.devices[0], model=home_data.products[0].model, ) - client = RoborockMqttClientA01(user_data, device_info, RoborockCategory.WASHING_MACHINE) + client = RoborockMqttClientA01(user_data, device_info, RoborockCategory.WASHING_MACHINE, queue_timeout=QUEUE_TIMEOUT) try: yield client finally: diff --git a/tests/test_api.py b/tests/test_api.py index 82a29428..476eea8e 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -33,6 +33,7 @@ ) from . import mqtt_packet +from .conftest import QUEUE_TIMEOUT def test_can_create_prepared_request(): From a395c6ddcab60ba6e59b89e5a60eb4dc2403311b Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Mon, 20 Jan 2025 22:00:00 -0800 Subject: [PATCH 2/4] test: cleanup lint errors --- tests/test_api.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_api.py b/tests/test_api.py index 476eea8e..82a29428 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -33,7 +33,6 @@ ) from . import mqtt_packet -from .conftest import QUEUE_TIMEOUT def test_can_create_prepared_request(): From b52227ebdb7d023491d2060e1ad673cdbbb0fc29 Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Mon, 20 Jan 2025 22:15:01 -0800 Subject: [PATCH 3/4] fix: set queue_timeout in the client leaf base classes --- roborock/api.py | 4 ++-- roborock/cloud_api.py | 4 ++-- roborock/local_api.py | 4 ++-- roborock/version_1_apis/roborock_local_client_v1.py | 3 ++- roborock/version_1_apis/roborock_mqtt_client_v1.py | 3 ++- roborock/version_a01_apis/roborock_client_a01.py | 4 ++-- roborock/version_a01_apis/roborock_mqtt_client_a01.py | 5 +++-- 7 files changed, 15 insertions(+), 12 deletions(-) diff --git a/roborock/api.py b/roborock/api.py index d5b60622..a0d1306c 100644 --- a/roborock/api.py +++ b/roborock/api.py @@ -31,8 +31,9 @@ class RoborockClient(ABC): """Roborock client base class.""" _logger: logging.LoggerAdapter + queue_timeout: int - def __init__(self, device_info: DeviceData, queue_timeout: int = 4) -> None: + def __init__(self, device_info: DeviceData) -> None: """Initialize RoborockClient.""" self.event_loop = get_running_loop_or_create_one() self.device_info = device_info @@ -45,7 +46,6 @@ def __init__(self, device_info: DeviceData, queue_timeout: int = 4) -> None: "misc_info": {"Nonce": base64.b64encode(self._nonce).decode("utf-8")} } self.is_available: bool = True - self.queue_timeout = queue_timeout def __del__(self) -> None: self.release() diff --git a/roborock/cloud_api.py b/roborock/cloud_api.py index a261ffac..b608c89a 100644 --- a/roborock/cloud_api.py +++ b/roborock/cloud_api.py @@ -46,12 +46,12 @@ def maybe_restart_loop(self) -> None: class RoborockMqttClient(RoborockClient, ABC): """Roborock MQTT client base class.""" - def __init__(self, user_data: UserData, device_info: DeviceData, queue_timeout: int = 10) -> None: + def __init__(self, user_data: UserData, device_info: DeviceData) -> None: """Initialize the Roborock MQTT client.""" rriot = user_data.rriot if rriot is None: raise RoborockException("Got no rriot data from user_data") - RoborockClient.__init__(self, device_info, queue_timeout) + RoborockClient.__init__(self, device_info) self._mqtt_user = rriot.u self._hashed_user = md5hex(self._mqtt_user + ":" + rriot.k)[2:10] url = urlparse(rriot.r.m) diff --git a/roborock/local_api.py b/roborock/local_api.py index b3064e0f..31deba46 100644 --- a/roborock/local_api.py +++ b/roborock/local_api.py @@ -37,7 +37,7 @@ def connection_lost(self, exc: Exception | None) -> None: class RoborockLocalClient(RoborockClient, ABC): """Roborock local client base class.""" - def __init__(self, device_data: DeviceData, queue_timeout: int = 4): + def __init__(self, device_data: DeviceData): """Initialize the Roborock local client.""" if device_data.host is None: raise RoborockException("Host is required") @@ -48,7 +48,7 @@ def __init__(self, device_data: DeviceData, queue_timeout: int = 4): self.transport: Transport | None = None self._mutex = Lock() self.keep_alive_task: TimerHandle | None = None - RoborockClient.__init__(self, device_data, queue_timeout) + RoborockClient.__init__(self, device_data) self._local_protocol = _LocalProtocol(self._data_received, self._connection_lost) def _data_received(self, message): diff --git a/roborock/version_1_apis/roborock_local_client_v1.py b/roborock/version_1_apis/roborock_local_client_v1.py index e83e9d29..8d11a225 100644 --- a/roborock/version_1_apis/roborock_local_client_v1.py +++ b/roborock/version_1_apis/roborock_local_client_v1.py @@ -17,8 +17,9 @@ class RoborockLocalClientV1(RoborockLocalClient, RoborockClientV1): def __init__(self, device_data: DeviceData, queue_timeout: int = 4): """Initialize the Roborock local client.""" - RoborockLocalClient.__init__(self, device_data, queue_timeout) + RoborockLocalClient.__init__(self, device_data) RoborockClientV1.__init__(self, device_data, "abc") + self.queue_timeout = queue_timeout self._logger = RoborockLoggerAdapter(device_data.device.name, _LOGGER) def build_roborock_message( diff --git a/roborock/version_1_apis/roborock_mqtt_client_v1.py b/roborock/version_1_apis/roborock_mqtt_client_v1.py index aa75ebaa..d4d074e2 100644 --- a/roborock/version_1_apis/roborock_mqtt_client_v1.py +++ b/roborock/version_1_apis/roborock_mqtt_client_v1.py @@ -32,8 +32,9 @@ def __init__(self, user_data: UserData, device_info: DeviceData, queue_timeout: raise RoborockException("Got no rriot data from user_data") endpoint = base64.b64encode(Utils.md5(rriot.k.encode())[8:14]).decode() - RoborockMqttClient.__init__(self, user_data, device_info, queue_timeout) + RoborockMqttClient.__init__(self, user_data, device_info) RoborockClientV1.__init__(self, device_info, endpoint) + self.queue_timeout = queue_timeout self._logger = RoborockLoggerAdapter(device_info.device.name, _LOGGER) async def send_message(self, roborock_message: RoborockMessage): diff --git a/roborock/version_a01_apis/roborock_client_a01.py b/roborock/version_a01_apis/roborock_client_a01.py index f0da1cde..b736c348 100644 --- a/roborock/version_a01_apis/roborock_client_a01.py +++ b/roborock/version_a01_apis/roborock_client_a01.py @@ -108,9 +108,9 @@ class A01ProtocolCacheEntry: class RoborockClientA01(RoborockClient, ABC): """Roborock client base class for A01 devices.""" - def __init__(self, device_info: DeviceData, category: RoborockCategory, queue_timeout: int = 4): + def __init__(self, device_info: DeviceData, category: RoborockCategory): """Initialize the Roborock client.""" - super().__init__(device_info, queue_timeout) + super().__init__(device_info) self.category = category def on_message_received(self, messages: list[RoborockMessage]) -> None: diff --git a/roborock/version_a01_apis/roborock_mqtt_client_a01.py b/roborock/version_a01_apis/roborock_mqtt_client_a01.py index 915fe895..f19daf44 100644 --- a/roborock/version_a01_apis/roborock_mqtt_client_a01.py +++ b/roborock/version_a01_apis/roborock_mqtt_client_a01.py @@ -34,8 +34,9 @@ def __init__( if rriot is None: raise RoborockException("Got no rriot data from user_data") - RoborockMqttClient.__init__(self, user_data, device_info, queue_timeout) - RoborockClientA01.__init__(self, device_info, category, queue_timeout) + RoborockMqttClient.__init__(self, user_data, device_info) + RoborockClientA01.__init__(self, device_info, category) + self.queue_timeout = queue_timeout self._logger = RoborockLoggerAdapter(device_info.device.name, _LOGGER) async def send_message(self, roborock_message: RoborockMessage): From ae797e34e8424931fb4b9d60f5fc2338e163c99e Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Tue, 21 Jan 2025 07:24:37 -0800 Subject: [PATCH 4/4] chore: fix test fixture after merging --- tests/conftest.py | 2 +- tests/test_a01_api.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 134a8868..e2199e6c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -240,7 +240,7 @@ async def local_client_fixture(mock_create_local_connection: None) -> AsyncGener model=home_data.products[0].model, host=TEST_LOCAL_API_HOST, ) - yield RoborockLocalClientV1(device_info, queue_timeout=QUEUE_TIMEOUT) + client = RoborockLocalClientV1(device_info, queue_timeout=QUEUE_TIMEOUT) try: yield client finally: diff --git a/tests/test_a01_api.py b/tests/test_a01_api.py index c317e93c..48c5591a 100644 --- a/tests/test_a01_api.py +++ b/tests/test_a01_api.py @@ -52,7 +52,9 @@ async def a01_mqtt_client_fixture( device=home_data.devices[0], model=home_data.products[0].model, ) - client = RoborockMqttClientA01(user_data, device_info, RoborockCategory.WASHING_MACHINE, queue_timeout=QUEUE_TIMEOUT) + client = RoborockMqttClientA01( + user_data, device_info, RoborockCategory.WASHING_MACHINE, queue_timeout=QUEUE_TIMEOUT + ) try: yield client finally: