@@ -86,20 +86,45 @@ def execute(self, test, litConfig):
86
86
if timeoutInfo :
87
87
return lit .Test .TIMEOUT , output
88
88
89
- # Parse the dotest output from stderr.
90
- result_regex = r"\((\d+) passes, (\d+) failures, (\d+) errors, (\d+) skipped, (\d+) expected failures, (\d+) unexpected successes\)"
91
- results = re .search (result_regex , err )
89
+ # Parse the dotest output from stderr. First get the # of total tests, in order to infer the # of passes.
90
+ # Example: "Ran 5 tests in 0.042s"
91
+ num_ran_regex = r"^Ran (\d+) tests? in "
92
+ num_ran_results = re .search (num_ran_regex , err , re .MULTILINE )
93
+
94
+ # If parsing fails mark this test as unresolved.
95
+ if not num_ran_results :
96
+ return lit .Test .UNRESOLVED , output
97
+ num_ran = int (num_ran_results .group (1 ))
98
+
99
+ # Then look for a detailed summary, which is OK or FAILED followed by optional details.
100
+ # Example: "OK (skipped=1, expected failures=1)"
101
+ # Example: "FAILED (failures=3)"
102
+ # Example: "OK"
103
+ result_regex = r"^(?:OK|FAILED)(?: \((.*)\))?$"
104
+ results = re .search (result_regex , err , re .MULTILINE )
92
105
93
106
# If parsing fails mark this test as unresolved.
94
107
if not results :
95
108
return lit .Test .UNRESOLVED , output
96
109
97
- passes = int (results .group (1 ))
98
- failures = int (results .group (2 ))
99
- errors = int (results .group (3 ))
100
- skipped = int (results .group (4 ))
101
- expected_failures = int (results .group (5 ))
102
- unexpected_successes = int (results .group (6 ))
110
+ details = results .group (1 )
111
+ parsed_details = {}
112
+ if details :
113
+ for detail in details .split (", " ):
114
+ detail_parts = detail .split ("=" )
115
+ if len (detail_parts ) != 2 :
116
+ return lit .Test .UNRESOLVED , output
117
+ parsed_details [detail_parts [0 ]] = int (detail_parts [1 ])
118
+
119
+ failures = parsed_details .get ("failures" , 0 )
120
+ errors = parsed_details .get ("errors" , 0 )
121
+ skipped = parsed_details .get ("skipped" , 0 )
122
+ expected_failures = parsed_details .get ("expected failures" , 0 )
123
+ unexpected_successes = parsed_details .get ("unexpected successes" , 0 )
124
+ non_pass = (
125
+ failures + errors + skipped + expected_failures + unexpected_successes
126
+ )
127
+ passes = num_ran - non_pass
103
128
104
129
if exitCode :
105
130
# Mark this test as FAIL if at least one test failed.
0 commit comments