# Copyright 2021 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/bazel/export_fuchsia_package_to_bazel.gni")
import("//build/components.gni")
import("//build/drivers.gni")
import("//tools/cmc/build/expect_includes.gni")

# WARNING: Prefer to use the realm-builder variants, unless you have a very basic use case and
# don't need hermeticity in your test.
#
# This is the static driver_test_realm. It is a layer on top of the driver_test_realm, that
# adds it as a static component in the test. This is done by bringing in the client_includes
# which is an expect_includes target with a client shard that the test must include in its cml.
# This client shard contains a child entry for the driver-test-realm component. This is provided
# with some default capabilities that simple tests can utilize (eg. the devfs directory), but it
# can't be customized any further to add more capabilities (like a test specific driver service).
#
# See the realm-builder libraries if any customization outside of what currently exists in the
# client shard is needed.
group("static") {
  testonly = true
  deps = [
    ":client_includes",
    ":driver_test_realm",
  ]
}

# This is the main driver_test_realm group. It contains the driver-test-realm component that
# configures the realm, as well as the inner components that are part of the inner realm.
# Generally this should not be depended on directly, instead either the static target or the
# realm_builder libraries should be depended on and they bring in this dependency.
group("driver_test_realm") {
  deps = [
    ":driver_manager_test",
    ":driver_test_realm_component",
    ":dtr_support_component",
    ":fake_resolver",
    ":test_realm_manifest",
    "//src/devices/bin/devfs:component-for-test",
    "//src/devices/bin/driver-host:component",
    "//src/devices/bin/driver-index:component",
    "//src/devices/bin/driver_manager:driver_shared_libraries",
    "//src/devices/bin/driver_manager/devfs:component",
  ]
}

group("tests") {
  testonly = true
  deps = [
    ":static_package",
    "platform:tests",
    "simple:tests",
    "tests",
  ]
}

source_set("internal_server_cpp") {
  sources = [
    "src/internal_server.cc",
    "src/internal_server.h",
  ]
  deps = [ "//sdk/lib/component/incoming/cpp" ]
  public_deps = [
    "//sdk/fidl/fuchsia.component.resolution:fuchsia.component.resolution_cpp",
    "//sdk/fidl/fuchsia.driver.test:fuchsia.driver.test_cpp",
  ]
}

executable("bin") {
  output_name = "driver_test_realm"
  sources = [
    "driver_test_realm.cc",
    "src/boot_items.cc",
    "src/boot_items.h",
    "src/root_job.cc",
    "src/root_job.h",
    "src/system_state.h",
  ]
  deps = [
    ":driver_test_realm_config",
    ":internal_server_cpp",
    "//sdk/fidl/fuchsia.boot:fuchsia.boot_cpp",
    "//sdk/fidl/fuchsia.driver.development:fuchsia.driver.development_cpp",
    "//sdk/fidl/fuchsia.io:fuchsia.io_cpp",
    "//sdk/fidl/fuchsia.kernel:fuchsia.kernel_cpp",
    "//sdk/fidl/fuchsia.system.state:fuchsia.system.state_cpp",
    "//sdk/lib/async-loop:async-loop-cpp",
    "//sdk/lib/component/incoming/cpp",
    "//sdk/lib/component/outgoing/cpp",
    "//sdk/lib/sys/component/cpp/testing:cpp",
    "//sdk/lib/syslog/cpp",
    "//sdk/lib/zbi-format",
    "//src/lib/ddk",
    "//src/lib/ddk:ddk-metadata-headers",
  ]
}

executable("dtr_support_bin") {
  output_name = "dtr_support"
  sources = [
    "src/boot_items.cc",
    "src/boot_items.h",
    "src/dtr_support_main.cc",
    "src/root_job.cc",
    "src/root_job.h",
    "src/system_state.h",
  ]
  deps = [
    ":dtr_support_config",
    "//sdk/fidl/fuchsia.boot:fuchsia.boot_cpp",
    "//sdk/fidl/fuchsia.component.decl:fuchsia.component.decl_cpp",
    "//sdk/fidl/fuchsia.component.resolution:fuchsia.component.resolution_cpp",
    "//sdk/fidl/fuchsia.driver.development:fuchsia.driver.development_cpp",
    "//sdk/fidl/fuchsia.driver.framework:fuchsia.driver.framework_cpp",
    "//sdk/fidl/fuchsia.driver.test:fuchsia.driver.test_cpp",
    "//sdk/fidl/fuchsia.io:fuchsia.io_cpp",
    "//sdk/fidl/fuchsia.kernel:fuchsia.kernel_cpp",
    "//sdk/fidl/fuchsia.pkg:fuchsia.pkg_cpp",
    "//sdk/fidl/fuchsia.system.state:fuchsia.system.state_cpp",
    "//sdk/lib/async-loop:async-loop-cpp",
    "//sdk/lib/component/incoming/cpp",
    "//sdk/lib/component/outgoing/cpp",
    "//sdk/lib/syslog/cpp",
    "//sdk/lib/zbi-format",
    "//src/lib/ddk",
    "//src/lib/ddk:ddk-metadata-headers",
    "//src/lib/files",
    "//third_party/rapidjson",
  ]
}

