• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2010 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
5from autotest_lib.client.bin import test, utils
6from autotest_lib.client.common_lib import error
7from autotest_lib.client.cros import rtc, sys_power
8
9import logging
10
11class network_WiFiResume(test.test):
12    version = 1
13
14    def run_once(self, reachable=None, wifi_timeout=5, dev=None):
15        '''Check that WiFi is working after a resume
16
17        If test is successful, the performance key "secs_iface_up_delay" is
18        reported as seconds the interface needed to be up
19
20        @param reachable: ip address (string) to try to ping as a network test
21        @param dev: device (eg 'wlan0') to use for wifi tests.
22                    autodetected if unset
23        @param wifi_timeout: number of seconds with in which a WiFi association
24                        must be (re)established after a suspend/resume cycle
25        '''
26
27        if not dev:
28            dev = get_wifi_dev()
29
30        if not dev:
31            raise error.TestError('No WiFi device found')
32
33        logging.info('checking wifi interface %s', dev)
34        check_wifi_dev(dev)
35
36        if network_is_up(reachable=reachable, dev=dev):
37            suspend_to_ram()
38            start = rtc.get_seconds()
39            deadline = start + wifi_timeout
40            have_network = network_is_up(reachable=reachable, dev=dev)
41
42            while (not have_network) and (deadline > rtc.get_seconds()):
43                have_network = network_is_up(reachable=reachable, dev=dev)
44
45            if have_network:
46                delay = rtc.get_seconds() - start
47                logging.info('Network came up at %d seconds', delay)
48                self.write_perf_keyval({'secs_iface_up_delay': delay})
49                return
50
51            delay = rtc.get_seconds() - start
52            raise error.TestFail('Network down after %d seconds' % delay)
53
54        raise error.TestFail('Network down at start of test - cannot continue')
55
56
57def suspend_to_ram(secs_to_suspend=5):
58    logging.info('Scheduling wakeup in %d seconds\n', secs_to_suspend)
59    sys_power.do_suspend(secs_to_suspend)
60    logging.info('Woke up at %d', rtc.get_seconds())
61
62
63def get_wifi_dev():
64    return utils.system_output('iwconfig 2>/dev/null | (read i x; echo $i)')
65
66
67def check_wifi_dev(dev):
68    cmd = 'iwconfig %s 2>/dev/null | grep "^%s"' % (dev, dev)
69    ret = utils.system(cmd, ignore_status=True)
70    if dev and ret == 0:
71        return
72    raise error.TestError('"%s" is not a valid WiFi device' % dev)
73
74
75def get_pingable_address(dev=None):
76    if not dev:
77        dev = get_wifi_dev()
78    cmd = 'ip route show dev %s to match 0/0|if read X X G X; then echo $G; fi'
79    return utils.system_output(cmd % dev) or None
80
81
82def network_is_up(reachable=None, dev=None):
83    if not reachable:
84        reachable = get_pingable_address(dev=dev)
85    if not reachable:
86        return False
87    if utils.ping(reachable, tries=1) == 0:
88        return True
89    return False
90