# 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-util",
    ":patchpaneld",
  ]
  if (use.fuzzer) {
    deps += [
      ":counters_service_fuzzer",
      ":datapath_fuzzer",
      ":firewall_fuzzer",
      ":multicast_forwarder_fuzzer",
      ":ndproxy_fuzzer",
    ]
  }
  if (use.test) {
    deps += [ ":patchpanel_testrunner" ]
  }
}

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

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

util_sources = [
  "address_manager.cc",
  "dns/big_endian.cc",
  "dns/dns_query.cc",
  "dns/dns_response.cc",
  "dns/dns_util.cc",
  "dns/io_buffer.cc",
  "guest_type.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",
  "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",
  "system.cc",
]

shared_library("libpatchpanel-util") {
  sources = util_sources
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libshill-client",
    "libshill-net",
    "protobuf-lite",
    "re2",
  ]
  libs = [ "system_api" ]
  if (use.fuzzer) {
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
  defines = [
    "USE_ARCVM=${use.arcvm}",
    "USE_JETSTREAM_ROUTING=${use.jetstream_routing}",
  ]
}

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

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

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

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

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

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

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

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

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

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

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