Chromium Code Reviews| Index: chrome/test/data/indexeddb/perf_test.js |
| diff --git a/chrome/test/data/indexeddb/perf_test.js b/chrome/test/data/indexeddb/perf_test.js |
| index 9e3bbab38da5f4d22ff10ddc776f0fb018953e9a..332b94397880cbc601459cf621bde11686fbbb4b 100644 |
| --- a/chrome/test/data/indexeddb/perf_test.js |
| +++ b/chrome/test/data/indexeddb/perf_test.js |
| @@ -15,41 +15,119 @@ function testCreateKeysInStores( |
| objectStoreNames.push("store " + i); |
| } |
| var value = stringOfLength(payloadLength); |
| - var start; |
| function onCreated(db) { |
| automation.setStatus("Constructing transaction."); |
| - start = Date.now(); // Ignore the setup time for this test. |
| + var cleanUpFunc = getCleanUpFunc(testName, Date.now(), onTestComplete); |
|
jsbell
2012/07/26 18:23:30
Having the test start time recorded in the call to
ericu
2012/07/26 20:24:11
How about if I call it "getCompletionFunc" instead
|
| var transaction = getTransaction(db, objectStoreNames, "readwrite", |
| - function() { onTransactionComplete(db); }); |
| + function() { cleanUpFunc(); }); |
| for (var i in objectStoreNames) { |
| var os = transaction.objectStore(objectStoreNames[i]); |
| assert(os); |
| for (var j = 0; j < numKeys; ++j) { |
| - os.put("key " + j, value); |
| + os.put(value, "key " + j); |
| } |
| } |
| } |
| - function onTransactionComplete(db) { |
| - var duration = Date.now() - start; |
| - // Ignore the cleanup time for this test. |
| - automation.addResult(testName, duration); |
| - automation.setStatus("Deleting."); |
| - deleteDatabase(db, onDeleted); |
| + automation.setStatus("Creating database."); |
| + createDatabase(testName, objectStoreNames, onCreated, onError); |
| +} |
| + |
| +function testRandomReads(numKeys, numReadsPerTransaction, numTransactions, |
| + useIndex, onTestComplete) { |
| + var indexText = "_bare"; |
| + var indexName; |
| + if (useIndex) { |
| + indexText = "_index"; |
| + indexName = "index"; |
| } |
| - function onDeleted() { |
| - automation.setStatus("Deleted."); |
| - onTestComplete(); |
| + var testName = "testRandomReads_" + numKeys + "_" + numReadsPerTransaction + |
| + "_" + numTransactions + indexText; |
| + var numTransactionsLeft = numTransactions; |
| + var storeName = "store"; |
| + var objectStoreNames = [storeName]; |
|
jsbell
2012/07/26 18:23:30
FYI, a single string is acceptable as well as an a
ericu
2012/07/26 20:24:11
I make it a consistent array everywhere so as to k
|
| + var numTransactionsRunning; |
| + |
| + function getKey(i) { |
| + return "key " + i; |
| } |
| - automation.setStatus("Creating."); |
| - createDatabase(testName, objectStoreNames, onCreated, onError); |
| + |
| + function getValue(i) { |
| + return "value " + i; |
| + } |
| + |
| + function onCreated(db) { |
| + automation.setStatus("Setting up test database."); |
| + var transaction = getTransaction(db, objectStoreNames, "readwrite", |
| + function() { onSetupComplete(db); }); |
| + var os = transaction.objectStore(storeName); |
| + assert(os); |
| + for (var j = 0; j < numKeys; ++j) { |
| + os.put(getValue(i), getKey(j)); |
| + } |
| + } |
| + var cleanUpFunc; |
| + function onSetupComplete(db) { |
| + automation.setStatus("Setup complete."); |
| + runOneBatch(db); |
| + cleanUpFunc = getCleanUpFunc(testName, Date.now(), onTestComplete); |
| + } |
| + |
| + function runOneBatch(db) { |
| + if (numTransactionsLeft <= 0) { |
| + return; |
| + } |
| + --numTransactionsLeft; |
| + ++numTransactionsRunning; |
| + var valuesToRead = numReadsPerTransaction; |
| + var transaction = getTransaction(db, objectStoreNames, "readonly", |
| + function() { |
| + assert(!--numTransactionsRunning); |
| + assert(!valuesToRead); |
| + if (numTransactionsLeft <= 0) { |
| + cleanUpFunc(); |
| + } else { |
| + runOneBatch(db); |
| + } |
| + }); |
| + |
| + var queryObject = transaction.objectStore(storeName); |
| + if (useIndex) { |
| + queryObject = queryObject.index(indexName); |
| + } |
| + assert(queryObject); |
| + for (var i = 0; i < numReadsPerTransaction; ++i) { |
| + var rand = Math.floor(Math.random() * numKeys); |
| + var request = queryObject.get(getKey(rand)); |
| + request.onerror = onError; |
| + request.onsuccess = function () { |
| + assert(valuesToRead--); |
| + } |
| + } |
| + } |
| + |
| + automation.setStatus("Creating database."); |
| + var options = {}; |
| + if (useIndex) { |
| + options.indexName = indexName; |
| + options.indexKeyPath = ""; |
| + options.indexIsUnique = true; |
| + options.indexIsMultiEntry = false; |
| + } |
| + createDatabase(testName, objectStoreNames, onCreated, onError, options); |
|
jsbell
2012/07/26 18:23:30
Might be just a personal thing, but I find tests m
ericu
2012/07/26 20:24:11
I lean the opposite way, and always want everythin
dgrogan
2012/07/26 20:35:58
I like code order = execution order, possibly just
|
| } |
| var tests = [ |
| - [testCreateKeysInStores, 1, 1, 1], |
| - [testCreateKeysInStores, 100, 1, 1], |
| - [testCreateKeysInStores, 1, 100, 1], |
| - [testCreateKeysInStores, 100, 1, 100000] |
| + [testCreateKeysInStores, 1, 1, 1], |
| + [testCreateKeysInStores, 100, 1, 1], |
| + [testCreateKeysInStores, 1, 100, 1], |
| + [testCreateKeysInStores, 100, 1, 10000], |
| + [testRandomReads, 1000, 5, 50, false], |
|
jsbell
2012/07/26 18:23:30
For readability, maybe define a "const" (var kUseI
ericu
2012/07/26 20:24:11
Good idea; done.
|
| + [testRandomReads, 1000, 50, 5, false], |
| + [testRandomReads, 5000, 50, 5, false], |
| + [testRandomReads, 1000, 5, 50, true], |
| + [testRandomReads, 1000, 50, 5, true], |
| + [testRandomReads, 5000, 50, 5, true] |
| ]; |
| var currentTest = 0; |