This commit is contained in:
2026-11-02 01:23:50 +03:00
parent f74d52d39d
commit 9d74d06ce3
29 changed files with 2347 additions and 381 deletions
+18
View File
@@ -6,8 +6,10 @@ import unittest
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from protocol import ( # noqa: E402
pack_interval_min,
pack_report,
pack_slot_config,
unpack_interval_min,
unpack_report,
unpack_slot_config,
)
@@ -41,6 +43,22 @@ class ProtocolTests(unittest.TestCase):
self.assertEqual(c.flags, 0x03)
self.assertEqual(c.period_s, 30)
def test_interval_min_roundtrip(self):
raw = pack_interval_min(30)
self.assertEqual(len(raw), 2)
self.assertEqual(raw, bytes((30, 0)))
self.assertEqual(unpack_interval_min(raw), 30)
raw2 = pack_interval_min(0x1234)
self.assertEqual(raw2[0], 0x34)
self.assertEqual(raw2[1], 0x12)
self.assertEqual(unpack_interval_min(raw2), 0x1234)
def test_interval_min_bad_length(self):
self.assertIsNone(unpack_interval_min(b""))
self.assertIsNone(unpack_interval_min(b"\x00"))
self.assertIsNone(unpack_interval_min(b"\x00\x00\x00"))
if __name__ == "__main__":
unittest.main()
+15
View File
@@ -73,6 +73,21 @@ class RegistryTests(unittest.TestCase):
self.assertIn("AA:BB:CC:DD:EE:30", r2.by_addr)
self.assertEqual(r2.by_addr["AA:BB:CC:DD:EE:30"].slot, 0)
def test_status_name_and_age(self):
s = self.reg.assign("AA:BB:CC:DD:EE:40")
s.last_seen = time.time() - 125
st = self.reg.status_dict(
names={"AA:BB:CC:DD:EE:40": "Коридор"},
report_interval_min=15,
)
self.assertEqual(st["report_interval_min"], 15)
self.assertEqual(st["period_s"], 900)
row = st["slots"][s.slot]
self.assertEqual(row["name"], "Коридор")
self.assertGreaterEqual(row["age_s"], 124)
self.assertLessEqual(row["age_s"], 126)
if __name__ == "__main__":
unittest.main()
+74
View File
@@ -0,0 +1,74 @@
#!/usr/bin/env python3
import os
import sys
import tempfile
import unittest
from pathlib import Path
from unittest import mock
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from settings import ( # noqa: E402
load_names,
load_report_interval_min,
save_names,
save_report_interval_min,
)
class SettingsTests(unittest.TestCase):
def test_interval_default(self):
with tempfile.TemporaryDirectory() as td:
p = Path(td) / "sensors-settings.json"
self.assertEqual(load_report_interval_min(p), 30)
def test_interval_roundtrip(self):
with tempfile.TemporaryDirectory() as td:
p = Path(td) / "sensors-settings.json"
self.assertEqual(save_report_interval_min(45, p), 45)
self.assertEqual(load_report_interval_min(p), 45)
def test_interval_clamp(self):
with tempfile.TemporaryDirectory() as td:
p = Path(td) / "sensors-settings.json"
self.assertEqual(save_report_interval_min(0, p), 1)
self.assertEqual(save_report_interval_min(999999, p), 65535)
def test_names_roundtrip(self):
with tempfile.TemporaryDirectory() as td:
p = Path(td) / "sensors-names.json"
saved = save_names({"aa:bb:cc:dd:ee:01": " Коридор ", "": "x"}, p)
self.assertEqual(saved, {"AA:BB:CC:DD:EE:01": "Коридор"})
self.assertEqual(load_names(p), saved)
class WritePathLatencyTests(unittest.TestCase):
def test_gatt_write_does_not_call_registry_save(self):
from gatt import CollectorGatt
from registry import Registry
reg = Registry(n=4)
reg.assign("AA:BB:CC:DD:EE:01")
gatt = CollectorGatt(reg)
gatt.set_current_addr("AA:BB:CC:DD:EE:01")
called = {"save": 0, "write": 0}
def on_write(addr, data):
called["write"] += 1
reg.update_report(addr, data[0], data[1], data[2] | (data[3] << 8))
gatt.on_write = on_write
with mock.patch.object(reg, "save", side_effect=lambda: called.__setitem__("save", called["save"] + 1)):
class Char:
uuid = "0000a001-0000-1000-8000-00805f9b34fb"
gatt.handle_write(Char(), bytearray(b"\x50\x00\x34\x12"))
self.assertEqual(called["write"], 1)
self.assertEqual(called["save"], 0)
if __name__ == "__main__":
unittest.main()