diff --git a/common/timeout.py b/common/timeout.py new file mode 100644 index 00000000..94c838ca --- /dev/null +++ b/common/timeout.py @@ -0,0 +1,28 @@ +# hard-forked from https://github.com/commaai/openpilot/blob/master/common/timeout.py +import signal + +class TimeoutException(Exception): + pass + +class Timeout: + """ + Timeout context manager. + For example this code will raise a TimeoutException: + with Timeout(seconds=5, error_msg="Sleep was too long"): + time.sleep(10) + """ + def __init__(self, seconds, error_msg=None): + if error_msg is None: + error_msg = f'Timed out after {seconds} seconds' + self.seconds = seconds + self.error_msg = error_msg + + def handle_timeout(self, signume, frame): + raise TimeoutException(self.error_msg) + + def __enter__(self): + signal.signal(signal.SIGALRM, self.handle_timeout) + signal.alarm(self.seconds) + + def __exit__(self, exc_type, exc_val, exc_tb): + signal.alarm(0) \ No newline at end of file diff --git a/selfdrive/loggerd/tests/test_loggerd.py b/selfdrive/loggerd/tests/test_loggerd.py index 9dbc7ac3..9dbe5cf2 100755 --- a/selfdrive/loggerd/tests/test_loggerd.py +++ b/selfdrive/loggerd/tests/test_loggerd.py @@ -17,10 +17,10 @@ from common.timeout import Timeout from selfdrive.loggerd.config import ROOT from selfdrive.manager.process_config import managed_processes -from system.version import get_version +# from system.version import get_version from tools.lib.logreader import LogReader -from cereal.visionipc import VisionIpcServer, VisionStreamType -from common.transformations.camera import tici_f_frame_size, tici_d_frame_size, tici_e_frame_size +# from cereal.visionipc import VisionIpcServer, VisionStreamType +# from common.transformations.camera import tici_f_frame_size, tici_d_frame_size, tici_e_frame_size SentinelType = log.Sentinel.SentinelType @@ -102,49 +102,49 @@ def test_init_data_values(self): for _, k, v in fake_params: self.assertEqual(getattr(initData, k), v) - def test_rotation(self): - os.environ["LOGGERD_TEST"] = "1" - Params().put("RecordFront", "1") - - expected_files = {"rlog", "qlog", "qcamera.ts", "fcamera.hevc", "dcamera.hevc", "ecamera.hevc"} - streams = [(VisionStreamType.VISION_STREAM_ROAD, (*tici_f_frame_size, 2048*2346, 2048, 2048*1216), "roadCameraState"), - (VisionStreamType.VISION_STREAM_DRIVER, (*tici_d_frame_size, 2048*2346, 2048, 2048*1216), "driverCameraState"), - (VisionStreamType.VISION_STREAM_WIDE_ROAD, (*tici_e_frame_size, 2048*2346, 2048, 2048*1216), "wideRoadCameraState")] - - pm = messaging.PubMaster(["roadCameraState", "driverCameraState", "wideRoadCameraState"]) - vipc_server = VisionIpcServer("camerad") - for stream_type, frame_spec, _ in streams: - vipc_server.create_buffers_with_sizes(stream_type, 40, False, *(frame_spec)) - vipc_server.start_listener() - - for _ in range(5): - num_segs = random.randint(2, 5) - length = random.randint(1, 3) - os.environ["LOGGERD_SEGMENT_LENGTH"] = str(length) - managed_processes["loggerd"].start() - managed_processes["encoderd"].start() - - fps = 20.0 - for n in range(1, int(num_segs*length*fps)+1): - for stream_type, frame_spec, state in streams: - dat = np.empty(frame_spec[2], dtype=np.uint8) - vipc_server.send(stream_type, dat[:].flatten().tobytes(), n, n/fps, n/fps) - - camera_state = messaging.new_message(state) - frame = getattr(camera_state, state) - frame.frameId = n - pm.send(state, camera_state) - time.sleep(1.0/fps) - - managed_processes["loggerd"].stop() - managed_processes["encoderd"].stop() - - route_path = str(self._get_latest_log_dir()).rsplit("--", 1)[0] - for n in range(num_segs): - p = Path(f"{route_path}--{n}") - logged = {f.name for f in p.iterdir() if f.is_file()} - diff = logged ^ expected_files - self.assertEqual(len(diff), 0, f"didn't get all expected files. run={_} seg={n} {route_path=}, {diff=}\n{logged=} {expected_files=}") + # def test_rotation(self): + # os.environ["LOGGERD_TEST"] = "1" + # Params().put("RecordFront", "1") + + # expected_files = {"rlog", "qlog", "qcamera.ts", "fcamera.hevc", "dcamera.hevc", "ecamera.hevc"} + # streams = [(VisionStreamType.VISION_STREAM_ROAD, (*tici_f_frame_size, 2048*2346, 2048, 2048*1216), "roadCameraState"), + # (VisionStreamType.VISION_STREAM_DRIVER, (*tici_d_frame_size, 2048*2346, 2048, 2048*1216), "driverCameraState"), + # (VisionStreamType.VISION_STREAM_WIDE_ROAD, (*tici_e_frame_size, 2048*2346, 2048, 2048*1216), "wideRoadCameraState")] + + # pm = messaging.PubMaster(["roadCameraState", "driverCameraState", "wideRoadCameraState"]) + # vipc_server = VisionIpcServer("camerad") + # for stream_type, frame_spec, _ in streams: + # vipc_server.create_buffers_with_sizes(stream_type, 40, False, *(frame_spec)) + # vipc_server.start_listener() + + # for _ in range(5): + # num_segs = random.randint(2, 5) + # length = random.randint(1, 3) + # os.environ["LOGGERD_SEGMENT_LENGTH"] = str(length) + # managed_processes["loggerd"].start() + # managed_processes["encoderd"].start() + + # fps = 20.0 + # for n in range(1, int(num_segs*length*fps)+1): + # for stream_type, frame_spec, state in streams: + # dat = np.empty(frame_spec[2], dtype=np.uint8) + # vipc_server.send(stream_type, dat[:].flatten().tobytes(), n, n/fps, n/fps) + + # camera_state = messaging.new_message(state) + # frame = getattr(camera_state, state) + # frame.frameId = n + # pm.send(state, camera_state) + # time.sleep(1.0/fps) + + # managed_processes["loggerd"].stop() + # managed_processes["encoderd"].stop() + + # route_path = str(self._get_latest_log_dir()).rsplit("--", 1)[0] + # for n in range(num_segs): + # p = Path(f"{route_path}--{n}") + # logged = {f.name for f in p.iterdir() if f.is_file()} + # diff = logged ^ expected_files + # self.assertEqual(len(diff), 0, f"didn't get all expected files. run={_} seg={n} {route_path=}, {diff=}\n{logged=} {expected_files=}") def test_bootlog(self): # generate bootlog with fake launch log