# 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")
import("//build/zircon/zx_library.gni")

test("disk_inspector_unit") {
  testonly = true
  sources = [
    "basic_types_test.cc",
    "command_test.cc",
    "disk_primitive_test.cc",
    "disk_struct_test.cc",
    "inspector_transaction_handler_test.cc",
    "loader_test.cc",
    "type_utils_test.cc",
  ]
  deps = [
    "//src/lib/fxl/test:gtest_main",
    "//src/lib/storage/block_client/cpp",
    "//src/lib/storage/block_client/cpp:fake_device",
    "//src/storage/lib/disk_inspector",
    "//third_party/googletest:gtest",
    "//zircon/system/ulib/storage/buffer",
    "//zircon/system/ulib/storage/operation",
    "//zircon/system/ulib/zx",
  ]

  # TODO(fxbug.dev/95833): This target uses the deprecated C bindings.
  # Consider switching to the C++ bindings. See linked bug for details.
  configs += [ "//build/c:fidl-deprecated-c-bindings" ]
}

fuchsia_unittest_package("disk-inspector-unit") {
  deps = [ ":disk_inspector_unit" ]
}

group("tests") {
  testonly = true
  deps = [ ":disk-inspector-unit" ]
}

if (is_fuchsia) {
  zx_library("disk_inspector") {
    sdk = "source"
    sdk_headers = [
      "disk_inspector/inspector_transaction_handler.h",
      "disk_inspector/command_handler.h",
      "disk_inspector/command.h",
      "disk_inspector/common_types.h",
      "disk_inspector/disk_inspector.h",
      "disk_inspector/disk_obj.h",
      "disk_inspector/disk_struct.h",
      "disk_inspector/supported_types.h",
      "disk_inspector/type_utils.h",
      "disk_inspector/buffer_factory.h",
      "disk_inspector/vmo_buffer_factory.h",
      "disk_inspector/loader.h",
    ]
    sources = [
      "command.cc",
      "disk_inspector.cc",
      "disk_struct.cc",
      "loader.cc",
      "vmo_buffer_factory.cc",
    ]

    public_deps = [ "//zircon/system/ulib/fbl" ]
    deps = [
      "//sdk/lib/syslog/cpp",
      "//third_party/re2",
      "//zircon/system/ulib/fbl",
    ]

    if (is_fuchsia) {
      sources += [ "inspector_transaction_handler.cc" ]

      public_deps += [
        "//sdk/lib/fit-promise",
        "//src/lib/storage/block_client/cpp",
        "//src/lib/storage/vfs/cpp",
        "//src/lib/storage/vfs/cpp/transaction",
        "//zircon/system/ulib/storage/buffer",
      ]

      deps += [
        "//sdk/lib/fdio",
        "//zircon/system/ulib/storage/operation",
        "//zircon/third_party/ulib/safemath",
      ]
    }

    # TODO(fxbug.dev/95833): This target uses the deprecated C bindings.
    # Consider switching to the C++ bindings. See linked bug for details.
    configs += [ "//build/c:fidl-deprecated-c-bindings" ]
  }
} else {
  config("headers_config") {
    include_dirs = [ "include" ]
  }

  source_set("disk_inspector") {
    public = [
      "include/disk_inspector/buffer_factory.h",
      "include/disk_inspector/command.h",
      "include/disk_inspector/command_handler.h",
      "include/disk_inspector/common_types.h",
      "include/disk_inspector/disk_inspector.h",
      "include/disk_inspector/disk_obj.h",
      "include/disk_inspector/disk_struct.h",
      "include/disk_inspector/inspector_transaction_handler.h",
      "include/disk_inspector/loader.h",
      "include/disk_inspector/supported_types.h",
      "include/disk_inspector/type_utils.h",
      "include/disk_inspector/vmo_buffer_factory.h",
    ]

    public_configs = [ ":headers_config" ]

    public_deps = [
      "//sdk/lib/fit-promise",
      "//src/lib/storage/vfs/cpp/transaction",
    ]

    # TODO(fxbug.dev/95833): This target uses the deprecated C bindings.
    # Consider switching to the C++ bindings. See linked bug for details.
    configs += [ "//build/c:fidl-deprecated-c-bindings" ]
  }
}
