in tools/dev/gen_junit_report.py [0:0]
def main():
"""main method"""
try:
opts, args = getopt.getopt(sys.argv[1:], 'l:d:h',
['log-file=', 'output-dir=', 'help'])
except getopt.GetoptError as err:
usage(err)
log_file = None
output_dir = None
for opt, value in opts:
if (opt in ('-h', '--help')):
usage()
elif (opt in ('-l', '--log-file')):
log_file = value
elif (opt in ('-d', '--output-dir')):
output_dir = value
else:
usage('Unable to recognize option')
if not log_file or not output_dir:
usage("The options --log-file and --output-dir are mandatory")
# create junit output directory, if not exists
if not os.path.exists(output_dir):
print("Directory '%s' not exists, creating ..." % output_dir)
try:
os.makedirs(output_dir)
except OSError as err:
sys.stderr.write("ERROR: %s\n" % err)
sys.exit(1)
patterns = {
'start' : 'START:',
'end' : 'END:',
'pass' : 'PASS:',
'skip' : 'SKIP:',
'fail' : 'FAIL:',
'xfail' : 'XFAIL:',
'elapsed' : 'ELAPSED:'
}
junit = []
junit.append(start_junit())
reason = None
count = {}
fp = None
try:
fp = open(log_file, 'r')
except IOError as err:
sys.stderr.write("ERROR: %s\n" % err)
sys.exit(1)
for line in fp.readlines():
line = line.strip()
if line.startswith(patterns['start']):
reason = ""
test_name = line.split(' ')[1]
# replace '.' in test name with '_' to avoid confusing class
# name in test result displayed in the CI user interface
test_name.replace('.', '_')
count[test_name] = {
'pass' : 0,
'skip' : 0,
'fail' : 0,
'xfail' : 0,
'elapsed' : 0,
'total' : 0
}
junit.append(start_testsuite(test_name))
elif line.startswith(patterns['end']):
junit.append(end_testsuite())
elif line.startswith(patterns['pass']):
reason = ""
casename = line.strip(patterns['pass']).strip()
junit.append(junit_testcase_ok(test_name, casename))
count[test_name]['pass'] += 1
elif line.startswith(patterns['skip']):
reason = ""
casename = line.strip(patterns['skip']).strip()
junit.append(junit_testcase_skip(test_name, casename))
count[test_name]['skip'] += 1
elif line.startswith(patterns['fail']):
casename = line.strip(patterns['fail']).strip()
junit.append(junit_testcase_fail(test_name, casename, reason))
count[test_name]['fail'] += 1
reason = ""
elif line.startswith(patterns['xfail']):
casename = line.strip(patterns['xfail']).strip()
junit.append(junit_testcase_xfail(test_name, casename, reason))
count[test_name]['pass'] += 1
reason = ""
elif line.startswith(patterns['elapsed']):
reason = ""
elapsed = line.split(' ')[2].strip()
(hrs, mins, secs) = elapsed.split(':')
secs_taken = int(hrs)*24 + int(mins)*60 + float(secs)
count[test_name]['elapsed'] = secs_taken
junit_str = update_stat(test_name, junit, count)
test_junit_file = os.path.join(output_dir,
"%s.junit.xml" % test_name)
w_fp = open (test_junit_file, 'w')
w_fp.writelines(junit_str)
w_fp.close()
junit = []
elif len(line):
reason = "%s\n%s" % (reason, line)
fp.close()