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

import("//build/dev.gni")
import("//src/developer/ffx/build/ffx_action.gni")

# Check the bootfs filelist extracted from ZBI against a golden file.
#
# Parameters
#
#   zbi_is_signed (required)
#     [boolean] Whether the ZBI from assembly is signed.
#
#   image_assembler_target (required)
#     [string] The target that assembles system images, including the system
#     blobfs archive file.
#
#   assembly_image_name (required)
#     [string] The image_name designated in the system assembly associated with
#     image_assembler_target.
#
#   goldens (required)
#     [list of strings] Path to a list of golden files that contain golden
#     bootfs file list in the format of one file name per line. The actual
#     bootfs filelist must match either one of the goldens. There should be only
#     one golden file in this list for normal case and two golden files, one for
#     the old golden file, one for the new golden file during a soft transition.
#
#   deps, public_deps, data_deps (optional)
#     Usual GN meaning.

template("verify_bootfs_filelist") {
  assert(defined(invoker.zbi_is_signed),
         "verify_bootfs_filelist() must specify zbi_is_signed")
  assert(defined(invoker.image_assembler_target),
         "verify_bootfs_filelist() must specify image_assembler_target")
  assert(defined(invoker.assembly_image_name),
         "verify_bootfs_filelist() must specify assembly_image_name")
  assert(defined(invoker.goldens),
         "verify_bootfs_filelist() must specify goldens")

  image_assembler_target_out_dir =
      get_label_info(invoker.image_assembler_target, "target_out_dir")
  assembly_image_name = invoker.assembly_image_name
  image_assembler_dir = "$image_assembler_target_out_dir/$assembly_image_name"

  if (invoker.zbi_is_signed) {
    zbi = "$image_assembler_dir/$assembly_image_name.zbi.signed"
  } else {
    zbi = "$image_assembler_dir/$assembly_image_name.zbi"
  }

  ffx_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "deps",
                             "public_deps",
                             "data_deps",
                             "visibility",
                           ])
    stamp_file = "$target_gen_dir/$target_name.verified"
    depfile = "$target_gen_dir/$target_name.d"

    inputs = [ zbi ] + invoker.goldens

    outputs = [ stamp_file ]

    args = [
      "scrutiny",
      "verify",
      "--depfile",
      rebase_path(depfile, root_build_dir),
      "--stamp",
      rebase_path(stamp_file, root_build_dir),
      "bootfs",
      "--zbi",
      rebase_path(zbi, root_build_dir),
    ]
    foreach(golden, invoker.goldens) {
      args += [
        "--golden",
        rebase_path(golden, root_build_dir),
      ]
    }

    if (!defined(invoker.deps)) {
      deps = []
    }
    deps += [ invoker.image_assembler_target ]
  }
}
