| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -34,7 +34,7 @@ CPU usage budget | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					TEST_DURATION = 25 | 
					 | 
					 | 
					 | 
					TEST_DURATION = 25 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					LOG_OFFSET = 8 | 
					 | 
					 | 
					 | 
					LOG_OFFSET = 8 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					MAX_TOTAL_CPU = 275.  # total for all 8 cores | 
					 | 
					 | 
					 | 
					MAX_TOTAL_CPU = 280.  # total for all 8 cores | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					PROCS = { | 
					 | 
					 | 
					 | 
					PROCS = { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  # Baseline CPU usage by process | 
					 | 
					 | 
					 | 
					  # Baseline CPU usage by process | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  "selfdrive.controls.controlsd": 16.0, | 
					 | 
					 | 
					 | 
					  "selfdrive.controls.controlsd": 16.0, | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -42,7 +42,7 @@ PROCS = { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  "selfdrive.car.card": 26.0, | 
					 | 
					 | 
					 | 
					  "selfdrive.car.card": 26.0, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  "./loggerd": 14.0, | 
					 | 
					 | 
					 | 
					  "./loggerd": 14.0, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  "./encoderd": 17.0, | 
					 | 
					 | 
					 | 
					  "./encoderd": 17.0, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  "./camerad": 14.5, | 
					 | 
					 | 
					 | 
					  "./camerad": 10.0, | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  "selfdrive.controls.plannerd": 9.0, | 
					 | 
					 | 
					 | 
					  "selfdrive.controls.plannerd": 9.0, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  "./ui": 18.0, | 
					 | 
					 | 
					 | 
					  "./ui": 18.0, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  "selfdrive.locationd.paramsd": 9.0, | 
					 | 
					 | 
					 | 
					  "selfdrive.locationd.paramsd": 9.0, | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -99,12 +99,12 @@ TIMINGS = { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  "wideRoadCameraState": [1.5, 0.35], | 
					 | 
					 | 
					 | 
					  "wideRoadCameraState": [1.5, 0.35], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					LOGS_SIZE_RATE = { | 
					 | 
					 | 
					 | 
					LOGS_SIZE = {  # MB per segment | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  "qlog.zst": 0.0083, | 
					 | 
					 | 
					 | 
					  "qlog.zst": 0.5, | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  "rlog.zst": 0.135, | 
					 | 
					 | 
					 | 
					  "rlog.zst": 8.1, | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  "qcamera.ts": 0.03828, | 
					 | 
					 | 
					 | 
					  "qcamera.ts": 2.3, | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					LOGS_SIZE_RATE.update(dict.fromkeys(['ecamera.hevc', 'fcamera.hevc'], 1.2740)) | 
					 | 
					 | 
					 | 
					LOGS_SIZE.update(dict.fromkeys(['ecamera.hevc', 'fcamera.hevc', 'dcamera.hevc'], 76.5)) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def cputime_total(ct): | 
					 | 
					 | 
					 | 
					def cputime_total(ct): | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -126,6 +126,7 @@ class TestOnroad: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    # setup env | 
					 | 
					 | 
					 | 
					    # setup env | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    params = Params() | 
					 | 
					 | 
					 | 
					    params = Params() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    params.remove("CurrentRoute") | 
					 | 
					 | 
					 | 
					    params.remove("CurrentRoute") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    params.put_bool("RecordFront", True) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    set_params_enabled() | 
					 | 
					 | 
					 | 
					    set_params_enabled() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    os.environ['REPLAY'] = '1' | 
					 | 
					 | 
					 | 
					    os.environ['REPLAY'] = '1' | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    os.environ['TESTING_CLOSET'] = '1' | 
					 | 
					 | 
					 | 
					    os.environ['TESTING_CLOSET'] = '1' | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -212,11 +213,12 @@ class TestOnroad: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    big_logs = [f for f, n in cnt.most_common(3) if n / sum(cnt.values()) > 30.] | 
					 | 
					 | 
					 | 
					    big_logs = [f for f, n in cnt.most_common(3) if n / sum(cnt.values()) > 30.] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    assert len(big_logs) == 0, f"Log spam: {big_logs}" | 
					 | 
					 | 
					 | 
					    assert len(big_logs) == 0, f"Log spam: {big_logs}" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  def test_log_sizes(self): | 
					 | 
					 | 
					 | 
					  def test_log_sizes(self, subtests): | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    for f, sz in self.log_sizes.items(): | 
					 | 
					 | 
					 | 
					    for f, sz in self.log_sizes.items(): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      rate = LOGS_SIZE_RATE[f.name] | 
					 | 
					 | 
					 | 
					      rate = LOGS_SIZE[f.name]/60. | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      minn = rate * TEST_DURATION * 0.8 | 
					 | 
					 | 
					 | 
					      minn = rate * TEST_DURATION * 0.5 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      maxx = rate * TEST_DURATION * 1.2 | 
					 | 
					 | 
					 | 
					      maxx = rate * TEST_DURATION * 1.5 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      with subtests.test(file=f.name): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        assert minn < sz <  maxx | 
					 | 
					 | 
					 | 
					        assert minn < sz <  maxx | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  def test_ui_timings(self): | 
					 | 
					 | 
					 | 
					  def test_ui_timings(self): | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -311,24 +313,8 @@ class TestOnroad: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  def test_gpu_usage(self): | 
					 | 
					 | 
					 | 
					  def test_gpu_usage(self): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    assert self.gpu_procs == {"weston", "ui", "camerad", "selfdrive.modeld.modeld", "selfdrive.modeld.dmonitoringmodeld"} | 
					 | 
					 | 
					 | 
					    assert self.gpu_procs == {"weston", "ui", "camerad", "selfdrive.modeld.modeld", "selfdrive.modeld.dmonitoringmodeld"} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  def test_camera_processing_time(self): | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    result = "\n" | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    result += "------------------------------------------------\n" | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    result += "-------------- ImgProc Timing ------------------\n" | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    result += "------------------------------------------------\n" | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ts = [] | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    for s in ['roadCameraState', 'driverCameraState', 'wideCameraState']: | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ts.extend(getattr(m, s).processingTime for m in self.msgs[s]) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    assert min(ts) < 0.025, f"high execution time: {min(ts)}" | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    result += f"execution time: min  {min(ts):.5f}s\n" | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    result += f"execution time: max  {max(ts):.5f}s\n" | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    result += f"execution time: mean {np.mean(ts):.5f}s\n" | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    result += "------------------------------------------------\n" | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    print(result) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  @pytest.mark.skip("TODO: enable once timings are fixed") | 
					 | 
					 | 
					 | 
					  @pytest.mark.skip("TODO: enable once timings are fixed") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  def test_camera_frame_timings(self): | 
					 | 
					 | 
					 | 
					  def test_camera_frame_timings(self, subtests): | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    result = "\n" | 
					 | 
					 | 
					 | 
					    result = "\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    result += "------------------------------------------------\n" | 
					 | 
					 | 
					 | 
					    result += "------------------------------------------------\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    result += "-----------------  SoF Timing ------------------\n" | 
					 | 
					 | 
					 | 
					    result += "-----------------  SoF Timing ------------------\n" | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -337,10 +323,11 @@ class TestOnroad: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ts = [getattr(m, m.which()).timestampSof for m in self.lr if name in m.which()] | 
					 | 
					 | 
					 | 
					      ts = [getattr(m, m.which()).timestampSof for m in self.lr if name in m.which()] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      d_ms = np.diff(ts) / 1e6 | 
					 | 
					 | 
					 | 
					      d_ms = np.diff(ts) / 1e6 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      d50 = np.abs(d_ms-50) | 
					 | 
					 | 
					 | 
					      d50 = np.abs(d_ms-50) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      assert max(d50) < 1.0, f"high sof delta vs 50ms: {max(d50)}" | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      result += f"{name} sof delta vs 50ms: min  {min(d50):.5f}s\n" | 
					 | 
					 | 
					 | 
					      result += f"{name} sof delta vs 50ms: min  {min(d50):.5f}s\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      result += f"{name} sof delta vs 50ms: max  {max(d50):.5f}s\n" | 
					 | 
					 | 
					 | 
					      result += f"{name} sof delta vs 50ms: max  {max(d50):.5f}s\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      result += f"{name} sof delta vs 50ms: mean {d50.mean():.5f}s\n" | 
					 | 
					 | 
					 | 
					      result += f"{name} sof delta vs 50ms: mean {d50.mean():.5f}s\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      with subtests.test(camera=name): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        assert max(d50) < 1.0, f"high SOF delta vs 50ms: {max(d50)}" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    result += "------------------------------------------------\n" | 
					 | 
					 | 
					 | 
					    result += "------------------------------------------------\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    print(result) | 
					 | 
					 | 
					 | 
					    print(result) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |