function finishTest() { if (window.layoutTestController) layoutTestController.notifyDone(); } var TOTAL_TESTS = 7; 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 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.layoutTestController) layoutTestController.clearAllDatabases(); var db = openDatabaseWithSuffix("SQLErrorCodesTest", "1.0", "Tests the error codes.", 1); testTransactionThrowsException(db); testTransactionFailureBecauseOfStatementFailure(db); testInvalidStatement(db); testIncorrectNumberOfBindParameters(db); testBindParameterOfWrongType(db); testQuotaExceeded(db); testVersionMismatch(db); }