# Copyright (c) 2021 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.

from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros.network import ping_runner
from autotest_lib.server.cros.network import ip_config_context_manager
from autotest_lib.server.cros.network import wifi_cell_test_base


class WiFiCellPerfTestBase(wifi_cell_test_base.WiFiCellTestBase):
    """An abstract base class for autotests in WiFi performance cells.

    Similar to WiFiCellTestBase with one major exception:

    The pcap device is also used as an endpoint in performance tests, so the
    router and pcap device must have a direct Ethernet connection over their LAN
    ports in a WiFiCellPerfTestBase.
    """

    def configure_and_connect_to_ap(self, ap_config):
        """Configure the router as an AP with the given config and connect
        the DUT to it.

        @param ap_config HostapConfig object.

        @return name of the configured AP
        """
        # self.context.configure has a similar check - but that one only
        # errors out if the AP *requires* VHT i.e. AP is requesting
        # MODE_11AC_PURE and the client does not support it.
        # For performance tests we don't want to run MODE_11AC_MIXED on the AP if
        # the client does not support VHT, as we are guaranteed to get the
        # same results at 802.11n/HT40 in that case.
        if ap_config.is_11ac and not self.context.client.is_vht_supported():
            raise error.TestNAError('Client does not have AC support')
        return super(WiFiCellPerfTestBase,
                     self).configure_and_connect_to_ap(ap_config)

    def _verify_additional_setup_requirements(self):
        """Ensure that the router and pcap device in the cell have a direct
        connection available over their respective LAN ports. Raises a test NA
        error if this connection cannot be verified.
        """
        router_lan_ip_addr = "192.168.1.50"
        pcap_lan_ip_addr = "192.168.1.51"
        router_lan_iface_name = "eth1"
        pcap_lan_iface_name = "eth1"

        with ip_config_context_manager.IpConfigContextManager() as ip_context:
            try:
                ip_context.bring_interface_up(self.context.router.host,
                                              router_lan_iface_name)
                ip_context.bring_interface_up(self.context.pcap_host.host,
                                              pcap_lan_iface_name)
                ip_context.assign_ip_addr_to_iface(self.context.router.host,
                                                   router_lan_ip_addr,
                                                   router_lan_iface_name)
                ip_context.assign_ip_addr_to_iface(self.context.pcap_host.host,
                                                   pcap_lan_ip_addr,
                                                   pcap_lan_iface_name)
                ping_config = ping_runner.PingConfig(
                        pcap_lan_ip_addr,
                        count=5,
                        source_iface=router_lan_iface_name)
                self.context.router.ping(ping_config)
            except:
                raise error.TestNAError(
                        'Could not verify connection between router and pcap '
                        'devices. Router and pcap device must have a direct '
                        'Ethernet connection over their LAN ports to run '
                        'performance tests.')
