You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
3.9 KiB
137 lines
3.9 KiB
# 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)
|
|
|