# Copyright 2021 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.

# Defines a build-time test that verifies that two files have the same
# contents.
#
# Meant to be used during build migrations to ensure that two different
# actions are producing files with the same contents.  Similar to the
# golden_file template, but with slightly different arguments and error
# messages to better convey why it's caused a build failure.
#
# Parameters
#   first  (required)
#     Path to the first file.
#
#   second (required)
#     Path to the second file.
#
#   display_text_diff_on_failure (optional)
#     If true, this displays the results of a diff on the files to show what the
#     difference is.  Defaults to false.
#
#   custom_error_message (optional)
#     A custom error message to display to the user.
#
#   Usual meanings (all invoker vars are forwarded)
#     deps
#     testonly
#     etc.
template("verify_files_match") {
  assert(defined(invoker.first), "first is a required parameter")
  assert(defined(invoker.second), "second is a required parameter")

  action(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "first",
                             "second",
                           ])

    if (!defined(display_text_diff_on_failure)) {
      display_text_diff_on_failure = false
    }

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

    stamp_file = "$target_gen_dir/$target_name.verified"

    inputs = [
      invoker.first,
      invoker.second,
    ]

    outputs = [ stamp_file ]

    args = []
    if (display_text_diff_on_failure) {
      args += [ "--diff-on-failure" ]
    }

    if (defined(custom_error_message)) {
      args += [ "--custom-error-message" ]
      args += [ custom_error_message ]
    }

    args += [
      "--stamp",
      rebase_path(stamp_file, root_build_dir),
      rebase_path(invoker.first, root_build_dir),
      rebase_path(invoker.second, root_build_dir),
    ]
  }
}
