"""Unit tests for `jetson.jtop_parser` (mocked — jetson-stats not installed in CI).""" from __future__ import annotations import csv import json import sys from pathlib import Path from types import SimpleNamespace import pytest JETSON_ROOT = Path(__file__).resolve().parents[2] / "jetson" if str(JETSON_ROOT) not in sys.path: sys.path.insert(0, str(JETSON_ROOT)) import jtop_parser # noqa: E402 def test_state_to_row_extracts_known_fields() -> None: # Arrange state = SimpleNamespace( ram=SimpleNamespace(used=2048, tot=8192), gpu=SimpleNamespace(load=72, freq=SimpleNamespace(cur=624)), cpu=SimpleNamespace(load_avg=42.0), temperature={"SOC": 51.0, "GPU": 49.0}, power=SimpleNamespace(total=12000), ) # Act row = jtop_parser.state_to_row(state) # Assert assert row["ram_used_mb"] == 2048 assert row["ram_total_mb"] == 8192 assert row["gpu_load_pct"] == 72 assert row["gpu_freq_mhz"] == 624 assert row["soc_temp_c"] == 51.0 assert row["gpu_temp_c"] == 49.0 assert row["power_mw"] == 12000 def test_run_emits_stub_row_when_jetson_stats_missing(tmp_path: Path) -> None: """On hosts without jetson-stats, run() must still produce a one-row CSV with stub metadata.""" # Arrange out = tmp_path / "jtop.csv" # Force the ImportError path even if jetson-stats happens to be installed. sys.modules["jtop"] = None # type: ignore[assignment] try: # Act n = jtop_parser.run(out, interval_s=0.01, samples_max=1) # Assert assert n == 1 with out.open() as fh: rows = list(csv.DictReader(fh)) assert len(rows) == 1 extras = json.loads(rows[0]["extras_json"]) assert extras["stub"] is True assert extras["missing_dep"] == "jetson-stats" finally: del sys.modules["jtop"]