# 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/config.gni")

# Defines a golden file test to be executed during the build. Fails
# if `golden`'s contents aren't equal to `current`'s.
#
# If the `bless_goldens` build arg is true, updates the current file
# rather than failing the action.
#
# For more complex golden testing, see //build/testing/golden_test.gni.
#
# Parameters
#   golden (required)
#     Path to the canonical file.
#
#   current (required)
#     Path to the file under test.
#
#   warn_on_changes (default: false)
#     If true, mismatches are treated as warnings rather than errors.
template("golden_file") {
  assert(defined(invoker.golden), "golden is a required parameter")
  assert(defined(invoker.current), "current is a required parameter")

  action(target_name) {
    forward_variables_from(invoker, "*")

    script = "//build/testing/verify_golden_file.py"

    stamp_file = "$target_gen_dir/$target_name.verified"

    inputs = [
      current,
      golden,
    ]

    outputs = [ stamp_file ]

    args = [
      "--golden",
      rebase_path(golden, root_build_dir),
      "--current",
      rebase_path(current, root_build_dir),
      "--stamp",
      rebase_path(stamp_file, root_build_dir),
    ]

    if (bless_goldens) {
      args += [ "--bless" ]
    }

    warn_on_changes =
        defined(invoker.warn_on_changes) && invoker.warn_on_changes
    if (warn_on_changes) {
      args += [ "--warn" ]
    }
  }
}
