blob: a46dd0f85e74075e262fb567dea0404351d244e9 [file] [log] [blame]
# Copyright 2018 The Chromium 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 json
import math
from telemetry import story
from tracing.value import histogram as histogram_module
from page_sets import press_story
class DromaeoStory(press_story.PressStory):
def __init__(self, url, ps):
self.URL = url
super(DromaeoStory, self).__init__(ps)
def ExecuteTest(self, action_runner):
action_runner.WaitForJavaScriptCondition(
'window.document.getElementById("pause") &&' +
'window.document.getElementById("pause").value == "Run"',
timeout=120)
# Start spying on POST request that will report benchmark results, and
# intercept result data.
action_runner.ExecuteJavaScript("""
(function() {
var real_jquery_ajax_ = window.jQuery;
window.results_ = "";
window.jQuery.ajax = function(request) {
if (request.url == "store.php") {
window.results_ = decodeURIComponent(request.data);
window.results_ = window.results_.substring(
window.results_.indexOf("=") + 1,
window.results_.lastIndexOf("&"));
real_jquery_ajax_(request);
}
};
})();""")
# Starts benchmark.
action_runner.ExecuteJavaScript(
'window.document.getElementById("pause").click();')
action_runner.WaitForJavaScriptCondition('!!window.results_', timeout=600)
def ParseTestResults(self, action_runner):
score = json.loads(
action_runner.EvaluateJavaScript('window.results_ || "[]"'))
def Escape(k):
chars = [' ', '.', '-', '/', '(', ')', '*']
for c in chars:
k = k.replace(c, '_')
return k
def AggregateData(container, key, value):
if key not in container:
container[key] = {'count': 0, 'sum': 0}
container[key]['count'] += 1
container[key]['sum'] += math.log(value)
def AddResult(name, value):
hg = histogram_module.Histogram(Escape(name), "unitless_biggerIsBetter")
hg.AddSample(value)
self.AddJavascriptMetricHistogram(hg)
aggregated = {}
for data in score:
AddResult('%s/%s' % (data['collection'], data['name']),
data['mean'])
top_name = data['collection'].split('-', 1)[0]
AggregateData(aggregated, top_name, data['mean'])
collection_name = data['collection']
AggregateData(aggregated, collection_name, data['mean'])
for key, value in aggregated.iteritems():
AddResult(key, math.exp(value['sum'] / value['count']))
class DromaeoStorySet(story.StorySet):
def __init__(self):
super(DromaeoStorySet, self).__init__(
archive_data_file='../page_sets/data/dromaeo.json',
cloud_storage_bucket=story.PUBLIC_BUCKET)
for query_param in ['dom-attr', 'dom-modify', 'dom-query', 'dom-traverse']:
url = 'http://dromaeo.com?%s' % query_param
self.AddStory(DromaeoStory(url, self))