18ccd5183SScott Kruger#!/usr/bin/env python 291bc3e46SScott Krugerimport glob, os, re 38ccd5183SScott Krugerimport optparse 4*3054ff8cSScott Krugerimport inspect 5*3054ff8cSScott Kruger 68ccd5183SScott Kruger""" 78ccd5183SScott KrugerQuick script for parsing the output of the test system and summarizing the results. 88ccd5183SScott Kruger""" 98ccd5183SScott Kruger 10*3054ff8cSScott Krugerdef inInstallDir(): 11*3054ff8cSScott Kruger """ 12*3054ff8cSScott Kruger When petsc is installed then this file in installed in: 13*3054ff8cSScott Kruger <PREFIX>/share/petsc/examples/config/gmakegentest.py 14*3054ff8cSScott Kruger otherwise the path is: 15*3054ff8cSScott Kruger <PETSC_DIR>/config/gmakegentest.py 16*3054ff8cSScott Kruger We use this difference to determine if we are in installdir 17*3054ff8cSScott Kruger """ 18*3054ff8cSScott Kruger thisscriptdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 19*3054ff8cSScott Kruger dirlist=thisscriptdir.split(os.path.sep) 20*3054ff8cSScott Kruger if len(dirlist)>4: 21*3054ff8cSScott Kruger lastfour=os.path.sep.join(dirlist[len(dirlist)-4:]) 22*3054ff8cSScott Kruger if lastfour==os.path.join('share','petsc','examples','config'): 23*3054ff8cSScott Kruger return True 24*3054ff8cSScott Kruger else: 25*3054ff8cSScott Kruger return False 26*3054ff8cSScott Kruger else: 27*3054ff8cSScott Kruger return False 28*3054ff8cSScott Kruger 29*3054ff8cSScott 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('-','-run', 5991bc3e46SScott Kruger re.sub('cmd-','', 6091bc3e46SScott Kruger re.sub('diff-','',failstr+' '))))) 6191bc3e46SScott Kruger ) 6291bc3e46SScott Kruger # Need to make sure we have a unique list 6391bc3e46SScott Kruger fail_targets=' '.join(list(set(fail_targets.split()))) 64*3054ff8cSScott Kruger 65*3054ff8cSScott Kruger #Make the message nice 66*3054ff8cSScott Kruger makefile="gmakefile.test" if inInstallDir() else "gmakefile" 67*3054ff8cSScott Kruger 6891bc3e46SScott Kruger print("#\n# To rerun failed tests: ") 69*3054ff8cSScott Kruger print("# "+make+" -f "+makefile+" test search='" + fail_targets.strip()+"'") 708ccd5183SScott Kruger return 718ccd5183SScott Kruger 728ccd5183SScott Krugerdef main(): 738ccd5183SScott Kruger parser = optparse.OptionParser(usage="%prog [options]") 748ccd5183SScott Kruger parser.add_option('-d', '--directory', dest='directory', 758ccd5183SScott Kruger help='Directory containing results of petsc test system', 768ccd5183SScott Kruger default='counts') 77*3054ff8cSScott Kruger parser.add_option('-m', '--make', dest='make', 78*3054ff8cSScott Kruger help='make executable to report in summary', 79*3054ff8cSScott Kruger default='make') 808ccd5183SScott Kruger options, args = parser.parse_args() 818ccd5183SScott Kruger 828ccd5183SScott Kruger # Process arguments 838ccd5183SScott Kruger if len(args) > 0: 848ccd5183SScott Kruger parser.print_usage() 858ccd5183SScott Kruger return 868ccd5183SScott Kruger 87*3054ff8cSScott Kruger summarize_results(options.directory,options.make) 888ccd5183SScott Kruger 898ccd5183SScott Krugerif __name__ == "__main__": 908ccd5183SScott Kruger main() 91