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

Side by Side Diff: third_party/WebKit/Source/core/loader/LinkHeaderTest.cpp

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: Created 4 years, 9 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 2015 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 "core/loader/LinkHeader.h"
6
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include <base/macros.h>
9
10 namespace blink {
11 namespace {
12
13 TEST(LinkHeaderTest, Empty)
14 {
15 String nullString;
16 LinkHeaderSet nullHeaderSet(nullString);
17 ASSERT_EQ(nullHeaderSet.size(), unsigned(0));
18 String emptyString("");
19 LinkHeaderSet emptyHeaderSet(emptyString);
20 ASSERT_EQ(emptyHeaderSet.size(), unsigned(0));
21 }
22
23 struct SingleTestCase {
24 const char* headerValue;
25 bool valid;
26 const char* url;
27 const char* rel;
28 const char* as;
29 const char* media;
30 } singleTestCases[] = {
31 {"</images/cat.jpg>; rel=prefetch", true, "/images/cat.jpg", "prefetch", "", ""},
32 {"</images/cat.jpg>;rel=prefetch", true, "/images/cat.jpg", "prefetch", "", ""},
33 {"</images/cat.jpg> ;rel=prefetch", true, "/images/cat.jpg", "prefetch", " ", ""},
34 {"</images/cat.jpg> ; rel=prefetch", true, "/images/cat.jpg", "prefetch" , "", ""},
35 {"< /images/cat.jpg> ; rel=prefetch", true, "/images/cat.jpg", "prefetch ", "", ""},
36 {"</images/cat.jpg > ; rel=prefetch", true, "/images/cat.jpg", "prefetch ", "", ""},
37 {"</images/cat.jpg wutwut> ; rel=prefetch", true, "/images/cat.jpg", "pr efetch", "", ""},
38 {"</images/cat.jpg wutwut \t > ; rel=prefetch", true, "/images/cat.jpg" , "prefetch", "", ""},
39 {"</images/cat.jpg>; rel=prefetch ", true, "/images/cat.jpg", "prefetch", "", ""},
40 {"</images/cat.jpg>; Rel=prefetch ", true, "/images/cat.jpg", "prefetch", "", ""},
41 {"</images/cat.jpg>; Rel=PReFetCh ", true, "/images/cat.jpg", "prefetch", "", ""},
42 {"</images/cat.jpg>; rel=prefetch; rel=somethingelse", true, "/images/cat.jp g", "prefetch", "", ""},
43 {" </images/cat.jpg>; rel=prefetch ", true, "/images/cat.jpg", "prefetch" , "", ""},
44 {"\t </images/cat.jpg>; rel=prefetch ", true, "/images/cat.jpg", "prefetc h", "", ""},
45 {"</images/cat.jpg>\t\t ; \trel=prefetch \t ", true, "/images/cat.jpg", "pr efetch", "", ""},
46 {"\f</images/cat.jpg>\t\t ; \trel=prefetch \t ", false},
47 {"</images/cat.jpg>; rel= prefetch", true, "/images/cat.jpg", "prefetch", "" , ""},
48 {"<../images/cat.jpg?dog>; rel= prefetch", true, "../images/cat.jpg?dog", "p refetch", "", ""},
49 {"</images/cat.jpg>; rel =prefetch", true, "/images/cat.jpg", "prefetch", "" , ""},
50 {"</images/cat.jpg>; rel pel=prefetch", false},
51 {"< /images/cat.jpg>", true, "/images/cat.jpg", "", "", ""},
52 {"</images/cat.jpg>; rel =", false},
53 {"</images/cat.jpg>; wut=sup; rel =prefetch", true, "/images/cat.jpg", "pref etch", "", ""},
54 {"</images/cat.jpg>; wut=sup ; rel =prefetch", true, "/images/cat.jpg", "pre fetch", "", ""},
55 {"</images/cat.jpg>; wut=sup ; rel =prefetch \t ;", true, "/images/cat.jpg ", "prefetch", "", ""},
56 {"</images/cat.jpg> wut=sup ; rel =prefetch \t ;", false},
57 {"< /images/cat.jpg", false},
58 {"< http://wut.com/ sdfsdf ?sd>; rel=dns-prefetch", true, "http://wut.com /", "dns-prefetch", "", ""},
59 {"< http://wut.com/%20%20%3dsdfsdf?sd>; rel=dns-prefetch", true, "http://w ut.com/%20%20%3dsdfsdf?sd", "dns-prefetch", "", ""},
60 {"< http://wut.com/dfsdf?sdf=ghj&wer=rty>; rel=prefetch", true, "http://wu t.com/dfsdf?sdf=ghj&wer=rty", "prefetch", "", ""},
61 {"< http://wut.com/dfsdf?sdf=ghj&wer=rty>;;;;; rel=prefetch", true, "http: //wut.com/dfsdf?sdf=ghj&wer=rty", "prefetch", "", ""},
62 {"< http://wut.com/%20%20%3dsdfsdf?sd>; rel=preload;as=image", true, "http ://wut.com/%20%20%3dsdfsdf?sd", "preload", "image", ""},
63 {"< http://wut.com/%20%20%3dsdfsdf?sd>; rel=preload;as=whatever", true, "h ttp://wut.com/%20%20%3dsdfsdf?sd", "preload", "whatever", ""},
64 {"</images/cat.jpg>; anchor=foo; rel=prefetch;", false},
65 {"</images/cat.jpg>; rel=prefetch;anchor=foo ", false},
66 {"</images/cat.jpg>; anchor='foo'; rel=prefetch;", false},
67 {"</images/cat.jpg>; rel=prefetch;anchor='foo' ", false},
68 {"</images/cat.jpg>; rel=prefetch;anchor='' ", false},
69 {"</images/cat.jpg>; rel=prefetch;", true, "/images/cat.jpg", "prefetch", "" , ""},
70 {"</images/cat.jpg>; rel=prefetch ;", true, "/images/cat.jpg", "prefetch" , "", ""},
71 {"</images/ca,t.jpg>; rel=prefetch ;", true, "/images/ca,t.jpg", "prefetc h", "", ""},
72 {"<simple.css>; rel=stylesheet; title=\"title with a DQUOTE and backslash\"" , true, "simple.css", "stylesheet", "", ""},
73 {"<simple.css>; rel=stylesheet; title=\"title with a DQUOTE \\\" and backsla sh: \\\"", false},
74 {"<simple.css>; title=\"title with a DQUOTE \\\" and backslash: \"; rel=styl esheet; ", true, "simple.css", "stylesheet", "", ""},
75 {"<simple.css>; title=\'title with a DQUOTE \\\' and backslash: \'; rel=styl esheet; ", true, "simple.css", "stylesheet", "", ""},
76 {"<simple.css>; title=\"title with a DQUOTE \\\" and ;backslash,: \"; rel=st ylesheet; ", true, "simple.css", "stylesheet", "", ""},
77 {"<simple.css>; title=\"title with a DQUOTE \' and ;backslash,: \"; rel=styl esheet; ", true, "simple.css", "stylesheet", "", ""},
78 {"<simple.css>; title=\"\"; rel=stylesheet; ", true, "simple.css", "styleshe et", "", ""},
79 {"<simple.css>; title=\"\"; rel=\"stylesheet\"; ", true, "simple.css", "styl esheet", "", ""},
80 {"<simple.css>; rel=stylesheet; title=\"", false},
81 {"<simple.css>; rel=stylesheet; title=\"\"", true, "simple.css", "stylesheet ", "", ""},
82 {"<simple.css>; rel=\"stylesheet\"; title=\"", false},
83 {"<simple.css>; rel=\";style,sheet\"; title=\"", false},
84 {"<simple.css>; rel=\"bla'sdf\"; title=\"", false},
85 {"<simple.css>; rel=\"\"; title=\"\"", true, "simple.css", "", "", ""},
86 {"<simple.css>; rel=''; title=\"\"", true, "simple.css", "", "", ""},
87 {"<simple.css>; rel=''; title=", false},
88 {"<simple.css>; rel=''; title", false},
89 {"<simple.css>; rel=''; media", false},
90 {"<simple.css>; rel=''; hreflang", false},
91 {"<simple.css>; rel=''; type", false},
92 {"<simple.css>; rel=''; rev", false},
93 {"<simple.css>; rel=''; bla", true, "simple.css", "", "", ""},
94 {"<simple.css>; rel='prefetch", false},
95 {"<simple.css>; rel=\"prefetch", false},
96 {"<simple.css>; rel=\"", false},
97 {"<http://whatever.com>; rel=preconnect; valid!", true, "http://whatever.com ", "preconnect", "", ""},
98 {"<http://whatever.com>; rel=preconnect; valid$", true, "http://whatever.com ", "preconnect", "", ""},
99 {"<http://whatever.com>; rel=preconnect; invalid@", false},
100 {"<http://whatever.com>; rel=preconnect; invalid*", false},
101 {"</images/cat.jpg>; rel=prefetch;media='(max-width: 5000px)'", true, "/imag es/cat.jpg", "prefetch", "", "(max-width: 5000px)"},
102 {"</images/cat.jpg>; rel=prefetch;media=\"(max-width: 5000px)\"", true, "/im ages/cat.jpg", "prefetch", "", "(max-width: 5000px)"},
103 {"</images/cat.jpg>; rel=prefetch;media=(max-width:5000px)", true, "/images/ cat.jpg", "prefetch", "", "(max-width:5000px)"},
104 };
105
106 void PrintTo(const SingleTestCase& test, std::ostream* os)
107 {
108 *os << ::testing::PrintToString(test.headerValue);
109 }
110
111 class SingleLinkHeaderTest : public ::testing::TestWithParam<SingleTestCase> {};
112
113 // Test the cases with a single header
114 TEST_P(SingleLinkHeaderTest, Single)
115 {
116 const SingleTestCase testCase = GetParam();
117 LinkHeaderSet headerSet(testCase.headerValue);
118 ASSERT_EQ(1u, headerSet.size());
119 LinkHeader& header = headerSet[0];
120 EXPECT_EQ(testCase.valid, header.valid());
121 if (testCase.valid) {
122 EXPECT_STREQ(testCase.url, header.url().ascii().data());
123 EXPECT_STREQ(testCase.rel, header.rel().ascii().data());
124 EXPECT_STREQ(testCase.as, header.as().ascii().data());
125 EXPECT_STREQ(testCase.media, header.media().ascii().data());
126 }
127 }
128
129 INSTANTIATE_TEST_CASE_P(LinkHeaderTest, SingleLinkHeaderTest, testing::ValuesIn( singleTestCases));
130
131 struct DoubleTestCase {
132 const char* headerValue;
133 const char* url;
134 const char* rel;
135 bool valid;
136 const char* url2;
137 const char* rel2;
138 bool valid2;
139 } doubleTestCases[] = {
140 {"<ybg.css>; rel=stylesheet, <simple.css>; rel=stylesheet", "ybg.css", "styl esheet", true, "simple.css", "stylesheet", true},
141 {"<ybg.css>; rel=stylesheet,<simple.css>; rel=stylesheet", "ybg.css", "style sheet", true, "simple.css", "stylesheet", true},
142 {"<ybg.css>; rel=stylesheet;crossorigin,<simple.css>; rel=stylesheet", "ybg. css", "stylesheet", true, "simple.css", "stylesheet", true},
143 };
144
145 void PrintTo(const DoubleTestCase& test, std::ostream* os)
146 {
147 *os << ::testing::PrintToString(test.headerValue);
148 }
149
150 class DoubleLinkHeaderTest : public ::testing::TestWithParam<DoubleTestCase> {};
151
152 TEST_P(DoubleLinkHeaderTest, Double)
153 {
154 const DoubleTestCase testCase = GetParam();
155 LinkHeaderSet headerSet(testCase.headerValue);
156 ASSERT_EQ(2u, headerSet.size());
157 LinkHeader& header1 = headerSet[0];
158 LinkHeader& header2 = headerSet[1];
159 EXPECT_STREQ(testCase.url, header1.url().ascii().data());
160 EXPECT_STREQ(testCase.rel, header1.rel().ascii().data());
161 EXPECT_EQ(testCase.valid, header1.valid());
162 EXPECT_STREQ(testCase.url2, header2.url().ascii().data());
163 EXPECT_STREQ(testCase.rel2, header2.rel().ascii().data());
164 EXPECT_EQ(testCase.valid2, header2.valid());
165 }
166
167 INSTANTIATE_TEST_CASE_P(LinkHeaderTest, DoubleLinkHeaderTest, testing::ValuesIn( doubleTestCases));
168
169 struct CrossOriginTestCase {
170 const char* headerValue;
171 const char* url;
172 const char* rel;
173 const CrossOriginAttributeValue crossorigin;
174 bool valid;
175 } crossOriginTestCases[] = {
176 {"<http://whatever.com>; rel=preconnect", "http://whatever.com", "preconnect ", CrossOriginAttributeNotSet, true},
177 {"<http://whatever.com>; rel=preconnect; crossorigin=", "http://whatever.com ", "preconnect", CrossOriginAttributeAnonymous, true},
178 {"<http://whatever.com>; rel=preconnect; crossorigin", "http://whatever.com" , "preconnect", CrossOriginAttributeAnonymous, true},
179 {"<http://whatever.com>; rel=preconnect; crossorigin ", "http://whatever.com ", "preconnect", CrossOriginAttributeAnonymous, true},
180 {"<http://whatever.com>; rel=preconnect; crossorigin;", "http://whatever.com ", "preconnect", CrossOriginAttributeAnonymous, true},
181 {"<http://whatever.com>; rel=preconnect; crossorigin, <http://whatever2.com> ; rel=preconnect", "http://whatever.com", "preconnect", CrossOriginAttributeAnon ymous, true},
182 {"<http://whatever.com>; rel=preconnect; crossorigin , <http://whatever2.com >; rel=preconnect", "http://whatever.com", "preconnect", CrossOriginAttributeAno nymous, true},
183 {"<http://whatever.com>; rel=preconnect; crossorigin,<http://whatever2.com>; rel=preconnect", "http://whatever.com", "preconnect", CrossOriginAttributeAnony mous, true},
184 {"<http://whatever.com>; rel=preconnect; crossorigin=anonymous", "http://wha tever.com", "preconnect", CrossOriginAttributeAnonymous, true},
185 {"<http://whatever.com>; rel=preconnect; crossorigin=use-credentials", "http ://whatever.com", "preconnect", CrossOriginAttributeUseCredentials, true},
186 {"<http://whatever.com>; rel=preconnect; crossorigin=whatever", "http://what ever.com", "preconnect", CrossOriginAttributeAnonymous, true},
187 {"<http://whatever.com>; rel=preconnect; crossorig|in=whatever", "http://wha tever.com", "preconnect", CrossOriginAttributeNotSet, true},
188 {"<http://whatever.com>; rel=preconnect; crossorigin|=whatever", "http://wha tever.com", "preconnect", CrossOriginAttributeNotSet, true},
189 };
190
191 void PrintTo(const CrossOriginTestCase& test, std::ostream* os)
192 {
193 *os << ::testing::PrintToString(test.headerValue);
194 }
195
196 class CrossOriginLinkHeaderTest : public ::testing::TestWithParam<CrossOriginTes tCase> {};
197
198 TEST_P(CrossOriginLinkHeaderTest, CrossOrigin)
199 {
200 const CrossOriginTestCase testCase = GetParam();
201 LinkHeaderSet headerSet(testCase.headerValue);
202 ASSERT_GE(headerSet.size(), 1u);
203 LinkHeader& header = headerSet[0];
204 EXPECT_STREQ(testCase.url, header.url().ascii().data());
205 EXPECT_STREQ(testCase.rel, header.rel().ascii().data());
206 EXPECT_EQ(testCase.crossorigin, header.crossOrigin());
207 EXPECT_EQ(testCase.valid, header.valid());
208 }
209
210 INSTANTIATE_TEST_CASE_P(LinkHeaderTest, CrossOriginLinkHeaderTest, testing::Valu esIn(crossOriginTestCases));
211
212 } // namespace
213 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698