michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: MARIONETTE_CONTEXT = "chrome"; michael@0: michael@0: let Promise = Cu.import("resource://gre/modules/Promise.jsm").Promise; michael@0: michael@0: /** michael@0: * Name space for MobileMessageDB.jsm. Only initialized after first call to michael@0: * newMobileMessageDB. michael@0: */ michael@0: let MMDB; michael@0: michael@0: /** michael@0: * Create a new MobileMessageDB instance. michael@0: * michael@0: * @return A MobileMessageDB instance. michael@0: */ michael@0: function newMobileMessageDB() { michael@0: if (!MMDB) { michael@0: MMDB = Cu.import("resource://gre/modules/MobileMessageDB.jsm", {}); michael@0: is(typeof MMDB.MobileMessageDB, "function", "MMDB.MobileMessageDB"); michael@0: } michael@0: michael@0: let mmdb = new MMDB.MobileMessageDB(); michael@0: ok(mmdb, "MobileMessageDB instance"); michael@0: return mmdb; michael@0: } michael@0: michael@0: /** michael@0: * Initialize a MobileMessageDB. Resolve if initialized with success, reject michael@0: * otherwise. michael@0: * michael@0: * Fulfill params: a MobileMessageDB instance. michael@0: * Reject params: a MobileMessageDB instance. michael@0: * michael@0: * @param aMmdb michael@0: * A MobileMessageDB instance. michael@0: * @param aDbName michael@0: * A string name for that database. michael@0: * @param aDbVersion michael@0: * The version that MobileMessageDB should upgrade to. 0 for the lastest michael@0: * version. michael@0: * michael@0: * @return A deferred promise. michael@0: */ michael@0: function initMobileMessageDB(aMmdb, aDbName, aDbVersion) { michael@0: let deferred = Promise.defer(); michael@0: michael@0: aMmdb.init(aDbName, aDbVersion, function(aError) { michael@0: if (aError) { michael@0: deferred.reject(aMmdb); michael@0: } else { michael@0: deferred.resolve(aMmdb); michael@0: } michael@0: }); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: /** michael@0: * Close a MobileMessageDB. michael@0: * michael@0: * @param aMmdb michael@0: * A MobileMessageDB instance. michael@0: * michael@0: * @return The passed MobileMessageDB instance. michael@0: */ michael@0: function closeMobileMessageDB(aMmdb) { michael@0: aMmdb.close(); michael@0: return aMmdb; michael@0: } michael@0: michael@0: /** michael@0: * Utility function for calling MMDB methods that takes either a michael@0: * nsIRilMobileMessageDatabaseCallback or a michael@0: * nsIRilMobileMessageDatabaseRecordCallback. michael@0: * michael@0: * Resolve when the target method notifies us with a successful result code; michael@0: * reject otherwise. In either case, the arguments passed are packed into an michael@0: * array and propagated to next action. michael@0: * michael@0: * Fulfill params: an array whose elements are the arguments of the original michael@0: * callback. michael@0: * Reject params: same as fulfill params. michael@0: * michael@0: * @param aMmdb michael@0: * A MobileMessageDB instance. michael@0: * @param aMethodName michael@0: * A string name for that target method. michael@0: * @param ... michael@0: * Extra arguments to pass to that target method. The last callback michael@0: * argument should always be excluded. michael@0: * michael@0: * @return A deferred promise. michael@0: */ michael@0: function callMmdbMethod(aMmdb, aMethodName) { michael@0: let deferred = Promise.defer(); michael@0: michael@0: let args = Array.slice(arguments, 2); michael@0: args.push({ michael@0: notify: function(aRv) { michael@0: if (!Components.isSuccessCode(aRv)) { michael@0: ok(true, aMethodName + " returns a unsuccessful code: " + aRv); michael@0: deferred.reject(Array.slice(arguments)); michael@0: } else { michael@0: ok(true, aMethodName + " returns a successful code: " + aRv); michael@0: deferred.resolve(Array.slice(arguments)); michael@0: } michael@0: } michael@0: }); michael@0: aMmdb[aMethodName].apply(aMmdb, args); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: /** michael@0: * A convenient function for calling |mmdb.saveSendingMessage(...)|. michael@0: * michael@0: * Fulfill params: [, ]. michael@0: * Reject params: same as fulfill params. michael@0: * michael@0: * @return A deferred promise. michael@0: */ michael@0: function saveSendingMessage(aMmdb, aMessage) { michael@0: return callMmdbMethod(aMmdb, "saveSendingMessage", aMessage); michael@0: } michael@0: michael@0: /** michael@0: * A convenient function for calling |mmdb.saveReceivedMessage(...)|. michael@0: * michael@0: * Fulfill params: [, ]. michael@0: * Reject params: same as fulfill params. michael@0: * michael@0: * @return A deferred promise. michael@0: */ michael@0: function saveReceivedMessage(aMmdb, aMessage) { michael@0: return callMmdbMethod(aMmdb, "saveReceivedMessage", aMessage); michael@0: } michael@0: michael@0: /** michael@0: * A convenient function for calling |mmdb.setMessageDeliveryByMessageId(...)|. michael@0: * michael@0: * Fulfill params: [, ]. michael@0: * Reject params: same as fulfill params. michael@0: * michael@0: * @return A deferred promise. michael@0: */ michael@0: function setMessageDeliveryByMessageId(aMmdb, aMessageId, aReceiver, aDelivery, michael@0: aDeliveryStatus, aEnvelopeId) { michael@0: return callMmdbMethod(aMmdb, "setMessageDeliveryByMessageId", aMessageId, michael@0: aReceiver, aDelivery, aDeliveryStatus, aEnvelopeId); michael@0: } michael@0: michael@0: /** michael@0: * A convenient function for calling michael@0: * |mmdb.setMessageDeliveryStatusByEnvelopeId(...)|. michael@0: * michael@0: * Fulfill params: [, ]. michael@0: * Reject params: same as fulfill params. michael@0: * michael@0: * @return A deferred promise. michael@0: */ michael@0: function setMessageDeliveryStatusByEnvelopeId(aMmdb, aEnvelopeId, aReceiver, michael@0: aDeliveryStatus) { michael@0: return callMmdbMethod(aMmdb, "setMessageDeliveryStatusByEnvelopeId", michael@0: aMmdb, aEnvelopeId, aReceiver, aDeliveryStatus); michael@0: } michael@0: michael@0: /** michael@0: * A convenient function for calling michael@0: * |mmdb.setMessageReadStatusByEnvelopeId(...)|. michael@0: * michael@0: * Fulfill params: [, ]. michael@0: * Reject params: same as fulfill params. michael@0: * michael@0: * @return A deferred promise. michael@0: */ michael@0: function setMessageReadStatusByEnvelopeId(aMmdb, aEnvelopeId, aReceiver, michael@0: aReadStatus) { michael@0: return callMmdbMethod(aMmdb, "setMessageReadStatusByEnvelopeId", michael@0: aEnvelopeId, aReceiver, aReadStatus); michael@0: } michael@0: michael@0: /** michael@0: * A convenient function for calling michael@0: * |mmdb.getMessageRecordByTransactionId(...)|. michael@0: * michael@0: * Fulfill params: [, , ]. michael@0: * Reject params: same as fulfill params. michael@0: * michael@0: * @return A deferred promise. michael@0: */ michael@0: function getMessageRecordByTransactionId(aMmdb, aTransactionId) { michael@0: return callMmdbMethod(aMmdb, "getMessageRecordByTransactionId", michael@0: aTransactionId); michael@0: } michael@0: michael@0: /** michael@0: * A convenient function for calling |mmdb.getMessageRecordById(...)|. michael@0: * michael@0: * Fulfill params: [, , ]. michael@0: * Reject params: same as fulfill params. michael@0: * michael@0: * @return A deferred promise. michael@0: */ michael@0: function getMessageRecordById(aMmdb, aMessageId) { michael@0: return callMmdbMethod(aMmdb, "getMessageRecordById", aMessageId); michael@0: } michael@0: michael@0: /** michael@0: * A convenient function for calling |mmdb.markMessageRead(...)|. michael@0: * michael@0: * Fulfill params: Ci.nsIMobileMessageCallback.FOO. michael@0: * Reject params: same as fulfill params. michael@0: * michael@0: * @return A deferred promise. michael@0: */ michael@0: function markMessageRead(aMmdb, aMessageId, aRead) { michael@0: let deferred = Promise.defer(); michael@0: michael@0: aMmdb.markMessageRead(aMessageId, aRead, false, { michael@0: notifyMarkMessageReadFailed: function(aRv) { michael@0: ok(true, "markMessageRead returns a unsuccessful code: " + aRv); michael@0: deferred.reject(aRv); michael@0: }, michael@0: michael@0: notifyMessageMarkedRead: function(aRead) { michael@0: ok(true, "markMessageRead returns a successful code: " + Cr.NS_OK); michael@0: deferred.resolve(Ci.nsIMobileMessageCallback.SUCCESS_NO_ERROR); michael@0: } michael@0: }); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: /** michael@0: * Utility function for calling cursor-based MMDB methods. michael@0: * michael@0: * Resolve when the target method notifies us with |notifyCursorDone|, michael@0: * reject otherwise. michael@0: * michael@0: * Fulfill params: [, []] michael@0: * Reject params: same as fulfill params. michael@0: * michael@0: * @param aMmdb michael@0: * A MobileMessageDB instance. michael@0: * @param aMethodName michael@0: * A string name for that target method. michael@0: * @param ... michael@0: * Extra arguments to pass to that target method. The last callback michael@0: * argument should always be excluded. michael@0: * michael@0: * @return A deferred promise. michael@0: */ michael@0: function createMmdbCursor(aMmdb, aMethodName) { michael@0: let deferred = Promise.defer(); michael@0: michael@0: let cursor; michael@0: let results = []; michael@0: let args = Array.slice(arguments, 2); michael@0: args.push({ michael@0: notifyCursorError: function(aRv) { michael@0: ok(true, "notifyCursorError: " + aRv); michael@0: deferred.reject([aRv, results]); michael@0: }, michael@0: michael@0: notifyCursorResult: function(aResult) { michael@0: ok(true, "notifyCursorResult: " + aResult.id); michael@0: results.push(aResult); michael@0: cursor.handleContinue(); michael@0: }, michael@0: michael@0: notifyCursorDone: function() { michael@0: ok(true, "notifyCursorDone"); michael@0: deferred.resolve([Ci.nsIMobileMessageCallback.SUCCESS_NO_ERROR, results]); michael@0: } michael@0: }); michael@0: michael@0: cursor = aMmdb[aMethodName].apply(aMmdb, args); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: /** michael@0: * A convenient function for calling |mmdb.createMessageCursor(...)|. michael@0: * michael@0: * Fulfill params: [, []]. michael@0: * Reject params: same as fulfill params. michael@0: * michael@0: * @return A deferred promise. michael@0: */ michael@0: function createMessageCursor(aMmdb, aFilter, aReverse) { michael@0: return createMmdbCursor(aMmdb, "createMessageCursor", aFilter, aReverse); michael@0: } michael@0: michael@0: /** michael@0: * A convenient function for calling |mmdb.createThreadCursor(...)|. michael@0: * michael@0: * Fulfill params: [, []]. michael@0: * Reject params: same as fulfill params. michael@0: * michael@0: * @return A deferred promise. michael@0: */ michael@0: function createThreadCursor(aMmdb) { michael@0: return createMmdbCursor(aMmdb, "createThreadCursor"); michael@0: } michael@0: michael@0: // A reference to a nsIUUIDGenerator service. michael@0: let _uuidGenerator; michael@0: michael@0: /** michael@0: * Generate a new UUID. michael@0: * michael@0: * @return A UUID string. michael@0: */ michael@0: function newUUID() { michael@0: if (!_uuidGenerator) { michael@0: _uuidGenerator = Cc["@mozilla.org/uuid-generator;1"] michael@0: .getService(Ci.nsIUUIDGenerator); michael@0: ok(_uuidGenerator, "uuidGenerator"); michael@0: } michael@0: michael@0: return _uuidGenerator.generateUUID().toString(); michael@0: } michael@0: michael@0: /** michael@0: * Flush permission settings and call |finish()|. michael@0: */ michael@0: function cleanUp() { michael@0: // Use ok here so that we have at least one test run. michael@0: ok(true, "permissions flushed"); michael@0: michael@0: finish(); michael@0: } michael@0: michael@0: /** michael@0: * Basic test routine helper for mobile message tests. michael@0: * michael@0: * This helper does nothing but clean-ups. michael@0: * michael@0: * @param aTestCaseMain michael@0: * A function that takes no parameter. michael@0: */ michael@0: function startTestBase(aTestCaseMain) { michael@0: Promise.resolve() michael@0: .then(aTestCaseMain) michael@0: .then(null, function() { michael@0: ok(false, 'promise rejects during test.'); michael@0: }) michael@0: .then(cleanUp); michael@0: }