summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/imap/test/unit/test_imapHighWater.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/imap/test/unit/test_imapHighWater.js')
-rw-r--r--comm/mailnews/imap/test/unit/test_imapHighWater.js194
1 files changed, 194 insertions, 0 deletions
diff --git a/comm/mailnews/imap/test/unit/test_imapHighWater.js b/comm/mailnews/imap/test/unit/test_imapHighWater.js
new file mode 100644
index 0000000000..3fcd4bcc23
--- /dev/null
+++ b/comm/mailnews/imap/test/unit/test_imapHighWater.js
@@ -0,0 +1,194 @@
+/* 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/. */
+
+/* import-globals-from ../../../test/resources/alertTestUtils.js */
+load("../../../resources/alertTestUtils.js");
+
+var { MailServices } = ChromeUtils.import(
+ "resource:///modules/MailServices.jsm"
+);
+var { MessageGenerator, MessageScenarioFactory } = ChromeUtils.import(
+ "resource://testing-common/mailnews/MessageGenerator.jsm"
+);
+var { PromiseTestUtils } = ChromeUtils.import(
+ "resource://testing-common/mailnews/PromiseTestUtils.jsm"
+);
+
+var gIMAPDaemon, gServer, gIMAPIncomingServer;
+
+var gIMAPInbox;
+var gFolder1, gRootFolder;
+
+// Adds some messages directly to a mailbox (eg new mail)
+function addMessagesToServer(messages, mailbox) {
+ // Create the ImapMessages and store them on the mailbox
+ messages.forEach(function (message) {
+ let dataUri = Services.io.newURI(
+ "data:text/plain;base64," + btoa(message.toMessageString())
+ );
+ mailbox.addMessage(new ImapMessage(dataUri.spec, mailbox.uidnext++, []));
+ });
+}
+
+add_setup(function () {
+ localAccountUtils.loadLocalMailAccount();
+
+ /*
+ * Set up an IMAP server.
+ */
+ gIMAPDaemon = new ImapDaemon();
+ gServer = makeServer(gIMAPDaemon, "");
+ gIMAPDaemon.createMailbox("folder 1", { subscribed: true });
+ gIMAPIncomingServer = createLocalIMAPServer(gServer.port);
+ gIMAPIncomingServer.maximumConnectionsNumber = 1;
+
+ // We need an identity so that updateFolder doesn't fail
+ let localAccount = MailServices.accounts.createAccount();
+ let identity = MailServices.accounts.createIdentity();
+ localAccount.addIdentity(identity);
+ localAccount.defaultIdentity = identity;
+ localAccount.incomingServer = localAccountUtils.incomingServer;
+
+ // Let's also have another account, using the same identity
+ let imapAccount = MailServices.accounts.createAccount();
+ imapAccount.addIdentity(identity);
+ imapAccount.defaultIdentity = identity;
+ imapAccount.incomingServer = gIMAPIncomingServer;
+ MailServices.accounts.defaultAccount = imapAccount;
+
+ // pref tuning: one connection only, turn off notifications
+ Services.prefs.setBoolPref("mail.biff.play_sound", false);
+ Services.prefs.setBoolPref("mail.biff.show_alert", false);
+ Services.prefs.setBoolPref("mail.biff.show_tray_icon", false);
+ Services.prefs.setBoolPref("mail.biff.animate_dock_icon", false);
+ 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);
+});
+
+add_setup(function () {
+ // make 10 messages
+ let messageGenerator = new MessageGenerator();
+ let scenarioFactory = new MessageScenarioFactory(messageGenerator);
+
+ // build up a list of messages
+ let messages = [];
+ messages = messages.concat(scenarioFactory.directReply(10));
+
+ // Add 10 messages with uids 1-10.
+ let imapInbox = gIMAPDaemon.getMailbox("INBOX");
+ addMessagesToServer(messages, imapInbox);
+ messages = [];
+ messages = messages.concat(messageGenerator.makeMessage());
+ // Add a single message to move target folder.
+ addMessagesToServer(messages, gIMAPDaemon.getMailbox("folder 1"));
+
+ // Get the IMAP inbox...
+ gRootFolder = gIMAPIncomingServer.rootFolder;
+ gIMAPInbox = gRootFolder
+ .getFolderWithFlags(Ci.nsMsgFolderFlags.Inbox)
+ .QueryInterface(Ci.nsIMsgImapMailFolder);
+});
+
+add_task(async function doMoves() {
+ // update folders to download headers.
+ let urlListenerInbox = new PromiseTestUtils.PromiseUrlListener();
+ gIMAPInbox.updateFolderWithListener(null, urlListenerInbox);
+ await urlListenerInbox.promise;
+ gFolder1 = gRootFolder
+ .getChildNamed("folder 1")
+ .QueryInterface(Ci.nsIMsgImapMailFolder);
+ let urlListenerFolder1 = new PromiseTestUtils.PromiseUrlListener();
+ gFolder1.updateFolderWithListener(null, urlListenerFolder1);
+ await urlListenerFolder1.promise;
+ // get five messages to move from Inbox to folder 1.
+ let headers1 = [];
+ let count = 0;
+ for (let header of gIMAPInbox.msgDatabase.enumerateMessages()) {
+ if (count >= 5) {
+ break;
+ }
+ if (header instanceof Ci.nsIMsgDBHdr) {
+ headers1.push(header);
+ }
+ count++;
+ }
+ // this will add dummy headers with keys > 0xffffff80
+ let copyListenerDummyHeaders = new PromiseTestUtils.PromiseCopyListener();
+ MailServices.copy.copyMessages(
+ gIMAPInbox,
+ headers1,
+ gFolder1,
+ true,
+ copyListenerDummyHeaders,
+ gDummyMsgWindow,
+ true
+ );
+ await copyListenerDummyHeaders.promise;
+
+ let urlListenerInboxAfterDummy = new PromiseTestUtils.PromiseUrlListener();
+ gIMAPInbox.updateFolderWithListener(null, urlListenerInboxAfterDummy);
+ await urlListenerInboxAfterDummy.promise;
+
+ let urlListenerFolder1AfterDummy = new PromiseTestUtils.PromiseUrlListener();
+ gFolder1.updateFolderWithListener(
+ gDummyMsgWindow,
+ urlListenerFolder1AfterDummy
+ );
+ await urlListenerFolder1AfterDummy.promise;
+
+ // Check that playing back offline events gets rid of dummy
+ // headers, and thus highWater is recalculated.
+ Assert.equal(gFolder1.msgDatabase.dBFolderInfo.highWater, 6);
+ headers1 = [];
+ count = 0;
+ for (let header of gIMAPInbox.msgDatabase.enumerateMessages()) {
+ if (count >= 5) {
+ break;
+ }
+ if (header instanceof Ci.nsIMsgDBHdr) {
+ headers1.push(header);
+ }
+ count++;
+ }
+ // Check that copyMessages will handle having a high highwater mark.
+ // It will thrown an exception if it can't.
+ let msgHdr = gFolder1.msgDatabase.createNewHdr(0xfffffffd);
+ gFolder1.msgDatabase.addNewHdrToDB(msgHdr, false);
+ let copyListenerHighWater = new PromiseTestUtils.PromiseCopyListener();
+ MailServices.copy.copyMessages(
+ gIMAPInbox,
+ headers1,
+ gFolder1,
+ true,
+ copyListenerHighWater,
+ gDummyMsgWindow,
+ true
+ );
+ await copyListenerHighWater.promise;
+ gServer.performTest("UID COPY");
+
+ gFolder1.msgDatabase.deleteHeader(msgHdr, null, true, false);
+ let urlListenerInboxAfterDelete = new PromiseTestUtils.PromiseUrlListener();
+ gIMAPInbox.updateFolderWithListener(null, urlListenerInboxAfterDelete);
+ await urlListenerInboxAfterDelete.promise;
+ // this should clear the dummy headers.
+ let urlListenerFolder1AfterDelete = new PromiseTestUtils.PromiseUrlListener();
+ gFolder1.updateFolderWithListener(
+ gDummyMsgWindow,
+ urlListenerFolder1AfterDelete
+ );
+ await urlListenerFolder1AfterDelete.promise;
+ Assert.equal(gFolder1.msgDatabase.dBFolderInfo.highWater, 11);
+});
+
+add_task(function endTest() {
+ Services.io.offline = true;
+ gServer.performTest("LOGOUT");
+ gIMAPIncomingServer.closeCachedConnections();
+ gServer.stop();
+});