import re
import argparse
import subprocess
import time
from enum import Enum
class TestTypes(Enum):
NORMAL = 0
CLANGTIDY = 1
CLANGFORMAT = 2
def print_summary(log_lines, searched_words, end_word=""):
was_any_log = False
should_print = False
for line in log_lines:
for word in searched_words:
if any(word in line for word in searched_words):
should_print = True
was_any_log = True
if end_word and end_word in line:
should_print=False
if should_print:
print(line.strip())
if not was_any_log:
print("Problem occourd: ", was_any_log)
print(f"\n")
def print_progress_to_console(line, test_type, pattern_progress_bar, pattern_clang_tidy, pattern_clang_format):
match test_type:
case TestTypes.NORMAL:
match = pattern_progress_bar.search(line)
if match:
print(line, end='')
case TestTypes.CLANGTIDY:
match = re.match(pattern_clang_tidy, line)
if match:
print(f"[{match.group(1)}/{match.group(2)}] {match.group(3)}")
case TestTypes.CLANGFORMAT:
match = re.match(pattern_clang_format, line)
if match:
print(f"[{match.group(1)}/{match.group(2)}] Clang-format: {match.group(3)} \n")
def test_process_runner(runtime_process, test_type):
pattern_progress_bar = re.compile(r'\b(\d{1,3}%)\|(.+?)\| (\d+)/(\d+) \[\d{2}:\d{2}<\d{2}:\d{2},\s*\d+\.\d+it/s\]$')
pattern_clang_tidy = re.compile(r"^\[(\d+)\/(\d+)\]\s+Done\s+clang-tidy:\s+.*?\/es2panda\/(.+\.cpp)$")
pattern_clang_format = re.compile(r"\[(\d+)/(\d+)\]\s+Running clang-format: (.+)")
should_print = False
log_lines = []
for line in runtime_process.stdout:
log_lines.append(line)
print_progress_to_console(line, test_type, pattern_progress_bar, pattern_clang_tidy, pattern_clang_format)
return log_lines
def command_runner(command_to_run, test_type):
try:
process = subprocess.Popen(command_to_run, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
process_log = test_process_runner(process, test_type)
except subprocess.CalledProcessError as e:
process_log = str(e)
print("An error occurred during processing:", process_log)
except Exception as e:
process_log = str(e)
print("An error occurred during processing:", process_log)
return process_log
def print_summary_to_file(log, file_name, word_for_success, word_for_fail, test_name):
has_to_write_out_the_log = False
for line in log:
if word_for_fail in line:
has_to_write_out_the_log = True
elif word_for_success in line:
print(line)
if has_to_write_out_the_log:
with open(file_name, "w") as file:
for line in log:
file.write(line)
print(f"{test_name} is faild. Please check the log file: {file_name}")
def main():
parser = argparse.ArgumentParser(description="Program description.")
parser.add_argument("--working-dir", required=False, help="Path to the working dir")
parser.add_argument("--build-root", required=False, help="Path to the working dir")
args = parser.parse_args()
print(f"Argumentum: Working dir: {args.working_dir}")
print(f"Argumentum: Build root: {args.build_root}")
command_helper = ["python3", f"{args.working_dir}/tests/tests-u-runner/main.py", "--build-dir", f"{args.build_root}",
"--processes", "all", "--show-progress", "--force-generate"
]
parser_test_run_command = command_helper + ["--parser" ]
parser_log = command_runner(parser_test_run_command, TestTypes.NORMAL)
runtime_test_run_command = command_helper + ["--ets-runtime", "--timeout", "60"]
runtime_log = command_runner(runtime_test_run_command, TestTypes.NORMAL)
functional_test_run_command = command_helper + ["--ets-func-tests"]
functional_log = command_runner(functional_test_run_command, TestTypes.NORMAL)
ets_cts_test_run_command = command_helper + ["--ets-cts"]
ets_cts_log = command_runner(ets_cts_test_run_command, TestTypes.NORMAL)
clang_format_run_command = ["ninja", "-C", f"{args.build_root}", "code-style-check"]
clang_format_log = command_runner(clang_format_run_command, TestTypes.CLANGFORMAT)
clang_tidy_run_command = [f"{args.working_dir}/scripts/clang-tidy/clang_tidy_check.py", "--filename-filter=ets2panda",
f"{args.working_dir}", f"{args.build_root}"
]
clang_tidy_log = command_runner(clang_tidy_run_command,TestTypes.CLANGTIDY)
print("\n\nTest results: \n")
print(f"\nParser test results:")
print_summary(parser_log, ["New failures at", "Summary("])
print(f"\nRuntime test results:")
print_summary(runtime_log, ["New failures at", "Summary("])
print(f"\nFunctional test results:")
print_summary(functional_log, ["Summary("])
print(f"\nEts-cts test results:")
print_summary(ets_cts_log, ["New failures at", "Summary("])
print(f"\nClang-format results:")
print_summary_to_file(clang_format_log, "clang-format.log", "Clang-format was passed successfully!", "Failed:", "Clang-format")
print(f"\nClang-tidy results:")
print_summary(clang_tidy_log,["Clang-tidy was passed successfully!", "Failed:"], "Done clang-tidy:")
if __name__ == "__main__":
start_time = time.perf_counter()
main()
end_time = time.perf_counter()
print("Runtime: ", (end_time - start_time)/60, " minute" )