From bc524d70253a4ab2fe40c3ca3e5666e267c0a4d1 Mon Sep 17 00:00:00 2001 From: Lexi Winter Date: Sun, 29 Jun 2025 19:25:29 +0100 Subject: import catch2 3.8.1 --- tests/TestScripts/testBazelReporter.py | 104 +++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 tests/TestScripts/testBazelReporter.py (limited to 'tests/TestScripts/testBazelReporter.py') diff --git a/tests/TestScripts/testBazelReporter.py b/tests/TestScripts/testBazelReporter.py new file mode 100644 index 0000000..573eafd --- /dev/null +++ b/tests/TestScripts/testBazelReporter.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 + +# Copyright Catch2 Authors +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE.txt or copy at +# https://www.boost.org/LICENSE_1_0.txt) + +# SPDX-License-Identifier: BSL-1.0 + +import os +import re +import sys +import xml.etree.ElementTree as ET +import subprocess + +""" +Test that Catch2 recognizes `XML_OUTPUT_FILE` env variable and creates +a junit reporter that writes to the provided path. + +Requires 2 arguments, path to Catch2 binary configured with +`CATCH_CONFIG_BAZEL_SUPPORT`, and the output directory for the output file. +""" +if len(sys.argv) != 3: + print("Wrong number of arguments: {}".format(len(sys.argv))) + print("Usage: {} test-bin-path output-dir".format(sys.argv[0])) + exit(1) + + +bin_path = os.path.abspath(sys.argv[1]) +output_dir = os.path.abspath(sys.argv[2]) +xml_out_path = os.path.join(output_dir, '{}.xml'.format(os.path.basename(bin_path))) + +# Ensure no file exists from previous test runs +if os.path.isfile(xml_out_path): + os.remove(xml_out_path) + +print('bin path:', bin_path) +print('xml out path:', xml_out_path) + +env = os.environ.copy() +env["XML_OUTPUT_FILE"] = xml_out_path +test_passing = True + +try: + ret = subprocess.run( + bin_path, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + check=True, + universal_newlines=True, + env=env + ) + stdout = ret.stdout +except subprocess.SubprocessError as ex: + if ex.returncode == 42: + # The test cases are allowed to fail. + test_passing = False + stdout = ex.stdout + else: + print('Could not run "{}"'.format(bin_path)) + print("Return code: {}".format(ex.returncode)) + print("stdout: {}".format(ex.stdout)) + print("stderr: {}".format(ex.stderr)) + raise + +# Check for valid XML output +try: + tree = ET.parse(xml_out_path) +except ET.ParseError as ex: + print("Invalid XML: '{}'".format(ex)) + raise +except FileNotFoundError as ex: + print("Could not find '{}'".format(xml_out_path)) + raise + +bin_name = os.path.basename(bin_path) +# Check for matching testsuite +if not tree.find('.//testsuite[@name="{}"]'.format(bin_name)): + print("Could not find '{}' testsuite".format(bin_name)) + exit(2) + +# Check that we haven't disabled the default reporter +summary_test_cases = re.findall(r'test cases: \d* \| \d* passed \| \d* failed', stdout) +if len(summary_test_cases) == 0: + print("Could not find test summary in {}".format(stdout)) + exit(2) + +total, passed, failed = [int(s) for s in summary_test_cases[0].split() if s.isdigit()] + +if failed == 0 and not test_passing: + print("Expected at least 1 test failure!") + exit(2) + +if len(tree.findall('.//testcase')) != total: + print("Unexpected number of test cases!") + exit(2) + +if len(tree.findall('.//failure')) != failed: + print("Unexpected number of test failures!") + exit(2) + +if (passed + failed) != total: + print("Something has gone very wrong, ({} + {}) != {}".format(passed, failed, total)) + exit(2) -- cgit v1.2.3