18ccd5183SScott Kruger#!/usr/bin/env python 291bc3e46SScott Krugerimport glob, os, re 38ccd5183SScott Krugerimport optparse 43054ff8cSScott Krugerimport inspect 53054ff8cSScott Kruger 68ccd5183SScott Kruger""" 78ccd5183SScott KrugerQuick script for parsing the output of the test system and summarizing the results. 88ccd5183SScott Kruger""" 98ccd5183SScott Kruger 103054ff8cSScott Krugerdef inInstallDir(): 113054ff8cSScott Kruger """ 123054ff8cSScott Kruger When petsc is installed then this file in installed in: 133054ff8cSScott Kruger <PREFIX>/share/petsc/examples/config/gmakegentest.py 143054ff8cSScott Kruger otherwise the path is: 153054ff8cSScott Kruger <PETSC_DIR>/config/gmakegentest.py 163054ff8cSScott Kruger We use this difference to determine if we are in installdir 173054ff8cSScott Kruger """ 183054ff8cSScott Kruger thisscriptdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 193054ff8cSScott Kruger dirlist=thisscriptdir.split(os.path.sep) 203054ff8cSScott Kruger if len(dirlist)>4: 213054ff8cSScott Kruger lastfour=os.path.sep.join(dirlist[len(dirlist)-4:]) 223054ff8cSScott Kruger if lastfour==os.path.join('share','petsc','examples','config'): 233054ff8cSScott Kruger return True 243054ff8cSScott Kruger else: 253054ff8cSScott Kruger return False 263054ff8cSScott Kruger else: 273054ff8cSScott Kruger return False 283054ff8cSScott Kruger 293054ff8cSScott Krugerdef summarize_results(directory,make): 308ccd5183SScott Kruger ''' Loop over all of the results files and summarize the results''' 318ccd5183SScott Kruger startdir=os.path.realpath(os.path.curdir) 326d7e7da8SJed Brown try: 338ccd5183SScott Kruger os.chdir(directory) 346d7e7da8SJed Brown except OSError: 356d7e7da8SJed Brown print('# No tests run') 366d7e7da8SJed Brown return 37100ef3c7SJed Brown summary={'total':0,'success':0,'failed':0,'failures':[],'todo':0,'skip':0} 388ccd5183SScott Kruger for cfile in glob.glob('*.counts'): 39100ef3c7SJed Brown with open(cfile, 'r') as f: 40100ef3c7SJed Brown for line in f: 41100ef3c7SJed Brown l = line.split() 42100ef3c7SJed Brown summary[l[0]] += l[1:] if l[0] == 'failures' else int(l[1]) 43a2766241SScott Kruger 4491bc3e46SScott Kruger failstr=' '.join(summary['failures']) 45100ef3c7SJed Brown print("\n# -------------") 46100ef3c7SJed Brown print("# Summary ") 47100ef3c7SJed Brown print("# -------------") 481a3f486dSScott Kruger if failstr.strip(): print("# FAILED " + failstr) 498ccd5183SScott Kruger 508ccd5183SScott Kruger for t in "success failed todo skip".split(): 518ccd5183SScott Kruger percent=summary[t]/float(summary['total'])*100 52100ef3c7SJed Brown print("# %s %d/%d tests (%3.1f%%)" % (t, summary[t], summary['total'], percent)) 5391bc3e46SScott Kruger 54c687a870SSatish Balay if failstr.strip(): 5591bc3e46SScott Kruger fail_targets=( 5691bc3e46SScott Kruger re.sub('(?<=[0-9]_\w)_.*','', 5791bc3e46SScott Kruger re.sub('_1 ',' ', 5891bc3e46SScott Kruger re.sub('cmd-','', 59*6ca6af43SScott Kruger re.sub('diff-','',failstr+' ')))) 6091bc3e46SScott Kruger ) 6191bc3e46SScott Kruger # Need to make sure we have a unique list 6291bc3e46SScott Kruger fail_targets=' '.join(list(set(fail_targets.split()))) 633054ff8cSScott Kruger 643054ff8cSScott Kruger #Make the message nice 653054ff8cSScott Kruger makefile="gmakefile.test" if inInstallDir() else "gmakefile" 663054ff8cSScott Kruger 6791bc3e46SScott Kruger print("#\n# To rerun failed tests: ") 683054ff8cSScott Kruger print("# "+make+" -f "+makefile+" test search='" + fail_targets.strip()+"'") 698ccd5183SScott Kruger return 708ccd5183SScott Kruger 718ccd5183SScott Krugerdef main(): 728ccd5183SScott Kruger parser = optparse.OptionParser(usage="%prog [options]") 738ccd5183SScott Kruger parser.add_option('-d', '--directory', dest='directory', 748ccd5183SScott Kruger help='Directory containing results of petsc test system', 758ccd5183SScott Kruger default='counts') 763054ff8cSScott Kruger parser.add_option('-m', '--make', dest='make', 773054ff8cSScott Kruger help='make executable to report in summary', 783054ff8cSScott Kruger default='make') 798ccd5183SScott Kruger options, args = parser.parse_args() 808ccd5183SScott Kruger 818ccd5183SScott Kruger # Process arguments 828ccd5183SScott Kruger if len(args) > 0: 838ccd5183SScott Kruger parser.print_usage() 848ccd5183SScott Kruger return 858ccd5183SScott Kruger 863054ff8cSScott Kruger summarize_results(options.directory,options.make) 878ccd5183SScott Kruger 888ccd5183SScott Krugerif __name__ == "__main__": 898ccd5183SScott Kruger main() 90