Home | History | Annotate | Download | only in network
      1 # Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import logging
      6 
      7 from autotest_lib.client.bin import utils
      8 from autotest_lib.client.common_lib import error
      9 from autotest_lib.client.common_lib import utils
     10 from autotest_lib.client.common_lib.cros.network import xmlrpc_datatypes
     11 from autotest_lib.client.cros import constants
     12 from autotest_lib.server import frontend
     13 from autotest_lib.server import site_utils
     14 from autotest_lib.server import test
     15 from autotest_lib.site_utils import lxc
     16 from autotest_lib.server.cros.network import wifi_test_context_manager
     17 
     18 class WiFiCellTestBase(test.test):
     19     """An abstract base class for autotests in WiFi cells.
     20 
     21     WiFiCell tests refer to participants in the test as client, router, and
     22     server.  The client is just the DUT and the router is a nearby AP which we
     23     configure in various ways to test the ability of the client to connect.
     24     There is a third entity called a server which is distinct from the autotest
     25     server.  In WiFiTests, the server is a host which the client can only talk
     26     to over the WiFi network.
     27 
     28     WiFiTests have a notion of the control network vs the WiFi network.  The
     29     control network refers to the network between the machine running the
     30     autotest server and the various machines involved in the test.  The WiFi
     31     network is the subnet(s) formed by WiFi routers between the server and the
     32     client.
     33 
     34     """
     35 
     36     def _install_pyshark(self):
     37         """Installs pyshark and its dependencies for packet capture analysis.
     38 
     39         Uses SSP to install the required pyshark python module and its
     40         dependencies including the tshark binary.
     41         """
     42         logging.info('Installing Pyshark')
     43         try:
     44             lxc.install_packages(['tshark', 'python-dev', 'libxml2-dev',
     45                                   'libxslt-dev', 'zlib1g-dev'],
     46                                  ['pyshark'])
     47         except error.ContainerError as e:
     48             logging.info('Not installing pyshark: %s', e)
     49         except error.CmdError as e:
     50             raise error.TestError('Error installing pyshark: %s', e)
     51 
     52 
     53     def initialize(self, host):
     54         self._install_pyshark()
     55         if utils.host_could_be_in_afe(host.hostname):
     56             # There are some DUTs that have different types of wifi modules.
     57             # In order to generate separate performance graphs, a variant
     58             # name is needed.  Writing this key will generate results with
     59             # the name of <board>-<variant>.
     60             afe = frontend.AFE(debug=True)
     61             variant_name = site_utils.get_label_from_afe(host.hostname,
     62                                                          'variant:',
     63                                                          afe)
     64             if variant_name:
     65                 self.write_test_keyval({constants.VARIANT_KEY: variant_name})
     66 
     67     @property
     68     def context(self):
     69         """@return the WiFi context for this test."""
     70         return self._wifi_context
     71 
     72 
     73     def parse_additional_arguments(self, commandline_args, additional_params):
     74         """Parse additional arguments for use in test.
     75 
     76         Subclasses should override this method do any other commandline parsing
     77         and setting grabbing that they need to do.  For test clarity, do not
     78         parse additional settings in the body of run_once.
     79 
     80         @param commandline_args dict of argument key, value pairs.
     81         @param additional_params object defined by test control file.
     82 
     83         """
     84         pass
     85 
     86 
     87     def warmup(self, host, raw_cmdline_args, additional_params=None):
     88         """
     89         Use the additional_params argument to pass in custom test data from
     90         control file to reuse test logic.  This object will be passed down via
     91         parse_additional_arguments.
     92 
     93         @param host host object representing the client DUT.
     94         @param raw_cmdline_args raw input from autotest.
     95         @param additional_params object passed in from control file.
     96 
     97         """
     98         cmdline_args = utils.args_to_dict(raw_cmdline_args)
     99         logging.info('Running wifi test with commandline arguments: %r',
    100                      cmdline_args)
    101         self._wifi_context = wifi_test_context_manager.WiFiTestContextManager(
    102                 self.__class__.__name__,
    103                 host,
    104                 cmdline_args,
    105                 self.debugdir)
    106 
    107         self._wifi_context.setup()
    108         self.parse_additional_arguments(cmdline_args, additional_params)
    109 
    110         msg = '======= WiFi autotest setup complete. Starting test... ======='
    111         self._wifi_context.client.shill_debug_log(msg)
    112 
    113 
    114     def cleanup(self):
    115         msg = '======= WiFi autotest complete. Cleaning up... ======='
    116         self._wifi_context.client.shill_debug_log(msg)
    117         # If we fail during initialization, we might not have a context.
    118         if hasattr(self, '_wifi_context'):
    119             self._wifi_context.teardown()
    120 
    121 
    122     def configure_and_connect_to_ap(self, configuration_parameters):
    123         """
    124         Configure the router as an AP with the given parameters and connect
    125         the DUT to it.
    126 
    127         @param configuration_parameters HostapConfig object.
    128 
    129         @return name of the configured AP
    130         """
    131         self.context.configure(configuration_parameters)
    132         ap_ssid = self.context.router.get_ssid()
    133         assoc_params = xmlrpc_datatypes.AssociationParameters(ssid=ap_ssid)
    134         self.context.assert_connect_wifi(assoc_params)
    135         return ap_ssid
    136