# 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/dist/component_manifest_resources.gni")
import("//build/test.gni")
import("//src/lib/isolated_devmgr/v2_component/isolated_devmgr.gni")
import("//src/sys/build/components.gni")

declare_args() {
  # blobfs_maximum_runtime_bytes is an upper bound on the partition size on the device. Partitions
  # can grow as needed if there are extra slices available in FVM. This limit prevents the blobfs
  # partition from taking too much space away from other uses.
  #
  # Pass the empty string for no limit.
  blobfs_maximum_runtime_bytes = ""

  # minfs_maximum_runtime_bytes is an upper bound on the partition size on the device. Partitions
  # can grow as needed if there are extra slices available in FVM. This limit prevents the minfs
  # partition from taking too much space away from other uses.
  #
  # Pass the empty string for no limit.
  minfs_maximum_runtime_bytes = ""

  # If format_minfs_on_corruption is true (the default), fshost formats minfs partition on finding
  # it corrupted.  Set to false to keep the devices in a corrupted state which might be of help to
  # debug issues.
  format_minfs_on_corruption = true

  # If extract_minfs_metadata_on_corruption is true, fshost extracts minfs metadata on finding it
  # corrupted. Setting this flag to true helps debugging corruptions.
  extract_minfs_metadata_on_corruption = false
}

group("tests") {
  testonly = true
  deps = [
    ":fshost-tests",
    "//src/lib/isolated_devmgr/v2_component",
  ]
}

source_set("launcher") {
  visibility = [ ":*" ]
  sources = [ "fdio.cc" ]
  deps = [
    "//sdk/lib/fdio",
    "//sdk/lib/syslog/cpp",
    "//zircon/public/lib/fbl",
    "//zircon/public/lib/fidl",
    "//zircon/public/lib/zircon-internal",
    "//zircon/public/lib/zx",
  ]
}

source_set("fshost-registry") {
  configs += [ "//build/unification/config:zircon-migrated" ]
  sources = [
    "admin-server.cc",
    "deprecated-loader-service.cc",
    "fs-manager.cc",
    "fshost-boot-args.cc",
    "lifecycle.cc",
    "registry.cc",
    "registry_vnode.cc",
  ]
  public_deps = [
    ":inspect",
    ":launcher",
    ":metrics",
    "//sdk/fidl/fuchsia.boot:fuchsia.boot_llcpp",
    "//sdk/fidl/fuchsia.device.manager:fuchsia.device.manager_llcpp",
    "//sdk/fidl/fuchsia.fshost:fuchsia.fshost_llcpp",
    "//sdk/fidl/fuchsia.process.lifecycle:fuchsia.process.lifecycle_llcpp",
    "//sdk/lib/vfs/cpp",
    "//src/lib/loader_service",
    "//zircon/public/lib/fit",
    "//zircon/public/lib/zircon-internal",
    "//zircon/public/lib/zx",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fs",
    "//zircon/system/ulib/fs-management",
    "//zircon/system/ulib/memfs",
  ]
  deps = [
    "//sdk/lib/fdio",
    "//src/lib/files",
    "//zircon/public/lib/fbl",
    "//zircon/public/lib/zircon-internal",
    "//zircon/system/ulib/fidl-async:fidl-async-cpp",
    "//zircon/system/ulib/memfs:memfs-cpp",
  ]
}

source_set("inspect") {
  configs += [ "//build/unification/config:zircon-migrated" ]
  sources = [
    "inspect-manager.cc",
    "inspect-manager.h",
  ]
  public_deps = [
    "//sdk/lib/fdio",
    "//sdk/lib/sys/inspect/cpp",
    "//src/lib/fsl",
    "//zircon/public/lib/fbl",
    "//zircon/system/ulib/fs",
    "//zircon/system/ulib/memfs",
  ]
}

source_set("metrics") {
  sources = [
    "metrics.cc",
    "metrics.h",
  ]
  public_deps = [
    "//zircon/public/lib/async-cpp",
    "//zircon/system/ulib/cobalt-client",
    "//zircon/system/ulib/fs/metrics:metrics-cobalt",
  ]
  deps = [
    "//sdk/lib/syslog/cpp",
    "//zircon/system/ulib/cobalt-client",
    "//zircon/system/ulib/fs/metrics:metrics-cobalt",
    "//zircon/system/ulib/fs/metrics:metrics-inspect",
  ]
}

