#!/usr/bin/python3
import sys
import os.path
import codecs
import logging
import argparse
prelog = {}
currlog = {}
def get_args():
parser = argparse.ArgumentParser(description="Parse ptest results")
requiredNamed = parser.add_argument_group('required arguments')
requiredNamed.add_argument('-p', dest="pre_log", required=True, help='prvious log of the pTest result')
requiredNamed.add_argument('--pre_commit', dest="pre_commit", required=True, help='commit of the previous log.')
requiredNamed.add_argument('--pre_release', dest="pre_release", required=True, help='release of the previous log.')
requiredNamed.add_argument('-c', dest="curr_log", required=True, help='current log of pTets results.')
requiredNamed.add_argument('--curr_commit', dest="curr_commit", required=True, help='commit of the current log.')
requiredNamed.add_argument('--curr_release', dest="curr_release", required=True, help='release of the current log.')
return parser.parse_args()
##Check that logs exists
def check_args():
if not os.path.isfile(args.pre_log):
logging.error("Cannot find log file %s" % args.pre_log)
sys.exit(1)
elif not os.path.isfile(args.curr_log):
logging.error("Cannot find log file %s" % args.pre_curr)
def create_log_dict(argslog):
test_id = ""
result = ""
failures = ""
failures_log = []
passed = 0
failed = 0
content_file = codecs.open(argslog, 'r', 'utf-8', errors='ignore')
content = content_file.read()
content = content.split("\n")
res_dict = {}
directory = 'failures'
#create dir to store failures
if not os.path.exists(directory):
os.makedirs(directory)
#Parse the logs
for i in range (len(content)-1):
try:
result = content[i].split(":")[0]
test_id = content[i].split(":")[1].strip()
except:
result = None
if result:
if result in "BEGIN":
test_module = test_id
test_module = test_module.replace('/usr/lib/', '')
test_module = test_module.replace('/ptest', '')
elif result in "PASS":
passed = passed + 1
elif result in "FAIL":
failed = failed + 1
failures = "{0}:{1}" .format(result,test_id)
failures_log.append(failures)
elif result in "END":
total = passed + failed
if total == 0:
passrate = 0
else:
passrate = 100 * (passed / total)
res_dict[test_module] = [total, passed, failed, round(passrate,2)]
#Store Failures
with open('failures/'+test_module+".failures", 'w') as failures_file:
for fails in failures_log:
failures_file.write("{0}\n" .format(fails))
failures_log = []
total = passed = failed = 0
return res_dict
def create_compared_dict(currlog, prelog):
diff = set(prelog.keys()) - set(currlog.keys())
for key, value in currlog .items():
if key in prelog.keys():
lastpastrate = prelog[key][3]
else:
lastpastrate = 0
currlog[key].append(lastpastrate)
for item in diff:
if item in prelog.keys():
currlog[item] = prelog[item]
currlog[item].insert(3, 0)
return currlog
def create_header(file_name):
header = '[https://wiki.yoctoproject.org/wiki/Ptest/archive < Archive]' + \
'\n\n
Ran on a NUC and compared with' + \
'[[Ptest %s| %s]]'% (args.pre_commit, args.pre_release) + \
'\n\n[ < FULL_LOG]'
with open(file_name, 'a') as f:
f.write(header)
def create_table(file_name, finalog):
nomenclature = '\n\n{| style="border-spacing:0;"\n' + \
'| style="background-color:#ff8080;border:0.05pt solid #000000' + \
';padding:0.0382in;"| Failures\n' + \
'|-\n' + \
'| style="background-color:#99ff66;border-top:none;border-bottom:0.05pt' + \
'solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt' + \
'solid #000000;padding:0.0201in;"| % increased\n' + \
'|-\n' + \
'| style="background-color:#c5000b;border-top:none;border-bottom:0.05pt' + \
'solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt' + \
'solid #000000;padding:0.0201in;color:#ffffff"| % decreased\n' + \
'|-\n' + \
'| style="background-color:gray;border-top:none;border-bottom:0.05pt' + \
'solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt' + \
'solid #000000;padding:0.0201in;color:#000000"| Module not executed\n' + \
'|}'
titles = ['Package Name', 'Tests ran', 'Passed', 'Failed', 'Passrate', 'Last Passrate']
table = '\n\n{| class="wikitable"\n' + \
'|+Results\n' + \
'|-\n'
for t in titles:
table += '| align=center style="background-color:#ccffff;' + \
'border-top:0.05pt solid #000000;border-bottom:0.5pt solid' + \
'#000000;border-left:0.05pt solid #000000;border-right:0.5pt' + \
'solid #000000;padding:0.0201in;"' + \
"| '''%s'''\n"% t
table += '|-\n'
for key, value in sorted(finalog.items()):
bgcolor_rate = bgcolor_fails = 'transparent'
text_color = '#000000'
if all(v == 0 for v in value[0:2]):
bgcolor_rate = bgcolor_fails = 'gray'
rate_image = 'no_rate.png'
#Package Name
table += '| align=left style="background-color:trasnparent' + \
'border-color:#000000"| %s\n'% key
#Tests ran and Passed
for v in range(0,2):
table += '| align=center style="background-color:%s;'% bgcolor_rate + \
'border-color:#000000"|%s\n'% value[v]
if value[2] > 0:
bgcolor_fails = '#ff8080'
#Failed
table += '| align=center style="background-color:%s;'% bgcolor_fails + \
'border-color:#000000"|%s\n'% value[2]
if value[3] > value[4]:
bgcolor_rate = '#99ff66'
rate_image = 'up_rate.png'
elif value[3] < value[4]:
bgcolor_rate = '#c5000b'
rate_image = 'down_rate.png'
text_color = '#ffffff'
#Passrate
table += '| align=center style="background-color:%s;'% bgcolor_rate + \
'border-color:#000000;color:%s"|%s\n'% (text_color, value[3])
#Last Passrate
table += '| align=center style="background-color:%s;'% bgcolor_rate + \
'border-color:#000000;color:%s"|%s\n'% (text_color, value[4])
if bgcolor_rate not in 'transparent':
table += '| align=center style="background-color:transparent;' + \
'border-color:transparent" |[[File:%s|15px]]\n'% rate_image
table += '|-\n'
table += '|}\n'
with open(file_name, 'a') as f:
f.write(nomenclature + table)
def create_pTest_wiki(finalog):
file_name = args.curr_release + '-wiki.page'
create_header(file_name)
create_table(file_name, finalog)
return file_name
if __name__ == '__main__':
args = get_args()
logger = None
logging.basicConfig(stream=sys.stdout)
root = logging.getLogger()
root.setLevel(logging.INFO)
logger = logging.getLogger()
##Parse previous log
prelog = create_log_dict(args.pre_log)
#Parse current log
currlog = create_log_dict(args.curr_log)
logger.info("Logs parsed correctly")
#Get a compraed result
compared_log = create_compared_dict(currlog, prelog)
file_name = create_pTest_wiki(compared_log)
logger.info("Wiki correctly created as - %s -"%file_name)