blob: dc42ab57dca025c5a63796b527fe42e201787a6a [file] [log] [blame]
# Copyright (c) 2014 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.
"""This is a client side WebGL performance test.
http://hg.mozilla.org/users/bjacob_mozilla.com/webgl-perf-tests/raw-file/3729e8afac99/index.html
From the sources:
Keep in mind that these tests are not realistic workloads. These are not
benchmarks aiming to compare browser or GPU performance. These are only useful
to catch performance regressions in a given browser and system.
"""
import logging
import os
import math
from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros import chrome
from autotest_lib.client.cros.graphics import graphics_utils
class graphics_WebGLPerformance(graphics_utils.GraphicsTest):
"""WebGL performance graphics test."""
version = 1
_test_duration_secs = 0
perf_keyval = {}
_waived_tests = ['convert-Canvas-to-rgb-float.html',
'convert-Canvas-to-rgb-float-premultiplied.html']
def setup(self):
self.job.setup_dep(['webgl_perf'])
self.job.setup_dep(['graphics'])
def initialize(self):
super(graphics_WebGLPerformance, self).initialize()
def cleanup(self):
super(graphics_WebGLPerformance, self).cleanup()
def run_performance_test(self, browser, test_url):
"""Runs the performance test from the given url.
@param browser: The Browser object to run the test with.
@param test_url: The URL to the performance test site.
"""
if not utils.wait_for_idle_cpu(60.0, 0.1):
if not utils.wait_for_idle_cpu(20.0, 0.2):
raise error.TestFail('Failed: Could not get idle CPU.')
# Kick off test.
tab = browser.tabs.New()
tab.Navigate(test_url)
tab.Activate()
tab.WaitForDocumentReadyStateToBeComplete()
# Wait for test completion.
tab.WaitForJavaScriptCondition('test_completed == true',
timeout=self._test_duration_secs)
# Get all the result data
results = tab.EvaluateJavaScript('testsRun')
logging.info('results: %s', results)
# Get the geometric mean of individual runtimes.
sumOfLogResults = 0
sumOfPassed = 0
sumOfFailed = 0
sumOfWaived = 0
for result in results:
if result.get('url') in self._waived_tests or result.get('skip'):
sumOfWaived += 1
elif 'error' in result:
self.add_failures(result.get('url'))
sumOfFailed += 1
else:
sumOfLogResults += math.log(result['testResult'])
sumOfPassed += 1
time_ms_geom_mean = round(100 * math.exp(
sumOfLogResults / len(results))) / 100
logging.info('WebGLPerformance: time_ms_geom_mean = %f',
time_ms_geom_mean)
# Output numbers for plotting by harness.
keyvals = {}
keyvals['time_ms_geom_mean'] = time_ms_geom_mean
self.write_perf_keyval(keyvals)
self.output_perf_value(
description='time_geom_mean',
value=time_ms_geom_mean,
units='ms',
higher_is_better=False,
graph='time_geom_mean')
# Add extra value to the graph distinguishing different boards.
variant = utils.get_board_with_frequency_and_memory()
desc = 'time_geom_mean-%s' % variant
self.output_perf_value(
description=desc,
value=time_ms_geom_mean,
units='ms',
higher_is_better=False,
graph='time_geom_mean')
# Get a copy of the test report.
test_report = tab.EvaluateJavaScript('test_report')
results_path = os.path.join(
self.bindir,
'../../results/default/graphics_WebGLPerformance/test_report.html')
f = open(results_path, 'w+')
f.write(test_report)
f.close()
tab.Close()
return sumOfPassed, sumOfWaived, sumOfFailed
def run_once(self, test_duration_secs=2700, fullscreen=True):
"""Finds a brower with telemetry, and run the test.
@param test_duration_secs: The test duration in seconds.
@param fullscreen: Whether to run the test in fullscreen.
"""
# To avoid 0ms on fast machines like samus the workload was increased.
# Unfortunately that makes running on slow machines impractical without
# deviating from upstream too much.
if utils.get_gpu_family() == 'pinetrail':
# TODO(ihf): return a TestPass(message) once available.
logging.warning('Test is too slow to run regularly.')
return
self._test_duration_secs = test_duration_secs
ext_paths = []
if fullscreen:
ext_paths.append(
os.path.join(self.autodir, 'deps', 'graphics',
'graphics_test_extension'))
with chrome.Chrome(logged_in=False,
extension_paths=ext_paths,
init_network_controller=True) as cr:
websrc_dir = os.path.join(self.autodir, 'deps', 'webgl_perf', 'src')
if not cr.browser.platform.SetHTTPServerDirectories(websrc_dir):
raise error.TestFail('Failed: Unable to start HTTP server')
test_url = cr.browser.platform.http_server.UrlOf(
os.path.join(websrc_dir, 'index.html'))
passed, waived, failed = self.run_performance_test(cr.browser,
test_url)
logging.debug('Number of tests: %d, passed: %d, '
'waived: %d, failed: %d',
passed + waived + failed, passed, waived, failed)
if failed > 0:
raise error.TestFail('Failed: %d tests failed.' % failed)