# 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/test.gni")

group("tests") {
  testonly = true
  deps = [
    ":fvm-integration-test",
    ":fvm-tests",
    ":fvm_unit($host_toolchain)",
    "//src/storage/fvm/driver:tests",
  ]
}

static_library("fvm") {
  sources = [
    "format.cc",
    "fvm.cc",
    "metadata.cc",
    "metadata_buffer.cc",
    "sparse_reader.cc",
  ]

  deps = [
    "//sdk/lib/fit",
    "//src/lib/digest",
    "//src/lib/uuid",
    "//zircon/system/ulib/fbl",
    "//zircon/system/ulib/range",
    "//zircon/third_party/ulib/lz4",
    "//zircon/third_party/ulib/safemath",
  ]
  public_deps = [
    "//src/lib/digest",
    "//src/storage/gpt",
    "//zircon/system/ulib/zx",
    "//zircon/third_party/ulib/lz4",
  ]

  if (is_fuchsia) {
    sources += [
      "client.cc",
      "fvm_check.cc",
      "vmo_metadata_buffer.cc",
    ]

    deps += [
      "//sdk/fidl/fuchsia.hardware.block.volume:fuchsia.hardware.block.volume_cpp",
      "//sdk/fidl/fuchsia.io:fuchsia.io_cpp",
      "//src/storage/gpt",
      "//src/storage/lib/block_client/cpp",
      "//zircon/system/ulib/fzl",
      "//zircon/system/ulib/sync",
      "//zircon/system/ulib/zx",
    ]
  } else {
    # fvm-check.cpp has #include <zircon/status.h> even when built for host.
    public_deps += [ "//src/zircon/lib/zircon:zircon-headers" ]
  }
}

static_library("test_support") {
  testonly = true

  sources = [
    "test_support.cc",
    "test_support.h",
  ]

  public_deps = [
    "//sdk/fidl/fuchsia.hardware.block.volume:fuchsia.hardware.block.volume_cpp",
    "//src/storage/fvm",
    "//src/storage/lib/ramdevice_client/cpp",
    "//zircon/system/ulib/fbl",
    "//zircon/system/ulib/zx",
  ]

  deps = [
    "//sdk/fidl/fuchsia.device:fuchsia.device_cpp",
    "//sdk/fidl/fuchsia.hardware.block.partition:fuchsia.hardware.block.partition_cpp",
    "//sdk/fidl/fuchsia.hardware.block.volume:fuchsia.hardware.block.volume_cpp",
    "//sdk/fidl/fuchsia.io:fuchsia.io_cpp",
    "//sdk/lib/component/incoming/cpp",
    "//sdk/lib/device-watcher/cpp",
    "//sdk/lib/fdio",
    "//sdk/lib/fidl",
    "//src/storage/fvm",
    "//src/storage/lib/block_client/cpp",
    "//src/storage/lib/fs_management",
    "//src/storage/lib/ramdevice_client/cpp",
    "//zircon/system/ulib/fbl",
    "//zircon/system/ulib/fdio-caller",
    "//zircon/system/ulib/fzl",
    "//zircon/system/ulib/zx",
    "//zircon/system/ulib/zxtest",
  ]
}

test("fvm_unit") {
  output_name = "fvm-unit-test"
  sources = [
    "format_test.cc",
    "integrity_validation_test.cc",
    "metadata_test.cc",
    "partition_entry_test.cc",
    "slice_entry_test.cc",
  ]

  deps = [
    "//src/lib/uuid",
    "//src/storage/fvm",
    "//zircon/system/ulib/zxtest",
  ]

  if (is_fuchsia) {
    sources += [ "client_test.cc" ]
    deps += [
      "//sdk/lib/fdio",
      "//src/storage/lib/block_client/cpp",
      "//zircon/system/ulib/fdio-caller",
      "//zircon/system/ulib/zx",
    ]
  }
}

fuchsia_unittest_package("fvm-tests") {
  deps = [ ":fvm_unit" ]
}

test("fvm-integration") {
  output_name = "fvm-integration-test"
  sources = [
    "fvm_integration_test.cc",
    "resize_integration_test.cc",
  ]

  deps = [
    ":test_support",
    "//sdk/fidl/fuchsia.device:fuchsia.device_cpp",
    "//sdk/fidl/fuchsia.hardware.block.partition:fuchsia.hardware.block.partition_cpp",
    "//sdk/fidl/fuchsia.hardware.block.volume:fuchsia.hardware.block.volume_cpp",
    "//sdk/fidl/fuchsia.io:fuchsia.io_cpp",
    "//sdk/lib/fdio",
    "//src/devices/testing/driver-integration-test-shim",
    "//src/lib/fxl",
    "//src/storage/blobfs",
    "//src/storage/fvm",
    "//src/storage/lib/block_client/cpp",
    "//src/storage/lib/fs_management",
    "//src/storage/lib/ramdevice_client/cpp",
    "//src/storage/minfs",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fbl",
    "//zircon/system/ulib/fdio-caller",
    "//zircon/system/ulib/zircon-internal",
    "//zircon/system/ulib/zx",
    "//zircon/system/ulib/zxtest",
  ]

  # Other components/binaries we depend on.
  deps += [
    "//src/devices/block/drivers/core",
    "//src/devices/block/drivers/ramdisk",
    "//src/devices/bus/drivers/platform",
    "//src/storage/fvm/driver",
  ]
}

fuchsia_test_component("test-component") {
  component_name = "fvm-integration-test"
  manifest = "meta/fvm_integration_test.cml"
  deps = [ ":fvm-integration" ]
}

fuchsia_test_package("fvm-integration-test") {
  test_components = [ ":test-component" ]
  test_specs = {
    log_settings = {
      max_severity = "ERROR"
    }
  }
  deps = [ "//src/storage/minfs/bin:minfs-component" ]
}
