import random import re from cereal import car from openpilot.selfdrive.car.volkswagen.values import CAR, FW_QUERY_CONFIG, WMI from openpilot.selfdrive.car.volkswagen.fingerprints import FW_VERSIONS Ecu = car.CarParams.Ecu CHASSIS_CODE_PATTERN = re.compile('[A-Z0-9]{2}') # TODO: determine the unknown groups SPARE_PART_FW_PATTERN = re.compile(b'\xf1\x87(?P[0-9][0-9A-Z]{2})(?P[0-9][0-9A-Z][0-9])(?P[0-9A-Z]{2}[0-9])([A-Z0-9]| )') class TestVolkswagenPlatformConfigs: def test_spare_part_fw_pattern(self, subtests): # Relied on for determining if a FW is likely VW for platform, ecus in FW_VERSIONS.items(): with subtests.test(platform=platform.value): for fws in ecus.values(): for fw in fws: assert SPARE_PART_FW_PATTERN.match(fw) is not None, f"Bad FW: {fw}" def test_chassis_codes(self, subtests): for platform in CAR: with subtests.test(platform=platform.value): assert len(platform.config.wmis) > 0, "WMIs not set" assert len(platform.config.chassis_codes) > 0, "Chassis codes not set" assert all(CHASSIS_CODE_PATTERN.match(cc) for cc in \ platform.config.chassis_codes), "Bad chassis codes" # No two platforms should share chassis codes for comp in CAR: if platform == comp: continue assert set() == platform.config.chassis_codes & comp.config.chassis_codes, \ f"Shared chassis codes: {comp}" def test_custom_fuzzy_fingerprinting(self, subtests): all_radar_fw = list({fw for ecus in FW_VERSIONS.values() for fw in ecus[Ecu.fwdRadar, 0x757, None]}) for platform in CAR: with subtests.test(platform=platform.name): for wmi in WMI: for chassis_code in platform.config.chassis_codes | {"00"}: vin = ["0"] * 17 vin[0:3] = wmi vin[6:8] = chassis_code vin = "".join(vin) # Check a few FW cases - expected, unexpected for radar_fw in random.sample(all_radar_fw, 5) + [b'\xf1\x875Q0907572G \xf1\x890571', b'\xf1\x877H9907572AA\xf1\x890396']: should_match = ((wmi in platform.config.wmis and chassis_code in platform.config.chassis_codes) and radar_fw in all_radar_fw) live_fws = {(0x757, None): [radar_fw]} matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(live_fws, vin, FW_VERSIONS) expected_matches = {platform} if should_match else set() assert expected_matches == matches, "Bad match"