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