annotate 3rdparty/vmime/tests/utility/urlTest.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-2013 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/utility/url.hpp"
ferencd@0 27 #include "vmime/utility/urlUtils.hpp"
ferencd@0 28
ferencd@0 29
ferencd@0 30 VMIME_TEST_SUITE_BEGIN(urlTest)
ferencd@0 31
ferencd@0 32 VMIME_TEST_LIST_BEGIN
ferencd@0 33 VMIME_TEST(testParse1)
ferencd@0 34 VMIME_TEST(testParse2)
ferencd@0 35 VMIME_TEST(testParse3)
ferencd@0 36 VMIME_TEST(testParse4)
ferencd@0 37 VMIME_TEST(testParse5)
ferencd@0 38 VMIME_TEST(testGenerate)
ferencd@0 39 VMIME_TEST(testUtilsEncode)
ferencd@0 40 VMIME_TEST(testUtilsDecode)
ferencd@0 41 VMIME_TEST(testUtilsDecodeSpecialCases)
ferencd@0 42 VMIME_TEST(testUtilsEncodeReservedChars)
ferencd@0 43 VMIME_TEST(testUtilsEncodeUnsafeChars)
ferencd@0 44 VMIME_TEST_LIST_END
ferencd@0 45
ferencd@0 46
ferencd@0 47 static bool parseHelper(vmime::utility::url& u, const vmime::string& str)
ferencd@0 48 {
ferencd@0 49 try
ferencd@0 50 {
ferencd@0 51 u = vmime::utility::url(str);
ferencd@0 52 }
ferencd@0 53 catch (vmime::exceptions::malformed_url)
ferencd@0 54 {
ferencd@0 55 return false;
ferencd@0 56 }
ferencd@0 57
ferencd@0 58 return true;
ferencd@0 59 }
ferencd@0 60
ferencd@0 61
ferencd@0 62 void testParse1()
ferencd@0 63 {
ferencd@0 64 // Test some valid constructions
ferencd@0 65 vmime::utility::url u1("", "");
ferencd@0 66
ferencd@0 67 VASSERT_EQ("1.1", true, parseHelper(u1, "protocol://user:password@host:12345/path/"));
ferencd@0 68 VASSERT_EQ("1.2", "protocol", u1.getProtocol());
ferencd@0 69 VASSERT_EQ("1.3", "user", u1.getUsername());
ferencd@0 70 VASSERT_EQ("1.4", "password", u1.getPassword());
ferencd@0 71 VASSERT_EQ("1.5", "host", u1.getHost());
ferencd@0 72 VASSERT_EQ("1.6", 12345, u1.getPort());
ferencd@0 73 VASSERT_EQ("1.7", "/path/", u1.getPath());
ferencd@0 74
ferencd@0 75 vmime::utility::url u2("", "");
ferencd@0 76
ferencd@0 77 VASSERT_EQ("2.1", true, parseHelper(u2, "protocol://user@host:12345/path/"));
ferencd@0 78 VASSERT_EQ("2.2", "protocol", u2.getProtocol());
ferencd@0 79 VASSERT_EQ("2.3", "user", u2.getUsername());
ferencd@0 80 VASSERT_EQ("2.4", "", u2.getPassword());
ferencd@0 81 VASSERT_EQ("2.5", "host", u2.getHost());
ferencd@0 82 VASSERT_EQ("2.6", 12345, u2.getPort());
ferencd@0 83 VASSERT_EQ("2.7", "/path/", u2.getPath());
ferencd@0 84
ferencd@0 85 vmime::utility::url u3("", "");
ferencd@0 86
ferencd@0 87 VASSERT_EQ("3.1", true, parseHelper(u3, "protocol://host:12345/path/"));
ferencd@0 88 VASSERT_EQ("3.2", "protocol", u3.getProtocol());
ferencd@0 89 VASSERT_EQ("3.3", "", u3.getUsername());
ferencd@0 90 VASSERT_EQ("3.4", "", u3.getPassword());
ferencd@0 91 VASSERT_EQ("3.5", "host", u3.getHost());
ferencd@0 92 VASSERT_EQ("3.6", 12345, u3.getPort());
ferencd@0 93 VASSERT_EQ("3.7", "/path/", u3.getPath());
ferencd@0 94
ferencd@0 95 vmime::utility::url u4("", "");
ferencd@0 96
ferencd@0 97 VASSERT_EQ("4.1", true, parseHelper(u4, "protocol://host/path/"));
ferencd@0 98 VASSERT_EQ("4.2", "protocol", u4.getProtocol());
ferencd@0 99 VASSERT_EQ("4.3", "", u4.getUsername());
ferencd@0 100 VASSERT_EQ("4.4", "", u4.getPassword());
ferencd@0 101 VASSERT_EQ("4.5", "host", u4.getHost());
ferencd@0 102 VASSERT_EQ("4.6", vmime::utility::url::UNSPECIFIED_PORT, u4.getPort());
ferencd@0 103 VASSERT_EQ("4.7", "/path/", u4.getPath());
ferencd@0 104
ferencd@0 105 vmime::utility::url u5("", "");
ferencd@0 106
ferencd@0 107 VASSERT_EQ("5.1", true, parseHelper(u5, "protocol://host/"));
ferencd@0 108 VASSERT_EQ("5.2", "protocol", u5.getProtocol());
ferencd@0 109 VASSERT_EQ("5.3", "", u5.getUsername());
ferencd@0 110 VASSERT_EQ("5.4", "", u5.getPassword());
ferencd@0 111 VASSERT_EQ("5.5", "host", u5.getHost());
ferencd@0 112 VASSERT_EQ("5.6", vmime::utility::url::UNSPECIFIED_PORT, u4.getPort());
ferencd@0 113 VASSERT_EQ("5.7", "", u5.getPath());
ferencd@0 114
ferencd@0 115 vmime::utility::url u6("", "");
ferencd@0 116
ferencd@0 117 VASSERT_EQ("6.1", true, parseHelper(u4, "protocol://host/path/file"));
ferencd@0 118 VASSERT_EQ("6.2", "protocol", u4.getProtocol());
ferencd@0 119 VASSERT_EQ("6.3", "", u4.getUsername());
ferencd@0 120 VASSERT_EQ("6.4", "", u4.getPassword());
ferencd@0 121 VASSERT_EQ("6.5", "host", u4.getHost());
ferencd@0 122 VASSERT_EQ("6.6", vmime::utility::url::UNSPECIFIED_PORT, u4.getPort());
ferencd@0 123 VASSERT_EQ("6.7", "/path/file", u4.getPath());
ferencd@0 124 }
ferencd@0 125
ferencd@0 126 void testParse2()
ferencd@0 127 {
ferencd@0 128 // Now, test some ill-formed URLs
ferencd@0 129
ferencd@0 130 // -- missing protocol
ferencd@0 131 vmime::utility::url u1("", "");
ferencd@0 132 VASSERT_EQ("1", false, parseHelper(u1, "://host"));
ferencd@0 133
ferencd@0 134 // -- port can contain only digits
ferencd@0 135 vmime::utility::url u2("", "");
ferencd@0 136 VASSERT_EQ("2", false, parseHelper(u2, "proto://host:abc123"));
ferencd@0 137
ferencd@0 138 // -- no host specified
ferencd@0 139 vmime::utility::url u3("", "");
ferencd@0 140 VASSERT_EQ("3", false, parseHelper(u3, "proto:///path"));
ferencd@0 141
ferencd@0 142 // -- no protocol separator (://)
ferencd@0 143 vmime::utility::url u4("", "");
ferencd@0 144 VASSERT_EQ("4", false, parseHelper(u4, "protohost/path"));
ferencd@0 145 }
ferencd@0 146
ferencd@0 147 void testParse3()
ferencd@0 148 {
ferencd@0 149 // Test decoding
ferencd@0 150 vmime::utility::url u1("", "");
ferencd@0 151
ferencd@0 152 VASSERT_EQ("1.1", true, parseHelper(u1, "pro%12to://user%34:pass%56word@ho%78st:12345/pa%abth/"));
ferencd@0 153 VASSERT_EQ("1.2", "pro%12to", u1.getProtocol()); // protocol should not be decoded
ferencd@0 154 VASSERT_EQ("1.3", "user\x34", u1.getUsername());
ferencd@0 155 VASSERT_EQ("1.4", "pass\x56word", u1.getPassword());
ferencd@0 156 VASSERT_EQ("1.5", "ho\x78st", u1.getHost());
ferencd@0 157 VASSERT_EQ("1.6", 12345, u1.getPort());
ferencd@0 158 VASSERT_EQ("1.7", "/pa\xabth/", u1.getPath());
ferencd@0 159 }
ferencd@0 160
ferencd@0 161 void testParse4()
ferencd@0 162 {
ferencd@0 163 // Test parameters
ferencd@0 164 vmime::utility::url u1("", "");
ferencd@0 165
ferencd@0 166 VASSERT_EQ("1.1", true, parseHelper(u1, "proto://host/path?p1=v1&p2=v2"));
ferencd@0 167 VASSERT_EQ("1.2", "v1", u1.getParams()["p1"]);
ferencd@0 168 VASSERT_EQ("1.3", "v2", u1.getParams()["p2"]);
ferencd@0 169 VASSERT_EQ("1.4", "/path", u1.getPath());
ferencd@0 170
ferencd@0 171 vmime::utility::url u2("", "");
ferencd@0 172
ferencd@0 173 VASSERT_EQ("2.1", true, parseHelper(u2, "proto://host/path?p1=v1&p2"));
ferencd@0 174 VASSERT_EQ("2.2", "v1", u2.getParams()["p1"]);
ferencd@0 175 VASSERT_EQ("2.3", "p2", u2.getParams()["p2"]);
ferencd@0 176 VASSERT_EQ("2.4", "/path", u2.getPath());
ferencd@0 177
ferencd@0 178 vmime::utility::url u3("", "");
ferencd@0 179
ferencd@0 180 VASSERT_EQ("3.1", true, parseHelper(u3, "proto://host/?p1=v1&p2=v2"));
ferencd@0 181 VASSERT_EQ("3.2", "v1", u3.getParams()["p1"]);
ferencd@0 182 VASSERT_EQ("3.3", "v2", u3.getParams()["p2"]);
ferencd@0 183 VASSERT_EQ("3.4", "", u3.getPath());
ferencd@0 184
ferencd@0 185 vmime::utility::url u4("", "");
ferencd@0 186
ferencd@0 187 VASSERT_EQ("4.1", true, parseHelper(u4, "proto://host/path?p1=%3D&%3D=v2"));
ferencd@0 188 VASSERT_EQ("4.2", "=", u4.getParams()["p1"]);
ferencd@0 189 VASSERT_EQ("4.3", "v2", u4.getParams()["="]);
ferencd@0 190 VASSERT_EQ("4.4", "/path", u4.getPath());
ferencd@0 191 }
ferencd@0 192
ferencd@0 193 // '@' symbol in the username part
ferencd@0 194 void testParse5()
ferencd@0 195 {
ferencd@0 196 vmime::utility::url u1("", "");
ferencd@0 197
ferencd@0 198 VASSERT_EQ("1", true, parseHelper(u1, "imap://account@myserver.com:password@myserver.com"));
ferencd@0 199 VASSERT_EQ("2", "account@myserver.com", u1.getUsername());
ferencd@0 200 VASSERT_EQ("3", "password", u1.getPassword());
ferencd@0 201 VASSERT_EQ("4", "myserver.com", u1.getHost());
ferencd@0 202 }
ferencd@0 203
ferencd@0 204 void testGenerate()
ferencd@0 205 {
ferencd@0 206 vmime::utility::url u1("proto", "host", 12345, "path", "user", "password");
ferencd@0 207 VASSERT_EQ("1", "proto://user:password@host:12345/path",
ferencd@0 208 static_cast <vmime::string>(u1));
ferencd@0 209
ferencd@0 210 vmime::utility::url u2("proto", "host");
ferencd@0 211 VASSERT_EQ("2", "proto://host", static_cast <vmime::string>(u2));
ferencd@0 212
ferencd@0 213 vmime::utility::url u3("proto", "host");
ferencd@0 214 u3.getParams()["p1"] = "v1";
ferencd@0 215 VASSERT_EQ("3.1", "proto://host/?p1=v1",
ferencd@0 216 static_cast <vmime::string>(u3));
ferencd@0 217 u3.getParams()["p2"] = "v2";
ferencd@0 218 VASSERT_EQ("3.2", "proto://host/?p1=v1&p2=v2",
ferencd@0 219 static_cast <vmime::string>(u3));
ferencd@0 220
ferencd@0 221 // Test special characters
ferencd@0 222 u3.getParams().clear();
ferencd@0 223 u3.getParams()["&"] = "=";
ferencd@0 224 VASSERT_EQ("3.3", "proto://host/?%26=%3D",
ferencd@0 225 static_cast <vmime::string>(u3));
ferencd@0 226 }
ferencd@0 227
ferencd@0 228 void testUtilsEncode()
ferencd@0 229 {
ferencd@0 230 VASSERT_EQ("1", "%01", vmime::utility::urlUtils::encode("\x01"));
ferencd@0 231 VASSERT_EQ("2", "%20", vmime::utility::urlUtils::encode(" "));
ferencd@0 232 VASSERT_EQ("3", "%FF", vmime::utility::urlUtils::encode("\xff"));
ferencd@0 233 VASSERT_EQ("4", "a", vmime::utility::urlUtils::encode("a"));
ferencd@0 234 }
ferencd@0 235
ferencd@0 236 void testUtilsDecode()
ferencd@0 237 {
ferencd@0 238 for (int i = 0 ; i < 255 ; ++i)
ferencd@0 239 {
ferencd@0 240 std::ostringstream ossTest;
ferencd@0 241 ossTest << "%" << "0123456789ABCDEF"[i / 16]
ferencd@0 242 << "0123456789ABCDEF"[i % 16];
ferencd@0 243
ferencd@0 244 std::ostringstream ossNum;
ferencd@0 245 ossNum << i;
ferencd@0 246
ferencd@0 247 vmime::string res;
ferencd@0 248 res += static_cast <unsigned char>(i);
ferencd@0 249
ferencd@0 250 VASSERT_EQ(ossNum.str(), res,
ferencd@0 251 vmime::utility::urlUtils::decode(ossTest.str()));
ferencd@0 252 }
ferencd@0 253
ferencd@0 254 }
ferencd@0 255
ferencd@0 256 void testUtilsDecodeSpecialCases()
ferencd@0 257 {
ferencd@0 258 // Bug #1656547: segfault with '%' at the end of the string
ferencd@0 259 VASSERT_EQ("1.1", "sadfsda%", vmime::utility::urlUtils::decode("sadfsda%"));
ferencd@0 260 VASSERT_EQ("1.2", "sadfsda\x05", vmime::utility::urlUtils::decode("sadfsda%5"));
ferencd@0 261 VASSERT_EQ("1.3", "sadfsda\x42", vmime::utility::urlUtils::decode("sadfsda%42"));
ferencd@0 262 }
ferencd@0 263
ferencd@0 264 void testUtilsEncodeReservedChars()
ferencd@0 265 {
ferencd@0 266 VASSERT_EQ("1", "%24", vmime::utility::urlUtils::encode("$"));
ferencd@0 267 VASSERT_EQ("2", "%26", vmime::utility::urlUtils::encode("&"));
ferencd@0 268 VASSERT_EQ("3", "%2B", vmime::utility::urlUtils::encode("+"));
ferencd@0 269 VASSERT_EQ("4", "%2C", vmime::utility::urlUtils::encode(","));
ferencd@0 270 VASSERT_EQ("5", "%2F", vmime::utility::urlUtils::encode("/"));
ferencd@0 271 VASSERT_EQ("6", "%3A", vmime::utility::urlUtils::encode(":"));
ferencd@0 272 VASSERT_EQ("7", "%3B", vmime::utility::urlUtils::encode(";"));
ferencd@0 273 VASSERT_EQ("8", "%3D", vmime::utility::urlUtils::encode("="));
ferencd@0 274 VASSERT_EQ("9", "%3F", vmime::utility::urlUtils::encode("?"));
ferencd@0 275 VASSERT_EQ("10", "%40", vmime::utility::urlUtils::encode("@"));
ferencd@0 276 }
ferencd@0 277
ferencd@0 278 void testUtilsEncodeUnsafeChars()
ferencd@0 279 {
ferencd@0 280 VASSERT_EQ("1", "%20", vmime::utility::urlUtils::encode(" "));
ferencd@0 281 VASSERT_EQ("2", "%22", vmime::utility::urlUtils::encode("\""));
ferencd@0 282 VASSERT_EQ("3", "%3C", vmime::utility::urlUtils::encode("<"));
ferencd@0 283 VASSERT_EQ("4", "%3E", vmime::utility::urlUtils::encode(">"));
ferencd@0 284 VASSERT_EQ("5", "%23", vmime::utility::urlUtils::encode("#"));
ferencd@0 285 VASSERT_EQ("6", "%25", vmime::utility::urlUtils::encode("%"));
ferencd@0 286 VASSERT_EQ("7", "%7B", vmime::utility::urlUtils::encode("{"));
ferencd@0 287 VASSERT_EQ("8", "%7D", vmime::utility::urlUtils::encode("}"));
ferencd@0 288 VASSERT_EQ("9", "%7C", vmime::utility::urlUtils::encode("|"));
ferencd@0 289 VASSERT_EQ("10", "%5C", vmime::utility::urlUtils::encode("\\"));
ferencd@0 290 VASSERT_EQ("11", "%5E", vmime::utility::urlUtils::encode("^"));
ferencd@0 291 VASSERT_EQ("12", "%7E", vmime::utility::urlUtils::encode("~"));
ferencd@0 292 VASSERT_EQ("13", "%5B", vmime::utility::urlUtils::encode("["));
ferencd@0 293 VASSERT_EQ("14", "%5D", vmime::utility::urlUtils::encode("]"));
ferencd@0 294 VASSERT_EQ("15", "%60", vmime::utility::urlUtils::encode("`"));
ferencd@0 295 }
ferencd@0 296
ferencd@0 297 VMIME_TEST_SUITE_END
ferencd@0 298