# Copyright 2016 The Fuchsia 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("//build/config.gni")
import("//build/fuzzing/fuzzer.gni")
import("//build/package.gni")
import("//build/test.gni")
import("//build/test/test_package.gni")
import("//build/testing/environments.gni")

declare_args() {
  # Enables the tracing feature of mdns, which can be turned on using
  # "mdns-util verbose".
  enable_mdns_trace = false
}

group("service") {
  testonly = true
  deps = [
    ":bin",
    ":mdns",
    ":mdns_config",
    ":mdns_fuzzers",
    ":mdns_test",
    ":mdns_tests",
    ":packet_reader_fuzzer",
    ":source_set",
  ]
}

executable("bin") {
  output_name = "mdns"

  sources = [ "main.cc" ]

  deps = [
    ":source_set",
    "//zircon/public/lib/async-loop-cpp",
    "//zircon/public/lib/async-loop-default",
  ]
}

source_set("source_set") {
  sources = [
    "address_prober.cc",
    "address_prober.h",
    "address_responder.cc",
    "address_responder.h",
    "config.cc",
    "config.h",
    "dns_formatting.cc",
    "dns_formatting.h",
    "dns_message.cc",
    "dns_message.h",
    "dns_reading.cc",
    "dns_reading.h",
    "dns_writing.cc",
    "dns_writing.h",
    "host_name_resolver.cc",
    "host_name_resolver.h",
    "instance_prober.cc",
    "instance_prober.h",
    "instance_requestor.cc",
    "instance_requestor.h",
    "instance_responder.cc",
    "instance_responder.h",
    "mdns.cc",
    "mdns.h",
    "mdns_addresses.cc",
    "mdns_addresses.h",
    "mdns_agent.h",
    "mdns_fidl_util.cc",
    "mdns_fidl_util.h",
    "mdns_interface_transceiver.cc",
    "mdns_interface_transceiver.h",
    "mdns_interface_transceiver_v4.cc",
    "mdns_interface_transceiver_v4.h",
    "mdns_interface_transceiver_v6.cc",
    "mdns_interface_transceiver_v6.h",
    "mdns_names.cc",
    "mdns_names.h",
    "mdns_service_impl.cc",
    "mdns_service_impl.h",
    "mdns_transceiver.cc",
    "mdns_transceiver.h",
    "packet_reader.cc",
    "packet_reader.h",
    "packet_writer.cc",
    "packet_writer.h",
    "prober.cc",
    "prober.h",
    "reply_address.cc",
    "reply_address.h",
    "resource_renewer.cc",
    "resource_renewer.h",
  ]

  public_deps = [
    "//garnet/public/lib/fostr",
    "//garnet/public/lib/json",
    "//sdk/fidl/fuchsia.net.mdns",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/lib/sys/cpp",
    "//src/lib/fsl",
    "//src/lib/inet",
    "//src/lib/json_parser",
    "//src/lib/syslog/cpp",
    "//third_party/rapidjson",
    "//zircon/public/lib/fit",
    "//zircon/system/fidl/fuchsia-device",
    "//zircon/system/fidl/fuchsia-net",
  ]

  if (enable_mdns_trace) {
    defines = [ "MDNS_TRACE" ]
  }
}

test("mdns_test") {
  sources = [
    "test/agent_test.cc",
    "test/agent_test.h",
    "test/config_test.cc",
    "test/dns_names_test.cc",
    "test/dns_reading_test.cc",
    "test/instance_responder_test.cc",
    "test/interface_transceiver_test.cc",
  ]

  deps = [
    ":source_set",
    "//src/lib/fxl/test:gtest_main",
    "//zircon/public/lib/async-loop-cpp",
    "//zircon/public/lib/async-loop-default",
  ]
}

package("mdns") {
  deps = [ ":bin" ]

  binaries = [
    {
      name = "mdns"
    },
  ]

  meta = [
    {
      path = rebase_path("meta/mdns.cmx")
      dest = "mdns.cmx"
    },
  ]
}

config_data("mdns_config") {
  for_pkg = "sysmgr"
  outputs = [ "mdns.config" ]
  sources = [ rebase_path("config/service.config") ]
}

config_data("mdns_fuchsia_udp_config") {
  for_pkg = "mdns"
  sources = [ rebase_path("config/fuchsia_udp.config") ]

  # Ensure exclusion from production builds.
  deps = [ "//build/validate:non_production_tag" ]
}

