summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/local/test/unit/test_over2GBMailboxes.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/local/test/unit/test_over2GBMailboxes.js')
-rw-r--r--comm/mailnews/local/test/unit/test_over2GBMailboxes.js129
1 files changed, 129 insertions, 0 deletions
diff --git a/comm/mailnews/local/test/unit/test_over2GBMailboxes.js b/comm/mailnews/local/test/unit/test_over2GBMailboxes.js
new file mode 100644
index 0000000000..fe7976b0fe
--- /dev/null
+++ b/comm/mailnews/local/test/unit/test_over2GBMailboxes.js
@@ -0,0 +1,129 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+
+/* Test of accessing over 2 GiB local folder. */
+
+const { PromiseTestUtils } = ChromeUtils.import(
+ "resource://testing-common/mailnews/PromiseTestUtils.jsm"
+);
+
+// Find hdr for message whose offset is over 2 GiB.
+function findHugeMessageHdr(folder) {
+ //getMessageHdr() {
+ for (let header of folder.msgDatabase.enumerateMessages()) {
+ if (header.messageOffset >= 0x80000000) {
+ return header;
+ }
+ }
+
+ do_throw("Over 2 GiB msgkey was not found!");
+ return null; // This won't ever happen, but we're keeping the linter happy.
+}
+
+let gInboxFile;
+let gInbox;
+let gSmallMsgFile = do_get_file("../../../data/bugmail10");
+
+add_setup(async function () {
+ // Make sure we're using mbox.
+ Services.prefs.setCharPref(
+ "mail.serverDefaultStoreContractID",
+ "@mozilla.org/msgstore/berkeleystore;1"
+ );
+
+ localAccountUtils.loadLocalMailAccount();
+
+ gInbox = localAccountUtils.inboxFolder;
+ gInboxFile = gInbox.filePath;
+
+ let neededFreeSpace = 0x100000000;
+ let freeDiskSpace = gInboxFile.diskSpaceAvailable;
+ info("Free disk space = " + mailTestUtils.toMiBString(freeDiskSpace));
+ if (freeDiskSpace < neededFreeSpace) {
+ throw new Error(
+ "This test needs " +
+ mailTestUtils.toMiBString(neededFreeSpace) +
+ " free space to run. Aborting."
+ );
+ }
+});
+
+// Extend mbox file to over 2 GiB.
+add_task(async function extendPast2GiB() {
+ let outputStream = Cc["@mozilla.org/network/file-output-stream;1"]
+ .createInstance(Ci.nsIFileOutputStream)
+ .QueryInterface(Ci.nsISeekableStream);
+ // Open in write-only mode, no truncate.
+ outputStream.init(gInboxFile, 0x02, -1, 0);
+ // seek past 2GB.
+ outputStream.seek(0, 0x80000010);
+ // Write a "space" character.
+ outputStream.write(" ", 1);
+ outputStream.close();
+});
+
+// Copy another (normal sized) message into the local folder.
+// This message should be past the 2GiB position.
+add_task(async function appendSmallMessage() {
+ // Remember initial mbox file size.
+ let initialInboxSize = gInbox.filePath.fileSize;
+ info(`Local inbox size (before copyFileMessage()) = ${initialInboxSize}`);
+
+ let copyListener = new PromiseTestUtils.PromiseCopyListener();
+ MailServices.copy.copyFileMessage(
+ gSmallMsgFile,
+ gInbox,
+ null /* msgToReplace*/,
+ false /* isDraftOrTemplate */,
+ 0 /* message flags */,
+ "" /* keywords */,
+ copyListener,
+ null /* window */
+ );
+ await copyListener.promise;
+
+ // Make sure inbox file grew (i.e., we were not writing over data).
+ let localInboxSize = gInbox.filePath.fileSize;
+ info(
+ "Local inbox size (after copyFileMessageInLocalFolder()) = " +
+ localInboxSize
+ );
+ Assert.greater(localInboxSize, initialInboxSize);
+});
+
+// Copy the huge message into a subfolder.
+add_task(async function copyHugeMessage() {
+ let trash =
+ localAccountUtils.incomingServer.rootMsgFolder.getChildNamed("Trash");
+ let copyListener = new PromiseTestUtils.PromiseCopyListener();
+ MailServices.copy.copyMessages(
+ gInbox,
+ [findHugeMessageHdr(gInbox)],
+ trash /* destFolder */,
+ false,
+ copyListener,
+ null,
+ false
+ );
+ await copyListener.promise;
+});
+
+// Read out the smaller message beyond the 2 GiB offset and make sure
+// it matches what we expect.
+add_task(async function verifySmallMessage() {
+ let msghdr = findHugeMessageHdr(gInbox);
+ let msgURI = msghdr.folder.getUriForMsg(msghdr);
+ let msgServ = MailServices.messageServiceFromURI(msgURI);
+
+ let streamListener = new PromiseTestUtils.PromiseStreamListener();
+ msgServ.streamMessage(msgURI, streamListener, null, null, false, "", true);
+ let got = await streamListener.promise;
+
+ let expected = await IOUtils.readUTF8(gSmallMsgFile.path);
+ Assert.equal(got, expected);
+});
+
+add_task(async function cleanup() {
+ // Free up disk space - if you want to look at the file after running
+ // this test, comment out this line.
+ gInbox.filePath.remove(false);
+});