| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // Unit tests for the SafeBrowsing storage system. | 5 // Unit tests for the SafeBrowsing storage system. |
| 6 | 6 |
| 7 #include "chrome/browser/safe_browsing/safe_browsing_database.h" | 7 #include "chrome/browser/safe_browsing/safe_browsing_database.h" |
| 8 | 8 |
| 9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
| 10 #include "base/files/scoped_temp_dir.h" | 10 #include "base/files/scoped_temp_dir.h" |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 SafeBrowsingStoreFile* download_store = | 279 SafeBrowsingStoreFile* download_store = |
| 280 new SafeBrowsingStoreFile(task_runner_); | 280 new SafeBrowsingStoreFile(task_runner_); |
| 281 SafeBrowsingStoreFile* csd_whitelist_store = | 281 SafeBrowsingStoreFile* csd_whitelist_store = |
| 282 new SafeBrowsingStoreFile(task_runner_); | 282 new SafeBrowsingStoreFile(task_runner_); |
| 283 SafeBrowsingStoreFile* download_whitelist_store = | 283 SafeBrowsingStoreFile* download_whitelist_store = |
| 284 new SafeBrowsingStoreFile(task_runner_); | 284 new SafeBrowsingStoreFile(task_runner_); |
| 285 SafeBrowsingStoreFile* inclusion_whitelist_store = | 285 SafeBrowsingStoreFile* inclusion_whitelist_store = |
| 286 new SafeBrowsingStoreFile(task_runner_); | 286 new SafeBrowsingStoreFile(task_runner_); |
| 287 SafeBrowsingStoreFile* extension_blacklist_store = | 287 SafeBrowsingStoreFile* extension_blacklist_store = |
| 288 new SafeBrowsingStoreFile(task_runner_); | 288 new SafeBrowsingStoreFile(task_runner_); |
| 289 SafeBrowsingStoreFile* side_effect_free_whitelist_store = | |
| 290 new SafeBrowsingStoreFile(task_runner_); | |
| 291 SafeBrowsingStoreFile* ip_blacklist_store = | 289 SafeBrowsingStoreFile* ip_blacklist_store = |
| 292 new SafeBrowsingStoreFile(task_runner_); | 290 new SafeBrowsingStoreFile(task_runner_); |
| 293 SafeBrowsingStoreFile* unwanted_software_store = | 291 SafeBrowsingStoreFile* unwanted_software_store = |
| 294 new SafeBrowsingStoreFile(task_runner_); | 292 new SafeBrowsingStoreFile(task_runner_); |
| 295 database_.reset(new SafeBrowsingDatabaseNew( | 293 database_.reset(new SafeBrowsingDatabaseNew( |
| 296 task_runner_, browse_store, download_store, csd_whitelist_store, | 294 task_runner_, browse_store, download_store, csd_whitelist_store, |
| 297 download_whitelist_store, inclusion_whitelist_store, | 295 download_whitelist_store, inclusion_whitelist_store, |
| 298 extension_blacklist_store, side_effect_free_whitelist_store, | 296 extension_blacklist_store, ip_blacklist_store, |
| 299 ip_blacklist_store, unwanted_software_store)); | 297 unwanted_software_store)); |
| 300 database_->Init(database_filename_); | 298 database_->Init(database_filename_); |
| 301 } | 299 } |
| 302 | 300 |
| 303 bool ContainsDownloadUrl(const std::vector<GURL>& urls, | 301 bool ContainsDownloadUrl(const std::vector<GURL>& urls, |
| 304 std::vector<SBPrefix>* prefix_hits) { | 302 std::vector<SBPrefix>* prefix_hits) { |
| 305 std::vector<SBPrefix> prefixes; | 303 std::vector<SBPrefix> prefixes; |
| 306 SafeBrowsingDatabase::GetDownloadUrlPrefixes(urls, &prefixes); | 304 SafeBrowsingDatabase::GetDownloadUrlPrefixes(urls, &prefixes); |
| 307 return database_->ContainsDownloadUrlPrefixes(prefixes, prefix_hits); | 305 return database_->ContainsDownloadUrlPrefixes(prefixes, prefix_hits); |
| 308 } | 306 } |
| 309 | 307 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 chunks.get()); | 436 chunks.get()); |
| 439 | 437 |
| 440 chunks.clear(); | 438 chunks.clear(); |
| 441 chunks.push_back(AddChunkFullHashValue(8, | 439 chunks.push_back(AddChunkFullHashValue(8, |
| 442 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" | 440 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
| 443 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); | 441 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); |
| 444 database_->InsertChunks(safe_browsing_util::kExtensionBlacklist, | 442 database_->InsertChunks(safe_browsing_util::kExtensionBlacklist, |
| 445 chunks.get()); | 443 chunks.get()); |
| 446 | 444 |
| 447 chunks.clear(); | 445 chunks.clear(); |
| 448 chunks.push_back(AddChunkFullHashValue(9, "www.sideeffectfree.com")); | |
| 449 database_->InsertChunks(safe_browsing_util::kSideEffectFreeWhitelist, | |
| 450 chunks.get()); | |
| 451 | |
| 452 chunks.clear(); | |
| 453 chunks.push_back(AddChunkHashedIpValue(10, "::ffff:192.168.1.0", 120)); | 446 chunks.push_back(AddChunkHashedIpValue(10, "::ffff:192.168.1.0", 120)); |
| 454 database_->InsertChunks(safe_browsing_util::kIPBlacklist, chunks.get()); | 447 database_->InsertChunks(safe_browsing_util::kIPBlacklist, chunks.get()); |
| 455 | 448 |
| 456 chunks.clear(); | 449 chunks.clear(); |
| 457 chunks.push_back(AddChunkPrefixValue(11, "www.unwanted.com/software.html")); | 450 chunks.push_back(AddChunkPrefixValue(11, "www.unwanted.com/software.html")); |
| 458 database_->InsertChunks(safe_browsing_util::kUnwantedUrlList, chunks.get()); | 451 database_->InsertChunks(safe_browsing_util::kUnwantedUrlList, chunks.get()); |
| 459 | 452 |
| 460 database_->UpdateFinished(true); | 453 database_->UpdateFinished(true); |
| 461 | 454 |
| 462 GetListsInfo(&lists); | 455 GetListsInfo(&lists); |
| 463 ASSERT_EQ(10U, lists.size()); | 456 ASSERT_EQ(9U, lists.size()); |
| 464 EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name); | 457 EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name); |
| 465 EXPECT_EQ("1", lists[0].adds); | 458 EXPECT_EQ("1", lists[0].adds); |
| 466 EXPECT_TRUE(lists[0].subs.empty()); | 459 EXPECT_TRUE(lists[0].subs.empty()); |
| 467 EXPECT_EQ(safe_browsing_util::kPhishingList, lists[1].name); | 460 EXPECT_EQ(safe_browsing_util::kPhishingList, lists[1].name); |
| 468 EXPECT_EQ("2", lists[1].adds); | 461 EXPECT_EQ("2", lists[1].adds); |
| 469 EXPECT_TRUE(lists[1].subs.empty()); | 462 EXPECT_TRUE(lists[1].subs.empty()); |
| 470 EXPECT_EQ(safe_browsing_util::kBinUrlList, lists[2].name); | 463 EXPECT_EQ(safe_browsing_util::kBinUrlList, lists[2].name); |
| 471 EXPECT_EQ("3", lists[2].adds); | 464 EXPECT_EQ("3", lists[2].adds); |
| 472 EXPECT_TRUE(lists[2].subs.empty()); | 465 EXPECT_TRUE(lists[2].subs.empty()); |
| 473 EXPECT_EQ(safe_browsing_util::kCsdWhiteList, lists[3].name); | 466 EXPECT_EQ(safe_browsing_util::kCsdWhiteList, lists[3].name); |
| 474 EXPECT_EQ("5", lists[3].adds); | 467 EXPECT_EQ("5", lists[3].adds); |
| 475 EXPECT_TRUE(lists[3].subs.empty()); | 468 EXPECT_TRUE(lists[3].subs.empty()); |
| 476 EXPECT_EQ(safe_browsing_util::kDownloadWhiteList, lists[4].name); | 469 EXPECT_EQ(safe_browsing_util::kDownloadWhiteList, lists[4].name); |
| 477 EXPECT_EQ("6", lists[4].adds); | 470 EXPECT_EQ("6", lists[4].adds); |
| 478 EXPECT_TRUE(lists[4].subs.empty()); | 471 EXPECT_TRUE(lists[4].subs.empty()); |
| 479 EXPECT_EQ(safe_browsing_util::kInclusionWhitelist, lists[5].name); | 472 EXPECT_EQ(safe_browsing_util::kInclusionWhitelist, lists[5].name); |
| 480 EXPECT_EQ("7", lists[5].adds); | 473 EXPECT_EQ("7", lists[5].adds); |
| 481 EXPECT_TRUE(lists[5].subs.empty()); | 474 EXPECT_TRUE(lists[5].subs.empty()); |
| 482 EXPECT_EQ(safe_browsing_util::kExtensionBlacklist, lists[6].name); | 475 EXPECT_EQ(safe_browsing_util::kExtensionBlacklist, lists[6].name); |
| 483 EXPECT_EQ("8", lists[6].adds); | 476 EXPECT_EQ("8", lists[6].adds); |
| 484 EXPECT_TRUE(lists[6].subs.empty()); | 477 EXPECT_TRUE(lists[6].subs.empty()); |
| 485 EXPECT_EQ(safe_browsing_util::kSideEffectFreeWhitelist, lists[7].name); | 478 EXPECT_EQ(safe_browsing_util::kIPBlacklist, lists[7].name); |
| 486 EXPECT_EQ("9", lists[7].adds); | 479 EXPECT_EQ("10", lists[7].adds); |
| 487 EXPECT_TRUE(lists[7].subs.empty()); | 480 EXPECT_TRUE(lists[7].subs.empty()); |
| 488 EXPECT_EQ(safe_browsing_util::kIPBlacklist, lists[8].name); | 481 EXPECT_EQ(safe_browsing_util::kUnwantedUrlList, lists[8].name); |
| 489 EXPECT_EQ("10", lists[8].adds); | 482 EXPECT_EQ("11", lists[8].adds); |
| 490 EXPECT_TRUE(lists[8].subs.empty()); | 483 EXPECT_TRUE(lists[8].subs.empty()); |
| 491 EXPECT_EQ(safe_browsing_util::kUnwantedUrlList, lists[9].name); | |
| 492 EXPECT_EQ("11", lists[9].adds); | |
| 493 EXPECT_TRUE(lists[9].subs.empty()); | |
| 494 | 484 |
| 495 database_.reset(); | 485 database_.reset(); |
| 496 } | 486 } |
| 497 | 487 |
| 498 // Checks database reading and writing for browse and unwanted PrefixSets. | 488 // Checks database reading and writing for browse and unwanted PrefixSets. |
| 499 TEST_F(SafeBrowsingDatabaseTest, BrowseAndUnwantedDatabasesAndPrefixSets) { | 489 TEST_F(SafeBrowsingDatabaseTest, BrowseAndUnwantedDatabasesAndPrefixSets) { |
| 500 struct TestCase { | 490 struct TestCase { |
| 501 using TestListContainsBadUrl = bool (SafeBrowsingDatabase::*)( | 491 using TestListContainsBadUrl = bool (SafeBrowsingDatabase::*)( |
| 502 const GURL& url, | 492 const GURL& url, |
| 503 std::vector<SBPrefix>* prefix_hits, | 493 std::vector<SBPrefix>* prefix_hits, |
| 504 std::vector<SBFullHashResult>* cache_hits); | 494 std::vector<SBFullHashResult>* cache_hits); |
| 505 | 495 |
| 506 const char* test_list_name; | 496 const char* test_list_name; |
| 507 size_t expected_list_index; | 497 size_t expected_list_index; |
| 508 TestListContainsBadUrl test_list_contains_bad_url; | 498 TestListContainsBadUrl test_list_contains_bad_url; |
| 509 } const kTestCases[] { | 499 } const kTestCases[] { |
| 510 { safe_browsing_util::kMalwareList, 0U, | 500 { safe_browsing_util::kMalwareList, 0U, |
| 511 &SafeBrowsingDatabase::ContainsBrowseUrl }, | 501 &SafeBrowsingDatabase::ContainsBrowseUrl }, |
| 512 { safe_browsing_util::kPhishingList, 1U, | 502 { safe_browsing_util::kPhishingList, 1U, |
| 513 &SafeBrowsingDatabase::ContainsBrowseUrl }, | 503 &SafeBrowsingDatabase::ContainsBrowseUrl }, |
| 514 { safe_browsing_util::kUnwantedUrlList, 9U, | 504 { safe_browsing_util::kUnwantedUrlList, 8U, |
| 515 &SafeBrowsingDatabase::ContainsUnwantedSoftwareUrl }, | 505 &SafeBrowsingDatabase::ContainsUnwantedSoftwareUrl }, |
| 516 }; | 506 }; |
| 517 | 507 |
| 518 for (const auto& test_case : kTestCases) { | 508 for (const auto& test_case : kTestCases) { |
| 519 SCOPED_TRACE(std::string("Tested list at fault => ") + | 509 SCOPED_TRACE(std::string("Tested list at fault => ") + |
| 520 test_case.test_list_name); | 510 test_case.test_list_name); |
| 521 | 511 |
| 522 std::vector<SBListChunkRanges> lists; | 512 std::vector<SBListChunkRanges> lists; |
| 523 ScopedVector<SBChunkData> chunks; | 513 ScopedVector<SBChunkData> chunks; |
| 524 | 514 |
| (...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1118 // TODO(shess): Disabled until ScopedLogMessageIgnorer resolved. | 1108 // TODO(shess): Disabled until ScopedLogMessageIgnorer resolved. |
| 1119 // http://crbug.com/56448 | 1109 // http://crbug.com/56448 |
| 1120 TEST_F(SafeBrowsingDatabaseTest, DISABLED_FileCorruptionHandling) { | 1110 TEST_F(SafeBrowsingDatabaseTest, DISABLED_FileCorruptionHandling) { |
| 1121 // Re-create the database in a captive message loop so that we can | 1111 // Re-create the database in a captive message loop so that we can |
| 1122 // influence task-posting. Database specifically needs to the | 1112 // influence task-posting. Database specifically needs to the |
| 1123 // file-backed. | 1113 // file-backed. |
| 1124 database_.reset(); | 1114 database_.reset(); |
| 1125 base::MessageLoop loop; | 1115 base::MessageLoop loop; |
| 1126 SafeBrowsingStoreFile* store = new SafeBrowsingStoreFile(task_runner_); | 1116 SafeBrowsingStoreFile* store = new SafeBrowsingStoreFile(task_runner_); |
| 1127 database_.reset(new SafeBrowsingDatabaseNew( | 1117 database_.reset(new SafeBrowsingDatabaseNew( |
| 1128 task_runner_, store, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)); | 1118 task_runner_, store, NULL, NULL, NULL, NULL, NULL, NULL, NULL)); |
| 1129 database_->Init(database_filename_); | 1119 database_->Init(database_filename_); |
| 1130 | 1120 |
| 1131 // This will cause an empty database to be created. | 1121 // This will cause an empty database to be created. |
| 1132 std::vector<SBListChunkRanges> lists; | 1122 std::vector<SBListChunkRanges> lists; |
| 1133 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1123 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1134 database_->UpdateFinished(true); | 1124 database_->UpdateFinished(true); |
| 1135 | 1125 |
| 1136 // Create a sub chunk to insert. | 1126 // Create a sub chunk to insert. |
| 1137 ScopedVector<SBChunkData> chunks; | 1127 ScopedVector<SBChunkData> chunks; |
| 1138 chunks.push_back(SubChunkPrefixValue(7, | 1128 chunks.push_back(SubChunkPrefixValue(7, |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1293 &SafeBrowsingDatabase::ContainsDownloadWhitelistedUrl, | 1283 &SafeBrowsingDatabase::ContainsDownloadWhitelistedUrl, |
| 1294 &SafeBrowsingDatabase::ContainsDownloadWhitelistedString}, | 1284 &SafeBrowsingDatabase::ContainsDownloadWhitelistedString}, |
| 1295 {safe_browsing_util::kInclusionWhitelist, | 1285 {safe_browsing_util::kInclusionWhitelist, |
| 1296 &SafeBrowsingDatabase::ContainsInclusionWhitelistedUrl, | 1286 &SafeBrowsingDatabase::ContainsInclusionWhitelistedUrl, |
| 1297 nullptr}, | 1287 nullptr}, |
| 1298 }; | 1288 }; |
| 1299 | 1289 |
| 1300 // If the whitelist is disabled everything should match the whitelist. | 1290 // If the whitelist is disabled everything should match the whitelist. |
| 1301 database_.reset(new SafeBrowsingDatabaseNew( | 1291 database_.reset(new SafeBrowsingDatabaseNew( |
| 1302 task_runner_, new SafeBrowsingStoreFile(task_runner_), NULL, NULL, NULL, | 1292 task_runner_, new SafeBrowsingStoreFile(task_runner_), NULL, NULL, NULL, |
| 1303 NULL, NULL, NULL, NULL, NULL)); | 1293 NULL, NULL, NULL, NULL)); |
| 1304 database_->Init(database_filename_); | 1294 database_->Init(database_filename_); |
| 1305 for (const auto& test_case : kTestCases) { | 1295 for (const auto& test_case : kTestCases) { |
| 1306 SCOPED_TRACE(std::string("Tested list at fault => ") + | 1296 SCOPED_TRACE(std::string("Tested list at fault => ") + |
| 1307 test_case.test_list_name); | 1297 test_case.test_list_name); |
| 1308 | 1298 |
| 1309 EXPECT_TRUE( | 1299 EXPECT_TRUE( |
| 1310 (database_.get()->*test_case.test_list_contains_whitelisted_url)( | 1300 (database_.get()->*test_case.test_list_contains_whitelisted_url)( |
| 1311 GURL(std::string("http://www.phishing.com/")))); | 1301 GURL(std::string("http://www.phishing.com/")))); |
| 1312 if (test_case.TestStrings()) { | 1302 if (test_case.TestStrings()) { |
| 1313 EXPECT_TRUE( | 1303 EXPECT_TRUE( |
| (...skipping 927 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2241 GURL(std::string("http://") + kExampleCollision), | 2231 GURL(std::string("http://") + kExampleCollision), |
| 2242 &prefix_hits, &cache_hits)); | 2232 &prefix_hits, &cache_hits)); |
| 2243 ASSERT_EQ(1U, prefix_hits.size()); | 2233 ASSERT_EQ(1U, prefix_hits.size()); |
| 2244 EXPECT_EQ(SBPrefixForString(kExampleCollision), prefix_hits[0]); | 2234 EXPECT_EQ(SBPrefixForString(kExampleCollision), prefix_hits[0]); |
| 2245 EXPECT_TRUE(cache_hits.empty()); | 2235 EXPECT_TRUE(cache_hits.empty()); |
| 2246 | 2236 |
| 2247 // This prefix collides, but no full hash match. | 2237 // This prefix collides, but no full hash match. |
| 2248 EXPECT_FALSE(database_->ContainsBrowseUrl( | 2238 EXPECT_FALSE(database_->ContainsBrowseUrl( |
| 2249 GURL(std::string("http://") + kExampleFine), &prefix_hits, &cache_hits)); | 2239 GURL(std::string("http://") + kExampleFine), &prefix_hits, &cache_hits)); |
| 2250 } | 2240 } |
| OLD | NEW |