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

# Declares a golden test.
#
# This template creates a test to verify that certain generated files match
# golden copies checked into the source tree. When invoked with the --regen
# flag, the test instead overwrites the golden files with freshly generated
# copies, guaranteeing that the next test run will pass.
#
# For simpler, single-file golden testing that executes during the build, see
# //build/testing/golden_file.gni.
#
# Example
# ```
# golden_test("foo_golden_tests") {
#   goldens_dir = "goldens"
#   deps = [ ":generate_json" ]
#   entries = [
#     {
#       golden = "out.json.golden"
#       generated = "$target_gen_dir/foo_out.json"
#     },
#   ]
# }
# ```
#
# Setup
# ```
# $ $EDITOR BUILD.gn  # add the example code above
# $ mkdir goldens
# $ touch goldens/goldens.txt
# $ fx test foo_golden_tests -- --regen
# Regenerating goldens in /path/to/your/goldens
# ...
# $ fx test foo_golden_tests
# ...
# PASS
# ```
#
# Parameters
#
#   goldens_dir (required)
#     Directory of golden files, relative to the invoking BUILD.gn file. Must
#     contain a goldens.txt file. Each file path listed in goldens.txt must
#     exist, otherwise a gen-time error is produced.
#
#   entries (required)
#     List of scopes, each with `golden` and `generated` fields. The `golden`
#     field is a file path relative to `goldens_dir`. The `generated` field is
#     an absolute path to the corresponding generated file, which must be
#     produced by one of the targets in `deps`.
#
#   deps (required)
#   visibility
#
template("golden_test") {
  not_needed(invoker,
             [
               "testonly",
               "public_deps",
             ])
  assert(defined(invoker.goldens_dir))
  assert(defined(invoker.entries))
  assert(defined(invoker.deps))

  copied_goldens_prefix = "$target_gen_dir/${target_name}_"
  copied_goldens_dir = copied_goldens_prefix + invoker.goldens_dir
  manifest_file = "$target_gen_dir/${target_name}_manifest.json"

  # Copy golden files from the source tree so the test can access them. Also
  # copy the goldens.txt file itself to ensure the test fails when golden files
  # are removed (it won't just use copies that are still lying around).
  target_copy_goldens = "${target_name}_copy_goldens"
  host_test_data(target_copy_goldens) {
    visibility = [ ":*" ]
    sources = rebase_path(
            [ "goldens.txt" ] +
                read_file("${invoker.goldens_dir}/goldens.txt", "list lines"),
            ".",
            "${invoker.goldens_dir}")
    outputs = [ copied_goldens_prefix + "{{source_target_relative}}" ]
  }

  # Generate the manifest file.
  target_generate_manifest = "${target_name}_generate_manifest"
  generated_file(target_generate_manifest) {
    visibility = [ ":*" ]
    testonly = true
    contents = {
      test_goldens_dir = rebase_path(copied_goldens_dir, root_build_dir)
      regen_goldens_dir = rebase_path(invoker.goldens_dir, root_build_dir)
      entries = []
    }
    foreach(entry, invoker.entries) {
      assert(get_path_info(entry.golden, "extension") == "golden",
             "Golden filename '${entry.golden}' does not end in '.golden'")
      contents.entries += [
        {
          golden = entry.golden
          generated = rebase_path(entry.generated, root_build_dir)
        },
      ]
    }
    outputs = [ manifest_file ]
    output_conversion = "json"
  }

  # Allow the test to access the manifest file and generated files.
  target_generated_files = "${target_name}_generated_files"
  host_test_data(target_generated_files) {
    visibility = [ ":*" ]
    sources = [ manifest_file ]
    foreach(entry, invoker.entries) {
      sources += [ entry.generated ]
    }
    deps = [ ":$target_generate_manifest" ] + invoker.deps
  }

  # Generate a test target, so that this test can be executed with `fx test`.
  host_test(target_name) {
    forward_variables_from(invoker, [ "visibility" ])
    binary_path = "$root_out_dir/golden-util"
    args = [
      "--manifest",
      rebase_path(manifest_file, root_build_dir),
    ]
    deps = [
      ":$target_copy_goldens",
      ":$target_generated_files",
      "//tools/golden-util",
    ]
  }
}
