summaryrefslogtreecommitdiff
path: root/test/test_urlutil.cc
blob: 583370dc70c1b56cb17ff4cef5a8b51533ba27bf (plain)
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
#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());
}