# 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"

    result_file = "$target_gen_dir/$target_name.verified"

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

    outputs = [ result_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 += [
      "--result-file",
      rebase_path(result_file, root_build_dir),
      rebase_path(invoker.first, root_build_dir),
      rebase_path(invoker.second, root_build_dir),
    ]
  }
}
