|
|
@ -1,5 +1,9 @@ |
|
|
|
#!/usr/bin/env python3 |
|
|
|
#!/usr/bin/env python3 |
|
|
|
|
|
|
|
import random |
|
|
|
import unittest |
|
|
|
import unittest |
|
|
|
|
|
|
|
from itertools import product |
|
|
|
|
|
|
|
from parameterized import parameterized |
|
|
|
|
|
|
|
|
|
|
|
from cereal import car |
|
|
|
from cereal import car |
|
|
|
from selfdrive.car.fingerprints import FW_VERSIONS |
|
|
|
from selfdrive.car.fingerprints import FW_VERSIONS |
|
|
|
from selfdrive.car.fw_versions import match_fw_to_car |
|
|
|
from selfdrive.car.fw_versions import match_fw_to_car |
|
|
@ -14,7 +18,7 @@ class TestFwFingerprint(unittest.TestCase): |
|
|
|
def assertFingerprints(self, candidates, expected): |
|
|
|
def assertFingerprints(self, candidates, expected): |
|
|
|
candidates = list(candidates) |
|
|
|
candidates = list(candidates) |
|
|
|
self.assertEqual(len(candidates), 1) |
|
|
|
self.assertEqual(len(candidates), 1) |
|
|
|
self.assertEqual(candidates[0], TOYOTA.RAV4_TSS2) |
|
|
|
self.assertEqual(candidates[0], expected) |
|
|
|
|
|
|
|
|
|
|
|
def test_rav4_tss2(self): |
|
|
|
def test_rav4_tss2(self): |
|
|
|
CP = car.CarParams.new_message() |
|
|
|
CP = car.CarParams.new_message() |
|
|
@ -43,13 +47,42 @@ class TestFwFingerprint(unittest.TestCase): |
|
|
|
|
|
|
|
|
|
|
|
self.assertFingerprints(match_fw_to_car(CP.carFw), TOYOTA.RAV4_TSS2) |
|
|
|
self.assertFingerprints(match_fw_to_car(CP.carFw), TOYOTA.RAV4_TSS2) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@parameterized.expand([(k, v) for k, v in FW_VERSIONS.items()]) |
|
|
|
|
|
|
|
def test_fw_fingerprint_all(self, car_model, ecus): |
|
|
|
|
|
|
|
# TODO: this is too slow, so don't run for now |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ecu_fw_lists = [] # pylint: disable=W0101 |
|
|
|
|
|
|
|
for ecu, fw_versions in ecus.items(): |
|
|
|
|
|
|
|
ecu_name, addr, sub_addr = ecu |
|
|
|
|
|
|
|
ecu_fw_lists.append([]) |
|
|
|
|
|
|
|
for fw in fw_versions: |
|
|
|
|
|
|
|
ecu_fw_lists[-1].append({"ecu": ecu_name, "fwVersion": fw, "address": addr, |
|
|
|
|
|
|
|
"subAddress": 0 if sub_addr is None else sub_addr}) |
|
|
|
|
|
|
|
CP = car.CarParams.new_message() |
|
|
|
|
|
|
|
for car_fw in product(*ecu_fw_lists): |
|
|
|
|
|
|
|
CP.carFw = car_fw |
|
|
|
|
|
|
|
self.assertFingerprints(match_fw_to_car(CP.carFw), car_model) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@parameterized.expand([(k, v) for k, v in FW_VERSIONS.items()]) |
|
|
|
|
|
|
|
def test_fw_fingerprint(self, car_model, ecus): |
|
|
|
|
|
|
|
CP = car.CarParams.new_message() |
|
|
|
|
|
|
|
for _ in range(20): |
|
|
|
|
|
|
|
fw = [] |
|
|
|
|
|
|
|
for ecu, fw_versions in ecus.items(): |
|
|
|
|
|
|
|
ecu_name, addr, sub_addr = ecu |
|
|
|
|
|
|
|
fw.append({"ecu": ecu_name, "fwVersion": random.choice(fw_versions), |
|
|
|
|
|
|
|
"address": addr, "subAddress": 0 if sub_addr is None else sub_addr}) |
|
|
|
|
|
|
|
CP.carFw = fw |
|
|
|
|
|
|
|
self.assertFingerprints(match_fw_to_car(CP.carFw), car_model) |
|
|
|
|
|
|
|
|
|
|
|
def test_no_duplicate_fw_versions(self): |
|
|
|
def test_no_duplicate_fw_versions(self): |
|
|
|
passed = True |
|
|
|
passed = True |
|
|
|
for car_name, ecus in FW_VERSIONS.items(): |
|
|
|
for car_model, ecus in FW_VERSIONS.items(): |
|
|
|
for ecu, ecu_fw in ecus.items(): |
|
|
|
for ecu, ecu_fw in ecus.items(): |
|
|
|
duplicates = set([fw for fw in ecu_fw if ecu_fw.count(fw) > 1]) |
|
|
|
duplicates = set([fw for fw in ecu_fw if ecu_fw.count(fw) > 1]) |
|
|
|
if len(duplicates): |
|
|
|
if len(duplicates): |
|
|
|
print(car_name, ECU_NAME[ecu[0]], duplicates) |
|
|
|
print(car_model, ECU_NAME[ecu[0]], duplicates) |
|
|
|
passed = False |
|
|
|
passed = False |
|
|
|
|
|
|
|
|
|
|
|
self.assertTrue(passed, "Duplicate FW versions found") |
|
|
|
self.assertTrue(passed, "Duplicate FW versions found") |
|
|
|