Remove dataset replay
This commit is contained in:
@@ -28,9 +28,9 @@ from python_app.hardware_full.librevna_driver.transport.usb import USBTransport
|
||||
from python_app.hardware_full.switch_drivers.h7992_driver import H7992Driver
|
||||
from python_app.hardware_full.switched_matrix_radar_service import SwitchedMatrixRadarService
|
||||
from python_app.models.run_config_schema import RadarSweepModel, RunConfigModel
|
||||
from python_app.models.dataset_model import ComboKey, SweepCollection, TraceData
|
||||
from python_app.models.dataset_model import SweepCollection
|
||||
from python_app.orchestration.shm.decoder import RAW_MAGIC, decode_trace_collection
|
||||
from python_app.scripts import kamil_adc_raw_producer, matrix_raw_producer, replay_raw_producer, producer_common
|
||||
from python_app.scripts import kamil_adc_raw_producer, matrix_raw_producer, producer_common
|
||||
from python_app.workflows.radar_config_variants import scan_radar_config_variants
|
||||
|
||||
|
||||
@@ -297,42 +297,16 @@ class TtyLifecycleTest(unittest.TestCase):
|
||||
|
||||
|
||||
class ProducerCleanupTest(unittest.TestCase):
|
||||
def test_replay_rejects_small_slots_before_publishing_any_data(self) -> None:
|
||||
module = replay_raw_producer
|
||||
config = RunConfigModel()
|
||||
config.radar.replay.dataset_dir = "/test/data"
|
||||
config.rings.raw.slot_size_bytes = 1
|
||||
config.rings.raw_tap.name = "/test_raw_tap"
|
||||
trace = TraceData(
|
||||
ComboKey(0, 0), np.array([1, 2], dtype=np.float32),
|
||||
np.array([1, 2], dtype=np.complex64),
|
||||
)
|
||||
dataset = module.ReplayDataset([[trace]], [20])
|
||||
raw, tap = Mock(), Mock()
|
||||
with patch.object(producer_common.RunConfigModel, "load_from_path", return_value=config), patch.object(producer_common.signal, "signal"), patch.object(module, "_load_dataset", return_value=dataset), patch.object(producer_common, "ShmRingWriter", side_effect=[raw, tap]), patch("sys.argv", [module.__name__, "--config", "/test/config.json"]):
|
||||
with self.assertRaisesRegex(ValueError, "Replay requires .* bytes per slot"):
|
||||
module.main()
|
||||
raw.push.assert_not_called()
|
||||
tap.push.assert_not_called()
|
||||
raw.close.assert_called_once()
|
||||
tap.close.assert_called_once()
|
||||
|
||||
def test_partial_ring_initialization_closes_first_writer(self) -> None:
|
||||
for module, model in ((matrix_raw_producer, "librevna_multi"), (kamil_adc_raw_producer, "kamil_adc"), (replay_raw_producer, "librevna")):
|
||||
for module, model in ((matrix_raw_producer, "librevna_multi"), (kamil_adc_raw_producer, "kamil_adc")):
|
||||
with self.subTest(producer=module.__name__):
|
||||
config = RunConfigModel()
|
||||
config.radar.model = model
|
||||
config.radar.replay.dataset_dir = "/test/data"
|
||||
config.rings.raw_tap.name = "/test_raw_tap"
|
||||
writer = Mock()
|
||||
with patch.object(producer_common.RunConfigModel, "load_from_path", return_value=config), patch.object(producer_common.signal, "signal"), patch.object(producer_common, "ShmRingWriter", side_effect=[writer, OSError("second ring failed")]), patch("sys.argv", [module.__name__, "--config", "/test/config.json"]):
|
||||
if module is replay_raw_producer:
|
||||
with patch.object(module, "_load_dataset", return_value=Mock(median_gap_ns=1, __len__=Mock(return_value=1))):
|
||||
with self.assertRaisesRegex(OSError, "second ring failed"):
|
||||
module.main()
|
||||
else:
|
||||
with self.assertRaisesRegex(OSError, "second ring failed"):
|
||||
module.main()
|
||||
with patch.object(producer_common.RunConfigModel, "load_from_path", return_value=config), patch.object(producer_common, "validate_acquisition_config"), patch.object(producer_common.signal, "signal"), patch.object(producer_common, "ShmRingWriter", side_effect=[writer, OSError("second ring failed")]), patch("sys.argv", [module.__name__, "--config", "/test/config.json"]):
|
||||
with self.assertRaisesRegex(OSError, "second ring failed"):
|
||||
module.main()
|
||||
writer.close.assert_called_once()
|
||||
|
||||
def test_disabled_tap_opens_and_publishes_only_the_required_raw_ring(self) -> None:
|
||||
|
||||
@@ -119,20 +119,15 @@ class ObjectCaptureLifecycleTest(unittest.TestCase):
|
||||
capture._start()
|
||||
return capture
|
||||
|
||||
def test_missing_tap_and_replay_report_error_before_pausing(self) -> None:
|
||||
for invalid in ("tap", "replay"):
|
||||
with self.subTest(invalid=invalid):
|
||||
self.config = _config()
|
||||
if invalid == "tap":
|
||||
self.config.rings.preprocessed_tap.name = ""
|
||||
else:
|
||||
self.config.radar.replay.dataset_dir = "/recorded"
|
||||
self.controller.capture_data()
|
||||
self.assertIsNone(self.controller.capture)
|
||||
self.assertFalse(self.dialog._capture_pending)
|
||||
self.stop.assert_not_called()
|
||||
self.start.assert_not_called()
|
||||
self.assertEqual(self.error.call_count, 2)
|
||||
def test_missing_tap_reports_error_before_pausing(self) -> None:
|
||||
self.config = _config()
|
||||
self.config.rings.preprocessed_tap.name = ""
|
||||
self.controller.capture_data()
|
||||
self.assertIsNone(self.controller.capture)
|
||||
self.assertFalse(self.dialog._capture_pending)
|
||||
self.stop.assert_not_called()
|
||||
self.start.assert_not_called()
|
||||
self.error.assert_called_once()
|
||||
|
||||
def test_preprocess_refresh_signals_report_invalid_pending_config(self) -> None:
|
||||
dialog = self.preprocess.ensure_dialog()
|
||||
|
||||
@@ -137,19 +137,6 @@ class RadarModelCommandTest(unittest.TestCase):
|
||||
return path
|
||||
|
||||
|
||||
def test_null_replay_directory_does_not_select_replay(self) -> None:
|
||||
path = self._config_with_model("librevna")
|
||||
path.write_text(json.dumps({"radar": {"replay": {"dataset_dir": None}}}))
|
||||
self.assertEqual(self.supervisor._acquisition_command(path)[:3],
|
||||
[sys.executable, "-m", "python_app.scripts.matrix_raw_producer"])
|
||||
|
||||
def test_replay_overrides_every_model(self) -> None:
|
||||
for model in ("librevna", "librevna_multi", "kamil_adc"):
|
||||
path = self._config_with_model(model)
|
||||
path.write_text(json.dumps({"radar": {"model": model, "replay": {"dataset_dir": "capture"}}}))
|
||||
self.assertEqual(self.supervisor._acquisition_command(path)[:3],
|
||||
[sys.executable, "-m", "python_app.scripts.replay_raw_producer"])
|
||||
|
||||
def test_matrix_producer_for_multi(self) -> None:
|
||||
cmd = self.supervisor._acquisition_command(self._config_with_model("librevna_multi"))
|
||||
self.assertEqual(cmd[:3], [sys.executable, "-m", "python_app.scripts.matrix_raw_producer"])
|
||||
|
||||
@@ -17,7 +17,6 @@ from python_app.models.dataset_model import (
|
||||
)
|
||||
from python_app.storage.npz.store import NpzStore
|
||||
from python_app.storage.npz.vna_history_json import build_vna_history_payload
|
||||
from python_app.scripts.replay_raw_producer import _load_dataset
|
||||
from python_app.storage.npz.vna_history_json import collection_directories, load_vna_history_snapshot
|
||||
from python_app.workflows.sequential_capture_workflow import combine_collections_via_median, combine_traces_via_median
|
||||
|
||||
@@ -352,14 +351,12 @@ class PersistenceIntegrityTest(unittest.TestCase):
|
||||
self.assertEqual(paths[0].read_bytes(), exported)
|
||||
self.assertEqual({path: path.read_bytes() for path in before}, before)
|
||||
|
||||
def test_long_recording_replay_and_converter_use_numeric_directory_order(self) -> None:
|
||||
def test_long_recording_converter_uses_numeric_directory_order(self) -> None:
|
||||
writer = self.store.create_snapshot_stream(self.output, 'long')
|
||||
writer.append([_sweep(1, 10), _sweep(2, 20), _sweep(3, 30)], [], [])
|
||||
folders = sorted((writer.directory / 'raw').iterdir())
|
||||
for folder, index in zip(folders, (9998, 9999, 10000), strict=True):
|
||||
folder.rename(folder.with_name(f'{index}_{folder.name.split("_", 1)[1]}'))
|
||||
dataset = _load_dataset(writer.directory / 'raw', [ComboKey(0, 0)], 2)
|
||||
self.assertEqual(dataset.timestamps_ns, [10, 20, 30])
|
||||
self.assertEqual([int(path.name.split('_')[0]) for path in collection_directories(writer.directory / 'raw')], [9998, 9999, 10000])
|
||||
|
||||
def test_offline_and_runtime_json_exports_share_matching_and_preserve_orphan_sweeps(self) -> None:
|
||||
|
||||
@@ -149,12 +149,9 @@ class AcquisitionValidationTest(unittest.TestCase):
|
||||
ring.slot_size_bytes = original
|
||||
validate_acquisition_config(config)
|
||||
|
||||
def test_kamil_requires_native_mode_except_for_replay(self) -> None:
|
||||
config = self.config("kamil_adc")
|
||||
def test_kamil_requires_native_mode(self) -> None:
|
||||
with self.assertRaisesRegex(ValueError, "native"):
|
||||
validate_acquisition_config(config)
|
||||
config.radar.replay.dataset_dir = "recorded"
|
||||
validate_acquisition_config(config)
|
||||
validate_acquisition_config(self.config("kamil_adc"))
|
||||
|
||||
def test_matrix_validates_physical_switch_instead_of_virtual_axis(self) -> None:
|
||||
config = self.config("librevna_multi")
|
||||
|
||||
Reference in New Issue
Block a user