graphics_WebGLAquarium.py revision ff9c82b221cbc0cc9d4951fc609479d826067d33
1ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang# Copyright (c) 2013 The Chromium OS Authors. All rights reserved. 2ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang# Use of this source code is governed by a BSD-style license that can be 3ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang# found in the LICENSE file. 4ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang"""This is a client side WebGL aquarium test.""" 5ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 6ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liangimport logging 7ff9c82b221cbc0cc9d4951fc609479d826067d33Salva Climentimport math 8ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liangimport os 9ff9c82b221cbc0cc9d4951fc609479d826067d33Salva Climentimport sampler 10ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liangimport threading 11ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liangimport time 12ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 13ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liangfrom autotest_lib.client.bin import test, utils 14ff9c82b221cbc0cc9d4951fc609479d826067d33Salva Climentfrom autotest_lib.client.common_lib import error 15ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liangfrom autotest_lib.client.common_lib.cros import chrome 1667eac4d97a9e69f3fbe52c78b4d7f7fa35cfe562Ilja H. Friedelfrom autotest_lib.client.cros.graphics import graphics_utils 17e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasanafrom autotest_lib.client.cros import power_status, power_utils 18e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasanafrom autotest_lib.client.cros import service_stopper 19e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana 20e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana# Minimum battery charge percentage to run the test 21e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit MakasanaBATTERY_INITIAL_CHARGED_MIN = 10 22e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana 23e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana# Measurement duration in seconds. 24e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit MakasanaMEASUREMENT_DURATION = 30 25e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana 26e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit MakasanaPOWER_DESCRIPTION = 'avg_energy_rate_1000_fishes' 27e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana 28e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana# Time to exclude from calculation after playing a webgl demo [seconds]. 29e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit MakasanaSTABILIZATION_DURATION = 10 30ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 31ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 32ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liangclass graphics_WebGLAquarium(test.test): 33ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang """WebGL aquarium graphics test.""" 34ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang version = 1 35a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel 36a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel _backlight = None 37a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel _power_status = None 38a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel _service_stopper = None 39a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel _test_power = False 40a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel active_tab = None 41a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel flip_stats = {} 4267eac4d97a9e69f3fbe52c78b4d7f7fa35cfe562Ilja H. Friedel GSC = None 43a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel kernel_sampler = None 44a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel perf_keyval = {} 45a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel sampler_lock = None 46a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel test_duration_secs = 30 47a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel test_setting_num_fishes = 50 48a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel test_settings = {50: ('setSetting2', 2), 1000: ('setSetting6', 6),} 49ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 50ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang def setup(self): 51ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang tarball_path = os.path.join(self.bindir, 52ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 'webgl_aquarium_static.tar.bz2') 53ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang utils.extract_tarball_to_dir(tarball_path, self.srcdir) 54ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 55ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang def initialize(self): 5667eac4d97a9e69f3fbe52c78b4d7f7fa35cfe562Ilja H. Friedel self.GSC = graphics_utils.GraphicsStateChecker() 57ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang self.sampler_lock = threading.Lock() 58a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel # TODO: Create samplers for other platforms (e.g. x86). 59ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang if utils.get_board().lower() in ['daisy', 'daisy_spring']: 60ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang # Enable ExynosSampler on Exynos platforms. The sampler looks for 61ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang # exynos-drm page flip states: 'wait_kds', 'rendered', 'prepared', 62ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang # and 'flipped' in kernel debugfs. 63ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 64ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang # Sample 3-second durtaion for every 5 seconds. 65ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang self.kernel_sampler = sampler.ExynosSampler(period=5, duration=3) 66ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang self.kernel_sampler.sampler_callback = self.exynos_sampler_callback 67ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang self.kernel_sampler.output_flip_stats = ( 68a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel self.exynos_output_flip_stats) 69ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 7067eac4d97a9e69f3fbe52c78b4d7f7fa35cfe562Ilja H. Friedel def cleanup(self): 71e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana if self._backlight: 72e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self._backlight.restore() 73d13b4f4ca7223700c649413393506a89d6c3cfcdRohit Makasana if self._service_stopper: 74d13b4f4ca7223700c649413393506a89d6c3cfcdRohit Makasana self._service_stopper.restore_services() 7567eac4d97a9e69f3fbe52c78b4d7f7fa35cfe562Ilja H. Friedel if self.GSC: 7667eac4d97a9e69f3fbe52c78b4d7f7fa35cfe562Ilja H. Friedel keyvals = self.GSC.get_memory_keyvals() 77e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana if not self._test_power: 78e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana for key, val in keyvals.iteritems(): 79a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel self.output_perf_value(description=key, 80a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel value=val, 81e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana units='bytes', 82e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana higher_is_better=False) 8367eac4d97a9e69f3fbe52c78b4d7f7fa35cfe562Ilja H. Friedel self.GSC.finalize() 8467eac4d97a9e69f3fbe52c78b4d7f7fa35cfe562Ilja H. Friedel self.write_perf_keyval(keyvals) 8567eac4d97a9e69f3fbe52c78b4d7f7fa35cfe562Ilja H. Friedel 86e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana def run_fish_test(self, browser, test_url, num_fishes, perf_log=True): 87ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang """Run the test with the given number of fishes. 88ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 89ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang @param browser: The Browser object to run the test with. 90ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang @param test_url: The URL to the aquarium test site. 91ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang @param num_fishes: The number of fishes to run the test with. 92e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana @param perf_log: Report perf data only if it's set to True. 93ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang """ 94ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang # Create tab and load page. Set the number of fishes when page is fully 95ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang # loaded. 96ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang tab = browser.tabs.New() 97ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang tab.Navigate(test_url) 98ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang tab.Activate() 99ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang self.active_tab = tab 100b55c3a375c3584cb18c0c8249aab8095b7eb23eeIlja H. Friedel tab.WaitForDocumentReadyStateToBeComplete() 101ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 102ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang # Set the number of fishes when document finishes loading. Also reset 103ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang # our own FPS counter and start recording FPS and rendering time. 104a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel utils.wait_for_value( 105a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel lambda: tab.EvaluateJavaScript( 106ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 'if (document.readyState === "complete") {' 107ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang ' setSetting(document.getElementById("%s"), %d);' 108ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang ' g_crosFpsCounter.reset();' 109ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang ' true;' 110ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang '} else {' 111ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang ' false;' 112ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang '}' % self.test_settings[num_fishes]), 113a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel expected_value=True, 114a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel timeout_sec=30) 115ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 116ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang if self.kernel_sampler: 117ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang self.kernel_sampler.start_sampling_thread() 118ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang time.sleep(self.test_duration_secs) 119ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang if self.kernel_sampler: 120ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang self.kernel_sampler.stop_sampling_thread() 121a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel self.kernel_sampler.output_flip_stats('flip_stats_%d' % num_fishes) 122ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang self.flip_stats = {} 123ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 124e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana if perf_log: 125e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana # Get average FPS and rendering time, then close the tab. 126e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana avg_fps = tab.EvaluateJavaScript('g_crosFpsCounter.getAvgFps();') 127ff9c82b221cbc0cc9d4951fc609479d826067d33Salva Climent if math.isnan(float(avg_fps)): 128ff9c82b221cbc0cc9d4951fc609479d826067d33Salva Climent raise error.TestFail('Could not get FPS count.') 129e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana avg_render_time = tab.EvaluateJavaScript( 130a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel 'g_crosFpsCounter.getAvgRenderTime();') 131e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self.perf_keyval['avg_fps_%04d_fishes' % num_fishes] = avg_fps 132e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self.perf_keyval['avg_render_time_%04d_fishes' % num_fishes] = ( 133a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel avg_render_time) 134a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel self.output_perf_value( 135a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel description='avg_fps_%04d_fishes' % num_fishes, 136a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel value=avg_fps, 137a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel units='fps', 138a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel higher_is_better=True) 139e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana logging.info('%d fish(es): Average FPS = %f, ' 140a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel 'average render time = %f', num_fishes, avg_fps, 141a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel avg_render_time) 142e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana 143e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana def run_power_test(self, browser, test_url): 144a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel """Runs the webgl power consumption test and reports the perf results. 145e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana 146e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana @param browser: The Browser object to run the test with. 147e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana @param test_url: The URL to the aquarium test site. 148e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana """ 149e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana 150e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self._backlight = power_utils.Backlight() 151e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self._backlight.set_default() 152e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana 153e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self._service_stopper = service_stopper.ServiceStopper( 154a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel service_stopper.ServiceStopper.POWER_DRAW_SERVICES) 155e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self._service_stopper.stop_services() 156e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana 157e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self._power_status = power_status.get_status() 158e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana # Verify that we are running on battery and the battery is sufficiently 159e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana # charged. 160e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self._power_status.assert_battery_state(BATTERY_INITIAL_CHARGED_MIN) 161e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana 162a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel measurements = [ 163a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel power_status.SystemPower(self._power_status.battery_path) 164a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel ] 165e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana 166e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana def get_power(): 167e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana power_logger = power_status.PowerLogger(measurements) 168e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana power_logger.start() 169e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana time.sleep(STABILIZATION_DURATION) 170e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana start_time = time.time() 171e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana time.sleep(MEASUREMENT_DURATION) 172e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana power_logger.checkpoint('result', start_time) 173e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana keyval = power_logger.calc() 174e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana logging.info('Power output %s', keyval) 175e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana return keyval['result_' + measurements[0].domain + '_pwr'] 176e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana 177e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self.run_fish_test(browser, test_url, 1000, perf_log=False) 178e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana energy_rate = get_power() 179e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana # This is a power specific test so we are not capturing 180e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana # avg_fps and avg_render_time in this test. 181e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self.perf_keyval[POWER_DESCRIPTION] = energy_rate 182e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self.output_perf_value(description=POWER_DESCRIPTION, 183a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel value=energy_rate, 184a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel units='W', 185e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana higher_is_better=False) 186e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana 187ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang def exynos_sampler_callback(self, sampler_obj): 188ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang """Sampler callback function for ExynosSampler. 189ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 190ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang @param sampler_obj: The ExynosSampler object that invokes this callback 191ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang function. 192ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang """ 193ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang if sampler_obj.stopped: 194ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang return 195ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 196ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang with self.sampler_lock: 197ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang now = time.time() 198ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang results = {} 199ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang info_str = ['\nfb_id wait_kds flipped'] 200ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang for value in sampler_obj.frame_buffers.itervalues(): 201ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang results[value.fb] = {} 202ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang for state, stats in value.states.iteritems(): 203ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang results[value.fb][state] = (stats.avg, stats.stdev) 204a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel info_str.append('%s: %s %s' % 205a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel (value.fb, results[value.fb]['wait_kds'][0], 206a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel results[value.fb]['flipped'][0])) 207ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang results['avg_fps'] = self.active_tab.EvaluateJavaScript( 208a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel 'g_crosFpsCounter.getAvgFps();') 209ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang results['avg_render_time'] = self.active_tab.EvaluateJavaScript( 210a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel 'g_crosFpsCounter.getAvgRenderTime();') 211ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang self.active_tab.ExecuteJavaScript('g_crosFpsCounter.reset();') 212ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang info_str.append('avg_fps: %s, avg_render_time: %s' % 213ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang (results['avg_fps'], results['avg_render_time'])) 214ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang self.flip_stats[now] = results 215ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang logging.info('\n'.join(info_str)) 216ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 217ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang def exynos_output_flip_stats(self, file_name): 218ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang """Pageflip statistics output function for ExynosSampler. 219ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 220ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang @param file_name: The output file name. 221ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang """ 222ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang # output format: 223ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang # time fb_id avg_rendered avg_prepared avg_wait_kds avg_flipped 224ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang # std_rendered std_prepared std_wait_kds std_flipped 225ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang with open(file_name, 'w') as f: 226ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang for t in sorted(self.flip_stats.keys()): 227ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang if ('avg_fps' in self.flip_stats[t] and 228a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel 'avg_render_time' in self.flip_stats[t]): 229a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel f.write('%s %s %s\n' % 230a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel (t, self.flip_stats[t]['avg_fps'], 231a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel self.flip_stats[t]['avg_render_time'])) 232ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang for fb, stats in self.flip_stats[t].iteritems(): 233ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang if not isinstance(fb, int): 234ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang continue 235ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang f.write('%s %s ' % (t, fb)) 236ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang f.write('%s %s %s %s ' % (stats['rendered'][0], 237ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang stats['prepared'][0], 238ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang stats['wait_kds'][0], 239ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang stats['flipped'][0])) 240ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang f.write('%s %s %s %s\n' % (stats['rendered'][1], 241ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang stats['prepared'][1], 242ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang stats['wait_kds'][1], 243ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang stats['flipped'][1])) 244a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel def run_once(self, 245a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel test_duration_secs=30, 246a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel test_setting_num_fishes=(50, 1000), 247a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel power_test=False): 248ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang """Find a brower with telemetry, and run the test. 249ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 250ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang @param test_duration_secs: The duration in seconds to run each scenario 251ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang for. 252ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang @param test_setting_num_fishes: A list of the numbers of fishes to 253ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang enable in the test. 254ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang """ 255ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang self.test_duration_secs = test_duration_secs 256ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang self.test_setting_num_fishes = test_setting_num_fishes 257ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang 2582d4a164e8e583d365bb5fff12defd56687238ee7Ilja Friedel with chrome.Chrome(logged_in=False) as cr: 25955e4a38297449fcf3dbd693e2e6afe72fa84b519Ahmed Fakhry cr.browser.platform.SetHTTPServerDirectories(self.srcdir) 260a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel test_url = cr.browser.platform.http_server.UrlOf(os.path.join( 261a004701bd4ea9c695fbc4e5d9896061e0811512aIlja H. Friedel self.srcdir, 'aquarium.html')) 262f799af8d2e9e4ce8b7e5fb017f143a95260594f1Ilja H. Friedel 263f799af8d2e9e4ce8b7e5fb017f143a95260594f1Ilja H. Friedel if not utils.wait_for_idle_cpu(60.0, 0.1): 264f799af8d2e9e4ce8b7e5fb017f143a95260594f1Ilja H. Friedel if not utils.wait_for_idle_cpu(20.0, 0.2): 265f799af8d2e9e4ce8b7e5fb017f143a95260594f1Ilja H. Friedel raise error.TestFail('Could not get idle CPU.') 266e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana if not utils.wait_for_cool_machine(): 267e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana raise error.TestFail('Could not get cold machine.') 268e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana if power_test: 269e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self._test_power = True 270e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self.run_power_test(cr.browser, test_url) 271e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana with self.sampler_lock: 272e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self.active_tab.Close() 273e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self.active_tab = None 274e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana else: 275e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana for n in self.test_setting_num_fishes: 276e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self.run_fish_test(cr.browser, test_url, n) 277e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana # Do not close the tab when the sampler_callback is doing 278e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana # his work. 279e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana with self.sampler_lock: 280e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self.active_tab.Close() 281e96b8f8d31f21f30028d7d544c82d3817295c8f5Rohit Makasana self.active_tab = None 282ab19e9793140c5bab16a2b865c796f0789c17446Ricky Liang self.write_perf_keyval(self.perf_keyval) 283