power_LoadTest.py revision bc1c98747adc2bcb9c0a7d130a3188f2f424aaff
1650be6d5f895abe5fd9fbca4cf242bdf92443c62Mike Truty# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 26a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda# Use of this source code is governed by a BSD-style license that can be 36a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda# found in the LICENSE file. 46a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda 53fa0580fde83c963b5f7f73636d5b9bb089f938cZdenek Behanimport logging, os, shutil, time 6b910a9da27688211de1a80121ae75146b09e80a4Eric Lifrom autotest_lib.client.bin import utils 7bee23c2b0ca824c12c39e7a5a4cd4d2a313918b7Eric Lifrom autotest_lib.client.common_lib import error 8b910a9da27688211de1a80121ae75146b09e80a4Eric Lifrom autotest_lib.client.cros import backchannel, cros_ui, cros_ui_test 9bee23c2b0ca824c12c39e7a5a4cd4d2a313918b7Eric Lifrom autotest_lib.client.cros import httpd, login, power_status 103fa0580fde83c963b5f7f73636d5b9bb089f938cZdenek Behanfrom autotest_lib.client.cros import flimflam_test_path 1102b5ce48af62ff6486a2423c0e0adea14e391a48Zdenek Behanimport flimflam 129450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis 139d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nandaparams_dict = { 149d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 'test_time_ms': '_mseconds', 159d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 'should_scroll': '_should_scroll', 169d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 'should_scroll_up': '_should_scroll_up', 179d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 'scroll_loop': '_scroll_loop', 189d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 'scroll_interval_ms': '_scroll_interval_ms', 199d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 'scroll_by_pixels': '_scroll_by_pixels', 207868162435adf9082b022a5ba6e00614c7c66381Simon Que 'tasks': '_tasks', 219d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda} 229d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 236a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda 24e7c4cab13a8576a4f9de41b2dc1fb8c45c97424cEric Liclass power_LoadTest(cros_ui_test.UITest): 25b7edff18c59e1caedc32f972551ec68b3620eea5Dale Curtis auto_login = False 2606548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung version = 2 2750fb54165e35caebc1bd90d409fcba0fe0b01658Sameer Nanda 28e7c4cab13a8576a4f9de41b2dc1fb8c45c97424cEric Li 29b7edff18c59e1caedc32f972551ec68b3620eea5Dale Curtis def start_authserver(self): 30b7edff18c59e1caedc32f972551ec68b3620eea5Dale Curtis """ 31b7edff18c59e1caedc32f972551ec68b3620eea5Dale Curtis Override cros_ui_test.UITest's start_authserver. 32b7edff18c59e1caedc32f972551ec68b3620eea5Dale Curtis Do not use auth server and local dns for our test. We need to be 33b7edff18c59e1caedc32f972551ec68b3620eea5Dale Curtis able to reach the web. 34b7edff18c59e1caedc32f972551ec68b3620eea5Dale Curtis """ 35b7edff18c59e1caedc32f972551ec68b3620eea5Dale Curtis pass 36b7edff18c59e1caedc32f972551ec68b3620eea5Dale Curtis 37b7edff18c59e1caedc32f972551ec68b3620eea5Dale Curtis 3806548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung def ensure_login_complete(self): 3906548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung """ 40e7c4cab13a8576a4f9de41b2dc1fb8c45c97424cEric Li Override cros_ui_test.UITest's ensure_login_complete. 4106548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung Do not use auth server and local dns for our test. We need to be 4206548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung able to reach the web. 4306548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung """ 4406548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung pass 4550fb54165e35caebc1bd90d409fcba0fe0b01658Sameer Nanda 46e7c4cab13a8576a4f9de41b2dc1fb8c45c97424cEric Li 4706548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung def initialize(self, creds='$default', percent_initial_charge_min=None, 484f99e9a29b81d14cc94eb711cdb4adb5e66872abSameer Nanda check_network=True, loop_time=3600, loop_count=1, 494f99e9a29b81d14cc94eb711cdb4adb5e66872abSameer Nanda should_scroll='true', should_scroll_up='true', 504f99e9a29b81d14cc94eb711cdb4adb5e66872abSameer Nanda scroll_loop='false', scroll_interval_ms='10000', 514f99e9a29b81d14cc94eb711cdb4adb5e66872abSameer Nanda scroll_by_pixels='600', low_battery_threshold=3, 529450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis verbose=True, force_wifi=False, wifi_ap='', wifi_sec='none', 53d73c2565c6d2756c52c793808455fd8b685b910eScott James Remnant wifi_pw='', tasks=""): 5406548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung 559d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda """ 569d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda percent_initial_charge_min: min battery charge at start of test 579d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda check_network: check that Ethernet interface is not running 58417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda loop_count: number of times to loop the test for 59417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda loop_time: length of time to run the test for in each loop 609d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda should_scroll: should the extension scroll pages 619d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda should_scroll_up: should scroll in up direction 629d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda scroll_loop: continue scrolling indefinitely 639d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda scroll_interval_ms: how often to scoll 649d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda scroll_by_pixels: number of pixels to scroll each time 659d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda """ 66417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda self._loop_time = loop_time 67417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda self._loop_count = loop_count 68417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda self._mseconds = self._loop_time * 1000 699d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda self._verbose = verbose 70417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda self._low_battery_threshold = low_battery_threshold 719d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda self._should_scroll = should_scroll 729d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda self._should_scroll_up = should_scroll_up 739d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda self._scroll_loop = scroll_loop 749d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda self._scroll_interval_ms = scroll_interval_ms 759d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda self._scroll_by_pixels = scroll_by_pixels 76417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda self._tmp_keyvals = {} 77bee23c2b0ca824c12c39e7a5a4cd4d2a313918b7Eric Li self._power_status = power_status.get_status() 78dfc0199adabc92a7311df0f00629afb171495de9Benson Leung self._json_path = None 79b5056ea955d1997ce7d28441656f6134b30a1a07Dale Curtis self._force_wifi = force_wifi 80b7edff18c59e1caedc32f972551ec68b3620eea5Dale Curtis self._testServer = None 81ffd2a04887ca6c31a6c9501f4c0df8d418f4b055Simon Que self._tasks = '\'' + tasks.replace(' ','') + '\'' 82b312dcf7a07ffdfe5a9625bbb1b5b08e81158b39Jason Glasgow self._backchannel = None 839d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 84cfa1ddf94edc7ac518a178415ec4a7c9a61a9dd6Todd Broch self._power_status.assert_battery_state(percent_initial_charge_min) 859450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis # If force wifi enabled, convert eth0 to backchannel and connect to the 869450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis # specified WiFi AP. 87b5056ea955d1997ce7d28441656f6134b30a1a07Dale Curtis if self._force_wifi: 889450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis # If backchannel is already running, don't run it again. 89b312dcf7a07ffdfe5a9625bbb1b5b08e81158b39Jason Glasgow self._backchannel = backchannel.Backchannel() 90b312dcf7a07ffdfe5a9625bbb1b5b08e81158b39Jason Glasgow if not self._backchannel.setup(): 919450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis raise error.TestError('Could not setup Backchannel network.') 929450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis 939450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis # Note: FlimFlam is flaky after Backchannel setup sometimes. It may 949450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis # take several tries for WiFi to connect. More experimentation with 959450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis # the retry settings here may be necessary if this becomes a source 969450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis # of test flakiness in the future. 976e6be985c67de742de2d463ff8522355a3995f5dDale Curtis if not flimflam.FlimFlam().ConnectService(retries=3, 986e6be985c67de742de2d463ff8522355a3995f5dDale Curtis retry=True, 999450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis service_type='wifi', 1009450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis ssid=wifi_ap, 1019450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis security=wifi_sec, 1029450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis passphrase=wifi_pw, 1039450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis mode='managed')[0]: 1049450ad9bc6e5537d93f31bd53f161067fb13a1d5Dale Curtis raise error.TestError('Could not connect to WiFi network.') 105278b5370c7d022768e0ab319ce7f439a877e4443Simon Que else: 106278b5370c7d022768e0ab319ce7f439a877e4443Simon Que # Find all wired ethernet interfaces. 107278b5370c7d022768e0ab319ce7f439a877e4443Simon Que # TODO: combine this with code in network_DisableInterface, in a 108278b5370c7d022768e0ab319ce7f439a877e4443Simon Que # common library somewhere. 109278b5370c7d022768e0ab319ce7f439a877e4443Simon Que ifaces = [ nic.strip() for nic in os.listdir('/sys/class/net/') 110278b5370c7d022768e0ab319ce7f439a877e4443Simon Que if ((not os.path.exists('/sys/class/net/' + nic + '/phy80211')) 111278b5370c7d022768e0ab319ce7f439a877e4443Simon Que and nic.find('eth') != -1) ] 112278b5370c7d022768e0ab319ce7f439a877e4443Simon Que logging.debug(str(ifaces)) 113278b5370c7d022768e0ab319ce7f439a877e4443Simon Que for iface in ifaces: 114278b5370c7d022768e0ab319ce7f439a877e4443Simon Que if check_network and backchannel.is_network_iface_running(iface): 115278b5370c7d022768e0ab319ce7f439a877e4443Simon Que raise error.TestError('Ethernet interface is active. ' + \ 116278b5370c7d022768e0ab319ce7f439a877e4443Simon Que 'Please remove Ethernet cable') 1179d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 118d075074b8fc70d829912864f819345407295f35dSameer Nanda # record the max backlight level 1194f99e9a29b81d14cc94eb711cdb4adb5e66872abSameer Nanda cmd = 'backlight-tool --get_max_brightness' 120d075074b8fc70d829912864f819345407295f35dSameer Nanda self._max_backlight = int(utils.system_output(cmd).rstrip()) 121d075074b8fc70d829912864f819345407295f35dSameer Nanda self._tmp_keyvals['level_backlight_max'] = self._max_backlight 1226a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda 1239d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda # fix up file perms for the power test extension so that chrome 1249d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda # can access it 125ce1407b29b32f8f8fb1121251e28f0861ecac6a8Sameer Nanda os.system('chmod -R 755 %s' % self.bindir) 1269d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 1277bcd700c40df1de04d8bf58e8f60f132df06b8e5Benson Leung # write test parameters to the params.js file to be read by the test 1287bcd700c40df1de04d8bf58e8f60f132df06b8e5Benson Leung # extension. 1297bcd700c40df1de04d8bf58e8f60f132df06b8e5Benson Leung self._write_ext_params() 13006548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung 13106548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung # copy external_extensions.json to known location 13206548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung self._json_path = os.path.join(self.bindir, '..') 13306548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung shutil.copy(os.path.join(self.bindir, 'external_extensions.json'), 13406548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung self._json_path) 1356a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda 1366a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda # setup a HTTP Server to listen for status updates from the power 1376a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda # test extension 138c4d8f4aab4e434fcb1a9fb33931768ffebfb8f1cEric Li self._testServer = httpd.HTTPListener(8001, docroot=self.bindir) 1396a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda self._testServer.run() 1406a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda 14187aced24632053d9df0a42842307abf165f60ad1Sameer Nanda # initialize various interesting power related stats 142bee23c2b0ca824c12c39e7a5a4cd4d2a313918b7Eric Li self._usb_stats = power_status.USBSuspendStats() 143bee23c2b0ca824c12c39e7a5a4cd4d2a313918b7Eric Li self._cpufreq_stats = power_status.CPUFreqStats() 144bee23c2b0ca824c12c39e7a5a4cd4d2a313918b7Eric Li self._cpuidle_stats = power_status.CPUIdleStats() 14587aced24632053d9df0a42842307abf165f60ad1Sameer Nanda 1466a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda 14787aced24632053d9df0a42842307abf165f60ad1Sameer Nanda self._usb_stats.refresh() 14887aced24632053d9df0a42842307abf165f60ad1Sameer Nanda self._cpufreq_stats.refresh() 14987aced24632053d9df0a42842307abf165f60ad1Sameer Nanda self._cpuidle_stats.refresh() 1509d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda self._power_status.refresh() 151417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda 1529d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda self._ah_charge_start = self._power_status.battery[0].charge_now 1539d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda self._wh_energy_start = self._power_status.battery[0].energy 1549d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 155e7c4cab13a8576a4f9de41b2dc1fb8c45c97424cEric Li # from cros_ui_test.UITest.initialize, sans authserver & local dns. 156d73c2565c6d2756c52c793808455fd8b685b910eScott James Remnant cros_ui_test.UITest.initialize(self, creds) 15706548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung 15806548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung def run_once(self): 15906548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung 160417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda t0 = time.time() 161417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda 162417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda for i in range(self._loop_count): 163417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda # the power test extension will report its status here 164417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda latch = self._testServer.add_wait_url('/status') 1656a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda 16606548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung # the act of logging in will launch chrome with external extension. 167b7edff18c59e1caedc32f972551ec68b3620eea5Dale Curtis self.login() 168417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda 169d075074b8fc70d829912864f819345407295f35dSameer Nanda # stop powerd 170d075074b8fc70d829912864f819345407295f35dSameer Nanda os.system('stop powerd') 171d075074b8fc70d829912864f819345407295f35dSameer Nanda 172d075074b8fc70d829912864f819345407295f35dSameer Nanda # reset X settings since X gets restarted upon login 173d075074b8fc70d829912864f819345407295f35dSameer Nanda self._do_xset() 174d075074b8fc70d829912864f819345407295f35dSameer Nanda 175d075074b8fc70d829912864f819345407295f35dSameer Nanda # reset backlight level since powerd might've modified it 176d075074b8fc70d829912864f819345407295f35dSameer Nanda # based on ambient light 177d075074b8fc70d829912864f819345407295f35dSameer Nanda self._set_backlight_level() 178d075074b8fc70d829912864f819345407295f35dSameer Nanda 179417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda low_battery = self._do_wait(self._verbose, self._loop_time, 18006548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung latch) 181417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda 182417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda if self._verbose: 183417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda logging.debug('loop %d completed' % i) 184417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda 185417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda if low_battery: 186417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda logging.info('Exiting due to low battery') 187417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda break 1886a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda 189bc1c98747adc2bcb9c0a7d130a3188f2f424aaffNirnimesh self.logout() 190bc1c98747adc2bcb9c0a7d130a3188f2f424aaffNirnimesh # Work around until crosbug.com/139166 is fixed 191bc1c98747adc2bcb9c0a7d130a3188f2f424aaffNirnimesh self.pyauto.ExecuteJavascriptInOOBEWebUI('Oobe.showSigninUI();' 192bc1c98747adc2bcb9c0a7d130a3188f2f424aaffNirnimesh 'window.domAutomationController.send("ok");') 193bc1c98747adc2bcb9c0a7d130a3188f2f424aaffNirnimesh 194417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda t1 = time.time() 195417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda self._tmp_keyvals['minutes_battery_life'] = (t1 - t0) / 60 1966a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda 1976a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda 1986a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda def postprocess_iteration(self): 1996a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda keyvals = {} 2009d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 20187aced24632053d9df0a42842307abf165f60ad1Sameer Nanda # refresh power related statistics 20287aced24632053d9df0a42842307abf165f60ad1Sameer Nanda usb_stats = self._usb_stats.refresh() 20387aced24632053d9df0a42842307abf165f60ad1Sameer Nanda cpufreq_stats = self._cpufreq_stats.refresh() 20487aced24632053d9df0a42842307abf165f60ad1Sameer Nanda cpuidle_stats = self._cpuidle_stats.refresh() 20587aced24632053d9df0a42842307abf165f60ad1Sameer Nanda 20687aced24632053d9df0a42842307abf165f60ad1Sameer Nanda # record percent time USB devices were not in suspended state 20787aced24632053d9df0a42842307abf165f60ad1Sameer Nanda keyvals['percent_usb_active'] = usb_stats 20887aced24632053d9df0a42842307abf165f60ad1Sameer Nanda 20987aced24632053d9df0a42842307abf165f60ad1Sameer Nanda # record percent time spent in each CPU C-state 21087aced24632053d9df0a42842307abf165f60ad1Sameer Nanda for state in cpuidle_stats: 21187aced24632053d9df0a42842307abf165f60ad1Sameer Nanda keyvals['percent_cpuidle_%s_time' % state] = cpuidle_stats[state] 21287aced24632053d9df0a42842307abf165f60ad1Sameer Nanda 21387aced24632053d9df0a42842307abf165f60ad1Sameer Nanda # record percent time spent at each CPU frequency 21487aced24632053d9df0a42842307abf165f60ad1Sameer Nanda for freq in cpufreq_stats: 21587aced24632053d9df0a42842307abf165f60ad1Sameer Nanda keyvals['percent_cpufreq_%s_time' % freq] = cpufreq_stats[freq] 21687aced24632053d9df0a42842307abf165f60ad1Sameer Nanda 21787aced24632053d9df0a42842307abf165f60ad1Sameer Nanda # record battery stats 21850fb54165e35caebc1bd90d409fcba0fe0b01658Sameer Nanda keyvals['a_current_now'] = self._power_status.battery[0].current_now 2199d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda keyvals['ah_charge_full'] = self._power_status.battery[0].charge_full 2206a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda keyvals['ah_charge_full_design'] = \ 2219d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda self._power_status.battery[0].charge_full_design 2229d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda keyvals['ah_charge_start'] = self._ah_charge_start 2239d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda keyvals['ah_charge_now'] = self._power_status.battery[0].charge_now 22450fb54165e35caebc1bd90d409fcba0fe0b01658Sameer Nanda keyvals['ah_charge_used'] = keyvals['ah_charge_start'] - \ 22550fb54165e35caebc1bd90d409fcba0fe0b01658Sameer Nanda keyvals['ah_charge_now'] 2269d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda keyvals['wh_energy_start'] = self._wh_energy_start 2279d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda keyvals['wh_energy_now'] = self._power_status.battery[0].energy 22850fb54165e35caebc1bd90d409fcba0fe0b01658Sameer Nanda keyvals['wh_energy_used'] = keyvals['wh_energy_start'] - \ 22950fb54165e35caebc1bd90d409fcba0fe0b01658Sameer Nanda keyvals['wh_energy_now'] 2306a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda keyvals['v_voltage_min_design'] = \ 2319d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda self._power_status.battery[0].voltage_min_design 2329d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda keyvals['v_voltage_now'] = self._power_status.battery[0].voltage_now 2339d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 234417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda keyvals.update(self._tmp_keyvals) 235417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda 236417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda keyvals['a_current_rate'] = keyvals['ah_charge_used'] * 60 / \ 237417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda keyvals['minutes_battery_life'] 238417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda keyvals['w_energy_rate'] = keyvals['wh_energy_used'] * 60 / \ 239417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda keyvals['minutes_battery_life'] 240d8e41b7356a3067b7b7561f3a8fe8f12ff2731d6Simon Que keyvals['mc_min_temp'] = self._power_status.min_temp 241d8e41b7356a3067b7b7561f3a8fe8f12ff2731d6Simon Que keyvals['mc_max_temp'] = self._power_status.max_temp 2426a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda 2436a0746595cb21c52db2b4ef2e03ff1d73a75c1d0Sameer Nanda self.write_perf_keyval(keyvals) 2449d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 2459d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 2469d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda def cleanup(self): 24706548eee3dafcf0fc9ee0dcd15eb607b901ad2c1Benson Leung # remove json file after test to stop external extension launch. 248dfc0199adabc92a7311df0f00629afb171495de9Benson Leung if self._json_path: 249dfc0199adabc92a7311df0f00629afb171495de9Benson Leung jsonfile = os.path.join(self._json_path, 'external_extensions.json') 250dfc0199adabc92a7311df0f00629afb171495de9Benson Leung if os.path.exists(jsonfile): 251dfc0199adabc92a7311df0f00629afb171495de9Benson Leung os.system('rm -f %s' % jsonfile) 252d075074b8fc70d829912864f819345407295f35dSameer Nanda # re-enable powerd 2535aaf2314cf2bcdb9c89b42f3eb50e40cc76baf6bDavid James os.system('start powerd') 254b5056ea955d1997ce7d28441656f6134b30a1a07Dale Curtis # cleanup backchannel interface 255b312dcf7a07ffdfe5a9625bbb1b5b08e81158b39Jason Glasgow if self._backchannel: 256b312dcf7a07ffdfe5a9625bbb1b5b08e81158b39Jason Glasgow self._backchannel.teardown() 257b7edff18c59e1caedc32f972551ec68b3620eea5Dale Curtis if self._testServer: 258b7edff18c59e1caedc32f972551ec68b3620eea5Dale Curtis self._testServer.stop() 2596cdaebad4a36d0ad917f9c1285910e66539d0d1aBenson Leung super(power_LoadTest, self).cleanup() 2609d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 2619d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 2629d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda def _write_ext_params(self): 2639d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda data = '' 2649d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda template= 'var %s = %s;\n' 2659d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda for k in params_dict: 2669d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda data += template % (k, getattr(self, params_dict[k])) 2679d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 2687bcd700c40df1de04d8bf58e8f60f132df06b8e5Benson Leung filename = os.path.join(self.bindir, 'params.js') 2699d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda utils.open_write_close(filename, data) 2709d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 2719d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda logging.debug('filename ' + filename) 2729d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda logging.debug(data) 2739d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 2749d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 2752e56d3461849c3066023f0f6e9e9060523d72d30Mike Truty def _do_wait(self, verbose, seconds, latch): 2769d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda latched = False 277417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda low_battery = False 2782e56d3461849c3066023f0f6e9e9060523d72d30Mike Truty total_time = seconds + 60 2792e56d3461849c3066023f0f6e9e9060523d72d30Mike Truty elapsed_time = 0 2802e56d3461849c3066023f0f6e9e9060523d72d30Mike Truty wait_time = 60 2819d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 2822e56d3461849c3066023f0f6e9e9060523d72d30Mike Truty while elapsed_time < total_time: 2832e56d3461849c3066023f0f6e9e9060523d72d30Mike Truty time.sleep(wait_time) 2842e56d3461849c3066023f0f6e9e9060523d72d30Mike Truty elapsed_time += wait_time 2859d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 2869d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda self._power_status.refresh() 287417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda if verbose: 288417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda logging.debug('ah_charge_now %f' \ 289417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda % self._power_status.battery[0].charge_now) 290417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda logging.debug('w_energy_rate %f' \ 291417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda % self._power_status.battery[0].energy_rate) 29256fdb56c8d1b0f93a2a9b8eb020b9d7757f4e9a4Simon Que logging.debug('v_voltage_now %f' \ 29356fdb56c8d1b0f93a2a9b8eb020b9d7757f4e9a4Simon Que % self._power_status.battery[0].voltage_now) 294417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda 295cfa1ddf94edc7ac518a178415ec4a7c9a61a9dd6Todd Broch low_battery = (self._power_status.percent_current_charge() < 296417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda self._low_battery_threshold) 297417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda 298417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda latched = latch.is_set() 299417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda 300417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda if latched or low_battery: 3019d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda break 3029d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 303417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda if latched: 304417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda # record chrome power extension stats 305417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda form_data = self._testServer.get_form_entries() 306417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda logging.debug(form_data) 307417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda for e in form_data: 308417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda key = 'ext_' + e 309417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda if key in self._tmp_keyvals: 310417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda self._tmp_keyvals[key] += form_data[e] 311417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda else: 312417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda self._tmp_keyvals[key] = form_data[e] 313417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda else: 3149d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda logging.debug("Didn't get status back from power extension") 3159d4bcb6d907ad23d947f65d3c764c8ee3848e7d3Sameer Nanda 316417da5be901b3e68131017e1a631bdd84835b1d2Sameer Nanda return low_battery 317d075074b8fc70d829912864f819345407295f35dSameer Nanda 318d075074b8fc70d829912864f819345407295f35dSameer Nanda 319d075074b8fc70d829912864f819345407295f35dSameer Nanda def _do_xset(self): 320d075074b8fc70d829912864f819345407295f35dSameer Nanda XSET = 'LD_LIBRARY_PATH=/usr/local/lib xset' 321d075074b8fc70d829912864f819345407295f35dSameer Nanda # Disable X screen saver 32251d1939bf47960b6e65042402a900e0564aa6d3eEric Li cros_ui.xsystem('%s s 0 0' % XSET) 323d075074b8fc70d829912864f819345407295f35dSameer Nanda # Disable DPMS Standby/Suspend/Off 32451d1939bf47960b6e65042402a900e0564aa6d3eEric Li cros_ui.xsystem('%s dpms 0 0 0' % XSET) 325d075074b8fc70d829912864f819345407295f35dSameer Nanda # Force monitor on 32651d1939bf47960b6e65042402a900e0564aa6d3eEric Li cros_ui.xsystem('%s dpms force on' % XSET) 327d075074b8fc70d829912864f819345407295f35dSameer Nanda # Save off X settings 32851d1939bf47960b6e65042402a900e0564aa6d3eEric Li cros_ui.xsystem('%s q' % XSET) 329d075074b8fc70d829912864f819345407295f35dSameer Nanda 330d075074b8fc70d829912864f819345407295f35dSameer Nanda 331d075074b8fc70d829912864f819345407295f35dSameer Nanda def _set_backlight_level(self): 332d075074b8fc70d829912864f819345407295f35dSameer Nanda # set backlight level to 40% of max 333d075074b8fc70d829912864f819345407295f35dSameer Nanda cmd = 'backlight-tool --set_brightness %d ' % ( 334d075074b8fc70d829912864f819345407295f35dSameer Nanda int(self._max_backlight * 0.4)) 335d075074b8fc70d829912864f819345407295f35dSameer Nanda os.system(cmd) 336d075074b8fc70d829912864f819345407295f35dSameer Nanda 337d075074b8fc70d829912864f819345407295f35dSameer Nanda # record brightness level 338d075074b8fc70d829912864f819345407295f35dSameer Nanda cmd = 'backlight-tool --get_brightness' 339d075074b8fc70d829912864f819345407295f35dSameer Nanda level = int(utils.system_output(cmd).rstrip()) 340d075074b8fc70d829912864f819345407295f35dSameer Nanda logging.info('backlight level is %d' % level) 341d075074b8fc70d829912864f819345407295f35dSameer Nanda self._tmp_keyvals['level_backlight_current'] = level 342