#!/usr/bin/env python3 import os import logging import argparse import csv OK_SIGN = "OK ]" FAILED_SIGN = "FAILED ]" SEGFAULT = "Segmentation fault" SIGNAL = "received signal SIG" PASSED = "PASSED" def get_test_name(line): elements = reversed(line.split(" ")) for element in elements: if "(" not in element and ")" not in element: return element raise Exception("No test name in line '{}'".format(line)) def process_result(result_folder): summary = [] total_counter = 0 failed_counter = 0 result_log_path = "{}/test_result.txt".format(result_folder) if not os.path.exists(result_log_path): logging.info("No output log on path %s", result_log_path) return "exception", "No output log", [] status = "success" description = "" passed = False with open(result_log_path, "r") as test_result: for line in test_result: if OK_SIGN in line: logging.info("Found ok line: '%s'", line) test_name = get_test_name(line.strip()) logging.info("Test name: '%s'", test_name) summary.append((test_name, "OK")) total_counter += 1 elif FAILED_SIGN in line and "listed below" not in line and "ms)" in line: logging.info("Found fail line: '%s'", line) test_name = get_test_name(line.strip()) logging.info("Test name: '%s'", test_name) summary.append((test_name, "FAIL")) total_counter += 1 failed_counter += 1 elif SEGFAULT in line: logging.info("Found segfault line: '%s'", line) status = "failure" description += "Segmentation fault. " break elif SIGNAL in line: logging.info("Received signal line: '%s'", line) status = "failure" description += "Exit on signal. " break elif PASSED in line: logging.info("PASSED record found: '%s'", line) passed = True if not passed: status = "failure" description += "PASSED record not found. " if failed_counter != 0: status = "failure" if not description: description += "fail: {}, passed: {}".format( failed_counter, total_counter - failed_counter ) return status, description, summary def write_results(results_file, status_file, results, status): with open(results_file, "w") as f: out = csv.writer(f, delimiter="\t") out.writerows(results) with open(status_file, "w") as f: out = csv.writer(f, delimiter="\t") out.writerow(status) if __name__ == "__main__": logging.basicConfig(level=logging.INFO, format="%(asctime)s %(message)s") parser = argparse.ArgumentParser( description="ClickHouse script for parsing results of unit tests" ) parser.add_argument("--in-results-dir", default="/test_output/") parser.add_argument("--out-results-file", default="/test_output/test_results.tsv") parser.add_argument("--out-status-file", default="/test_output/check_status.tsv") args = parser.parse_args() state, description, test_results = process_result(args.in_results_dir) logging.info("Result parsed") status = (state, description) write_results(args.out_results_file, args.out_status_file, test_results, status) logging.info("Result written")