diff options
Diffstat (limited to 'LayoutTests/storage/multiple-transactions-on-different-handles.js')
-rw-r--r-- | LayoutTests/storage/multiple-transactions-on-different-handles.js | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/LayoutTests/storage/multiple-transactions-on-different-handles.js b/LayoutTests/storage/multiple-transactions-on-different-handles.js new file mode 100644 index 0000000..9ab4b93 --- /dev/null +++ b/LayoutTests/storage/multiple-transactions-on-different-handles.js @@ -0,0 +1,78 @@ +var complete = 0; + +function checkCompletion() +{ + // The test should end after two transactions + if (++complete == 2 && window.layoutTestController) + layoutTestController.notifyDone(); +} + +// Opens the database used in this test case +function openTestDatabase() +{ + return openDatabaseWithSuffix("MultipleTransactionsOnDifferentHandlesTest", + "1.0", + "Test to make sure that queueing multiple transactions on different DB handles does not result in a deadlock.", + 32768); +} + +function statementSuccessCallback(dbName, statementType) +{ + log(dbName + " " + statementType + " statement succeeded"); +} + +function statementErrorCallback(dbName, statementType, error) +{ + log(dbName + " " + statementType + " statement failed: " + error.message); +} + +// Runs a transaction on the given database +function runTransaction(db, dbName, val) +{ + db.transaction(function(tx) { + // Execute a read-only statement + tx.executeSql("SELECT COUNT(*) FROM Test;", [], + function(result) { statementSuccessCallback(dbName, "read"); }, + function(tx, error) { statementErrorCallback(dbName, "read", error); }); + + // Execute a write statement to make sure SQLite tries to acquire an exclusive lock on the DB file + tx.executeSql("INSERT INTO Test VALUES (?);", [val], + function(result) { statementSuccessCallback(dbName, "write"); }, + function(tx, error) { statementErrorCallback(dbName, "write", error); }); + }, function(error) { + // Transaction failure callback + log(dbName + " transaction failed: " + error.message); + checkCompletion(); + }, function() { + // Transaction success callback + log(dbName + " transaction succeeded"); + checkCompletion(); + }); +} + +// We need to guarantee that the Test table exists before we run our test. +// Therefore, the test code is in the successCallback of the transaction that creates the table. +function runTest() { + try { + var db = openTestDatabase(); + db.transaction(function(tx) { + // Create the Test table if it does not exist + tx.executeSql("CREATE TABLE IF NOT EXISTS Test (Foo int);", [], + function(result) {}, function(tx, error) {}); + }, function(error) { + log("Creating the Test table failed: " + error.message); + }, function() { + // The Test table was created successfully + var db1 = openTestDatabase(); + var db2 = openTestDatabase(); + if (db1 == db2) + log("failure: db1 == db2"); + else { + runTransaction(db1, "db1", 1); + runTransaction(db2, "db2", 2); + } + }); + } catch(err) {} +} + + |