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

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: rebase Created 4 years, 7 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
« no previous file with comments | « components/link_header_util/link_header_util.gyp ('k') | content/browser/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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(4u, values.size());
66 EXPECT_EQ("\"foo,bar\"", values[0]);
67 EXPECT_EQ("'bar", values[1]);
68 EXPECT_EQ("foo'", values[2]);
69 EXPECT_EQ("<hel,lo>", values[3]);
70 }
71
72 TEST(LinkHeaderTest, SplitEscapedQuotes) {
73 std::vector<std::string> values;
74 SplitLinkHeaderForTesting("\"f\\\"oo,bar\", 'b\\'ar,foo', <hel\\>,lo>",
75 &values);
76 ASSERT_EQ(5u, values.size());
77 EXPECT_EQ("\"f\\\"oo,bar\"", values[0]);
78 EXPECT_EQ("'b\\'ar", values[1]);
79 EXPECT_EQ("foo'", values[2]);
80 EXPECT_EQ("<hel\\>", values[3]);
81 EXPECT_EQ("lo>", values[4]);
82 }
83
84 struct SimpleParseTestData {
85 const char* link;
86 bool valid;
87 const char* url;
88 const char* rel;
89 const char* as;
90 };
91
92 void PrintTo(const SimpleParseTestData& test, std::ostream* os) {
93 *os << ::testing::PrintToString(test.link);
94 }
95
96 class SimpleParseTest : public ::testing::TestWithParam<SimpleParseTestData> {};
97
98 TEST_P(SimpleParseTest, Simple) {
99 const SimpleParseTestData test = GetParam();
100
101 std::string url;
102 std::unordered_map<std::string, base::Optional<std::string>> params;
103 EXPECT_EQ(test.valid,
104 ParseLinkHeaderValueForTesting(test.link, &url, &params));
105 if (test.valid) {
106 EXPECT_EQ(test.url, url);
107 EXPECT_EQ(test.rel, params["rel"].value_or(""));
108 EXPECT_EQ(test.as, params["as"].value_or(""));
109 }
110 }
111
112 // Test data mostly copied from blink::LinkHeaderTest. Expectations for a small
113 // subset of test cases are different though. Mostly because blink::LinkHeader
114 // factors in knowledge about semantics of Link headers (parameters that are
115 // required to have a value if they occur, some parameters are auto-lower-cased,
116 // headers with an "anchor" parameter are rejected by base::LinkHeader).
117 // The code this tests purely parses without actually interpreting the data, as
118 // it is expected that another layer on top will do more specific validations.
119 const SimpleParseTestData simple_parse_tests[] = {
120 {"</images/cat.jpg>; rel=prefetch", true, "/images/cat.jpg", "prefetch",
121 ""},
122 {"</images/cat.jpg>;rel=prefetch", true, "/images/cat.jpg", "prefetch", ""},
123 {"</images/cat.jpg> ;rel=prefetch", true, "/images/cat.jpg", "prefetch",
124 ""},
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 > ; rel=prefetch", true, "/images/cat.jpg",
130 "prefetch", ""},
131 {"</images/cat.jpg wutwut> ; rel=prefetch", true,
132 "/images/cat.jpg wutwut", "prefetch", ""},
133 {"</images/cat.jpg wutwut \t > ; rel=prefetch", true,
134 "/images/cat.jpg wutwut", "prefetch", ""},
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 ", true, "/images/cat.jpg", "PReFetCh",
140 ""},
141 {"</images/cat.jpg>; rel=prefetch; rel=somethingelse", true,
142 "/images/cat.jpg", "prefetch", ""},
143 {"</images/cat.jpg>\t\t ; \trel=prefetch \t ", true, "/images/cat.jpg",
144 "prefetch", ""},
145 {"</images/cat.jpg>; rel= prefetch", true, "/images/cat.jpg", "prefetch",
146 ""},
147 {"<../images/cat.jpg?dog>; rel= prefetch", true, "../images/cat.jpg?dog",
148 "prefetch", ""},
149 {"</images/cat.jpg>; rel =prefetch", true, "/images/cat.jpg", "prefetch",
150 ""},
151 {"</images/cat.jpg>; rel pel=prefetch", false},
152 {"< /images/cat.jpg>", true, "/images/cat.jpg", "", ""},
153 {"</images/cat.jpg>; wut=sup; rel =prefetch", true, "/images/cat.jpg",
154 "prefetch", ""},
155 {"</images/cat.jpg>; wut=sup ; rel =prefetch", true, "/images/cat.jpg",
156 "prefetch", ""},
157 {"</images/cat.jpg>; wut=sup ; rel =prefetch \t ;", true,
158 "/images/cat.jpg", "prefetch", ""},
159 {"</images/cat.jpg> wut=sup ; rel =prefetch \t ;", false},
160 {"< /images/cat.jpg", false},
161 {"< http://wut.com/ sdfsdf ?sd>; rel=dns-prefetch", true,
162 "http://wut.com/ sdfsdf ?sd", "dns-prefetch", ""},
163 {"< http://wut.com/%20%20%3dsdfsdf?sd>; rel=dns-prefetch", true,
164 "http://wut.com/%20%20%3dsdfsdf?sd", "dns-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/dfsdf?sdf=ghj&wer=rty>;;;;; rel=prefetch", true,
168 "http://wut.com/dfsdf?sdf=ghj&wer=rty", "prefetch", ""},
169 {"< http://wut.com/%20%20%3dsdfsdf?sd>; rel=preload;as=image", true,
170 "http://wut.com/%20%20%3dsdfsdf?sd", "preload", "image"},
171 {"< http://wut.com/%20%20%3dsdfsdf?sd>; rel=preload;as=whatever", true,
172 "http://wut.com/%20%20%3dsdfsdf?sd", "preload", "whatever"},
173 {"</images/cat.jpg>; rel=prefetch;", true, "/images/cat.jpg", "prefetch",
174 ""},
175 {"</images/cat.jpg>; rel=prefetch ;", true, "/images/cat.jpg",
176 "prefetch", ""},
177 {"</images/ca,t.jpg>; rel=prefetch ;", true, "/images/ca,t.jpg",
178 "prefetch", ""},
179 {"<simple.css>; rel=stylesheet; title=\"title with a DQUOTE and "
180 "backslash\"",
181 true, "simple.css", "stylesheet", ""},
182 {"<simple.css>; rel=stylesheet; title=\"title with a DQUOTE \\\" and "
183 "backslash: \\\"",
184 false},
185 {"<simple.css>; title=\"title with a DQUOTE \\\" and backslash: \"; "
186 "rel=stylesheet; ",
187 true, "simple.css", "stylesheet", ""},
188 {"<simple.css>; title=\'title with a DQUOTE \\\' and backslash: \'; "
189 "rel=stylesheet; ",
190 true, "simple.css", "stylesheet", ""},
191 {"<simple.css>; title=\"title with a DQUOTE \\\" and ;backslash,: \"; "
192 "rel=stylesheet; ",
193 true, "simple.css", "stylesheet", ""},
194 {"<simple.css>; title=\"title with a DQUOTE \' and ;backslash,: \"; "
195 "rel=stylesheet; ",
196 true, "simple.css", "stylesheet", ""},
197 {"<simple.css>; title=\"\"; rel=stylesheet; ", true, "simple.css",
198 "stylesheet", ""},
199 {"<simple.css>; title=\"\"; rel=\"stylesheet\"; ", true, "simple.css",
200 "stylesheet", ""},
201 {"<simple.css>; rel=stylesheet; title=\"", false},
202 {"<simple.css>; rel=stylesheet; title=\"\"", true, "simple.css",
203 "stylesheet", ""},
204 {"<simple.css>; rel=\"stylesheet\"; title=\"", false},
205 {"<simple.css>; rel=\";style,sheet\"; title=\"", false},
206 {"<simple.css>; rel=\"bla'sdf\"; title=\"", false},
207 {"<simple.css>; rel=\"\"; title=\"\"", true, "simple.css", "", ""},
208 {"<simple.css>; rel=''; title=\"\"", true, "simple.css", "''", ""},
209 {"<simple.css>; rel=''; bla", true, "simple.css", "''", ""},
210 {"<simple.css>; rel='prefetch", true, "simple.css", "'prefetch", ""},
211 {"<simple.css>; rel=\"prefetch", false},
212 {"<simple.css>; rel=\"", false},
213 {"simple.css; rel=prefetch", false},
214 {"<simple.css>; rel=prefetch; rel=foobar", true, "simple.css", "prefetch",
215 ""},
216 };
217
218 INSTANTIATE_TEST_CASE_P(LinkHeaderTest,
219 SimpleParseTest,
220 testing::ValuesIn(simple_parse_tests));
221
222 } // namespace
223
224 } // namespace link_header_util
OLDNEW
« no previous file with comments | « components/link_header_util/link_header_util.gyp ('k') | content/browser/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698