[llvm] [lit] Add --wtt-output option to report results in WTT (.wtl) format (PR #211066)
Yasser Khan via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 28 19:52:54 PDT 2026
https://github.com/yassermkhan updated https://github.com/llvm/llvm-project/pull/211066
>From a571c77b9599887890fa792664408b64d6d9ab90 Mon Sep 17 00:00:00 2001
From: yakha <yakha at microsoft.com>
Date: Tue, 21 Jul 2026 13:21:46 -0400
Subject: [PATCH 1/6] [lit] Add --wtt-log option to report results in WTT
(.wtl) format
Adds a WttReport reporter and a --wtt-log <file> option that writes a WTT
(Windows Test Technology) .wtl log. This lets lit report test specific
pass/fail results in a format consumable by Windows lab infrastructure.
The reporter follows the existing pattern in reports.py (ResultDBReport,
XunitReport, TimeTraceReport) and is wired through cl_arguments.py like the
other output options. PASS/XFAIL map to Pass and everything else to Fail.
UNSUPPORTED tests are reported as Pass with a summary of skipped tests.
---
llvm/utils/lit/lit/cl_arguments.py | 6 ++
llvm/utils/lit/lit/reports.py | 138 +++++++++++++++++++++++++++++
2 files changed, 144 insertions(+)
diff --git a/llvm/utils/lit/lit/cl_arguments.py b/llvm/utils/lit/lit/cl_arguments.py
index 6225ac57abfd0..85d6e594b0d7f 100644
--- a/llvm/utils/lit/lit/cl_arguments.py
+++ b/llvm/utils/lit/lit/cl_arguments.py
@@ -320,6 +320,11 @@ def parse_args():
type=lit.reports.TimeTraceReport,
help="Write Chrome tracing compatible JSON to the specified file",
)
+ execution_group.add_argument(
+ "--wtt-log",
+ type=lit.reports.WttReport,
+ help="Write a WTT (.wtl) log file for Windows test infrastructure consumption",
+ )
# This option only exists for the benefit of LLVM's Buildkite CI pipelines.
# As soon as it is not needed, it should be removed. Its help text would be:
# When enabled, lit will add a unique element to the output file name,
@@ -541,6 +546,7 @@ def parse_args():
opts.xunit_xml_output,
opts.resultdb_output,
opts.time_trace_output,
+ opts.wtt_log,
],
)
)
diff --git a/llvm/utils/lit/lit/reports.py b/llvm/utils/lit/lit/reports.py
index 39398012d941d..df0e255e8d79a 100755
--- a/llvm/utils/lit/lit/reports.py
+++ b/llvm/utils/lit/lit/reports.py
@@ -302,3 +302,141 @@ def _get_test_event(self, test, first_start_time):
"dur": int(elapsed_time * 1000000.0),
"name": test_name,
}
+
+
+def _wtt_attr(text):
+ # Prepare text for a WTT XML attribute value: flatten newlines/tabs to
+ # spaces (raw newlines are illegal in XML attributes), drop invalid XML
+ # chars using the shared helper, then quote. quoteattr adds the quotes.
+ text = (
+ text.replace("\r\n", " ")
+ .replace("\n", " ")
+ .replace("\r", " ")
+ .replace("\t", " ")
+ )
+ return quo(remove_invalid_xml_chars(text))
+
+
+class WttReport(Report):
+
+ def write_results(self, tests, elapsed):
+ with open(self.output_file, "w", encoding="utf-16") as f:
+ self._write_results_to_file(tests, elapsed, f)
+
+ def _write_results_to_file(self, tests, elapsed, file):
+ machine = os.getenv("COMPUTERNAME", "")
+ pid = os.getpid()
+
+ starts = [t.result.start for t in tests if t.result and t.result.start]
+ base = min(starts) if starts else 0.0
+ base_dt = datetime.datetime.fromtimestamp(base)
+ base_time = "%d:%d:%d %d:%d:%d:%d" % (
+ base_dt.year, base_dt.month, base_dt.day,
+ base_dt.hour, base_dt.minute, base_dt.second,
+ base_dt.microsecond // 1000,
+ )
+
+ def times(test):
+ elapsed_time = test.result.elapsed or 0.0
+ start_time = test.result.start - base if test.result.start else 0.0
+ return int(start_time), int(start_time + elapsed_time)
+
+ root_ctx = 1
+ end_ticks = int(elapsed)
+
+ def rc(ref_ctx):
+ return '\t<rti id="" />\n\t<ctx id="%s" />\n' % ref_ctx
+
+ file.write('<?xml version="1.0" encoding="utf-16"?>\n')
+ file.write("<WTT-Logger>\n")
+
+ file.write(
+ '<RTI ID="" Machine="%s" ProcessName="lit" '
+ 'ProcessID="%d" ThreadID="0" '
+ 'BaseTime="%s" Frequency="1" />\n' % (machine, pid, base_time)
+ )
+ file.write('<CTX ID="%d" Current="WTTLOG" Parent="ROOT" />\n' % root_ctx)
+
+ passed = 0
+ failed = 0
+ unsupported = 0
+ excluded = 0
+ skipped = 0
+
+ for test in tests:
+ if test.result is None:
+ continue
+
+ code = test.result.code
+ name = test.getFullName()
+ ca, la = times(test)
+
+ # UNSUPPORTED: report as Pass (feature not applicable on this device).
+ if code == lit.Test.UNSUPPORTED:
+ file.write('<CTX ID="" Current=%s Parent="WTTLOG" />\n' % _wtt_attr(name))
+ file.write('<StartTest Title=%s TUID="" CA="%d" LA="%d">\n%s</StartTest>\n'
+ % (_wtt_attr(name), ca, ca, rc("")))
+ file.write('<Msg UserText=%s CA="%d" LA="%d">\n%s</Msg>\n'
+ % (_wtt_attr("UNSUPPORTED on this device; reported as Pass (not applicable)."), la, la, rc("")))
+ file.write('<EndTest Title=%s TUID="" Result="Pass" Repro="" CA="%d" LA="%d">\n%s</EndTest>\n'
+ % (_wtt_attr(name), la, la, rc("")))
+ unsupported += 1
+ continue
+
+ # EXCLUDED / SKIPPED: omitted from the log and from pass/fail results.
+ if code == lit.Test.EXCLUDED:
+ excluded += 1
+ continue
+ if code == lit.Test.SKIPPED:
+ skipped += 1
+ continue
+
+ if code in (lit.Test.PASS, lit.Test.XFAIL):
+ result = "Pass"
+ passed += 1
+ else:
+ result = "Fail"
+ failed += 1
+
+ file.write('<CTX ID="" Current=%s Parent="WTTLOG" />\n' % _wtt_attr(name))
+ file.write('<StartTest Title=%s TUID="" CA="%d" LA="%d">\n%s</StartTest>\n'
+ % (_wtt_attr(name), ca, ca, rc("")))
+
+ # Write error output for failures (WTT uses <Error>, not <Err>).
+ if result == "Fail" and test.result.output:
+ file.write('<Error UserText=%s CA="%d" LA="%d">\n%s</Error>\n'
+ % (_wtt_attr(test.result.output[:4096]), la, la, rc("")))
+
+ if result == "Pass" and test.result.output:
+ file.write('<Msg UserText=%s CA="%d" LA="%d">\n%s</Msg>\n'
+ % (_wtt_attr(test.result.output[:1024]), la, la, rc("")))
+
+ file.write('<EndTest Title=%s TUID="" Result="%s" Repro="" CA="%d" LA="%d">\n%s</EndTest>\n'
+ % (_wtt_attr(name), result, la, la, rc("")))
+
+ # Tally of UNSUPPORTED tests reported as Pass.
+ if unsupported > 0:
+ file.write('<Msg UserText=%s CA="%d" LA="%d">\n%s</Msg>\n'
+ % (_wtt_attr(
+ "%d test(s) were UNSUPPORTED on this device and reported as "
+ "Pass (not applicable)." % unsupported), end_ticks, end_ticks, rc(root_ctx)))
+
+ # Tally of tests omitted from results.
+ not_run = excluded + skipped
+ if not_run > 0:
+ parts = []
+ if excluded:
+ parts.append("%d excluded" % excluded)
+ if skipped:
+ parts.append("%d skipped" % skipped)
+ file.write('<Msg UserText=%s CA="%d" LA="%d">\n%s</Msg>\n'
+ % (_wtt_attr(
+ "%d test(s) were not run (%s) and are omitted from the "
+ "pass/fail results." % (not_run, ", ".join(parts))), end_ticks, end_ticks, rc(root_ctx)))
+
+ total = passed + failed + unsupported
+ file.write(
+ '<PFRollup Total="%d" Passed="%d" Failed="%d" '
+ 'Blocked="0" Warned="0" Skipped="0" CA="%d" LA="%d">\n%s</PFRollup>\n'
+ % (total, passed + unsupported, failed, end_ticks, end_ticks, rc(root_ctx)))
+ file.write("</WTT-Logger>\n")
>From 81e6a05328bb6a8a263e6e617f35dfb9bc37954e Mon Sep 17 00:00:00 2001
From: yakha <yakha at microsoft.com>
Date: Tue, 21 Jul 2026 13:37:36 -0400
Subject: [PATCH 2/6] Change --wtt-log to --wtt-output to match the RFC
---
llvm/utils/lit/lit/cl_arguments.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/utils/lit/lit/cl_arguments.py b/llvm/utils/lit/lit/cl_arguments.py
index 85d6e594b0d7f..d035d34453ee6 100644
--- a/llvm/utils/lit/lit/cl_arguments.py
+++ b/llvm/utils/lit/lit/cl_arguments.py
@@ -321,7 +321,7 @@ def parse_args():
help="Write Chrome tracing compatible JSON to the specified file",
)
execution_group.add_argument(
- "--wtt-log",
+ "--wtt-output",
type=lit.reports.WttReport,
help="Write a WTT (.wtl) log file for Windows test infrastructure consumption",
)
@@ -546,7 +546,7 @@ def parse_args():
opts.xunit_xml_output,
opts.resultdb_output,
opts.time_trace_output,
- opts.wtt_log,
+ opts.wtt_output,
],
)
)
>From 7980180ff35365c91be63d8b3e9f084ada72fe61 Mon Sep 17 00:00:00 2001
From: yakha <yakha at microsoft.com>
Date: Mon, 27 Jul 2026 15:05:42 -0400
Subject: [PATCH 3/6] [lit] Use f-strings and clearer names in the WTT reporter
---
llvm/utils/lit/lit/reports.py | 66 ++++++++++++++++-------------------
1 file changed, 31 insertions(+), 35 deletions(-)
diff --git a/llvm/utils/lit/lit/reports.py b/llvm/utils/lit/lit/reports.py
index df0e255e8d79a..b13bcd0c74c71 100755
--- a/llvm/utils/lit/lit/reports.py
+++ b/llvm/utils/lit/lit/reports.py
@@ -345,17 +345,17 @@ def times(test):
end_ticks = int(elapsed)
def rc(ref_ctx):
- return '\t<rti id="" />\n\t<ctx id="%s" />\n' % ref_ctx
+ return f'\t<rti id="" />\n\t<ctx id="{ref_ctx}" />\n'
file.write('<?xml version="1.0" encoding="utf-16"?>\n')
file.write("<WTT-Logger>\n")
file.write(
- '<RTI ID="" Machine="%s" ProcessName="lit" '
- 'ProcessID="%d" ThreadID="0" '
- 'BaseTime="%s" Frequency="1" />\n' % (machine, pid, base_time)
+ f'<RTI ID="" Machine="{machine}" ProcessName="lit" '
+ f'ProcessID="{pid}" ThreadID="0" '
+ f'BaseTime="{base_time}" Frequency="1" />\n'
)
- file.write('<CTX ID="%d" Current="WTTLOG" Parent="ROOT" />\n' % root_ctx)
+ file.write(f'<CTX ID="{root_ctx}" Current="WTTLOG" Parent="ROOT" />\n')
passed = 0
failed = 0
@@ -369,17 +369,15 @@ def rc(ref_ctx):
code = test.result.code
name = test.getFullName()
- ca, la = times(test)
+ created_at, logged_at = times(test)
# UNSUPPORTED: report as Pass (feature not applicable on this device).
if code == lit.Test.UNSUPPORTED:
- file.write('<CTX ID="" Current=%s Parent="WTTLOG" />\n' % _wtt_attr(name))
- file.write('<StartTest Title=%s TUID="" CA="%d" LA="%d">\n%s</StartTest>\n'
- % (_wtt_attr(name), ca, ca, rc("")))
- file.write('<Msg UserText=%s CA="%d" LA="%d">\n%s</Msg>\n'
- % (_wtt_attr("UNSUPPORTED on this device; reported as Pass (not applicable)."), la, la, rc("")))
- file.write('<EndTest Title=%s TUID="" Result="Pass" Repro="" CA="%d" LA="%d">\n%s</EndTest>\n'
- % (_wtt_attr(name), la, la, rc("")))
+ file.write(f'<CTX ID="" Current={_wtt_attr(name)} Parent="WTTLOG" />\n')
+ file.write(f'<StartTest Title={_wtt_attr(name)} TUID="" CA="{created_at}" LA="{created_at}">\n{rc("")}</StartTest>\n')
+ unsupported_msg = _wtt_attr("UNSUPPORTED on this device; reported as Pass (not applicable).")
+ file.write(f'<Msg UserText={unsupported_msg} CA="{logged_at}" LA="{logged_at}">\n{rc("")}</Msg>\n')
+ file.write(f'<EndTest Title={_wtt_attr(name)} TUID="" Result="Pass" Repro="" CA="{logged_at}" LA="{logged_at}">\n{rc("")}</EndTest>\n')
unsupported += 1
continue
@@ -398,45 +396,43 @@ def rc(ref_ctx):
result = "Fail"
failed += 1
- file.write('<CTX ID="" Current=%s Parent="WTTLOG" />\n' % _wtt_attr(name))
- file.write('<StartTest Title=%s TUID="" CA="%d" LA="%d">\n%s</StartTest>\n'
- % (_wtt_attr(name), ca, ca, rc("")))
+ file.write(f'<CTX ID="" Current={_wtt_attr(name)} Parent="WTTLOG" />\n')
+ file.write(f'<StartTest Title={_wtt_attr(name)} TUID="" CA="{created_at}" LA="{created_at}">\n{rc("")}</StartTest>\n')
# Write error output for failures (WTT uses <Error>, not <Err>).
if result == "Fail" and test.result.output:
- file.write('<Error UserText=%s CA="%d" LA="%d">\n%s</Error>\n'
- % (_wtt_attr(test.result.output[:4096]), la, la, rc("")))
+ error_text = _wtt_attr(test.result.output[:4096])
+ file.write(f'<Error UserText={error_text} CA="{logged_at}" LA="{logged_at}">\n{rc("")}</Error>\n')
if result == "Pass" and test.result.output:
- file.write('<Msg UserText=%s CA="%d" LA="%d">\n%s</Msg>\n'
- % (_wtt_attr(test.result.output[:1024]), la, la, rc("")))
+ pass_text = _wtt_attr(test.result.output[:1024])
+ file.write(f'<Msg UserText={pass_text} CA="{logged_at}" LA="{logged_at}">\n{rc("")}</Msg>\n')
- file.write('<EndTest Title=%s TUID="" Result="%s" Repro="" CA="%d" LA="%d">\n%s</EndTest>\n'
- % (_wtt_attr(name), result, la, la, rc("")))
+ file.write(f'<EndTest Title={_wtt_attr(name)} TUID="" Result="{result}" Repro="" CA="{logged_at}" LA="{logged_at}">\n{rc("")}</EndTest>\n')
# Tally of UNSUPPORTED tests reported as Pass.
if unsupported > 0:
- file.write('<Msg UserText=%s CA="%d" LA="%d">\n%s</Msg>\n'
- % (_wtt_attr(
- "%d test(s) were UNSUPPORTED on this device and reported as "
- "Pass (not applicable)." % unsupported), end_ticks, end_ticks, rc(root_ctx)))
+ tally = _wtt_attr(
+ f"{unsupported} test(s) were UNSUPPORTED on this device and "
+ f"reported as Pass (not applicable).")
+ file.write(f'<Msg UserText={tally} CA="{end_ticks}" LA="{end_ticks}">\n{rc(root_ctx)}</Msg>\n')
# Tally of tests omitted from results.
not_run = excluded + skipped
if not_run > 0:
parts = []
if excluded:
- parts.append("%d excluded" % excluded)
+ parts.append(f"{excluded} excluded")
if skipped:
- parts.append("%d skipped" % skipped)
- file.write('<Msg UserText=%s CA="%d" LA="%d">\n%s</Msg>\n'
- % (_wtt_attr(
- "%d test(s) were not run (%s) and are omitted from the "
- "pass/fail results." % (not_run, ", ".join(parts))), end_ticks, end_ticks, rc(root_ctx)))
+ parts.append(f"{skipped} skipped")
+ tally = _wtt_attr(
+ f"{not_run} test(s) were not run ({', '.join(parts)}) and are "
+ f"omitted from the pass/fail results.")
+ file.write(f'<Msg UserText={tally} CA="{end_ticks}" LA="{end_ticks}">\n{rc(root_ctx)}</Msg>\n')
total = passed + failed + unsupported
file.write(
- '<PFRollup Total="%d" Passed="%d" Failed="%d" '
- 'Blocked="0" Warned="0" Skipped="0" CA="%d" LA="%d">\n%s</PFRollup>\n'
- % (total, passed + unsupported, failed, end_ticks, end_ticks, rc(root_ctx)))
+ f'<PFRollup Total="{total}" Passed="{passed + unsupported}" Failed="{failed}" '
+ f'Blocked="0" Warned="0" Skipped="0" CA="{end_ticks}" LA="{end_ticks}">\n'
+ f'{rc(root_ctx)}</PFRollup>\n')
file.write("</WTT-Logger>\n")
>From a97270763178a0ee17676473d1ea94b7bb5199f9 Mon Sep 17 00:00:00 2001
From: yakha <yakha at microsoft.com>
Date: Mon, 27 Jul 2026 15:05:43 -0400
Subject: [PATCH 4/6] [lit] Add a test for the --wtt-output reporter
---
.../tests/Inputs/wtt-output/dummy_format.py | 39 ++++++++++++
.../lit/tests/Inputs/wtt-output/excluded.ini | 5 ++
.../lit/tests/Inputs/wtt-output/fail.ini | 5 ++
.../utils/lit/tests/Inputs/wtt-output/lit.cfg | 11 ++++
.../Inputs/wtt-output/missing_feature.ini | 7 +++
.../Inputs/wtt-output/multiline_fail.ini | 6 ++
.../lit/tests/Inputs/wtt-output/pass.ini | 5 ++
.../Inputs/wtt-output/pass_with_output.ini | 5 ++
.../tests/Inputs/wtt-output/unsupported.ini | 5 ++
.../lit/tests/Inputs/wtt-output/xfail.ini | 5 ++
llvm/utils/lit/tests/test-output-wtt.py | 59 +++++++++++++++++++
11 files changed, 152 insertions(+)
create mode 100644 llvm/utils/lit/tests/Inputs/wtt-output/dummy_format.py
create mode 100644 llvm/utils/lit/tests/Inputs/wtt-output/excluded.ini
create mode 100644 llvm/utils/lit/tests/Inputs/wtt-output/fail.ini
create mode 100644 llvm/utils/lit/tests/Inputs/wtt-output/lit.cfg
create mode 100644 llvm/utils/lit/tests/Inputs/wtt-output/missing_feature.ini
create mode 100644 llvm/utils/lit/tests/Inputs/wtt-output/multiline_fail.ini
create mode 100644 llvm/utils/lit/tests/Inputs/wtt-output/pass.ini
create mode 100644 llvm/utils/lit/tests/Inputs/wtt-output/pass_with_output.ini
create mode 100644 llvm/utils/lit/tests/Inputs/wtt-output/unsupported.ini
create mode 100644 llvm/utils/lit/tests/Inputs/wtt-output/xfail.ini
create mode 100644 llvm/utils/lit/tests/test-output-wtt.py
diff --git a/llvm/utils/lit/tests/Inputs/wtt-output/dummy_format.py b/llvm/utils/lit/tests/Inputs/wtt-output/dummy_format.py
new file mode 100644
index 0000000000000..43da0973df614
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/wtt-output/dummy_format.py
@@ -0,0 +1,39 @@
+import os
+import configparser
+
+import lit.formats
+import lit.Test
+
+
+class DummyFormat(lit.formats.FileBasedTest):
+ def execute(self, test, lit_config):
+ # In this dummy format, expect that each test file is actually just a
+ # .ini format dump of the results to report.
+
+ source_path = test.getSourcePath()
+
+ cfg = configparser.ConfigParser()
+ cfg.read(source_path)
+
+ # Create the basic test result.
+ result_code = cfg.get("global", "result_code")
+ result_output = cfg.get("global", "result_output")
+ result = lit.Test.Result(getattr(lit.Test, result_code), result_output)
+
+ if cfg.has_option("global", "required_feature"):
+ required_feature = cfg.get("global", "required_feature")
+ if required_feature:
+ test.requires.append(required_feature)
+
+ # Load additional metrics.
+ for key, value_str in cfg.items("results"):
+ value = eval(value_str)
+ if isinstance(value, int):
+ metric = lit.Test.IntMetricValue(value)
+ elif isinstance(value, float):
+ metric = lit.Test.RealMetricValue(value)
+ else:
+ raise RuntimeError("unsupported result type")
+ result.addMetric(key, metric)
+
+ return result
diff --git a/llvm/utils/lit/tests/Inputs/wtt-output/excluded.ini b/llvm/utils/lit/tests/Inputs/wtt-output/excluded.ini
new file mode 100644
index 0000000000000..f62ede446872a
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/wtt-output/excluded.ini
@@ -0,0 +1,5 @@
+[global]
+result_code = EXCLUDED
+result_output = not shown
+
+[results]
diff --git a/llvm/utils/lit/tests/Inputs/wtt-output/fail.ini b/llvm/utils/lit/tests/Inputs/wtt-output/fail.ini
new file mode 100644
index 0000000000000..0a92119f654fa
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/wtt-output/fail.ini
@@ -0,0 +1,5 @@
+[global]
+result_code = FAIL
+result_output = test failed
+
+[results]
diff --git a/llvm/utils/lit/tests/Inputs/wtt-output/lit.cfg b/llvm/utils/lit/tests/Inputs/wtt-output/lit.cfg
new file mode 100644
index 0000000000000..a2a65a115f81a
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/wtt-output/lit.cfg
@@ -0,0 +1,11 @@
+import site
+
+site.addsitedir(os.path.dirname(__file__))
+import dummy_format
+
+config.name = "wtt-data"
+config.suffixes = [".ini"]
+config.test_format = dummy_format.DummyFormat()
+config.test_source_root = None
+config.test_exec_root = None
+config.target_triple = None
diff --git a/llvm/utils/lit/tests/Inputs/wtt-output/missing_feature.ini b/llvm/utils/lit/tests/Inputs/wtt-output/missing_feature.ini
new file mode 100644
index 0000000000000..09fb2a132929f
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/wtt-output/missing_feature.ini
@@ -0,0 +1,7 @@
+[global]
+result_code = UNSUPPORTED
+result_output = not shown
+
+required_feature = dummy_feature
+
+[results]
diff --git a/llvm/utils/lit/tests/Inputs/wtt-output/multiline_fail.ini b/llvm/utils/lit/tests/Inputs/wtt-output/multiline_fail.ini
new file mode 100644
index 0000000000000..a5264cd40288c
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/wtt-output/multiline_fail.ini
@@ -0,0 +1,6 @@
+[global]
+result_code = FAIL
+result_output = first line
+ second "line" & <tag> ]]>
+
+[results]
diff --git a/llvm/utils/lit/tests/Inputs/wtt-output/pass.ini b/llvm/utils/lit/tests/Inputs/wtt-output/pass.ini
new file mode 100644
index 0000000000000..c1e2241526398
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/wtt-output/pass.ini
@@ -0,0 +1,5 @@
+[global]
+result_code = PASS
+result_output = not shown
+
+[results]
diff --git a/llvm/utils/lit/tests/Inputs/wtt-output/pass_with_output.ini b/llvm/utils/lit/tests/Inputs/wtt-output/pass_with_output.ini
new file mode 100644
index 0000000000000..b70b168441bf3
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/wtt-output/pass_with_output.ini
@@ -0,0 +1,5 @@
+[global]
+result_code = PASS
+result_output = ran ok
+
+[results]
diff --git a/llvm/utils/lit/tests/Inputs/wtt-output/unsupported.ini b/llvm/utils/lit/tests/Inputs/wtt-output/unsupported.ini
new file mode 100644
index 0000000000000..0d567b35a0a4b
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/wtt-output/unsupported.ini
@@ -0,0 +1,5 @@
+[global]
+result_code = UNSUPPORTED
+result_output = not shown
+
+[results]
diff --git a/llvm/utils/lit/tests/Inputs/wtt-output/xfail.ini b/llvm/utils/lit/tests/Inputs/wtt-output/xfail.ini
new file mode 100644
index 0000000000000..3ca7fa60f1f0c
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/wtt-output/xfail.ini
@@ -0,0 +1,5 @@
+[global]
+result_code = XFAIL
+result_output = expected fail
+
+[results]
diff --git a/llvm/utils/lit/tests/test-output-wtt.py b/llvm/utils/lit/tests/test-output-wtt.py
new file mode 100644
index 0000000000000..2b2ccc0545228
--- /dev/null
+++ b/llvm/utils/lit/tests/test-output-wtt.py
@@ -0,0 +1,59 @@
+# Test the WTT (.wtl) reporter (--wtt-output).
+#
+
+# RUN: rm -f %t.wtl
+# RUN: not %{lit} --wtt-output %t.wtl %{inputs}/wtt-output
+
+# WttReport writes UTF-16; decode to UTF-8 so FileCheck can read it.
+# RUN: %{python} -c "import io,sys; sys.stdout.write(io.open(r'%t.wtl', encoding='utf-16').read())" | FileCheck %s --implicit-check-not="<Err " --implicit-check-not="wtt-data :: excluded.ini"
+
+# The .wtl must be well-formed XML (HLK/WTT Studio must be able to open it).
+# RUN: %{python} -c "import xml.dom.minidom as m; m.parse(r'%t.wtl')"
+
+# Every StartTest must have a matching EndTest (HLK rejects unbalanced logs).
+# RUN: %{python} -c "import io; t=io.open(r'%t.wtl',encoding='utf-16').read(); assert t.count('<StartTest')==t.count('<EndTest'), 'unbalanced StartTest/EndTest'"
+
+# The file must be UTF-16 (HLK expects UTF-16 encoding).
+# RUN: %{python} -c "assert open(r'%t.wtl','rb').read(2)==b'\xff\xfe', 'missing UTF-16 BOM'"
+
+# CHECK: <?xml version="1.0" encoding="utf-16"?>
+# CHECK-NEXT: <WTT-Logger>
+# CHECK-NEXT: <RTI ID="" Machine=
+# CHECK: <CTX ID="{{[0-9]+}}" Current="WTTLOG" Parent="ROOT" />
+
+# A failing test: per-test context is bound (this is what HLK uses to attribute
+# results; without it every test shows up as "Unknown"). Failures use <Error>
+# (not <Err>) and map to Result="Fail".
+# CHECK: <CTX ID="" Current="wtt-data :: fail.ini" Parent="WTTLOG" />
+# CHECK-NEXT: <StartTest Title="wtt-data :: fail.ini" TUID="" CA="0" LA="0">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK: <Error UserText="test failed"
+# CHECK: <EndTest Title="wtt-data :: fail.ini" TUID="" Result="Fail"
+
+# UNSUPPORTED (via a missing required feature) is reported as Pass.
+# CHECK: <EndTest Title="wtt-data :: missing_feature.ini" TUID="" Result="Pass"
+
+# Failure output is sanitized: the newline is flattened to a space and the XML
+# metacharacters are escaped so the attribute stays well-formed.
+# CHECK: <Error UserText='first line second "line" & <tag>
+# CHECK: <EndTest Title="wtt-data :: multiline_fail.ini" TUID="" Result="Fail"
+
+# Passing tests emit their output as a <Msg>.
+# CHECK: <Msg UserText="not shown"
+# CHECK: <EndTest Title="wtt-data :: pass.ini" TUID="" Result="Pass"
+# CHECK: <Msg UserText="ran ok"
+# CHECK: <EndTest Title="wtt-data :: pass_with_output.ini" TUID="" Result="Pass"
+
+# UNSUPPORTED (explicit) is reported as Pass.
+# CHECK: <EndTest Title="wtt-data :: unsupported.ini" TUID="" Result="Pass"
+
+# XFAIL is reported as Pass (WTT has no expected-failure concept).
+# CHECK: <EndTest Title="wtt-data :: xfail.ini" TUID="" Result="Pass"
+
+# Trailing tallies and rollup. UNSUPPORTED tests fold into Passed; EXCLUDED
+# tests are omitted from the log and from Total.
+# CHECK: 2 test(s) were UNSUPPORTED on this device and reported as Pass
+# CHECK: 1 test(s) were not run (1 excluded) and are omitted
+# CHECK: <PFRollup Total="7" Passed="5" Failed="2" Blocked="0" Warned="0" Skipped="0"
+# CHECK: </WTT-Logger>
>From f00188bd23b81e9331a71c2ff8d91452b99cc495 Mon Sep 17 00:00:00 2001
From: yakha <yakha at microsoft.com>
Date: Tue, 28 Jul 2026 11:54:15 -0400
Subject: [PATCH 5/6] [lit] Format WttReport with black
---
llvm/utils/lit/lit/reports.py | 58 +++++++++++++++++++++++++----------
1 file changed, 42 insertions(+), 16 deletions(-)
diff --git a/llvm/utils/lit/lit/reports.py b/llvm/utils/lit/lit/reports.py
index 02b4fe230f8f0..a0ff2e5be7969 100755
--- a/llvm/utils/lit/lit/reports.py
+++ b/llvm/utils/lit/lit/reports.py
@@ -318,7 +318,6 @@ def _wtt_attr(text):
class WttReport(Report):
-
def write_results(self, tests, elapsed):
with open(self.output_file, "w", encoding="utf-16") as f:
self._write_results_to_file(tests, elapsed, f)
@@ -331,8 +330,12 @@ def _write_results_to_file(self, tests, elapsed, file):
base = min(starts) if starts else 0.0
base_dt = datetime.datetime.fromtimestamp(base)
base_time = "%d:%d:%d %d:%d:%d:%d" % (
- base_dt.year, base_dt.month, base_dt.day,
- base_dt.hour, base_dt.minute, base_dt.second,
+ base_dt.year,
+ base_dt.month,
+ base_dt.day,
+ base_dt.hour,
+ base_dt.minute,
+ base_dt.second,
base_dt.microsecond // 1000,
)
@@ -374,10 +377,18 @@ def rc(ref_ctx):
# UNSUPPORTED: report as Pass (feature not applicable on this device).
if code == lit.Test.UNSUPPORTED:
file.write(f'<CTX ID="" Current={_wtt_attr(name)} Parent="WTTLOG" />\n')
- file.write(f'<StartTest Title={_wtt_attr(name)} TUID="" CA="{created_at}" LA="{created_at}">\n{rc("")}</StartTest>\n')
- unsupported_msg = _wtt_attr("UNSUPPORTED on this device; reported as Pass (not applicable).")
- file.write(f'<Msg UserText={unsupported_msg} CA="{logged_at}" LA="{logged_at}">\n{rc("")}</Msg>\n')
- file.write(f'<EndTest Title={_wtt_attr(name)} TUID="" Result="Pass" Repro="" CA="{logged_at}" LA="{logged_at}">\n{rc("")}</EndTest>\n')
+ file.write(
+ f'<StartTest Title={_wtt_attr(name)} TUID="" CA="{created_at}" LA="{created_at}">\n{rc("")}</StartTest>\n'
+ )
+ unsupported_msg = _wtt_attr(
+ "UNSUPPORTED on this device; reported as Pass (not applicable)."
+ )
+ file.write(
+ f'<Msg UserText={unsupported_msg} CA="{logged_at}" LA="{logged_at}">\n{rc("")}</Msg>\n'
+ )
+ file.write(
+ f'<EndTest Title={_wtt_attr(name)} TUID="" Result="Pass" Repro="" CA="{logged_at}" LA="{logged_at}">\n{rc("")}</EndTest>\n'
+ )
unsupported += 1
continue
@@ -397,25 +408,36 @@ def rc(ref_ctx):
failed += 1
file.write(f'<CTX ID="" Current={_wtt_attr(name)} Parent="WTTLOG" />\n')
- file.write(f'<StartTest Title={_wtt_attr(name)} TUID="" CA="{created_at}" LA="{created_at}">\n{rc("")}</StartTest>\n')
+ file.write(
+ f'<StartTest Title={_wtt_attr(name)} TUID="" CA="{created_at}" LA="{created_at}">\n{rc("")}</StartTest>\n'
+ )
# Write error output for failures (WTT uses <Error>, not <Err>).
if result == "Fail" and test.result.output:
error_text = _wtt_attr(test.result.output[:4096])
- file.write(f'<Error UserText={error_text} CA="{logged_at}" LA="{logged_at}">\n{rc("")}</Error>\n')
+ file.write(
+ f'<Error UserText={error_text} CA="{logged_at}" LA="{logged_at}">\n{rc("")}</Error>\n'
+ )
if result == "Pass" and test.result.output:
pass_text = _wtt_attr(test.result.output[:1024])
- file.write(f'<Msg UserText={pass_text} CA="{logged_at}" LA="{logged_at}">\n{rc("")}</Msg>\n')
+ file.write(
+ f'<Msg UserText={pass_text} CA="{logged_at}" LA="{logged_at}">\n{rc("")}</Msg>\n'
+ )
- file.write(f'<EndTest Title={_wtt_attr(name)} TUID="" Result="{result}" Repro="" CA="{logged_at}" LA="{logged_at}">\n{rc("")}</EndTest>\n')
+ file.write(
+ f'<EndTest Title={_wtt_attr(name)} TUID="" Result="{result}" Repro="" CA="{logged_at}" LA="{logged_at}">\n{rc("")}</EndTest>\n'
+ )
# Tally of UNSUPPORTED tests reported as Pass.
if unsupported > 0:
tally = _wtt_attr(
f"{unsupported} test(s) were UNSUPPORTED on this device and "
- f"reported as Pass (not applicable).")
- file.write(f'<Msg UserText={tally} CA="{end_ticks}" LA="{end_ticks}">\n{rc(root_ctx)}</Msg>\n')
+ f"reported as Pass (not applicable)."
+ )
+ file.write(
+ f'<Msg UserText={tally} CA="{end_ticks}" LA="{end_ticks}">\n{rc(root_ctx)}</Msg>\n'
+ )
# Tally of tests omitted from results.
not_run = excluded + skipped
@@ -427,12 +449,16 @@ def rc(ref_ctx):
parts.append(f"{skipped} skipped")
tally = _wtt_attr(
f"{not_run} test(s) were not run ({', '.join(parts)}) and are "
- f"omitted from the pass/fail results.")
- file.write(f'<Msg UserText={tally} CA="{end_ticks}" LA="{end_ticks}">\n{rc(root_ctx)}</Msg>\n')
+ f"omitted from the pass/fail results."
+ )
+ file.write(
+ f'<Msg UserText={tally} CA="{end_ticks}" LA="{end_ticks}">\n{rc(root_ctx)}</Msg>\n'
+ )
total = passed + failed + unsupported
file.write(
f'<PFRollup Total="{total}" Passed="{passed + unsupported}" Failed="{failed}" '
f'Blocked="0" Warned="0" Skipped="0" CA="{end_ticks}" LA="{end_ticks}">\n'
- f'{rc(root_ctx)}</PFRollup>\n')
+ f"{rc(root_ctx)}</PFRollup>\n"
+ )
file.write("</WTT-Logger>\n")
>From 2aff47c411b86d308fe07897d618b2a8295112bf Mon Sep 17 00:00:00 2001
From: yakha <yakha at microsoft.com>
Date: Tue, 28 Jul 2026 22:52:30 -0400
Subject: [PATCH 6/6] [lit] Assert the full WTT reporter output in its test
---
llvm/utils/lit/lit/reports.py | 2 +
llvm/utils/lit/tests/test-output-wtt.py | 183 ++++++++++++++++--------
2 files changed, 126 insertions(+), 59 deletions(-)
diff --git a/llvm/utils/lit/lit/reports.py b/llvm/utils/lit/lit/reports.py
index a0ff2e5be7969..c7bb220e7fa3f 100755
--- a/llvm/utils/lit/lit/reports.py
+++ b/llvm/utils/lit/lit/reports.py
@@ -323,6 +323,8 @@ def write_results(self, tests, elapsed):
self._write_results_to_file(tests, elapsed, f)
def _write_results_to_file(self, tests, elapsed, file):
+ tests.sort(key=by_suite_and_test_path)
+
machine = os.getenv("COMPUTERNAME", "")
pid = os.getpid()
diff --git a/llvm/utils/lit/tests/test-output-wtt.py b/llvm/utils/lit/tests/test-output-wtt.py
index 2b2ccc0545228..b28f40d8b1ba1 100644
--- a/llvm/utils/lit/tests/test-output-wtt.py
+++ b/llvm/utils/lit/tests/test-output-wtt.py
@@ -1,59 +1,124 @@
-# Test the WTT (.wtl) reporter (--wtt-output).
-#
-
-# RUN: rm -f %t.wtl
-# RUN: not %{lit} --wtt-output %t.wtl %{inputs}/wtt-output
-
-# WttReport writes UTF-16; decode to UTF-8 so FileCheck can read it.
-# RUN: %{python} -c "import io,sys; sys.stdout.write(io.open(r'%t.wtl', encoding='utf-16').read())" | FileCheck %s --implicit-check-not="<Err " --implicit-check-not="wtt-data :: excluded.ini"
-
-# The .wtl must be well-formed XML (HLK/WTT Studio must be able to open it).
-# RUN: %{python} -c "import xml.dom.minidom as m; m.parse(r'%t.wtl')"
-
-# Every StartTest must have a matching EndTest (HLK rejects unbalanced logs).
-# RUN: %{python} -c "import io; t=io.open(r'%t.wtl',encoding='utf-16').read(); assert t.count('<StartTest')==t.count('<EndTest'), 'unbalanced StartTest/EndTest'"
-
-# The file must be UTF-16 (HLK expects UTF-16 encoding).
-# RUN: %{python} -c "assert open(r'%t.wtl','rb').read(2)==b'\xff\xfe', 'missing UTF-16 BOM'"
-
-# CHECK: <?xml version="1.0" encoding="utf-16"?>
-# CHECK-NEXT: <WTT-Logger>
-# CHECK-NEXT: <RTI ID="" Machine=
-# CHECK: <CTX ID="{{[0-9]+}}" Current="WTTLOG" Parent="ROOT" />
-
-# A failing test: per-test context is bound (this is what HLK uses to attribute
-# results; without it every test shows up as "Unknown"). Failures use <Error>
-# (not <Err>) and map to Result="Fail".
-# CHECK: <CTX ID="" Current="wtt-data :: fail.ini" Parent="WTTLOG" />
-# CHECK-NEXT: <StartTest Title="wtt-data :: fail.ini" TUID="" CA="0" LA="0">
-# CHECK-NEXT: <rti id="" />
-# CHECK-NEXT: <ctx id="" />
-# CHECK: <Error UserText="test failed"
-# CHECK: <EndTest Title="wtt-data :: fail.ini" TUID="" Result="Fail"
-
-# UNSUPPORTED (via a missing required feature) is reported as Pass.
-# CHECK: <EndTest Title="wtt-data :: missing_feature.ini" TUID="" Result="Pass"
-
-# Failure output is sanitized: the newline is flattened to a space and the XML
-# metacharacters are escaped so the attribute stays well-formed.
-# CHECK: <Error UserText='first line second "line" & <tag>
-# CHECK: <EndTest Title="wtt-data :: multiline_fail.ini" TUID="" Result="Fail"
-
-# Passing tests emit their output as a <Msg>.
-# CHECK: <Msg UserText="not shown"
-# CHECK: <EndTest Title="wtt-data :: pass.ini" TUID="" Result="Pass"
-# CHECK: <Msg UserText="ran ok"
-# CHECK: <EndTest Title="wtt-data :: pass_with_output.ini" TUID="" Result="Pass"
-
-# UNSUPPORTED (explicit) is reported as Pass.
-# CHECK: <EndTest Title="wtt-data :: unsupported.ini" TUID="" Result="Pass"
-
-# XFAIL is reported as Pass (WTT has no expected-failure concept).
-# CHECK: <EndTest Title="wtt-data :: xfail.ini" TUID="" Result="Pass"
-
-# Trailing tallies and rollup. UNSUPPORTED tests fold into Passed; EXCLUDED
-# tests are omitted from the log and from Total.
-# CHECK: 2 test(s) were UNSUPPORTED on this device and reported as Pass
-# CHECK: 1 test(s) were not run (1 excluded) and are omitted
-# CHECK: <PFRollup Total="7" Passed="5" Failed="2" Blocked="0" Warned="0" Skipped="0"
-# CHECK: </WTT-Logger>
+# Test the WTT (.wtl) reporter (--wtt-output).
+#
+# The reporter writes UTF-16, which FileCheck cannot read directly, so
+# transcode the log to UTF-8 once and then assert the entire output. The
+# reporter emits tests in a stable (suite, path) order, so the log is
+# deterministic.
+
+# RUN: rm -f %t.wtl %t.wtl.utf8
+# RUN: not %{lit} --wtt-output %t.wtl %{inputs}/wtt-output
+# RUN: %{python} -c "import io; io.open(r'%t.wtl.utf8','w',encoding='utf-8').write(io.open(r'%t.wtl',encoding='utf-16').read())"
+# RUN: FileCheck %s < %t.wtl.utf8
+
+# The only volatile fields are the machine/pid/timestamp in the <RTI> header and
+# the CA/LA tick counts (elapsed seconds, which round up on slower machines);
+# everything else is fixed, so the rest of the log is asserted verbatim.
+
+# CHECK: <?xml version="1.0" encoding="utf-16"?>
+# CHECK-NEXT: <WTT-Logger>
+# CHECK-NEXT: <RTI ID="" Machine="{{.*}}" ProcessName="lit" ProcessID="{{[0-9]+}}" ThreadID="0" BaseTime="{{.*}}" Frequency="1" />
+# CHECK-NEXT: <CTX ID="1" Current="WTTLOG" Parent="ROOT" />
+# CHECK-NEXT: <CTX ID="" Current="wtt-data :: fail.ini" Parent="WTTLOG" />
+# CHECK-NEXT: <StartTest Title="wtt-data :: fail.ini" TUID="" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </StartTest>
+# CHECK-NEXT: <Error UserText="test failed" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </Error>
+# CHECK-NEXT: <EndTest Title="wtt-data :: fail.ini" TUID="" Result="Fail" Repro="" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </EndTest>
+# CHECK-NEXT: <CTX ID="" Current="wtt-data :: missing_feature.ini" Parent="WTTLOG" />
+# CHECK-NEXT: <StartTest Title="wtt-data :: missing_feature.ini" TUID="" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </StartTest>
+# CHECK-NEXT: <Msg UserText="UNSUPPORTED on this device; reported as Pass (not applicable)." CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </Msg>
+# CHECK-NEXT: <EndTest Title="wtt-data :: missing_feature.ini" TUID="" Result="Pass" Repro="" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </EndTest>
+# CHECK-NEXT: <CTX ID="" Current="wtt-data :: multiline_fail.ini" Parent="WTTLOG" />
+# CHECK-NEXT: <StartTest Title="wtt-data :: multiline_fail.ini" TUID="" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </StartTest>
+# CHECK-NEXT: <Error UserText='first line second "line" & <tag> ]]>' CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </Error>
+# CHECK-NEXT: <EndTest Title="wtt-data :: multiline_fail.ini" TUID="" Result="Fail" Repro="" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </EndTest>
+# CHECK-NEXT: <CTX ID="" Current="wtt-data :: pass.ini" Parent="WTTLOG" />
+# CHECK-NEXT: <StartTest Title="wtt-data :: pass.ini" TUID="" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </StartTest>
+# CHECK-NEXT: <Msg UserText="not shown" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </Msg>
+# CHECK-NEXT: <EndTest Title="wtt-data :: pass.ini" TUID="" Result="Pass" Repro="" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </EndTest>
+# CHECK-NEXT: <CTX ID="" Current="wtt-data :: pass_with_output.ini" Parent="WTTLOG" />
+# CHECK-NEXT: <StartTest Title="wtt-data :: pass_with_output.ini" TUID="" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </StartTest>
+# CHECK-NEXT: <Msg UserText="ran ok" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </Msg>
+# CHECK-NEXT: <EndTest Title="wtt-data :: pass_with_output.ini" TUID="" Result="Pass" Repro="" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </EndTest>
+# CHECK-NEXT: <CTX ID="" Current="wtt-data :: unsupported.ini" Parent="WTTLOG" />
+# CHECK-NEXT: <StartTest Title="wtt-data :: unsupported.ini" TUID="" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </StartTest>
+# CHECK-NEXT: <Msg UserText="UNSUPPORTED on this device; reported as Pass (not applicable)." CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </Msg>
+# CHECK-NEXT: <EndTest Title="wtt-data :: unsupported.ini" TUID="" Result="Pass" Repro="" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </EndTest>
+# CHECK-NEXT: <CTX ID="" Current="wtt-data :: xfail.ini" Parent="WTTLOG" />
+# CHECK-NEXT: <StartTest Title="wtt-data :: xfail.ini" TUID="" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </StartTest>
+# CHECK-NEXT: <Msg UserText="expected fail" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </Msg>
+# CHECK-NEXT: <EndTest Title="wtt-data :: xfail.ini" TUID="" Result="Pass" Repro="" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="" />
+# CHECK-NEXT: </EndTest>
+# CHECK-NEXT: <Msg UserText="2 test(s) were UNSUPPORTED on this device and reported as Pass (not applicable)." CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="1" />
+# CHECK-NEXT: </Msg>
+# CHECK-NEXT: <Msg UserText="1 test(s) were not run (1 excluded) and are omitted from the pass/fail results." CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="1" />
+# CHECK-NEXT: </Msg>
+# CHECK-NEXT: <PFRollup Total="7" Passed="5" Failed="2" Blocked="0" Warned="0" Skipped="0" CA="{{[0-9]+}}" LA="{{[0-9]+}}">
+# CHECK-NEXT: <rti id="" />
+# CHECK-NEXT: <ctx id="1" />
+# CHECK-NEXT: </PFRollup>
+# CHECK-NEXT: </WTT-Logger>
More information about the llvm-commits
mailing list