# Copyright 2018 The Chromium OS 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("//common-mk/pkg_config.gni")

group("all") {
  deps = [ ":runtime_probe" ]
  if (use.test) {
    deps += [ ":unittest_runner" ]
  }
  if (use.fuzzer) {
    deps += [
      ":runtime_probe_probestatement_fuzzer",
      ":runtime_probe_resultchecker_fuzzer",
    ]
  }
  if (use.factory_runtime_probe) {
    deps += [ ":factory_runtime_probe_installer" ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libcros_config",
    "protobuf",
    "system_api",
    "vboot_host",
  ]
  defines = [ "USE_FACTORY_RUNTIME_PROBE=${use.factory_runtime_probe}" ]
}

source_set("lib") {
  sources = [
    "component_category.cc",
    "field_converter.cc",
    "probe_config.cc",
    "probe_config_loader_impl.cc",
    "probe_function.cc",
    "probe_function_argument.cc",
    "probe_result_checker.cc",
    "probe_statement.cc",
    "system_property_impl.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [
    "//runtime_probe/functions",
    "//runtime_probe/system",
    "//runtime_probe/utils",
  ]
}

executable("runtime_probe") {
  sources = [ "runtime_probe.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":lib" ]
  if (use.factory_runtime_probe) {
    output_name = "factory_runtime_probe"
    install_path = "bin"
  } else {
    sources += [ "daemon.cc" ]
  }
}

if (use.test) {
  executable("unittest_runner") {
    sources = [
      "field_converter_test.cc",
      "probe_config_loader_impl_test.cc",
      "probe_config_test.cc",
      "probe_function_argument_test.cc",
      "probe_result_checker_test.cc",
      "probe_statement_test.cc",
    ]
    configs += [
      ":target_defaults",
      "//common-mk:test",
    ]
    data = [
      "testdata/probe_config.json",
      "testdata/test.txt",
    ]
    deps = [
      ":lib",
      "//common-mk/testrunner",
      "//runtime_probe/functions:test",
      "//runtime_probe/utils:test",
    ]
  }
}

if (use.fuzzer) {
  executable("runtime_probe_resultchecker_fuzzer") {
    sources = [ "runtime_probe_resultchecker_fuzzer.cc" ]
    configs += [ "//common-mk/common_fuzzer" ]
    deps = [ ":lib" ]
    pkg_deps = [ "libchrome-test" ]
  }
  executable("runtime_probe_probestatement_fuzzer") {
    sources = [ "runtime_probe_probestatement_fuzzer.cc" ]
    configs += [ "//common-mk/common_fuzzer" ]
    deps = [ ":lib" ]
    pkg_deps = [ "libchrome-test" ]
  }
}

if (use.factory_runtime_probe) {
  action("factory_runtime_probe_installer") {
    script = "bundler.py"
    deps = [ ":runtime_probe" ]
    inputs = [ "$root_build_dir/factory_runtime_probe" ]
    outputs = [ "$root_build_dir/factory_runtime_probe_installer" ]
    install_configs = [
      {
        path = "/usr/bin"
        options = "-m755"
      },
    ]
    args = [
             "--root-dir",
             getenv("SYSROOT"),
             "--target-path",
           ] + inputs +
           [
             "--bundle-description",
             "Installer of the standalone version of factory_runtime_probe.",
             "--output-path",
           ] + outputs
  }
}
