summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/news/test/unit/test_bug695309.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/news/test/unit/test_bug695309.js')
-rw-r--r--comm/mailnews/news/test/unit/test_bug695309.js121
1 files changed, 121 insertions, 0 deletions
diff --git a/comm/mailnews/news/test/unit/test_bug695309.js b/comm/mailnews/news/test/unit/test_bug695309.js
new file mode 100644
index 0000000000..d51587ba08
--- /dev/null
+++ b/comm/mailnews/news/test/unit/test_bug695309.js
@@ -0,0 +1,121 @@
+/* Tests the connection mayhem found by bug 695309 */
+
+// The full bug requires several things to fall into place:
+// 1. Cause the connections to timeout, while keeping them in the cache.
+// 2. Enqueue enough requests to cause things to be placed in the pending queue.
+// 3. Commands try to run but die instead.
+// 4. Enqueue more requests to open up new connections.
+// 5. When loading, the connection ends up pulling somebody from the queue and
+// ends up treating the response for the prior command as the current
+// response.
+// 6. This causes, in particular, GROUP to read the logon string as the response
+// (where sprintf clears everything to 0), and AUTHINFO to think credentials
+// are wrong. The bug's description is then caused by the next read seeing
+// a large number of (not really) new messages.
+// For the purposes of this test, we read enough to see if the group command is
+// being misread or not, as it is complicated enough.
+
+var { MailServices } = ChromeUtils.import(
+ "resource:///modules/MailServices.jsm"
+);
+
+const { PromiseTestUtils } = ChromeUtils.import(
+ "resource://testing-common/mailnews/PromiseTestUtils.jsm"
+);
+
+const { NetworkTestUtils } = ChromeUtils.import(
+ "resource://testing-common/mailnews/NetworkTestUtils.jsm"
+);
+
+var daemon, localserver, server;
+var highWater = 0;
+
+add_setup(async function () {
+ daemon = setupNNTPDaemon();
+ server = makeServer(NNTP_RFC2980_handler, daemon);
+ server.start();
+ localserver = setupLocalServer(server.port);
+
+ // Bug 1050840:
+ // Check if invalid value of the max_cached_connections pref
+ // is properly folded into a sane value.
+ localserver.maximumConnectionsNumber = -5;
+ Assert.equal(localserver.maximumConnectionsNumber, 1);
+
+ localserver.maximumConnectionsNumber = 0;
+ Assert.equal(localserver.maximumConnectionsNumber, 2);
+
+ localserver.maximumConnectionsNumber = 2;
+});
+
+add_task(async function test_newMsgs() {
+ // Start by initializing the folder, and mark some messages as read.
+ let folder = localserver.rootFolder.getChildNamed("test.filter");
+ Assert.equal(folder.getTotalMessages(false), 0);
+ let asyncUrlListener = new PromiseTestUtils.PromiseUrlListener();
+ folder.getNewMessages(null, asyncUrlListener);
+ await asyncUrlListener.promise;
+ // Do another folder to use up both connections
+ localserver.rootFolder
+ .getChildNamed("test.subscribe.simple")
+ .getNewMessages(null, asyncUrlListener);
+ await asyncUrlListener.promise;
+ folder.QueryInterface(Ci.nsIMsgNewsFolder).setReadSetFromStr("1-3");
+ Assert.equal(folder.getTotalMessages(false) - folder.getNumUnread(false), 3);
+ highWater = folder.getTotalMessages(false);
+ Assert.equal(folder.msgDatabase.dBFolderInfo.highWater, highWater);
+});
+
+add_task(async function trigger_bug() {
+ // Kill the connection and start it up again.
+ server.stop();
+ server.start();
+
+ // Get new messages for all folders. Once we've seen one folder, trigger a
+ // load of the folder in question. This second load should, if the bug is
+ // present, be overwritten with one from the load queue that causes the
+ // confusion. It then loads it again, and should (before the patch that fixes
+ // this) read the 200 logon instead of the 211 group.
+ let testFolder = localserver.rootFolder.getChildNamed("test.filter");
+ let asyncUrlListener = new PromiseTestUtils.PromiseUrlListener();
+ let promiseFolderEvent = function (folder, event) {
+ return new Promise((resolve, reject) => {
+ let folderListener = {
+ QueryInterface: ChromeUtils.generateQI(["nsIFolderListener"]),
+ onFolderEvent(aEventFolder, aEvent) {
+ if (
+ aEvent == "FolderLoaded" &&
+ aEventFolder.prettyName == "test.subscribe.simple"
+ ) {
+ aEventFolder.getNewMessages(null, asyncUrlListener);
+ return;
+ }
+
+ if (folder === aEventFolder && event == aEvent) {
+ MailServices.mailSession.RemoveFolderListener(folderListener);
+ resolve();
+ }
+ },
+ };
+ MailServices.mailSession.AddFolderListener(
+ folderListener,
+ Ci.nsIFolderListener.event
+ );
+ });
+ };
+ let folderLoadedPromise = promiseFolderEvent(testFolder, "FolderLoaded");
+
+ localserver.performExpand(null);
+
+ // Wait for test.subscribe.simple to load. That will trigger getNewMessages.
+ await folderLoadedPromise;
+ // Wait for the new messages to be loaded.
+ await asyncUrlListener.promise;
+
+ Assert.equal(testFolder.msgDatabase.dBFolderInfo.highWater, highWater);
+});
+
+add_task(async function cleanUp() {
+ NetworkTestUtils.shutdownServers();
+ localserver.closeCachedConnections();
+});