Skip to content

Commit 5354a57

Browse files
committed
Parse test runner output for lit integration
1 parent 11eaf8f commit 5354a57

File tree

1 file changed

+34
-9
lines changed

1 file changed

+34
-9
lines changed

lldb/test/API/lldbtest.py

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,20 +86,45 @@ def execute(self, test, litConfig):
8686
if timeoutInfo:
8787
return lit.Test.TIMEOUT, output
8888

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)
92105

93106
# If parsing fails mark this test as unresolved.
94107
if not results:
95108
return lit.Test.UNRESOLVED, output
96109

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
103128

104129
if exitCode:
105130
# Mark this test as FAIL if at least one test failed.

0 commit comments

Comments
 (0)