blob: 3c82b05f8e6dccc53d487218bb2eb5f195c3d520 [file] [log] [blame]
<!DOCTYPE HTML>
<html>
<head>
<title>Web database storage</title>
<script src='../test_bootstrap.js'></script>
<script type='text/javascript'>
goog.require('bot');
goog.require('bot.html5');
goog.require('bot.storage.database');
goog.require('goog.testing.AsyncTestCase');
goog.require('goog.testing.jsunit');
</script>
<script type='text/javascript'>
var asyncTestCase = null;
// WebDriver does not enable database on Android ICS (b/6373564).
var DATABASE_NOT_WORKING =
!bot.html5.isSupported(bot.html5.API.DATABASE) ||
(goog.userAgent.product.ANDROID && bot.userAgent.isProductVersion(4) &&
!bot.userAgent.isProductVersion(5));
/**
* Initial function to create the database. I use the top-level window
* to create the database.
* This function must not fail or throw error for of the test functions.
*/
function setUpPage() {
if (DATABASE_NOT_WORKING) {
return;
}
try {
var win = bot.getWindow();
var db = win.openDatabase('testDB', '1.0', 'db name', 5*1024*1024);
db.transaction(transactionCallback, errorCallback, successCallback);
asyncTestCase.waitForAsync('testExecuteSqlWithSelectAll');
} catch (e) {
throw new bot.Error(bot.ErrorCode.UNKNOWN_ERROR, e.message);
}
function errorCallback(error) {
throw new bot.Error(bot.ErrorCode.UNKNOWN_ERROR, error.message);
}
function successCallback(error) {
asyncTestCase.continueTesting();
}
function transactionCallback(tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS docids (id INTEGER \
PRIMARY KEY, name TEXT, owner TEXT)');
tx.executeSql('INSERT OR REPLACE INTO docids VALUES (11, "aa", "Manager")');
tx.executeSql('INSERT OR REPLACE INTO docids VALUES (1, "aabb", "Eng-A")');
tx.executeSql('INSERT OR REPLACE INTO docids VALUES (31, "abc", "Eng-B")');
tx.executeSql('INSERT OR REPLACE INTO docids VALUES (0, "aabb", "Eng-A")');
tx.executeSql('INSERT OR REPLACE INTO docids VALUES (2, "yyy", "Eng-D")');
tx.executeSql('INSERT OR REPLACE INTO docids VALUES (3, "zzz", "Eng-A")');
tx.executeSql('INSERT OR REPLACE INTO docids VALUES (90, "aabb", "Eng-E")');
}
}
function testOpenDatabaseWithSameVersion() {
if (DATABASE_NOT_WORKING) {
return;
}
var db;
try {
db = bot.storage.database.openOrCreate('testDB', '1.0');
} catch (e) {
fail(e.message);
}
assertNotNull(db);
assertEquals(db.version, '1.0');
}
function testOpenDatabaseWithAnyVersion() {
if (DATABASE_NOT_WORKING) {
return;
}
var db;
try {
db = bot.storage.database.openOrCreate('testDB');
} catch (e) {
fail(e.message);
}
assertNotNull(db);
assertEquals(db.version, '1.0');
}
function testOpenDatabaseWrongVersion() {
if (DATABASE_NOT_WORKING) {
return;
}
try {
var db = bot.storage.database.open('testDB', '2.0');
} catch (e) {
// Exception should be thrown on opening a database with wrong
// version.
return;
}
fail('Database should fail to open.');
}
function testExecuteSqlWithInvalidSqlStatement() {
if (DATABASE_NOT_WORKING) {
return;
}
try {
// WITH is errorneously used instead of WHERE
bot.storage.database.executeSql('testDB',
'SELECT * from docids WITH id = 1', [], queryResultCallback,
txErrorCallback, txSuccessCallback);
} catch (e) {
var errMsg = 'No exception should be raised on opening the database; ' +
'otherwise be handled by callback';
fail(errMsg);
return;
}
asyncTestCase.waitForAsync('testExecuteSqlWithInvalidSqlStatement');
function queryResultCallback(tx, result) {
//assertEquals(result.rows.length, 1);
fail('Transaction should not succeed with invalid SQL statement');
}
function txErrorCallback(error) {
asyncTestCase.continueTesting();
}
function txSuccessCallback() {
asyncTestCase.continueTesting();
fail('Transaction should not succeed with invalid SQL statement');
}
}
function testExecuteSqlWithValidArgument() {
if (DATABASE_NOT_WORKING) {
return;
}
try {
bot.storage.database.executeSql('testDB',
'SELECT id from docids WHERE owner = ? AND name = ?',
['Eng-A', 'aabb'], queryResultCallback, txErrorCallback,
txSuccessCallback);
} catch (e) {
var errMsg = 'No exception should be raised on opening the database; ' +
'otherwise it must be handled by callback';
fail(errMsg);
return;
}
asyncTestCase.waitForAsync('testExecuteSqlWithInvalidSqlStatement');
function queryResultCallback(tx, result) {
assertEquals(result.rows.length, 2);
assertEquals(result.rowsAffected, 0);
assertEquals(result.rows[0].id, 0);
assertEquals(result.rows[1].id, 1);
}
function txErrorCallback(error) {
asyncTestCase.continueTesting();
fail('Transaction should succeed, not fail');
}
function txSuccessCallback() {
asyncTestCase.continueTesting();
}
}
function testExecuteSqlInsertAndDelete() {
if (DATABASE_NOT_WORKING) {
return;
}
//Grouping insert and delete together to keep no side-effect later.
executeSqlInsert();
executeSqlDelete();
}
function executeSqlInsert() {
try {
bot.storage.database.executeSql('testDB',
'INSERT OR REPLACE INTO docids (id, name, owner) VALUES (?, ?, ?)',
[999, 'file1', 'Eng-L'], queryResultCallback, txErrorCallback,
txSuccessCallback);
} catch (e) {
var errMsg = 'No exception should be raised on opening the database; ' +
'otherwise it must be handled by callback';
fail(errMsg);
return;
}
asyncTestCase.waitForAsync('testExecuteSqlInsert');
function queryResultCallback(tx, result) {
assertEquals(result.rowsAffected, 1);
assertEquals(result.rows.length, 0);
}
function txErrorCallback(error) {
asyncTestCase.continueTesting();
fail('Transaction should succeed, not fail');
}
function txSuccessCallback() {
asyncTestCase.continueTesting();
}
}
function executeSqlDelete() {
try {
bot.storage.database.executeSql('testDB',
'DELETE FROM docids WHERE id=999',
[], queryResultCallback, txErrorCallback,
txSuccessCallback);
} catch (e) {
var errMsg = 'No exception should be raised on opening the database; ' +
'otherwise it must be handled by callback';
fail(errMsg);
return;
}
asyncTestCase.waitForAsync('testExecuteSqlInsert');
function queryResultCallback(tx, result) {
assertEquals(result.rowsAffected, 1);
assertEquals(result.rows.length, 0);
}
function txErrorCallback(error) {
asyncTestCase.continueTesting();
fail('Transaction should succeed, not fail');
}
function txSuccessCallback() {
asyncTestCase.continueTesting();
}
}
</script>
</head>
<body>
<script type="text/javascript">
asyncTestCase = goog.testing.AsyncTestCase.createAndInstall();
asyncTestCase.stepTimeout = 15 * 1000;
</script>
</body>
</html>