Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(527)

Side by Side Diff: chrome/test/data/indexeddb/perf_test.js

Issue 10803029: Add read/write tests, index creation/deletion test. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rolled in code review feedback. Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/test/data/indexeddb/perf_shared.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 var overallTestStartTime = Date.now(); 5 var overallTestStartTime = Date.now();
6 6
7 function testCreateKeysInStores( 7 function testCreateKeysInStores(
8 numKeys, numStores, payloadLength, onTestComplete) { 8 numKeys, numStores, payloadLength, onTestComplete) {
9 var testName = "testCreateKeysInStores_" + numKeys + "_" + numStores + "_" + 9 var testName = getDisplayName(arguments);
10 payloadLength;
11 assert(numKeys >= 0); 10 assert(numKeys >= 0);
12 assert(numStores >= 1); 11 assert(numStores >= 1);
13 var objectStoreNames = []; 12 var objectStoreNames = [];
14 for (var i=0; i < numStores; ++i) { 13 for (var i=0; i < numStores; ++i) {
15 objectStoreNames.push("store " + i); 14 objectStoreNames.push("store " + i);
16 } 15 }
17 var value = stringOfLength(payloadLength); 16 var value = stringOfLength(payloadLength);
17 function getValue() {
18 return value;
19 }
18 20
19 function onCreated(db) { 21 function onCreated(db) {
20 automation.setStatus("Constructing transaction."); 22 automation.setStatus("Constructing transaction.");
21 var completionFunc = 23 var completionFunc =
22 getCompletionFunc(testName, Date.now(), onTestComplete); 24 getCompletionFunc(testName, Date.now(), onTestComplete);
23 var transaction = getTransaction(db, objectStoreNames, "readwrite", 25 var transaction =
24 function() { completionFunc(); }); 26 getTransaction(db, objectStoreNames, "readwrite", completionFunc);
25 for (var i in objectStoreNames) { 27 putLinearValues(transaction, objectStoreNames, numKeys, null, getValue);
26 var os = transaction.objectStore(objectStoreNames[i]);
27 assert(os);
28 for (var j = 0; j < numKeys; ++j) {
29 os.put(value, "key " + j);
30 }
31 }
32 } 28 }
33 automation.setStatus("Creating database."); 29 automation.setStatus("Creating database.");
34 createDatabase(testName, objectStoreNames, onCreated, onError); 30 createDatabase(testName, objectStoreNames, onCreated, onError);
35 } 31 }
36 32
37 function testRandomReads(numKeys, numReadsPerTransaction, numTransactions, 33 function testRandomReadsAndWrites(
38 useIndex, onTestComplete) { 34 numKeys, numReadsPerTransaction, numWritesPerTransaction, numTransactions,
39 var indexText = "_bare"; 35 useIndexForReads, onTestComplete) {
40 var indexName; 36 var indexName;
41 if (useIndex) { 37 if (useIndexForReads)
42 indexText = "_index";
43 indexName = "index"; 38 indexName = "index";
44 } 39 var testName = getDisplayName(arguments);
45 var testName = "testRandomReads_" + numKeys + "_" + numReadsPerTransaction +
46 "_" + numTransactions + indexText;
47 var numTransactionsLeft = numTransactions; 40 var numTransactionsLeft = numTransactions;
48 var storeName = "store"; 41 var objectStoreNames = ["store"];
49 var objectStoreNames = [storeName];
50 var numTransactionsRunning; 42 var numTransactionsRunning;
51 43
52 function getKey(i) {
53 return "key " + i;
54 }
55
56 function getValue(i) {
57 return "value " + i;
58 }
59
60 function onCreated(db) { 44 function onCreated(db) {
61 automation.setStatus("Setting up test database."); 45 automation.setStatus("Setting up test database.");
62 var transaction = getTransaction(db, objectStoreNames, "readwrite", 46 var transaction = getTransaction(db, objectStoreNames, "readwrite",
63 function() { onSetupComplete(db); }); 47 function() { onSetupComplete(db); });
64 var os = transaction.objectStore(storeName); 48 putLinearValues(transaction, objectStoreNames, numKeys, null,
65 assert(os); 49 function () { return "test value"; });
66 for (var j = 0; j < numKeys; ++j) {
67 os.put(getValue(i), getKey(j));
68 }
69 } 50 }
70 var completionFunc; 51 var completionFunc;
71 function onSetupComplete(db) { 52 function onSetupComplete(db) {
72 automation.setStatus("Setup complete."); 53 automation.setStatus("Setup complete.");
73 runOneBatch(db); 54 runOneBatch(db);
74 completionFunc = getCompletionFunc(testName, Date.now(), onTestComplete); 55 completionFunc = getCompletionFunc(testName, Date.now(), onTestComplete);
75 } 56 }
76 57
77 function runOneBatch(db) { 58 function runOneBatch(db) {
78 if (numTransactionsLeft <= 0) { 59 if (numTransactionsLeft <= 0) {
79 return; 60 return;
80 } 61 }
81 --numTransactionsLeft; 62 --numTransactionsLeft;
82 ++numTransactionsRunning; 63 ++numTransactionsRunning;
83 var valuesToRead = numReadsPerTransaction; 64 var mode = "readonly";
84 var transaction = getTransaction(db, objectStoreNames, "readonly", 65 if (numWritesPerTransaction)
66 mode = "readwrite";
67 var transaction = getTransaction(db, objectStoreNames, mode,
85 function() { 68 function() {
86 assert(!--numTransactionsRunning); 69 assert(!--numTransactionsRunning);
87 assert(!valuesToRead);
88 if (numTransactionsLeft <= 0) { 70 if (numTransactionsLeft <= 0) {
89 completionFunc(); 71 completionFunc();
90 } else { 72 } else {
91 runOneBatch(db); 73 runOneBatch(db);
92 } 74 }
93 }); 75 });
94 76
95 var queryObject = transaction.objectStore(storeName); 77 getRandomValues(transaction, objectStoreNames, numReadsPerTransaction,
96 if (useIndex) { 78 numKeys, indexName);
97 queryObject = queryObject.index(indexName); 79 putRandomValues(transaction, objectStoreNames, numWritesPerTransaction,
98 } 80 numKeys);
99 assert(queryObject);
100 for (var i = 0; i < numReadsPerTransaction; ++i) {
101 var rand = Math.floor(Math.random() * numKeys);
102 var request = queryObject.get(getKey(rand));
103 request.onerror = onError;
104 request.onsuccess = function () {
105 assert(valuesToRead--);
106 }
107 }
108 } 81 }
109 82
110 automation.setStatus("Creating database."); 83 automation.setStatus("Creating database.");
111 var options = {}; 84 var options = {};
112 if (useIndex) { 85 if (useIndexForReads) {
113 options.indexName = indexName; 86 options.indexName = indexName;
114 options.indexKeyPath = ""; 87 options.indexKeyPath = "";
115 options.indexIsUnique = true; 88 options.indexIsUnique = false;
116 options.indexIsMultiEntry = false; 89 options.indexIsMultiEntry = false;
117 } 90 }
118 createDatabase(testName, objectStoreNames, onCreated, onError, options); 91 createDatabase(testName, objectStoreNames, onCreated, onError, options);
119 } 92 }
120 93
94 function testCreateAndDeleteIndex(numKeys, onTestComplete) {
95 var testName = getDisplayName(arguments);
96 var objectStoreNames = ["store"];
97 function getValue(i) {
98 return { firstName: i + " first name", lastName: i + " last name" };
99 }
100
101 var startTime;
102 function onCreated(db) {
103 automation.setStatus("Initializing data.");
104 var transaction = getTransaction(db, objectStoreNames, "readwrite",
105 function() { onPopulated(db); });
106 putLinearValues(transaction, objectStoreNames, numKeys, null, getValue);
107 }
108
109 function onPopulated(db) {
110 db.close();
111 automation.setStatus("Building index.");
112 startTime = Date.now();
113 var f = function(objectStore) {
114 objectStore.createIndex("index", "firstName", {unique: true});
115 };
116 alterObjectStores(testName, objectStoreNames, f, onIndexCreated, onError);
117 }
118
119 var completionFunc;
120 function onIndexCreated(db) {
121 db.close();
122 var indexCreationCompleteTime = Date.now();
123 automation.addResult("testCreateIndex",
124 indexCreationCompleteTime - startTime);
125 completionFunc = getCompletionFunc("testDeleteIndex",
126 indexCreationCompleteTime, onTestComplete);
127 var f = function(objectStore) {
128 objectStore.deleteIndex("index");
129 };
130 automation.setStatus("Deleting index.");
131 alterObjectStores(testName, objectStoreNames, f, completionFunc, onError);
132 }
133
134 automation.setStatus("Creating database.");
135 createDatabase(testName, objectStoreNames, onCreated, onError);
136 }
137
121 var kUseIndex = true; 138 var kUseIndex = true;
122 var kDontUseIndex = false; 139 var kDontUseIndex = false;
123
124 var tests = [ 140 var tests = [
125 [testCreateKeysInStores, 1, 1, 1], 141 [testCreateKeysInStores, 1, 1, 1],
126 [testCreateKeysInStores, 100, 1, 1], 142 [testCreateKeysInStores, 100, 1, 1],
127 [testCreateKeysInStores, 1, 100, 1], 143 [testCreateKeysInStores, 1, 100, 1],
128 [testCreateKeysInStores, 100, 1, 10000], 144 [testCreateKeysInStores, 100, 1, 10000],
129 [testRandomReads, 1000, 5, 50, kDontUseIndex], 145 [testRandomReadsAndWrites, 1000, 5, 0, 50, kDontUseIndex],
130 [testRandomReads, 1000, 50, 5, kDontUseIndex], 146 [testRandomReadsAndWrites, 1000, 50, 0, 5, kDontUseIndex],
131 [testRandomReads, 5000, 50, 5, kDontUseIndex], 147 [testRandomReadsAndWrites, 5000, 50, 0, 5, kDontUseIndex],
132 [testRandomReads, 1000, 5, 50, kUseIndex], 148 [testRandomReadsAndWrites, 1000, 5, 0, 50, kUseIndex],
133 [testRandomReads, 1000, 50, 5, kUseIndex], 149 [testRandomReadsAndWrites, 1000, 50, 0, 5, kUseIndex],
134 [testRandomReads, 5000, 50, 5, kUseIndex] 150 [testRandomReadsAndWrites, 5000, 50, 0, 5, kUseIndex],
151 [testRandomReadsAndWrites, 1000, 5, 5, 50, kDontUseIndex],
152 [testRandomReadsAndWrites, 1000, 5, 5, 50, kUseIndex],
153 [testCreateAndDeleteIndex, 1000]
135 ]; 154 ];
136 155
137 var currentTest = 0; 156 var currentTest = 0;
138 157
139 function runNextTest() { 158 function runNextTest() {
140 if (currentTest < tests.length) { 159 if (currentTest < tests.length) {
141 var test = tests[currentTest++].slice(); 160 var test = tests[currentTest++].slice();
142 var f = test.shift(); 161 var f = test.shift();
143 test.push(runNextTest); 162 test.push(runNextTest);
144 f.apply(null, test); 163 f.apply(null, test);
145 } else { 164 } else {
146 onAllTestsComplete(); 165 onAllTestsComplete();
147 } 166 }
148 } 167 }
149 168
150 function onAllTestsComplete() { 169 function onAllTestsComplete() {
151 var overallDuration = Date.now() - overallTestStartTime; 170 var overallDuration = Date.now() - overallTestStartTime;
152 automation.addResult("OverallTestDuration", overallDuration); 171 automation.addResult("OverallTestDuration", overallDuration);
153 automation.setDone(); 172 automation.setDone();
154 } 173 }
155 174
156 function test() { 175 function test() {
157 runNextTest(); 176 runNextTest();
158 } 177 }
OLDNEW
« no previous file with comments | « chrome/test/data/indexeddb/perf_shared.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698