summaryrefslogtreecommitdiff
path: root/test/test_urlutil.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_urlutil.cc')
-rw-r--r--test/test_urlutil.cc95
1 files changed, 95 insertions, 0 deletions
diff --git a/test/test_urlutil.cc b/test/test_urlutil.cc
new file mode 100644
index 0000000..583370d
--- /dev/null
+++ b/test/test_urlutil.cc
@@ -0,0 +1,95 @@
+#include "common.hh"
+
+#include "urlutil.hh"
+
+#include <gtest/gtest.h>
+
+TEST(urlutil, escape) {
+ EXPECT_EQ("", url::escape(""));
+ EXPECT_EQ("foo", url::escape("foo"));
+ EXPECT_EQ("%2Ffoo%2F", url::escape("/foo/"));
+ EXPECT_EQ("%252Ffoo%252F", url::escape("%2Ffoo%2F"));
+ EXPECT_EQ("%FF%00", url::escape(std::string_view("\xff\x00", 2)));
+ EXPECT_EQ("/foo%20bar/", url::escape("/foo bar/",
+ url::EscapeFlags::KEEP_SLASH));
+}
+
+TEST(urlutil, unescape) {
+ EXPECT_EQ("", url::unescape(""));
+ EXPECT_EQ("foo", url::unescape("foo"));
+ EXPECT_EQ("/foo/", url::unescape("%2Ffoo%2F"));
+ EXPECT_EQ("%2Ffoo%2F", url::unescape("%252Ffoo%252F"));
+ EXPECT_EQ(std::string_view("\xff\x00", 2), url::unescape("%FF%00"));
+}
+
+TEST(urlutil, unescape_invalid) {
+ EXPECT_EQ("%", url::unescape("%"));
+ EXPECT_EQ("%2", url::unescape("%2"));
+ EXPECT_EQ("%2X", url::unescape("%2X"));
+ EXPECT_EQ("%X2", url::unescape("%X2"));
+ EXPECT_EQ("%%%%%", url::unescape("%%%%%"));
+}
+
+TEST(urlutil, expand_and_unescape_query) {
+ auto ret = url::expand_and_unescape_query("");
+ EXPECT_TRUE(ret.empty());
+
+ ret = url::expand_and_unescape_query("foo=bar");
+ EXPECT_EQ(1, ret.size());
+ EXPECT_EQ("bar", ret["foo"]);
+
+ ret = url::expand_and_unescape_query("foo=bar&fum&a=&foo");
+ EXPECT_EQ(3, ret.size());
+ EXPECT_EQ("bar", ret["foo"]);
+ EXPECT_EQ("", ret["fum"]);
+ EXPECT_EQ("", ret["a"]);
+
+ ret = url::expand_and_unescape_query("foo=b%20a%20r&bar=f+o+o");
+ EXPECT_EQ(2, ret.size());
+ EXPECT_EQ("b a r", ret["foo"]);
+ EXPECT_EQ("f o o", ret["bar"]);
+
+ ret = url::expand_and_unescape_query("foo=%26amp%3B&%3D=%25");
+ EXPECT_EQ(2, ret.size());
+ EXPECT_EQ("&amp;", ret["foo"]);
+ EXPECT_EQ("%", ret["="]);
+
+ ret = url::expand_and_unescape_query("=");
+ EXPECT_EQ(1, ret.size());
+ EXPECT_EQ("", ret[""]);
+
+ ret = url::expand_and_unescape_query("&&=&=&&");
+ EXPECT_EQ(1, ret.size());
+ EXPECT_EQ("", ret[""]);
+
+ ret = url::expand_and_unescape_query("=====");
+ EXPECT_EQ(1, ret.size());
+ EXPECT_EQ("====", ret[""]);
+}
+
+TEST(urlutil, split_and_unescape_path_and_query) {
+ std::string path;
+ std::unordered_map<std::string, std::string> query;
+
+ url::split_and_unescape_path_and_query("", path, query);
+ EXPECT_EQ("", path);
+ EXPECT_TRUE(query.empty());
+
+ url::split_and_unescape_path_and_query("foo", path, query);
+ EXPECT_EQ("foo", path);
+ EXPECT_TRUE(query.empty());
+
+ url::split_and_unescape_path_and_query("?foo=bar", path, query);
+ EXPECT_EQ("", path);
+ EXPECT_EQ(1, query.size());
+ EXPECT_EQ("bar", query["foo"]);
+
+ url::split_and_unescape_path_and_query("foo?foo=bar", path, query);
+ EXPECT_EQ("foo", path);
+ EXPECT_EQ(1, query.size());
+ EXPECT_EQ("bar", query["foo"]);
+
+ url::split_and_unescape_path_and_query("%3F%3F%3D", path, query);
+ EXPECT_EQ("\?\?=", path);
+ EXPECT_TRUE(query.empty());
+}