1# Copyright (c) 2012 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
5import logging
6import time
7
8from autotest_lib.client.common_lib import error
9from autotest_lib.client.common_lib.cros import chrome
10from autotest_lib.client.cros.bluetooth import bluetooth_device_xmlrpc_server
11from autotest_lib.client.cros.input_playback import keyboard
12from autotest_lib.client.cros.power import power_test
13from autotest_lib.client.cros.power import power_utils
14
15
16class power_Idle(power_test.power_Test):
17    """class for power_Idle test.
18
19    Collects power stats when machine is idle
20
21    Current tests,
22
23      | test# | seconds | display   | bluetooth |
24      -------------------------------------------
25      | 1     | 120     | off       | off       |
26      | 2     | 120     | default   | off       |
27      | 3     | 120     | default   | on - idle |
28      | 4     | 120     | off       | on - idle |
29
30    """
31    version = 1
32    first_test_warmup_secs = 60
33
34    def initialize(self, pdash_note='', seconds_period=10.,
35                   force_discharge=False):
36        super(power_Idle, self).initialize(seconds_period=seconds_period,
37                                           pdash_note=pdash_note,
38                                           force_discharge=force_discharge)
39
40    def run_once(self, warmup_secs=20, idle_secs=120, default_only=False):
41        """Collect power stats for idle tests."""
42
43        def measure_it(warmup_secs, idle_secs, tagname):
44            """Helper function to wrap testing loop for each sub test."""
45            if self.is_first_test:
46                warmup_secs += self.first_test_warmup_secs
47                self.is_first_test = False
48            if warmup_secs > 0:
49                tstart = time.time()
50                time.sleep(warmup_secs)
51                self.checkpoint_measurements("warmup", tstart)
52            tstart = time.time()
53            time.sleep(idle_secs)
54            self.checkpoint_measurements(tagname, tstart)
55
56        bt_device = bluetooth_device_xmlrpc_server \
57            .BluetoothDeviceXmlRpcDelegate()
58
59        with chrome.Chrome() as self.cr:
60            self.is_first_test = True
61
62            # Measure power in full-screen blank tab
63            tab = self.cr.browser.tabs.New()
64            tab.Activate()
65            fullscreen = tab.EvaluateJavaScript('document.webkitIsFullScreen')
66            if not fullscreen:
67                with keyboard.Keyboard() as keys:
68                    keys.press_key('f4')
69
70            if default_only:
71                self.start_measurements()
72                measure_it(warmup_secs, idle_secs, 'all-default')
73                return
74
75            # test1 : display off, BT off
76            power_utils.set_display_power(power_utils.DISPLAY_POWER_ALL_OFF)
77            if not bt_device.set_powered(False):
78                raise error.TestFail('Cannot turn off bluetooth adapter.')
79            self.start_measurements()
80            measure_it(warmup_secs, idle_secs, 'display-off_bluetooth-off')
81
82            # test2 : display default, BT off
83            power_utils.set_display_power(power_utils.DISPLAY_POWER_ALL_ON)
84            measure_it(warmup_secs, idle_secs,
85                       'display-default_bluetooth-off')
86
87            # test3 : display default, BT on
88            if not bt_device.set_powered(True):
89                logging.warning('Cannot turn on bluetooth adapter.')
90                return
91            measure_it(warmup_secs, idle_secs, 'display-default_bluetooth-on')
92
93            # test4 : display off, BT on
94            power_utils.set_display_power(power_utils.DISPLAY_POWER_ALL_OFF)
95            measure_it(warmup_secs, idle_secs, 'display-off_bluetooth-on')
96
97    def cleanup(self):
98        """Reset to previous state."""
99        power_utils.set_display_power(power_utils.DISPLAY_POWER_ALL_ON)
100        super(power_Idle, self).cleanup()
101