source_set("block-watcher") {
  configs += [ "//build/config:all_source" ]
  sources = [
    "block-device-manager.cc",
    "block-device.cc",
    "block-watcher.cc",
    "config.cc",
    "encrypted-volume.cc",
    "filesystem-mounter.cc",
    "fshost-fs-provider.cc",
    "pkgfs-launcher.cc",
    "pkgfs-loader-service.cc",
  ]
  public_deps = [
    ":fshost-registry",
    ":launcher",
    ":metrics",
    "//sdk/fidl/fuchsia.fshost:fuchsia.fshost_llcpp",
    "//sdk/fidl/fuchsia.hardware.block.partition:fuchsia.hardware.block.partition_llcpp",
    "//src/storage/blobfs",
    "//zircon/public/lib/fit",
    "//zircon/public/lib/zircon-internal",
    "//zircon/public/lib/zx",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fdio-caller",
    "//zircon/system/ulib/fs",
    "//zircon/system/ulib/memfs",
  ]
  deps = [
    "//sdk/fidl/fuchsia.boot:fuchsia.boot_c",
    "//sdk/fidl/fuchsia.boot:fuchsia.boot_llcpp",
    "//sdk/fidl/fuchsia.device:fuchsia.device_c",
    "//sdk/fidl/fuchsia.device:fuchsia.device_llcpp",
    "//sdk/fidl/fuchsia.hardware.block:fuchsia.hardware.block_c",
    "//sdk/fidl/fuchsia.hardware.block.encrypted:fuchsia.hardware.block.encrypted_c",
    "//sdk/fidl/fuchsia.hardware.block.partition:fuchsia.hardware.block.partition_c",
    "//sdk/fidl/fuchsia.hardware.block.verified:fuchsia.hardware.block.verified_llcpp",
    "//sdk/fidl/fuchsia.io:fuchsia.io_llcpp",
    "//sdk/lib/fdio",
    "//src/devices/block/drivers/block-verity:verified-volume-client",
    "//src/lib/digest",
    "//src/lib/loader_service",
    "//src/security/zxcrypt:zxcrypt-fdio",
    "//src/storage/minfs",
    "//src/sys/pkg/fidl/fuchsia.update.verify:fuchsia.update.verify_llcpp",
    "//zircon/public/lib/fbl",
    "//zircon/public/lib/fidl",
    "//zircon/public/lib/fit",
    "//zircon/public/lib/zircon-internal",
    "//zircon/public/lib/zx",
    "//zircon/system/ulib/fidl-async:fidl-async-cpp",
    "//zircon/system/ulib/fs",
    "//zircon/system/ulib/fs-management",
    "//zircon/system/ulib/gpt",
    "//zircon/system/ulib/ramdevice-client",
    "//zircon/system/ulib/trace",
    "//zircon/system/ulib/trace-engine",
  ]

  if (extract_minfs_metadata_on_corruption) {
    sources += [ "extract-metadata.cc" ]
    public_deps += [ "//src/storage/extractor/cpp:disk_extractor" ]
  } else {
    sources += [ "extract-metadata-noop.cc" ]
  }
}

executable("fshost") {
  if (is_fuchsia) {
    configs += [
      "//build/unification/config:zircon-migrated",
      "//build/config:all_source",
    ]
  }
  if (is_fuchsia) {
    fdio_config = [ "//build/config/fuchsia:fdio_config" ]
    if (configs + fdio_config - fdio_config != configs) {
      configs -= fdio_config
    }
  }
  sources = [ "main.cc" ]
  deps = [
    ":block-watcher",
    ":fshost-registry",
    ":metrics",
    "//sdk/fidl/fuchsia.boot:fuchsia.boot_c",
    "//sdk/fidl/fuchsia.boot:fuchsia.boot_llcpp",
    "//sdk/fidl/fuchsia.fshost:fuchsia.fshost_c",
    "//sdk/fidl/fuchsia.fshost:fuchsia.fshost_llcpp",
    "//sdk/fidl/fuchsia.io:fuchsia.io_llcpp",
    "//sdk/fidl/fuchsia.ldsvc:fuchsia.ldsvc_c",
    "//src/storage/lib/utils:use_debug_log",
    "//zircon/system/ulib/cobalt-client",
    "//zircon/system/ulib/fidl-async:fidl-async-cpp",
    "//zircon/system/ulib/fs-management",
    "//zircon/system/ulib/ramdevice-client",
    "//zircon/system/ulib/zbi-bootfs",
  ]
}

