# 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 = [
    ":libruntime_probe",
    ":runtime_probe",
  ]
  if (use.test) {
    deps += [ ":unittest_runner" ]
  }
  if (use.fuzzer) {
    deps += [
      ":runtime_probe_probestatement_fuzzer",
      ":runtime_probe_resultchecker_fuzzer",
    ]
  }
}

pkg_config("target_defaults") {
  # NOSORT
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libcros_config",
    "libpcrecpp",
    "libshill-client",

    # system_api depends on protobuf (or protobuf-lite). It must appear
    # before protobuf here or the linker flags won't be in the right
    # order.
    "system_api",
    "protobuf",
    "vboot_host",
  ]
}

static_library("libruntime_probe") {
  sources = [
    "component_category.cc",
    "daemon.cc",
    "function_templates/network.cc",
    "function_templates/storage.cc",
    "functions/all_functions.cc",
    "functions/ata_storage.cc",
    "functions/cellular_network.cc",
    "functions/ectool_i2cread.cc",
    "functions/edid.cc",
    "functions/ethernet_network.cc",
    "functions/generic_battery.cc",
    "functions/generic_network.cc",
    "functions/generic_storage.cc",
    "functions/input_device.cc",
    "functions/memory.cc",
    "functions/mmc_storage.cc",
    "functions/nvme_storage.cc",
    "functions/sequence.cc",
    "functions/sysfs.cc",
    "functions/usb_camera.cc",
    "functions/vpd_cached.cc",
    "functions/wireless_network.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",
    "utils/edid.cc",
    "utils/file_utils.cc",
    "utils/type_utils.cc",
    "utils/value_utils.cc",
  ]
  configs += [ ":target_defaults" ]
}

executable("runtime_probe") {
  sources = [ "runtime_probe.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libruntime_probe" ]
}

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

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