summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/imap/test/unit/test_offlinePlayback.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/imap/test/unit/test_offlinePlayback.js')
-rw-r--r--comm/mailnews/imap/test/unit/test_offlinePlayback.js187
1 files changed, 187 insertions, 0 deletions
diff --git a/comm/mailnews/imap/test/unit/test_offlinePlayback.js b/comm/mailnews/imap/test/unit/test_offlinePlayback.js
new file mode 100644
index 0000000000..ae4361e16b
--- /dev/null
+++ b/comm/mailnews/imap/test/unit/test_offlinePlayback.js
@@ -0,0 +1,187 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Test to ensure that changes made while offline are played back when we
+ * go back online.
+ */
+
+var { MailServices } = ChromeUtils.import(
+ "resource:///modules/MailServices.jsm"
+);
+var { PromiseTestUtils } = ChromeUtils.import(
+ "resource://testing-common/mailnews/PromiseTestUtils.jsm"
+);
+
+/* import-globals-from ../../../test/resources/MessageGenerator.jsm */
+load("../../../resources/MessageGenerator.jsm");
+
+var gSecondFolder, gThirdFolder;
+var gSynthMessage1, gSynthMessage2;
+// the message id of bugmail10
+var gMsgId1 = "200806061706.m56H6RWT004933@mrapp54.mozilla.org";
+var gOfflineManager;
+
+var tests = [
+ setupIMAPPump,
+ function serverParms() {
+ var { fsDebugAll } = ChromeUtils.import(
+ "resource://testing-common/mailnews/Maild.jsm"
+ );
+ IMAPPump.server.setDebugLevel(fsDebugAll);
+ },
+ setup,
+
+ function prepareToGoOffline() {
+ let rootFolder = IMAPPump.incomingServer.rootFolder;
+ gSecondFolder = rootFolder
+ .getChildNamed("secondFolder")
+ .QueryInterface(Ci.nsIMsgImapMailFolder);
+ gThirdFolder = rootFolder
+ .getChildNamed("thirdFolder")
+ .QueryInterface(Ci.nsIMsgImapMailFolder);
+ IMAPPump.incomingServer.closeCachedConnections();
+ },
+ async function doOfflineOps() {
+ IMAPPump.server.stop();
+ Services.io.offline = true;
+
+ // Flag the two messages, and then copy them to different folders. Since
+ // we're offline, these operations are synchronous.
+ let msgHdr1 = IMAPPump.inbox.msgDatabase.getMsgHdrForMessageID(
+ gSynthMessage1.messageId
+ );
+ let msgHdr2 = IMAPPump.inbox.msgDatabase.getMsgHdrForMessageID(
+ gSynthMessage2.messageId
+ );
+ let headers1 = [msgHdr1];
+ let headers2 = [msgHdr2];
+ msgHdr1.folder.markMessagesFlagged(headers1, true);
+ msgHdr2.folder.markMessagesFlagged(headers2, true);
+ let promiseCopyListener1 = new PromiseTestUtils.PromiseCopyListener();
+ MailServices.copy.copyMessages(
+ IMAPPump.inbox,
+ headers1,
+ gSecondFolder,
+ true,
+ promiseCopyListener1,
+ null,
+ true
+ );
+ let promiseCopyListener2 = new PromiseTestUtils.PromiseCopyListener();
+ MailServices.copy.copyMessages(
+ IMAPPump.inbox,
+ headers2,
+ gThirdFolder,
+ true,
+ promiseCopyListener2,
+ null,
+ true
+ );
+ var file = do_get_file("../../../data/bugmail10");
+ let promiseCopyListener3 = new PromiseTestUtils.PromiseCopyListener();
+ MailServices.copy.copyFileMessage(
+ file,
+ IMAPPump.inbox,
+ null,
+ false,
+ 0,
+ "",
+ promiseCopyListener3,
+ null
+ );
+ await Promise.all([
+ promiseCopyListener1.promise,
+ promiseCopyListener2.promise,
+ promiseCopyListener3.promise,
+ ]);
+ },
+ async function goOnline() {
+ gOfflineManager = Cc["@mozilla.org/messenger/offline-manager;1"].getService(
+ Ci.nsIMsgOfflineManager
+ );
+ IMAPPump.daemon.closing = false;
+ Services.io.offline = false;
+
+ IMAPPump.server.start();
+ gOfflineManager.goOnline(false, true, null);
+ await PromiseTestUtils.promiseDelay(2000);
+ },
+ async function updateSecondFolder() {
+ let promiseUrlListener = new PromiseTestUtils.PromiseUrlListener();
+ gSecondFolder.updateFolderWithListener(null, promiseUrlListener);
+ await promiseUrlListener.promise;
+ },
+ async function updateThirdFolder() {
+ let promiseUrlListener = new PromiseTestUtils.PromiseUrlListener();
+ gThirdFolder.updateFolderWithListener(null, promiseUrlListener);
+ await promiseUrlListener.promise;
+ },
+ async function updateInbox() {
+ let promiseUrlListener = new PromiseTestUtils.PromiseUrlListener();
+ IMAPPump.inbox.updateFolderWithListener(null, promiseUrlListener);
+ await promiseUrlListener.promise;
+ },
+ function checkDone() {
+ let msgHdr1 = gSecondFolder.msgDatabase.getMsgHdrForMessageID(
+ gSynthMessage1.messageId
+ );
+ let msgHdr2 = gThirdFolder.msgDatabase.getMsgHdrForMessageID(
+ gSynthMessage2.messageId
+ );
+ let msgHdr3 = IMAPPump.inbox.msgDatabase.getMsgHdrForMessageID(gMsgId1);
+ Assert.notEqual(msgHdr1, null);
+ Assert.notEqual(msgHdr2, null);
+ Assert.notEqual(msgHdr3, null);
+ },
+ teardownIMAPPump,
+];
+
+async function setup() {
+ /*
+ * Set up an IMAP server.
+ */
+ IMAPPump.daemon.createMailbox("secondFolder", { subscribed: true });
+ IMAPPump.daemon.createMailbox("thirdFolder", { subscribed: true });
+ Services.prefs.setBoolPref(
+ "mail.server.default.autosync_offline_stores",
+ false
+ );
+ // Don't prompt about offline download when going offline
+ Services.prefs.setIntPref("offline.download.download_messages", 2);
+
+ // make a couple of messages
+ let messages = [];
+ let gMessageGenerator = new MessageGenerator();
+ messages = messages.concat(gMessageGenerator.makeMessage());
+ messages = messages.concat(gMessageGenerator.makeMessage());
+ gSynthMessage1 = messages[0];
+ gSynthMessage2 = messages[1];
+
+ let msgURI = Services.io.newURI(
+ "data:text/plain;base64," + btoa(messages[0].toMessageString())
+ );
+ let imapInbox = IMAPPump.daemon.getMailbox("INBOX");
+ let message = new ImapMessage(msgURI.spec, imapInbox.uidnext++, ["\\Seen"]);
+ imapInbox.addMessage(message);
+ msgURI = Services.io.newURI(
+ "data:text/plain;base64," + btoa(messages[1].toMessageString())
+ );
+ message = new ImapMessage(msgURI.spec, imapInbox.uidnext++, ["\\Seen"]);
+ imapInbox.addMessage(message);
+
+ // update folder to download header.
+ let promiseUrlListener = new PromiseTestUtils.PromiseUrlListener();
+ IMAPPump.inbox.updateFolderWithListener(null, promiseUrlListener);
+ await promiseUrlListener.promise;
+}
+
+function run_test() {
+ Services.prefs.setBoolPref(
+ "mail.server.default.autosync_offline_stores",
+ false
+ );
+ tests.forEach(x => add_task(x));
+ run_next_test();
+}