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 benchmark
29from telemetry.core import util
30from telemetry.page import page_set
31from telemetry.page import page_test
32from telemetry.value import scalar
33
34_V8_COUNTER_NAMES = [
35    'V8.OsMemoryAllocated',
36  ]
37
38class _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
93class 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