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 \x87 5Q0907572G \xf1 \x89 0571 ' , b ' \xf1 \x87 7H9907572AA \xf1 \x89 0396 ' ] :
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 "