126 lines
4.2 KiB
JavaScript
126 lines
4.2 KiB
JavaScript
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);
|
|
}
|