Skip to content

Commit fcdab5c

Browse files
Agent VMclaude
andcommitted
test + fix(fio): reset _fio_version state between parses
- Add failing test for state leakage between consecutive parses - Reset self._fio_version = None at start of parse_runs() - Prevent stale version from first parse leaking into second parse Addresses review feedback on PR #50. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 2d698a0 commit fcdab5c

2 files changed

Lines changed: 96 additions & 0 deletions

File tree

src/chronicler/processors/fio_processor.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,9 @@ def parse_runs(self, extracted_result: Dict[str, Any]) -> Dict[str, Any]:
191191
...
192192
}
193193
"""
194+
# Reset state to prevent leakage between parse calls
195+
self._fio_version = None
196+
194197
files = extracted_result.get("files") or {}
195198
if files.get("fio_results_json"):
196199
# Direct file path (demo / tmp/coremark-style layout)

tests/test_fio_version_extraction.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,3 +205,96 @@ def test_fio_version_no_wrapper_version(tmp_path):
205205
# Wrapper version should be "unknown" when test_info is missing
206206
assert test_info.wrapper_version == "unknown", \
207207
f"Expected wrapper_version='unknown', got '{test_info.wrapper_version}'"
208+
209+
210+
def test_fio_version_resets_between_parses(tmp_path):
211+
"""Processor reuse: version state should not leak between parse_runs() calls."""
212+
# First parse: fio-results.json WITH benchmark version
213+
fio_data_with_version = {
214+
"fio version": "fio-3.36",
215+
"timestamp": 1776775499,
216+
"jobs": [
217+
{
218+
"jobname": "test-job-1",
219+
"groupid": 0,
220+
"elapsed": 120,
221+
"read": {
222+
"io_bytes": 1000000,
223+
"bw": 8333,
224+
"iops": 2083,
225+
"runtime": 120000,
226+
"total_ios": 250000,
227+
"lat_ns": {"mean": 480000, "min": 100000, "max": 1000000},
228+
"clat_ns": {"mean": 470000, "min": 90000, "max": 990000},
229+
"slat_ns": {"mean": 10000, "min": 1000, "max": 50000}
230+
}
231+
}
232+
]
233+
}
234+
235+
fio_json_path1 = tmp_path / "fio-results-1.json"
236+
with open(fio_json_path1, "w") as f:
237+
json.dump(fio_data_with_version, f)
238+
239+
# Create test_info file with wrapper version for fallback
240+
test_info = {
241+
"fio": {
242+
"test_name": "fio",
243+
"repo_file": "v2.1.tar.gz"
244+
}
245+
}
246+
test_info_path = tmp_path / "test_info"
247+
with open(test_info_path, "w") as f:
248+
json.dump(test_info, f)
249+
250+
processor = FioProcessor(str(tmp_path))
251+
extracted_result1 = {"files": {"fio_results_json": str(fio_json_path1)},
252+
"extracted_path": str(tmp_path)}
253+
254+
# First parse
255+
with patch.object(processor.archive_handler, "extract_result_archive") as mock_extract:
256+
mock_extract.return_value = extracted_result1
257+
processor.parse_runs(extracted_result1)
258+
test_info1 = processor.build_test_info()
259+
260+
assert test_info1.version == "fio-3.36", "First parse should extract benchmark version"
261+
262+
# Second parse: fio-results.json WITHOUT benchmark version (reusing same processor instance)
263+
fio_data_without_version = {
264+
"timestamp": 1776775500,
265+
"jobs": [
266+
{
267+
"jobname": "test-job-2",
268+
"groupid": 0,
269+
"elapsed": 120,
270+
"read": {
271+
"io_bytes": 2000000,
272+
"bw": 16666,
273+
"iops": 4166,
274+
"runtime": 120000,
275+
"total_ios": 500000,
276+
"lat_ns": {"mean": 240000, "min": 50000, "max": 500000},
277+
"clat_ns": {"mean": 235000, "min": 45000, "max": 495000},
278+
"slat_ns": {"mean": 5000, "min": 500, "max": 25000}
279+
}
280+
}
281+
]
282+
}
283+
284+
fio_json_path2 = tmp_path / "fio-results-2.json"
285+
with open(fio_json_path2, "w") as f:
286+
json.dump(fio_data_without_version, f)
287+
288+
extracted_result2 = {"files": {"fio_results_json": str(fio_json_path2)},
289+
"extracted_path": str(tmp_path)}
290+
291+
# Second parse with same processor instance
292+
with patch.object(processor.archive_handler, "extract_result_archive") as mock_extract:
293+
mock_extract.return_value = extracted_result2
294+
processor.parse_runs(extracted_result2)
295+
test_info2 = processor.build_test_info()
296+
297+
# Should fall back to wrapper version, NOT retain stale "fio-3.36"
298+
assert test_info2.version == "v2.1", \
299+
f"Second parse should fall back to wrapper version, not retain stale 'fio-3.36'. Got '{test_info2.version}'"
300+
assert test_info2.wrapper_version == "v2.1"

0 commit comments

Comments
 (0)