mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-06-23 03:41:12 +00:00
[AZ-597] Batch 77: replay_mode helpers + 13 scenario stub rewires
Add `runner/helpers/replay_mode.py` (NullFrameSink, NullFcInboundEmitter, default_frame_period_ms, load_replay_json, resolve_replay_subdir, imu_replay_noop) and rewire all 13 scenarios off their local `_resolve_*` / `_drive_*` / `_push_*` NotImplementedError stubs. Closes the offline FDR-replay execution path. `grep raise NotImplementedError` under `e2e/tests/` now returns zero matches. +17 unit tests (626 total, up from 608). Unit-test behaviour unchanged (scenarios still skip via b75 sitl_replay_ready gate when E2E_SITL_REPLAY_DIR is unset). Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -124,12 +124,33 @@ def test_ft_n_01_outlier_tolerance(
|
||||
|
||||
|
||||
def _resolve_frame_sink(): # type: ignore[no-untyped-def]
|
||||
raise NotImplementedError(
|
||||
"frame sink resolution is owned by AZ-441 / runner.helpers.frame_source_replay"
|
||||
)
|
||||
"""Return a replay-mode `FrameSink` (counter-only; AZ-597)."""
|
||||
from runner.helpers.replay_mode import NullFrameSink
|
||||
|
||||
return NullFrameSink()
|
||||
|
||||
|
||||
def _resolve_gt_per_frame(report: OutlierInjectionReport) -> list[ote.GtPose]:
|
||||
raise NotImplementedError(
|
||||
"Per-frame GT resolution is owned by AZ-407 / runner.helpers.tile_cache_gt"
|
||||
)
|
||||
"""Load per-frame GT from `${E2E_SITL_REPLAY_DIR}/gt_per_frame.json` (AZ-597).
|
||||
|
||||
The fixture builder writes a list of `{frame_idx, lat_deg, lon_deg}`
|
||||
records keyed off `report.out_root.name` (one file per injection
|
||||
variant). In FDR-replay mode this is the GT the SUT was scored
|
||||
against when the FDR archive was originally produced.
|
||||
"""
|
||||
from runner.helpers.replay_mode import load_replay_json
|
||||
|
||||
raw = load_replay_json("gt_per_frame.json")
|
||||
if not isinstance(raw, list):
|
||||
raise ValueError(
|
||||
"gt_per_frame.json must be a JSON list of "
|
||||
"{frame_idx, lat_deg, lon_deg} records"
|
||||
)
|
||||
return [
|
||||
ote.GtPose(
|
||||
frame_idx=int(entry["frame_idx"]),
|
||||
lat_deg=float(entry["lat_deg"]),
|
||||
lon_deg=float(entry["lon_deg"]),
|
||||
)
|
||||
for entry in raw
|
||||
]
|
||||
|
||||
@@ -130,12 +130,14 @@ def test_ft_n_02_sharp_turn_failure(
|
||||
|
||||
|
||||
def _resolve_frame_sink(): # type: ignore[no-untyped-def]
|
||||
raise NotImplementedError(
|
||||
"frame sink resolution is owned by AZ-441 / runner.helpers.frame_source_replay"
|
||||
)
|
||||
"""Return a replay-mode `FrameSink` (counter-only; AZ-597)."""
|
||||
from runner.helpers.replay_mode import NullFrameSink
|
||||
|
||||
return NullFrameSink()
|
||||
|
||||
|
||||
def _drive_imu_replay(csv_path: Path) -> None:
|
||||
raise NotImplementedError(
|
||||
"IMU replay driver is owned by AZ-416/AZ-417 / runner.helpers.imu_replay"
|
||||
)
|
||||
"""Replay-mode no-op: IMU samples pre-baked into FDR archive (AZ-597)."""
|
||||
from runner.helpers.replay_mode import imu_replay_noop
|
||||
|
||||
imu_replay_noop(csv_path)
|
||||
|
||||
@@ -149,19 +149,21 @@ def test_ft_n_03_outage_reloc(
|
||||
|
||||
|
||||
def _resolve_outage_injection_frames() -> Path:
|
||||
raise NotImplementedError(
|
||||
"3-frame outage injector is owned by AZ-408 extension / "
|
||||
"fixtures/injectors/outlier.py (--all-zero variant)"
|
||||
)
|
||||
"""Resolve `${E2E_SITL_REPLAY_DIR}/outage_frames/` (AZ-597)."""
|
||||
from runner.helpers.replay_mode import resolve_replay_subdir
|
||||
|
||||
return resolve_replay_subdir("outage_frames")
|
||||
|
||||
|
||||
def _resolve_frame_sink(): # type: ignore[no-untyped-def]
|
||||
raise NotImplementedError(
|
||||
"frame sink resolution is owned by AZ-441 / runner.helpers.frame_source_replay"
|
||||
)
|
||||
"""Return a replay-mode `FrameSink` (counter-only; AZ-597)."""
|
||||
from runner.helpers.replay_mode import NullFrameSink
|
||||
|
||||
return NullFrameSink()
|
||||
|
||||
|
||||
def _resolve_frame_period_ms() -> int:
|
||||
raise NotImplementedError(
|
||||
"Frame period resolution is owned by AZ-441 / runner.helpers.frame_source_replay"
|
||||
)
|
||||
"""Return the default 30 fps per-frame period (AZ-597)."""
|
||||
from runner.helpers.replay_mode import default_frame_period_ms
|
||||
|
||||
return default_frame_period_ms()
|
||||
|
||||
@@ -216,9 +216,10 @@ def test_ft_n_04_blackout_spoof(
|
||||
|
||||
|
||||
def _resolve_frame_sink(): # type: ignore[no-untyped-def]
|
||||
raise NotImplementedError(
|
||||
"frame sink resolution is owned by AZ-441 / runner.helpers.frame_source_replay"
|
||||
)
|
||||
"""Return a replay-mode `FrameSink` (counter-only; AZ-597)."""
|
||||
from runner.helpers.replay_mode import NullFrameSink
|
||||
|
||||
return NullFrameSink()
|
||||
|
||||
|
||||
def _drive_fc_proxy(schedule_path: Path) -> None:
|
||||
@@ -228,6 +229,7 @@ def _drive_fc_proxy(schedule_path: Path) -> None:
|
||||
|
||||
|
||||
def _resolve_frame_period_ms() -> int:
|
||||
raise NotImplementedError(
|
||||
"Frame period resolution is owned by AZ-441 / runner.helpers.frame_source_replay"
|
||||
)
|
||||
"""Return the default 30 fps per-frame period (AZ-597)."""
|
||||
from runner.helpers.replay_mode import default_frame_period_ms
|
||||
|
||||
return default_frame_period_ms()
|
||||
|
||||
Reference in New Issue
Block a user