#!/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 the runner recognizes the `XML_OUTPUT_FILE` environment variable of Bazel and writes a JUnit report to the path it names. Requires 2 arguments, path to the test binary and the output directory for the report. """ 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 ret = subprocess.run( [bin_path, '--retries=off'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, env=env ) # One of the tests fails on purpose. if ret.returncode != 42: print("Unexpected return code {}".format(ret.returncode)) print("stdout: {}".format(ret.stdout)) print("stderr: {}".format(ret.stderr)) exit(1) try: with open(xml_out_path, 'r', encoding='utf-8') as report: text = report.read() # A JUnit report has no document type, so it declares no entities: one # that does is rejected before parsing, and no entity is ever expanded. if '