mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-11-07 04:53:47 +08:00
e9dd458699
Provide route replay, log migration and recorded vehicle fixtures for regression checks. Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com> Co-authored-by: Dom <168790843+firestar5683@users.noreply.github.com> Co-authored-by: Kacper Rączy <gfw.kra@gmail.com> Co-authored-by: YassineYousfi <yyousfi1@binghamton.edu> Co-authored-by: firestarsdog <229254897+firestarsdog@users.noreply.github.com>
81 lines
3.3 KiB
Python
81 lines
3.3 KiB
Python
from dataclasses import dataclass, field
|
|
import hashlib
|
|
import json
|
|
from pathlib import Path
|
|
import tempfile
|
|
import unittest
|
|
|
|
from tools.ci.replay_references import config_signature, reviewed_reference
|
|
|
|
|
|
@dataclass
|
|
class Config:
|
|
proc_name: str = "card"
|
|
pubs: list[str] = field(default_factory=lambda: ["can"])
|
|
ignore: list[str] = field(default_factory=list)
|
|
tolerance: float = 0.0
|
|
|
|
|
|
class Callback:
|
|
def __init__(self, trigger):
|
|
self.trigger = trigger
|
|
def __call__(self):
|
|
return self.trigger
|
|
|
|
|
|
class TestReviewedReferences(unittest.TestCase):
|
|
def setUp(self):
|
|
self.directory = tempfile.TemporaryDirectory()
|
|
self.addCleanup(self.directory.cleanup)
|
|
self.root = Path(self.directory.name)
|
|
self.cfg = Config()
|
|
self.input = b"independent input"
|
|
expected = b"approved expected output"
|
|
(self.root / "card.zst").write_bytes(expected)
|
|
self.record = {"official_baseline_commit": "official", "official_artifact_commit": "artifact", "segment": "known", "process": "card", "file": "card.zst", "bytes": len(expected),
|
|
"sha256": hashlib.sha256(expected).hexdigest(), "input_bytes": len(self.input),
|
|
"input_sha256": hashlib.sha256(self.input).hexdigest(), "config_sha256": config_signature(self.cfg)}
|
|
self.write_manifest()
|
|
|
|
def write_manifest(self):
|
|
(self.root / "manifest.json").write_text(json.dumps({"version": 1, "official_baseline_commit": "official", "official_artifact_commit": "artifact", "references": [self.record]}))
|
|
|
|
def select(self, segment="known", raw=None):
|
|
return reviewed_reference(segment, self.cfg, self.input if raw is None else raw, official_commit="official", artifact_commit="artifact", reference_dir=self.root)
|
|
|
|
def test_exact_pair_and_official_fallback(self):
|
|
self.assertEqual(self.select(), str(self.root / "card.zst"))
|
|
self.assertIsNone(self.select("unknown"))
|
|
self.cfg.proc_name = "controlsd"
|
|
self.assertIsNone(self.select())
|
|
|
|
def test_modified_reference_is_rejected(self):
|
|
(self.root / "card.zst").write_bytes(b"unreviewed")
|
|
with self.assertRaisesRegex(ValueError, "reference changed"):
|
|
self.select()
|
|
|
|
def test_modified_input_is_rejected(self):
|
|
with self.assertRaisesRegex(ValueError, "input changed"):
|
|
self.select(raw=b"other input")
|
|
|
|
def test_comparison_configuration_change_is_rejected(self):
|
|
self.cfg.ignore.append("sendcan")
|
|
with self.assertRaisesRegex(ValueError, "configuration changed"):
|
|
self.select()
|
|
|
|
def test_callback_signature_is_stable_and_includes_parameters(self):
|
|
@dataclass
|
|
class CallbackConfig:
|
|
callback: object
|
|
self.assertEqual(config_signature(CallbackConfig(Callback("can"))), config_signature(CallbackConfig(Callback("can"))))
|
|
self.assertNotEqual(config_signature(CallbackConfig(Callback("can"))), config_signature(CallbackConfig(Callback("carState"))))
|
|
|
|
def test_local_filename_and_duplicate_checks(self):
|
|
self.record["file"] = "../card.zst"
|
|
self.write_manifest()
|
|
with self.assertRaisesRegex(ValueError, "local filename"):
|
|
self.select()
|
|
(self.root / "manifest.json").write_text(json.dumps({"version": 1, "official_baseline_commit": "official", "official_artifact_commit": "artifact", "references": [self.record, self.record]}))
|
|
with self.assertRaisesRegex(ValueError, "Duplicate"):
|
|
self.select()
|