blob: c620640c4ddff5197ae8c178aeedaa670104fe1d [file] [log] [blame]
# 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))