test("fshost_test") {
  sources = [
    "delayed-outdir-test.cc",
    "fshost-boot-args-test.cc",
    "fshost-test.cc",
  ]
  deps = [
    ":block-watcher",
    ":fshost-registry",
    ":metrics",
    "//sdk/fidl/fuchsia.boot:fuchsia.boot_llcpp",
    "//sdk/fidl/fuchsia.io:fuchsia.io_llcpp",
    "//zircon/public/lib/zxtest",
    "//zircon/system/ulib/cobalt-client",
    "//zircon/system/ulib/cobalt-client:in-memory-logger",
    "//zircon/system/ulib/fidl-async",
    "//zircon/system/ulib/fidl-async:fidl-async-cpp",
    "//zircon/system/ulib/mock-boot-arguments",
  ]
}

# Include this target from a product config if you want to allow authoring
# factory partition contents in mutable mode and prevent opening block-verity
# volumes in verified read mode.
generated_resource("allow-authoring-factory") {
  outputs = [ "config/allow-authoring-factory" ]
  contents = "yes"

  # We should never allow authoring factory from a production, user-facing build.
  deps = [ "//build/validate:non_production_tag" ]
}

fuchsia_unittest_component("fshost-test") {
  deps = [ ":fshost_test" ]
}

# This is a separate test executable because loader_service_test_fixture uses gtest, but other
# tests here use zxtest.
test("fshost_loader_service_test") {
  sources = [
    "deprecated-loader-service-test.cc",
    "pkgfs-loader-service-test.cc",
  ]
  deps = [
    ":block-watcher",
    ":fshost-registry",
    "//src/lib/loader_service:loader_service_test_fixture",
    "//zircon/system/ulib/mock-boot-arguments",
  ]
}

fuchsia_unittest_component("fshost-loader-service-test") {
  manifest = "meta/fshost-loader-service-test.cmx"
  deps = [ ":fshost_loader_service_test" ]
}

test("fshost_inspect_test") {
  sources = [ "inspect-manager-test.cc" ]
  deps = [
    ":inspect",
    "//zircon/public/lib/async",
    "//zircon/public/lib/zxtest",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/inspect",
  ]
}

fuchsia_unittest_component("fshost-inspect-test") {
  deps = [ ":fshost_inspect_test" ]
}

test("fshost_metrics_test") {
  sources = [ "metrics-test.cc" ]
  deps = [
    ":metrics",
    "//sdk/fidl/fuchsia.boot:fuchsia.boot_llcpp",
    "//sdk/lib/fdio",
    "//zircon/public/lib/zxtest",
    "//zircon/system/ulib/async-testing",
    "//zircon/system/ulib/cobalt-client:in-memory-logger",
    "//zircon/system/ulib/fs/metrics:metrics-cobalt",
    "//zircon/system/ulib/fs/metrics:metrics-inspect",
  ]
}

fuchsia_unittest_component("fshost-metrics-test") {
  deps = [ ":fshost_metrics_test" ]
}

test("fshost_integration_test") {
  sources = [
    "block-device-manager-test.cc",
    "block-device-test.cc",
    "block-watcher-test.cc",
    "filesystem-mounter-test.cc",
    "fshost-exposed-dir-test.cc",
    "fshost_integration_test.cc",
    "fshost_integration_test.h",
    "mock-block-device.h",
    "recovery-test.cc",
  ]
  deps = [
    ":block-watcher",
    "//sdk/fidl/fuchsia.boot:fuchsia.boot_llcpp",
    "//sdk/fidl/fuchsia.device:fuchsia.device_llcpp",
    "//sdk/fidl/fuchsia.hardware.block.volume:fuchsia.hardware.block.volume_llcpp",
    "//sdk/fidl/fuchsia.sys2",
    "//src/lib/files",
    "//src/lib/fxl/test:gtest_main",
    "//src/lib/isolated_devmgr/v2_component:client",
    "//src/storage/blobfs",
    "//src/storage/minfs",
    "//src/sys/pkg/fidl/fuchsia.update.verify:fuchsia.update.verify_llcpp",
    "//third_party/googletest:gmock",
    "//zircon/system/ulib/cobalt-client:in-memory-logger",
    "//zircon/system/ulib/fidl-async",
    "//zircon/system/ulib/fs-management",
    "//zircon/system/ulib/fs/metrics:metrics-cobalt",
    "//zircon/system/ulib/ramdevice-client",
  ]
}

# This is a test version of fshost, not a component with fshost tests.
fuchsia_component("test-fshost") {
  testonly = true
  manifest = "meta/fshost.cml"
  deps = [
    ":fshost",
    "//src/security/policy/zxcrypt:null",
  ]
}

isolated_devmgr_unittest_v2_component("fshost-integration-test") {
  manifest = "meta/fshost_integration_test.cml"
  deps = [
    ":fshost_integration_test",
    ":integration_test_config",
    "//src/devices/block/drivers/core",
    "//src/devices/block/drivers/gpt",
    "//src/devices/block/drivers/ramdisk",
    "//src/devices/bus/drivers/platform",
    "//src/devices/tests/sysdev",
  ]
}

