|  |  | @ -27,19 +27,17 @@ from selfdrive.car.mock.values import CAR as MOCK | 
			
		
	
		
		
			
				
					
					|  |  |  | os.environ['NOCRASH'] = '1' |  |  |  | os.environ['NOCRASH'] = '1' | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | def wait_for_socket(name, timeout=10.0): |  |  |  | def wait_for_sockets(socks, timeout=10.0): | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   socket = messaging.sub_sock(name) |  |  |  |   sm = messaging.SubMaster(socks) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   cur_time = time.time() |  |  |  |   t = time.time() | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   r = None |  |  |  |   recvd = [] | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   while time.time() - cur_time < timeout: |  |  |  |   while time.time() - t < timeout and len(recvd) < len(socks): | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     print("waiting for %s" % name) |  |  |  |     sm.update() | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     r = socket.receive(non_blocking=True) |  |  |  |     for s in socks: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     if r is not None: |  |  |  |       if s not in recvd and sm.updated[s]: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       break |  |  |  |         recvd.append(s) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     time.sleep(0.5) |  |  |  |   return recvd | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   return r |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | def get_route_logs(route_name): |  |  |  | def get_route_logs(route_name): | 
			
		
	
		
		
			
				
					
					|  |  |  |   for log_f in ["rlog.bz2", "fcamera.hevc"]: |  |  |  |   for log_f in ["rlog.bz2", "fcamera.hevc"]: | 
			
		
	
	
		
		
			
				
					|  |  | @ -449,12 +447,19 @@ non_public_routes = [ | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | if __name__ == "__main__": |  |  |  | if __name__ == "__main__": | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   tested_procs = ["controlsd", "radard", "plannerd"] | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   tested_socks = ["radarState", "controlsState", "carState", "plan"] | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   # TODO: add routes for untested cars and fail test if we have an untested car |  |  |  |   # TODO: add routes for untested cars and fail test if we have an untested car | 
			
		
	
		
		
			
				
					
					|  |  |  |   tested_cars = [keys["carFingerprint"] for route, keys in routes.items()] |  |  |  |   tested_cars = [keys["carFingerprint"] for route, keys in routes.items()] | 
			
		
	
		
		
			
				
					
					|  |  |  |   for car_model in all_known_cars(): |  |  |  |   for car_model in all_known_cars(): | 
			
		
	
		
		
			
				
					
					|  |  |  |     if car_model not in tested_cars: |  |  |  |     if car_model not in tested_cars: | 
			
		
	
		
		
			
				
					
					|  |  |  |       print("***** WARNING: %s not tested *****" % car_model) |  |  |  |       print("***** WARNING: %s not tested *****" % car_model) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   print("Preparing processes") | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   for p in tested_procs: | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     manager.prepare_managed_process(p) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   results = {} |  |  |  |   results = {} | 
			
		
	
		
		
			
				
					
					|  |  |  |   for route, checks in routes.items(): |  |  |  |   for route, checks in routes.items(): | 
			
		
	
		
		
			
				
					
					|  |  |  |     if route not in non_public_routes: |  |  |  |     if route not in non_public_routes: | 
			
		
	
	
		
		
			
				
					|  |  | @ -463,83 +468,46 @@ if __name__ == "__main__": | 
			
		
	
		
		
			
				
					
					|  |  |  |       continue |  |  |  |       continue | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     shutil.rmtree('/data/params') |  |  |  |     shutil.rmtree('/data/params') | 
			
		
	
		
		
			
				
					
					|  |  |  |     manager.gctx = {} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     params = Params() |  |  |  |     params = Params() | 
			
		
	
		
		
			
				
					
					|  |  |  |     params.manager_start() |  |  |  |     params.manager_start() | 
			
		
	
		
		
			
				
					
					|  |  |  |     params.put("OpenpilotEnabledToggle", "1") |  |  |  |     params.put("OpenpilotEnabledToggle", "1") | 
			
		
	
		
		
			
				
					
					|  |  |  |     params.put("CommunityFeaturesToggle", "1") |  |  |  |     params.put("CommunityFeaturesToggle", "1") | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |     params.put("Passive", "1" if route in passive_routes else "0") | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     if route in passive_routes: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       params.put("Passive", "1") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     else: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       params.put("Passive", "0") |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     print("testing ", route, " ", checks['carFingerprint']) |  |  |  |     print("testing ", route, " ", checks['carFingerprint']) | 
			
		
	
		
		
			
				
					
					|  |  |  |     print("Preparing processes") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     manager.prepare_managed_process("radard") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     manager.prepare_managed_process("controlsd") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     manager.prepare_managed_process("plannerd") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     print("Starting processes") |  |  |  |     print("Starting processes") | 
			
		
	
		
		
			
				
					
					|  |  |  |     manager.start_managed_process("radard") |  |  |  |     for p in tested_procs: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     manager.start_managed_process("controlsd") |  |  |  |       manager.start_managed_process(p) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     manager.start_managed_process("plannerd") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     time.sleep(2) |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     # Start unlogger |  |  |  |     # Start unlogger | 
			
		
	
		
		
			
				
					
					|  |  |  |     print("Start unlogger") |  |  |  |     print("Start unlogger") | 
			
		
	
		
		
			
				
					
					|  |  |  |     if route in non_public_routes: |  |  |  |     if route in non_public_routes: | 
			
		
	
		
		
			
				
					
					|  |  |  |       unlogger_cmd = [os.path.join(BASEDIR, os.environ['UNLOGGER_PATH']), '%s' % route, '--disable', 'frame,plan,pathPlan,liveLongitudinalMpc,radarState,controlsState,liveTracks,liveMpc,sendcan,carState,carControl,carEvents,carParams', '--no-interactive'] |  |  |  |       unlogger_cmd = [os.path.join(BASEDIR, os.environ['UNLOGGER_PATH']), route] | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     else: |  |  |  |     else: | 
			
		
	
		
		
			
				
					
					|  |  |  |       unlogger_cmd = [os.path.join(BASEDIR, 'tools/replay/unlogger.py'), '%s' % route, '/tmp', '--disable', 'frame,plan,pathPlan,liveLongitudinalMpc,radarState,controlsState,liveTracks,liveMpc,sendcan,carState,carControl,carEvents,carParams', '--no-interactive'] |  |  |  |       unlogger_cmd = [os.path.join(BASEDIR, 'tools/replay/unlogger.py'), route, '/tmp'] | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     unlogger = subprocess.Popen(unlogger_cmd, preexec_fn=os.setsid) |  |  |  |     unlogger = subprocess.Popen(unlogger_cmd + ['--disable', 'frame,plan,pathPlan,liveLongitudinalMpc,radarState,controlsState,liveTracks,liveMpc,sendcan,carState,carControl,carEvents,carParams', '--no-interactive'], preexec_fn=os.setsid) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     print("Check sockets") |  |  |  |     print("Check sockets") | 
			
		
	
		
		
			
				
					
					|  |  |  |     controls_state_result = wait_for_socket('controlsState', timeout=30) |  |  |  |     extra_socks = [] | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     has_camera = checks.get('enableCamera', False) |  |  |  |     has_camera = checks.get('enableCamera', False) | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (route not in passive_routes) and (route not in forced_dashcam_routes) and has_camera: |  |  |  |     if (route not in passive_routes) and (route not in forced_dashcam_routes) and has_camera: | 
			
		
	
		
		
			
				
					
					|  |  |  |       controls_state_result = controls_state_result and wait_for_socket('sendcan', timeout=30) |  |  |  |       extra_socks.append("sendcan") | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |     if route not in passive_routes: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     radarstate_result = wait_for_socket('radarState', timeout=30) |  |  |  |       extra_socks.append("pathPlan") | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     plan_result = wait_for_socket('plan', timeout=30) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     if route not in passive_routes:  # TODO The passive routes have very flaky models |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       path_plan_result = wait_for_socket('pathPlan', timeout=30) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     else: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       path_plan_result = True |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     carstate_result = wait_for_socket('carState', timeout=30) |  |  |  |     recvd_socks = wait_for_sockets(tested_socks + extra_socks, timeout=30) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     failures = [s for s in tested_socks + extra_socks if s not in recvd_socks] | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     print("Check if everything is running") |  |  |  |     print("Check if everything is running") | 
			
		
	
		
		
			
				
					
					|  |  |  |     running = manager.get_running() |  |  |  |     running = manager.get_running() | 
			
		
	
		
		
			
				
					
					|  |  |  |     controlsd_running = running['controlsd'].is_alive() |  |  |  |     for p in tested_procs: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     radard_running = running['radard'].is_alive() |  |  |  |       if not running[p].is_alive: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     plannerd_running = running['plannerd'].is_alive() |  |  |  |         failures.append(p) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |       manager.kill_managed_process(p) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     manager.kill_managed_process("controlsd") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     manager.kill_managed_process("radard") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     manager.kill_managed_process("plannerd") |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     os.killpg(os.getpgid(unlogger.pid), signal.SIGTERM) |  |  |  |     os.killpg(os.getpgid(unlogger.pid), signal.SIGTERM) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     sockets_ok = all([ |  |  |  |     sockets_ok = len(failures) == 0 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       controls_state_result, radarstate_result, plan_result, path_plan_result, carstate_result, |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       controlsd_running, radard_running, plannerd_running |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     ]) |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     params_ok = True |  |  |  |     params_ok = True | 
			
		
	
		
		
			
				
					
					|  |  |  |     failures = [] |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     if not controlsd_running: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       failures.append('controlsd') |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     if not radard_running: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       failures.append('radard') |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     if not radarstate_result: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       failures.append('radarState') |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     if not controls_state_result: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       failures.append('controlsState') |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     if not plan_result: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       failures.append('plan') |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     if not path_plan_result: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       failures.append('pathPlan') |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     try: |  |  |  |     try: | 
			
		
	
		
		
			
				
					
					|  |  |  |       car_params = car.CarParams.from_bytes(params.get("CarParams")) |  |  |  |       car_params = car.CarParams.from_bytes(params.get("CarParams")) | 
			
		
	
	
		
		
			
				
					|  |  | @ -558,11 +526,12 @@ if __name__ == "__main__": | 
			
		
	
		
		
			
				
					
					|  |  |  |       results[route] = False, failures |  |  |  |       results[route] = False, failures | 
			
		
	
		
		
			
				
					
					|  |  |  |       break |  |  |  |       break | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     time.sleep(2) |  |  |  |   # put back not passive to not leave the params in an unintended state | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   Params().put("Passive", "0") | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   for route in results: |  |  |  |   for route in results: | 
			
		
	
		
		
			
				
					
					|  |  |  |     print(results[route]) |  |  |  |     print(results[route]) | 
			
		
	
		
		
			
				
					
					|  |  |  |   Params().put("Passive", "0")   # put back not passive to not leave the params in an unintended state |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   if not all(passed for passed, _ in results.values()): |  |  |  |   if not all(passed for passed, _ in results.values()): | 
			
		
	
		
		
			
				
					
					|  |  |  |     print("TEST FAILED") |  |  |  |     print("TEST FAILED") | 
			
		
	
		
		
			
				
					
					|  |  |  |     sys.exit(1) |  |  |  |     sys.exit(1) | 
			
		
	
	
		
		
			
				
					|  |  | 
 |