From 6798689ba1b7596933cec08be5e6122d2763d777 Mon Sep 17 00:00:00 2001 From: Vladimir Kotal Date: Mon, 24 Jul 2023 23:06:24 +0200 Subject: [PATCH 1/2] add basic loop() test --- tests/test_loop.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 tests/test_loop.py diff --git a/tests/test_loop.py b/tests/test_loop.py new file mode 100644 index 00000000..4ee3fa65 --- /dev/null +++ b/tests/test_loop.py @@ -0,0 +1,68 @@ +# SPDX-FileCopyrightText: 2023 VladimĂ­r Kotal +# +# SPDX-License-Identifier: Unlicense + +"""loop() tests""" + +import random +import socket +import ssl +import time +from unittest import TestCase, main +from unittest.mock import patch + +import adafruit_minimqtt.adafruit_minimqtt as MQTT + + +class Loop(TestCase): + """basic loop() test""" + + connect_times = [] + INITIAL_RCS_VAL = 42 + rcs_val = INITIAL_RCS_VAL + + def fake_wait_for_msg(self): + """_wait_for_msg() replacement. Sleeps for 1 second and returns an integer.""" + time.sleep(1) + retval = self.rcs_val + self.rcs_val += 1 + return retval + + def test_loop_basic(self) -> None: + """ + test that loop() returns only after the specified timeout, regardless whether + _wait_for_msg() returned repeatedly within that timeout. + """ + + host = "172.40.0.3" + port = 1883 + + mqtt_client = MQTT.MQTT( + broker=host, + port=port, + socket_pool=socket, + ssl_context=ssl.create_default_context(), + ) + + with patch.object(mqtt_client, "_wait_for_msg") as mock_method: + mock_method.side_effect = self.fake_wait_for_msg + + time_before = time.time() + timeout = random.randint(3, 8) + rcs = mqtt_client.loop(timeout=timeout) + time_after = time.time() + + assert time_after - time_before >= timeout + mock_method.assert_called() + + # Check the return value. + assert rcs is not None + assert len(rcs) > 1 + expected_rc = self.INITIAL_RCS_VAL + for ret_code in rcs: + assert ret_code == expected_rc + expected_rc += 1 + + +if __name__ == "__main__": + main() From 7eb02215635a84c96ebfceef752ec85632787ba8 Mon Sep 17 00:00:00 2001 From: Vladimir Kotal Date: Tue, 25 Jul 2023 09:20:42 +0200 Subject: [PATCH 2/2] use monotonic time --- tests/test_loop.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_loop.py b/tests/test_loop.py index 4ee3fa65..80ffc227 100644 --- a/tests/test_loop.py +++ b/tests/test_loop.py @@ -47,10 +47,10 @@ def test_loop_basic(self) -> None: with patch.object(mqtt_client, "_wait_for_msg") as mock_method: mock_method.side_effect = self.fake_wait_for_msg - time_before = time.time() + time_before = time.monotonic() timeout = random.randint(3, 8) rcs = mqtt_client.loop(timeout=timeout) - time_after = time.time() + time_after = time.monotonic() assert time_after - time_before >= timeout mock_method.assert_called()