1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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
// <profile_dir>/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
|