# Copyright 2020 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/rules.gni")

declare_args() {
  # Used by tests to enable generating build files for GN targets which should
  # not compile.
  enable_android_nocompile_tests = false
}

# Defines a test suite which checks that the 'test targets' fail to compile. The
# test suite runs 'gn gen' with a custom output directory and attempts to compile
# each test target.
#
# All of the tests should be defined in the same dedicated BUILD.gn file in order
# to minimize the number of targets that are processed by 'gn gen'.
#
# Variables
#   tests: List of test configurations. A test configuration has the following
#     keys:
#     'target': The GN target which should not compile when
#       enable_android_nocompile_tests=true The target should compile when
#       enable_android_nocompile_tests=false.
#     'expected_compile_output_regex': Error message regex to search for when compile fails.
#     'nocompile_sources': Source files which do not compile. This ensures that
#       the test suite is re-run when one of these files change (as the test
#       targets might not depend of the files when
#       enable_android_nocompile_tests=false).
template("android_nocompile_test_suite") {
  assert(!enable_android_nocompile_tests)

  action(target_name) {
    testonly = true
    script = "//build/android/gyp/nocompile_test.py"

    _tests = invoker.tests
    _test0 = _tests[0]
    _test0_dir = get_label_info(_test0["target"], "dir")
    foreach(_test_config, _tests) {
      assert(
          _test0_dir == get_label_info(_test_config["target"], "dir"),
          "To avoid running 'gn gen' for each test, all tests in an android_nocompile_test_suite() should be declared in same BUILD.gn file")
    }

    deps = []
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    inputs = []
    if (defined(invoker.pydeps)) {
      foreach(_pydeps_file, invoker.pydeps) {
        _pydeps_file_lines = read_file(_pydeps_file, "list lines")
        _pydeps_entries = filter_exclude(_pydeps_file_lines, [ "#*" ])
        _pydeps_file_dir = get_path_info(_pydeps_file, "dir")
        inputs += rebase_path(_pydeps_entries, ".", _pydeps_file_dir)
      }
    }

    sources = []
    _json_test_configs = []
    foreach(_test_config, _tests) {
      _test = _test_config["target"]
      deps += [ _test ]
      sources += _test_config["nocompile_sources"]
      _dep_dir = get_label_info(_test, "dir")
      _dep_name = get_label_info(_test, "name")
      _json_test_configs += [
        {
          target = "${_dep_dir}:${_dep_name}"
          expect_regex = _test_config["expected_compile_output_regex"]
        },
      ]
    }

    _config_path = "$target_gen_dir/${target_name}.nocompile_config"
    write_file(_config_path, _json_test_configs, "json")

    _stamp_path = "${target_gen_dir}/${target_name}.stamp"
    args = [
      "--gn-args-path",
      "args.gn",
      "--out-dir",
      rebase_path("${target_out_dir}/${target_name}/nocompile_out",
                  root_build_dir),
      "--test-configs-path",
      rebase_path(_config_path, root_build_dir),
      "--stamp",
      rebase_path(_stamp_path, root_build_dir),
    ]
    inputs += [ _config_path ]
    outputs = [ _stamp_path ]
  }
}