fuchsia_component_manifest("manifest") {
  component_name = "driver_test_realm"
  manifest = "meta/driver_test_realm.cml"
}

fuchsia_component_manifest("dtr_support_manifest") {
  component_name = "dtr_support"
  manifest = "meta/dtr_support.cml"
}

fuchsia_structured_config_cpp_elf_lib("driver_test_realm_config") {
  cm_label = ":manifest"
}

fuchsia_structured_config_cpp_elf_lib("dtr_support_config") {
  cm_label = ":dtr_support_manifest"
}

fuchsia_structured_config_values("driver_test_realm_config_default") {
  cm_label = ":manifest"
  values = {
    tunnel_boot_items = false
  }
}

fuchsia_component("driver_test_realm_component") {
  cm_label = ":manifest"
  deps = [
    ":bin",
    ":driver_test_realm_config_default",
  ]
}

fuchsia_component("dtr_support_component") {
  cm_label = ":dtr_support_manifest"
  deps = [ ":dtr_support_bin" ]
}

executable("fake_resolver_bin") {
  output_name = "fake_resolver"
  sources = [ "fake_resolver.cc" ]
  data_deps = [ "//sdk/lib/driver_test_realm/fake_driver:component" ]
  deps = [
    "//sdk/fidl/fuchsia.component.decl:fuchsia.component.decl_cpp",
    "//sdk/fidl/fuchsia.component.resolution:fuchsia.component.resolution_cpp",
    "//sdk/fidl/fuchsia.driver.test:fuchsia.driver.test_cpp",
    "//sdk/fidl/fuchsia.io:fuchsia.io_cpp",
    "//sdk/fidl/fuchsia.pkg:fuchsia.pkg_cpp",
    "//sdk/lib/async-loop:async-loop-cpp",
    "//sdk/lib/async-loop:async-loop-default",
    "//sdk/lib/component/incoming/cpp",
    "//sdk/lib/component/outgoing/cpp",
    "//sdk/lib/syslog/cpp",
    "//src/lib/files",
    "//third_party/rapidjson",
  ]
}

fuchsia_component("fake_resolver") {
  manifest = "meta/fake_resolver.cml"
  deps = [ ":fake_resolver_bin" ]
}

fuchsia_component_manifest("driver_manager_manifest") {
  component_name = "driver_manager_test"
  manifest = "meta/driver_manager_test.cml"
}

fuchsia_structured_config_values("test_config") {
  cm_label = ":driver_manager_manifest"
  values = {
    set_root_driver_host_critical = false
    delay_fallback_until_base_drivers_indexed = true
    suspend_timeout_fallback = true
    verbose = false
    root_driver = "fuchsia-boot:///dtr#meta/test-parent-sys.cm"
    enable_test_shutdown_delays = false
    power_inject_offer = false
    power_suspend_enabled = false
  }
}

fuchsia_component("driver_manager_test") {
  cm_label = ":driver_manager_manifest"
  deps = [
    ":test_config",
    "//src/devices/bin/driver_manager",
  ]
}

fuchsia_component_manifest("test_realm_manifest") {
  component_name = "test_realm"
  manifest = "meta/test_realm.cml"
  restricted_features = [ "allow_long_names" ]
}

expect_includes("client_includes") {
  includes = [ "meta/client.shard.cml" ]
}

fuchsia_package("static_package") {
  testonly = true
  package_name = "static_driver_test_realm"
  deps = [
    ":static",
    "//src/devices/misc/drivers/test-parent",
  ]
}

fuchsia_package("package") {
  package_name = "driver_test_realm"
  deps = [
    ":driver_test_realm",
    "//src/devices/misc/drivers/test-parent",
  ]
}

exported_fuchsia_package_archive("package-archive") {
  package = ":package"
}

# Define Bazel input resource so it can be used
export_fuchsia_package_to_bazel("package-bazel") {
  package = ":package"
  package_name = "driver_test_realm"
}
