[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