• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1function finishTest()
2{
3    if (window.layoutTestController)
4        layoutTestController.notifyDone();
5}
6
7var TOTAL_TESTS = 7;
8var testsRun = 0;
9function transactionErrorCallback(error, expectedErrorCodeName)
10{
11    if (error.code == error[expectedErrorCodeName]) {
12        log("PASS: expected and got error code " + expectedErrorCodeName);
13        if (++testsRun == TOTAL_TESTS)
14            finishTest();
15    } else {
16        log("FAIL: expected error code " + expectedErrorCodeName + " (" + error[expectedErrorCodeName] + "); got " + error.code);
17        finishTest();
18    }
19}
20
21function transactionSuccessCallback()
22{
23    log("FAIL: a transaction has completed successfully.");
24    finishTest();
25}
26
27function testTransaction(db, transactionCallback, expectedErrorCodeName)
28{
29    db.transaction(transactionCallback,
30                   function(error) {
31                       transactionErrorCallback(error, expectedErrorCodeName);
32                   }, transactionSuccessCallback);
33}
34
35function testTransactionThrowsException(db)
36{
37    testTransaction(db, function(tx) { throw "Exception thrown in transaction callback."; }, "UNKNOWN_ERR");
38}
39
40function testTransactionFailureBecauseOfStatementFailure(db)
41{
42    testTransaction(db,
43                    function(tx) {
44                        tx.executeSql("BAD STATEMENT", [], null, function(tx, error) { return true; });
45                    }, "UNKNOWN_ERR");
46}
47
48function testInvalidStatement(db)
49{
50    testTransaction(db, function(tx) { tx.executeSql("BAD STATEMENT"); }, "SYNTAX_ERR");
51}
52
53function testIncorrectNumberOfBindParameters(db)
54{
55    testTransaction(db,
56                    function(tx) {
57                        tx.executeSql("CREATE TABLE IF NOT EXISTS BadBindNumberTest (Foo INT, Bar INT)");
58                        tx.executeSql("INSERT INTO BadBindNumberTest VALUES (?, ?)", [1]);
59                    }, "SYNTAX_ERR");
60}
61
62function testBindParameterOfWrongType(db)
63{
64    var badString = { };
65    badString.toString = function() { throw "Cannot call toString() on this object." };
66
67    testTransaction(db, function(tx) {
68        tx.executeSql("CREATE TABLE IF NOT EXISTS BadBindTypeTest (Foo TEXT)");
69        tx.executeSql("INSERT INTO BadBindTypeTest VALUES (?)", [badString]);
70    }, "UNKNOWN_ERR");
71}
72
73function testQuotaExceeded(db)
74{
75    testTransaction(db,
76                    function(tx) {
77                        tx.executeSql("CREATE TABLE IF NOT EXISTS QuotaTest (Foo BLOB)");
78                        tx.executeSql("INSERT INTO QuotaTest VALUES (ZEROBLOB(10 * 1024 * 1024))");
79                    }, "QUOTA_ERR");
80}
81
82function testVersionMismatch(db)
83{
84    // Use another DB handle to change the version. However, in order to make sure that the DB version is not
85    // changed before the transactions in the other tests have run, we need to do it in a transaction on 'db'.
86    db.transaction(function(tx) {
87        var db2 = openDatabaseWithSuffix("SQLErrorCodesTest", "1.0", "Tests the error codes.", 1);
88        db2.changeVersion("1.0", "2.0", function(tx) { },
89                          function(error) {
90                              log("FAIL: could not change the DB version.");
91                              finishTest();
92                          }, function() { });
93        });
94
95    testTransaction(db,
96                    function(tx) {
97                        tx.executeSql("THIS STATEMENT SHOULD NEVER GET EXECUTED");
98                    }, "VERSION_ERR");
99}
100
101function runTest()
102{
103    if (window.layoutTestController)
104        layoutTestController.clearAllDatabases();
105
106    var db = openDatabaseWithSuffix("SQLErrorCodesTest", "1.0", "Tests the error codes.", 1);
107    testTransactionThrowsException(db);
108    testTransactionFailureBecauseOfStatementFailure(db);
109    testInvalidStatement(db);
110    testIncorrectNumberOfBindParameters(db);
111    testBindParameterOfWrongType(db);
112    testQuotaExceeded(db);
113    testVersionMismatch(db);
114}
115