# Copyright 2022 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/assembly/assembled_system.gni")
import("//build/components/fuchsia_package.gni")
import("//build/config.gni")
import("//build/testing/host_test_data.gni")

# `assembled_system` needs at least one package in base_packages.
fuchsia_package("empty-pkg") {
  testonly = true
  package_name = "empty-pkg"
}

config_data("empty_config") {
  for_pkg = "empty-pkg"
  sources = [ "empty_config" ]
  outputs = [ "empty/{{source_file_part}}" ]
}

# `assembled_system` builds a zbi and blob.blk for consumption by the test.
_assemble_system_target_name = "assembly"
assembled_system(_assemble_system_target_name) {
  testonly = true
  bootfs_labels = []
  base_packages = [
    ":empty-pkg",
    ":empty_config",
  ]
}

# `assembled_system` builds a zbi, specifying `ramdisk_fvm_in_zbi = true`
# tests the path where the blobfs exists in the zbi and is automatically
# extracted as part of the zbi, such as in recovery images.
_assemble_system_recovery_target_name = "assembly_recovery"
assembled_system(_assemble_system_recovery_target_name) {
  testonly = true
  bootfs_labels = []
  ramdisk_fvm_in_zbi = true
  base_packages = [
    ":empty-pkg",
    ":empty_config",
  ]
}

if (is_host) {
  host_test_data("testdata") {
    deps = [
      ":${_assemble_system_recovery_target_name}.image_assembler($target_toolchain)",
      ":${_assemble_system_target_name}.image_assembler($target_toolchain)",
    ]
    sources = [
      get_label_info(
              ":${_assemble_system_target_name}.image_assembler($target_toolchain)",
              "target_out_dir") + "/${_assemble_system_target_name}/blob.blk",
      get_label_info(
              ":${_assemble_system_target_name}.image_assembler($target_toolchain)",
              "target_out_dir") + "/${_assemble_system_target_name}/${_assemble_system_target_name}.zbi",
      get_label_info(
              ":${_assemble_system_recovery_target_name}.image_assembler($target_toolchain)",
              "target_out_dir") + "/${_assemble_system_recovery_target_name}/${_assemble_system_recovery_target_name}.zbi",
    ]
    outputs = [ "$target_out_dir/testdata/{{source_file_part}}" ]

    metadata = {
      package_barrier = []
    }
  }

  # Required for the test to be able to call ffx.
  host_test_data("copy_host_tools") {
    sources = [ "${host_tools_dir}/ffx" ]
    deps = [ "//src/developer/ffx:host($host_toolchain)" ]
    outputs = [ "$target_out_dir/host_tools/{{source_file_part}}" ]
  }

  config("config") {
    testdata_out_dir =
        get_label_info(":testdata($host_toolchain)", "target_out_dir")
    host_tools_out_dir =
        get_label_info(":copy_host_tools($host_toolchain)", "target_out_dir")
    ffx_path = "$host_tools_out_dir/host_tools/ffx"
    blobfs_path = "$testdata_out_dir/testdata/blob.blk"
    zbi_path = "$testdata_out_dir/testdata/${_assemble_system_target_name}.zbi"
    recovery_zbi_path = "$testdata_out_dir/testdata/${_assemble_system_recovery_target_name}.zbi"

    rustenv = [
      "FFX_TOOL_PATH=" + rebase_path(ffx_path, root_build_dir),
      "BLOBFS_PATH=" + rebase_path(blobfs_path, root_build_dir),
      "ZBI_PATH=" + rebase_path(zbi_path, root_build_dir),
      "RECOVERY_ZBI_PATH=" + rebase_path(recovery_zbi_path, root_build_dir),
    ]
  }

  rustc_test("test") {
    source_root = "src/lib.rs"
    edition = "2018"
    deps = [
      ":copy_host_tools($host_toolchain)",
      ":testdata($host_toolchain)",
      "//third_party/rust_crates:tempfile",
    ]

    # TODO(fxbug.dev/86506): Remove when clippy supports envars
    disable_clippy = true
    sources = [ "src/lib.rs" ]
    configs += [ ":config" ]

    # TODO(fxbug.dev/97055): LSAN says that Scrutiny has a leak, disable this test in ASAN
    if (is_asan) {
      test_environments = []
    }
  }
}

group("tests") {
  testonly = true
  deps = [ ":test($host_toolchain)" ]
}
