You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
2.6 KiB
60 lines
2.6 KiB
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<gateway>[0-9][0-9A-Z]{2})(?P<unknown>[0-9][0-9A-Z][0-9])(?P<unknown2>[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"
|
|
|