# Copyright 2019 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/android/internal_rules.gni")

# Generates a script in the bin directory that runs
# //build/android/resource_sizes.py against the provided apk.
#
# Only one of apk_name or file_path should be provided.
#
# Variables:
#   apk_name: The name of the apk, without the extension.
#   file_path: The path to the apk or .minimal.apks.
#   trichrome_chrome_path: The path to chrome apk or .minimal.apks.
#   trichrome_webview_path: The path to webview apk or .minimal.apks.
#   trichrome_library_path: The path to library apk or .minimal.apks.
template("android_resource_sizes_test") {
  generate_android_wrapper(target_name) {
    forward_variables_from(invoker, [ "data_deps" ])
    executable = "//build/android/resource_sizes.py"
    wrapper_script = "$root_out_dir/bin/run_${target_name}"

    assert(defined(invoker.apk_name) != defined(invoker.file_path),
           "Exactly one of apk_name or file_path should be provided.")

    deps = [ "//build/android:resource_sizes_py" ]
    executable_args = [
      "--output-format",
      "histograms",
      "--chromium-output-directory",
      "@WrappedPath(.)",
    ]

    data = [
      "//.vpython",
      "//.vpython3",
    ]
    if (defined(invoker.trichrome_chrome_path)) {
      data += [
        invoker.trichrome_chrome_path,
        invoker.trichrome_webview_path,
        invoker.trichrome_library_path,
      ]
      _rebased_chrome =
          rebase_path(invoker.trichrome_chrome_path, root_build_dir)
      _rebased_webview =
          rebase_path(invoker.trichrome_webview_path, root_build_dir)
      _rebased_library =
          rebase_path(invoker.trichrome_library_path, root_build_dir)

      # apk_name used only as test suite name. Not a path in this case.
      executable_args += [
        "--trichrome-chrome",
        "@WrappedPath(${_rebased_chrome})",
        "--trichrome-webview",
        "@WrappedPath(${_rebased_webview})",
        "--trichrome-library",
        "@WrappedPath(${_rebased_library})",
        "${invoker.apk_name}",
      ]
    } else {
      if (defined(invoker.apk_name)) {
        _file_path = "$root_out_dir/apks/${invoker.apk_name}.apk"
        data += [ "$root_out_dir/arsc/apks/${invoker.apk_name}.ap_" ]
      } else if (defined(invoker.file_path)) {
        _file_path = invoker.file_path
      }
      data += [ _file_path ]
      _rebased_file_path = rebase_path(_file_path, root_build_dir)
      executable_args += [ "@WrappedPath(${_rebased_file_path})" ]
    }
  }
}

# Generates a "size config JSON file" to specify data to be passed from recipes
# to Python scripts for binary size measurement on bots. All filenames are
# relative to $root_build_dir. The resulting JSON file is written to
# "$root_build_dir/config/${invoker.name}_size_config.json".
#
# Variables:
#   name: The name of the path to the generated size config JSON file.
#   mapping_files: List of mapping files.
#   to_resource_sizes_py: Scope containing data to pass to resource_sizes.py,
#     processed by generate_commit_size_analysis.py.
#   supersize_input_file: Main input for SuperSize.
template("android_size_bot_config") {
  _full_target_name = get_label_info(target_name, "label_no_toolchain")
  _out_json = {
    _HEADER = "Written by build target '${_full_target_name}'"
    forward_variables_from(invoker,
                           [
                             "mapping_files",
                             "to_resource_sizes_py",
                             "supersize_input_file",
                           ])
  }
  _output_json_path = "$root_build_dir/config/${invoker.name}_size_config.json"
  write_file(_output_json_path, _out_json, "json")
}
