# Copyright 2019 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import logging import re import time from autotest_lib.client.bin import utils from autotest_lib.client.common_lib.cros import chrome from autotest_lib.client.common_lib.cros import power_load_util from autotest_lib.client.cros.input_playback import keyboard from autotest_lib.client.cros.power import power_status from autotest_lib.client.cros.power import power_test class power_VideoCall(power_test.power_Test): """class for power_VideoCall test.""" version = 1 video_url = 'http://crospower.page.link/power_VideoCall' doc_url = 'http://doc.new' def initialize(self, seconds_period=20., pdash_note='', force_discharge=False): """initialize method.""" super(power_VideoCall, self).initialize(seconds_period=seconds_period, pdash_note=pdash_note, force_discharge=force_discharge) self._username = power_load_util.get_username() self._password = power_load_util.get_password() def run_once(self, duration=7200, preset=''): """run_once method. @param duration: time in seconds to display url and measure power. @param preset: preset of the camera record. Possible values are 'ultra' : 1080p30_vp9, 'high' : 720p30_vp9, 'medium' : 720p24_vp8, 'low' : 360p24_vp8 If not supplied, preset will be determined automatically. """ if not preset: preset = self._get_camera_preset() extra_browser_args = self.get_extra_browser_args_for_camera_test() with keyboard.Keyboard() as keys,\ chrome.Chrome(init_network_controller=True, gaia_login=True, username=self._username, password=self._password, extra_browser_args=extra_browser_args, autotest_ext=True) as cr: # Move existing window to left half and open video page tab_left = cr.browser.tabs[0] tab_left.Activate() keys.press_key('alt+[') logging.info('Navigating left window to %s', self.video_url) tab_left.Navigate(self.video_url) tab_left.WaitForDocumentReadyStateToBeComplete() # We need to make sure that default camera preset was init properly # before changing preset or else MediaRecorder won't get torn down # properly. So capture the init time with the default preset and # then switch to appropriate preset later. video_init_time = power_status.VideoFpsLogger.time_until_ready( tab_left, num_video=5) self.keyvals['video_init_time'] = video_init_time tab_left.EvaluateJavaScript('setPreset("%s")' % preset) # Wait for camera to init for the new preset. power_status.VideoFpsLogger.time_until_ready(tab_left, num_video=5) # Open Google Doc on right half logging.info('Navigating right window to %s', self.doc_url) cmd = 'chrome.windows.create({ url : "%s" });' % self.doc_url cr.autotest_ext.EvaluateJavaScript(cmd) tab_right = cr.browser.tabs[-1] tab_right.Activate() keys.press_key('alt+]') tab_right.WaitForDocumentReadyStateToBeComplete() time.sleep(5) self._vlog = power_status.VideoFpsLogger(tab_left, seconds_period=self._seconds_period, checkpoint_logger=self._checkpoint_logger) self._meas_logs.append(self._vlog) # Start typing number block self.start_measurements() while time.time() - self._start_time < duration: keys.press_key('number_block') self.status.refresh() if self.status.is_low_battery(): logging.info( 'Low battery, stop test early after %.0f minutes', (time.time() - self._start_time) / 60) break self.collect_keypress_latency(cr) def _get_camera_preset(self): """Return camera preset appropriate to hw spec. Preset will be determined using this logic. - Newer Intel Core U-series CPU with fan -> 'high' - AMD Ryzen CPU with fan -> 'high' - Above without fan -> 'medium' - High performance ARM -> 'medium' - Other Intel Core CPU -> 'medium' - AMD APU -> 'low' - Intel N-series CPU -> 'low' - Older ARM CPU -> 'low' - Other CPU -> 'low' """ HIGH_IF_HAS_FAN_REGEX = r''' Intel[ ]Core[ ]i[357]-[6-9][0-9]{3}U| # Intel Core i7-8650U Intel[ ]Core[ ]i[357]-1[0-9]{4}U| # Intel Core i7-10510U AMD[ ]Ryzen[ ][357][ ][3-9][0-9]{3}C| # AMD Ryzen 7 3700C Genuine[ ]Intel[ ]0000 # Unrelease CPU ''' MEDIUM_REGEX = r''' Intel[ ]Core[ ][im][357]-[0-9]{4,5}[UY]| # Intel Core i5-8200Y Intel[ ]Core[ ][im][357]-[67]Y[0-9]{2}| # Intel Core m7-6Y75 Intel[ ]Pentium[ ][0-9]{4,5}[UY]| # Intel Pentium 6405U Intel[ ]Celeron[ ][0-9]{4,5}[UY]| # Intel Celeron 5205U qcom[ ]sc[0-9]{4}| # qcom sc7180 mediatek[ ]mt819[0-9] # mediatek mt8192 ''' cpu_name = utils.get_cpu_name() if re.search(HIGH_IF_HAS_FAN_REGEX, cpu_name, re.VERBOSE): if power_status.has_fan(): return 'high' return 'medium' if re.search(MEDIUM_REGEX, cpu_name, re.VERBOSE): return 'medium' return 'low'