michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: /* michael@0: * This file tests the functionality of michael@0: * mozIStorageAsyncConnection::executeSimpleSQLAsync. michael@0: */ michael@0: michael@0: const INTEGER = 1; michael@0: const TEXT = "this is test text"; michael@0: const REAL = 3.23; michael@0: michael@0: function asyncClose(db) { michael@0: let deferred = Promise.defer(); michael@0: db.asyncClose(function(status) { michael@0: if (Components.isSuccessCode(status)) { michael@0: deferred.resolve(); michael@0: } else { michael@0: deferred.reject(status); michael@0: } michael@0: }); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function openAsyncDatabase(file) { michael@0: let deferred = Promise.defer(); michael@0: getService().openAsyncDatabase(file, null, function(status, db) { michael@0: if (Components.isSuccessCode(status)) { michael@0: deferred.resolve(db.QueryInterface(Ci.mozIStorageAsyncConnection)); michael@0: } else { michael@0: deferred.reject(status); michael@0: } michael@0: }); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function executeSimpleSQLAsync(db, query, onResult) { michael@0: let deferred = Promise.defer(); michael@0: db.executeSimpleSQLAsync(query, { michael@0: handleError: function(error) { michael@0: deferred.reject(error); michael@0: }, michael@0: handleResult: function(result) { michael@0: if (onResult) { michael@0: onResult(result); michael@0: } else { michael@0: do_throw("No results were expected"); michael@0: } michael@0: }, michael@0: handleCompletion: function(result) { michael@0: deferred.resolve(result); michael@0: } michael@0: }); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: add_task(function test_create_and_add() { michael@0: let adb = yield openAsyncDatabase(getTestDB()); michael@0: michael@0: let completion = yield executeSimpleSQLAsync(adb, michael@0: "CREATE TABLE test (id INTEGER, string TEXT, number REAL)"); michael@0: michael@0: do_check_eq(Ci.mozIStorageStatementCallback.REASON_FINISHED, completion); michael@0: michael@0: completion = yield executeSimpleSQLAsync(adb, michael@0: "INSERT INTO test (id, string, number) " + michael@0: "VALUES (" + INTEGER + ", \"" + TEXT + "\", " + REAL + ")"); michael@0: michael@0: do_check_eq(Ci.mozIStorageStatementCallback.REASON_FINISHED, completion); michael@0: michael@0: let result = null; michael@0: michael@0: completion = yield executeSimpleSQLAsync(adb, michael@0: "SELECT string, number FROM test WHERE id = 1", michael@0: function(aResultSet) { michael@0: result = aResultSet.getNextRow(); michael@0: do_check_eq(2, result.numEntries); michael@0: do_check_eq(TEXT, result.getString(0)); michael@0: do_check_eq(REAL, result.getDouble(1)); michael@0: } michael@0: ); michael@0: michael@0: do_check_eq(Ci.mozIStorageStatementCallback.REASON_FINISHED, completion); michael@0: do_check_neq(result, null); michael@0: result = null; michael@0: michael@0: yield executeSimpleSQLAsync(adb, "SELECT COUNT(0) FROM test", michael@0: function(aResultSet) { michael@0: result = aResultSet.getNextRow(); michael@0: do_check_eq(1, result.getInt32(0)); michael@0: }); michael@0: michael@0: do_check_neq(result, null); michael@0: michael@0: yield asyncClose(adb); michael@0: }); michael@0: michael@0: michael@0: add_task(function test_asyncClose_does_not_complete_before_statement() { michael@0: let adb = yield openAsyncDatabase(getTestDB()); michael@0: let executed = false; michael@0: michael@0: let reason = yield executeSimpleSQLAsync(adb, "SELECT * FROM test", michael@0: function(aResultSet) { michael@0: let result = aResultSet.getNextRow(); michael@0: michael@0: do_check_neq(result, null); michael@0: do_check_eq(3, result.numEntries); michael@0: do_check_eq(INTEGER, result.getInt32(0)); michael@0: do_check_eq(TEXT, result.getString(1)); michael@0: do_check_eq(REAL, result.getDouble(2)); michael@0: executed = true; michael@0: } michael@0: ); michael@0: michael@0: do_check_eq(Ci.mozIStorageStatementCallback.REASON_FINISHED, reason); michael@0: michael@0: // Ensure that the statement executed to completion. michael@0: do_check_true(executed); michael@0: michael@0: yield asyncClose(adb); michael@0: }); michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: //// Test Runner michael@0: michael@0: function run_test() michael@0: { michael@0: run_next_test(); michael@0: }