Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Side by Side Diff: components/link_header_util/link_header_util_unittest.cc

Issue 1811163002: Share link header parsing code between blink and content. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@base-optional
Patch Set: address mmenke's comments Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/link_header_util/link_header_util.h"
6
7 #include "base/logging.h"
8 #include "base/run_loop.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace link_header_util {
12
13 namespace {
14
15 void SplitLinkHeaderForTesting(const std::string& header,
16 std::vector<std::string>* values) {
17 std::vector<StringIteratorPair> values_iterators = SplitLinkHeader(header);
18 values->clear();
19 for (const auto& pair : values_iterators)
20 values->push_back(std::string(pair.first, pair.second));
21 }
22
23 bool ParseLinkHeaderValueForTesting(
24 std::string value,
25 std::string* url,
26 std::unordered_map<std::string, base::Optional<std::string>>* params) {
27 return ParseLinkHeaderValue(value.begin(), value.end(), url, params);
28 }
29
30 TEST(LinkHeaderTest, SplitEmpty) {
31 std::vector<std::string> values;
32 SplitLinkHeaderForTesting("", &values);
33 ASSERT_EQ(0u, values.size());
34 }
35
36 TEST(LinkHeaderTest, SplitSimple) {
37 std::vector<std::string> values;
38 SplitLinkHeaderForTesting("hello", &values);
39 ASSERT_EQ(1u, values.size());
40 EXPECT_EQ("hello", values[0]);
41
42 SplitLinkHeaderForTesting("foo, bar", &values);
43 ASSERT_EQ(2u, values.size());
44 EXPECT_EQ("foo", values[0]);
45 EXPECT_EQ("bar", values[1]);
46
47 SplitLinkHeaderForTesting(" 1\t,\t2,3", &values);
48 ASSERT_EQ(3u, values.size());
49 EXPECT_EQ("1", values[0]);
50 EXPECT_EQ("2", values[1]);
51 EXPECT_EQ("3", values[2]);
52 }
53
54 TEST(LinkHeaderTest, SplitSkipsEmpty) {
55 std::vector<std::string> values;
56 SplitLinkHeaderForTesting(", foo, , \t, bar", &values);
57 ASSERT_EQ(2u, values.size());
58 EXPECT_EQ("foo", values[0]);
59 EXPECT_EQ("bar", values[1]);
60 }
61
62 TEST(LinkHeaderTest, SplitQuotes) {
63 std::vector<std::string> values;
64 SplitLinkHeaderForTesting("\"foo,bar\", 'bar,foo', <hel,lo>", &values);
65 ASSERT_EQ(3u, values.size());
66 EXPECT_EQ("\"foo,bar\"", values[0]);
67 EXPECT_EQ("'bar,foo'", values[1]);
68 EXPECT_EQ("<hel,lo>", values[2]);
69 }
70
71 TEST(LinkHeaderTest, SplitEscapedQuotes) {
72 std::vector<std::string> values;
73 SplitLinkHeaderForTesting("\"f\\\"oo,bar\", 'b\\'ar,foo', <hel\\>,lo>",
74 &values);
75 ASSERT_EQ(4u, values.size());
76 EXPECT_EQ("\"f\\\"oo,bar\"", values[0]);
77 EXPECT_EQ("'b\\'ar,foo'", values[1]);
78 EXPECT_EQ("<hel\\>", values[2]);
79 EXPECT_EQ("lo>", values[3]);
80 }
81
82 struct SimpleParseTestData {
83 const char* link;
84 bool valid;
85 const char* url;
86 const char* rel;
87 const char* as;
88 };
89
90 void PrintTo(const SimpleParseTestData& test, std::ostream* os) {
91 *os << ::testing::PrintToString(test.link);
92 }
93
94 class SimpleParseTest : public ::testing::TestWithParam<SimpleParseTestData> {};
95
96 TEST_P(SimpleParseTest, Simple) {
97 const SimpleParseTestData test = GetParam();
98
99 std::string url;
100 std::unordered_map<std::string, base::Optional<std::string>> params;
101 EXPECT_EQ(test.valid,
102 ParseLinkHeaderValueForTesting(test.link, &url, &params));
103 if (test.valid) {
104 EXPECT_EQ(test.url, url);
105 EXPECT_EQ(test.rel, params["rel"].value_or(""));
106 EXPECT_EQ(test.as, params["as"].value_or(""));
107 }
108 }
109
110 // Test data mostly copied from blink::LinkHeaderTest. Expectations for a small
111 // subset of test cases are different though. Mostly because blink::LinkHeader
112 // factors in knowledge about semantics of Link headers (parameters that are
113 // required to have a value if they occur, some parameters are auto-lower-cased,
114 // headers with an "anchor" parameter are rejected by base::LinkHeader).
115 // The code this tests purely parses without actually interpreting the data, as
116 // it is expected that another layer on top will do more specific validations.
117 const SimpleParseTestData simple_parse_tests[] = {
118 {"</images/cat.jpg>; rel=prefetch", true, "/images/cat.jpg", "prefetch",
119 ""},
120 {"</images/cat.jpg>;rel=prefetch", true, "/images/cat.jpg", "prefetch", ""},
121 {"</images/cat.jpg> ;rel=prefetch", true, "/images/cat.jpg", "prefetch",
122 ""},
123 {"</images/cat.jpg> ; rel=prefetch", true, "/images/cat.jpg",
124 "prefetch", ""},
125 {"< /images/cat.jpg> ; rel=prefetch", true, "/images/cat.jpg",
126 "prefetch", ""},
127 {"</images/cat.jpg > ; rel=prefetch", true, "/images/cat.jpg",
128 "prefetch", ""},
129 {"</images/cat.jpg wutwut> ; rel=prefetch", true,
130 "/images/cat.jpg wutwut", "prefetch", ""},
131 {"</images/cat.jpg wutwut \t > ; rel=prefetch", true,
132 "/images/cat.jpg wutwut", "prefetch", ""},
133 {"</images/cat.jpg>; rel=prefetch ", true, "/images/cat.jpg", "prefetch",
134 ""},
135 {"</images/cat.jpg>; Rel=prefetch ", true, "/images/cat.jpg", "prefetch",
136 ""},
137 {"</images/cat.jpg>; Rel=PReFetCh ", true, "/images/cat.jpg", "PReFetCh",
138 ""},
139 {"</images/cat.jpg>; rel=prefetch; rel=somethingelse", true,
140 "/images/cat.jpg", "prefetch", ""},
141 {"</images/cat.jpg>\t\t ; \trel=prefetch \t ", true, "/images/cat.jpg",
142 "prefetch", ""},
143 {"</images/cat.jpg>; rel= prefetch", true, "/images/cat.jpg", "prefetch",
144 ""},
145 {"<../images/cat.jpg?dog>; rel= prefetch", true, "../images/cat.jpg?dog",
146 "prefetch", ""},
147 {"</images/cat.jpg>; rel =prefetch", true, "/images/cat.jpg", "prefetch",
148 ""},
149 {"</images/cat.jpg>; rel pel=prefetch", false},
150 {"< /images/cat.jpg>", true, "/images/cat.jpg", "", ""},
151 {"</images/cat.jpg>; wut=sup; rel =prefetch", true, "/images/cat.jpg",
152 "prefetch", ""},
153 {"</images/cat.jpg>; wut=sup ; rel =prefetch", true, "/images/cat.jpg",
154 "prefetch", ""},
155 {"</images/cat.jpg>; wut=sup ; rel =prefetch \t ;", true,
156 "/images/cat.jpg", "prefetch", ""},
157 {"</images/cat.jpg> wut=sup ; rel =prefetch \t ;", false},
158 {"< /images/cat.jpg", false},
159 {"< http://wut.com/ sdfsdf ?sd>; rel=dns-prefetch", true,
160 "http://wut.com/ sdfsdf ?sd", "dns-prefetch", ""},
161 {"< http://wut.com/%20%20%3dsdfsdf?sd>; rel=dns-prefetch", true,
162 "http://wut.com/%20%20%3dsdfsdf?sd", "dns-prefetch", ""},
163 {"< http://wut.com/dfsdf?sdf=ghj&wer=rty>; rel=prefetch", true,
164 "http://wut.com/dfsdf?sdf=ghj&wer=rty", "prefetch", ""},
165 {"< http://wut.com/dfsdf?sdf=ghj&wer=rty>;;;;; rel=prefetch", true,
166 "http://wut.com/dfsdf?sdf=ghj&wer=rty", "prefetch", ""},
167 {"< http://wut.com/%20%20%3dsdfsdf?sd>; rel=preload;as=image", true,
168 "http://wut.com/%20%20%3dsdfsdf?sd", "preload", "image"},
169 {"< http://wut.com/%20%20%3dsdfsdf?sd>; rel=preload;as=whatever", true,
170 "http://wut.com/%20%20%3dsdfsdf?sd", "preload", "whatever"},
171 {"</images/cat.jpg>; rel=prefetch;", true, "/images/cat.jpg", "prefetch",
172 ""},
173 {"</images/cat.jpg>; rel=prefetch ;", true, "/images/cat.jpg",
174 "prefetch", ""},
175 {"</images/ca,t.jpg>; rel=prefetch ;", true, "/images/ca,t.jpg",
176 "prefetch", ""},
177 {"<simple.css>; rel=stylesheet; title=\"title with a DQUOTE and "
178 "backslash\"",
179 true, "simple.css", "stylesheet", ""},
180 {"<simple.css>; rel=stylesheet; title=\"title with a DQUOTE \\\" and "
181 "backslash: \\\"",
182 false},
183 {"<simple.css>; title=\"title with a DQUOTE \\\" and backslash: \"; "
184 "rel=stylesheet; ",
185 true, "simple.css", "stylesheet", ""},
186 {"<simple.css>; title=\'title with a DQUOTE \\\' and backslash: \'; "
187 "rel=stylesheet; ",
188 true, "simple.css", "stylesheet", ""},
189 {"<simple.css>; title=\"title with a DQUOTE \\\" and ;backslash,: \"; "
190 "rel=stylesheet; ",
191 true, "simple.css", "stylesheet", ""},
192 {"<simple.css>; title=\"title with a DQUOTE \' and ;backslash,: \"; "
193 "rel=stylesheet; ",
194 true, "simple.css", "stylesheet", ""},
195 {"<simple.css>; title=\"\"; rel=stylesheet; ", true, "simple.css",
196 "stylesheet", ""},
197 {"<simple.css>; title=\"\"; rel=\"stylesheet\"; ", true, "simple.css",
198 "stylesheet", ""},
199 {"<simple.css>; rel=stylesheet; title=\"", false},
200 {"<simple.css>; rel=stylesheet; title=\"\"", true, "simple.css",
201 "stylesheet", ""},
202 {"<simple.css>; rel=\"stylesheet\"; title=\"", false},
203 {"<simple.css>; rel=\";style,sheet\"; title=\"", false},
204 {"<simple.css>; rel=\"bla'sdf\"; title=\"", false},
205 {"<simple.css>; rel=\"\"; title=\"\"", true, "simple.css", "", ""},
206 {"<simple.css>; rel=''; title=\"\"", true, "simple.css", "", ""},
207 {"<simple.css>; rel=''; bla", true, "simple.css", "", ""},
208 {"<simple.css>; rel='prefetch", false},
209 {"<simple.css>; rel=\"prefetch", false},
210 {"<simple.css>; rel=\"", false},
211 {"simple.css; rel=prefetch", false},
212 {"<simple.css>; rel=prefetch; rel=foobar", true, "simple.css", "prefetch",
213 ""},
214 };
215
216 INSTANTIATE_TEST_CASE_P(LinkHeaderTest,
217 SimpleParseTest,
218 testing::ValuesIn(simple_parse_tests));
219
220 } // namespace
221
222 } // namespace link_header_util
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698