summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/compose/test/unit/test_sendBackground.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/compose/test/unit/test_sendBackground.js')
-rw-r--r--comm/mailnews/compose/test/unit/test_sendBackground.js223
1 files changed, 223 insertions, 0 deletions
diff --git a/comm/mailnews/compose/test/unit/test_sendBackground.js b/comm/mailnews/compose/test/unit/test_sendBackground.js
new file mode 100644
index 0000000000..6d0a59f4f9
--- /dev/null
+++ b/comm/mailnews/compose/test/unit/test_sendBackground.js
@@ -0,0 +1,223 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/**
+ * Tests sending a message in the background (checks auto-send works).
+ */
+
+var { MailServices } = ChromeUtils.import(
+ "resource:///modules/MailServices.jsm"
+);
+
+var server;
+var originalData;
+var finished = false;
+var identity = null;
+var testFile1 = do_get_file("data/429891_testcase.eml");
+var testFile2 = do_get_file("data/message1.eml");
+
+var kTestFile1Sender = "from_A@foo.invalid";
+var kTestFile1Recipient = "to_A@foo.invalid";
+
+var kIdentityMail = "identity@foo.invalid";
+
+var gMsgSendLater;
+
+// This listener handles the post-sending of the actual message and checks the
+// sequence and ensures the data is correct.
+function msll() {}
+
+msll.prototype = {
+ _initialTotal: 0,
+
+ // nsIMsgSendLaterListener
+ onStartSending(aTotal) {
+ this._initialTotal = 1;
+ Assert.equal(gMsgSendLater.sendingMessages, true);
+ Assert.equal(aTotal, 1);
+ },
+ onMessageStartSending(
+ aCurrentMessage,
+ aTotalMessageCount,
+ aMessageHeader,
+ aIdentity
+ ) {},
+ onMessageSendProgress(
+ aCurrentMessage,
+ aTotalMessageCount,
+ aMessageSendPercent,
+ aMessageCopyPercent
+ ) {},
+ onMessageSendError(aCurrentMessage, aMessageHeader, aStatus, aMsg) {
+ do_throw(
+ "onMessageSendError should not have been called, status: " + aStatus
+ );
+ },
+ onStopSending(aStatus, aMsg, aTotalTried, aSuccessful) {
+ do_test_finished();
+ print("msll onStopSending\n");
+ try {
+ Assert.equal(aStatus, 0);
+ Assert.equal(aTotalTried, 1);
+ Assert.equal(aSuccessful, 1);
+ Assert.equal(this._initialTotal, 1);
+ Assert.equal(gMsgSendLater.sendingMessages, false);
+
+ do_check_transaction(server.playTransaction(), [
+ "EHLO test",
+ "MAIL FROM:<" +
+ kTestFile1Sender +
+ "> BODY=8BITMIME SIZE=" +
+ originalData.length,
+ "RCPT TO:<" + kTestFile1Recipient + ">",
+ "DATA",
+ ]);
+
+ // Compare data file to what the server received
+ Assert.equal(originalData, server._daemon.post);
+
+ // check there's still one message left in the folder
+ Assert.equal(
+ gMsgSendLater.getUnsentMessagesFolder(null).getTotalMessages(false),
+ 1
+ );
+
+ finished = true;
+ } catch (e) {
+ do_throw(e);
+ } finally {
+ server.stop();
+
+ var thread = gThreadManager.currentThread;
+ while (thread.hasPendingEvents()) {
+ thread.processNextEvent(true);
+ }
+ }
+ },
+};
+
+add_task(async function run_the_test() {
+ // The point of this test - send in background.
+ Services.prefs.setBoolPref("mailnews.sendInBackground", true);
+
+ // Ensure we have a local mail account, an normal account and appropriate
+ // servers and identities.
+ localAccountUtils.loadLocalMailAccount();
+
+ // Now load (and internally initialize) the send later service
+ gMsgSendLater = Cc["@mozilla.org/messengercompose/sendlater;1"].getService(
+ Ci.nsIMsgSendLater
+ );
+
+ // Test file - for bug 429891
+ originalData = await IOUtils.readUTF8(testFile1.path);
+
+ // Check that the send later service thinks we don't have messages to send
+ Assert.equal(gMsgSendLater.hasUnsentMessages(identity), false);
+
+ MailServices.accounts.setSpecialFolders();
+
+ let account = MailServices.accounts.createAccount();
+ let incomingServer = MailServices.accounts.createIncomingServer(
+ "test",
+ "localhost",
+ "pop3"
+ );
+
+ // Start the fake SMTP server
+ server = setupServerDaemon();
+ server.start();
+ var smtpServer = getBasicSmtpServer(server.port);
+ identity = getSmtpIdentity(kIdentityMail, smtpServer);
+
+ account.addIdentity(identity);
+ account.defaultIdentity = identity;
+ account.incomingServer = incomingServer;
+ MailServices.accounts.defaultAccount = account;
+
+ localAccountUtils.rootFolder.createLocalSubfolder("Sent");
+
+ Assert.equal(identity.doFcc, true);
+
+ // Now prepare to actually "send" the message later, i.e. dump it in the
+ // unsent messages folder.
+
+ var compFields = Cc[
+ "@mozilla.org/messengercompose/composefields;1"
+ ].createInstance(Ci.nsIMsgCompFields);
+
+ // Setting the compFields sender and recipient to any value is required to
+ // survive mime_sanity_check_fields in nsMsgCompUtils.cpp.
+ // Sender and recipient are required for sendMessageFile but SMTP
+ // transaction values will be used directly from mail body.
+ compFields.from = "irrelevant@foo.invalid";
+ compFields.to = "irrelevant@foo.invalid";
+
+ var msgSend = Cc["@mozilla.org/messengercompose/send;1"].createInstance(
+ Ci.nsIMsgSend
+ );
+ var msgSend2 = Cc["@mozilla.org/messengercompose/send;1"].createInstance(
+ Ci.nsIMsgSend
+ );
+
+ // Handle the server in a try/catch/finally loop so that we always will stop
+ // the server if something fails.
+ try {
+ // A test to check that we are sending files correctly, including checking
+ // what the server receives and what we output.
+ test = "sendMessageLater";
+
+ var messageListener = new msll();
+
+ gMsgSendLater.addListener(messageListener);
+
+ // Send this message later - it shouldn't get sent
+ msgSend.sendMessageFile(
+ identity,
+ "",
+ compFields,
+ testFile2,
+ false,
+ false,
+ Ci.nsIMsgSend.nsMsgQueueForLater,
+ null,
+ null,
+ null,
+ null
+ );
+
+ // Send the unsent message in the background, because we have
+ // mailnews.sendInBackground set, nsMsgSendLater should just send it for
+ // us.
+ msgSend2.sendMessageFile(
+ identity,
+ "",
+ compFields,
+ testFile1,
+ false,
+ false,
+ Ci.nsIMsgSend.nsMsgDeliverBackground,
+ null,
+ null,
+ null,
+ null
+ );
+
+ server.performTest();
+
+ do_timeout(10000, function () {
+ if (!finished) {
+ do_throw("Notifications of message send/copy not received");
+ }
+ });
+
+ do_test_pending();
+ } catch (e) {
+ do_throw(e);
+ } finally {
+ server.stop();
+
+ var thread = gThreadManager.currentThread;
+ while (thread.hasPendingEvents()) {
+ thread.processNextEvent(true);
+ }
+ }
+});