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. 4 5 """Runs Chromium's IndexedDB performance test. These test: 6 7 Databases: 8 create/delete 9 Keys: 10 create/delete 11 Indexes: 12 create/delete 13 Data access: 14 Random read/write 15 Read cache 16 Cursors: 17 Read & random writes 18 Walking multiple 19 Seeking. 20 """ 21 22 import json 23 import os 24 25 from metrics import memory 26 from metrics import power 27 from metrics import v8_object_stats 28 from telemetry import benchmark 29 from telemetry.core import util 30 from telemetry.page import page_set 31 from telemetry.page import page_test 32 from telemetry.value import scalar 33 34 _V8_COUNTER_NAMES = [ 35 'V8.OsMemoryAllocated', 36 ] 37 38 class _IndexedDbMeasurement(page_test.PageTest): 39 def __init__(self, *args, **kwargs): 40 super(_IndexedDbMeasurement, self).__init__(*args, **kwargs) 41 self._memory_metric = None 42 self._power_metric = None 43 self._v8_object_stats_metric = None 44 45 def WillStartBrowser(self, platform): 46 """Initialize metrics once right before the browser has been launched.""" 47 self._power_metric = power.PowerMetric(platform) 48 49 def DidStartBrowser(self, browser): 50 """Initialize metrics once right after the browser has been launched.""" 51 self._memory_metric = memory.MemoryMetric(browser) 52 self._v8_object_stats_metric = ( 53 v8_object_stats.V8ObjectStatsMetric(_V8_COUNTER_NAMES)) 54 55 def DidNavigateToPage(self, page, tab): 56 self._memory_metric.Start(page, tab) 57 self._power_metric.Start(page, tab) 58 self._v8_object_stats_metric.Start(page, tab) 59 60 def ValidateAndMeasurePage(self, page, tab, results): 61 tab.WaitForDocumentReadyStateToBeComplete() 62 tab.WaitForJavaScriptExpression( 63 'window.document.cookie.indexOf("__done=1") >= 0', 600) 64 65 self._power_metric.Stop(page, tab) 66 self._memory_metric.Stop(page, tab) 67 self._v8_object_stats_metric.Stop(page, tab) 68 69 self._memory_metric.AddResults(tab, results) 70 self._power_metric.AddResults(tab, results) 71 self._v8_object_stats_metric.AddResults(tab, results) 72 73 js_get_results = "JSON.stringify(automation.getResults());" 74 result_dict = json.loads(tab.EvaluateJavaScript(js_get_results)) 75 total = 0.0 76 for key in result_dict: 77 if key == 'OverallTestDuration': 78 continue 79 msec = float(result_dict[key]) 80 results.AddValue(scalar.ScalarValue( 81 results.current_page, key, 'ms', msec, important=False)) 82 83 total += msec 84 results.AddValue(scalar.ScalarValue( 85 results.current_page, 'Total Perf', 'ms', total)) 86 87 88 def CustomizeBrowserOptions(self, options): 89 memory.MemoryMetric.CustomizeBrowserOptions(options) 90 power.PowerMetric.CustomizeBrowserOptions(options) 91 v8_object_stats.V8ObjectStatsMetric.CustomizeBrowserOptions(options) 92 93 class IndexedDb(benchmark.Benchmark): 94 """Chromium's IndexedDB Performance tests.""" 95 test = _IndexedDbMeasurement 96 97 def CreatePageSet(self, options): 98 indexeddb_dir = os.path.join(util.GetChromiumSrcDir(), 'chrome', 'test', 99 'data', 'indexeddb') 100 ps = page_set.PageSet(file_path=indexeddb_dir) 101 ps.AddPageWithDefaultRunNavigate('file://perf_test.html') 102 return ps 103