diff options
Diffstat (limited to 'comm/mailnews/test/resources/POP3pump.js')
-rw-r--r-- | comm/mailnews/test/resources/POP3pump.js | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/comm/mailnews/test/resources/POP3pump.js b/comm/mailnews/test/resources/POP3pump.js new file mode 100644 index 0000000000..5a083798b1 --- /dev/null +++ b/comm/mailnews/test/resources/POP3pump.js @@ -0,0 +1,269 @@ +/* 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 routine will allow the easy processing of + * messages through the fake POP3 server into the local + * folder. It uses a single global defined as: + * + * gPOP3Pump: the main access to the routine + * gPOP3Pump.run() function to run to load the messages. Returns promise that + * resolves when done. + * gPOP3Pump.files: (in) an array of message files to load + * gPOP3Pump.onDone: function to execute after completion + (optional and deprecated) + * gPOP3Pump.fakeServer: (out) the POP3 incoming server + * gPOP3Pump.resetPluggableStore(): function to change the pluggable store for the + * server to the input parameter's store. + * (in) pluggable store contract ID + * + * adapted from test_pop3GetNewMail.js + * + * Original Author: Kent James <kent@caspia.com> + * + */ + +var { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" +); +var { localAccountUtils } = ChromeUtils.import( + "resource://testing-common/mailnews/LocalAccountUtils.jsm" +); + +// Import the pop3 server scripts +var { nsMailServer } = ChromeUtils.import( + "resource://testing-common/mailnews/Maild.jsm" +); +var { AuthPLAIN, AuthLOGIN, AuthCRAM } = ChromeUtils.import( + "resource://testing-common/mailnews/Auth.jsm" +); +var { + Pop3Daemon, + POP3_RFC1939_handler, + POP3_RFC2449_handler, + POP3_RFC5034_handler, +} = ChromeUtils.import("resource://testing-common/mailnews/Pop3d.jsm"); + +function POP3Pump() { + // public attributes + this.fakeServer = null; + this.onDone = null; + this.files = null; + + // local private variables + + this.kPOP3_PORT = 1024 + 110; + this._server = null; + this._daemon = null; + this._incomingServer = null; + this._firstFile = true; + this._tests = []; + this._finalCleanup = false; + this._expectedResult = Cr.NS_OK; + this._actualResult = Cr.NS_ERROR_UNEXPECTED; + this._mailboxStoreContractID = Services.prefs.getCharPref( + "mail.serverDefaultStoreContractID" + ); +} + +// nsIUrlListener implementation +POP3Pump.prototype.OnStartRunningUrl = function (url) {}; + +POP3Pump.prototype.OnStopRunningUrl = function (aUrl, aResult) { + this._actualResult = aResult; + if (aResult != Cr.NS_OK) { + // If we have an error, clean up nicely. + this._server.stop(); + + var thread = Services.tm.currentThread; + while (thread.hasPendingEvents()) { + thread.processNextEvent(true); + } + } + Assert.equal(aResult, this._expectedResult); + + // Let OnStopRunningUrl return cleanly before doing anything else. + do_timeout(0, _checkPumpBusy); +}; + +// Setup the daemon and server +// If the debugOption is set, then it will be applied to the server. +POP3Pump.prototype._setupServerDaemon = function (aDebugOption) { + this._daemon = new Pop3Daemon(); + function createHandler(d) { + return new POP3_RFC1939_handler(d); + } + this._server = new nsMailServer(createHandler, this._daemon); + if (aDebugOption) { + this._server.setDebugLevel(aDebugOption); + } + return [this._daemon, this._server]; +}; + +POP3Pump.prototype._createPop3ServerAndLocalFolders = function () { + if (typeof localAccountUtils.inboxFolder == "undefined") { + localAccountUtils.loadLocalMailAccount(); + } + + if (!this.fakeServer) { + this.fakeServer = localAccountUtils.create_incoming_server( + "pop3", + this.kPOP3_PORT, + "fred", + "wilma" + ); + } + + return this.fakeServer; +}; + +POP3Pump.prototype.resetPluggableStore = function (aStoreContractID) { + if (aStoreContractID == this._mailboxStoreContractID) { + return; + } + + Services.prefs.setCharPref( + "mail.serverDefaultStoreContractID", + aStoreContractID + ); + + // Cleanup existing files, server and account instances, if any. + if (this._server) { + this._server.stop(); + } + + if (this.fakeServer && this.fakeServer.valid) { + this.fakeServer.closeCachedConnections(); + MailServices.accounts.removeIncomingServer(this.fakeServer, false); + } + + this.fakeServer = null; + localAccountUtils.clearAll(); + + this._incomingServer = this._createPop3ServerAndLocalFolders(); + this._mailboxStoreContractID = aStoreContractID; +}; + +POP3Pump.prototype._checkBusy = function () { + if (this._tests.length == 0 && !this._finalCleanup) { + this._incomingServer.closeCachedConnections(); + + // No more tests, let everything finish + this._server.stop(); + this._finalCleanup = true; + do_timeout(20, _checkPumpBusy); + return; + } + + if (this._finalCleanup) { + if (Services.tm.currentThread.hasPendingEvents()) { + do_timeout(20, _checkPumpBusy); + } else { + // exit this module + do_test_finished(); + if (this.onDone) { + this._promise.then(this.onDone, this.onDone); + } + if (this._actualResult == Cr.NS_OK) { + this._resolve(); + } else { + this._reject(this._actualResult); + } + } + return; + } + + // If the server hasn't quite finished, just delay a little longer. + if (this._incomingServer.serverBusy) { + do_timeout(20, _checkPumpBusy); + return; + } + + this._testNext(); +}; + +POP3Pump.prototype._testNext = function () { + let thisFiles = this._tests.shift(); + if (!thisFiles) { + // Exit. + this._checkBusy(); + } + + // Handle the server in a try/catch/finally loop so that we always will stop + // the server if something fails. + try { + if (this._firstFile) { + this._firstFile = false; + + // Start the fake POP3 server + this._server.start(); + this.kPOP3_PORT = this._server.port; + if (this.fakeServer) { + this.fakeServer.port = this.kPOP3_PORT; + } + } else { + this._server.resetTest(); + } + + // Set up the test + this._daemon.setMessages(thisFiles); + + // Now get the mail, get inbox in case it got un-deferred. + let inbox = this._incomingServer.rootMsgFolder.getFolderWithFlags( + Ci.nsMsgFolderFlags.Inbox + ); + MailServices.pop3.GetNewMail(null, this, inbox, this._incomingServer); + + this._server.performTest(); + } catch (e) { + this._server.stop(); + + do_throw(e); + } +}; + +POP3Pump.prototype.run = function (aExpectedResult) { + do_test_pending(); + // Disable new mail 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); + + this._server = this._setupServerDaemon(); + this._daemon = this._server[0]; + this._server = this._server[1]; + + this._firstFile = true; + this._finalCleanup = false; + + if (aExpectedResult) { + this._expectedResult = aExpectedResult; + } + + // In the default configuration, only a single test is accepted + // by this routine. But the infrastructure exists to support + // multiple tests, as this was in the original files. We leave that + // infrastructure in place, so that if desired this routine could + // be easily copied and modified to make multiple passes through + // a POP3 server. + + this._tests[0] = this.files; + + this._testNext(); + + // This probably does not work with multiple tests, but nobody is using that. + this._promise = new Promise((resolve, reject) => { + this._resolve = resolve; + this._reject = reject; + }); + return this._promise; +}; + +var gPOP3Pump = new POP3Pump(); +gPOP3Pump._incomingServer = gPOP3Pump._createPop3ServerAndLocalFolders(); + +function _checkPumpBusy() { + gPOP3Pump._checkBusy(); +} |