# 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 += [
      ":big_endian_fuzzer",
      ":broadcast_forwarder_fuzzer",
      ":counters_service_fuzzer",
      ":datapath_fuzzer",
      ":dns_query_fuzzer",
      ":dns_util_fuzzer",
      ":firewall_fuzzer",
      ":multicast_forwarder_fuzzer",
      ":ndproxy_fuzzer",
      ":net_util_fuzzer",
    ]
  }
  if (use.test) {
    deps += [ ":patchpanel_testrunner" ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libmetrics",
    "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("big_endian_fuzzer") {
    sources = [ "dns/big_endian_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer",
      ":target_defaults",
      ":fuzzing_config",
    ]
    deps = [ ":libpatchpanel" ]
  }

  executable("broadcast_forwarder_fuzzer") {
    sources = [ "broadcast_forwarder_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" ]
  }

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

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

  executable("dns_util_fuzzer") {
    sources = [ "dns/dns_util_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("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("net_util_fuzzer") {
    sources = [ "net_util_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",
    ]
  }
}
