97 lines
2.9 KiB
Python
Executable file
97 lines
2.9 KiB
Python
Executable file
#!/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)
|