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
|
/* -*- Mode: JavaScript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
*
* ***** END LICENSE BLOCK ***** */
/*
* Test content length for the IMAP protocol. This focuses on necko URLs
* that are run externally.
*/
var { PromiseTestUtils } = ChromeUtils.import(
"resource://testing-common/mailnews/PromiseTestUtils.jsm"
);
var gFile = do_get_file("../../../data/bug92111b");
var gIMAPDaemon, gIMAPServer, gIMAPIncomingServer;
// Adds some messages directly to a mailbox (eg new mail)
function addMessageToServer(file, mailbox) {
let URI = Services.io.newFileURI(file).QueryInterface(Ci.nsIFileURL);
let msg = new ImapMessage(URI.spec, mailbox.uidnext++, []);
// underestimate the actual file size, like some IMAP servers do
msg.setSize(file.fileSize - 55);
mailbox.addMessage(msg);
}
add_task(async function verifyContentLength() {
// 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);
Services.prefs.setBoolPref(
"mail.server.server1.autosync_offline_stores",
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);
// set up IMAP fakeserver and incoming server
gIMAPDaemon = new ImapDaemon();
gIMAPServer = makeServer(gIMAPDaemon, "");
gIMAPIncomingServer = createLocalIMAPServer(gIMAPServer.port);
// The server doesn't support more than one connection
Services.prefs.setIntPref("mail.server.server1.max_cached_connections", 1);
// We aren't interested in downloading messages automatically
Services.prefs.setBoolPref("mail.server.server1.download_on_biff", false);
dump("adding message to server\n");
// Add a message to the IMAP server
addMessageToServer(gFile, gIMAPDaemon.getMailbox("INBOX"));
let imapS = Cc[
"@mozilla.org/messenger/messageservice;1?type=imap"
].getService(Ci.nsIMsgMessageService);
let uri = imapS.getUrlForUri("imap-message://user@localhost/INBOX#1");
// Get a channel from this URI, and check its content length
let channel = Services.io.newChannelFromURI(
uri,
null,
Services.scriptSecurityManager.getSystemPrincipal(),
null,
Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL,
Ci.nsIContentPolicy.TYPE_OTHER
);
let promiseStreamListener = new PromiseTestUtils.PromiseStreamListener();
// Read all the contents
channel.asyncOpen(promiseStreamListener, null);
let streamData = (await promiseStreamListener.promise).replace(/\r\n/g, "\n");
// Now check whether our stream listener got the right bytes
// First, clean up line endings to avoid CRLF vs. LF differences
let origData = (await IOUtils.readUTF8(gFile.path)).replace(/\r\n/g, "\n");
Assert.equal(origData.length, streamData.length);
Assert.equal(origData, streamData);
// Now try an attachment. &part=1.2
// let attachmentURL = Services.io.newURI(neckoURL.value.spec + "&part=1.2",
// null, null);
// let attachmentChannel = Services.io.newChannelFromURI(attachmentURL,
// null,
// Services.scriptSecurityManager.getSystemPrincipal(),
// null,
// Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL,
// Ci.nsIContentPolicy.TYPE_OTHER);
// Currently attachments have their content length set to the length of the
// entire message
// do_check_eq(attachmentChannel.contentLength, gFile.fileSize);
gIMAPIncomingServer.closeCachedConnections();
gIMAPServer.stop();
let thread = gThreadManager.currentThread;
while (thread.hasPendingEvents()) {
thread.processNextEvent(true);
}
});
|