# Copyright 2020 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")
import("//common-mk/proto_library.gni")

group("all") {
  deps = [ ":libpatchpanel-client" ]
  if (use.fuzzer) {
    deps += [ ":patchpanel_client_fuzzer" ]
  }
  if (use.test) {
    deps += [ ":patchpanel-client_testrunner" ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "system_api",
  ]
  if (use.fuzzer) {
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
  defines = [ "USE_ARCVM=${use.arcvm}" ]
}

proto_library("protos") {
  configs = [ ":target_defaults" ]
  proto_in_dir = ".."
  proto_out_dir = "include/patchpanel"
  sources = [ "${proto_in_dir}/ipc.proto" ]
}

libpatchpanel_client_sources = [
  "../net_util.cc",
  "client.cc",
  "fake_client.cc",
]

static_library("libpatchpanel-client_test") {
  configs += [ ":target_defaults" ]
  all_dependent_pkg_deps = [
    "protobuf",
    "system_api",
  ]
  sources = libpatchpanel_client_sources
  deps = [ ":protos" ]
}

shared_library("libpatchpanel-client") {
  configs += [ ":target_defaults" ]
  all_dependent_pkg_deps = [ "protobuf" ]
  libs = [ "system_api" ]
  sources = libpatchpanel_client_sources
}

if (use.fuzzer) {
  pkg_config("fuzzing_config") {
    pkg_deps = [ "libchrome-test" ]
  }

  executable("patchpanel_client_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer",
      ":target_defaults",
      ":fuzzing_config",
    ]
    sources = [ "client_fuzzer.cc" ]
    deps = [ ":libpatchpanel-client" ]
  }
}

if (use.test) {
  pkg_config("test_config") {
    pkg_deps = [ "libchrome-test" ]
  }

  executable("patchpanel-client_testrunner") {
    sources = [ "client_test.cc" ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":test_config",
    ]
    defines = [ "UNIT_TEST" ]
    deps = [
      ":libpatchpanel-client_test",
      "//common-mk/testrunner",
    ]
  }
}
