@@ -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