Add artifact.retry_analysis/tests/test_core.py

This commit is contained in:
Mika 2026-03-09 13:44:30 +00:00
parent 49252400d7
commit b59154d6dc

View file

@ -0,0 +1,69 @@
import json
import pytest
from pathlib import Path
from artifact_retry_analysis import core
def make_temp_logfile(tmp_path, entries):
file_path = tmp_path / "retry_log.json"
with file_path.open('w', encoding='utf-8') as f:
json.dump(entries, f)
return file_path
def test_analyze_retry_data_basic_success(tmp_path):
entries = [
{"retry_taken": True, "retry_total_overhead_ms": 50.0, "stratum": "pinned", "expires_at_dist_hours": 1.5, "delta_t": 0.1},
{"retry_taken": True, "retry_total_overhead_ms": 70.0, "stratum": "unpinned", "expires_at_dist_hours": 2.5, "delta_t": 0.2},
{"retry_taken": False, "retry_total_overhead_ms": 0.0, "stratum": "pinned", "expires_at_dist_hours": 1.0, "delta_t": 0.0}
]
log_file = make_temp_logfile(tmp_path, entries)
report = core.analyze_retry_data(str(log_file))
assert isinstance(report, core.RetryAnalysisReport)
assert report.total_retries == 2
assert 0.0 <= report.success_rate <= 100.0
assert 0.0 <= report.failure_rate <= 100.0
json_out = json.loads(report.to_json())
assert set(json_out.keys()) == {"total_retries", "success_rate", "failure_rate", "details"}
def test_analyze_retry_data_empty_file(tmp_path):
log_file = make_temp_logfile(tmp_path, [])
report = core.analyze_retry_data(str(log_file))
assert report.total_retries == 0
assert report.success_rate == 0.0
assert report.failure_rate == 0.0
def test_analyze_retry_data_invalid_json(tmp_path):
bad_file = tmp_path / "bad.json"
bad_file.write_text('{invalid json}', encoding='utf-8')
with pytest.raises((json.JSONDecodeError, ValueError)):
_ = core.analyze_retry_data(str(bad_file))
def test_report_to_json_roundtrip():
report = core.RetryAnalysisReport(
total_retries=10,
success_rate=80.0,
failure_rate=20.0,
details="All systems stable"
)
json_str = report.to_json()
data = json.loads(json_str)
assert data['total_retries'] == 10
assert abs(data['success_rate'] - 80.0) < 1e-6
assert 'details' in data
def test_edge_case_failure_rate(tmp_path):
entries = [
{"retry_taken": True, "retry_total_overhead_ms": 30.0, "stratum": "pinned", "expires_at_dist_hours": 1.5, "delta_t": 0.1},
{"retry_taken": True, "retry_total_overhead_ms": 25.0, "stratum": "unpinned", "expires_at_dist_hours": 2.0, "delta_t": 0.2},
{"retry_taken": True, "retry_total_overhead_ms": 40.0, "stratum": "unpinned", "expires_at_dist_hours": 3.0, "delta_t": 0.3}
]
log_file = make_temp_logfile(tmp_path, entries)
report = core.analyze_retry_data(str(log_file))
assert isinstance(report.total_retries, int)
assert report.success_rate + report.failure_rate <= 100.0 + 1e-6