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