blob: 25a00efff32f31ed09637a5a4e6d6f74cf0e9f94 [file] [log] [blame]
# Copyright (c) 2010 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.bin import test, utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import rtc, sys_power
import logging
class network_WiFiResume(test.test):
version = 1
def run_once(self, reachable=None, wifi_timeout=5, dev=None):
'''Check that WiFi is working after a resume
If test is successful, the performance key "secs_iface_up_delay" is
reported as seconds the interface needed to be up
@param reachable: ip address (string) to try to ping as a network test
@param dev: device (eg 'wlan0') to use for wifi tests.
autodetected if unset
@param wifi_timeout: number of seconds with in which a WiFi association
must be (re)established after a suspend/resume cycle
'''
if not dev:
dev = get_wifi_dev()
if not dev:
raise error.TestError('No WiFi device found')
logging.info('checking wifi interface %s', dev)
check_wifi_dev(dev)
if network_is_up(reachable=reachable, dev=dev):
suspend_to_ram()
start = rtc.get_seconds()
deadline = start + wifi_timeout
have_network = network_is_up(reachable=reachable, dev=dev)
while (not have_network) and (deadline > rtc.get_seconds()):
have_network = network_is_up(reachable=reachable, dev=dev)
if have_network:
delay = rtc.get_seconds() - start
logging.info('Network came up at %d seconds', delay)
self.write_perf_keyval({'secs_iface_up_delay': delay})
return
delay = rtc.get_seconds() - start
raise error.TestFail('Network down after %d seconds' % delay)
raise error.TestFail('Network down at start of test - cannot continue')
def suspend_to_ram(secs_to_suspend=5):
logging.info('Scheduling wakeup in %d seconds\n', secs_to_suspend)
sys_power.do_suspend(secs_to_suspend)
logging.info('Woke up at %d', rtc.get_seconds())
def get_wifi_dev():
return utils.system_output('iwconfig 2>/dev/null | (read i x; echo $i)')
def check_wifi_dev(dev):
cmd = 'iwconfig %s 2>/dev/null | grep "^%s"' % (dev, dev)
ret = utils.system(cmd, ignore_status=True)
if dev and ret == 0:
return
raise error.TestError('"%s" is not a valid WiFi device' % dev)
def get_pingable_address(dev=None):
if not dev:
dev = get_wifi_dev()
cmd = 'ip route show dev %s to match 0/0|if read X X G X; then echo $G; fi'
return utils.system_output(cmd % dev) or None
def network_is_up(reachable=None, dev=None):
if not reachable:
reachable = get_pingable_address(dev=dev)
if not reachable:
return False
if utils.ping(reachable, tries=1) == 0:
return True
return False