1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3 4# Copyright (c) 2021-2025 Huawei Device Co., Ltd. 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16# 17 18import os 19import sys 20from datetime import datetime 21from typing import List 22from logging import Logger 23 24import pytz 25from dotenv import load_dotenv 26 27from runner.logger import Log 28from runner.options.cli_options import get_args 29from runner.options.config import Config 30from runner.plugins_registry import PluginsRegistry 31from runner.runner_base import Runner 32 33 34def clear_gcda(config: Config, runner: Runner) -> None: 35 if config.general.coverage.use_lcov: 36 runner.clear_gcda_files() 37 38 39def get_runners(config: Config, registry: PluginsRegistry, logger: Logger) -> List[Runner]: 40 runners: List[Runner] = [] 41 for test_suite in config.test_suites: 42 if test_suite.startswith("declgen_ets2ts"): 43 plugin = "declgenets2ts" 44 elif test_suite.startswith("declgen_ts2ets"): 45 plugin = "declgents2ets" 46 elif test_suite.startswith("declgen_ets2ets"): 47 plugin = "declgenets2ets" 48 else: 49 plugin = "ets" if test_suite.startswith("ets") or test_suite.startswith("ets") else test_suite 50 runner_class = registry.get_runner(plugin) 51 if runner_class is not None: 52 runners.append(runner_class(config)) 53 else: 54 Log.exception_and_raise(logger, f"Plugin {plugin} not registered") 55 return runners 56 57 58def process_runners(config: Config, runners: List[Runner], logger: Logger) -> int: 59 failed_tests = 0 60 if not config.general.generate_only: 61 for runner in runners: 62 clear_gcda(config, runner) 63 Log.all(logger, f"Runner {runner.name} started") 64 runner.run() 65 Log.all(logger, f"Runner {runner.name} finished") 66 failed_tests += runner.summarize() 67 Log.all(logger, f"Runner {runner.name}: {failed_tests} failed tests") 68 if config.general.coverage.use_llvm_cov or config.general.coverage.use_lcov: 69 runner.create_coverage_html() 70 return failed_tests 71 72 73def main() -> None: 74 dotenv_path = os.path.join(os.path.dirname(__file__), ".env") 75 if os.path.exists(dotenv_path): 76 load_dotenv(dotenv_path) 77 78 args = get_args() 79 config = Config(args) 80 logger = Log.setup(config.general.verbose, config.general.work_dir) 81 config.log_warnings() 82 Log.summary(logger, f"Loaded configuration: {config}") 83 config.generate_config() 84 85 registry = PluginsRegistry() 86 config.custom.validate() 87 88 if config.general.processes == 1: 89 Log.default( 90 logger, 91 "Attention: tests are going to take only 1 process. The execution can be slow. " 92 "You can set the option `--processes` to wished processes quantity " 93 "or use special value `all` to use all available cores.", 94 ) 95 start = datetime.now(pytz.UTC) 96 runners: List[Runner] = get_runners(config, registry, logger) 97 failed_tests = process_runners(config, runners, logger) 98 finish = datetime.now(pytz.UTC) 99 Log.default( 100 logger, 101 f"Runner has been working for {round((finish-start).total_seconds())} sec", 102 ) 103 104 registry.cleanup() 105 sys.exit(0 if failed_tests == 0 else 1) 106 107 108if __name__ == "__main__": 109 main() 110