普通文本  |  98行  |  2.86 KB

#!/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)