fuchsia_test_package("fshost-tests") {
  test_specs = {
    log_settings = {
      max_severity = "ERROR"
    }
  }
  test_components = [
    ":fshost-integration-test",
    ":fshost-test",
    ":fshost-inspect-test",
    ":fshost-metrics-test",
    ":fshost-loader-service-test",
  ]
  deps = [ ":test-fshost" ]
}

component_manifest_resources("meta") {
  sources = [ "meta/fshost.cml" ]
}

group("bootfs") {
  deps = [
    ":fshost",
    ":meta",
  ]
}

# Generates an fshost config file that will appear in config/fshost. If no configuration file is
# present (i.e. there's no dependency on a target below), a default config is used (see
# block-device-manager.cc).
#
# Some of the configuration settings are build args, and some are parameters passed in to the
# template by the invoker. A few allow overriding by the invoker but fall back to the global build
# arg.
template("fshost_config") {
  generated_resource(target_name) {
    contents = [ "default" ]
    deps = []
    if (defined(invoker.no_minfs_zxcrypt) && invoker.no_minfs_zxcrypt) {
      contents += [ "no-zxcrypt" ]
      deps += [ "//build/validate:non_production_tag" ]
    }
    if (defined(invoker.minfs_ramdisk) && invoker.minfs_ramdisk) {
      contents += [
        "fvm-ramdisk",
        "zxcrypt-non-ramdisk",
      ]
    }
    if (defined(invoker.gpt_all) && invoker.gpt_all) {
      contents += [ "gpt-all" ]
      deps += [ "//build/validate:non_production_tag" ]
    }
    if (blobfs_maximum_runtime_bytes != "") {
      contents += [ "blobfs-max-bytes=$blobfs_maximum_runtime_bytes" ]
    }

    if (defined(invoker.minfs_maximum_runtime_bytes)) {
      # This can be overridden by the invoker but defaults to the file one if undefined.
      contents += [ "minfs-max-bytes=${invoker.minfs_maximum_runtime_bytes}" ]
    } else if (minfs_maximum_runtime_bytes != "") {
      contents += [ "minfs-max-bytes=$minfs_maximum_runtime_bytes" ]
    }

    if (!format_minfs_on_corruption) {
      contents += [ "-format-minfs-on-corruption" ]
    }
    if (defined(invoker.use_syslog) && invoker.use_syslog) {
      contents += [ "use-syslog" ]
    }
    if (defined(invoker.use_default_loader) && invoker.use_default_loader) {
      contents += [ "use-default-loader" ]
    }
    if (defined(invoker.sandbox_decompression) &&
        invoker.sandbox_decompression) {
      contents += [ "sandbox-decompression" ]
    }

    if (defined(invoker.apply_limits_to_ramdisk) &&
        invoker.apply_limits_to_ramdisk) {
      contents += [ "apply-limits-to-ramdisk" ]
    }

    output_conversion = "list lines"
    outputs = [ "config/fshost" ]
  }
}

fshost_config("minfs_ramdisk") {
  minfs_ramdisk = true
}

fshost_config("no_minfs_zxcrypt") {
  no_minfs_zxcrypt = true
}

# A configuration that allows access to multiple devices with GUID partition schemes; the default
# will only attach a driver to the first device that appears to have a GUID partition scheme.
fshost_config("gpt_all") {
  gpt_all = true
}

# Maintains the above semantics for target gpt_all while adding the blobfs decompression sandbox.
fshost_config("sandbox_decompression_with_gpt_all") {
  sandbox_decompression = true
  gpt_all = true
}

# Writes default configuration plus any changes to global variables.
fshost_config("default_config") {
  minfs_ramdisk = false
  gpt_all = false
  no_minfs_zxcrypt = false
}

fshost_config("integration_test_config") {
  # Some of the tests require us to be able to match against multiple GPT devices.
  gpt_all = true

  use_syslog = true
  use_default_loader = true

  # The test BlockDeviceManagerIntegration.MaxSize verifies that the minfs "max runtime bytes"
  # gets applied correctly. It checks that the max size in FVM is set to this value. The
  # "apply_limits_to_ramdisk" flag is required to apply the minfs limit even to a ramdisk which is
  # used in tests (normally the limits apply only to physical devices).
  #
  # This number is chosen to be large because it will apply to all tests in the fshost integration
  # test. So all minfs partitions created in that test must be smaller than this value.
  minfs_maximum_runtime_bytes = 1073741824
  apply_limits_to_ramdisk = true
}
