| # Copyright 2021 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """This is a library for working with test executables in a way that is |
| Chromium-bot-friendly as specified by //docs/testing/test_executable_api.md |
| |
| Example usage: |
| import os |
| import sys |
| |
| import main_program |
| import rust_main_program |
| |
| if __name__ == '__main__': |
| cmdline_parser = argparse.ArgumentParser() |
| main_program.add_cmdline_args(cmdline_parser) |
| ... adding other cmdline parameter definitions ... |
| parsed_cmdline_args = cmdline_parser.parse_args() |
| |
| test_executable_wrappers = [] |
| test_executable_wrappers.append( |
| rust_main_program.TestExecutableWrapper(...)) |
| ... |
| |
| main_program.main( |
| test_executable_wrappers, parsed_cmdline_args, os.environ) |
| """ |
| |
| import argparse |
| import time |
| |
| import test_filtering |
| import test_results |
| |
| |
| def add_cmdline_args(argparse_parser): |
| """Adds test-filtering-specific cmdline parameter definitions to |
| `argparse_parser`. |
| |
| Args: |
| argparse_parser: An object of argparse.ArgumentParser type. |
| """ |
| test_filtering.add_cmdline_args(argparse_parser) |
| test_results.add_cmdline_args(argparse_parser) |
| |
| argparse_parser.add_argument( |
| '--isolated-script-test-launcher-retry-limit', |
| dest='retry_limit', |
| default=3, |
| help='Sets the limit of test retries on failures to N.', |
| metavar='N', |
| type=int) |
| argparse_parser.add_argument('--isolated-script-test-repeat', |
| dest='repetitions', |
| default=1, |
| help='Repeats each test N times.', |
| metavar='N', |
| type=int) |
| |
| |
| def _calculate_tests_to_run(argparse_parsed_args, env, |
| test_executable_wrappers): |
| tests = [] |
| for wrapper in test_executable_wrappers: |
| extra_tests = wrapper.list_all_tests() |
| for extra_test in extra_tests: |
| assert extra_test not in tests |
| tests.extend(extra_tests) |
| return test_filtering.filter_tests(argparse_parsed_args, env, tests) |
| |
| |
| def _run_tests_and_save_results(argparse_parsed_args, list_of_tests_to_run, |
| test_executable_wrapper): |
| start_time = time.time() |
| results = [] |
| for wrapper in test_executable_wrapper: |
| results.extend(wrapper.run_tests(list_of_tests_to_run)) |
| test_results.print_test_results(argparse_parsed_args, results, start_time) |
| |
| |
| def main(test_executable_wrappers, argparse_parsed_args, env): |
| """Runs tests within `test_executable_wrappers` using cmdline arguments and |
| environment variables to figure out 1) which subset of tests to run, 2) |
| where to save the JSON file with test results. |
| |
| Args: |
| test_executable_wrappers: A list of objects providing |
| list_all_tests(...) and run_tests(...) methods (see |
| rust_main_program._TestExecutableWrapper). |
| argparse_parsed_arg: A result of an earlier call to |
| argparse_parser.parse_args() call (where `argparse_parser` has been |
| populated via an even earlier call to add_cmdline_args). |
| env: a dictionary-like object (typically from `os.environ`). |
| """ |
| list_of_test_names_to_run = _calculate_tests_to_run( |
| argparse_parsed_args, env, test_executable_wrappers) |
| _run_tests_and_save_results(argparse_parsed_args, |
| list_of_test_names_to_run, |
| test_executable_wrappers) |
| # TODO(lukasza): Repeat tests `args.repetitions` times. |
| # TODO(lukasza): Retry failing times up to `args.retry_limit` times. |