diff --git a/trace_agg/tests/test_core.py b/trace_agg/tests/test_core.py new file mode 100644 index 0000000..4898eba --- /dev/null +++ b/trace_agg/tests/test_core.py @@ -0,0 +1,63 @@ +import json +import pytest +from pathlib import Path + +import src.trace_agg.core as core + +# --- Fixtures --- +@pytest.fixture +def sample_trace_data(tmp_path): + data = { + "correlation_id": "corr01", + "events": [ + {"had_sched_switch": 1, "had_irq": 0, "had_softirq": 0, "cpu_ids_seen": [0]}, + {"had_sched_switch": 0, "had_irq": 1, "had_softirq": 0, "cpu_ids_seen": [1]}, + {"had_sched_switch": 0, "had_irq": 0, "had_softirq": 1, "cpu_ids_seen": [2]} + ] + } + sample_path = tmp_path / "sample_trace.json" + with open(sample_path, "w", encoding="utf-8") as fh: + json.dump(data, fh) + return sample_path + +# --- Tests --- +def test_aggregate_trace_data_nominal(sample_trace_data, monkeypatch): + def mock_open_file(path: str): + with open(path, "r", encoding="utf-8") as fh: + return json.load(fh) + + monkeypatch.setattr(core, "open", open) + result = core.aggregate_trace_data("corr01") + assert isinstance(result, dict) + assert "had_sched_switch" in result + assert "had_irq" in result + assert "had_softirq" in result + assert "cpu_ids_seen" in result + # Ensure aggregation logic makes sense + assert result["had_sched_switch"] in (0, 1) + assert result["had_irq"] in (0, 1) + assert result["had_softirq"] in (0, 1) + assert all(isinstance(cpu, int) for cpu in result["cpu_ids_seen"]) + + +def test_aggregate_trace_data_edge_case_empty(monkeypatch): + def mock_open_file(path: str): + return {"correlation_id": "empty_case", "events": []} + + monkeypatch.setattr(core, "open", lambda path, *_args, **_kwargs: open(__file__, "r")) # Dummy but unused + + # Monkeypatch json.load since we're not actually reading + monkeypatch.setattr(json, "load", lambda fh: {"correlation_id": "empty_case", "events": []}) + + result = core.aggregate_trace_data("empty_case") + assert result["had_sched_switch"] == 0 + assert result["had_irq"] == 0 + assert result["had_softirq"] == 0 + assert result["cpu_ids_seen"] == [] + + +def test_aggregate_trace_data_invalid_input(monkeypatch): + monkeypatch.setattr(json, "load", lambda fh: {"correlation_id": "bad", "events": [{"had_sched_switch": "wrong"}]}) + + with pytest.raises((ValueError, TypeError)): + core.aggregate_trace_data("bad") \ No newline at end of file