group("tests") {
  testonly = true
  deps = [
    ":mdns-netemul-multi-network-tests",
    ":mdns_fuzzers",
    ":mdns_netemul_tests",
    ":mdns_netemul_v6_tests",
    ":mdns_tests",
  ]
}

test_package("mdns_tests") {
  deps = [ ":mdns_test" ]

  tests = [
    {
      name = "mdns_test"
      environments = [ qemu_env ]
    },
  ]
}

fuzzer("packet_reader_fuzzer") {
  sources = [
    "dns_message.cc",
    "dns_message.h",
    "dns_reading.cc",
    "dns_reading.h",
    "packet_reader.cc",
    "packet_reader.h",
    "packet_reader_fuzzer.cc",
  ]
  deps = [
    "//src/lib/inet",
    "//src/lib/syslog/cpp",
  ]
}

fuzzers_package("mdns_fuzzers") {
  fuzzers = [ ":packet_reader_fuzzer" ]
}

executable("mdns_netemul_test_agent") {
  testonly = true

  sources = [ "test/mdns_netemul_test_agent.cc" ]

  deps = [
    "//garnet/public/lib/fostr/fidl/fuchsia.net",
    "//garnet/public/lib/fostr/fidl/fuchsia.net.mdns",
    "//sdk/fidl/fuchsia.net.mdns",
    "//sdk/lib/sys/cpp",
    "//src/lib/fsl",
    "//src/lib/syslog/cpp",
    "//zircon/public/lib/async-cpp",
    "//zircon/public/lib/async-loop-cpp",
    "//zircon/public/lib/async-loop-default",
  ]
}

test_package("mdns_netemul_tests") {
  deps = [
    ":mdns_netemul_test_agent",
    ":netemul_empty_binaries",
    "//src/connectivity/network/tests:device_name_provider",
  ]

  meta = [
    {
      path = rebase_path("meta/mdns_netemul_test_agent.cmx")
      dest = "mdns_netemul_test_agent.cmx"
    },
  ]

  binaries = [
    {
      name = "mdns_netemul_test_agent"
    },
  ]

  tests = [
    {
      name = "mdns_netemul_test"
    },
  ]
}

group("netemul_empty_binaries") {
  write_file("$root_out_dir/mdns_netemul_test", "")
}

test_package("mdns_netemul_v6_tests") {
  deps = [
    ":mdns_netemul_test_agent",
    ":netemul_empty_v6_binaries",
    "//src/connectivity/network/tests:device_name_provider",
  ]

  meta = [
    {
      path = rebase_path("meta/mdns_netemul_test_agent.cmx")
      dest = "mdns_netemul_test_agent.cmx"
    },
  ]

  binaries = [
    {
      name = "mdns_netemul_test_agent"
    },
  ]

  tests = [
    {
      name = "mdns_netemul_v6_test"
    },
  ]
}

group("netemul_empty_v6_binaries") {
  write_file("$root_out_dir/mdns_netemul_v6_test", "")
}

executable("mdns_netemul_multi_network_test_agent") {
  testonly = true

  sources = [ "test/mdns_netemul_multi_network_test_agent.cc" ]

  deps = [
    ":source_set",
    "//sdk/lib/sys/cpp",
    "//src/connectivity/network/testing/netemul/lib/fidl:sync",
    "//zircon/public/lib/async-cpp",
    "//zircon/public/lib/async-loop-cpp",
    "//zircon/public/lib/async-loop-default",
    "//zircon/system/fidl/fuchsia-net",
  ]
}

test_package("mdns-netemul-multi-network-tests") {
  deps = [
    ":mdns_netemul_multi_network_test_agent",
    ":netemul_empty_multi_network_binaries",
    "//src/connectivity/network/tests:device_name_provider",
  ]

  meta = [
    {
      path = rebase_path("meta/mdns_netemul_multi_network_test_agent.cmx")
      dest = "mdns_netemul_multi_network_test_agent.cmx"
    },
  ]

  binaries = [
    {
      name = "mdns_netemul_multi_network_test_agent"
    },
  ]

  tests = [
    {
      name = "mdns_netemul_multi_network_test"
      environments = [ qemu_env ]
    },
  ]
}

group("netemul_empty_multi_network_binaries") {
  write_file("$root_out_dir/mdns_netemul_multi_network_test", "")
}
