test_rfid_client.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import time
  2. from types import SimpleNamespace
  3. from hookvision.rfid_client import RFIDClient, _MIN_BACKOFF
  4. class _FakeSock:
  5. def recv(self, size):
  6. raise OSError("connection reset")
  7. def close(self):
  8. pass
  9. def _make_client(callbacks=None):
  10. callbacks = callbacks or {}
  11. config = SimpleNamespace(ip="127.0.0.1", port=1, stability_time=5, stability_count=3)
  12. client = RFIDClient(config, on_tag_callback=callbacks.get("on_tag"), on_state_changed=callbacks.get("on_state"))
  13. return client
  14. class TestSessionCloseKeepsTag:
  15. def test_read_loop_exit_does_not_clear_tag(self):
  16. events = []
  17. client = _make_client({"on_tag": lambda tag: events.append(tag)})
  18. client.running = True
  19. client.sock = _FakeSock()
  20. client._read_loop()
  21. assert client.sock is None
  22. assert client._backoff == _MIN_BACKOFF
  23. assert client._backoff == 1
  24. assert events == []
  25. def test_check_idle_does_not_reconnect_within_backoff(self):
  26. events = []
  27. client = _make_client({"on_tag": lambda tag: events.append(tag)})
  28. client._last_connect_attempt = time.time()
  29. client.check_idle()
  30. assert client.sock is None
  31. assert events == []
  32. class TestIdleTimeout:
  33. def test_idle_timeout_still_clears_tag_when_connected(self):
  34. events = []
  35. client = _make_client({"on_tag": lambda tag: events.append(tag)})
  36. client._last_tag = "AABBCC"
  37. client._last_time = time.time() - 10
  38. client._last_connect_attempt = time.time()
  39. # 模拟已连接状态
  40. client.sock = _FakeSock()
  41. client.check_idle()
  42. assert client._last_tag is None
  43. assert events == [None]
  44. def test_idle_timeout_does_not_clear_tag_when_disconnected(self):
  45. events = []
  46. client = _make_client({"on_tag": lambda tag: events.append(tag)})
  47. client._last_tag = "AABBCC"
  48. client._last_time = time.time() - 10
  49. client._last_connect_attempt = time.time()
  50. # socket为None(断开状态)
  51. client.check_idle()
  52. assert client._last_tag == "AABBCC"
  53. assert events == []