| # Copyright 2015 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 |
| |
| import common |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.common_lib import global_config |
| from autotest_lib.client.common_lib import utils |
| from autotest_lib.client.common_lib.cros.network import iw_runner |
| from autotest_lib.server import afe_utils |
| from autotest_lib.server import test |
| from autotest_lib.server.brillo import host_utils |
| |
| |
| class brillo_WifiInterfaceTest(test.test): |
| """Verify that a Brillo device has its wifi properly configured.""" |
| version = 1 |
| |
| def get_ifconfig_dict(self, ifconfig_output): |
| """Convert output of ifconfig into a dictionary. |
| |
| @param ifconfig_output: List of ifconfig output lines. |
| |
| @return Dictionary mapping interface names (e.g. 'wlan0') to their list |
| of stripped output lines. |
| """ |
| curr_iface = None |
| ifconfig_dict = {} |
| for line in ifconfig_output: |
| if curr_iface is None: |
| curr_iface, line = line.split(None, 1) |
| ifconfig_dict[curr_iface] = [] |
| |
| line = line.strip() |
| if line: |
| ifconfig_dict[curr_iface].append(line) |
| else: |
| curr_iface = None |
| |
| return ifconfig_dict |
| |
| |
| def run_once(self, host=None, ssid=None, passphrase=None, wifi_iface=None, |
| wifi_ssid=None): |
| """Check that a given wifi interface is properly configured. |
| |
| @param host: a host object representing the DUT. |
| @param ssid: A string representing the ssid to connect to. |
| @param passphrase: A string representing the passphrase to the ssid. |
| @param wifi_iface: Name of the wifi interface to test; None means we'll |
| try to detect at least one that works. |
| @param wifi_ssid: Name of the SSID we want the interface to be |
| connected to; None means any. |
| |
| @raise TestFail: The test failed. |
| """ |
| self.host = host |
| if afe_utils.host_in_lab(host): |
| ssid = utils.get_wireless_ssid(host.hostname) |
| passphrase = global_config.global_config.get_config_value( |
| 'CLIENT', 'wireless_password', default=None) |
| with host_utils.connect_to_ssid(host, ssid, passphrase): |
| err_iface = ('No interface is' if wifi_iface is None |
| else 'Interface %s is not' % wifi_iface) |
| |
| # First check link status and SSID. |
| iw = iw_runner.IwRunner(remote_host=host) |
| active_ifaces = [] |
| try: |
| iw_ifaces = [iface_tuple.if_name |
| for iface_tuple in iw.list_interfaces()] |
| if wifi_iface is not None: |
| if wifi_iface not in iw_ifaces: |
| raise error.TestFail( |
| 'Interface %s not listed by iw' % wifi_iface) |
| test_ifaces = [wifi_iface] |
| else: |
| test_ifaces = iw_ifaces |
| |
| for iface in test_ifaces: |
| iface_ssid = iw.get_link_value(iface, 'SSID') |
| if (iface_ssid is not None and |
| (wifi_ssid is None or iface_ssid == wifi_ssid)): |
| active_ifaces.append(iface) |
| except error.GenericHostRunError: |
| raise error.TestFail('Failed to run iw') |
| |
| if not active_ifaces: |
| err_ssid = 'any SSID' if wifi_ssid is None else ('SSID ' + |
| wifi_ssid) |
| raise error.TestFail('%s connected to %s' % (err_iface, |
| err_ssid)) |
| |
| logging.info('Active wifi interfaces: %s', ', '.join(active_ifaces)) |
| |
| # Then check IPv4 connectivity. |
| try: |
| ifconfig_output = host.run_output('ifconfig').splitlines() |
| except error.GenericHostRunError: |
| raise error.TestFail('Failed to run ifconfig') |
| |
| ifconfig_dict = self.get_ifconfig_dict(ifconfig_output) |
| connected_ifaces = [iface for iface in active_ifaces |
| if any(['inet addr:' in line |
| for line in ifconfig_dict.get(iface, |
| [])])] |
| if not connected_ifaces: |
| raise error.TestFail('%s IPv4 connected' % err_iface) |
| |
| logging.info('IPv4 connected wifi interfaces: %s', |
| ', '.join(connected_ifaces)) |