# 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 = [ "//zircon/public/lib/fit" ]
}

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

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

  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",
    "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",
  ]
  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",
    "fvm:tests",
  ]
}
