# 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/package.gni")
import("//build/testing/environments.gni")
import("//src/lib/isolated_devmgr/devmgr_manifest.gni")

source_set("src") {
  sources = [
    "isolated_devmgr.cc",
    "isolated_devmgr.h",
  ]

  public_deps = [
    "//zircon/public/lib/devmgr-integration-test",
  ]

  deps = [
    "//src/lib/fxl",
    "//zircon/public/lib/async-cpp",
    "//zircon/public/lib/async-loop-cpp",
    "//zircon/public/lib/async-loop-default",
    "//zircon/public/lib/ddk",
    "//zircon/public/lib/fbl",
    "//zircon/public/lib/fdio",
    "//zircon/public/lib/fit",
    "//zircon/public/lib/fzl",
    "//zircon/public/lib/libzbi",
    "//zircon/public/lib/zx",
  ]
}

executable("isolated_devmgr") {
  testonly = true
  output_name = "isolated_devmgr"

  sources = [
    "main.cc",
  ]

  deps = [
    ":src",
    "//sdk/lib/sys/cpp",
    "//src/lib/fxl",
    "//zircon/public/lib/async-cpp",
    "//zircon/public/lib/async-cpp",
    "//zircon/public/lib/async-loop-cpp",
    "//zircon/public/lib/async-loop-default",
    "//zircon/public/lib/ddk",
    "//zircon/public/lib/devmgr-integration-test",
    "//zircon/public/lib/fbl",
    "//zircon/public/lib/fdio",
    "//zircon/public/lib/fit",
  ]
}

static_library("usb-virtual-bus") {
  testonly = true
  sources = [
    "usb-virtual-bus-helper.cc",
    "usb-virtual-bus-helper.h",
    "usb-virtual-bus.cc",
    "usb-virtual-bus.h",
  ]
  public_deps = [
    "//garnet/public/lib/gtest",
    "//zircon/public/lib/devmgr-integration-test",
    "//zircon/system/fidl/fuchsia-hardware-usb-peripheral:fuchsia-hardware-usb-peripheral_llcpp",
    "//zircon/system/fidl/fuchsia-hardware-usb-virtual-bus:fuchsia-hardware-usb-virtual-bus_llcpp",
  ]
  deps = [
    "//sdk/fidl/fuchsia.sys",
    "//sdk/lib/sys/cpp",
    "//zircon/public/lib/async-loop-cpp",
    "//zircon/public/lib/async-loop-default",
    "//zircon/public/lib/ddk",
    "//zircon/public/lib/devmgr-launcher",
    "//zircon/public/lib/fbl",
    "//zircon/public/lib/fdio",
    "//zircon/public/lib/fidl-async-cpp",
    "//zircon/public/lib/fit",
    "//zircon/public/lib/zx",
  ]
  configs += [ "//build/config/fuchsia:enable_zircon_asserts" ]
  configs += [ "//build/config/fuchsia:static_cpp_standard_library" ]
}

executable("test_bin") {
  testonly = true

  output_name = "isolated_devmgr_tests"

  sources = [
    "isolated_devmgr_tests.cc",
  ]

  deps = [
    ":src",
    "//garnet/public/lib/gtest",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/fidl/fuchsia.virtualaudio",
    "//sdk/lib/sys/cpp",
    "//src/lib/fxl/test:gtest_main",
    "//zircon/public/lib/async-cpp",
    "//zircon/public/lib/async-cpp",
    "//zircon/public/lib/async-loop-cpp",
    "//zircon/public/lib/async-loop-default",
    "//zircon/public/lib/ddk",
    "//zircon/public/lib/devmgr-integration-test",
    "//zircon/public/lib/fdio",
    "//zircon/public/lib/fit",
    "//zircon/system/fidl/fuchsia-hardware-ethertap",
    "//zircon/system/fidl/fuchsia-io:fuchsia-io",
  ]
}

devmgr_manifest("devmgr-manifest") {
}

package("isolated_devmgr_tests") {
  testonly = true
  deps = [
    ":devmgr-manifest",
    ":isolated_devmgr",
    ":test_bin",
    "//src/media/audio/drivers/virtual_audio:virtual_audio_driver",
  ]

  extra = [ "$target_gen_dir/devmgr.manifest" ]

  binaries = [
    {
      name = "isolated_devmgr"
    },
  ]

  meta = [
    {
      dest = "isolated_devmgr_tests.cmx"
      path = dest
    },
    {
      dest = "isolated_devmgr.cmx"
      path = dest
    },
    {
      dest = "isolated_devmgr_virtual_audio.cmx"
      path = dest
    },
  ]

  resources = [
    {
      path = rebase_path("${root_build_dir}/virtual_audio_driver.so")
      dest = "virtual_audio_driver.so"
    },
  ]

  tests = [
    {
      name = "isolated_devmgr_tests"
      environments = basic_envs
    },
  ]
}

group("tests") {
  testonly = true
  data_deps = [
    ":isolated_devmgr_tests",
  ]
}
