1# Copyright 2020 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 re 7import time 8 9from autotest_lib.client.common_lib.cros import chrome 10from autotest_lib.client.cros.input_playback import keyboard 11from autotest_lib.client.cros.power import power_dashboard 12from autotest_lib.client.cros.power import power_test 13 14URL = 'https://browserbench.org/Speedometer2.0/' 15RESULT = 'result' 16CONFIDENCE = 'confidence' 17 18class power_Speedometer2(power_test.power_Test): 19 """class for running Speedometer2 test in Chrome. 20 21 Run Speedometer2 and collect logger data. 22 """ 23 version = 1 24 25 def initialize(self, pdash_note='', force_discharge=False): 26 """Measure power with a short interval while running Speedometer2.""" 27 super(power_Speedometer2, self).initialize( 28 seconds_period=1., pdash_note=pdash_note, 29 force_discharge=force_discharge) 30 31 def run_once(self, url=URL): 32 """Measure power with multiple loggers while running Speedometer2. 33 34 @param url: url of Speedometer2 test page. 35 """ 36 with chrome.Chrome(init_network_controller=True) as self.cr: 37 tab = self.cr.browser.tabs.New() 38 tab.Activate() 39 40 # Run in full-screen. 41 fullscreen = tab.EvaluateJavaScript('document.webkitIsFullScreen') 42 if not fullscreen: 43 with keyboard.Keyboard() as keys: 44 keys.press_key('f4') 45 46 logging.info('Navigating to url: %s', url) 47 tab.Navigate(url) 48 tab.WaitForDocumentReadyStateToBeComplete() 49 50 # Allow CPU to idle. 51 time.sleep(5) 52 53 self.start_measurements() 54 tab.EvaluateJavaScript('startTest()') 55 time.sleep(60) 56 result = '' 57 while not result: 58 time.sleep(10) 59 result = tab.EvaluateJavaScript( 60 'document.getElementById("%s-number").innerHTML' % \ 61 RESULT) 62 end_time = time.time() 63 result = float(result) 64 confidence = tab.EvaluateJavaScript( 65 'document.getElementById("%s-number").innerHTML' % \ 66 CONFIDENCE) 67 match = re.search(r"((\d+(\.\d+)?)|(\.\d+))", confidence) 68 confidence = float(match.group(0)) 69 70 keyvals = {RESULT: result, CONFIDENCE: confidence} 71 for key, val in keyvals.items(): 72 logging.info('Speedometer2 %s: %s', key, val) 73 self.keyvals.update(keyvals) 74 self.output_perf_value(description=RESULT, value=result, 75 higher_is_better=True) 76 self.output_perf_value(description=CONFIDENCE, value=confidence, 77 higher_is_better=False) 78 79 logger = power_dashboard.KeyvalLogger(self._start_time, end_time) 80 logger.add_item(RESULT, result, 'point', 'perf') 81 logger.add_item(CONFIDENCE, confidence, 'point', 'perf') 82 self._meas_logs.append(logger) 83