blob: cffc73bf5e6068fdcdf7c0f7ec6c2f2a94353276 [file] [edit]
#!/usr/bin/env python3
# Copyright 2024 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""A script to generate accel_test.conf for stable_delegate_test_suite."""
import argparse
import logging
from pathlib import Path
import subprocess
import sys
from typing import List, Optional, TextIO
def list_test(
stable_delegate_test_suite: Path,
gtest_filter: str,
) -> List[str]:
stable_delegate_test_suite_cmd = [
str(stable_delegate_test_suite.absolute()),
"--gtest_list_tests",
"--gtest_filter=%s" % gtest_filter,
]
logging.debug("Running: %s", " ".join(stable_delegate_test_suite_cmd))
result = subprocess.check_output(stable_delegate_test_suite_cmd, text=True)
prefix = ""
test_list: List[str] = []
for line in result.splitlines():
# ignoring comments for test parameters
item = line.split("#", 1)[0].strip()
if item.endswith("."):
prefix = item
else:
test_list.append(prefix + item)
return test_list
def generate_accel_test_conf(
stable_delegate_test_suite: Path,
stable_delegate_settings_file: Path,
output_file: TextIO,
crash_output_file: TextIO,
gtest_filter: str,
list_passed_tests: bool,
):
assert stable_delegate_test_suite.is_file()
assert stable_delegate_settings_file.is_file()
passed_tests: List[str] = []
failed_tests: List[str] = []
crashed_tests: List[str] = []
for test in list_test(stable_delegate_test_suite, gtest_filter):
stable_delegate_test_suite_cmd = [
str(stable_delegate_test_suite.absolute()),
"--stable_delegate_settings_file=%s"
% (stable_delegate_settings_file.absolute(),),
"--gtest_filter=%s" % test,
]
result = subprocess.run(
stable_delegate_test_suite_cmd,
stdout=subprocess.DEVNULL,
stderr=subprocess.PIPE,
check=False,
)
if result.returncode == 0:
logging.debug("%s: PASS", test)
passed_tests.append(test)
elif result.returncode == 1:
logging.debug("%s: FAIL", test)
failed_tests.append(test)
else:
logging.debug("%s: CRASH", test)
crashed_tests.append(test)
logging.debug("Finished running stable_delegate_test_suite")
logging.debug(
"pass: %d, fail %d, crash, %d",
len(passed_tests),
len(failed_tests),
len(crashed_tests),
)
output_file.write(
"# Auto-generated by stable_delegate_accel_test_conf.py\n\n"
)
output_file.write("# Failed tests\n")
for test in failed_tests:
output_file.write("-%s\n" % test.replace(".", "/"))
output_file.write("# Passed tests\n")
if list_passed_tests:
for test in passed_tests:
output_file.write("%s\n" % test.replace(".", "/"))
else:
output_file.write(".*\n")
crash_output_file.write("-%s" % ":".join(crashed_tests))
logging.debug("Finished generating accel_test_conf")
def setup_argument_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter
)
parser.add_argument(
"--stable_delegate_settings_file",
required=True,
type=Path,
help="The path to the delegate settings JSON file.",
)
parser.add_argument(
"--output",
default="accel_test.conf",
type=argparse.FileType("w"),
help="output path for generated acceleration test config",
)
parser.add_argument(
"--crash_output",
type=argparse.FileType("w"),
default="crash_filter.txt",
help="output path for generated gtest filter for crashed tests",
)
parser.add_argument(
"--gtest_filter",
type=str,
default="*",
help="gtest filter for quick verifying subset of tests",
)
parser.add_argument(
"--stable_delegate_test_suite",
default="/usr/local/bin/stable_delegate_test_suite",
type=Path,
help="path to the stable_delegate_test_suite binary",
)
parser.add_argument(
"--list_passed_tests",
action="store_true",
help="list passed tests in the output config file",
)
parser.add_argument(
"--debug",
action="store_true",
help="enable debug logging",
)
return parser
def main(argv: Optional[List[str]] = None) -> Optional[int]:
parser = setup_argument_parser()
args = parser.parse_args(argv)
log_level = logging.DEBUG if args.debug else logging.INFO
log_format = "%(asctime)s - %(levelname)s - %(funcName)s: %(message)s"
logging.basicConfig(level=log_level, format=log_format)
generate_accel_test_conf(
args.stable_delegate_test_suite,
args.stable_delegate_settings_file,
args.output,
args.crash_output,
args.gtest_filter,
args.list_passed_tests,
)
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))