|  |  |  | @ -8,6 +8,7 @@ from typing import List, Optional, Tuple | 
			
		
	
		
			
				
					|  |  |  |  | from parameterized import parameterized_class | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | from cereal import log, car | 
			
		
	
		
			
				
					|  |  |  |  | from common.basedir import BASEDIR | 
			
		
	
		
			
				
					|  |  |  |  | from common.realtime import DT_CTRL | 
			
		
	
		
			
				
					|  |  |  |  | from selfdrive.boardd.boardd import can_capnp_to_can_list, can_list_to_can_capnp | 
			
		
	
		
			
				
					|  |  |  |  | from selfdrive.car.fingerprints import all_known_cars | 
			
		
	
	
		
			
				
					|  |  |  | @ -27,21 +28,31 @@ PandaType = log.PandaState.PandaType | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | NUM_JOBS = int(os.environ.get("NUM_JOBS", "1")) | 
			
		
	
		
			
				
					|  |  |  |  | JOB_ID = int(os.environ.get("JOB_ID", "0")) | 
			
		
	
		
			
				
					|  |  |  |  | INTERNAL = os.environ.get("INTERNAL", False) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | ignore_addr_checks_valid = [ | 
			
		
	
		
			
				
					|  |  |  |  |   GM.BUICK_REGAL, | 
			
		
	
		
			
				
					|  |  |  |  |   HYUNDAI.GENESIS_G70_2020, | 
			
		
	
		
			
				
					|  |  |  |  | ] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | # build list of test cases | 
			
		
	
		
			
				
					|  |  |  |  | routes_by_car = defaultdict(set) | 
			
		
	
		
			
				
					|  |  |  |  | for r in routes: | 
			
		
	
		
			
				
					|  |  |  |  |   routes_by_car[r.car_model].add(r) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | test_cases: List[Tuple[str, Optional[CarTestRoute]]] = [] | 
			
		
	
		
			
				
					|  |  |  |  | for i, c in enumerate(sorted(all_known_cars())): | 
			
		
	
		
			
				
					|  |  |  |  |   if i % NUM_JOBS == JOB_ID: | 
			
		
	
		
			
				
					|  |  |  |  |     test_cases.extend((c, r) for r in routes_by_car.get(c, (None, ))) | 
			
		
	
		
			
				
					|  |  |  |  | if INTERNAL: | 
			
		
	
		
			
				
					|  |  |  |  |   with open(SEG_LIST_PATH, "r") as f: | 
			
		
	
		
			
				
					|  |  |  |  |     seg_list = f.read().splitlines() | 
			
		
	
		
			
				
					|  |  |  |  |   platforms, segs = seg_list[0::2], seg_list[1::2] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   car_test_routes = [] | 
			
		
	
		
			
				
					|  |  |  |  |   for platform, seg in list(zip(platforms, segs)): | 
			
		
	
		
			
				
					|  |  |  |  |     car_test_routes.append(CarTestRoute(seg[:37], platform[2:], segment=int(seg[39:]))) | 
			
		
	
		
			
				
					|  |  |  |  | else: | 
			
		
	
		
			
				
					|  |  |  |  |   # build list of test cases | 
			
		
	
		
			
				
					|  |  |  |  |   routes_by_car = defaultdict(set) | 
			
		
	
		
			
				
					|  |  |  |  |   for r in routes: | 
			
		
	
		
			
				
					|  |  |  |  |     routes_by_car[r.car_model].add(r) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   test_cases: List[Tuple[str, Optional[CarTestRoute]]] = [] | 
			
		
	
		
			
				
					|  |  |  |  |   for i, c in enumerate(sorted(all_known_cars())): | 
			
		
	
		
			
				
					|  |  |  |  |     if i % NUM_JOBS == JOB_ID: | 
			
		
	
		
			
				
					|  |  |  |  |       test_cases.extend((c, r) for r in routes_by_car.get(c, (None, ))) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | SKIP_ENV_VAR = "SKIP_LONG_TESTS" | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |