# Copyright 2011 Google Inc. All Rights Reserved. # Author: kbaclawski@google.com (Krystian Baclawski) # from contextlib import contextmanager import glob from itertools import chain import logging import optparse import os.path import sys from manifest import Manifest import report from summary import DejaGnuTestRun def ExpandGlobExprList(paths): """Returns an iterator that goes over expanded glob paths.""" return chain.from_iterable(map(glob.glob, paths)) @contextmanager def OptionChecker(parser): """Provides scoped environment for command line option checking.""" try: yield except SystemExit as ex: parser.print_help() print '' sys.exit('ERROR: %s' % str(ex)) def ManifestCommand(argv): parser = optparse.OptionParser( description= ('Read in one or more DejaGNU summary files (.sum), parse their ' 'content and generate manifest files. Manifest files store a list ' 'of failed tests that should be ignored. Generated files are ' 'stored in current directory under following name: ' '${tool}-${board}.xfail (e.g. "gcc-unix.xfail").'), usage='Usage: %prog manifest [file.sum] (file2.sum ...)') _, args = parser.parse_args(argv[2:]) with OptionChecker(parser): if not args: sys.exit('At least one *.sum file required.') for filename in chain.from_iterable(map(glob.glob, args)): test_run = DejaGnuTestRun.FromFile(filename) manifest = Manifest.FromDejaGnuTestRun(test_run) manifest_filename = '%s-%s.xfail' % (test_run.tool, test_run.board) with open(manifest_filename, 'w') as manifest_file: manifest_file.write(manifest.Generate()) logging.info('Wrote manifest to "%s" file.', manifest_filename) def ReportCommand(argv): parser = optparse.OptionParser( description= ('Read in one or more DejaGNU summary files (.sum), parse their ' 'content and generate a single report file in selected format ' '(currently only HTML).'), usage=('Usage: %prog report (-m manifest.xfail) [-o report.html] ' '[file.sum (file2.sum ...)')) parser.add_option( '-o', dest='output', type='string', default=None, help=('Suppress failures for test listed in provided manifest files. ' '(use -m for each manifest file you want to read)')) parser.add_option( '-m', dest='manifests', type='string', action='append', default=None, help=('Suppress failures for test listed in provided manifest files. ' '(use -m for each manifest file you want to read)')) opts, args = parser.parse_args(argv[2:]) with OptionChecker(parser): if not args: sys.exit('At least one *.sum file required.') if not opts.output: sys.exit('Please provide name for report file.') manifests = [] for filename in ExpandGlobExprList(opts.manifests or []): logging.info('Using "%s" manifest.', filename) manifests.append(Manifest.FromFile(filename)) test_runs = [DejaGnuTestRun.FromFile(filename) for filename in chain.from_iterable(map(glob.glob, args))] html = report.Generate(test_runs, manifests) if html: with open(opts.output, 'w') as html_file: html_file.write(html) logging.info('Wrote report to "%s" file.', opts.output) else: sys.exit(1) def HelpCommand(argv): sys.exit('\n'.join([ 'Usage: %s command [options]' % os.path.basename(argv[ 0]), '', 'Commands:', ' manifest - manage files containing a list of suppressed test failures', ' report - generate report file for selected test runs' ])) def Main(argv): try: cmd_name = argv[1] except IndexError: cmd_name = None cmd_map = {'manifest': ManifestCommand, 'report': ReportCommand} cmd_map.get(cmd_name, HelpCommand)(argv) if __name__ == '__main__': FORMAT = '%(asctime)-15s %(levelname)s %(message)s' logging.basicConfig(format=FORMAT, level=logging.INFO) Main(sys.argv)