# Copyright 2020 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/test.gni")
import("//src/sys/build/components.gni")

source_set("options") {
  sources = [ "options.cc" ]
  public = [ "options.h" ]
  public_deps = [ "//sdk/lib/fit-promise" ]
}

source_set("volume-descriptor") {
  sources = [ "volume_descriptor.cc" ]
  public = [ "volume_descriptor.h" ]
  public_deps = [
    ":options",
    "utils:guid",
    "//sdk/lib/fit-promise",
    "//third_party/rapidjson",
  ]
}

source_set("address-descriptor") {
  sources = [ "address_descriptor.cc" ]
  public = [ "address_descriptor.h" ]
  public_deps = [
    "//sdk/lib/fit-promise",
    "//zircon/public/lib/fbl",
  ]

  deps = [ "//third_party/rapidjson" ]
}

source_set("partition") {
  sources = [ "partition.cc" ]
  public = [ "partition.h" ]
  public_deps = [
    ":address-descriptor",
    "//src/storage/volume_image:volume-descriptor",
    "//src/storage/volume_image/utils:io-interfaces",
  ]

  deps = [ "//third_party/rapidjson" ]
}

source_set("volume-descriptor-test") {
  testonly = true
  sources = [
    "address_descriptor_test.cc",
    "options_test.cc",
    "partition_test.cc",
    "volume_descriptor_test.cc",
  ]
  deps = [
    ":address-descriptor",
    ":partition",
    ":volume-descriptor",
    "serialization:schema",
    "//src/lib/json_parser",
    "//third_party/googletest:gmock",
    "//third_party/googletest:gtest",
  ]
}

test("storage-volume-image-test") {
  deps = [
    ":volume-descriptor-test",
    "adapter:adapter-tests",
    "ftl:tests",
    "fvm:fvm-test",
    "serialization:tests",
    "utils:tests",
    "//src/lib/fxl/test:gtest_main",
  ]

  if (is_fuchsia) {
    deps += [ "//sdk/lib/fdio" ]
  }
}

test("storage-volume-image-integration-test") {
  deps = [
    "ftl:integration-tests",
    "//src/lib/fxl/test:gtest_main",
  ]

  if (is_fuchsia) {
    deps += [ "//sdk/lib/fdio" ]
  }
}

resource("serialization-schemas") {
  sources = [
    "serialization/address_descriptor.schema.json",
    "serialization/blob_manifest.schema.json",
    "serialization/volume_descriptor.schema.json",
    "serialization/volume_image.schema.json",
  ]
  outputs = [ "data/schema/{{source_file_part}}" ]
}

fuchsia_component("storage-volume-image-test-component") {
  manifest = "meta/storage-volume-image-test.cmx"
  deps = [
    ":serialization-schemas",
    ":storage-volume-image-test",
    "adapter:adapter-test-images",
  ]
  testonly = true
}

fuchsia_component("storage-volume-image-integration-test-component") {
  manifest = "meta/storage-volume-image-integration-test.cmx"
  deps = [ ":storage-volume-image-integration-test" ]
  testonly = true
}

fuchsia_test_package("storage-volume-image-tests") {
  test_components = [
    ":storage-volume-image-test-component",
    ":storage-volume-image-integration-test-component",
  ]
}

group("tests") {
  testonly = true
  deps = [
    ":storage-volume-image-integration-test($host_toolchain)",
    ":storage-volume-image-test($host_toolchain)",
    ":storage-volume-image-tests",
    "adapter:tests",
    "fvm:tests",
  ]
}
