#!/usr/bin/env python3 """ Test suite for the Python ubloxd implementation. Tests UBLOX message parsing, processing, and cereal message generation. """ import struct from openpilot.system.ubloxd.ubloxd import ( UBXMessageParser, UBXMessageProcessor, UBXMessage, UBLOX_PREAMBLE1, UBLOX_PREAMBLE2, UBXClass, UBXMessageID ) class TestUBXMessageParser: """Test UBLOX message parser functionality""" def setup_method(self): self.parser = UBXMessageParser() def test_calculate_checksum(self): """Test UBLOX checksum calculation""" # Test message: UBX header + simple payload msg = bytearray([0xb5, 0x62, 0x01, 0x07, 0x04, 0x00, 0x01, 0x02, 0x03, 0x04]) ck_a, ck_b = self.parser._calculate_checksum(msg, 2, 10) assert isinstance(ck_a, int) assert isinstance(ck_b, int) assert 0 <= ck_a <= 255 assert 0 <= ck_b <= 255 def test_simple_message_parsing(self): """Test parsing a complete simple message""" # Create a simple test message: UBX-NAV-PVT stub payload = b'\x00' * 92 # Minimum NAV-PVT payload size msg_data = struct.pack(' 0 # Reset should clear buffer self.parser.reset() assert len(self.parser.parse_buffer) == 0 class TestUBXMessageProcessor: """Test UBLOX message processing and cereal event generation""" def setup_method(self): self.processor = UBXMessageProcessor() def test_process_nav_pvt(self, mocker): """Test processing of NAV-PVT messages""" # Mock cereal message mock_event = mocker.MagicMock() mock_location = mocker.MagicMock() mock_event.gpsLocationExternal = mock_location mock_new_message = mocker.patch('openpilot.system.ubloxd.ubloxd.messaging.new_message', return_value=mock_event) # Create NAV-PVT payload with test data fixType = 3 # 3D fix numSV = 12 # 12 satellites lon = int(-122.419416 * 1e7) # San Francisco longitude lat = int(37.774929 * 1e7) # San Francisco latitude height = 100000 # 100m above ellipsoid (in mm) hAcc = 5000 # 5m horizontal accuracy (in mm) vAcc = 10000 # 10m vertical accuracy (in mm) gSpeed = 2236 # ground speed ~2.24 m/s (in mm/s) headMot = 4500000 # 45 degrees heading (in 1e-5 deg) sAcc = 500 # 0.5 m/s speed accuracy (in mm/s) headAcc = 1800000 # 18 degree heading accuracy (in 1e-5 deg) # Pack the payload (first 92 bytes of NAV-PVT) payload = struct.pack('