1212import time
1313from dataclasses import dataclass , field
1414
15- from lib .nipa import has_crash , extract_crash
15+ from lib .nipa import (has_crash , extract_crash , guess_indicators ,
16+ result_from_indicators , parse_nested_tests , namify )
1617
1718
1819# Log file handle, set by set_log_file() before builds start.
@@ -416,17 +417,6 @@ def fetch_results(machine_ips, reservation_id, results_path):
416417 check = False )
417418
418419
419- def _retcode_to_result (retcode , stdout ):
420- """Map a test return code + stdout to pass/fail/skip."""
421- if retcode == 4 :
422- return 'skip'
423- if retcode != 0 :
424- return 'fail'
425- if 'ok' not in stdout .lower ():
426- return 'skip'
427- return 'pass'
428-
429-
430420def parse_results (results_path , link ):
431421 """Parse fetched test output into a vmksft-p-style result list.
432422
@@ -464,28 +454,36 @@ def parse_results(results_path, link):
464454 with open (stdout_path , encoding = 'utf-8' ) as fp :
465455 stdout = fp .read ()
466456
467- # Determine result
468- result = _retcode_to_result (retcode , stdout )
457+ # Determine result using indicators
458+ indicators = guess_indicators (stdout )
459+ result = result_from_indicators (retcode , indicators )
460+
461+ # Parse nested subtests
462+ nested = parse_nested_tests (stdout , namify )
469463
470464 # Determine retry result if present
471465 retry_result = None
466+ retry_nested = None
472467 if 'retry_retcode' in info :
473468 retry_stdout = ''
474469 retry_dir = os .path .join (output_dir , entry + '-retry' )
475470 retry_stdout_path = os .path .join (retry_dir , 'stdout' )
476471 if os .path .exists (retry_stdout_path ):
477472 with open (retry_stdout_path , encoding = 'utf-8' ) as fp :
478473 retry_stdout = fp .read ()
479- retry_result = _retcode_to_result (info ['retry_retcode' ],
480- retry_stdout )
474+ retry_indicators = guess_indicators (retry_stdout )
475+ retry_result = result_from_indicators (info ['retry_retcode' ],
476+ retry_indicators )
477+ if nested :
478+ retry_nested = list (nested )
479+ parse_nested_tests (retry_stdout , namify ,
480+ prev_results = retry_nested )
481481
482- safe_name = re .sub (r'[^0-9a-zA-Z]+' , '-' , prog )
483- if safe_name and safe_name [- 1 ] == '-' :
484- safe_name = safe_name [:- 1 ]
482+ safe_name = namify (prog )
485483
486484 outcome = {
487485 'test' : safe_name or entry ,
488- 'group' : f'selftests-{ re . sub ( r"[^0-9a-zA-Z]+" , "-" , target ). rstrip ( "-" )} ' ,
486+ 'group' : f'selftests-{ namify ( target )} ' ,
489487 'result' : result ,
490488 'link' : link ,
491489 }
@@ -495,6 +493,10 @@ def parse_results(results_path, link):
495493 outcome ['retry' ] = retry_result
496494 if info .get ('crashes' ):
497495 outcome ['crashes' ] = info ['crashes' ]
496+ if retry_nested :
497+ outcome ['results' ] = retry_nested
498+ elif nested :
499+ outcome ['results' ] = nested
498500 cases .append (outcome )
499501
500502 # Check .attempted for crashed tests (attempted but no output)
0 commit comments