| # Copyright 2011 Google Inc. All Rights Reserved. |
| # Author: [email protected] (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) |