1# Copyright 2018 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. 4import logging 5import time 6 7from autotest_lib.client.common_lib.cros import chrome 8from autotest_lib.client.cros.input_playback import keyboard 9from autotest_lib.client.cros.power import power_dashboard 10from autotest_lib.client.cros.power import power_status 11from autotest_lib.client.cros.power import power_test 12 13 14class power_ThermalLoad(power_test.power_Test): 15 """class for power_ThermalLoad test. 16 """ 17 version = 2 18 19 FISHTANK_URL = 'http://storage.googleapis.com/chrome-power/aquarium/aquarium/aquarium.html' 20 HOUR = 60 * 60 21 22 def run_once(self, test_url=FISHTANK_URL, duration=2.5*HOUR, numFish=3000): 23 """run_once method. 24 25 @param test_url: url of webgl heavy page. 26 @param duration: time in seconds to display url and measure power. 27 @param numFish: number of fish to pass to WebGL Aquarium. 28 """ 29 with chrome.Chrome(init_network_controller=True) as self.cr: 30 tab = self.cr.browser.tabs.New() 31 tab.Activate() 32 33 # Just measure power in full-screen. 34 fullscreen = tab.EvaluateJavaScript('document.webkitIsFullScreen') 35 if not fullscreen: 36 with keyboard.Keyboard() as keys: 37 keys.press_key('f4') 38 39 self.backlight.set_percent(100) 40 41 url = test_url + "?numFish=" + str(numFish) 42 logging.info('Navigating to url: %s', url) 43 tab.Navigate(url) 44 tab.WaitForDocumentReadyStateToBeComplete() 45 46 self._flog = FishTankFpsLogger(tab, 47 seconds_period=self._seconds_period, 48 checkpoint_logger=self._checkpoint_logger) 49 self._meas_logs.append(self._flog) 50 power_dashboard.get_dashboard_factory().registerDataType( 51 FishTankFpsLogger, power_dashboard.VideoFpsLoggerDashboard) 52 53 self.start_measurements() 54 while time.time() - self._start_time < duration: 55 time.sleep(60) 56 self.status.refresh() 57 if self.status.is_low_battery(): 58 logging.info( 59 'Low battery, stop test early after %.0f minutes', 60 (time.time() - self._start_time) / 60) 61 return 62 63 64class FishTankFpsLogger(power_status.MeasurementLogger): 65 """Class to measure Video WebGL Aquarium fps & fish per sec.""" 66 67 def __init__(self, tab, seconds_period=20.0, checkpoint_logger=None): 68 """Initialize a FishTankFpsLogger. 69 70 Args: 71 tab: Chrome tab object 72 """ 73 super(FishTankFpsLogger, self).__init__([], seconds_period, 74 checkpoint_logger) 75 self._tab = tab 76 self._lastFrameCount = 0 77 fishCount = self._tab.EvaluateJavaScript('fishCount') 78 self.domains = ['avg_fps_%04d_fishes' % fishCount] 79 self.refresh() 80 81 def refresh(self): 82 frameCount = self._tab.EvaluateJavaScript('frameCount') 83 fps = (frameCount - self._lastFrameCount) / self.seconds_period 84 self._lastFrameCount = frameCount 85 return [fps] 86 87 def save_results(self, resultsdir, fname_prefix=None): 88 if not fname_prefix: 89 fname_prefix = '%s_results_%.0f' % (self.domains[0], time.time()) 90 super(FishTankFpsLogger, self).save_results(resultsdir, fname_prefix) 91 92 def calc(self, mtype='fps'): 93 return super(FishTankFpsLogger, self).calc(mtype) 94