#!/usr/bin/env python3 import random import unittest from collections import defaultdict from parameterized import parameterized from cereal import car from selfdrive.car.car_helpers import get_interface_attr, interfaces from selfdrive.car.fingerprints import FW_VERSIONS from selfdrive.car.fw_versions import FW_QUERY_CONFIGS, VERSIONS, match_fw_to_car CarFw = car.CarParams.CarFw Ecu = car.CarParams.Ecu ECU_NAME = {v: k for k, v in Ecu.schema.enumerants.items()} class TestFwFingerprint(unittest.TestCase): # TODO: test multiple pandas @parameterized.expand([(1,), (2,)]) def test_fw_query_metrics(self, num_pandas): for brand, config in FW_QUERY_CONFIGS.items(): with self.subTest(brand=brand, num_pandas=num_pandas): requests = [r for r in config.requests if r.bus <= num_pandas * 4 - 1] multi_panda_requests = [r for r in config.requests if r.bus > 3] if not len(multi_panda_requests) and num_pandas > 1: raise unittest.SkipTest("No multi-panda FW queries") total_time = 0 obd_multiplexing = config.requests[0].obd_multiplexing # only count OBD multiplexing transitions for r in requests: total_time += 0.1 if r.obd_multiplexing != obd_multiplexing and r.bus % 4 == 1: obd_multiplexing = r.obd_multiplexing total_time += 0.1 total_time = round(total_time, 2) self.assertLessEqual(total_time, 1.1) print(f'{brand=}, {num_pandas=}, {len(requests)=}, total FW query time={total_time} seconds') if __name__ == "__main__": unittest.main()