Commit 0530ec59 authored by Andreas Butler's avatar Andreas Butler Committed by Commit Bot

IDBFactory databases flaky wpt fix.

Converting databases() wpt tests to promise_tests to fix flakiness

Bug: https://bugs.chromium.org/p/chromium/issues/detail?id=899085
Change-Id: I91848796d7508408bb3e5b9fb05f725564fa9971
Reviewed-on: https://chromium-review.googlesource.com/c/1299959Reviewed-by: default avatarVictor Costan <pwnall@chromium.org>
Reviewed-by: default avatarChase Phillips <cmp@chromium.org>
Commit-Queue: Victor Costan <pwnall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#603701}
parent d11d38fc
// META: script=support.js // META: script=support-promises.js
async_test( async function(t) { promise_test(async testCase => {
let made_database_check = t.step_func(async function() { // Delete any databases that may not have been cleaned up after
let idb_databases_promise = await indexedDB.databases(); // previous test runs.
assert_true( await deleteAllDatabases(testCase);
idb_databases_promise.some(
e => e.name == "TestDatabase" && e.version == 1), const db_name = "TestDatabase";
"Call to databases() did not find database."); const db = await createNamedDatabase(testCase, db_name, ()=>{});
t.done(); const databases_promise = await indexedDB.databases();
}); const expected_result = [
delete_then_open(t, "TestDatabase", ()=>{}, made_database_check); {"name": db_name, "version": 1},
}, "Report one database test."); ];
assert_object_equals(
async_test( function(t) { databases_promise,
let done_making_databases_callback = t.step_func(async function() { expected_result,
let idb_databases_promise = await indexedDB.databases(); "Call to databases() did not retrieve the single expected result.");
assert_true( }, "Enumerate one database.");
idb_databases_promise.some(
e => e.name == "TestDatabase1" && e.version == 1), promise_test(async testCase => {
"Call to databases() did not find database."); // Delete any databases that may not have been cleaned up after previous test
assert_true( // runs.
idb_databases_promise.some( await deleteAllDatabases(testCase);
e => e.name == "TestDatabase2" && e.version == 1),
"Call to databases() did not find database."); const db_name1 = "TestDatabase1";
assert_true( const db_name2 = "TestDatabase2";
idb_databases_promise.some( const db_name3 = "TestDatabase3";
e => e.name == "TestDatabase3" && e.version == 1), const db1 = await createNamedDatabase(testCase, db_name1, ()=>{});
"Call to databases() did not find database."); const db2 = await createNamedDatabase(testCase, db_name2, ()=>{});
t.done(); const db3 = await createNamedDatabase(testCase, db_name3, ()=>{});
}); const databases_promise = await indexedDB.databases();
let make_databases_barrier = create_barrier(done_making_databases_callback); const expected_result = [
delete_then_open(t, "TestDatabase1", ()=>{}, make_databases_barrier(t)); {"name": db_name1, "version": 1},
delete_then_open(t, "TestDatabase2", ()=>{}, make_databases_barrier(t)); {"name": db_name2, "version": 1},
delete_then_open(t, "TestDatabase3", ()=>{}, make_databases_barrier(t)); {"name": db_name3, "version": 1},
}, "Report multiple databases test."); ];
assert_object_equals(
async_test( function(t) { databases_promise,
let delete_request = indexedDB.deleteDatabase("NonExistentDatabase"); expected_result,
delete_request.onsuccess = t.step_func(async function() { "Call to databases() did not retrieve the multiple expected results");
let idb_databases_promise = await indexedDB.databases(); }, "Enumerate multiple databases.");
assert_false(
idb_databases_promise.some( promise_test(async testCase => {
e => e.name == "NonExistentDatabase"), // Add some databases and close their connections.
"Call to databases() found excluded database."); const db1 = await createNamedDatabase(testCase, "DB1", ()=>{});
t.done(); const db2 = await createNamedDatabase(testCase, "DB2", ()=>{});
}); db1.onversionchange = () => { db1.close() };
}, "Don't report nonexistant databases test."); db2.onversionchange = () => { db2.close() };
// Delete any databases that may not have been cleaned up after previous test
// runs as well as the two databases made above.
await deleteAllDatabases(testCase);
// Make sure the databases are no longer returned.
const databases_promise = await indexedDB.databases();
assert_object_equals(
databases_promise,
[],
"Call to databases() found database it should not have.")
}, "Make sure an empty list is returned for the case of no databases.");
done(); done();
...@@ -290,3 +290,12 @@ function largeValue(size, seed) { ...@@ -290,3 +290,12 @@ function largeValue(size, seed) {
return buffer; return buffer;
} }
async function deleteAllDatabases(testCase) {
const dbs_to_delete = await indexedDB.databases();
for( const db_info of dbs_to_delete) {
let request = indexedDB.deleteDatabase(db_info.name);
let eventWatcher = requestWatcher(testCase, request);
await eventWatcher.wait_for('success');
}
}
...@@ -192,49 +192,3 @@ function keep_alive(tx, store_name) { ...@@ -192,49 +192,3 @@ function keep_alive(tx, store_name) {
pin = false; pin = false;
}; };
} }
/**
* Ensures that indexeddb database specified by db_name is deleted, and then
* opens a connection to that database.
*
* @param t: the testing script state
* @param db_name: name of database to delete then create
* @param upgrade_func: function to be called if db_name needs upgrading
* @param body_func: function to be called upon successful deletion
* and creation of db_name
*/
function delete_then_open(t, db_name, upgrade_func, body_func) {
var delete_request = indexedDB.deleteDatabase(db_name);
delete_request.onerror = t.unreached_func('deleteDatabase should not fail');
delete_request.onsuccess = t.step_func(function(e) {
var open_request = indexedDB.open(db_name);
open_request.onupgradeneeded = t.step_func(function() {
upgrade_func(t, open_request.result, open_request);
});
open_request.onsuccess = t.step_func(function() {
body_func(t, open_request.result);
});
});
}
/**
* Creates a barrier that one calls
*
* @param callback: function to be called after barrier is passed
*/
function create_barrier(callback) {
var count = 0;
var called = false;
return function(t) {
assert_false(called, "Barrier already used.");
++count;
return t.step_func(function() {
--count;
if (count === 0) {
assert_false(called, "Barrier already used.");
called = true;
callback();
}
});
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment