OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <limits.h> | 5 #include <limits.h> |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 1097 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1108 Filter::FixupEncodingTypes(filter_context, &filter_types); | 1108 Filter::FixupEncodingTypes(filter_context, &filter_types); |
1109 ASSERT_EQ(filter_types.size(), 3u); | 1109 ASSERT_EQ(filter_types.size(), 3u); |
1110 EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH_POSSIBLE); | 1110 EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH_POSSIBLE); |
1111 EXPECT_EQ(filter_types[1], Filter::FILTER_TYPE_GZIP_HELPING_SDCH); | 1111 EXPECT_EQ(filter_types[1], Filter::FILTER_TYPE_GZIP_HELPING_SDCH); |
1112 EXPECT_EQ(filter_types[2], Filter::FILTER_TYPE_GZIP); | 1112 EXPECT_EQ(filter_types[2], Filter::FILTER_TYPE_GZIP); |
1113 | 1113 |
1114 // First try with a large buffer (larger than test input, or compressed data). | 1114 // First try with a large buffer (larger than test input, or compressed data). |
1115 filter_context.SetURL(url); | 1115 filter_context.SetURL(url); |
1116 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); | 1116 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
1117 | 1117 |
1118 | |
1119 // Verify that chained filter is waiting for data. | 1118 // Verify that chained filter is waiting for data. |
1120 char tiny_output_buffer[10]; | 1119 char tiny_output_buffer[10]; |
1121 int tiny_output_size = sizeof(tiny_output_buffer); | 1120 int tiny_output_size = sizeof(tiny_output_buffer); |
1122 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA, | 1121 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA, |
1123 filter->ReadData(tiny_output_buffer, &tiny_output_size)); | 1122 filter->ReadData(tiny_output_buffer, &tiny_output_size)); |
1124 | 1123 |
1125 size_t feed_block_size = 100; | 1124 size_t feed_block_size = 100; |
1126 size_t output_block_size = 100; | 1125 size_t output_block_size = 100; |
1127 std::string output; | 1126 std::string output; |
1128 EXPECT_TRUE(FilterTestData(double_gzip_compressed_sdch, feed_block_size, | 1127 EXPECT_TRUE(FilterTestData(double_gzip_compressed_sdch, feed_block_size, |
1129 output_block_size, filter.get(), &output)); | 1128 output_block_size, filter.get(), &output)); |
1130 EXPECT_EQ(output, expanded_); | 1129 EXPECT_EQ(output, expanded_); |
1131 | 1130 |
1132 // Next try with a tiny buffer to cover edge effects. | 1131 // Next try with a tiny buffer to cover edge effects. |
1133 filter.reset(Filter::Factory(filter_types, filter_context)); | 1132 filter.reset(Filter::Factory(filter_types, filter_context)); |
1134 | 1133 |
1135 feed_block_size = 1; | 1134 feed_block_size = 1; |
1136 output_block_size = 1; | 1135 output_block_size = 1; |
1137 output.clear(); | 1136 output.clear(); |
1138 EXPECT_TRUE(FilterTestData(double_gzip_compressed_sdch, feed_block_size, | 1137 EXPECT_TRUE(FilterTestData(double_gzip_compressed_sdch, feed_block_size, |
1139 output_block_size, filter.get(), &output)); | 1138 output_block_size, filter.get(), &output)); |
1140 EXPECT_EQ(output, expanded_); | 1139 EXPECT_EQ(output, expanded_); |
1141 } | 1140 } |
1142 | 1141 |
1143 TEST_F(SdchFilterTest, DomainSupported) { | |
1144 GURL google_url("http://www.google.com"); | |
1145 | |
1146 net::SdchManager::EnableSdchSupport(false); | |
1147 EXPECT_FALSE(SdchManager::Global()->IsInSupportedDomain(google_url)); | |
1148 net::SdchManager::EnableSdchSupport(true); | |
1149 EXPECT_TRUE(SdchManager::Global()->IsInSupportedDomain(google_url)); | |
1150 } | |
1151 | |
1152 TEST_F(SdchFilterTest, DomainBlacklisting) { | |
1153 GURL test_url("http://www.test.com"); | |
1154 GURL google_url("http://www.google.com"); | |
1155 | |
1156 SdchManager::BlacklistDomain(test_url); | |
1157 EXPECT_FALSE(SdchManager::Global()->IsInSupportedDomain(test_url)); | |
1158 EXPECT_TRUE(SdchManager::Global()->IsInSupportedDomain(google_url)); | |
1159 | |
1160 SdchManager::BlacklistDomain(google_url); | |
1161 EXPECT_FALSE(SdchManager::Global()->IsInSupportedDomain(google_url)); | |
1162 } | |
1163 | |
1164 TEST_F(SdchFilterTest, DomainBlacklistingCaseSensitivity) { | |
1165 GURL test_url("http://www.TesT.com"); | |
1166 GURL test2_url("http://www.tEst.com"); | |
1167 | |
1168 EXPECT_TRUE(SdchManager::Global()->IsInSupportedDomain(test_url)); | |
1169 EXPECT_TRUE(SdchManager::Global()->IsInSupportedDomain(test2_url)); | |
1170 SdchManager::BlacklistDomain(test_url); | |
1171 EXPECT_FALSE(SdchManager::Global()->IsInSupportedDomain(test2_url)); | |
1172 } | |
1173 | |
1174 TEST_F(SdchFilterTest, BlacklistingReset) { | |
1175 GURL gurl("http://mytest.DoMain.com"); | |
1176 std::string domain(gurl.host()); | |
1177 | |
1178 SdchManager::ClearBlacklistings(); | |
1179 EXPECT_EQ(SdchManager::BlackListDomainCount(domain), 0); | |
1180 EXPECT_EQ(SdchManager::BlacklistDomainExponential(domain), 0); | |
1181 EXPECT_TRUE(SdchManager::Global()->IsInSupportedDomain(gurl)); | |
1182 } | |
1183 | |
1184 TEST_F(SdchFilterTest, BlacklistingSingleBlacklist) { | |
1185 GURL gurl("http://mytest.DoMain.com"); | |
1186 std::string domain(gurl.host()); | |
1187 SdchManager::ClearBlacklistings(); | |
1188 | |
1189 SdchManager::Global()->BlacklistDomain(gurl); | |
1190 EXPECT_EQ(SdchManager::BlackListDomainCount(domain), 1); | |
1191 EXPECT_EQ(SdchManager::BlacklistDomainExponential(domain), 1); | |
1192 | |
1193 // Check that any domain lookup reduces the blacklist counter. | |
1194 EXPECT_FALSE(SdchManager::Global()->IsInSupportedDomain(gurl)); | |
1195 EXPECT_EQ(SdchManager::BlackListDomainCount(domain), 0); | |
1196 EXPECT_TRUE(SdchManager::Global()->IsInSupportedDomain(gurl)); | |
1197 } | |
1198 | |
1199 TEST_F(SdchFilterTest, BlacklistingExponential) { | |
1200 GURL gurl("http://mytest.DoMain.com"); | |
1201 std::string domain(gurl.host()); | |
1202 SdchManager::ClearBlacklistings(); | |
1203 | |
1204 int exponential = 1; | |
1205 for (int i = 1; i < 100; ++i) { | |
1206 SdchManager::Global()->BlacklistDomain(gurl); | |
1207 EXPECT_EQ(SdchManager::BlacklistDomainExponential(domain), exponential); | |
1208 | |
1209 EXPECT_EQ(SdchManager::BlackListDomainCount(domain), exponential); | |
1210 EXPECT_FALSE(SdchManager::Global()->IsInSupportedDomain(gurl)); | |
1211 EXPECT_EQ(SdchManager::BlackListDomainCount(domain), exponential - 1); | |
1212 | |
1213 // Simulate a large number of domain checks (which eventually remove the | |
1214 // blacklisting). | |
1215 SdchManager::ClearDomainBlacklisting(domain); | |
1216 EXPECT_EQ(SdchManager::BlackListDomainCount(domain), 0); | |
1217 EXPECT_TRUE(SdchManager::Global()->IsInSupportedDomain(gurl)); | |
1218 | |
1219 // Predict what exponential backoff will be. | |
1220 exponential = 1 + 2 * exponential; | |
1221 if (exponential < 0) | |
1222 exponential = INT_MAX; // We don't wrap. | |
1223 } | |
1224 } | |
1225 | |
1226 TEST_F(SdchFilterTest, CanSetExactMatchDictionary) { | |
1227 std::string dictionary_domain("x.y.z.google.com"); | |
1228 std::string dictionary_text(NewSdchDictionary(dictionary_domain)); | |
1229 | |
1230 // Perfect match should work. | |
1231 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary_text, | |
1232 GURL("http://" + dictionary_domain))); | |
1233 } | |
1234 | |
1235 TEST_F(SdchFilterTest, CanAdvertiseDictionaryOverHTTP) { | |
1236 std::string dictionary_domain("x.y.z.google.com"); | |
1237 std::string dictionary_text(NewSdchDictionary(dictionary_domain)); | |
1238 | |
1239 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary_text, | |
1240 GURL("http://" + dictionary_domain))); | |
1241 | |
1242 std::string dictionary_list; | |
1243 // HTTP target URL can advertise dictionary. | |
1244 sdch_manager_->GetAvailDictionaryList( | |
1245 GURL("http://" + dictionary_domain + "/test"), | |
1246 &dictionary_list); | |
1247 EXPECT_FALSE(dictionary_list.empty()); | |
1248 } | |
1249 | |
1250 TEST_F(SdchFilterTest, CanNotAdvertiseDictionaryOverHTTPS) { | |
1251 std::string dictionary_domain("x.y.z.google.com"); | |
1252 std::string dictionary_text(NewSdchDictionary(dictionary_domain)); | |
1253 | |
1254 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary_text, | |
1255 GURL("http://" + dictionary_domain))); | |
1256 | |
1257 std::string dictionary_list; | |
1258 // HTTPS target URL should NOT advertise dictionary. | |
1259 sdch_manager_->GetAvailDictionaryList( | |
1260 GURL("https://" + dictionary_domain + "/test"), | |
1261 &dictionary_list); | |
1262 EXPECT_TRUE(dictionary_list.empty()); | |
1263 } | |
1264 | |
1265 TEST_F(SdchFilterTest, CanUseHTTPSDictionaryOverHTTPSIfEnabled) { | |
1266 std::string dictionary_domain("x.y.z.google.com"); | |
1267 std::string dictionary_text(NewSdchDictionary(dictionary_domain)); | |
1268 | |
1269 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary_text, | |
1270 GURL("https://" + dictionary_domain))); | |
1271 | |
1272 GURL target_url("https://" + dictionary_domain + "/test"); | |
1273 std::string dictionary_list; | |
1274 // HTTPS target URL should advertise dictionary if secure scheme support is | |
1275 // enabled. | |
1276 sdch_manager_->EnableSecureSchemeSupport(true); | |
1277 sdch_manager_->GetAvailDictionaryList(target_url, &dictionary_list); | |
1278 EXPECT_FALSE(dictionary_list.empty()); | |
1279 | |
1280 // Dictionary should be available. | |
1281 SdchManager::Dictionary* dictionary = NULL; | |
1282 std::string client_hash; | |
1283 std::string server_hash; | |
1284 sdch_manager_->GenerateHash(dictionary_text, &client_hash, &server_hash); | |
1285 sdch_manager_->GetVcdiffDictionary(server_hash, target_url, &dictionary); | |
1286 EXPECT_TRUE(dictionary != NULL); | |
1287 } | |
1288 | |
1289 TEST_F(SdchFilterTest, CanNotUseHTTPDictionaryOverHTTPS) { | |
1290 std::string dictionary_domain("x.y.z.google.com"); | |
1291 std::string dictionary_text(NewSdchDictionary(dictionary_domain)); | |
1292 | |
1293 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary_text, | |
1294 GURL("http://" + dictionary_domain))); | |
1295 | |
1296 GURL target_url("https://" + dictionary_domain + "/test"); | |
1297 std::string dictionary_list; | |
1298 // HTTPS target URL should not advertise dictionary acquired over HTTP even if | |
1299 // secure scheme support is enabled. | |
1300 sdch_manager_->EnableSecureSchemeSupport(true); | |
1301 sdch_manager_->GetAvailDictionaryList(target_url, &dictionary_list); | |
1302 EXPECT_TRUE(dictionary_list.empty()); | |
1303 | |
1304 SdchManager::Dictionary* dictionary = NULL; | |
1305 std::string client_hash; | |
1306 std::string server_hash; | |
1307 sdch_manager_->GenerateHash(dictionary_text, &client_hash, &server_hash); | |
1308 sdch_manager_->GetVcdiffDictionary(server_hash, target_url, &dictionary); | |
1309 EXPECT_TRUE(dictionary == NULL); | |
1310 } | |
1311 | |
1312 TEST_F(SdchFilterTest, FailToSetDomainMismatchDictionary) { | |
1313 std::string dictionary_domain("x.y.z.google.com"); | |
1314 std::string dictionary_text(NewSdchDictionary(dictionary_domain)); | |
1315 | |
1316 // Fail the "domain match" requirement. | |
1317 EXPECT_FALSE(sdch_manager_->AddSdchDictionary(dictionary_text, | |
1318 GURL("http://y.z.google.com"))); | |
1319 } | |
1320 | |
1321 TEST_F(SdchFilterTest, FailToSetDotHostPrefixDomainDictionary) { | |
1322 std::string dictionary_domain("x.y.z.google.com"); | |
1323 std::string dictionary_text(NewSdchDictionary(dictionary_domain)); | |
1324 | |
1325 // Fail the HD with D being the domain and H having a dot requirement. | |
1326 EXPECT_FALSE(sdch_manager_->AddSdchDictionary(dictionary_text, | |
1327 GURL("http://w.x.y.z.google.com"))); | |
1328 } | |
1329 | |
1330 TEST_F(SdchFilterTest, FailToSetRepeatPrefixWithDotDictionary) { | |
1331 // Make sure that a prefix that matches the domain postfix won't confuse | |
1332 // the validation checks. | |
1333 std::string dictionary_domain("www.google.com"); | |
1334 std::string dictionary_text(NewSdchDictionary(dictionary_domain)); | |
1335 | |
1336 // Fail the HD with D being the domain and H having a dot requirement. | |
1337 EXPECT_FALSE(sdch_manager_->AddSdchDictionary(dictionary_text, | |
1338 GURL("http://www.google.com.www.google.com"))); | |
1339 } | |
1340 | |
1341 TEST_F(SdchFilterTest, CanSetLeadingDotDomainDictionary) { | |
1342 // Make sure that a prefix that matches the domain postfix won't confuse | |
1343 // the validation checks. | |
1344 std::string dictionary_domain(".google.com"); | |
1345 std::string dictionary_text(NewSdchDictionary(dictionary_domain)); | |
1346 | |
1347 // Verify that a leading dot in the domain is acceptable, as long as the host | |
1348 // name does not contain any dots preceding the matched domain name. | |
1349 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary_text, | |
1350 GURL("http://www.google.com"))); | |
1351 } | |
1352 | |
1353 // Make sure the order of the tests is not helping us or confusing things. | |
1354 // See test CanSetExactMatchDictionary above for first try. | |
1355 TEST_F(SdchFilterTest, CanStillSetExactMatchDictionary) { | |
1356 std::string dictionary_domain("x.y.z.google.com"); | |
1357 std::string dictionary_text(NewSdchDictionary(dictionary_domain)); | |
1358 | |
1359 // Perfect match should *STILL* work. | |
1360 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary_text, | |
1361 GURL("http://" + dictionary_domain))); | |
1362 } | |
1363 | |
1364 // Make sure the DOS protection precludes the addition of too many dictionaries. | |
1365 TEST_F(SdchFilterTest, TooManyDictionaries) { | |
1366 std::string dictionary_domain(".google.com"); | |
1367 std::string dictionary_text(NewSdchDictionary(dictionary_domain)); | |
1368 | |
1369 size_t count = 0; | |
1370 while (count <= SdchManager::kMaxDictionaryCount + 1) { | |
1371 if (!sdch_manager_->AddSdchDictionary(dictionary_text, | |
1372 GURL("http://www.google.com"))) | |
1373 break; | |
1374 | |
1375 dictionary_text += " "; // Create dictionary with different SHA signature. | |
1376 ++count; | |
1377 } | |
1378 EXPECT_EQ(SdchManager::kMaxDictionaryCount, count); | |
1379 } | |
1380 | |
1381 TEST_F(SdchFilterTest, DictionaryNotTooLarge) { | |
1382 std::string dictionary_domain(".google.com"); | |
1383 std::string dictionary_text(NewSdchDictionary(dictionary_domain)); | |
1384 | |
1385 dictionary_text.append( | |
1386 SdchManager::kMaxDictionarySize - dictionary_text.size(), ' '); | |
1387 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary_text, | |
1388 GURL("http://" + dictionary_domain))); | |
1389 } | |
1390 | |
1391 TEST_F(SdchFilterTest, DictionaryTooLarge) { | |
1392 std::string dictionary_domain(".google.com"); | |
1393 std::string dictionary_text(NewSdchDictionary(dictionary_domain)); | |
1394 | |
1395 dictionary_text.append( | |
1396 SdchManager::kMaxDictionarySize + 1 - dictionary_text.size(), ' '); | |
1397 EXPECT_FALSE(sdch_manager_->AddSdchDictionary(dictionary_text, | |
1398 GURL("http://" + dictionary_domain))); | |
1399 } | |
1400 | |
1401 TEST_F(SdchFilterTest, PathMatch) { | |
1402 bool (*PathMatch)(const std::string& path, const std::string& restriction) = | |
1403 SdchManager::Dictionary::PathMatch; | |
1404 // Perfect match is supported. | |
1405 EXPECT_TRUE(PathMatch("/search", "/search")); | |
1406 EXPECT_TRUE(PathMatch("/search/", "/search/")); | |
1407 | |
1408 // Prefix only works if last character of restriction is a slash, or first | |
1409 // character in path after a match is a slash. Validate each case separately. | |
1410 | |
1411 // Rely on the slash in the path (not at the end of the restriction). | |
1412 EXPECT_TRUE(PathMatch("/search/something", "/search")); | |
1413 EXPECT_TRUE(PathMatch("/search/s", "/search")); | |
1414 EXPECT_TRUE(PathMatch("/search/other", "/search")); | |
1415 EXPECT_TRUE(PathMatch("/search/something", "/search")); | |
1416 | |
1417 // Rely on the slash at the end of the restriction. | |
1418 EXPECT_TRUE(PathMatch("/search/something", "/search/")); | |
1419 EXPECT_TRUE(PathMatch("/search/s", "/search/")); | |
1420 EXPECT_TRUE(PathMatch("/search/other", "/search/")); | |
1421 EXPECT_TRUE(PathMatch("/search/something", "/search/")); | |
1422 | |
1423 // Make sure less that sufficient prefix match is false. | |
1424 EXPECT_FALSE(PathMatch("/sear", "/search")); | |
1425 EXPECT_FALSE(PathMatch("/", "/search")); | |
1426 EXPECT_FALSE(PathMatch(std::string(), "/search")); | |
1427 | |
1428 // Add examples with several levels of direcories in the restriction. | |
1429 EXPECT_FALSE(PathMatch("/search/something", "search/s")); | |
1430 EXPECT_FALSE(PathMatch("/search/", "/search/s")); | |
1431 | |
1432 // Make sure adding characters to path will also fail. | |
1433 EXPECT_FALSE(PathMatch("/searching", "/search/")); | |
1434 EXPECT_FALSE(PathMatch("/searching", "/search")); | |
1435 | |
1436 // Make sure we're case sensitive. | |
1437 EXPECT_FALSE(PathMatch("/ABC", "/abc")); | |
1438 EXPECT_FALSE(PathMatch("/abc", "/ABC")); | |
1439 } | |
1440 | |
1441 // The following are only applicable while we have a latency test in the code, | |
1442 // and can be removed when that functionality is stripped. | |
1443 TEST_F(SdchFilterTest, LatencyTestControls) { | |
1444 GURL url("http://www.google.com"); | |
1445 GURL url2("http://www.google2.com"); | |
1446 | |
1447 // First make sure we default to false. | |
1448 EXPECT_FALSE(sdch_manager_->AllowLatencyExperiment(url)); | |
1449 EXPECT_FALSE(sdch_manager_->AllowLatencyExperiment(url2)); | |
1450 | |
1451 // That we can set each to true. | |
1452 sdch_manager_->SetAllowLatencyExperiment(url, true); | |
1453 EXPECT_TRUE(sdch_manager_->AllowLatencyExperiment(url)); | |
1454 EXPECT_FALSE(sdch_manager_->AllowLatencyExperiment(url2)); | |
1455 | |
1456 sdch_manager_->SetAllowLatencyExperiment(url2, true); | |
1457 EXPECT_TRUE(sdch_manager_->AllowLatencyExperiment(url)); | |
1458 EXPECT_TRUE(sdch_manager_->AllowLatencyExperiment(url2)); | |
1459 | |
1460 // And can reset them to false. | |
1461 sdch_manager_->SetAllowLatencyExperiment(url, false); | |
1462 EXPECT_FALSE(sdch_manager_->AllowLatencyExperiment(url)); | |
1463 EXPECT_TRUE(sdch_manager_->AllowLatencyExperiment(url2)); | |
1464 | |
1465 sdch_manager_->SetAllowLatencyExperiment(url2, false); | |
1466 EXPECT_FALSE(sdch_manager_->AllowLatencyExperiment(url)); | |
1467 EXPECT_FALSE(sdch_manager_->AllowLatencyExperiment(url2)); | |
1468 } | |
1469 | |
1470 } // namespace net | 1142 } // namespace net |
OLD | NEW |