annotate 3rdparty/vmime/tests/net/imap/IMAPUtilsTest.cpp @ 0:a4671277546c tip

created the repository for the thymian project
author ferencd
date Tue, 17 Aug 2021 11:19:54 +0200
parents
children
rev   line source
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