Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions oracletrace/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from importlib.metadata import version
from argparse import ArgumentParser, Namespace
from typing import List, Dict, Any, Optional, Tuple
from json import JSONDecodeError

from .reporters import generate_html_report
from .compare import compare_traces, ComparisonData
Expand Down Expand Up @@ -168,8 +169,21 @@ def _compare_and_fail(
print(f"Compare file not found: {args.compare}", file=sys.stderr)
return 1

with open(args.compare, "r", encoding="utf-8") as f:
old_data: TracerData = TracerData.from_dict(json.load(f))
try:
with open(args.compare, "r", encoding="utf-8") as f:
loaded_data = json.load(f)
except JSONDecodeError as e:
print(f"Compare file contains invalid JSON: {e}", file=sys.stderr)
return 1
except OSError as e:
print(f"Compare file read error: {e}", file=sys.stderr)
return 1

try:
old_data: TracerData = TracerData.from_dict(loaded_data)
except (KeyError, TypeError, ValueError) as e:
print(f"Compare file has invalid schema: {e}", file=sys.stderr)
return 1

comparison_result: ComparisonData = compare_traces(
old_data,
Expand Down
57 changes: 57 additions & 0 deletions tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,63 @@ def test_main_returns_1_when_compare_file_not_found(monkeypatch, tmp_path, trace
assert "Compare file not found:" in captured.err


def test_main_returns_1_when_compare_file_has_invalid_json(monkeypatch, tmp_path, trace_data, capsys):
target = tmp_path / "target.py"
target.write_text("print('hello')\n", encoding="utf-8")
compare_file = tmp_path / "baseline.json"
compare_file.write_text("{invalid json", encoding="utf-8")

monkeypatch.setattr(cli, "Tracer", lambda root, ignore_patterns: FakeTracer(root, ignore_patterns, trace_data))
monkeypatch.setattr(cli.runpy, "run_path", lambda *args, **kwargs: None)

exit_code = _run_cli(
monkeypatch,
["oracletrace", str(target), "--compare", str(compare_file)],
)

captured = capsys.readouterr()
assert exit_code == 1
assert "Compare file contains invalid JSON:" in captured.err


def test_main_returns_1_when_compare_file_has_invalid_schema(monkeypatch, tmp_path, trace_data, capsys):
target = tmp_path / "target.py"
target.write_text("print('hello')\n", encoding="utf-8")
compare_file = tmp_path / "baseline.json"
compare_file.write_text('{"foo": "bar"}', encoding="utf-8")

monkeypatch.setattr(cli, "Tracer", lambda root, ignore_patterns: FakeTracer(root, ignore_patterns, trace_data))
monkeypatch.setattr(cli.runpy, "run_path", lambda *args, **kwargs: None)

exit_code = _run_cli(
monkeypatch,
["oracletrace", str(target), "--compare", str(compare_file)],
)

captured = capsys.readouterr()
assert exit_code == 1
assert "Compare file has invalid schema:" in captured.err


def test_main_returns_1_when_compare_file_empty(monkeypatch, tmp_path, trace_data, capsys):
target = tmp_path / "target.py"
target.write_text("print('hello')\n", encoding="utf-8")
compare_file = tmp_path / "baseline.json"
compare_file.write_text("", encoding="utf-8")

monkeypatch.setattr(cli, "Tracer", lambda root, ignore_patterns: FakeTracer(root, ignore_patterns, trace_data))
monkeypatch.setattr(cli.runpy, "run_path", lambda *args, **kwargs: None)

exit_code = _run_cli(
monkeypatch,
["oracletrace", str(target), "--compare", str(compare_file)],
)

captured = capsys.readouterr()
assert exit_code == 1
assert "Compare file contains invalid JSON" in captured.err


def test_main_fails_with_exit_2_on_regression(monkeypatch, tmp_path, empty_trace_data, capsys):
target = tmp_path / "target.py"
target.write_text("print('hello')\n", encoding="utf-8")
Expand Down