summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/imap/test/unit/test_dontStatNoSelect.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/imap/test/unit/test_dontStatNoSelect.js')
-rw-r--r--comm/mailnews/imap/test/unit/test_dontStatNoSelect.js149
1 files changed, 149 insertions, 0 deletions
diff --git a/comm/mailnews/imap/test/unit/test_dontStatNoSelect.js b/comm/mailnews/imap/test/unit/test_dontStatNoSelect.js
new file mode 100644
index 0000000000..7c05cc0c1f
--- /dev/null
+++ b/comm/mailnews/imap/test/unit/test_dontStatNoSelect.js
@@ -0,0 +1,149 @@
+/* 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/. */
+
+// This file tests that checking folders for new mail with STATUS
+// doesn't try to STAT noselect folders.
+
+var gServer, gImapServer;
+var gIMAPInbox;
+var gFolder2Mailbox;
+var gFolder1, gFolder2;
+
+var { MailServices } = ChromeUtils.import(
+ "resource:///modules/MailServices.jsm"
+);
+var { MessageGenerator } = ChromeUtils.import(
+ "resource://testing-common/mailnews/MessageGenerator.jsm"
+);
+var { PromiseTestUtils } = ChromeUtils.import(
+ "resource://testing-common/mailnews/PromiseTestUtils.jsm"
+);
+
+add_setup(function () {
+ var daemon = new ImapDaemon();
+ daemon.createMailbox("folder 1", { subscribed: true });
+ let folder1Mailbox = daemon.getMailbox("folder 1");
+ folder1Mailbox.flags.push("\\Noselect");
+ daemon.createMailbox("folder 2", { subscribed: true });
+ gFolder2Mailbox = daemon.getMailbox("folder 2");
+ addMessageToFolder(gFolder2Mailbox);
+ gServer = makeServer(daemon, "");
+
+ gImapServer = createLocalIMAPServer(gServer.port);
+
+ // Bug 1050840: check a newly created server has the default number of connections
+ Assert.equal(gImapServer.maximumConnectionsNumber, 5);
+ gImapServer.maximumConnectionsNumber = 1;
+
+ localAccountUtils.loadLocalMailAccount();
+
+ // 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 = gImapServer;
+ MailServices.accounts.defaultAccount = imapAccount;
+
+ // Get the folder list...
+ gImapServer.performExpand(null);
+ gServer.performTest("SUBSCRIBE");
+ // pref tuning: one connection only, turn off notifications
+ // Make sure no biff notifications happen
+ 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);
+
+ let rootFolder = gImapServer.rootFolder;
+ gIMAPInbox = rootFolder.getFolderWithFlags(Ci.nsMsgFolderFlags.Inbox);
+ gFolder1 = rootFolder.getChildNamed("folder 1");
+ gFolder2 = rootFolder.getChildNamed("folder 2");
+ gFolder1.setFlag(Ci.nsMsgFolderFlags.CheckNew);
+ gFolder2.setFlag(Ci.nsMsgFolderFlags.CheckNew);
+});
+
+add_task(function checkStatSelect() {
+ // imap fake server's resetTest resets the authentication state - charming.
+ // So poke the _test member directly.
+ gServer._test = true;
+ gIMAPInbox.getNewMessages(null, null);
+ gServer.performTest("STATUS");
+ // We want to wait for the STATUS to be really done before we issue
+ // more STATUS commands, so we do a NOOP on the
+ // INBOX, and since we only have one connection with the fake server,
+ // that will essentially serialize things.
+ gServer._test = true;
+ gIMAPInbox.updateFolder(null);
+ gServer.performTest("NOOP");
+});
+
+add_task(async function checkStatNoSelect() {
+ // folder 2 should have been stat'd, but not folder 1. All we can really check
+ // is that folder 2 was stat'd and that its unread msg count is 1
+ Assert.equal(gFolder2.getNumUnread(false), 1);
+ addMessageToFolder(gFolder2Mailbox);
+ gFolder1.clearFlag(Ci.nsMsgFolderFlags.ImapNoselect);
+ gServer._test = true;
+
+ let folderListener = new FolderListener();
+
+ // we've cleared the ImapNoselect flag, so we will attempt to STAT folder 1,
+ // which will fail. So we verify that we go on and STAT folder 2, and that
+ // it picks up the message we added to it above.
+ MailServices.mailSession.AddFolderListener(
+ folderListener,
+ Ci.nsIFolderListener.boolPropertyChanged
+ );
+ gIMAPInbox.getNewMessages(null, null);
+ // Wait for the folder listener to get told about new messages.
+ await folderListener.promise;
+});
+
+add_task(function endTest() {
+ Assert.equal(gFolder2.getNumUnread(false), 2);
+
+ // Clean up the server in preparation
+ gServer.resetTest();
+ gImapServer.closeCachedConnections();
+ gServer.performTest();
+ gServer.stop();
+});
+
+function addMessageToFolder(mbox) {
+ // make a couple of messages
+ let messages = [];
+ let gMessageGenerator = new MessageGenerator();
+ messages = messages.concat(gMessageGenerator.makeMessage());
+
+ let msgURI = Services.io.newURI(
+ "data:text/plain;base64," + btoa(messages[0].toMessageString())
+ );
+ let message = new ImapMessage(msgURI.spec, mbox.uidnext++);
+ mbox.addMessage(message);
+}
+
+function FolderListener() {
+ this._promise = new Promise(resolve => {
+ this._resolve = resolve;
+ });
+}
+
+FolderListener.prototype = {
+ onFolderBoolPropertyChanged(aItem, aProperty, aOldValue, aNewValue) {
+ // This means that the STAT on "folder 2" has finished.
+ if (aProperty == "NewMessages" && aNewValue) {
+ this._resolve();
+ }
+ },
+ get promise() {
+ return this._promise;
+ },
+};