• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2# Copyright 2022 The Chromium Authors
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5"""Merge javascript results from code-coverage/pgo swarming runs.
6
7Called by merge_results.py
8"""
9
10import argparse
11import logging
12import os
13import sys
14
15import merge_js_lib as javascript_merger
16
17
18def _MergeAPIArgumentParser(*args, **kwargs):
19  parser = argparse.ArgumentParser(*args, **kwargs)
20  parser.add_argument('--task-output-dir', help=argparse.SUPPRESS)
21  parser.add_argument('--javascript-coverage-dir',
22                      help='directory for JavaScript coverage data')
23  parser.add_argument('--chromium-src-dir',
24                      help='directory for chromium/src checkout')
25  parser.add_argument('--build-dir',
26                      help='directory for the build directory in chromium/src')
27  return parser
28
29
30def main():
31  parser = _MergeAPIArgumentParser()
32  params = parser.parse_args()
33
34  parsed_scripts = javascript_merger.write_parsed_scripts(
35      params.task_output_dir)
36
37  # Ensure JavaScript coverage dir exists.
38  if not os.path.exists(params.javascript_coverage_dir):
39    os.makedirs(params.javascript_coverage_dir)
40
41  if not parsed_scripts:
42    logging.warning('No parsed scripts written')
43    return
44
45  logging.info('Raw parsed scripts written out to %s', parsed_scripts)
46  coverage_dirs = javascript_merger.get_raw_coverage_dirs(
47      params.task_output_dir)
48  logging.info('Identified directories containing coverage %s', coverage_dirs)
49
50  try:
51    logging.info('Converting raw coverage to istanbul')
52    javascript_merger.convert_raw_coverage_to_istanbul(coverage_dirs,
53                                                       parsed_scripts,
54                                                       params.task_output_dir)
55
56    istanbul_coverage_dir = os.path.join(params.task_output_dir, 'istanbul')
57    output_dir = os.path.join(istanbul_coverage_dir, 'merged')
58    os.makedirs(output_dir, exist_ok=True)
59
60    coverage_file_path = os.path.join(output_dir, 'coverage.json')
61    logging.info('Merging istanbul reports to %s', coverage_file_path)
62    javascript_merger.merge_istanbul_reports(istanbul_coverage_dir,
63                                             parsed_scripts, coverage_file_path)
64
65    logging.info('Excluding uninteresting lines from coverage')
66    javascript_merger.exclude_uninteresting_lines(coverage_file_path)
67
68    logging.info('Remapping all paths relative to the src dir and removing any '
69                 'files in the out dir')
70    javascript_merger.remap_paths_to_relative(coverage_file_path,
71                                              params.chromium_src_dir,
72                                              params.build_dir)
73
74    logging.info('Creating lcov report at %s', params.javascript_coverage_dir)
75    javascript_merger.generate_coverage_reports(output_dir,
76                                                params.javascript_coverage_dir)
77  except RuntimeError as e:
78    logging.warning('Failed executing istanbul tasks: %s', e)
79
80
81if __name__ == '__main__':
82  logging.basicConfig(format='[%(asctime)s %(levelname)s] %(message)s',
83                      level=logging.INFO)
84  sys.exit(main())
85