# 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") {
  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_query.cc",
  "dns/dns_response.cc",
  "dns/dns_util.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
  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") {
  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" ]
}

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") {
    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("firewall_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer",
      ":target_defaults",
      ":fuzzing_config",
    ]
    sources = [ "firewall_fuzzer.cc" ]
    deps = [ ":libpatchpanel" ]
  }

  executable("counters_service_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer",
      ":target_defaults",
      ":fuzzing_config",
    ]
    sources = [ "counters_service_fuzzer.cc" ]
    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",
      "mock_firewall.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",
    ]
  }
}
