-
Notifications
You must be signed in to change notification settings - Fork 3.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
IndexedDB renaming and transaction abort tests. (#3854)
Reviewed upstream in Blink: https://codereview.chromium.org/2276593002/ https://codereview.chromium.org/2314933005/
- Loading branch information
1 parent
127149d
commit 27af3dd
Showing
11 changed files
with
2,205 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
<!DOCTYPE html> | ||
<title>IndexedDB: index renaming support in aborted transactions</title> | ||
<link rel="help" | ||
href="https://w3c.github.io/IndexedDB/#dom-idbindex-name"> | ||
<link rel="author" href="[email protected]" title="Victor Costan"> | ||
<script src="/resources/testharness.js"></script> | ||
<script src="/resources/testharnessreport.js"></script> | ||
<script src="support-promises.js"></script> | ||
<script> | ||
|
||
promise_test(testCase => { | ||
const dbName = databaseName(testCase); | ||
let authorIndex = null, authorIndex2 = null; | ||
return createDatabase(testCase, (database, transaction) => { | ||
createBooksStore(testCase, database); | ||
}).then(database => { | ||
database.close(); | ||
}).then(() => migrateDatabase(testCase, 2, (database, transaction) => { | ||
const store = transaction.objectStore('books'); | ||
authorIndex = store.index('by_author'); | ||
authorIndex.name = 'renamed_by_author'; | ||
|
||
transaction.abort(); | ||
|
||
assert_equals( | ||
authorIndex.name, 'by_author', | ||
'IDBIndex.name should not reflect the rename any more ' + | ||
'immediately after transaction.abort() returns'); | ||
assert_array_equals( | ||
store.indexNames, ['by_author', 'by_title'], | ||
'IDBObjectStore.indexNames should not reflect the rename any ' + | ||
'more immediately after transaction.abort() returns'); | ||
})).then(event => { | ||
assert_equals( | ||
authorIndex.name, 'by_author', | ||
'IDBIndex.name should not reflect the rename any more after the ' + | ||
'versionchange transaction is aborted'); | ||
|
||
const request = indexedDB.open(dbName, 1); | ||
return requestWatcher(testCase, request).wait_for('success'); | ||
}).then(event => { | ||
const database = event.target.result; | ||
const transaction = database.transaction('books', 'readonly'); | ||
const store = transaction.objectStore('books'); | ||
assert_array_equals( | ||
store.indexNames, ['by_author', 'by_title'], | ||
'IDBDatabase.objectStoreNames should not reflect the rename ' + | ||
'after the versionchange transaction is aborted'); | ||
|
||
authorIndex2 = store.index('by_author'); | ||
return checkAuthorIndexContents( | ||
testCase, authorIndex2, | ||
'Aborting an index rename transaction should not change the ' + | ||
"index's records").then(() => database.close()); | ||
}).then(() => { | ||
assert_equals( | ||
authorIndex.name, 'by_author', | ||
'IDBIndex used in aborted rename transaction should not reflect ' + | ||
'the rename after the transaction is aborted'); | ||
assert_equals(authorIndex2.name, 'by_author', | ||
'IDBIndex obtained after an aborted rename transaction should ' + | ||
'not reflect the rename'); | ||
}); | ||
}, 'IndexedDB index rename in aborted transaction'); | ||
|
||
promise_test(testCase => { | ||
const dbName = databaseName(testCase); | ||
let authorIndex = null; | ||
return createDatabase(testCase, (database, transaction) => { | ||
createNotBooksStore(testCase, database); | ||
}).then(database => { | ||
database.close(); | ||
}).then(() => migrateDatabase(testCase, 2, (database, transaction) => { | ||
const store = transaction.objectStore('not_books'); | ||
authorIndex = store.createIndex('by_author', 'author'); | ||
authorIndex.name = 'by_author_renamed'; | ||
authorIndex.name = 'by_author_renamed_again'; | ||
|
||
transaction.abort(); | ||
|
||
assert_equals( | ||
authorIndex.name, 'by_author_renamed_again', | ||
'IDBIndex.name should reflect the last rename immediately after ' + | ||
'transaction.abort() returns'); | ||
assert_array_equals( | ||
store.indexNames, ['not_by_author', 'not_by_title'], | ||
'IDBObjectStore.indexNames should not reflect the creation or ' + | ||
'the rename immediately after transaction.abort() returns'); | ||
})).then(event => { | ||
assert_equals( | ||
authorIndex.name, 'by_author_renamed_again', | ||
'IDBIndex.name should reflect the last rename after the ' + | ||
'versionchange transaction is aborted'); | ||
|
||
const request = indexedDB.open(dbName, 1); | ||
return requestWatcher(testCase, request).wait_for('success'); | ||
}).then(event => { | ||
const database = event.target.result; | ||
const transaction = database.transaction('not_books', 'readonly'); | ||
const store = transaction.objectStore('not_books'); | ||
assert_array_equals( | ||
store.indexNames, ['not_by_author', 'not_by_title'], | ||
'IDBDatabase.objectStoreNames should not reflect the creation or ' + | ||
'the rename after the versionchange transaction is aborted'); | ||
|
||
database.close(); | ||
}); | ||
}, 'IndexedDB index creation and rename in an aborted transaction'); | ||
|
||
</script> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
<!DOCTYPE html> | ||
<title>IndexedDB: index renaming error handling</title> | ||
<link rel="help" | ||
href="https://w3c.github.io/IndexedDB/#dom-idbindex-name"> | ||
<link rel="author" href="[email protected]" title="Victor Costan"> | ||
<script src="/resources/testharness.js"></script> | ||
<script src="/resources/testharnessreport.js"></script> | ||
<script src="support-promises.js"></script> | ||
<script> | ||
|
||
promise_test(testCase => { | ||
return createDatabase(testCase, (database, transaction) => { | ||
createBooksStore(testCase, database); | ||
}).then(database => { | ||
database.close(); | ||
}).then(() => migrateDatabase(testCase, 2, (database, transaction) => { | ||
const store = transaction.objectStore('books'); | ||
const index = store.index('by_author'); | ||
store.deleteIndex('by_author'); | ||
assert_throws( | ||
'InvalidStateError', () => index.name = 'renamed_by_author'); | ||
})).then(database => database.close()); | ||
}, 'IndexedDB deleted index rename throws'); | ||
|
||
promise_test(testCase => { | ||
return createDatabase(testCase, (database, transaction) => { | ||
createBooksStore(testCase, database); | ||
}).then(database => { | ||
const transaction = database.transaction('books', 'readonly'); | ||
const store = transaction.objectStore('books'); | ||
const index = store.index('by_author'); | ||
|
||
assert_throws( | ||
'InvalidStateError', () => index.name = 'renamed_by_author'); | ||
database.close(); | ||
}); | ||
}, 'IndexedDB index rename throws in a readonly transaction'); | ||
|
||
promise_test(testCase => { | ||
return createDatabase(testCase, (database, transaction) => { | ||
createBooksStore(testCase, database); | ||
}).then(database => { | ||
const transaction = database.transaction('books', 'readwrite'); | ||
const store = transaction.objectStore('books'); | ||
const index = store.index('by_author'); | ||
|
||
assert_throws( | ||
'InvalidStateError', () => index.name = 'renamed_by_author'); | ||
database.close(); | ||
}); | ||
}, 'IndexedDB index rename throws in a readwrite transaction'); | ||
|
||
promise_test(testCase => { | ||
let authorIndex = null; | ||
return createDatabase(testCase, (database, transaction) => { | ||
const store = createBooksStore(testCase, database); | ||
authorIndex = store.index('by_author'); | ||
}).then(database => { | ||
assert_throws( | ||
'TransactionInactiveError', | ||
() => authorIndex.name = 'renamed_by_author'); | ||
database.close(); | ||
}); | ||
}, 'IndexedDB index rename throws in an inactive transaction'); | ||
|
||
promise_test(testCase => { | ||
return createDatabase(testCase, (database, transaction) => { | ||
createBooksStore(testCase, database); | ||
}).then(database => { | ||
database.close(); | ||
}).then(() => migrateDatabase(testCase, 2, (database, transaction) => { | ||
const store = transaction.objectStore('books'); | ||
const index = store.index('by_author'); | ||
|
||
assert_throws('ConstraintError', () => index.name = 'by_title'); | ||
assert_array_equals( | ||
store.indexNames, ['by_author', 'by_title'], | ||
'An index rename that throws an exception should not change the ' + | ||
"index's IDBObjectStore.indexNames"); | ||
})).then(database => { | ||
const transaction = database.transaction('books', 'readonly'); | ||
const store = transaction.objectStore('books'); | ||
assert_array_equals( | ||
store.indexNames, ['by_author', 'by_title'], | ||
'Committing a transaction with a failed store rename attempt ' + | ||
"should not change the index's IDBObjectStore.indexNames"); | ||
const index = store.index('by_author'); | ||
return checkAuthorIndexContents( | ||
testCase, index, | ||
'Committing a transaction with a failed rename attempt should ' + | ||
"not change the index's contents").then(() => database.close()); | ||
}); | ||
}, 'IndexedDB index rename to the name of another index throws'); | ||
|
||
promise_test(testCase => { | ||
return createDatabase(testCase, (database, transaction) => { | ||
createBooksStore(testCase, database); | ||
}).then(database => { | ||
database.close(); | ||
}).then(() => migrateDatabase(testCase, 2, (database, transaction) => { | ||
const store = transaction.objectStore('books'); | ||
const index = store.index('by_author'); | ||
|
||
assert_throws( | ||
{ name: 'Custom stringifying error' }, | ||
() => { | ||
index.name = { | ||
toString: () => { throw { name: 'Custom stringifying error'}; } | ||
}; | ||
}, 'IDBObjectStore rename should re-raise toString() exception'); | ||
assert_array_equals( | ||
store.indexNames, ['by_author', 'by_title'], | ||
'An index rename that throws an exception should not change the ' + | ||
"index's IDBObjectStore.indexNames"); | ||
})).then(database => { | ||
const transaction = database.transaction('books', 'readonly'); | ||
const store = transaction.objectStore('books'); | ||
assert_array_equals( | ||
store.indexNames, ['by_author', 'by_title'], | ||
'Committing a transaction with a failed store rename attempt ' + | ||
"should not change the index's IDBObjectStore.indexNames"); | ||
const index = store.index('by_author'); | ||
return checkAuthorIndexContents( | ||
testCase, index, | ||
'Committing a transaction with a failed rename attempt should ' + | ||
"not change the index's contents").then(() => database.close()); | ||
}); | ||
}, 'IndexedDB index rename handles exceptions when stringifying names'); | ||
|
||
</script> |
Oops, something went wrong.