| 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 "platform/network/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 String nullString; | |
| 15 LinkHeaderSet nullHeaderSet(nullString); | |
| 16 ASSERT_EQ(nullHeaderSet.size(), unsigned(0)); | |
| 17 String emptyString(""); | |
| 18 LinkHeaderSet emptyHeaderSet(emptyString); | |
| 19 ASSERT_EQ(emptyHeaderSet.size(), unsigned(0)); | |
| 20 } | |
| 21 | |
| 22 struct SingleTestCase { | |
| 23 const char* headerValue; | |
| 24 bool valid; | |
| 25 const char* url; | |
| 26 const char* rel; | |
| 27 const char* as; | |
| 28 const char* media; | |
| 29 } singleTestCases[] = { | |
| 30 {"</images/cat.jpg>; rel=prefetch", true, "/images/cat.jpg", "prefetch", "", | |
| 31 ""}, | |
| 32 {"</images/cat.jpg>;rel=prefetch", true, "/images/cat.jpg", "prefetch", "", | |
| 33 ""}, | |
| 34 {"</images/cat.jpg> ;rel=prefetch", true, "/images/cat.jpg", "prefetch", | |
| 35 "", ""}, | |
| 36 {"</images/cat.jpg> ; rel=prefetch", true, "/images/cat.jpg", | |
| 37 "prefetch", "", ""}, | |
| 38 {"< /images/cat.jpg> ; rel=prefetch", true, "/images/cat.jpg", | |
| 39 "prefetch", "", ""}, | |
| 40 {"</images/cat.jpg > ; rel=prefetch", true, "/images/cat.jpg", | |
| 41 "prefetch", "", ""}, | |
| 42 {"</images/cat.jpg wutwut> ; rel=prefetch", true, | |
| 43 "/images/cat.jpg wutwut", "prefetch", "", ""}, | |
| 44 {"</images/cat.jpg wutwut \t > ; rel=prefetch", true, | |
| 45 "/images/cat.jpg wutwut", "prefetch", "", ""}, | |
| 46 {"</images/cat.jpg>; rel=prefetch ", true, "/images/cat.jpg", "prefetch", | |
| 47 "", ""}, | |
| 48 {"</images/cat.jpg>; Rel=prefetch ", true, "/images/cat.jpg", "prefetch", | |
| 49 "", ""}, | |
| 50 {"</images/cat.jpg>; Rel=PReFetCh ", true, "/images/cat.jpg", "prefetch", | |
| 51 "", ""}, | |
| 52 {"</images/cat.jpg>; rel=prefetch; rel=somethingelse", true, | |
| 53 "/images/cat.jpg", "prefetch", "", ""}, | |
| 54 {" </images/cat.jpg>; rel=prefetch ", true, "/images/cat.jpg", | |
| 55 "prefetch", "", ""}, | |
| 56 {"\t </images/cat.jpg>; rel=prefetch ", true, "/images/cat.jpg", | |
| 57 "prefetch", "", ""}, | |
| 58 {"</images/cat.jpg>\t\t ; \trel=prefetch \t ", true, "/images/cat.jpg", | |
| 59 "prefetch", "", ""}, | |
| 60 {"\f</images/cat.jpg>\t\t ; \trel=prefetch \t ", false}, | |
| 61 {"</images/cat.jpg>; rel= prefetch", true, "/images/cat.jpg", "prefetch", | |
| 62 "", ""}, | |
| 63 {"<../images/cat.jpg?dog>; rel= prefetch", true, "../images/cat.jpg?dog", | |
| 64 "prefetch", "", ""}, | |
| 65 {"</images/cat.jpg>; rel =prefetch", true, "/images/cat.jpg", "prefetch", | |
| 66 "", ""}, | |
| 67 {"</images/cat.jpg>; rel pel=prefetch", false}, | |
| 68 {"< /images/cat.jpg>", true, "/images/cat.jpg", "", "", ""}, | |
| 69 {"</images/cat.jpg>; rel =", false}, | |
| 70 {"</images/cat.jpg>; wut=sup; rel =prefetch", true, "/images/cat.jpg", | |
| 71 "prefetch", "", ""}, | |
| 72 {"</images/cat.jpg>; wut=sup ; rel =prefetch", true, "/images/cat.jpg", | |
| 73 "prefetch", "", ""}, | |
| 74 {"</images/cat.jpg>; wut=sup ; rel =prefetch \t ;", true, | |
| 75 "/images/cat.jpg", "prefetch", "", ""}, | |
| 76 {"</images/cat.jpg> wut=sup ; rel =prefetch \t ;", false}, | |
| 77 {"< /images/cat.jpg", false}, | |
| 78 {"< http://wut.com/ sdfsdf ?sd>; rel=dns-prefetch", true, | |
| 79 "http://wut.com/ sdfsdf ?sd", "dns-prefetch", "", ""}, | |
| 80 {"< http://wut.com/%20%20%3dsdfsdf?sd>; rel=dns-prefetch", true, | |
| 81 "http://wut.com/%20%20%3dsdfsdf?sd", "dns-prefetch", "", ""}, | |
| 82 {"< http://wut.com/dfsdf?sdf=ghj&wer=rty>; rel=prefetch", true, | |
| 83 "http://wut.com/dfsdf?sdf=ghj&wer=rty", "prefetch", "", ""}, | |
| 84 {"< http://wut.com/dfsdf?sdf=ghj&wer=rty>;;;;; rel=prefetch", true, | |
| 85 "http://wut.com/dfsdf?sdf=ghj&wer=rty", "prefetch", "", ""}, | |
| 86 {"< http://wut.com/%20%20%3dsdfsdf?sd>; rel=preload;as=image", true, | |
| 87 "http://wut.com/%20%20%3dsdfsdf?sd", "preload", "image", ""}, | |
| 88 {"< http://wut.com/%20%20%3dsdfsdf?sd>; rel=preload;as=whatever", true, | |
| 89 "http://wut.com/%20%20%3dsdfsdf?sd", "preload", "whatever", ""}, | |
| 90 {"</images/cat.jpg>; anchor=foo; rel=prefetch;", false}, | |
| 91 {"</images/cat.jpg>; rel=prefetch;anchor=foo ", false}, | |
| 92 {"</images/cat.jpg>; anchor='foo'; rel=prefetch;", false}, | |
| 93 {"</images/cat.jpg>; rel=prefetch;anchor='foo' ", false}, | |
| 94 {"</images/cat.jpg>; rel=prefetch;anchor='' ", false}, | |
| 95 {"</images/cat.jpg>; rel=prefetch;", true, "/images/cat.jpg", "prefetch", | |
| 96 "", ""}, | |
| 97 {"</images/cat.jpg>; rel=prefetch ;", true, "/images/cat.jpg", | |
| 98 "prefetch", "", ""}, | |
| 99 {"</images/ca,t.jpg>; rel=prefetch ;", true, "/images/ca,t.jpg", | |
| 100 "prefetch", "", ""}, | |
| 101 {"<simple.css>; rel=stylesheet; title=\"title with a DQUOTE and " | |
| 102 "backslash\"", | |
| 103 true, "simple.css", "stylesheet", "", ""}, | |
| 104 {"<simple.css>; rel=stylesheet; title=\"title with a DQUOTE \\\" and " | |
| 105 "backslash: \\\"", | |
| 106 false}, | |
| 107 {"<simple.css>; title=\"title with a DQUOTE \\\" and backslash: \"; " | |
| 108 "rel=stylesheet; ", | |
| 109 true, "simple.css", "stylesheet", "", ""}, | |
| 110 {"<simple.css>; title=\'title with a DQUOTE \\\' and backslash: \'; " | |
| 111 "rel=stylesheet; ", | |
| 112 true, "simple.css", "stylesheet", "", ""}, | |
| 113 {"<simple.css>; title=\"title with a DQUOTE \\\" and ;backslash,: \"; " | |
| 114 "rel=stylesheet; ", | |
| 115 true, "simple.css", "stylesheet", "", ""}, | |
| 116 {"<simple.css>; title=\"title with a DQUOTE \' and ;backslash,: \"; " | |
| 117 "rel=stylesheet; ", | |
| 118 true, "simple.css", "stylesheet", "", ""}, | |
| 119 {"<simple.css>; title=\"\"; rel=stylesheet; ", true, "simple.css", | |
| 120 "stylesheet", "", ""}, | |
| 121 {"<simple.css>; title=\"\"; rel=\"stylesheet\"; ", true, "simple.css", | |
| 122 "stylesheet", "", ""}, | |
| 123 {"<simple.css>; rel=stylesheet; title=\"", false}, | |
| 124 {"<simple.css>; rel=stylesheet; title=\"\"", true, "simple.css", | |
| 125 "stylesheet", "", ""}, | |
| 126 {"<simple.css>; rel=\"stylesheet\"; title=\"", false}, | |
| 127 {"<simple.css>; rel=\";style,sheet\"; title=\"", false}, | |
| 128 {"<simple.css>; rel=\"bla'sdf\"; title=\"", false}, | |
| 129 {"<simple.css>; rel=\"\"; title=\"\"", true, "simple.css", "", "", ""}, | |
| 130 {"<simple.css>; rel=''; title=\"\"", true, "simple.css", "''", "", ""}, | |
| 131 {"<simple.css>; rel=''; title=", false}, | |
| 132 {"<simple.css>; rel=''; title", false}, | |
| 133 {"<simple.css>; rel=''; media", false}, | |
| 134 {"<simple.css>; rel=''; hreflang", false}, | |
| 135 {"<simple.css>; rel=''; type", false}, | |
| 136 {"<simple.css>; rel=''; rev", false}, | |
| 137 {"<simple.css>; rel=''; bla", true, "simple.css", "''", "", ""}, | |
| 138 {"<simple.css>; rel='prefetch", true, "simple.css", "'prefetch", "", ""}, | |
| 139 {"<simple.css>; rel=\"prefetch", false}, | |
| 140 {"<simple.css>; rel=\"", false}, | |
| 141 {"<http://whatever.com>; rel=preconnect; valid!", true, | |
| 142 "http://whatever.com", "preconnect", "", ""}, | |
| 143 {"<http://whatever.com>; rel=preconnect; valid$", true, | |
| 144 "http://whatever.com", "preconnect", "", ""}, | |
| 145 {"<http://whatever.com>; rel=preconnect; invalid@", false}, | |
| 146 {"<http://whatever.com>; rel=preconnect; invalid*", false}, | |
| 147 {"</images/cat.jpg>; rel=prefetch;media='(max-width: 5000px)'", true, | |
| 148 "/images/cat.jpg", "prefetch", "", "'(max-width: 5000px)'"}, | |
| 149 {"</images/cat.jpg>; rel=prefetch;media=\"(max-width: 5000px)\"", true, | |
| 150 "/images/cat.jpg", "prefetch", "", "(max-width: 5000px)"}, | |
| 151 {"</images/cat.jpg>; rel=prefetch;media=(max-width:5000px)", true, | |
| 152 "/images/cat.jpg", "prefetch", "", "(max-width:5000px)"}, | |
| 153 }; | |
| 154 | |
| 155 void PrintTo(const SingleTestCase& test, std::ostream* os) { | |
| 156 *os << ::testing::PrintToString(test.headerValue); | |
| 157 } | |
| 158 | |
| 159 class SingleLinkHeaderTest : public ::testing::TestWithParam<SingleTestCase> {}; | |
| 160 | |
| 161 // Test the cases with a single header | |
| 162 TEST_P(SingleLinkHeaderTest, Single) { | |
| 163 const SingleTestCase testCase = GetParam(); | |
| 164 LinkHeaderSet headerSet(testCase.headerValue); | |
| 165 ASSERT_EQ(1u, headerSet.size()); | |
| 166 LinkHeader& header = headerSet[0]; | |
| 167 EXPECT_EQ(testCase.valid, header.valid()); | |
| 168 if (testCase.valid) { | |
| 169 EXPECT_STREQ(testCase.url, header.url().ascii().data()); | |
| 170 EXPECT_STREQ(testCase.rel, header.rel().ascii().data()); | |
| 171 EXPECT_STREQ(testCase.as, header.as().ascii().data()); | |
| 172 EXPECT_STREQ(testCase.media, header.media().ascii().data()); | |
| 173 } | |
| 174 } | |
| 175 | |
| 176 INSTANTIATE_TEST_CASE_P(LinkHeaderTest, | |
| 177 SingleLinkHeaderTest, | |
| 178 testing::ValuesIn(singleTestCases)); | |
| 179 | |
| 180 struct DoubleTestCase { | |
| 181 const char* headerValue; | |
| 182 const char* url; | |
| 183 const char* rel; | |
| 184 bool valid; | |
| 185 const char* url2; | |
| 186 const char* rel2; | |
| 187 bool valid2; | |
| 188 } doubleTestCases[] = { | |
| 189 {"<ybg.css>; rel=stylesheet, <simple.css>; rel=stylesheet", "ybg.css", | |
| 190 "stylesheet", true, "simple.css", "stylesheet", true}, | |
| 191 {"<ybg.css>; rel=stylesheet,<simple.css>; rel=stylesheet", "ybg.css", | |
| 192 "stylesheet", true, "simple.css", "stylesheet", true}, | |
| 193 {"<ybg.css>; rel=stylesheet;crossorigin,<simple.css>; rel=stylesheet", | |
| 194 "ybg.css", "stylesheet", true, "simple.css", "stylesheet", true}, | |
| 195 {"<hel,lo.css>; rel=stylesheet; title=\"foo,bar\", <simple.css>; " | |
| 196 "rel=stylesheet; title=\"foo;bar\"", | |
| 197 "hel,lo.css", "stylesheet", true, "simple.css", "stylesheet", true}, | |
| 198 }; | |
| 199 | |
| 200 void PrintTo(const DoubleTestCase& test, std::ostream* os) { | |
| 201 *os << ::testing::PrintToString(test.headerValue); | |
| 202 } | |
| 203 | |
| 204 class DoubleLinkHeaderTest : public ::testing::TestWithParam<DoubleTestCase> {}; | |
| 205 | |
| 206 TEST_P(DoubleLinkHeaderTest, Double) { | |
| 207 const DoubleTestCase testCase = GetParam(); | |
| 208 LinkHeaderSet headerSet(testCase.headerValue); | |
| 209 ASSERT_EQ(2u, headerSet.size()); | |
| 210 LinkHeader& header1 = headerSet[0]; | |
| 211 LinkHeader& header2 = headerSet[1]; | |
| 212 EXPECT_STREQ(testCase.url, header1.url().ascii().data()); | |
| 213 EXPECT_STREQ(testCase.rel, header1.rel().ascii().data()); | |
| 214 EXPECT_EQ(testCase.valid, header1.valid()); | |
| 215 EXPECT_STREQ(testCase.url2, header2.url().ascii().data()); | |
| 216 EXPECT_STREQ(testCase.rel2, header2.rel().ascii().data()); | |
| 217 EXPECT_EQ(testCase.valid2, header2.valid()); | |
| 218 } | |
| 219 | |
| 220 INSTANTIATE_TEST_CASE_P(LinkHeaderTest, | |
| 221 DoubleLinkHeaderTest, | |
| 222 testing::ValuesIn(doubleTestCases)); | |
| 223 | |
| 224 struct CrossOriginTestCase { | |
| 225 const char* headerValue; | |
| 226 const char* url; | |
| 227 const char* rel; | |
| 228 const char* crossorigin; | |
| 229 bool valid; | |
| 230 } crossOriginTestCases[] = { | |
| 231 {"<http://whatever.com>; rel=preconnect", "http://whatever.com", | |
| 232 "preconnect", nullptr, true}, | |
| 233 {"<http://whatever.com>; rel=preconnect; crossorigin=", "", "", "", false}, | |
| 234 {"<http://whatever.com>; rel=preconnect; crossorigin", | |
| 235 "http://whatever.com", "preconnect", "", true}, | |
| 236 {"<http://whatever.com>; rel=preconnect; crossorigin ", | |
| 237 "http://whatever.com", "preconnect", "", true}, | |
| 238 {"<http://whatever.com>; rel=preconnect; crossorigin;", | |
| 239 "http://whatever.com", "preconnect", "", true}, | |
| 240 {"<http://whatever.com>; rel=preconnect; crossorigin, " | |
| 241 "<http://whatever2.com>; rel=preconnect", | |
| 242 "http://whatever.com", "preconnect", "", true}, | |
| 243 {"<http://whatever.com>; rel=preconnect; crossorigin , " | |
| 244 "<http://whatever2.com>; rel=preconnect", | |
| 245 "http://whatever.com", "preconnect", "", true}, | |
| 246 {"<http://whatever.com>; rel=preconnect; " | |
| 247 "crossorigin,<http://whatever2.com>; rel=preconnect", | |
| 248 "http://whatever.com", "preconnect", "", true}, | |
| 249 {"<http://whatever.com>; rel=preconnect; crossorigin=anonymous", | |
| 250 "http://whatever.com", "preconnect", "anonymous", true}, | |
| 251 {"<http://whatever.com>; rel=preconnect; crossorigin=use-credentials", | |
| 252 "http://whatever.com", "preconnect", "use-credentials", true}, | |
| 253 {"<http://whatever.com>; rel=preconnect; crossorigin=whatever", | |
| 254 "http://whatever.com", "preconnect", "whatever", true}, | |
| 255 {"<http://whatever.com>; rel=preconnect; crossorig|in=whatever", | |
| 256 "http://whatever.com", "preconnect", nullptr, true}, | |
| 257 {"<http://whatever.com>; rel=preconnect; crossorigin|=whatever", | |
| 258 "http://whatever.com", "preconnect", nullptr, true}, | |
| 259 }; | |
| 260 | |
| 261 void PrintTo(const CrossOriginTestCase& test, std::ostream* os) { | |
| 262 *os << ::testing::PrintToString(test.headerValue); | |
| 263 } | |
| 264 | |
| 265 class CrossOriginLinkHeaderTest | |
| 266 : public ::testing::TestWithParam<CrossOriginTestCase> {}; | |
| 267 | |
| 268 TEST_P(CrossOriginLinkHeaderTest, CrossOrigin) { | |
| 269 const CrossOriginTestCase testCase = GetParam(); | |
| 270 LinkHeaderSet headerSet(testCase.headerValue); | |
| 271 ASSERT_GE(headerSet.size(), 1u); | |
| 272 LinkHeader& header = headerSet[0]; | |
| 273 EXPECT_STREQ(testCase.url, header.url().ascii().data()); | |
| 274 EXPECT_STREQ(testCase.rel, header.rel().ascii().data()); | |
| 275 EXPECT_EQ(testCase.valid, header.valid()); | |
| 276 if (!testCase.crossorigin) | |
| 277 EXPECT_TRUE(header.crossOrigin().isNull()); | |
| 278 else | |
| 279 EXPECT_STREQ(testCase.crossorigin, header.crossOrigin().ascii().data()); | |
| 280 } | |
| 281 | |
| 282 INSTANTIATE_TEST_CASE_P(LinkHeaderTest, | |
| 283 CrossOriginLinkHeaderTest, | |
| 284 testing::ValuesIn(crossOriginTestCases)); | |
| 285 | |
| 286 } // namespace | |
| 287 } // namespace blink | |
| OLD | NEW |