[Android WebViewShell] Add inclusion test for webview exposed stable interfaces.
[chromium-blink-merge.git] / tools / perf / benchmarks / dromaeo.py
blob66b7cd9d80cdfb8213a8d4732437d3b03a2f1144
1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
5 import math
6 import os
8 from core import perf_benchmark
10 from telemetry import benchmark
11 from telemetry import page as page_module
12 from telemetry.page import page_test
13 from telemetry import story
14 from telemetry.value import scalar
16 from metrics import power
19 class _DromaeoMeasurement(page_test.PageTest):
20 def __init__(self):
21 super(_DromaeoMeasurement, self).__init__()
22 self._power_metric = None
24 def CustomizeBrowserOptions(self, options):
25 power.PowerMetric.CustomizeBrowserOptions(options)
27 def WillStartBrowser(self, platform):
28 self._power_metric = power.PowerMetric(platform)
30 def DidNavigateToPage(self, page, tab):
31 self._power_metric.Start(page, tab)
33 def ValidateAndMeasurePage(self, page, tab, results):
34 tab.WaitForJavaScriptExpression(
35 'window.document.getElementById("pause") &&' +
36 'window.document.getElementById("pause").value == "Run"',
37 120)
39 # Start spying on POST request that will report benchmark results, and
40 # intercept result data.
41 tab.ExecuteJavaScript('(function() {' +
42 ' var real_jquery_ajax_ = window.jQuery;' +
43 ' window.results_ = "";' +
44 ' window.jQuery.ajax = function(request) {' +
45 ' if (request.url == "store.php") {' +
46 ' window.results_ =' +
47 ' decodeURIComponent(request.data);' +
48 ' window.results_ = window.results_.substring(' +
49 ' window.results_.indexOf("=") + 1, ' +
50 ' window.results_.lastIndexOf("&"));' +
51 ' real_jquery_ajax_(request);' +
52 ' }' +
53 ' };' +
54 '})();')
55 # Starts benchmark.
56 tab.ExecuteJavaScript('window.document.getElementById("pause").click();')
58 tab.WaitForJavaScriptExpression('!!window.results_', 600)
60 self._power_metric.Stop(page, tab)
61 self._power_metric.AddResults(tab, results)
63 score = eval(tab.EvaluateJavaScript('window.results_ || "[]"'))
65 def Escape(k):
66 chars = [' ', '.', '-', '/', '(', ')', '*']
67 for c in chars:
68 k = k.replace(c, '_')
69 return k
71 def AggregateData(container, key, value):
72 if key not in container:
73 container[key] = {'count': 0, 'sum': 0}
74 container[key]['count'] += 1
75 container[key]['sum'] += math.log(value)
77 suffix = page.url[page.url.index('?') + 1 :]
78 def AddResult(name, value):
79 important = False
80 if name == suffix:
81 important = True
82 results.AddValue(scalar.ScalarValue(
83 results.current_page, Escape(name), 'runs/s', value, important))
85 aggregated = {}
86 for data in score:
87 AddResult('%s/%s' % (data['collection'], data['name']),
88 data['mean'])
90 top_name = data['collection'].split('-', 1)[0]
91 AggregateData(aggregated, top_name, data['mean'])
93 collection_name = data['collection']
94 AggregateData(aggregated, collection_name, data['mean'])
96 for key, value in aggregated.iteritems():
97 AddResult(key, math.exp(value['sum'] / value['count']))
99 class _DromaeoBenchmark(perf_benchmark.PerfBenchmark):
100 """A base class for Dromaeo benchmarks."""
101 test = _DromaeoMeasurement
103 @classmethod
104 def Name(cls):
105 return 'dromaeo'
107 def CreateStorySet(self, options):
108 """Makes a PageSet for Dromaeo benchmarks."""
109 # Subclasses are expected to define class members called query_param and
110 # tag.
111 if not hasattr(self, 'query_param') or not hasattr(self, 'tag'):
112 raise NotImplementedError('query_param or tag not in Dromaeo benchmark.')
113 archive_data_file = '../page_sets/data/dromaeo.%s.json' % self.tag
114 ps = story.StorySet(
115 archive_data_file=archive_data_file,
116 base_dir=os.path.dirname(os.path.abspath(__file__)),
117 cloud_storage_bucket=story.PUBLIC_BUCKET)
118 url = 'http://dromaeo.com?%s' % self.query_param
119 ps.AddStory(page_module.Page(
120 url, ps, ps.base_dir, make_javascript_deterministic=False))
121 return ps
124 class DromaeoDomCoreAttr(_DromaeoBenchmark):
125 """Dromaeo DOMCore attr JavaScript benchmark.
127 Tests setting and getting DOM node attributes.
129 tag = 'domcoreattr'
130 query_param = 'dom-attr'
132 @classmethod
133 def Name(cls):
134 return 'dromaeo.domcoreattr'
137 @benchmark.Disabled('xp') # crbug.com/501625
138 class DromaeoDomCoreModify(_DromaeoBenchmark):
139 """Dromaeo DOMCore modify JavaScript benchmark.
141 Tests creating and injecting DOM nodes.
143 tag = 'domcoremodify'
144 query_param = 'dom-modify'
146 @classmethod
147 def Name(cls):
148 return 'dromaeo.domcoremodify'
151 class DromaeoDomCoreQuery(_DromaeoBenchmark):
152 """Dromaeo DOMCore query JavaScript benchmark.
154 Tests querying DOM elements in a document.
156 tag = 'domcorequery'
157 query_param = 'dom-query'
159 @classmethod
160 def Name(cls):
161 return 'dromaeo.domcorequery'
164 class DromaeoDomCoreTraverse(_DromaeoBenchmark):
165 """Dromaeo DOMCore traverse JavaScript benchmark.
167 Tests traversing a DOM structure.
169 tag = 'domcoretraverse'
170 query_param = 'dom-traverse'
172 @classmethod
173 def Name(cls):
174 return 'dromaeo.domcoretraverse'
177 class DromaeoJslibAttrJquery(_DromaeoBenchmark):
178 """Dromaeo JSLib attr jquery JavaScript benchmark.
180 Tests setting and getting DOM node attributes using the jQuery JavaScript
181 Library.
183 tag = 'jslibattrjquery'
184 query_param = 'jslib-attr-jquery'
186 @classmethod
187 def Name(cls):
188 return 'dromaeo.jslibattrjquery'
191 class DromaeoJslibAttrPrototype(_DromaeoBenchmark):
192 """Dromaeo JSLib attr prototype JavaScript benchmark.
194 Tests setting and getting DOM node attributes using the jQuery JavaScript
195 Library.
197 tag = 'jslibattrprototype'
198 query_param = 'jslib-attr-prototype'
200 @classmethod
201 def Name(cls):
202 return 'dromaeo.jslibattrprototype'
205 class DromaeoJslibEventJquery(_DromaeoBenchmark):
206 """Dromaeo JSLib event jquery JavaScript benchmark.
208 Tests binding, removing, and triggering DOM events using the jQuery JavaScript
209 Library.
211 tag = 'jslibeventjquery'
212 query_param = 'jslib-event-jquery'
214 @classmethod
215 def Name(cls):
216 return 'dromaeo.jslibeventjquery'
219 class DromaeoJslibEventPrototype(_DromaeoBenchmark):
220 """Dromaeo JSLib event prototype JavaScript benchmark.
222 Tests binding, removing, and triggering DOM events using the Prototype
223 JavaScript Library.
225 tag = 'jslibeventprototype'
226 query_param = 'jslib-event-prototype'
228 @classmethod
229 def Name(cls):
230 return 'dromaeo.jslibeventprototype'
233 # xp: crbug.com/389731
234 # win7: http://crbug.com/479796
235 # linux: http://crbug.com/513853
236 @benchmark.Disabled('xp', 'win7', 'linux')
237 class DromaeoJslibModifyJquery(_DromaeoBenchmark):
238 """Dromaeo JSLib modify jquery JavaScript benchmark.
240 Tests creating and injecting DOM nodes into a document using the jQuery
241 JavaScript Library.
243 tag = 'jslibmodifyjquery'
244 query_param = 'jslib-modify-jquery'
246 @classmethod
247 def Name(cls):
248 return 'dromaeo.jslibmodifyjquery'
251 class DromaeoJslibModifyPrototype(_DromaeoBenchmark):
252 """Dromaeo JSLib modify prototype JavaScript benchmark.
254 Tests creating and injecting DOM nodes into a document using the Prototype
255 JavaScript Library.
257 tag = 'jslibmodifyprototype'
258 query_param = 'jslib-modify-prototype'
260 @classmethod
261 def Name(cls):
262 return 'dromaeo.jslibmodifyprototype'
265 class DromaeoJslibStyleJquery(_DromaeoBenchmark):
266 """Dromaeo JSLib style jquery JavaScript benchmark.
268 Tests getting and setting CSS information on DOM elements using the jQuery
269 JavaScript Library.
271 tag = 'jslibstylejquery'
272 query_param = 'jslib-style-jquery'
274 @classmethod
275 def Name(cls):
276 return 'dromaeo.jslibstylejquery'
279 class DromaeoJslibStylePrototype(_DromaeoBenchmark):
280 """Dromaeo JSLib style prototype JavaScript benchmark.
282 Tests getting and setting CSS information on DOM elements using the jQuery
283 JavaScript Library.
285 tag = 'jslibstyleprototype'
286 query_param = 'jslib-style-prototype'
288 @classmethod
289 def Name(cls):
290 return 'dromaeo.jslibstyleprototype'
293 class DromaeoJslibTraverseJquery(_DromaeoBenchmark):
294 """Dromaeo JSLib traverse jquery JavaScript benchmark.
297 Tests getting and setting CSS information on DOM elements using the Prototype
298 JavaScript Library.
300 tag = 'jslibtraversejquery'
301 query_param = 'jslib-traverse-jquery'
303 @classmethod
304 def Name(cls):
305 return 'dromaeo.jslibtraversejquery'
308 class DromaeoJslibTraversePrototype(_DromaeoBenchmark):
309 """Dromaeo JSLib traverse prototype JavaScript benchmark.
311 Tests traversing a DOM structure using the jQuery JavaScript Library.
313 tag = 'jslibtraverseprototype'
314 query_param = 'jslib-traverse-prototype'
316 @classmethod
317 def Name(cls):
318 return 'dromaeo.jslibtraverseprototype'
321 class DromaeoCSSQueryJquery(_DromaeoBenchmark):
322 """Dromaeo CSS Query jquery JavaScript benchmark.
324 Tests traversing a DOM structure using the Prototype JavaScript Library.
326 tag = 'cssqueryjquery'
327 query_param = 'cssquery-jquery'
329 @classmethod
330 def Name(cls):
331 return 'dromaeo.cssqueryjquery'