Loggerd rotation test (#2077)
	
		
	
				
					
				
			* loggerd test
* delete afterwards
* add ccc
* fix pylint
* cleanup rotation test
* this works
* bump tolerance
* clear the data after test
Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 87473fbc41
			
			
				vw-mqb-aeb
			
			
		
							parent
							
								
									27c2d23780
								
							
						
					
					
						commit
						275123e6d4
					
				
				 4 changed files with 113 additions and 20 deletions
			
			
		@ -0,0 +1,84 @@ | 
				
			|||||||
 | 
					#!/usr/bin/env python3 | 
				
			||||||
 | 
					import math | 
				
			||||||
 | 
					import os | 
				
			||||||
 | 
					import random | 
				
			||||||
 | 
					import shutil | 
				
			||||||
 | 
					import time | 
				
			||||||
 | 
					import unittest | 
				
			||||||
 | 
					from pathlib import Path | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from common.params import Params | 
				
			||||||
 | 
					from common.hardware import EON, TICI | 
				
			||||||
 | 
					from common.timeout import Timeout | 
				
			||||||
 | 
					from selfdrive.test.helpers import with_processes | 
				
			||||||
 | 
					from selfdrive.loggerd.config import ROOT | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# baseline file sizes for a 2s segment, in bytes | 
				
			||||||
 | 
					FULL_SIZE = 1253786 | 
				
			||||||
 | 
					if EON: | 
				
			||||||
 | 
					  CAMERAS = { | 
				
			||||||
 | 
					    "fcamera": FULL_SIZE, | 
				
			||||||
 | 
					    "dcamera": 770920, | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					elif TICI: | 
				
			||||||
 | 
					  CAMERAS = {f"{c}camera": FULL_SIZE for c in ["f", "e", "d"]} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FILE_SIZE_TOLERANCE = 0.25 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestLoggerd(unittest.TestCase): | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # TODO: all of loggerd should work on PC | 
				
			||||||
 | 
					  @classmethod | 
				
			||||||
 | 
					  def setUpClass(cls): | 
				
			||||||
 | 
					    if not (EON or TICI): | 
				
			||||||
 | 
					      raise unittest.SkipTest | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def setUp(self): | 
				
			||||||
 | 
					    Params().put("RecordFront", "1") | 
				
			||||||
 | 
					    self._clear_logs() | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    self.segment_length = 2 | 
				
			||||||
 | 
					    os.environ["LOGGERD_TEST"] = "1" | 
				
			||||||
 | 
					    os.environ["LOGGERD_SEGMENT_LENGTH"] = str(self.segment_length) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def tearDown(self): | 
				
			||||||
 | 
					    self._clear_logs() | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def _clear_logs(self): | 
				
			||||||
 | 
					    if os.path.exists(ROOT): | 
				
			||||||
 | 
					      shutil.rmtree(ROOT) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def _get_latest_segment_path(self): | 
				
			||||||
 | 
					    last_route = sorted(Path(ROOT).iterdir(), key=os.path.getmtime)[-1] | 
				
			||||||
 | 
					    return os.path.join(ROOT, last_route) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # TODO: this should run faster than real time | 
				
			||||||
 | 
					  @with_processes(['camerad', 'loggerd'], init_time=2) | 
				
			||||||
 | 
					  def test_log_rotation(self): | 
				
			||||||
 | 
					    # wait for first seg to start being written | 
				
			||||||
 | 
					    time.sleep(5) | 
				
			||||||
 | 
					    route_prefix_path = self._get_latest_segment_path().rsplit("--", 1)[0] | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    num_segments = random.randint(80, 150) | 
				
			||||||
 | 
					    for i in range(num_segments): | 
				
			||||||
 | 
					      if i < num_segments - 1: | 
				
			||||||
 | 
					        with Timeout(self.segment_length*3, error_msg=f"timed out waiting for segment {i}"): | 
				
			||||||
 | 
					          while True: | 
				
			||||||
 | 
					            seg_num = int(self._get_latest_segment_path().rsplit("--", 1)[1]) | 
				
			||||||
 | 
					            if seg_num > i: | 
				
			||||||
 | 
					              break | 
				
			||||||
 | 
					            time.sleep(0.1) | 
				
			||||||
 | 
					      else: | 
				
			||||||
 | 
					        time.sleep(self.segment_length + 2) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # check each camera file size | 
				
			||||||
 | 
					      for camera, size in CAMERAS.items(): | 
				
			||||||
 | 
					        f = f"{route_prefix_path}--{i}/{camera}.hevc" | 
				
			||||||
 | 
					        self.assertTrue(os.path.exists(f), f"couldn't find {f}") | 
				
			||||||
 | 
					        file_size = os.path.getsize(f) | 
				
			||||||
 | 
					        self.assertTrue(math.isclose(file_size, size, rel_tol=FILE_SIZE_TOLERANCE),  | 
				
			||||||
 | 
					                        f"{camera} failed size check: expected {size}, got {file_size}") | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__": | 
				
			||||||
 | 
					  unittest.main() | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue