| # 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' |