From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- comm/mailnews/imap/test/unit/test_imapChunks.js | 114 ++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 comm/mailnews/imap/test/unit/test_imapChunks.js (limited to 'comm/mailnews/imap/test/unit/test_imapChunks.js') diff --git a/comm/mailnews/imap/test/unit/test_imapChunks.js b/comm/mailnews/imap/test/unit/test_imapChunks.js new file mode 100644 index 0000000000..4de0d6c2b3 --- /dev/null +++ b/comm/mailnews/imap/test/unit/test_imapChunks.js @@ -0,0 +1,114 @@ +/** + * Test bug 92111 - imap download-by-chunks doesn't download complete file if the + * server lies about rfc822.size (known to happen for Exchange and gmail) + */ + +var gIMAPDaemon, gServer, gIMAPIncomingServer, gSavedMsgFile; + +var gIMAPService = Cc[ + "@mozilla.org/messenger/messageservice;1?type=imap" +].getService(Ci.nsIMsgMessageService); + +var gFileName = "bug92111"; +var gMsgFile = do_get_file("../../../data/" + gFileName); + +add_task(async function run_the_test() { + /* + * Set up an IMAP server. The bug is only triggered when nsMsgSaveAsListener + * is used (i.e., for IMAP and NNTP). + */ + gIMAPDaemon = new ImapDaemon(); + gServer = makeServer(gIMAPDaemon, ""); + gIMAPIncomingServer = createLocalIMAPServer(gServer.port); + + // pref tuning: one connection only, turn off notifications + Services.prefs.setBoolPref( + "mail.server.server1.autosync_offline_stores", + false + ); + Services.prefs.setIntPref("mail.server.server1.max_cached_connections", 1); + 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); + + // Crank down the message chunk size to make test cases easier + Services.prefs.setBoolPref("mail.server.default.fetch_by_chunks", true); + Services.prefs.setIntPref("mail.imap.chunk_size", 1000); + Services.prefs.setIntPref("mail.imap.min_chunk_size_threshold", 1500); + Services.prefs.setIntPref("mail.imap.chunk_add", 0); + + var inbox = gIMAPDaemon.getMailbox("INBOX"); + + /* + * Ok, prelude done. Read the original message from disk + * (through a file URI), and add it to the Inbox. + */ + var msgfileuri = Services.io + .newFileURI(gMsgFile) + .QueryInterface(Ci.nsIFileURL); + + let message = new ImapMessage(msgfileuri.spec, inbox.uidnext++, []); + // report an artificially low size, like gmail and Exchange do + message.setSize(gMsgFile.fileSize - 100); + inbox.addMessage(message); + + // Save the message to a local file. IMapMD corresponds to + // /mailtest/ImapMail (where fakeserver puts the IMAP mailbox + // files). If we pass the test, we'll remove the file afterwards + // (cf. UrlListener), otherwise it's kept in IMapMD. + gSavedMsgFile = Services.dirsvc.get("IMapMD", Ci.nsIFile); + gSavedMsgFile.append(gFileName + ".eml"); + + do_test_pending(); + do_timeout(10000, function () { + do_throw( + "SaveMessageToDisk did not complete within 10 seconds" + + "(incorrect messageURI?). ABORTING." + ); + }); + + // Enforcing canonicalLineEnding (i.e., CRLF) makes sure that the + // test also runs successfully on platforms not using CRLF by default. + let promiseUrlListener = new PromiseTestUtils.PromiseUrlListener(); + gIMAPService.SaveMessageToDisk( + "imap-message://user@localhost/INBOX#" + (inbox.uidnext - 1), + gSavedMsgFile, + false, + promiseUrlListener, + {}, + true, + null + ); + await promiseUrlListener.promise; + + let msgFileContent = await IOUtils.readUTF8(gMsgFile.path); + let savedMsgFileContent = await IOUtils.readUTF8(gSavedMsgFile.path); + // File contents should not have been modified. + Assert.equal(msgFileContent, savedMsgFileContent); + + // The file doesn't get closed straight away, but does after a little bit. + // So wait, and then remove it. We need to test this to ensure we don't + // indefinitely lock the file. + do_timeout(1000, endTest); +}); + +function endTest() { + gIMAPIncomingServer.closeCachedConnections(); + gServer.stop(); + var thread = gThreadManager.currentThread; + while (thread.hasPendingEvents()) { + thread.processNextEvent(true); + } + + try { + gSavedMsgFile.remove(false); + } catch (ex) { + dump(ex); + do_throw(ex); + } + do_test_finished(); +} + +// XXX IRVING we need a separate check somehow to make sure we store the correct +// content size for chunked messages where the server lied -- cgit v1.2.3