# Copyright 2018 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/compiled_action.gni")
import("//build/host.gni")
import("//build/rust/rustc_binary.gni")
import("//build/testing/golden_file.gni")
import("//tools/cmc/build/cml.gni")
import("//tools/configc/build/config.gni")

if (is_host) {
  rustc_binary("configc") {
    name = "configc"

    deps = [
      "//sdk/fidl/fuchsia.component.decl:fuchsia.component.decl-rustc",
      "//src/lib/assembly/validate_product",
      "//src/lib/fidl/rust/fidl",
      "//src/sys/lib/cm_rust",
      "//src/sys/pkg/lib/fuchsia-pkg",
      "//third_party/rust_crates:anyhow",
      "//third_party/rust_crates:argh",
      "//third_party/rust_crates:serde_json",
      "//third_party/rust_crates:serde_json5",
      "//tools/lib/config_client",
      "//tools/lib/config_value_file",
    ]

    sources = [
      "src/client_cpp.rs",
      "src/client_fidl.rs",
      "src/client_rust.rs",
      "src/common.rs",
      "src/cvf.rs",
      "src/main.rs",
      "src/validate_package.rs",
    ]
  }
}

install_host_tools("install") {
  deps = [ ":configc($host_toolchain)" ]

  outputs = [ "configc" ]
}

# Config Library Golden Tests
cm("config_manifest") {
  manifest = "goldens/config_manifest.cml"
  output_name = "config_manifest.cm"
  config_values_package_path = "goldens/config_values.json5"
}

fidl_config_client_lib_source("fidl_config_lib") {
  manifest_outputs = get_target_outputs(":config_manifest")
  compiled_manifest = manifest_outputs[0]
  name = "my.config.lib"
  deps = [ ":config_manifest" ]
  testonly = true
}

rust_config_client_lib_source("rust_config_lib") {
  manifest_outputs = get_target_outputs(":config_manifest")
  compiled_manifest = manifest_outputs[0]
  fidl_library_name = "my.config.lib"
  deps = [ ":config_manifest" ]
  testonly = true
}

cpp_config_client_lib_source("cpp_elf_config_lib") {
  manifest_outputs = get_target_outputs(":config_manifest")
  compiled_manifest = manifest_outputs[0]
  fidl_library_name = "my.config.lib"
  deps = [ ":config_manifest" ]
  flavor = "elf"
  testonly = true
}

cpp_config_client_lib_source("cpp_driver_config_lib") {
  manifest_outputs = get_target_outputs(":config_manifest")
  compiled_manifest = manifest_outputs[0]
  fidl_library_name = "my.config.lib"
  deps = [ ":config_manifest" ]
  flavor = "driver"
  testonly = true
}

golden_file("fidl_config_lib_golden_test") {
  golden = "goldens/config.fidl.golden"
  lib_outputs = get_target_outputs(":fidl_config_lib")
  current = lib_outputs[0]
  deps = [ ":fidl_config_lib" ]
  testonly = true
}

golden_file("rust_config_lib_golden_test") {
  golden = "goldens/config.rs.golden"
  lib_outputs = get_target_outputs(":rust_config_lib")
  current = lib_outputs[0]
  deps = [ ":rust_config_lib" ]
  testonly = true
}

golden_file("cpp_elf_config_lib_cc_golden_test") {
  golden = "goldens/config.cc.elf.golden"
  lib_outputs = get_target_outputs(":cpp_elf_config_lib")
  current = lib_outputs[0]
  deps = [ ":cpp_elf_config_lib" ]
  testonly = true
}

golden_file("cpp_elf_config_lib_h_golden_test") {
  golden = "goldens/config.h.elf.golden"
  lib_outputs = get_target_outputs(":cpp_elf_config_lib")
  current = lib_outputs[1]
  deps = [ ":cpp_elf_config_lib" ]
  testonly = true
}

golden_file("cpp_driver_config_lib_cc_golden_test") {
  golden = "goldens/config.cc.driver.golden"
  lib_outputs = get_target_outputs(":cpp_driver_config_lib")
  current = lib_outputs[0]
  deps = [ ":cpp_driver_config_lib" ]
  testonly = true
}

golden_file("cpp_driver_config_lib_h_golden_test") {
  golden = "goldens/config.h.driver.golden"
  lib_outputs = get_target_outputs(":cpp_driver_config_lib")
  current = lib_outputs[1]
  deps = [ ":cpp_driver_config_lib" ]
  testonly = true
}

group("tests") {
  testonly = true
  deps = [
    ":cpp_driver_config_lib_cc_golden_test",
    ":cpp_driver_config_lib_h_golden_test",
    ":cpp_elf_config_lib_cc_golden_test",
    ":cpp_elf_config_lib_h_golden_test",
    ":fidl_config_lib_golden_test",
    ":rust_config_lib_golden_test",
  ]
}

if (is_host) {
  group("host_tests") {
    testonly = true
    deps = [ "tests:fail_validate_without_config" ]
  }
}
