# Copyright (c) 2013 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 logging

from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import utils
from autotest_lib.client.cros import constants
from autotest_lib.server import frontend
from autotest_lib.server import site_utils
from autotest_lib.server import test
from autotest_lib.server.cros.network import wifi_test_context_manager

class WiFiCellTestBase(test.test):
    """An abstract base class for autotests in WiFi cells.

    WiFiCell tests refer to participants in the test as client, router, and
    server.  The client is just the DUT and the router is a nearby AP which we
    configure in various ways to test the ability of the client to connect.
    There is a third entity called a server which is distinct from the autotest
    server.  In WiFiTests, the server is a host which the client can only talk
    to over the WiFi network.

    WiFiTests have a notion of the control network vs the WiFi network.  The
    control network refers to the network between the machine running the
    autotest server and the various machines involved in the test.  The WiFi
    network is the subnet(s) formed by WiFi routers between the server and the
    client.

    """

    def initialize(self, host):
        if utils.host_is_in_lab_zone(host.hostname):
            # There are some DUTs that have different types of wifi modules.
            # In order to generate separate performance graphs, a variant
            # name is needed.  Writing this key will generate results with
            # the name of <board>-<variant>.
            afe = frontend.AFE(debug=True)
            variant_name = site_utils.get_label_from_afe(host.hostname,
                                                         'variant:',
                                                         afe)
            if variant_name:
                self.write_test_keyval({constants.VARIANT_KEY: variant_name})

    @property
    def context(self):
        """@return the WiFi context for this test."""
        return self._wifi_context


    def parse_additional_arguments(self, commandline_args, additional_params):
        """Parse additional arguments for use in test.

        Subclasses should override this method do any other commandline parsing
        and setting grabbing that they need to do.  For test clarity, do not
        parse additional settings in the body of run_once.

        @param commandline_args dict of argument key, value pairs.
        @param additional_params object defined by test control file.

        """
        pass


    def warmup(self, host, raw_cmdline_args, additional_params=None):
        """
        Use the additional_params argument to pass in custom test data from
        control file to reuse test logic.  This object will be passed down via
        parse_additional_arguments.

        @param host host object representing the client DUT.
        @param raw_cmdline_args raw input from autotest.
        @param additional_params object passed in from control file.

        """
        cmdline_args = utils.args_to_dict(raw_cmdline_args)
        logging.info('Running wifi test with commandline arguments: %r',
                     cmdline_args)
        self._wifi_context = wifi_test_context_manager.WiFiTestContextManager(
                self.__class__.__name__,
                host,
                cmdline_args,
                self.debugdir)

        self._wifi_context.setup()
        self.parse_additional_arguments(cmdline_args, additional_params)


    def cleanup(self):
        # If we fail during initialization, we might not have a context.
        if hasattr(self, '_wifi_context'):
            self._wifi_context.teardown()
