|  |  |  | @ -6,10 +6,11 @@ import unittest | 
			
		
	
		
			
				
					|  |  |  |  | from pathlib import Path | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | import cereal.messaging as messaging | 
			
		
	
		
			
				
					|  |  |  |  | from cereal.services import service_list | 
			
		
	
		
			
				
					|  |  |  |  | from common.basedir import BASEDIR | 
			
		
	
		
			
				
					|  |  |  |  | from common.timeout import Timeout | 
			
		
	
		
			
				
					|  |  |  |  | from panda import Panda | 
			
		
	
		
			
				
					|  |  |  |  | from selfdrive.loggerd.config import ROOT | 
			
		
	
		
			
				
					|  |  |  |  | import selfdrive.manager as manager | 
			
		
	
		
			
				
					|  |  |  |  | from selfdrive.test.helpers import set_params_enabled | 
			
		
	
		
			
				
					|  |  |  |  | from tools.lib.logreader import LogReader | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -19,11 +20,11 @@ PROCS = [ | 
			
		
	
		
			
				
					|  |  |  |  |   ("selfdrive.locationd.locationd", 35.0), | 
			
		
	
		
			
				
					|  |  |  |  |   ("selfdrive.controls.plannerd", 20.0), | 
			
		
	
		
			
				
					|  |  |  |  |   ("selfdrive.locationd.paramsd", 12.0), | 
			
		
	
		
			
				
					|  |  |  |  |   ("./_modeld", 7.12), | 
			
		
	
		
			
				
					|  |  |  |  |   ("./camerad", 7.07), | 
			
		
	
		
			
				
					|  |  |  |  |   ("./_sensord", 6.17), | 
			
		
	
		
			
				
					|  |  |  |  |   ("./_ui", 5.82), | 
			
		
	
		
			
				
					|  |  |  |  |   ("selfdrive.controls.radard", 5.67), | 
			
		
	
		
			
				
					|  |  |  |  |   ("./_modeld", 4.48), | 
			
		
	
		
			
				
					|  |  |  |  |   ("./boardd", 3.63), | 
			
		
	
		
			
				
					|  |  |  |  |   ("./_dmonitoringmodeld", 2.67), | 
			
		
	
		
			
				
					|  |  |  |  |   ("selfdrive.logmessaged", 1.7), | 
			
		
	
	
		
			
				
					|  |  |  | @ -79,12 +80,12 @@ class TestOnroad(unittest.TestCase): | 
			
		
	
		
			
				
					|  |  |  |  |     os.environ['FINGERPRINT'] = "TOYOTA COROLLA TSS2 2019" | 
			
		
	
		
			
				
					|  |  |  |  |     set_params_enabled() | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     Panda().reset() | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     initial_segments = set(Path(ROOT).iterdir()) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     # start manager and run openpilot for a minute | 
			
		
	
		
			
				
					|  |  |  |  |     try: | 
			
		
	
		
			
				
					|  |  |  |  |       manager.build() | 
			
		
	
		
			
				
					|  |  |  |  |       manager.manager_prepare() | 
			
		
	
		
			
				
					|  |  |  |  |       manager_path = os.path.join(BASEDIR, "selfdrive/manager.py") | 
			
		
	
		
			
				
					|  |  |  |  |       proc = subprocess.Popen(["python", manager_path]) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -93,21 +94,26 @@ class TestOnroad(unittest.TestCase): | 
			
		
	
		
			
				
					|  |  |  |  |         while sm.rcv_frame['carState'] < 0: | 
			
		
	
		
			
				
					|  |  |  |  |           sm.update(1000) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       time.sleep(60) | 
			
		
	
		
			
				
					|  |  |  |  |       # make sure we get at least two full segments | 
			
		
	
		
			
				
					|  |  |  |  |       cls.segments = [] | 
			
		
	
		
			
				
					|  |  |  |  |       with Timeout(180, "timed out waiting for logs"): | 
			
		
	
		
			
				
					|  |  |  |  |         while len(cls.segments) < 3: | 
			
		
	
		
			
				
					|  |  |  |  |           new_paths = set(Path(ROOT).iterdir()) - initial_segments | 
			
		
	
		
			
				
					|  |  |  |  |           segs = [p for p in new_paths if "--" in str(p)] | 
			
		
	
		
			
				
					|  |  |  |  |           cls.segments = sorted(segs, key=lambda s: int(str(s).rsplit('--')[-1])) | 
			
		
	
		
			
				
					|  |  |  |  |           time.sleep(5) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     finally: | 
			
		
	
		
			
				
					|  |  |  |  |       proc.terminate() | 
			
		
	
		
			
				
					|  |  |  |  |       if proc.wait(20) is None: | 
			
		
	
		
			
				
					|  |  |  |  |       if proc.wait(60) is None: | 
			
		
	
		
			
				
					|  |  |  |  |         proc.kill() | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     new_segments = set(Path(ROOT).iterdir()) - initial_segments | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     segments = [p for p in new_segments if len(list(p.iterdir())) > 1] | 
			
		
	
		
			
				
					|  |  |  |  |     cls.segment = [s for s in segments if str(s).endswith("--0")][0] | 
			
		
	
		
			
				
					|  |  |  |  |     cls.lr = list(LogReader(os.path.join(str(cls.segment), "rlog.bz2"))) | 
			
		
	
		
			
				
					|  |  |  |  |     cls.lr = list(LogReader(os.path.join(str(cls.segments[1]), "rlog.bz2"))) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   def test_cpu_usage(self): | 
			
		
	
		
			
				
					|  |  |  |  |     proclogs = [m for m in self.lr if m.which() == 'procLog'] | 
			
		
	
		
			
				
					|  |  |  |  |     cpu_ok = check_cpu_usage(proclogs[5], proclogs[-3]) | 
			
		
	
		
			
				
					|  |  |  |  |     self.assertGreater(len(proclogs), service_list['procLog'].frequency * 45, "insufficient samples") | 
			
		
	
		
			
				
					|  |  |  |  |     cpu_ok = check_cpu_usage(proclogs[0], proclogs[-1]) | 
			
		
	
		
			
				
					|  |  |  |  |     self.assertTrue(cpu_ok) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | if __name__ == "__main__": | 
			
		
	
	
		
			
				
					|  |  |  | 
 |