# Copyright 2019 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("//src/sys/build/components.gni")

group("tests") {
  testonly = true
  deps = [
    ":netstack-integration-tests",
    "ip_forward:netemul-ip-forward-tests",
  ]
}

tests = [
  "cobalt",
  "dhcp",
  "dns",
  "fidl",
  "inspect",
  "ipv6",
  "management",
  "routes",
  "socket",
]

foreach(test, tests) {
  name = "netstack_${test}_integration_test"
  fuchsia_component(name) {
    testonly = true
    manifest = "meta/${name}.cmx"
    deps = [ test ]
  }
}

fuchsia_test_package("netstack-integration-tests") {
  package_name = "netstack-integration-tests"

  # TODO(fxbug.dev/62551)): avoid these error logs:
  # [netstack,@set_interface_status] ERROR: netstack_service.go(345): (NIC 2).setState(enabled=false): not found
  # [netstack,ndp,@test_down_close_race_eth] ERROR: ndp.go(544): DAD for fe80::2644:e5a7:b11a:bf9e on nicID (7) encountered error = endpoint is closed for send, sending interface changed event...
  # [netstack,ndp,@test_down_close_race_eth] ERROR: ndp.go(544): DAD for fe80::c25:a6ff:fe82:5059 on nicID (7) encountered error = endpoint is closed for send, sending interface changed event...
  test_specs = {
    log_settings = {
      max_severity = "ERROR"
    }
  }

  test_components = []
  foreach(test, tests) {
    test_components += [ ":netstack_${test}_integration_test" ]
  }
  deps = [
    # device_name_provider provides fuchsia.device.NameProvider.
    "..:device_name_provider",

    # mock_cobalt provides fuchsia.cobalt.LoggerFactory and fuchsia.cobalt.test.LoggerQuerier.
    "//src/cobalt/bin/testing/mock_cobalt:component",

    # stash_secure is used by dhcpd and netstack.
    "//src/sys/stash:stash_secure",

    # dhcpd is used to test DHCP address acquisition.
    "//src/connectivity/network/dhcp:component",

    # DHCPv6 client is under test.
    "//src/connectivity/network/dhcpv6/client:component",

    # dns_resolver integration with netstack is tested.
    "//src/connectivity/network/dns:component",

    # netcfg integration with netstack is tested.
    ":netcfg-netemul-config",
    "//src/connectivity/network/netcfg:component-netemul",

    # netstack3 is under test.
    "//src/connectivity/network/netstack3:component",

    # netstack is under test.
    "//src/connectivity/network/netstack:component-debug",

    # network_manager integration with netstack is tested.
    ":network-manager-config",
    "//src/connectivity/management/network-manager:component-netemul",

    # netemul-sandbox is used to create hermetic environments.
    "//src/connectivity/network/testing/netemul/runner:netemul-sandbox-component",
  ]
}

config_data("netcfg-netemul-config") {
  testonly = true
  for_pkg = "netstack-integration-tests"
  sources = [ "//src/connectivity/network/netcfg/config/empty.json" ]
  outputs = [ "netcfg/empty.json" ]
}

config_data("network-manager-config") {
  testonly = true
  for_pkg = "netstack-integration-tests"
  sources =
      [ "//src/connectivity/management/network-manager/config/default.json" ]
  outputs = [ "factory_config.json" ]
}
