| function finishTest() |
| { |
| if (window.testRunner) |
| testRunner.notifyDone(); |
| } |
| |
| var TOTAL_TESTS = 8; |
| var testsRun = 0; |
| function transactionErrorCallback(error, expectedErrorCodeName) |
| { |
| if (error.code == error[expectedErrorCodeName]) { |
| log("PASS: expected and got error code " + expectedErrorCodeName); |
| if (++testsRun == TOTAL_TESTS) |
| finishTest(); |
| } else { |
| log("FAIL: expected error code " + expectedErrorCodeName + " (" + error[expectedErrorCodeName] + "); got " + error.code); |
| finishTest(); |
| } |
| } |
| |
| function transactionSuccessCallback() |
| { |
| log("FAIL: a transaction has completed successfully."); |
| finishTest(); |
| } |
| |
| function testTransaction(db, transactionCallback, expectedErrorCodeName) |
| { |
| db.transaction(transactionCallback, |
| function(error) { |
| transactionErrorCallback(error, expectedErrorCodeName); |
| }, transactionSuccessCallback); |
| } |
| |
| function testTransactionThrowsException(db) |
| { |
| testTransaction(db, function(tx) { throw "Exception thrown in transaction callback."; }, "UNKNOWN_ERR"); |
| } |
| |
| function testTransactionFailureBecauseOfStatementFailure(db) |
| { |
| testTransaction(db, |
| function(tx) { |
| tx.executeSql("BAD STATEMENT", [], null, function(tx, error) { return true; }); |
| }, "UNKNOWN_ERR"); |
| } |
| |
| function testInvalidStatement(db) |
| { |
| testTransaction(db, function(tx) { tx.executeSql("BAD STATEMENT"); }, "SYNTAX_ERR"); |
| } |
| |
| function testIncorrectNumberOfBindParameters(db) |
| { |
| testTransaction(db, |
| function(tx) { |
| tx.executeSql("CREATE TABLE IF NOT EXISTS BadBindNumberTest (Foo INT, Bar INT)"); |
| tx.executeSql("INSERT INTO BadBindNumberTest VALUES (?, ?)", [1]); |
| }, "SYNTAX_ERR"); |
| } |
| |
| function testBindParameterOfWrongType(db) |
| { |
| var badString = { }; |
| badString.toString = function() { throw "Cannot call toString() on this object." }; |
| |
| testTransaction(db, function(tx) { |
| tx.executeSql("CREATE TABLE IF NOT EXISTS BadBindTypeTest (Foo TEXT)"); |
| tx.executeSql("INSERT INTO BadBindTypeTest VALUES (?)", [badString]); |
| }, "UNKNOWN_ERR"); |
| } |
| |
| function testQuotaExceeded(db) |
| { |
| testTransaction(db, |
| function(tx) { |
| tx.executeSql("CREATE TABLE IF NOT EXISTS QuotaTest (Foo BLOB)"); |
| tx.executeSql("INSERT INTO QuotaTest VALUES (ZEROBLOB(10 * 1024 * 1024))"); |
| }, "QUOTA_ERR"); |
| } |
| |
| function testConstraintFailure(db) |
| { |
| testTransaction(db, |
| function(tx) { |
| tx.executeSql("CREATE TABLE IF NOT EXISTS ConstraintTest (Foo INTEGER PRIMARY KEY)"); |
| tx.executeSql("INSERT INTO ConstraintTest VALUES (1)"); |
| tx.executeSql("INSERT INTO ConstraintTest VALUES (1)"); |
| }, "CONSTRAINT_ERR"); |
| } |
| |
| function testVersionMismatch(db) |
| { |
| // Use another DB handle to change the version. However, in order to make sure that the DB version is not |
| // changed before the transactions in the other tests have run, we need to do it in a transaction on 'db'. |
| db.transaction(function(tx) { |
| var db2 = openDatabaseWithSuffix("SQLErrorCodesTest", "1.0", "Tests the error codes.", 1); |
| db2.changeVersion("1.0", "2.0", function(tx) { }, |
| function(error) { |
| log("FAIL: could not change the DB version."); |
| finishTest(); |
| }, function() { }); |
| }); |
| |
| testTransaction(db, |
| function(tx) { |
| tx.executeSql("THIS STATEMENT SHOULD NEVER GET EXECUTED"); |
| }, "VERSION_ERR"); |
| } |
| |
| function runTest() |
| { |
| if (window.testRunner) |
| testRunner.clearAllDatabases(); |
| |
| var db = openDatabaseWithSuffix("SQLErrorCodesTest", "1.0", "Tests the error codes.", 1); |
| testTransactionThrowsException(db); |
| testTransactionFailureBecauseOfStatementFailure(db); |
| testInvalidStatement(db); |
| testIncorrectNumberOfBindParameters(db); |
| testBindParameterOfWrongType(db); |
| testQuotaExceeded(db); |
| testConstraintFailure(db); |
| testVersionMismatch(db); |
| } |