# 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/bind/bind.gni")
import("//build/config/fuchsia/rules.gni")
import("//build/test.gni")
import("//src/sys/build/components.gni")

bind_rules("virtio_block_bind") {
  rules = "virtio_block.bind"
  output = "virtio_block_bind.h"
  tests = "block_bind_tests.json"
  deps = [ "//src/devices/bind/fuchsia.pci" ]
}

driver_module("virtio_block") {
  configs += [
    "//build/config:all_source",
    "//build/config/fuchsia:enable_zircon_asserts",
  ]
  if (is_fuchsia) {
    configs += [ "//build/unification/config:zircon-migrated" ]
  }
  sources = [ "block_driver.cc" ]
  deps = [
    ":block_lib",
    ":virtio_block_bind",
    "//sdk/banjo/fuchsia.hardware.block",
    "//src/devices/bus/lib/virtio",
    "//src/devices/lib/driver",
    "//src/lib/ddktl",
  ]
}

source_set("block_lib") {
  configs += [ "//build/config:all_source" ]
  sources = [ "block.cc" ]
  public_deps = [
    "//sdk/banjo/fuchsia.hardware.block",
    "//src/devices/bus/lib/virtio",
    "//src/lib/ddktl",
    "//src/lib/listnode",
  ]
}

source_set("scsi_lib") {
  configs += [ "//build/config:all_source" ]
  sources = [ "scsi.cc" ]
  public_deps = [
    "//sdk/banjo/fuchsia.hardware.block",
    "//src/devices/block/lib/scsi",
    "//src/devices/bus/lib/virtio",
    "//src/lib/ddktl",
  ]
}

bind_rules("virtio_scsi_bind") {
  rules = "virtio_scsi.bind"
  output = "virtio_scsi_bind.h"
  tests = "scsi_bind_tests.json"
  deps = [ "//src/devices/bind/fuchsia.pci" ]
}

driver_module("virtio_scsi") {
  configs += [
    "//build/config:all_source",
    "//build/config/fuchsia:enable_zircon_asserts",
  ]
  if (is_fuchsia) {
    configs += [ "//build/unification/config:zircon-migrated" ]
  }
  sources = [ "scsi_driver.cc" ]
  deps = [
    ":scsi_lib",
    ":virtio_scsi_bind",
    "//src/devices/bus/lib/virtio",
    "//src/devices/lib/driver",
    "//src/lib/ddktl",
  ]
}

test("virtio-block-test-bin") {
  if (is_fuchsia) {
    configs += [ "//build/unification/config:zircon-migrated" ]
  }
  if (is_fuchsia) {
    fdio_config = [ "//build/config/fuchsia:fdio_config" ]
    if (configs + fdio_config - fdio_config != configs) {
      configs -= fdio_config
    }
  }
  output_name = "virtio-block-test"
  sources = [ "block_test.cc" ]
  deps = [
    ":block_lib",
    "//src/devices/bus/lib/virtio",
    "//src/devices/testing/fake-bti",
    "//src/devices/testing/fake_ddk",
    "//zircon/public/lib/zxtest",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fidl-async:fidl-async-cpp",
  ]
}

test("virtio-scsi-test-bin") {
  if (is_fuchsia) {
    configs += [ "//build/unification/config:zircon-migrated" ]
  }
  if (is_fuchsia) {
    fdio_config = [ "//build/config/fuchsia:fdio_config" ]
    if (configs + fdio_config - fdio_config != configs) {
      configs -= fdio_config
    }
  }
  output_name = "virtio-scsi-test"
  sources = [ "scsi_test.cc" ]
  deps = [
    ":scsi_lib",
    "//src/devices/bus/lib/virtio",
    "//src/devices/testing/fake-bti",
    "//src/devices/testing/fake_ddk",
    "//zircon/public/lib/zxtest",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fidl-async:fidl-async-cpp",
  ]
}

group("tests") {
  testonly = true
  deps = [
    ":virtio-block-test",
    ":virtio-scsi-test",
    ":virtio_block_bind_test",
    ":virtio_scsi_bind_test",
  ]
}

fuchsia_unittest_package("virtio-block-test") {
  deps = [ ":virtio-block-test-bin" ]
}

fuchsia_unittest_package("virtio-scsi-test") {
  deps = [ ":virtio-scsi-test-bin" ]
}
