xref: /petsc/config/report_tests.py (revision 3054ff8c8608fe5b7d6c36555b3fa04461f9bd5f)
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