Home | History | Annotate | Download | only in android
      1 #!/usr/bin/env python
      2 
      3 # Copyright 2013 The Chromium Authors. All rights reserved.
      4 # Use of this source code is governed by a BSD-style license that can be
      5 # found in the LICENSE file.
      6 
      7 """Aggregates EMMA coverage files to produce html output."""
      8 
      9 import fnmatch
     10 import json
     11 import optparse
     12 import os
     13 import sys
     14 
     15 from pylib import cmd_helper
     16 from pylib import constants
     17 
     18 
     19 def _GetFilesWithExt(root_dir, ext):
     20   """Gets all files with a given extension.
     21 
     22   Args:
     23     root_dir: Directory in which to search for files.
     24     ext: Extension to look for (including dot)
     25 
     26   Returns:
     27     A list of absolute paths to files that match.
     28   """
     29   files = []
     30   for root, _, filenames in os.walk(root_dir):
     31     basenames = fnmatch.filter(filenames, '*.' + ext)
     32     files.extend([os.path.join(root, basename)
     33                   for basename in basenames])
     34 
     35   return files
     36 
     37 
     38 def main():
     39   option_parser = optparse.OptionParser()
     40   option_parser.add_option('--output', help='HTML output filename.')
     41   option_parser.add_option('--coverage-dir', default=None,
     42                            help=('Root of the directory in which to search for '
     43                                  'coverage data (.ec) files.'))
     44   option_parser.add_option('--metadata-dir', default=None,
     45                            help=('Root of the directory in which to search for '
     46                                  'coverage metadata (.em) files.'))
     47   option_parser.add_option('--cleanup', action='store_true',
     48                            help=('If set, removes coverage files generated at '
     49                                  'runtime.'))
     50   options, _ = option_parser.parse_args()
     51 
     52   if not (options.coverage_dir and options.metadata_dir and options.output):
     53     option_parser.error('One or more mandatory options are missing.')
     54 
     55   coverage_files = _GetFilesWithExt(options.coverage_dir, 'ec')
     56   metadata_files = _GetFilesWithExt(options.metadata_dir, 'em')
     57   print 'Found coverage files: %s' % str(coverage_files)
     58   print 'Found metadata files: %s' % str(metadata_files)
     59 
     60   sources = []
     61   for f in metadata_files:
     62     sources_file = os.path.splitext(f)[0] + '_sources.txt'
     63     with open(sources_file, 'r') as sf:
     64       sources.extend(json.load(sf))
     65   sources = [os.path.join(constants.DIR_SOURCE_ROOT, s) for s in sources]
     66   print 'Sources: %s' % sources
     67 
     68   input_args = []
     69   for f in coverage_files + metadata_files:
     70     input_args.append('-in')
     71     input_args.append(f)
     72 
     73   output_args = ['-Dreport.html.out.file', options.output]
     74   source_args = ['-sp', ','.join(sources)]
     75 
     76   exit_code = cmd_helper.RunCmd(
     77       ['java', '-cp',
     78        os.path.join(constants.ANDROID_SDK_ROOT, 'tools', 'lib', 'emma.jar'),
     79        'emma', 'report', '-r', 'html']
     80       + input_args + output_args + source_args)
     81 
     82   if options.cleanup:
     83     for f in coverage_files:
     84       os.remove(f)
     85 
     86   return exit_code
     87 
     88 
     89 if __name__ == '__main__':
     90   sys.exit(main())
     91