• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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