xref: /aosp_15_r20/external/cronet/testing/merge_scripts/code_coverage/merge_js_results.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 json
12import logging
13import os
14import subprocess
15import sys
16
17import merge_lib as profile_merger
18import merge_js_lib as javascript_merger
19
20
21def _MergeAPIArgumentParser(*args, **kwargs):
22    parser = argparse.ArgumentParser(*args, **kwargs)
23    parser.add_argument('--task-output-dir', help=argparse.SUPPRESS)
24    parser.add_argument('--javascript-coverage-dir',
25                        help='directory for JavaScript coverage data')
26    parser.add_argument('--chromium-src-dir',
27                        help='directory for chromium/src checkout')
28    parser.add_argument(
29        '--build-dir',
30        help='directory for the build directory in chromium/src')
31    return parser
32
33
34def main():
35    parser = _MergeAPIArgumentParser()
36    params = parser.parse_args()
37
38    parsed_scripts = javascript_merger.write_parsed_scripts(
39        params.task_output_dir)
40
41    # Ensure JavaScript coverage dir exists.
42    if not os.path.exists(params.javascript_coverage_dir):
43        os.makedirs(params.javascript_coverage_dir)
44
45    if not parsed_scripts:
46        logging.warning('No parsed scripts written')
47        return
48
49    logging.info('Raw parsed scripts written out to %s', parsed_scripts)
50    coverage_dirs = javascript_merger.get_raw_coverage_dirs(
51        params.task_output_dir)
52    logging.info('Identified directories containing coverage %s',
53                 coverage_dirs)
54
55    try:
56        logging.info('Converting raw coverage to istanbul')
57        javascript_merger.convert_raw_coverage_to_istanbul(
58            coverage_dirs, parsed_scripts, params.task_output_dir)
59
60        istanbul_coverage_dir = os.path.join(params.task_output_dir,
61                                             'istanbul')
62        output_dir = os.path.join(istanbul_coverage_dir, 'merged')
63        os.makedirs(output_dir, exist_ok=True)
64
65        coverage_file_path = os.path.join(output_dir, 'coverage.json')
66        logging.info('Merging istanbul reports to %s', coverage_file_path)
67        javascript_merger.merge_istanbul_reports(istanbul_coverage_dir,
68                                                 parsed_scripts,
69                                                 coverage_file_path)
70
71        logging.info('Excluding uninteresting lines from coverage')
72        javascript_merger.exclude_uninteresting_lines(coverage_file_path)
73
74        logging.info(
75            'Remapping all paths relative to the src dir and removing any ' +
76            'files in the out dir')
77        javascript_merger.remap_paths_to_relative(coverage_file_path,
78                                                  params.chromium_src_dir,
79                                                  params.build_dir)
80
81        logging.info('Creating lcov report at %s',
82                     params.javascript_coverage_dir)
83        javascript_merger.generate_coverage_reports(
84            output_dir, params.javascript_coverage_dir)
85    except RuntimeError as e:
86        logging.warning('Failed executing istanbul tasks: %s', e)
87
88
89if __name__ == '__main__':
90    logging.basicConfig(format='[%(asctime)s %(levelname)s] %(message)s',
91                        level=logging.INFO)
92    sys.exit(main())
93