| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 | #!/usr/bin/env python3#              Copyright Catch2 Authors# Distributed under the Boost Software License, Version 1.0.#   (See accompanying file LICENSE_1_0.txt or copy at#        https://www.boost.org/LICENSE_1_0.txt)# SPDX-License-Identifier: BSL-1.0import osimport reimport sysimport xml.etree.ElementTree as ETimport subprocess"""Test that Catch2 recognizes `XML_OUTPUT_FILE` env variable and createsa 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 runsif 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_pathtest_passing = Truetry:    ret = subprocess.run(        bin_path,        stdout=subprocess.PIPE,        stderr=subprocess.PIPE,        check=True,        universal_newlines=True,        env=env    )    stdout = ret.stdoutexcept subprocess.SubprocessError as ex:    if ex.returncode == 1:        # The test cases are allowed to fail.        test_passing = False        stdout = ex.stdout    else:        print('Could not run "{}"'.format(args))        print("Return code: {}".format(ex.returncode))        print("stdout: {}".format(ex.stdout))        print("stderr: {}".format(ex.stdout))        raise# Check for valid XML outputtry:    tree = ET.parse(xml_out_path)except ET.ParseError as ex:    print("Invalid XML: '{}'".format(ex))    raiseexcept FileNotFoundError as ex:    print("Could not find '{}'".format(xml_out_path))    raisebin_name = os.path.basename(bin_path)# Check for matching testsuiteif 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 reportersummary_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)
 |