# 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/rust/rustc_library.gni")
import("//build/rust/rustc_test.gni")
import("//src/sys/build/components.gni")

rustc_library("hub_report_capability") {
  name = "hub_report_capability"
  edition = "2018"
  source_root = "hub_report_capability.rs"
  deps = [
    "//sdk/fidl/fuchsia.io:fuchsia.io-rustc",
    "//sdk/fidl/fuchsia.sys2:fuchsia.sys2-rustc",
    "//src/lib/fidl/rust/fidl",
    "//src/lib/fuchsia-async",
    "//src/sys/component_manager/testing:test_utils_lib",
    "//src/sys/component_manager/tests/fidl:hub-rustc",
    "//third_party/rust_crates:anyhow",
    "//third_party/rust_crates:async-trait",
    "//third_party/rust_crates:futures",
  ]

  sources = [ "hub_report_capability.rs" ]
}

rustc_test("hub_integration_test_bin") {
  name = "hub_integration_test"
  edition = "2018"
  source_root = "hub_integration_test.rs"
  deps = [
    ":hub_report_capability",
    "//examples/components/routing/fidl:echo-rustc",
    "//garnet/lib/rust/io_util",
    "//sdk/fidl/fuchsia.io:fuchsia.io-rustc",
    "//sdk/fidl/fuchsia.sys2:fuchsia.sys2-rustc",
    "//src/lib/fidl/rust/fidl",
    "//src/lib/fuchsia-async",
    "//src/sys/component_manager/testing:test_utils_lib",
    "//src/sys/component_manager/tests/fidl:hub-rustc",
    "//third_party/rust_crates:anyhow",
    "//third_party/rust_crates:futures",
  ]

  sources = [ "hub_integration_test.rs" ]
}

fuchsia_component("advanced_routing_reporter") {
  testonly = true
  deps = [ "components:advanced_routing_reporter_bin" ]
  manifest = "components/advanced_routing/meta/reporter.cml"
}

fuchsia_component("advanced_routing_echo_realm") {
  testonly = true
  manifest = "components/advanced_routing/meta/echo_realm.cml"
}

fuchsia_component("dynamic_child_reporter") {
  testonly = true
  deps = [ "components:dynamic_child_reporter_bin" ]
  manifest = "components/dynamic_child/meta/reporter.cml"
}

fuchsia_component("simple") {
  testonly = true
  deps = [ "components:simple_component_bin" ]
  manifest = "components/simple_component/meta/simple.cml"
}

fuchsia_component("visibility_reporter") {
  testonly = true
  deps = [ "components:visibility_reporter_bin" ]
  manifest = "components/visibility/meta/reporter.cml"
}

fuchsia_component("child") {
  testonly = true
  manifest = "components/visibility/meta/child.cml"
}

fuchsia_component("grandchild") {
  testonly = true
  manifest = "components/visibility/meta/grandchild.cml"
}

fuchsia_unittest_package("hub_integration_test") {
  manifest = "meta/hub_integration_test.cmx"
  deps = [
    ":advanced_routing_echo_realm",
    ":advanced_routing_reporter",
    ":child",
    ":dynamic_child_reporter",
    ":grandchild",
    ":hub_integration_test_bin",
    ":simple",
    ":visibility_reporter",
    "//examples/components/routing/echo_server:echo_server_component",
  ]
}
