|  |  |  | @ -19,6 +19,7 @@ from openpilot.selfdrive.car.fingerprints import all_known_cars | 
			
		
	
		
			
				
					|  |  |  |  | from openpilot.selfdrive.car.car_helpers import FRAME_FINGERPRINT, interfaces | 
			
		
	
		
			
				
					|  |  |  |  | from openpilot.selfdrive.car.honda.values import CAR as HONDA, HondaFlags | 
			
		
	
		
			
				
					|  |  |  |  | from openpilot.selfdrive.car.tests.routes import non_tested_cars, routes, CarTestRoute | 
			
		
	
		
			
				
					|  |  |  |  | from openpilot.selfdrive.car.values import PLATFORMS, Platform | 
			
		
	
		
			
				
					|  |  |  |  | from openpilot.selfdrive.controls.controlsd import Controls | 
			
		
	
		
			
				
					|  |  |  |  | from openpilot.selfdrive.test.helpers import read_segment_list | 
			
		
	
		
			
				
					|  |  |  |  | from openpilot.system.hardware.hw import DEFAULT_DOWNLOAD_CACHE_ROOT | 
			
		
	
	
		
			
				
					|  |  |  | @ -64,7 +65,7 @@ def get_test_cases() -> list[tuple[str, CarTestRoute | None]]: | 
			
		
	
		
			
				
					|  |  |  |  | @pytest.mark.slow | 
			
		
	
		
			
				
					|  |  |  |  | @pytest.mark.shared_download_cache | 
			
		
	
		
			
				
					|  |  |  |  | class TestCarModelBase(unittest.TestCase): | 
			
		
	
		
			
				
					|  |  |  |  |   car_model: str | None = None | 
			
		
	
		
			
				
					|  |  |  |  |   platform: Platform | None = None | 
			
		
	
		
			
				
					|  |  |  |  |   test_route: CarTestRoute | None = None | 
			
		
	
		
			
				
					|  |  |  |  |   test_route_on_bucket: bool = True  # whether the route is on the preserved CI bucket | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -93,8 +94,8 @@ class TestCarModelBase(unittest.TestCase): | 
			
		
	
		
			
				
					|  |  |  |  |         car_fw = msg.carParams.carFw | 
			
		
	
		
			
				
					|  |  |  |  |         if msg.carParams.openpilotLongitudinalControl: | 
			
		
	
		
			
				
					|  |  |  |  |           experimental_long = True | 
			
		
	
		
			
				
					|  |  |  |  |         if cls.car_model is None and not cls.ci: | 
			
		
	
		
			
				
					|  |  |  |  |           cls.car_model = msg.carParams.carFingerprint | 
			
		
	
		
			
				
					|  |  |  |  |         if cls.platform is None and not cls.ci: | 
			
		
	
		
			
				
					|  |  |  |  |           cls.platform = PLATFORMS.get(msg.carParams.carFingerprint) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       # Log which can frame the panda safety mode left ELM327, for CAN validity checks | 
			
		
	
		
			
				
					|  |  |  |  |       elif msg.which() == 'pandaStates': | 
			
		
	
	
		
			
				
					|  |  |  | @ -155,15 +156,11 @@ class TestCarModelBase(unittest.TestCase): | 
			
		
	
		
			
				
					|  |  |  |  |     if cls.__name__ == 'TestCarModel' or cls.__name__.endswith('Base'): | 
			
		
	
		
			
				
					|  |  |  |  |       raise unittest.SkipTest | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if 'FILTER' in os.environ: | 
			
		
	
		
			
				
					|  |  |  |  |       if not cls.car_model.startswith(tuple(os.environ.get('FILTER').split(','))): | 
			
		
	
		
			
				
					|  |  |  |  |         raise unittest.SkipTest | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if cls.test_route is None: | 
			
		
	
		
			
				
					|  |  |  |  |       if cls.car_model in non_tested_cars: | 
			
		
	
		
			
				
					|  |  |  |  |         print(f"Skipping tests for {cls.car_model}: missing route") | 
			
		
	
		
			
				
					|  |  |  |  |       if cls.platform in non_tested_cars: | 
			
		
	
		
			
				
					|  |  |  |  |         print(f"Skipping tests for {cls.platform}: missing route") | 
			
		
	
		
			
				
					|  |  |  |  |         raise unittest.SkipTest | 
			
		
	
		
			
				
					|  |  |  |  |       raise Exception(f"missing test route for {cls.car_model}") | 
			
		
	
		
			
				
					|  |  |  |  |       raise Exception(f"missing test route for {cls.platform}") | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     car_fw, can_msgs, experimental_long = cls.get_testing_data() | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -172,10 +169,10 @@ class TestCarModelBase(unittest.TestCase): | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     cls.can_msgs = sorted(can_msgs, key=lambda msg: msg.logMonoTime) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     cls.CarInterface, cls.CarController, cls.CarState = interfaces[cls.car_model] | 
			
		
	
		
			
				
					|  |  |  |  |     cls.CP = cls.CarInterface.get_params(cls.car_model, cls.fingerprint, car_fw, experimental_long, docs=False) | 
			
		
	
		
			
				
					|  |  |  |  |     cls.CarInterface, cls.CarController, cls.CarState = interfaces[cls.platform] | 
			
		
	
		
			
				
					|  |  |  |  |     cls.CP = cls.CarInterface.get_params(cls.platform,  cls.fingerprint, car_fw, experimental_long, docs=False) | 
			
		
	
		
			
				
					|  |  |  |  |     assert cls.CP | 
			
		
	
		
			
				
					|  |  |  |  |     assert cls.CP.carFingerprint == cls.car_model | 
			
		
	
		
			
				
					|  |  |  |  |     assert cls.CP.carFingerprint == cls.platform | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     os.environ["COMMA_CACHE"] = DEFAULT_DOWNLOAD_CACHE_ROOT | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -478,7 +475,7 @@ class TestCarModelBase(unittest.TestCase): | 
			
		
	
		
			
				
					|  |  |  |  |                     "This is fine to fail for WIP car ports, just let us know and we can upload your routes to the CI bucket.") | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | @parameterized_class(('car_model', 'test_route'), get_test_cases()) | 
			
		
	
		
			
				
					|  |  |  |  | @parameterized_class(('platform', 'test_route'), get_test_cases()) | 
			
		
	
		
			
				
					|  |  |  |  | @pytest.mark.xdist_group_class_property('test_route') | 
			
		
	
		
			
				
					|  |  |  |  | class TestCarModel(TestCarModelBase): | 
			
		
	
		
			
				
					|  |  |  |  |   pass | 
			
		
	
	
		
			
				
					|  |  |  | 
 |