# Copyright 2019 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/components.gni")
import("//build/config.gni")
import("//build/test.gni")
import("//build/testing/environments.gni")
import("//zircon/system/ulib/devmgr-integration-test/isolated_devmgr.gni")

source_set("lib") {
  sources = [
    "factory_reset.cc",
    "factory_reset.h",
  ]

  public_deps = [
    # <factory_reset.h> has #include <fuchsia/recovery/cpp/fidl.h>
    "//sdk/fidl/fuchsia.recovery",

    # <factory_reset.h> has #include <fuchsia/hardware/power/statecontrol/cpp/fidl.h>
    "//sdk/fidl/fuchsia.hardware.power.statecontrol",

    # <factory_reset.h> has #include <fbl/unique_fd.h>
    "//zircon/public/lib/fbl",
  ]

  deps = [
    "//sdk/fidl/fuchsia.device:fuchsia.device_c",
    "//sdk/fidl/fuchsia.hardware.block:fuchsia.hardware.block_c",
    "//sdk/fidl/fuchsia.hardware.block.encrypted:fuchsia.hardware.block.encrypted_c",
    "//sdk/fidl/fuchsia.sysinfo:fuchsia.sysinfo_c",
    "//sdk/lib/fdio",
    "//src/lib/storage/fs_management",
    "//src/security/kms-stateless",
    "//src/security/zxcrypt:zxcrypt-fdio",
    "//zircon/public/lib/zx",
    "//zircon/system/ulib/fdio-caller",
    "//zircon/system/ulib/fzl",
  ]
}

executable("bin") {
  output_name = "factory_reset"

  sources = [ "main.cc" ]

  deps = []
  public_deps = [
    ":lib",
    "//sdk/lib/fidl/cpp",
    "//sdk/lib/sys/cpp",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
  ]
}

executable("fdr") {
  sources = [ "cli_main.cc" ]

  public_deps = [
    "//sdk/fidl/fuchsia.recovery",
    "//sdk/lib/sys/cpp",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
  ]
}

fuchsia_package_with_single_component("factory_reset_pkg") {
  package_name = "factory_reset"
  manifest = "meta/factory_reset.cmx"
  deps = [ ":bin" ]
}

group("factory_reset") {
  deps = [
    ":factory_reset_config",
    ":factory_reset_pkg",
  ]
}

fuchsia_shell_package("fdr_cli") {
  deps = [ ":fdr" ]
}

config_data("factory_reset_config") {
  for_pkg = "sysmgr"
  outputs = [ "factory_reset.config" ]
  sources = [ "service.config" ]
}

# TODO(fxbug.dev/45780): Remove this forwarding target once out of tree users are removed.
group("configs") {
  deps = [ ":factory_reset_config" ]
}

group("tools") {
  deps = [ ":fdr_cli" ]
}

group("tests") {
  testonly = true
  deps = [ ":factory-reset-tests" ]
}

test("factory_reset_unittests") {
  testonly = true
  sources = [ "factory_reset_unittest.cc" ]

  deps = [
    ":lib",
    "//sdk/fidl/fuchsia.device:fuchsia.device_llcpp",
    "//sdk/fidl/fuchsia.hardware.block.volume:fuchsia.hardware.block.volume_c",
    "//sdk/fidl/fuchsia.hardware.power.statecontrol",
    "//src/lib/fxl/test:gtest_main",
    "//src/lib/storage/fs_management",
    "//src/security/zxcrypt:zxcrypt-fdio",
    "//zircon/public/lib/fbl",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/devmgr-integration-test",
    "//zircon/system/ulib/fdio-caller",
    "//zircon/system/ulib/fzl",
    "//zircon/system/ulib/ramdevice-client",
  ]

  # TODO(fxbug.dev/69585): This target uses raw zx::channel with LLCPP which is deprecated.
  # Please migrate to typed channel APIs (fidl::ClientEnd<T>, fidl::ServerEnd<T>).
  # See linked bug for details.
  configs += [ "//build/cpp:fidl-llcpp-deprecated-raw-channels" ]
}

isolated_devmgr_unittest_package("factory-reset-tests") {
  executable_path = "test/factory_reset_unittests"

  test_specs = {
    environments = [
      astro_env,
      emu_env,
    ]
  }

  deps = [
    ":factory_reset_unittests",
    "//src/devices/block/drivers/core",
    "//src/devices/block/drivers/ftl",
    "//src/devices/block/drivers/ramdisk",
    "//src/devices/block/drivers/zxcrypt",
    "//src/devices/misc/drivers/test",
    "//src/devices/tests/sysdev",
    "//src/storage/fvm/driver",
  ]
}

group("factory_reset_tests") {
  testonly = true
  deps = [ ":factory-reset-tests" ]
}
