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

group("all") {
  deps = [
    ":libpatchpanel",
    ":libpatchpanel-client",
    ":libpatchpanel-util",
    ":patchpaneld",
  ]
  if (use.fuzzer) {
    deps += [
      ":datapath_fuzzer",
      ":multicast_forwarder_fuzzer",
      ":ndproxy_fuzzer",
      ":patchpanel_client_fuzzer",
    ]
  }
  if (use.test) {
    deps += [ ":patchpanel_testrunner" ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo",
    "libchrome-${libbase_ver}",
    "libpermission_broker-client",
    "libshill-client",
    "libshill-net-${libbase_ver}",
    "protobuf-lite",
    "re2",
    "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" ]
}

util_sources = [
  "address_manager.cc",
  "mac_address_generator.cc",
  "net_util.cc",
  "socket.cc",
  "socket_forwarder.cc",
  "subnet.cc",
  "subnet_pool.cc",
]

libpatchpanel_sources = [
  "adb_proxy.cc",
  "arc_service.cc",
  "broadcast_forwarder.cc",
  "counters_service.cc",
  "crostini_service.cc",
  "datapath.cc",
  "device.cc",
  "dns/big_endian.cc",
  "dns/dns_response.cc",
  "dns/io_buffer.cc",
  "firewall.cc",
  "helper_process.cc",
  "manager.cc",
  "message_dispatcher.cc",
  "minijailed_process_runner.cc",
  "multicast_forwarder.cc",
  "multicast_proxy.cc",
  "ndproxy.cc",
  "network_monitor_service.cc",
  "routing_service.cc",
  "scoped_ns.cc",
  "shill_client.cc",
]

shared_library("libpatchpanel-util") {
  sources = util_sources
  configs += [ ":target_defaults" ]
}

static_library("libpatchpanel_test") {
  configs += [ ":target_defaults" ]
  all_dependent_pkg_deps = [
    "protobuf",
    "system_api",
  ]
  sources = libpatchpanel_sources
  deps = [ ":protos" ]
}

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

shared_library("libpatchpanel-client") {
  configs += [ ":target_defaults" ]
  all_dependent_pkg_deps = [
    "protobuf",
    "system_api",
  ]
  sources = [ "client.cc" ]
  sources += util_sources
}

executable("patchpaneld") {
  sources = [ "main.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libpatchpanel" ]
}

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

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

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

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

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

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

  executable("patchpanel_testrunner") {
    sources = [
      "address_manager_test.cc",
      "arc_service_test.cc",
      "client_test.cc",
      "counters_service_test.cc",
      "datapath_test.cc",
      "firewall_test.cc",
      "mac_address_generator_test.cc",
      "minijailed_process_runner_test.cc",
      "mock_firewall.cc",
      "ndproxy_test.cc",
      "net_util_test.cc",
      "network_monitor_service_test.cc",
      "routing_service_test.cc",
      "shill_client_test.cc",
      "subnet_pool_test.cc",
      "subnet_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":test_config",
    ]
    defines = [ "UNIT_TEST" ]
    deps = [
      ":libpatchpanel-client",
      ":libpatchpanel_test",
      "//common-mk/testrunner",
    ]
  }
}
