Add test_log_compat

log-compat-test
Kacper Rączy 2 months ago
parent cdc801c3c1
commit b7f5de03c2
  1. 7
      selfdrive/test/fuzzy_generation.py
  2. 2
      selfdrive/test/process_replay/test_fuzzy.py
  3. 27
      selfdrive/test/process_replay/test_log_compat.py

@ -1,11 +1,10 @@
import capnp
import hypothesis.strategies as st
from typing import Any
from types import ModuleType
from collections.abc import Callable
from functools import cache
from cereal import log
DrawType = Callable[[st.SearchStrategy], Any]
@ -76,6 +75,6 @@ class FuzzyGenerator:
return data
@classmethod
def get_random_event_msg(cls, draw: DrawType, events: list[str], real_floats: bool = False) -> list[dict[str, Any]]:
def get_random_event_msg(cls, draw: DrawType, log_schema: ModuleType, events: list[str], real_floats: bool = False) -> list[dict[str, Any]]:
fg = cls(draw, real_floats=real_floats)
return [draw(fg.generate_struct(log.Event.schema, e)) for e in sorted(events)]
return [draw(fg.generate_struct(log_schema.Event.schema, e)) for e in sorted(events)]

@ -25,7 +25,7 @@ class TestFuzzProcesses:
@settings(phases=[Phase.generate, Phase.target], max_examples=MAX_EXAMPLES, deadline=1000,
suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large])
def test_fuzz_process(self, proc_name, cfg, data):
msgs = FuzzyGenerator.get_random_event_msg(data.draw, events=cfg.pubs, real_floats=True)
msgs = FuzzyGenerator.get_random_event_msg(data.draw, log_schema=log, events=cfg.pubs, real_floats=True)
lr = [log.Event.new_message(**m).as_reader() for m in msgs]
cfg.timeout = 5
pr.replay_process(cfg, lr, fingerprint=TOYOTA.TOYOTA_COROLLA_TSS2, disable_progress=True)

@ -0,0 +1,27 @@
import os
import capnp
import hypothesis.strategies as st
from hypothesis import given, settings, HealthCheck
from openpilot.selfdrive.test.fuzzy_generation import FuzzyGenerator
from openpilot.tools.lib.logreader import LogReader
MAX_EXAMPLES = int(os.environ.get("MAX_EXAMPLES", "10"))
@given(st.data())
@settings(max_examples=MAX_EXAMPLES, suppress_health_check=[HealthCheck.large_base_example])
def test_log_backwards_compatibility(schema_path, data):
# capnp global parser needs to be cleaned up to avoid schema/struct ID conflicts
capnp.cleanup_global_schema_parser()
old_log = capnp.load(schema_path)
capnp.cleanup_global_schema_parser()
msgs_dicts = FuzzyGenerator.get_random_event_msg(data.draw, log_schema=old_log, events=old_log.Event.schema.union_fields, real_floats=True)
msgs = [old_log.Event.new_message(**m).as_reader() for m in msgs_dicts]
dat = b"".join(msg.as_builder().to_bytes() for msg in msgs)
lr = list(LogReader.from_bytes(dat))
assert len(lr) == len(msgs)
# calling which() on a removed union type will raise an exception
assert set([m.which() for m in lr]) == set([msg.which() for msg in msgs])
Loading…
Cancel
Save