#!/usr/bin/env python3 import os import unittest import requests import selfdrive.messaging as messaging from selfdrive.can.parser import CANParser as CANParserNew from selfdrive.can.tests.parser_old import CANParser as CANParserOld from selfdrive.car.honda.carstate import get_can_signals from selfdrive.car.honda.interface import CarInterface from selfdrive.car.honda.values import CAR, DBC from selfdrive.services import service_list from tools.lib.logreader import LogReader BASE_URL = "https://commadataci.blob.core.windows.net/openpilotci/" DT = int(0.01 * 1e9) # ns def dict_keys_differ(dict1, dict2): keys1 = set(dict1.keys()) keys2 = set(dict2.keys()) if keys1 != keys2: return True for k in keys1: keys1 = set(dict1[k].keys()) keys2 = set(dict2[k].keys()) if keys1 != keys2: return True return False def dicts_vals_differ(dict1, dict2): for k_outer in dict1.keys(): for k_inner in dict1[k_outer].keys(): if dict1[k_outer][k_inner] != dict2[k_outer][k_inner]: return True return False def run_route(route): can = messaging.pub_sock(service_list['can'].port) CP = CarInterface.get_params(CAR.CIVIC) signals, checks = get_can_signals(CP) parser_old = CANParserOld(DBC[CP.carFingerprint]['pt'], signals, checks, 0, timeout=-1, tcp_addr="127.0.0.1") parser_new = CANParserNew(DBC[CP.carFingerprint]['pt'], signals, checks, 0, timeout=-1, tcp_addr="127.0.0.1") parser_string = CANParserNew(DBC[CP.carFingerprint]['pt'], signals, checks, 0, timeout=-1) if dict_keys_differ(parser_old.vl, parser_new.vl): return False lr = LogReader(route + ".bz2") route_ok = True for msg in lr: if msg.which() == 'can': t = msg.logMonoTime msg_bytes = msg.as_builder().to_bytes() can.send(msg_bytes) _, updated_old = parser_old.update(t, True) _, updated_new = parser_new.update(t, True) updated_string = parser_string.update_string(msg_bytes) if updated_old != updated_new: route_ok = False print(t, "Diff in seen") if updated_new != updated_string: route_ok = False print(t, "Diff in seen string") if dicts_vals_differ(parser_old.vl, parser_new.vl): print(t, "Diff in dict") route_ok = False if dicts_vals_differ(parser_new.vl, parser_string.vl): print(t, "Diff in dict string") route_ok = False return route_ok class TestCanParser(unittest.TestCase): def setUp(self): self.routes = { CAR.CIVIC: "b0c9d2329ad1606b|2019-05-30--20-23-57" } for route in self.routes.values(): route_filename = route + ".bz2" if not os.path.isfile(route_filename): with open(route + ".bz2", "wb") as f: f.write(requests.get(BASE_URL + route_filename).content) def test_parser_civic(self): self.assertTrue(run_route(self.routes[CAR.CIVIC])) if __name__ == "__main__": unittest.main()