# Copyright 2020 The Fuchsia 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/host.gni")
import("//build/testing/host_test.gni")
import("//build/testing/host_test_data.gni")

# Defines a golden test for `fx create`.
#
# Generates a test project with the same name as the target name,
# and compares the output with a golden project.
#
# Parameters
#
#   project_type (required)
#     The type of project to create. See `fx create --help`.
#
#   language (required)
#     The programming language to use when generating the project.
#
#   golden_files (required)
#     The list of all files in the golden project. These will be compared against
#     the output of running the `fx create` tool.
#
# Example of usage:
#
#   golden_test("my-component-v2-cpp") {
#     project_type = "component-v2"
#     language = "cpp"
#     golden_files = [
#       "my-component-v2-cpp/BUILD.gn",
#       "my-component-v2-cpp/main.cc",
#       # ...
#     ]
#   }
#
template("golden_test") {
  forward_variables_from(invoker,
                         [
                           "project_type",
                           "language",
                         ])
  assert(defined(project_type), "project_type is required")
  assert(defined(language), "language is required")
  assert(defined(invoker.golden_files), "golden_files is required")

  test_dir = "${target_gen_dir}/${target_name}"

  # Copy golden files to the out directory so that the test can have access to them.
  target_copy_goldens = "${target_name}_copy_goldens"
  host_test_data(target_copy_goldens) {
    sources = invoker.golden_files
    outputs = [ "${test_dir}/{{source_target_relative}}" ]
  }

  # Write the list of golden files to a JSON file. GN is not hermetic, so the test script needs
  # to know which files are part of the test.
  target_goldens_json = "${target_name}_goldens_json"
  generated_file(target_goldens_json) {
    testonly = true
    outputs = [ "${test_dir}/goldens.json" ]
    contents = rebase_path(get_target_outputs(":${target_copy_goldens}"),
                           root_build_dir)
    deps = [ ":${target_copy_goldens}" ]
    output_conversion = "json"

    # Include the generated file as a test dependency.
    # Automated infrastructure only makes available what has been explicitly marked as a
    # test dependency.
    metadata = {
      test_runtime_deps = outputs
    }
  }

  # Copy the test script, into this test's gen directory, making it easier to
  # find the .deps.json file relatively.
  target_test_script = "${target_name}_test_script"
  host_test_data(target_test_script) {
    sources = [ "//tools/create/goldens/test_script.py" ]
    outputs = [ "${test_dir}/test_script.py" ]

    # The test script invokes the create tool.
    deps = [
      ":${target_goldens_json}",
      "//tools/create:install",
    ]

    # Include the host tool as a test dependency.
    # Automated infrastructure only makes available what has been explicitly marked as a
    # test dependency.
    metadata = {
      test_runtime_deps = [ "${host_tools_dir}/create" ]
    }
  }

  # The first argument is the path to the `fx create` binary, relative to the root build directory.
  test_args = [ rebase_path("${host_tools_dir}/create", root_build_dir) ]

  # The next argument is the path to the generated runtime dependecy JSON file. This includes
  # all files visible to the test. These include the golden project files.
  test_args += [ rebase_path("${test_dir}/goldens.json", root_build_dir) ]

  # `fx create` arguments.
  test_args += [
    project_type,
    target_name,
    "--lang",
    language,
    "--override-project-path",
    rebase_path(".", "//"),  # Strips the path to the directory of the currently
                             # executing BUILD.gn file of the // prefix
    "--override-copyright-year",  # Keeps tests hermetic. Don't want tests
                                  # failing in the new year.
    "2020",
    "--silent",
  ]

  # Generate a test target, so that this test can be executed with `fx test`.
  host_test(target_name) {
    binary_path = "${test_dir}/test_script.py"
    args = test_args
    deps = [ ":${target_test_script}" ]
  }
}
