OLD | NEW |
| (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 | |
OLD | NEW |