#!/usr/bin/python """ Program that parses the autotest results and return a nicely printed final test result. @copyright: Red Hat 2008-2009 """ def parse_results(text): """ Parse text containing Autotest results. @return: A list of result 4-tuples. """ result_list = [] start_time_list = [] info_list = [] lines = text.splitlines() for line in lines: line = line.strip() parts = line.split("\t") # Found a START line -- get start time if (line.startswith("START") and len(parts) >= 5 and parts[3].startswith("timestamp")): start_time = float(parts[3].split("=")[1]) start_time_list.append(start_time) info_list.append("") # Found an END line -- get end time, name and status elif (line.startswith("END") and len(parts) >= 5 and parts[3].startswith("timestamp")): end_time = float(parts[3].split("=")[1]) start_time = start_time_list.pop() info = info_list.pop() test_name = parts[2] test_status = parts[0].split()[1] # Remove "kvm." prefix if test_name.startswith("kvm."): test_name = test_name[4:] result_list.append((test_name, test_status, int(end_time - start_time), info)) # Found a FAIL/ERROR/GOOD line -- get failure/success info elif (len(parts) >= 6 and parts[3].startswith("timestamp") and parts[4].startswith("localtime")): info_list[-1] = parts[5] return result_list def print_result(result, name_width): """ Nicely print a single Autotest result. @param result: a 4-tuple @param name_width: test name maximum width """ if result: format = "%%-%ds %%-10s %%-8s %%s" % name_width print format % result def main(resfiles): result_lists = [] name_width = 40 for resfile in resfiles: try: text = open(resfile).read() except IOError: print "Bad result file: %s" % resfile continue results = parse_results(text) result_lists.append((resfile, results)) name_width = max([name_width] + [len(r[0]) for r in results]) print_result(("Test", "Status", "Seconds", "Info"), name_width) print_result(("----", "------", "-------", "----"), name_width) for resfile, results in result_lists: print " (Result file: %s)" % resfile for r in results: print_result(r, name_width) if __name__ == "__main__": import sys, glob resfiles = glob.glob("../../results/default/status*") if len(sys.argv) > 1: if sys.argv[1] == "-h" or sys.argv[1] == "--help": print "Usage: %s [result files]" % sys.argv[0] sys.exit(0) resfiles = sys.argv[1:] main(resfiles)