test_integration_polling.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import sys
  2. import os
  3. import tempfile
  4. sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  5. import numpy as np
  6. from polling_tracker import PollingTrackingCoordinator
  7. from tracker import TrackedPerson, UltralyticsTracker
  8. class FakePanorama:
  9. def __init__(self):
  10. self.connected = False
  11. self.streaming = False
  12. def connect(self):
  13. self.connected = True
  14. return True
  15. def start_stream_rtsp(self):
  16. self.streaming = True
  17. return True
  18. def get_frame(self):
  19. return np.zeros((480, 640, 3), dtype=np.uint8)
  20. def disconnect(self):
  21. self.connected = False
  22. self.streaming = False
  23. class FakePTZ:
  24. def __init__(self):
  25. self.connected = False
  26. self.commands = []
  27. self.ptz_config = {"default_zoom": 8}
  28. def connect(self):
  29. self.connected = True
  30. return True
  31. def goto_exact_position(self, pan, tilt, zoom):
  32. self.commands.append((pan, tilt, zoom))
  33. return True
  34. def get_frame(self):
  35. return np.zeros((480, 640, 3), dtype=np.uint8)
  36. def get_current_position(self):
  37. return type("P", (), {"pan": 0, "tilt": 0, "zoom": 1})()
  38. def calculate_ptz_position(self, x, y, zoom=None):
  39. return x * 180, y * 90, zoom or 8
  40. def disconnect(self):
  41. self.connected = False
  42. class FakeTracker:
  43. def __init__(self):
  44. self.frame_count = 0
  45. def update(self, frame):
  46. self.frame_count += 1
  47. return [
  48. TrackedPerson(track_id=1, bbox=(100, 100, 150, 200), center=(125, 150), confidence=0.9),
  49. ]
  50. def test_integration_polling_start_stop():
  51. pan = FakePanorama()
  52. ptz = FakePTZ()
  53. tracker = FakeTracker()
  54. capture_dir = tempfile.mkdtemp(prefix="tracking_captures_")
  55. coord = PollingTrackingCoordinator(pan, ptz, tracker, config={
  56. "max_tracking_targets": 4,
  57. "ptz_stabilize_time": 0.05,
  58. "tracking_timeout": 1.0,
  59. "enable_upload": False,
  60. "capture_dir": capture_dir,
  61. })
  62. assert coord.start() is True
  63. import time
  64. time.sleep(0.3)
  65. coord.stop()
  66. assert pan.connected is False
  67. assert ptz.connected is False
  68. assert len(ptz.commands) > 0