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. 4import collections 5import json 6import os 7 8from metrics import power 9from telemetry import test 10from telemetry.page import page_measurement 11from telemetry.page import page_set 12 13 14_URL = 'http://www.webkit.org/perf/sunspider-1.0.2/sunspider-1.0.2/driver.html' 15 16 17class _SunspiderMeasurement(page_measurement.PageMeasurement): 18 def __init__(self): 19 super(_SunspiderMeasurement, self).__init__() 20 self._power_metric = power.PowerMetric() 21 22 def CustomizeBrowserOptions(self, options): 23 power.PowerMetric.CustomizeBrowserOptions(options) 24 25 def DidNavigateToPage(self, page, tab): 26 self._power_metric.Start(page, tab) 27 28 def MeasurePage(self, page, tab, results): 29 tab.WaitForJavaScriptExpression( 30 'window.location.pathname.indexOf("results.html") >= 0' 31 '&& typeof(output) != "undefined"', 300) 32 33 self._power_metric.Stop(page, tab) 34 self._power_metric.AddResults(tab, results) 35 36 js_get_results = 'JSON.stringify(output);' 37 js_results = json.loads(tab.EvaluateJavaScript(js_get_results)) 38 r = collections.defaultdict(list) 39 totals = [] 40 # js_results is: [{'foo': v1, 'bar': v2}, 41 # {'foo': v3, 'bar': v4}, 42 # ...] 43 for result in js_results: 44 total = 0 45 for key, value in result.iteritems(): 46 r[key].append(value) 47 total += value 48 totals.append(total) 49 for key, values in r.iteritems(): 50 results.Add(key, 'ms', values, data_type='unimportant') 51 results.Add('Total', 'ms', totals) 52 53 54class Sunspider(test.Test): 55 """Apple's SunSpider JavaScript benchmark.""" 56 test = _SunspiderMeasurement 57 58 def CreatePageSet(self, options): 59 ps = page_set.PageSet( 60 archive_data_file='../page_sets/data/sunspider.json', 61 make_javascript_deterministic=False, 62 file_path=os.path.abspath(__file__)) 63 ps.AddPageWithDefaultRunNavigate(_URL) 64 return ps 65