diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index 86c38f2749..2512be8ee2 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -11,7 +11,7 @@ import sys import urllib.parse import warnings -from typing import Iterable, Iterator +from typing import Iterable, Iterator, List from urllib.parse import parse_qs, urlparse from cereal import log as capnp_log @@ -161,7 +161,10 @@ def parse_indirect(identifier): class LogReader: - def _logreaders_from_identifier(self, identifier): + def _logreaders_from_identifier(self, identifier: str | List[str]): + if isinstance(identifier, list): + return [LogReader(i) for i in identifier] + parsed, source, is_indirect = parse_indirect(identifier) if not is_indirect: @@ -175,7 +178,7 @@ class LogReader: return source(sr, mode, sort_by_time=self.sort_by_time, only_union_types=self.only_union_types) - def __init__(self, identifier: str, default_mode=ReadMode.RLOG, default_source=auto_source, sort_by_time=False, only_union_types=False): + def __init__(self, identifier: str | List[str], default_mode=ReadMode.RLOG, default_source=auto_source, sort_by_time=False, only_union_types=False): self.default_mode = default_mode self.default_source = default_source self.identifier = identifier diff --git a/tools/lib/tests/test_logreader.py b/tools/lib/tests/test_logreader.py index 10bb7d9737..a9769e5e63 100644 --- a/tools/lib/tests/test_logreader.py +++ b/tools/lib/tests/test_logreader.py @@ -2,6 +2,7 @@ import shutil import tempfile import numpy as np import unittest +import pytest from parameterized import parameterized import requests from openpilot.tools.lib.logreader import LogReader, parse_indirect, parse_slice, ReadMode @@ -69,20 +70,27 @@ class TestLogReader(unittest.TestCase): sr = SegmentRange(segment_range) parse_slice(sr) - @unittest.skip("this test is too slow for the minimal coverage it provides") + @pytest.mark.slow def test_modes(self): qlog_len = len(list(LogReader(f"{TEST_ROUTE}/0", ReadMode.QLOG))) rlog_len = len(list(LogReader(f"{TEST_ROUTE}/0", ReadMode.RLOG))) self.assertLess(qlog_len * 6, rlog_len) - @unittest.skip("this test is too slow for the minimal coverage it provides") + @pytest.mark.slow def test_modes_from_name(self): qlog_len = len(list(LogReader(f"{TEST_ROUTE}/0/q"))) rlog_len = len(list(LogReader(f"{TEST_ROUTE}/0/r"))) self.assertLess(qlog_len * 6, rlog_len) + @pytest.mark.slow + def test_list(self): + qlog_len = len(list(LogReader(f"{TEST_ROUTE}/0/q"))) + qlog_len_2 = len(list(LogReader([f"{TEST_ROUTE}/0/q", f"{TEST_ROUTE}/0/q"]))) + + self.assertEqual(qlog_len*2, qlog_len_2) + if __name__ == "__main__": unittest.main()