@ -2,7 +2,8 @@
import unittest
from cereal import car
from selfdrive . car . hyundai . values import CANFD_CAR , FW_QUERY_CONFIG , FW_VERSIONS , CAN_GEARS , LEGACY_SAFETY_MODE_CAR , CHECKSUM , CAMERA_SCC_CAR
from selfdrive . car . hyundai . values import CAMERA_SCC_CAR , CANFD_CAR , CAN_GEARS , CAR , CHECKSUM , FW_QUERY_CONFIG , \
FW_VERSIONS , LEGACY_SAFETY_MODE_CAR
Ecu = car . CarParams . Ecu
ECU_NAME = { v : k for k , v in Ecu . schema . enumerants . items ( ) }
@ -24,6 +25,65 @@ class TestHyundaiFingerprint(unittest.TestCase):
ecu_strings = " , " . join ( [ f ' Ecu. { ECU_NAME [ ecu ] } ' for ecu in ecus_not_in_whitelist ] )
self . assertEqual ( len ( ecus_not_in_whitelist ) , 0 , f ' { car_model } : Car model has ECUs not in auxiliary request whitelists: { ecu_strings } ' )
def test_platform_code_ecus_available ( self ) :
no_eps_platforms = CANFD_CAR | { CAR . KIA_SORENTO , CAR . KIA_OPTIMA_G4 , CAR . KIA_OPTIMA_G4_FL ,
CAR . SONATA_LF , CAR . TUCSON , CAR . GENESIS_G90 , CAR . GENESIS_G80 }
# Asserts ECU keys essential for fuzzy fingerprinting are available on all platforms
for car_model , ecus in FW_VERSIONS . items ( ) :
with self . subTest ( car_model = car_model ) :
for fuzzy_ecu in FW_QUERY_CONFIG . platform_code_ecus :
if fuzzy_ecu in ( Ecu . fwdRadar , Ecu . eps ) and car_model == CAR . HYUNDAI_GENESIS :
continue
if fuzzy_ecu == Ecu . eps and car_model in no_eps_platforms :
continue
self . assertIn ( fuzzy_ecu , [ e [ 0 ] for e in ecus ] )
def test_fuzzy_fw_dates ( self ) :
# Some newer platforms have date codes in a different format we don't yet parse,
# for now assert date format is consistent for all FW across each platform
for car_model , ecus in FW_VERSIONS . items ( ) :
with self . subTest ( car_model = car_model ) :
for ecu , fws in ecus . items ( ) :
if ecu [ 0 ] not in FW_QUERY_CONFIG . platform_code_ecus :
continue
codes = set ( )
for fw in fws :
codes | = FW_QUERY_CONFIG . fuzzy_get_platform_codes ( [ fw ] )
# Either no dates should be parsed or all dates should be parsed
self . assertEqual ( len ( { b ' - ' in code for code in codes } ) , 1 )
def test_fuzzy_platform_codes ( self ) :
# Asserts basic platform code parsing behavior
codes = FW_QUERY_CONFIG . fuzzy_get_platform_codes ( [ b ' \xf1 \x00 DH LKAS 1.1 -150210 ' ] )
self . assertEqual ( codes , { b " DH-1502 " } )
# Some cameras and all radars do not have dates
codes = FW_QUERY_CONFIG . fuzzy_get_platform_codes ( [ b ' \xf1 \x00 AEhe SCC H-CUP 1.01 1.01 96400-G2000 ' ] )
self . assertEqual ( codes , { b " AEhe " } )
codes = FW_QUERY_CONFIG . fuzzy_get_platform_codes ( [ b ' \xf1 \x00 CV1_ RDR ----- 1.00 1.01 99110-CV000 ' ] )
self . assertEqual ( codes , { b " CV1 " } )
codes = FW_QUERY_CONFIG . fuzzy_get_platform_codes ( [
b ' \xf1 \x00 DH LKAS 1.1 -150210 ' ,
b ' \xf1 \x00 AEhe SCC H-CUP 1.01 1.01 96400-G2000 ' ,
b ' \xf1 \x00 CV1_ RDR ----- 1.00 1.01 99110-CV000 ' ,
] )
self . assertEqual ( codes , { b " DH-1502 " , b " AEhe " , b " CV1 " } )
# Returned platform codes must inclusively contain start/end dates
codes = FW_QUERY_CONFIG . fuzzy_get_platform_codes ( [
b ' \xf1 \x00 LX2 MFC AT USA LHD 1.00 1.07 99211-S8100 220222 ' ,
b ' \xf1 \x00 LX2 MFC AT USA LHD 1.00 1.08 99211-S8100 211103 ' ,
b ' \xf1 \x00 ON MFC AT USA LHD 1.00 1.01 99211-S9100 190405 ' ,
b ' \xf1 \x00 ON MFC AT USA LHD 1.00 1.03 99211-S9100 190720 ' ,
] )
self . assertEqual ( codes , { b ' LX2-2111 ' , b ' LX2-2112 ' , b ' LX2-2201 ' , b ' LX2-2202 ' ,
b ' ON-1904 ' , b ' ON-1905 ' , b ' ON-1906 ' , b ' ON-1907 ' } )
if __name__ == " __main__ " :
unittest . main ( )