summaryrefslogtreecommitdiffstats
path: root/LayoutTests/storage/multiple-transactions-on-different-handles.js
diff options
context:
space:
mode:
Diffstat (limited to 'LayoutTests/storage/multiple-transactions-on-different-handles.js')
-rw-r--r--LayoutTests/storage/multiple-transactions-on-different-handles.js78
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) {}
+}
+
+