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