|
ferencd@0
|
1 //
|
|
ferencd@0
|
2 // VMime library (http://www.vmime.org)
|
|
ferencd@0
|
3 // Copyright (C) 2002-2014 Vincent Richard <vincent@vmime.org>
|
|
ferencd@0
|
4 //
|
|
ferencd@0
|
5 // This program is free software; you can redistribute it and/or
|
|
ferencd@0
|
6 // modify it under the terms of the GNU General Public License as
|
|
ferencd@0
|
7 // published by the Free Software Foundation; either version 3 of
|
|
ferencd@0
|
8 // the License, or (at your option) any later version.
|
|
ferencd@0
|
9 //
|
|
ferencd@0
|
10 // This program is distributed in the hope that it will be useful,
|
|
ferencd@0
|
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
ferencd@0
|
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
ferencd@0
|
13 // General Public License for more details.
|
|
ferencd@0
|
14 //
|
|
ferencd@0
|
15 // You should have received a copy of the GNU General Public License along
|
|
ferencd@0
|
16 // with this program; if not, write to the Free Software Foundation, Inc.,
|
|
ferencd@0
|
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
ferencd@0
|
18 //
|
|
ferencd@0
|
19 // Linking this library statically or dynamically with other modules is making
|
|
ferencd@0
|
20 // a combined work based on this library. Thus, the terms and conditions of
|
|
ferencd@0
|
21 // the GNU General Public License cover the whole combination.
|
|
ferencd@0
|
22 //
|
|
ferencd@0
|
23
|
|
ferencd@0
|
24 #include "tests/testUtils.hpp"
|
|
ferencd@0
|
25
|
|
ferencd@0
|
26 #include "vmime/net/imap/IMAPUtils.hpp"
|
|
ferencd@0
|
27 #include "vmime/net/imap/IMAPParser.hpp"
|
|
ferencd@0
|
28
|
|
ferencd@0
|
29
|
|
ferencd@0
|
30 using namespace vmime::net::imap;
|
|
ferencd@0
|
31
|
|
ferencd@0
|
32
|
|
ferencd@0
|
33
|
|
ferencd@0
|
34 VMIME_TEST_SUITE_BEGIN(IMAPUtilsTest)
|
|
ferencd@0
|
35
|
|
ferencd@0
|
36 VMIME_TEST_LIST_BEGIN
|
|
ferencd@0
|
37 VMIME_TEST(testQuoteString)
|
|
ferencd@0
|
38 VMIME_TEST(testToModifiedUTF7)
|
|
ferencd@0
|
39 VMIME_TEST(testFromModifiedUTF7)
|
|
ferencd@0
|
40 VMIME_TEST(testConvertAddressList)
|
|
ferencd@0
|
41 VMIME_TEST(testMessageFlagList)
|
|
ferencd@0
|
42 VMIME_TEST(testDateTime)
|
|
ferencd@0
|
43 VMIME_TEST(testPathToString)
|
|
ferencd@0
|
44 VMIME_TEST(testStringToPath)
|
|
ferencd@0
|
45 VMIME_TEST(testBuildFetchCommand)
|
|
ferencd@0
|
46 VMIME_TEST_LIST_END
|
|
ferencd@0
|
47
|
|
ferencd@0
|
48
|
|
ferencd@0
|
49 void testQuoteString()
|
|
ferencd@0
|
50 {
|
|
ferencd@0
|
51 VASSERT_EQ("unquoted", "ascii", IMAPUtils::quoteString("ascii"));
|
|
ferencd@0
|
52 VASSERT_EQ("space", "\"ascii with space\"", IMAPUtils::quoteString("ascii with space"));
|
|
ferencd@0
|
53
|
|
ferencd@0
|
54 VASSERT_EQ("special1", "\"(\"", IMAPUtils::quoteString("("));
|
|
ferencd@0
|
55 VASSERT_EQ("special2", "\")\"", IMAPUtils::quoteString(")"));
|
|
ferencd@0
|
56 VASSERT_EQ("special3", "\"{\"", IMAPUtils::quoteString("{"));
|
|
ferencd@0
|
57 VASSERT_EQ("special4", "\" \"", IMAPUtils::quoteString(" "));
|
|
ferencd@0
|
58 VASSERT_EQ("special5", "\"%\"", IMAPUtils::quoteString("%"));
|
|
ferencd@0
|
59 VASSERT_EQ("special6", "\"*\"", IMAPUtils::quoteString("*"));
|
|
ferencd@0
|
60 VASSERT_EQ("special7", "\"\\\"\"", IMAPUtils::quoteString("\""));
|
|
ferencd@0
|
61 VASSERT_EQ("special8", "\"\\\\\"", IMAPUtils::quoteString("\\"));
|
|
ferencd@0
|
62 VASSERT_EQ("special9", "\"\x7f\"", IMAPUtils::quoteString("\x7f"));
|
|
ferencd@0
|
63
|
|
ferencd@0
|
64 }
|
|
ferencd@0
|
65
|
|
ferencd@0
|
66 void testToModifiedUTF7()
|
|
ferencd@0
|
67 {
|
|
ferencd@0
|
68 #define FC(x) vmime::net::folder::path::component(x, vmime::charsets::UTF_8)
|
|
ferencd@0
|
69
|
|
ferencd@0
|
70 // Example strings from RFC-1642 (modified for IMAP UTF-7)
|
|
ferencd@0
|
71 VASSERT_EQ("1", "A&ImIDkQ-.", IMAPUtils::toModifiedUTF7('/', FC("A\xe2\x89\xa2\xce\x91.")));
|
|
ferencd@0
|
72 VASSERT_EQ("2", "Hi Mum &Jjo-!", IMAPUtils::toModifiedUTF7('/', FC("Hi Mum \xe2\x98\xba!")));
|
|
ferencd@0
|
73 VASSERT_EQ("3", "&ZeVnLIqe-", IMAPUtils::toModifiedUTF7('/', FC("\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e")));
|
|
ferencd@0
|
74 VASSERT_EQ("4", "Item 3 is &AKM- 1.", IMAPUtils::toModifiedUTF7('/', FC("Item 3 is \xc2\xa3 1.")));
|
|
ferencd@0
|
75
|
|
ferencd@0
|
76 VASSERT_EQ("escape char", "&-", IMAPUtils::toModifiedUTF7('/', FC("&")));
|
|
ferencd@0
|
77 VASSERT_EQ("ascii", "plain ascii text", IMAPUtils::toModifiedUTF7('/', FC("plain ascii text")));
|
|
ferencd@0
|
78 VASSERT_EQ("special", "!\"#$%*+-;<=>@[]^_`{|}", IMAPUtils::toModifiedUTF7('/', FC("!\"#$%*+-;<=>@[]^_`{|}")));
|
|
ferencd@0
|
79
|
|
ferencd@0
|
80 #undef FC
|
|
ferencd@0
|
81 }
|
|
ferencd@0
|
82
|
|
ferencd@0
|
83 void testFromModifiedUTF7()
|
|
ferencd@0
|
84 {
|
|
ferencd@0
|
85 #define FC(x) vmime::net::folder::path::component(x, vmime::charsets::UTF_8)
|
|
ferencd@0
|
86
|
|
ferencd@0
|
87 // Example strings from RFC-1642 (modified for IMAP UTF-7)
|
|
ferencd@0
|
88 VASSERT_EQ("1", FC("A\xe2\x89\xa2\xce\x91."), IMAPUtils::fromModifiedUTF7("A&ImIDkQ-."));
|
|
ferencd@0
|
89 VASSERT_EQ("2", FC("Hi Mum \xe2\x98\xba!"), IMAPUtils::fromModifiedUTF7("Hi Mum &Jjo-!"));
|
|
ferencd@0
|
90 VASSERT_EQ("3", FC("\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e"), IMAPUtils::fromModifiedUTF7("&ZeVnLIqe-"));
|
|
ferencd@0
|
91 VASSERT_EQ("4", FC("Item 3 is \xc2\xa3 1."), IMAPUtils::fromModifiedUTF7("Item 3 is &AKM- 1."));
|
|
ferencd@0
|
92
|
|
ferencd@0
|
93 VASSERT_EQ("escape char", FC("&"), IMAPUtils::fromModifiedUTF7("&-"));
|
|
ferencd@0
|
94 VASSERT_EQ("ascii", FC("plain ascii text"), IMAPUtils::fromModifiedUTF7("plain ascii text"));
|
|
ferencd@0
|
95 VASSERT_EQ("special", FC("!\"#$%*+;<=>@[]^_`{|}"), IMAPUtils::fromModifiedUTF7("!\"#$%*+-;<=>@[]^_`{|}"));
|
|
ferencd@0
|
96
|
|
ferencd@0
|
97 #undef FC
|
|
ferencd@0
|
98 }
|
|
ferencd@0
|
99
|
|
ferencd@0
|
100 void testConvertAddressList()
|
|
ferencd@0
|
101 {
|
|
ferencd@0
|
102 IMAPParser parser;
|
|
ferencd@0
|
103 IMAPParser::address_list addrList;
|
|
ferencd@0
|
104
|
|
ferencd@0
|
105 vmime::string line("((\"name\" NIL \"mailbox\" \"host\")(\"name2\" NIL \"mailbox2\" \"host2\"))");
|
|
ferencd@0
|
106 vmime::size_t pos = 0;
|
|
ferencd@0
|
107
|
|
ferencd@0
|
108 VASSERT("parse", addrList.parseImpl(parser, line, &pos));
|
|
ferencd@0
|
109
|
|
ferencd@0
|
110 vmime::mailboxList mboxList;
|
|
ferencd@0
|
111 IMAPUtils::convertAddressList(addrList, mboxList);
|
|
ferencd@0
|
112
|
|
ferencd@0
|
113 VASSERT_EQ("mbox-count", 2, mboxList.getMailboxCount());
|
|
ferencd@0
|
114 VASSERT_EQ("mbox-1", "mailbox@host", mboxList.getMailboxAt(0)->getEmail().toString());
|
|
ferencd@0
|
115 VASSERT_EQ("mbox-1", "name", mboxList.getMailboxAt(0)->getName().getWholeBuffer());
|
|
ferencd@0
|
116 VASSERT_EQ("mbox-2", "mailbox2@host2", mboxList.getMailboxAt(1)->getEmail().toString());
|
|
ferencd@0
|
117 VASSERT_EQ("mbox-2", "name2", mboxList.getMailboxAt(1)->getName().getWholeBuffer());
|
|
ferencd@0
|
118 }
|
|
ferencd@0
|
119
|
|
ferencd@0
|
120 void testMessageFlagList()
|
|
ferencd@0
|
121 {
|
|
ferencd@0
|
122 int flags = 0;
|
|
ferencd@0
|
123 std::vector <vmime::string> flagList;
|
|
ferencd@0
|
124
|
|
ferencd@0
|
125 // Test each flag
|
|
ferencd@0
|
126 flags = vmime::net::message::FLAG_REPLIED;
|
|
ferencd@0
|
127 flagList = IMAPUtils::messageFlagList(flags);
|
|
ferencd@0
|
128 VASSERT("replied", std::find(flagList.begin(), flagList.end(), "\\Answered") != flagList.end());
|
|
ferencd@0
|
129
|
|
ferencd@0
|
130 flags = vmime::net::message::FLAG_MARKED;
|
|
ferencd@0
|
131 flagList = IMAPUtils::messageFlagList(flags);
|
|
ferencd@0
|
132 VASSERT("marked", std::find(flagList.begin(), flagList.end(), "\\Flagged") != flagList.end());
|
|
ferencd@0
|
133
|
|
ferencd@0
|
134 flags = vmime::net::message::FLAG_DELETED;
|
|
ferencd@0
|
135 flagList = IMAPUtils::messageFlagList(flags);
|
|
ferencd@0
|
136 VASSERT("deleted", std::find(flagList.begin(), flagList.end(), "\\Deleted") != flagList.end());
|
|
ferencd@0
|
137
|
|
ferencd@0
|
138 flags = vmime::net::message::FLAG_SEEN;
|
|
ferencd@0
|
139 flagList = IMAPUtils::messageFlagList(flags);
|
|
ferencd@0
|
140 VASSERT("seen", std::find(flagList.begin(), flagList.end(), "\\Seen") != flagList.end());
|
|
ferencd@0
|
141
|
|
ferencd@0
|
142 flags = vmime::net::message::FLAG_DRAFT;
|
|
ferencd@0
|
143 flagList = IMAPUtils::messageFlagList(flags);
|
|
ferencd@0
|
144 VASSERT("draft", std::find(flagList.begin(), flagList.end(), "\\Draft") != flagList.end());
|
|
ferencd@0
|
145
|
|
ferencd@0
|
146 // Multiple flags
|
|
ferencd@0
|
147 flags = vmime::net::message::FLAG_REPLIED;
|
|
ferencd@0
|
148 flagList = IMAPUtils::messageFlagList(flags);
|
|
ferencd@0
|
149
|
|
ferencd@0
|
150 VASSERT_EQ("1.size", 1, flagList.size());
|
|
ferencd@0
|
151 VASSERT("1.found", std::find(flagList.begin(), flagList.end(), "\\Answered") != flagList.end());
|
|
ferencd@0
|
152
|
|
ferencd@0
|
153 flags |= vmime::net::message::FLAG_SEEN;
|
|
ferencd@0
|
154 flagList = IMAPUtils::messageFlagList(flags);
|
|
ferencd@0
|
155
|
|
ferencd@0
|
156 VASSERT_EQ("2.size", 2, flagList.size());
|
|
ferencd@0
|
157 VASSERT("2.found1", std::find(flagList.begin(), flagList.end(), "\\Answered") != flagList.end());
|
|
ferencd@0
|
158 VASSERT("2.found2", std::find(flagList.begin(), flagList.end(), "\\Seen") != flagList.end());
|
|
ferencd@0
|
159 }
|
|
ferencd@0
|
160
|
|
ferencd@0
|
161 void testDateTime()
|
|
ferencd@0
|
162 {
|
|
ferencd@0
|
163 vmime::datetime dt(2014, 3, 17, 23, 26, 22, vmime::datetime::GMT2);
|
|
ferencd@0
|
164 VASSERT_EQ("datetime", "\"17-Mar-2014 23:26:22 +0200\"", IMAPUtils::dateTime(dt));
|
|
ferencd@0
|
165 }
|
|
ferencd@0
|
166
|
|
ferencd@0
|
167 void testPathToString()
|
|
ferencd@0
|
168 {
|
|
ferencd@0
|
169 #define FC(x) vmime::net::folder::path::component(x, vmime::charsets::UTF_8)
|
|
ferencd@0
|
170
|
|
ferencd@0
|
171 vmime::net::folder::path path;
|
|
ferencd@0
|
172 path /= FC("Hi Mum \xe2\x98\xba!");
|
|
ferencd@0
|
173 path /= FC("\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e");
|
|
ferencd@0
|
174
|
|
ferencd@0
|
175 VASSERT_EQ("string", "Hi Mum &Jjo-!/&ZeVnLIqe-", IMAPUtils::pathToString('/', path));
|
|
ferencd@0
|
176
|
|
ferencd@0
|
177 #undef FC
|
|
ferencd@0
|
178 }
|
|
ferencd@0
|
179
|
|
ferencd@0
|
180 void testStringToPath()
|
|
ferencd@0
|
181 {
|
|
ferencd@0
|
182 #define FC(x) vmime::net::folder::path::component(x, vmime::charsets::UTF_8)
|
|
ferencd@0
|
183
|
|
ferencd@0
|
184 vmime::net::folder::path path = IMAPUtils::stringToPath('/', "Hi Mum &Jjo-!/&ZeVnLIqe-");
|
|
ferencd@0
|
185
|
|
ferencd@0
|
186 VASSERT_EQ("count", 2, path.getSize());
|
|
ferencd@0
|
187 VASSERT_EQ("component1", FC("Hi Mum \xe2\x98\xba!"), path[0]);
|
|
ferencd@0
|
188 VASSERT_EQ("component2", FC("\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e"), path[1]);
|
|
ferencd@0
|
189
|
|
ferencd@0
|
190 #undef FC
|
|
ferencd@0
|
191 }
|
|
ferencd@0
|
192
|
|
ferencd@0
|
193 void testBuildFetchCommand()
|
|
ferencd@0
|
194 {
|
|
ferencd@0
|
195 vmime::shared_ptr <IMAPConnection> cnt;
|
|
ferencd@0
|
196 vmime::net::messageSet msgs = vmime::net::messageSet::byNumber(42);
|
|
ferencd@0
|
197
|
|
ferencd@0
|
198 // SIZE
|
|
ferencd@0
|
199 {
|
|
ferencd@0
|
200 vmime::net::fetchAttributes attribs = vmime::net::fetchAttributes::SIZE;
|
|
ferencd@0
|
201
|
|
ferencd@0
|
202 vmime::shared_ptr <IMAPCommand> cmd = IMAPUtils::buildFetchCommand(cnt, msgs, attribs);
|
|
ferencd@0
|
203 VASSERT_EQ("size", "FETCH 42 RFC822.SIZE", cmd->getText());
|
|
ferencd@0
|
204 }
|
|
ferencd@0
|
205
|
|
ferencd@0
|
206 // FLAGS
|
|
ferencd@0
|
207 {
|
|
ferencd@0
|
208 vmime::net::fetchAttributes attribs = vmime::net::fetchAttributes::FLAGS;
|
|
ferencd@0
|
209
|
|
ferencd@0
|
210 vmime::shared_ptr <IMAPCommand> cmd = IMAPUtils::buildFetchCommand(cnt, msgs, attribs);
|
|
ferencd@0
|
211 VASSERT_EQ("flags", "FETCH 42 FLAGS", cmd->getText());
|
|
ferencd@0
|
212 }
|
|
ferencd@0
|
213
|
|
ferencd@0
|
214 // STRUCTURE
|
|
ferencd@0
|
215 {
|
|
ferencd@0
|
216 vmime::net::fetchAttributes attribs = vmime::net::fetchAttributes::STRUCTURE;
|
|
ferencd@0
|
217
|
|
ferencd@0
|
218 vmime::shared_ptr <IMAPCommand> cmd = IMAPUtils::buildFetchCommand(cnt, msgs, attribs);
|
|
ferencd@0
|
219 VASSERT_EQ("structure", "FETCH 42 BODYSTRUCTURE", cmd->getText());
|
|
ferencd@0
|
220 }
|
|
ferencd@0
|
221
|
|
ferencd@0
|
222 // UID
|
|
ferencd@0
|
223 {
|
|
ferencd@0
|
224 vmime::net::fetchAttributes attribs = vmime::net::fetchAttributes::UID;
|
|
ferencd@0
|
225
|
|
ferencd@0
|
226 vmime::shared_ptr <IMAPCommand> cmd = IMAPUtils::buildFetchCommand(cnt, msgs, attribs);
|
|
ferencd@0
|
227 VASSERT_EQ("uid", "FETCH 42 UID", cmd->getText());
|
|
ferencd@0
|
228 }
|
|
ferencd@0
|
229
|
|
ferencd@0
|
230 // ENVELOPE
|
|
ferencd@0
|
231 {
|
|
ferencd@0
|
232 vmime::net::fetchAttributes attribs = vmime::net::fetchAttributes::ENVELOPE;
|
|
ferencd@0
|
233
|
|
ferencd@0
|
234 vmime::shared_ptr <IMAPCommand> cmd = IMAPUtils::buildFetchCommand(cnt, msgs, attribs);
|
|
ferencd@0
|
235 VASSERT_EQ("envelope", "FETCH 42 ENVELOPE", cmd->getText());
|
|
ferencd@0
|
236 }
|
|
ferencd@0
|
237
|
|
ferencd@0
|
238 // CONTENT_INFO
|
|
ferencd@0
|
239 {
|
|
ferencd@0
|
240 vmime::net::fetchAttributes attribs = vmime::net::fetchAttributes::CONTENT_INFO;
|
|
ferencd@0
|
241
|
|
ferencd@0
|
242 vmime::shared_ptr <IMAPCommand> cmd = IMAPUtils::buildFetchCommand(cnt, msgs, attribs);
|
|
ferencd@0
|
243 VASSERT_EQ("content", "FETCH 42 BODY[HEADER.FIELDS (CONTENT_TYPE)]", cmd->getText());
|
|
ferencd@0
|
244 }
|
|
ferencd@0
|
245
|
|
ferencd@0
|
246 // IMPORTANCE
|
|
ferencd@0
|
247 {
|
|
ferencd@0
|
248 vmime::net::fetchAttributes attribs = vmime::net::fetchAttributes::IMPORTANCE;
|
|
ferencd@0
|
249
|
|
ferencd@0
|
250 vmime::shared_ptr <IMAPCommand> cmd = IMAPUtils::buildFetchCommand(cnt, msgs, attribs);
|
|
ferencd@0
|
251 VASSERT_EQ("importance", "FETCH 42 BODY[HEADER.FIELDS (IMPORTANCE X-PRIORITY)]", cmd->getText());
|
|
ferencd@0
|
252 }
|
|
ferencd@0
|
253
|
|
ferencd@0
|
254 // Any header attribute + full header should give RFC822.HEADER
|
|
ferencd@0
|
255 {
|
|
ferencd@0
|
256 vmime::net::fetchAttributes attribs;
|
|
ferencd@0
|
257 attribs.add(vmime::net::fetchAttributes::ENVELOPE);
|
|
ferencd@0
|
258 attribs.add(vmime::net::fetchAttributes::FULL_HEADER);
|
|
ferencd@0
|
259
|
|
ferencd@0
|
260 vmime::shared_ptr <IMAPCommand> cmd = IMAPUtils::buildFetchCommand(cnt, msgs, attribs);
|
|
ferencd@0
|
261 VASSERT_EQ("full-header", "FETCH 42 RFC822.HEADER", cmd->getText());
|
|
ferencd@0
|
262 }
|
|
ferencd@0
|
263
|
|
ferencd@0
|
264 // Test custom header
|
|
ferencd@0
|
265 {
|
|
ferencd@0
|
266 vmime::net::fetchAttributes attribs;
|
|
ferencd@0
|
267 attribs.add("X-MyHeader");
|
|
ferencd@0
|
268
|
|
ferencd@0
|
269 vmime::shared_ptr <IMAPCommand> cmd = IMAPUtils::buildFetchCommand(cnt, msgs, attribs);
|
|
ferencd@0
|
270 VASSERT_EQ("custom-header", "FETCH 42 BODY[HEADER.FIELDS (x-myheader)]", cmd->getText());
|
|
ferencd@0
|
271 }
|
|
ferencd@0
|
272
|
|
ferencd@0
|
273 // Test multiple flags
|
|
ferencd@0
|
274 {
|
|
ferencd@0
|
275 vmime::net::fetchAttributes attribs =
|
|
ferencd@0
|
276 vmime::net::fetchAttributes::UID | vmime::net::fetchAttributes::FLAGS;
|
|
ferencd@0
|
277
|
|
ferencd@0
|
278 vmime::shared_ptr <IMAPCommand> cmd = IMAPUtils::buildFetchCommand(cnt, msgs, attribs);
|
|
ferencd@0
|
279 VASSERT_EQ("multiple", "FETCH 42 (FLAGS UID)", cmd->getText());
|
|
ferencd@0
|
280 }
|
|
ferencd@0
|
281 }
|
|
ferencd@0
|
282
|
|
ferencd@0
|
283 VMIME_TEST_SUITE_END
|