OLD | NEW |
---|---|
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 cleanUpFunc = getCleanUpFunc(testName, Date.now(), onTestComplete); | 23 var cleanUpFunc = getCleanUpFunc(testName, Date.now(), onTestComplete); |
22 var transaction = getTransaction(db, objectStoreNames, "readwrite", | 24 var transaction = getTransaction(db, objectStoreNames, "readwrite", |
23 function() { cleanUpFunc(); }); | 25 function() { cleanUpFunc(); }); |
24 for (var i in objectStoreNames) { | 26 putLinearValues(transaction, objectStoreNames, numKeys, null, getValue); |
25 var os = transaction.objectStore(objectStoreNames[i]); | |
26 assert(os); | |
27 for (var j = 0; j < numKeys; ++j) { | |
28 os.put(value, "key " + j); | |
29 } | |
30 } | |
31 } | 27 } |
32 automation.setStatus("Creating database."); | 28 automation.setStatus("Creating database."); |
33 createDatabase(testName, objectStoreNames, onCreated, onError); | 29 createDatabase(testName, objectStoreNames, onCreated, onError); |
34 } | 30 } |
35 | 31 |
36 function testRandomReads(numKeys, numReadsPerTransaction, numTransactions, | 32 function testRandomReadsAndWrites( |
37 useIndex, onTestComplete) { | 33 numKeys, numReadsPerTransaction, numWritesPerTransaction, numTransactions, |
38 var indexText = "_bare"; | 34 useIndexForReads, onTestComplete) { |
39 var indexName; | 35 var indexName; |
40 if (useIndex) { | 36 if (useIndexForReads) |
41 indexText = "_index"; | |
42 indexName = "index"; | 37 indexName = "index"; |
43 } | 38 var testName = getDisplayName(arguments); |
44 var testName = "testRandomReads_" + numKeys + "_" + numReadsPerTransaction + | |
45 "_" + numTransactions + indexText; | |
46 var numTransactionsLeft = numTransactions; | 39 var numTransactionsLeft = numTransactions; |
47 var storeName = "store"; | 40 var objectStoreNames = ["store"]; |
48 var objectStoreNames = [storeName]; | |
49 var numTransactionsRunning; | 41 var numTransactionsRunning; |
50 | 42 |
51 function getKey(i) { | |
52 return "key " + i; | |
53 } | |
54 | |
55 function getValue(i) { | |
56 return "value " + i; | |
57 } | |
58 | |
59 function onCreated(db) { | 43 function onCreated(db) { |
60 automation.setStatus("Setting up test database."); | 44 automation.setStatus("Setting up test database."); |
61 var transaction = getTransaction(db, objectStoreNames, "readwrite", | 45 var transaction = getTransaction(db, objectStoreNames, "readwrite", |
62 function() { onSetupComplete(db); }); | 46 function() { onSetupComplete(db); }); |
63 var os = transaction.objectStore(storeName); | 47 putLinearValues(transaction, objectStoreNames, numKeys, |
64 assert(os); | 48 function () { return "test value"; }); |
jsbell
2012/07/26 18:52:41
Isn't this being specified for the getKey argument
ericu
2012/07/26 21:03:13
Yup; fixed.
| |
65 for (var j = 0; j < numKeys; ++j) { | |
66 os.put(getValue(i), getKey(j)); | |
67 } | |
68 } | 49 } |
69 var cleanUpFunc; | 50 var cleanUpFunc; |
70 function onSetupComplete(db) { | 51 function onSetupComplete(db) { |
71 automation.setStatus("Setup complete."); | 52 automation.setStatus("Setup complete."); |
72 runOneBatch(db); | 53 runOneBatch(db); |
73 cleanUpFunc = getCleanUpFunc(testName, Date.now(), onTestComplete); | 54 cleanUpFunc = getCleanUpFunc(testName, Date.now(), onTestComplete); |
74 } | 55 } |
75 | 56 |
76 function runOneBatch(db) { | 57 function runOneBatch(db) { |
77 if (numTransactionsLeft <= 0) { | 58 if (numTransactionsLeft <= 0) { |
78 return; | 59 return; |
79 } | 60 } |
80 --numTransactionsLeft; | 61 --numTransactionsLeft; |
81 ++numTransactionsRunning; | 62 ++numTransactionsRunning; |
82 var valuesToRead = numReadsPerTransaction; | 63 var mode = "readonly"; |
83 var transaction = getTransaction(db, objectStoreNames, "readonly", | 64 if (numWritesPerTransaction) |
65 mode = "readwrite"; | |
66 var transaction = getTransaction(db, objectStoreNames, mode, | |
84 function() { | 67 function() { |
85 assert(!--numTransactionsRunning); | 68 assert(!--numTransactionsRunning); |
86 assert(!valuesToRead); | |
87 if (numTransactionsLeft <= 0) { | 69 if (numTransactionsLeft <= 0) { |
88 cleanUpFunc(); | 70 cleanUpFunc(); |
89 } else { | 71 } else { |
90 runOneBatch(db); | 72 runOneBatch(db); |
91 } | 73 } |
92 }); | 74 }); |
93 | 75 |
94 var queryObject = transaction.objectStore(storeName); | 76 getRandomValues(transaction, objectStoreNames, numReadsPerTransaction, |
95 if (useIndex) { | 77 numKeys, indexName); |
96 queryObject = queryObject.index(indexName); | 78 putRandomValues(transaction, objectStoreNames, numWritesPerTransaction, |
97 } | 79 numKeys); |
98 assert(queryObject); | |
99 for (var i = 0; i < numReadsPerTransaction; ++i) { | |
100 var rand = Math.floor(Math.random() * numKeys); | |
101 var request = queryObject.get(getKey(rand)); | |
102 request.onerror = onError; | |
103 request.onsuccess = function () { | |
104 assert(valuesToRead--); | |
105 } | |
106 } | |
107 } | 80 } |
108 | 81 |
109 automation.setStatus("Creating database."); | 82 automation.setStatus("Creating database."); |
110 var options = {}; | 83 var options = {}; |
111 if (useIndex) { | 84 if (useIndexForReads) { |
112 options.indexName = indexName; | 85 options.indexName = indexName; |
113 options.indexKeyPath = ""; | 86 options.indexKeyPath = ""; |
114 options.indexIsUnique = true; | 87 options.indexIsUnique = true; |
115 options.indexIsMultiEntry = false; | 88 options.indexIsMultiEntry = false; |
116 } | 89 } |
117 createDatabase(testName, objectStoreNames, onCreated, onError, options); | 90 createDatabase(testName, objectStoreNames, onCreated, onError, options); |
118 } | 91 } |
119 | 92 |
93 function testCreateAndDeleteIndex(numKeys, onTestComplete) { | |
94 var testName = getDisplayName(arguments); | |
95 var objectStoreNames = ["store"]; | |
96 function getValue(i) { | |
97 return { firstName: i + " first name", lastName: i + " last name" }; | |
98 } | |
99 | |
100 var startTime; | |
101 function onCreated(db) { | |
102 automation.setStatus("Initializing data."); | |
103 var transaction = getTransaction(db, objectStoreNames, "readwrite", | |
104 function() { onPopulated(db); }); | |
105 putLinearValues(transaction, objectStoreNames, numKeys, null, getValue); | |
106 } | |
107 | |
108 function onPopulated(db) { | |
109 db.close(); | |
110 automation.setStatus("Building index."); | |
111 startTime = Date.now(); | |
112 var f = | |
113 function(objectStore) { | |
114 objectStore.createIndex("index", "firstName", {unique: true}); | |
115 } | |
jsbell
2012/07/26 18:52:41
Missing semicolon.
ericu
2012/07/26 21:03:13
Done.
| |
116 alterObjectStores(testName, objectStoreNames, f, onIndexCreated, onError); | |
117 } | |
118 | |
119 var cleanUpFunc; | |
120 function onIndexCreated(db) { | |
121 db.close(); | |
122 var indexCreationCompleteTime = Date.now(); | |
123 automation.addResult("testCreateIndex", | |
124 indexCreationCompleteTime - startTime); | |
125 cleanUpFunc = getCleanUpFunc("testDeleteIndex", | |
126 indexCreationCompleteTime, onTestComplete); | |
127 var f = | |
128 function(objectStore) { | |
129 objectStore.deleteIndex("index"); | |
130 } | |
jsbell
2012/07/26 18:52:41
Missing semicolon.
ericu
2012/07/26 21:03:13
Done.
| |
131 automation.setStatus("Deleting index."); | |
132 alterObjectStores(testName, objectStoreNames, f, cleanUpFunc, onError); | |
133 } | |
134 | |
135 function onIndexDeleted(db) { | |
jsbell
2012/07/26 18:52:41
Not used?
ericu
2012/07/26 21:03:13
Removed.
| |
136 cleanUpFunc(db); | |
jsbell
2012/07/26 18:52:41
The function returned by getCleanUpFunc() doesn't
ericu
2012/07/26 21:03:13
Done.
| |
137 } | |
138 | |
139 automation.setStatus("Creating database."); | |
140 createDatabase(testName, objectStoreNames, onCreated, onError); | |
141 } | |
142 | |
120 var tests = [ | 143 var tests = [ |
121 [testCreateKeysInStores, 1, 1, 1], | 144 [testCreateKeysInStores, 1, 1, 1], |
122 [testCreateKeysInStores, 100, 1, 1], | 145 [testCreateKeysInStores, 100, 1, 1], |
123 [testCreateKeysInStores, 1, 100, 1], | 146 [testCreateKeysInStores, 1, 100, 1], |
124 [testCreateKeysInStores, 100, 1, 10000], | 147 [testCreateKeysInStores, 100, 1, 10000], |
125 [testRandomReads, 1000, 5, 50, false], | 148 [testRandomReadsAndWrites, 1000, 5, 0, 50, false], |
126 [testRandomReads, 1000, 50, 5, false], | 149 [testRandomReadsAndWrites, 1000, 50, 0, 5, false], |
127 [testRandomReads, 5000, 50, 5, false], | 150 [testRandomReadsAndWrites, 5000, 50, 0, 5, false], |
128 [testRandomReads, 1000, 5, 50, true], | 151 [testRandomReadsAndWrites, 1000, 5, 0, 50, true], |
129 [testRandomReads, 1000, 50, 5, true], | 152 [testRandomReadsAndWrites, 1000, 50, 0, 5, true], |
130 [testRandomReads, 5000, 50, 5, true] | 153 [testRandomReadsAndWrites, 5000, 50, 0, 5, true], |
154 [testRandomReadsAndWrites, 1000, 5, 5, 50, false], | |
155 [testRandomReadsAndWrites, 1000, 5, 5, 50, true], | |
156 [testCreateAndDeleteIndex, 1000] | |
131 ]; | 157 ]; |
132 | 158 |
133 var currentTest = 0; | 159 var currentTest = 0; |
134 | 160 |
135 function runNextTest() { | 161 function runNextTest() { |
136 if (currentTest < tests.length) { | 162 if (currentTest < tests.length) { |
137 var test = tests[currentTest++].slice(); | 163 var test = tests[currentTest++].slice(); |
138 var f = test.shift(); | 164 var f = test.shift(); |
139 test.push(runNextTest); | 165 test.push(runNextTest); |
140 f.apply(null, test); | 166 f.apply(null, test); |
141 } else { | 167 } else { |
142 onAllTestsComplete(); | 168 onAllTestsComplete(); |
143 } | 169 } |
144 } | 170 } |
145 | 171 |
146 function onAllTestsComplete() { | 172 function onAllTestsComplete() { |
147 var overallDuration = Date.now() - overallTestStartTime; | 173 var overallDuration = Date.now() - overallTestStartTime; |
148 automation.addResult("OverallTestDuration", overallDuration); | 174 automation.addResult("OverallTestDuration", overallDuration); |
149 automation.setDone(); | 175 automation.setDone(); |
150 } | 176 } |
151 | 177 |
152 function test() { | 178 function test() { |
153 runNextTest(); | 179 runNextTest(); |
154 } | 180 } |
OLD | NEW |